From d388c7dbb4ce47e338ba120c5961eb638651bf74 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sat, 2 Nov 2019 14:22:07 -0700 Subject: [PATCH 01/83] og image and meta tags for blog --- pages/emojis-functional-programming.tsx | 19 ++++++++++++++----- public/static/images/blog-og.png | Bin 0 -> 87055 bytes 2 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 public/static/images/blog-og.png diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index b102842d2..52653be76 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -3,7 +3,8 @@ import { css, jsx } from '@emotion/core' import Page from 'src/components/Page' import Head from 'next/head' // import H from 'src/components/H' -import { fontSizes, colors, spaces } from 'src/lib/theme' +import { ns, fontSizes, colors, spaces } from 'src/lib/theme' +import { lessonTitle } from 'src/lib/titles' import Container from 'src/components/Container' // import CardWrapper from 'src/components/CardWrapper' import EpisodeHero from 'src/components/EpisodeHero' @@ -12,6 +13,7 @@ import { P, ExternalLink } from 'src/components/ContentTags' import locale from 'src/lib/locale' // import { EpisodeCardListType } from 'src/components/EpisodeCardList' import { DateTime } from 'luxon' +import { enBaseUrl } from 'src/lib/meta' const date = DateTime.fromISO('2019-11-06T12:00:00Z') const dateString = date @@ -30,6 +32,9 @@ const titleSplit = ( non-programmers ) +const description = lessonTitle +const url = `${enBaseUrl}/emojis-functional-programming/` +const ogImageUrl = `${enBaseUrl}/static/images/blog-og.png` // const cards: EpisodeCardListType = [] @@ -39,12 +44,12 @@ export default () => {title} - {/* + - */} +
font-size: ${fontSizes(0.85)}; `} > - {dateString} · Shu Uesugi ( + · Shu + Uesugi ( @chibicode @@ -71,9 +77,12 @@ export default () => src="/static/images/animated@2x.gif" alt={title} css={css` - width: 180px; + width: 7rem; margin: ${spaces(1.75)} auto ${spaces(2)}; display: block; + ${ns} { + width: 8rem; + } `} />

diff --git a/public/static/images/blog-og.png b/public/static/images/blog-og.png new file mode 100644 index 0000000000000000000000000000000000000000..258a87f58955c401f5b185dd1e3e5eb6719eef1d GIT binary patch literal 87055 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 literal 0 HcmV?d00001 From 4127487334b8a4379877b355f5146633806bdbc3 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sat, 2 Nov 2019 14:23:20 -0700 Subject: [PATCH 02/83] Remove trailing slash from url --- pages/emojis-functional-programming.tsx | 2 +- src/lib/meta.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 52653be76..6c17ed627 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -33,7 +33,7 @@ const titleSplit = ( ) const description = lessonTitle -const url = `${enBaseUrl}/emojis-functional-programming/` +const url = `${enBaseUrl}/emojis-functional-programming` const ogImageUrl = `${enBaseUrl}/static/images/blog-og.png` // const cards: EpisodeCardListType = [] diff --git a/src/lib/meta.ts b/src/lib/meta.ts index 5c448f4c2..421987cf6 100644 --- a/src/lib/meta.ts +++ b/src/lib/meta.ts @@ -12,4 +12,4 @@ export const ogImageUrl = : `${baseUrl}/static/images/og-image-jp-v5.png` export const ogUrl = (episodeNumber: number) => - `${baseUrl}${episodeNumber > 0 ? `/${episodeNumber}/` : ''}` + `${baseUrl}${episodeNumber > 0 ? `/${episodeNumber}` : ''}` From 9586cf8b8a4927e66833577519e2862f7de03757 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sat, 2 Nov 2019 14:23:31 -0700 Subject: [PATCH 03/83] Add blog sitemap --- public/sitemap.en.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/public/sitemap.en.xml b/public/sitemap.en.xml index 0ae7ffc25..dc4be81ef 100644 --- a/public/sitemap.en.xml +++ b/public/sitemap.en.xml @@ -55,4 +55,7 @@ https://ycombinator.chibicode.com/ + + https://ycombinator.chibicode.com/emojis-functional-programming + \ No newline at end of file From 9ee13319f23ccccce7c8edfa24a458ee21473a3d Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sat, 2 Nov 2019 14:28:33 -0700 Subject: [PATCH 04/83] Capitalize --- pages/emojis-functional-programming.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 6c17ed627..73e3c4b01 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -22,14 +22,14 @@ const dateString = date .toFormat('LLL d, yyyy') const dateSchemaString = date.setZone('America/Los_Angeles').toISO() -const title = 'Using emojis to teach functional programming to non-programmers' +const title = 'Using Emojis to Teach Functional Programming to Non-programmers' const titleSplit = ( <> - Using emojis to teach + Using Emojis to Teach
- functional programming to + Functional Programming to
- non-programmers + Non-programmers ) const description = lessonTitle From 50794122e853e2c68076b9511fb189149ad2d48f Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sat, 2 Nov 2019 16:21:38 -0700 Subject: [PATCH 05/83] Start first paragraphs --- pages/emojis-functional-programming.tsx | 45 +++++++++++++++++++------ src/components/Card.tsx | 7 ++-- src/components/ContentTags/Inline.tsx | 2 +- 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 73e3c4b01..d9c11f5a6 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -2,14 +2,20 @@ import { css, jsx } from '@emotion/core' import Page from 'src/components/Page' import Head from 'next/head' -// import H from 'src/components/H' import { ns, fontSizes, colors, spaces } from 'src/lib/theme' import { lessonTitle } from 'src/lib/titles' import Container from 'src/components/Container' +import Emoji from 'src/components/Emoji' // import CardWrapper from 'src/components/CardWrapper' import EpisodeHero from 'src/components/EpisodeHero' import EpisodePageFooter from 'src/components/EpisodePageFooter' -import { P, ExternalLink } from 'src/components/ContentTags' +import { + P, + Italic, + Bold, + InternalLink, + ExternalLink +} from 'src/components/ContentTags' import locale from 'src/lib/locale' // import { EpisodeCardListType } from 'src/components/EpisodeCardList' import { DateTime } from 'luxon' @@ -32,7 +38,8 @@ const titleSplit = ( Non-programmers ) -const description = lessonTitle +const description = + 'How to teach lambda calculus, Church encoding, and Y combinator without any code' const url = `${enBaseUrl}/emojis-functional-programming` const ogImageUrl = `${enBaseUrl}/static/images/blog-og.png` @@ -57,8 +64,10 @@ export default () => padding-top: ${spaces(1.5)}; `} /> - + + +

src="/static/images/animated@2x.gif" alt={title} css={css` - width: 7rem; + width: 6rem; margin: ${spaces(1.75)} auto ${spaces(2)}; display: block; ${ns} { - width: 8rem; + width: 7rem; } `} />

- Lorem ipsum dolor sit amet consectetur adipisicing elit. Consequatur, - neque quod eum maxime distinctio, commodi alias qui magni ullam - dolores ipsa, odio esse quidem dicta. Voluptatem illo voluptate - doloremque odit. + Last month, I published a free online course called “ + + Y Combinator for Non-programmers + + ”. In this course, I teach computer science concepts such as + functional programming, lambda calculus, Church encoding, and Y + combinator in a way such that{' '} + + people who have zero programming knowledge can understand + + . +

+

+ There’s not a single line of code mentioned in the course—instead, I + used 🍱 emoji puzzles to explain these + concepts. In this article, I’ll explain how my emoji puzzles can be + used to represent and execute functional code{' '} + visually. If you enjoy teaching programming to + beginners, or if you like functional programming in general, I think + you’ll enjoy this post.

( @@ -30,6 +30,7 @@ export interface CardProps { | 'indigo' | 'pink' | 'brown' + | 'white' slideNumber?: number slideCount?: number isLast?: boolean @@ -48,7 +49,7 @@ export interface CardState { overrideColor?: CardProps['color'] } -export const backgroundColor = (color: CardProps['color'] | 'white') => +export const backgroundColor = (color: CardProps['color']) => ({ green: colors('green50'), grey: colors('grey100'), @@ -59,7 +60,6 @@ export const backgroundColor = (color: CardProps['color'] | 'white') => indigo: colors('indigo50'), pink: colors('pink50'), brown: colors('brown50'), - // For highlights in quotes white: colors('white') }[color]) @@ -68,6 +68,7 @@ const slideLabelBgColor = (color: CardProps['color']) => ({ green: colors('green600'), grey: colors('grey600'), + white: colors('grey600'), orange: colors('deepOrange600'), yellow: colors('yellow900'), purple: colors('deepPurple300'), diff --git a/src/components/ContentTags/Inline.tsx b/src/components/ContentTags/Inline.tsx index 4a3919548..0f661e562 100644 --- a/src/components/ContentTags/Inline.tsx +++ b/src/components/ContentTags/Inline.tsx @@ -25,7 +25,7 @@ const HighlightContext = React.createContext( highlightContextDefault ) -const mix = (color: CardProps['color'] | 'white', base: string) => +const mix = (color: CardProps['color'], base: string) => Color(base) .mix( Color(backgroundColor(color)), From dd63f2c8515e7f4c3ecc868bb580803d12a93b2e Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sat, 2 Nov 2019 17:06:53 -0700 Subject: [PATCH 06/83] Add warning --- pages/_error.tsx | 14 ++--- pages/emojis-functional-programming.tsx | 75 ++++++++++++++++++++----- 2 files changed, 65 insertions(+), 24 deletions(-) diff --git a/pages/_error.tsx b/pages/_error.tsx index ed573226c..33930f7c2 100644 --- a/pages/_error.tsx +++ b/pages/_error.tsx @@ -20,12 +20,13 @@ export default () => ( -
- + > } episodeTitle={} @@ -46,11 +47,6 @@ export default () => ( -
) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index d9c11f5a6..fdac092cf 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -2,11 +2,10 @@ import { css, jsx } from '@emotion/core' import Page from 'src/components/Page' import Head from 'next/head' -import { ns, fontSizes, colors, spaces } from 'src/lib/theme' +import { ns, radii, fontSizes, colors, spaces } from 'src/lib/theme' import { lessonTitle } from 'src/lib/titles' import Container from 'src/components/Container' import Emoji from 'src/components/Emoji' -// import CardWrapper from 'src/components/CardWrapper' import EpisodeHero from 'src/components/EpisodeHero' import EpisodePageFooter from 'src/components/EpisodePageFooter' import { @@ -14,10 +13,10 @@ import { Italic, Bold, InternalLink, - ExternalLink + ExternalLink, + H3 } from 'src/components/ContentTags' import locale from 'src/lib/locale' -// import { EpisodeCardListType } from 'src/components/EpisodeCardList' import { DateTime } from 'luxon' import { enBaseUrl } from 'src/lib/meta' @@ -43,7 +42,31 @@ const description = const url = `${enBaseUrl}/emojis-functional-programming` const ogImageUrl = `${enBaseUrl}/static/images/blog-og.png` -// const cards: EpisodeCardListType = [] +const Subheading = (props: JSX.IntrinsicElements['h3']) => ( +

+) + +const Warning = ({ children }: { children: React.ReactNode }) => ( +
+ {children} +
+) export default () => locale === 'en' ? ( @@ -59,15 +82,22 @@ export default () => -
- + > - +
beginners, or if you like functional programming in general, I think you’ll enjoy this post.

+ +

+ ⚠️ Note: This article is for programmers + who are familiar with functional programming. If you’re a + non-programmer, check out “ + + Y Combinator for Non-programmers + + ” instead. +

+

+ I’ll use JavaScript in this article. Even if you’re not + familiar with JS, you should still be able to understand it. +

+
+ Test -
) : ( From bfa131095cca3169c8549f595e76c695f362af74 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sat, 2 Nov 2019 17:12:02 -0700 Subject: [PATCH 07/83] Add warning --- pages/emojis-functional-programming.tsx | 20 ++--------------- src/components/Card.tsx | 3 --- src/components/ContentTags/Inline.tsx | 4 ---- .../EpisodePageInitialRenderWarning.tsx | 6 ++--- src/components/H.tsx | 14 +++++------- src/components/Warning.tsx | 22 +++++++++++++++++++ 6 files changed, 33 insertions(+), 36 deletions(-) create mode 100644 src/components/Warning.tsx diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index fdac092cf..27145f151 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -2,7 +2,7 @@ import { css, jsx } from '@emotion/core' import Page from 'src/components/Page' import Head from 'next/head' -import { ns, radii, fontSizes, colors, spaces } from 'src/lib/theme' +import { ns, fontSizes, colors, spaces } from 'src/lib/theme' import { lessonTitle } from 'src/lib/titles' import Container from 'src/components/Container' import Emoji from 'src/components/Emoji' @@ -19,6 +19,7 @@ import { import locale from 'src/lib/locale' import { DateTime } from 'luxon' import { enBaseUrl } from 'src/lib/meta' +import Warning from 'src/components/Warning' const date = DateTime.fromISO('2019-11-06T12:00:00Z') const dateString = date @@ -51,23 +52,6 @@ const Subheading = (props: JSX.IntrinsicElements['h3']) => ( /> ) -const Warning = ({ children }: { children: React.ReactNode }) => ( -
- {children} -
-) - export default () => locale === 'en' ? ( diff --git a/src/components/Card.tsx b/src/components/Card.tsx index 3dcfb7a7f..ce9fa1654 100644 --- a/src/components/Card.tsx +++ b/src/components/Card.tsx @@ -24,7 +24,6 @@ export interface CardProps { color: | 'grey' | 'orange' - | 'yellow' | 'green' | 'blue' | 'indigo' @@ -54,7 +53,6 @@ export const backgroundColor = (color: CardProps['color']) => green: colors('green50'), grey: colors('grey100'), orange: colors('deepOrange50'), - yellow: colors('yellow100'), purple: colors('deepPurple50'), blue: colors('blue50'), indigo: colors('indigo50'), @@ -70,7 +68,6 @@ const slideLabelBgColor = (color: CardProps['color']) => grey: colors('grey600'), white: colors('grey600'), orange: colors('deepOrange600'), - yellow: colors('yellow900'), purple: colors('deepPurple300'), blue: colors('blue600'), indigo: colors('indigo300'), diff --git a/src/components/ContentTags/Inline.tsx b/src/components/ContentTags/Inline.tsx index 0f661e562..ccf05e86a 100644 --- a/src/components/ContentTags/Inline.tsx +++ b/src/components/ContentTags/Inline.tsx @@ -86,8 +86,6 @@ export const HighlightBold = ({ ? mix(baseColor, colors('blue50')) : highlightType === 'white' ? colors('white') - : baseColor === 'yellow' - ? mix(baseColor, colors('pink100')) : mix(baseColor, colors('yellow100'))}; `, inLink && @@ -138,8 +136,6 @@ export const Highlight = ({ ? mix(baseColor, colors('blue50')) : highlightType === 'white' ? colors('white') - : baseColor === 'yellow' - ? mix(baseColor, colors('pink100')) : mix(baseColor, colors('yellow100'))}; `, inLink && diff --git a/src/components/EpisodePageInitialRenderWarning.tsx b/src/components/EpisodePageInitialRenderWarning.tsx index 56312fd5a..5af11e6c5 100644 --- a/src/components/EpisodePageInitialRenderWarning.tsx +++ b/src/components/EpisodePageInitialRenderWarning.tsx @@ -1,16 +1,16 @@ import React, { useContext } from 'react' -import Card from 'src/components/Card' import EpisodeContext from 'src/components/EpisodeContext' import GlobalContext from 'src/components/GlobalContext' import H from 'src/components/H' +import Warning from 'src/components/Warning' const EpisodePageInitialRenderWarning = () => { const { episodeNumber } = useContext(EpisodeContext) const { initialRender } = useContext(GlobalContext) return !!episodeNumber && initialRender ? ( - + - + ) : null } diff --git a/src/components/H.tsx b/src/components/H.tsx index 80383322a..1478009ed 100644 --- a/src/components/H.tsx +++ b/src/components/H.tsx @@ -243,7 +243,7 @@ const H = ({ args, highlightType, episodeNumberOverrides }: HProps) => { if (args.name === 'newUser') { if (locale === 'en') { return ( -

+ <> Hello! This is page {episodeNumber + 1}{' '} of the course called “ {lessonTitle} @@ -252,21 +252,19 @@ const H = ({ args, highlightType, episodeNumberOverrides }: HProps) => { click here to read from the beginning . -

+ ) } else { return ( -

+ <> こんにちは!このページは「 {lessonTitle} - 」という記事の - {episodeNumber + 1}ページ目 - です。1ページ目から読むには + 」という記事の{episodeNumber + 1}ページ目です。1ページ目から読むには - こちらからどうぞ + こちらからどうぞ 。 -

+ ) } } diff --git a/src/components/Warning.tsx b/src/components/Warning.tsx new file mode 100644 index 000000000..4e3293337 --- /dev/null +++ b/src/components/Warning.tsx @@ -0,0 +1,22 @@ +/** @jsx jsx */ +import { css, jsx } from '@emotion/core' +import { ns, radii, colors, spaces } from 'src/lib/theme' + +const Warning = ({ children }: { children: React.ReactNode }) => ( +
+ {children} +
+) + +export default Warning From a6e5ac528581f01e393f9e38406f2efcd8fc99a5 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sat, 2 Nov 2019 17:36:55 -0700 Subject: [PATCH 08/83] Tweaks --- pages/emojis-functional-programming.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 27145f151..805b75014 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -29,6 +29,7 @@ const dateString = date const dateSchemaString = date.setZone('America/Los_Angeles').toISO() const title = 'Using Emojis to Teach Functional Programming to Non-programmers' +const titleWithEmoji = `🍱 ${title}` const titleSplit = ( <> Using Emojis to Teach @@ -56,8 +57,8 @@ export default () => locale === 'en' ? ( - {title} - + {titleWithEmoji} + @@ -123,12 +124,11 @@ export default () =>

There’s not a single line of code mentioned in the course—instead, I - used 🍱 emoji puzzles to explain these - concepts. In this article, I’ll explain how my emoji puzzles can be - used to represent and execute functional code{' '} - visually. If you enjoy teaching programming to - beginners, or if you like functional programming in general, I think - you’ll enjoy this post. + created 🍱 emoji puzzles to explain + these concepts. In this article, I’ll explain how my emoji puzzles can + represent and execute functional code visually. If + you enjoy teaching programming to beginners, or if you like functional + programming in general, I think you’ll enjoy this post.

From ddf021ead1b120fb18c85a916a551b00db25af0a Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sat, 2 Nov 2019 20:05:26 -0700 Subject: [PATCH 09/83] Start the paragraph --- pages/emojis-functional-programming.tsx | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 805b75014..8efa015d8 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -48,7 +48,7 @@ const Subheading = (props: JSX.IntrinsicElements['h3']) => (

) @@ -123,11 +123,11 @@ export default () => .

- There’s not a single line of code mentioned in the course—instead, I - created 🍱 emoji puzzles to explain - these concepts. In this article, I’ll explain how my emoji puzzles can - represent and execute functional code visually. If - you enjoy teaching programming to beginners, or if you like functional + To explain these concepts, I created{' '} + an educational puzzle using emojis 🍱. In + this article, I’ll explain how my emoji puzzles can represent and + execute functional code visually. If you enjoy + teaching programming to beginners, or if you like functional programming in general, I think you’ll enjoy this post.

@@ -149,7 +149,11 @@ export default () => familiar with JS, you should still be able to understand it.

- Test + Identity function in JS +

+ First, take a look at the following code. It’s an identity function in + JavaScript that returns the argument. +

From 7719b2aed8cc0d933c5533cfae859e5ff490370b Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sat, 2 Nov 2019 20:18:01 -0700 Subject: [PATCH 10/83] Wordsmith --- pages/emojis-functional-programming.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 8efa015d8..952e3abc7 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -126,9 +126,9 @@ export default () => To explain these concepts, I created{' '} an educational puzzle using emojis 🍱. In this article, I’ll explain how my emoji puzzles can represent and - execute functional code visually. If you enjoy - teaching programming to beginners, or if you like functional - programming in general, I think you’ll enjoy this post. + execute functional code visually. If you like to + teach programming to beginners, or if you like functional programming + in general, I think you’ll enjoy this post.

From 8ec25cd6afefbde9b3dce335eaedd16639cb2583 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sat, 2 Nov 2019 21:05:00 -0700 Subject: [PATCH 11/83] Add code support --- next.config.js | 6 +- package.json | 6 +- pages/emojis-functional-programming.tsx | 49 +++- yarn.lock | 341 +++++++++++++++++++++++- 4 files changed, 387 insertions(+), 15 deletions(-) diff --git a/next.config.js b/next.config.js index ca74818b6..1bf97608c 100644 --- a/next.config.js +++ b/next.config.js @@ -1,5 +1,9 @@ const path = require('path') +// Necessary for victormono +const withCSS = require('@zeit/next-css') +const withFonts = require('next-fonts') + const config = { webpack(config) { config.resolve.alias = Object.assign({}, config.resolve.alias, { @@ -28,4 +32,4 @@ if (!process.env.PRODUCTION_LOCALE) { } } -module.exports = config +module.exports = withFonts(withCSS(config)) diff --git a/package.json b/package.json index f7029a685..c8a3704b0 100644 --- a/package.json +++ b/package.json @@ -10,11 +10,13 @@ "color": "^3.1.2", "luxon": "^1.19.3", "next": "9.1.1", + "prism-react-renderer": "^1.0.2", "react": "^16.11.0", "react-dom": "^16.11.0", "react-spring": "^8.0.27", "smoothscroll-polyfill": "^0.4.4", - "twemoji": "^12.1.3" + "twemoji": "^12.1.3", + "victormono": "^1.2.7" }, "_moduleAliases": { "src": "outDir/tsconfig.scripts.json/src", @@ -55,6 +57,7 @@ "@types/smoothscroll-polyfill": "^0.3.1", "@typescript-eslint/eslint-plugin": "^2.5.0", "@typescript-eslint/parser": "^2.5.0", + "@zeit/next-css": "^1.0.1", "babel-eslint": "^10.0.3", "babel-plugin-emotion": "^10.0.22", "concurrently": "^5.0.0", @@ -70,6 +73,7 @@ "fs-extra": "^8.1.0", "glob": "^7.1.5", "module-alias": "^2.2.2", + "next-fonts": "^0.19.0", "prettier": "^1.18.2", "typescript": "^3.7.1-rc" } diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 952e3abc7..dbbb202f4 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -2,7 +2,7 @@ import { css, jsx } from '@emotion/core' import Page from 'src/components/Page' import Head from 'next/head' -import { ns, fontSizes, colors, spaces } from 'src/lib/theme' +import { ns, radii, fontSizes, colors, spaces } from 'src/lib/theme' import { lessonTitle } from 'src/lib/titles' import Container from 'src/components/Container' import Emoji from 'src/components/Emoji' @@ -20,6 +20,9 @@ import locale from 'src/lib/locale' import { DateTime } from 'luxon' import { enBaseUrl } from 'src/lib/meta' import Warning from 'src/components/Warning' +import Highlight, { defaultProps } from 'prism-react-renderer' +import theme from 'prism-react-renderer/themes/nightOwlLight' +import 'victormono' const date = DateTime.fromISO('2019-11-06T12:00:00Z') const dateString = date @@ -53,6 +56,48 @@ const Subheading = (props: JSX.IntrinsicElements['h3']) => ( /> ) +const CodeBlock = ({ children }: { children: string }) => ( + + {({ tokens, getLineProps, getTokenProps }) => ( +

+        
+ {tokens.map((line, i) => ( +
+ {line.map((token, key) => ( + + ))} +
+ ))} +
+
+ )} + +) + export default () => locale === 'en' ? ( @@ -154,6 +199,8 @@ export default () => First, take a look at the following code. It’s an identity function in JavaScript that returns the argument.

+ {`// Identity function +a => a`}
diff --git a/yarn.lock b/yarn.lock index 46bfdd7a5..9a87440a8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1437,6 +1437,18 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== +"@zeit/next-css@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@zeit/next-css/-/next-css-1.0.1.tgz#4f784e841e7ca1b21b3468a902e2c1fa95a3e75c" + integrity sha512-yfHPRy/ne/5SddVClsoy+fpU7e0Cs1gkWA67/wm2uIu+9rznF45yQLxHEt5dPGF3h6IiIh7ZtIgA8VV8YKq87A== + dependencies: + css-loader "1.0.0" + extracted-loader "1.0.4" + find-up "2.1.0" + ignore-loader "0.1.2" + mini-css-extract-plugin "0.4.3" + postcss-loader "3.0.0" + abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -1494,6 +1506,11 @@ amphtml-validator@1.0.23: commander "2.9.0" promise "7.1.1" +animejs@^3.0.1: + version "3.1.0" + resolved "https://registry.yarnpkg.com/animejs/-/animejs-3.1.0.tgz#748a90fc1d4bef3efed64508af9a6a82babf5c47" + integrity sha512-BjnCroPPQPEAngT0M89pz9TBcOGgOFLnVoq3+jV2upl4rn60k57/AXvESTnuILsNgOEjGuhMEOMp7IlQzk40kA== + ansi-colors@^3.0.0: version "3.2.4" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" @@ -1668,6 +1685,13 @@ async-sema@3.0.0: resolved "https://registry.yarnpkg.com/async-sema/-/async-sema-3.0.0.tgz#9e22d6783f0ab66a1cf330e21a905e39b3b3a975" integrity sha512-zyCMBDl4m71feawrxYcVbHxv/UUkqm4nKJiLu3+l9lfiQha6jQ/9dxhrXLnzzBXVFqCTDwiUkZOz9XFbdEGQsg== +async-validator@~1.8.1: + version "1.8.5" + resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-1.8.5.tgz#dc3e08ec1fd0dddb67e60842f02c0cd1cec6d7f0" + integrity sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA== + dependencies: + babel-runtime "6.x" + atob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -1709,7 +1733,7 @@ axobject-query@^2.0.2: dependencies: ast-types-flow "0.0.7" -babel-code-frame@^6.22.0: +babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= @@ -1735,6 +1759,11 @@ babel-eslint@^10.0.3: eslint-visitor-keys "^1.0.0" resolve "^1.12.0" +babel-helper-vue-jsx-merge-props@^2.0.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6" + integrity sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg== + babel-loader@8.0.6: version "8.0.6" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" @@ -1795,7 +1824,7 @@ babel-plugin-transform-react-remove-prop-types@0.4.24: resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== -babel-runtime@^6.26.0: +babel-runtime@6.x, babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= @@ -1836,6 +1865,11 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" +bezier-easing@^2.0.3: + version "2.1.0" + resolved "https://registry.yarnpkg.com/bezier-easing/-/bezier-easing-2.1.0.tgz#c04dfe8b926d6ecaca1813d69ff179b7c2025d86" + integrity sha1-wE3+i5JtbsrKGBPWn/F5t8ICXYY= + big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -2209,6 +2243,11 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= +codemirror@^5.41.0: + version "5.49.2" + resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.49.2.tgz#c84fdaf11b19803f828b0c67060c7bc6d154ccad" + integrity sha512-dwJ2HRPHm8w51WB5YTF9J7m6Z5dtkqbU9ntMZ1dqXyFB9IpjoUFDj80ahRVEoVanfIp6pfASJbOlbWdEf8FOzQ== + collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -2508,6 +2547,24 @@ css-has-pseudo@^0.10.0: postcss "^7.0.6" postcss-selector-parser "^5.0.0-rc.4" +css-loader@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-1.0.0.tgz#9f46aaa5ca41dbe31860e3b62b8e23c42916bf56" + integrity sha512-tMXlTYf3mIMt3b0dDCOQFJiVvxbocJ5Ho577WiGPYPZcqVEO218L2iU22pDXzkTZCLDE+9AmGSUkWxeh/nZReA== + dependencies: + babel-code-frame "^6.26.0" + css-selector-tokenizer "^0.7.0" + icss-utils "^2.1.0" + loader-utils "^1.0.2" + lodash.camelcase "^4.3.0" + postcss "^6.0.23" + postcss-modules-extract-imports "^1.2.0" + postcss-modules-local-by-default "^1.2.0" + postcss-modules-scope "^1.1.0" + postcss-modules-values "^1.3.0" + postcss-value-parser "^3.3.0" + source-list-map "^2.0.0" + css-loader@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.2.0.tgz#bb570d89c194f763627fcf1f80059c6832d009b2" @@ -2548,6 +2605,15 @@ css-select@^2.0.0: domutils "^1.7.0" nth-check "^1.0.2" +css-selector-tokenizer@^0.7.0: + version "0.7.1" + resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz#a177271a8bca5019172f4f891fc6eed9cbf68d5d" + integrity sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA== + dependencies: + cssesc "^0.1.0" + fastparse "^1.1.1" + regexpu-core "^1.0.0" + css-tree@1.0.0-alpha.29: version "1.0.0-alpha.29" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39" @@ -2592,6 +2658,11 @@ cssdb@^4.4.0: resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== +cssesc@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" + integrity sha1-yBSQPkViM3GgR3tAEJqq++6t27Q= + cssesc@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" @@ -2695,6 +2766,11 @@ deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= +deepmerge@^1.2.0: + version "1.5.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753" + integrity sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ== + deepmerge@^4.0.0: version "4.2.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.1.tgz#018a3e5dfe82b95e35e36a9a29ba15ddb194e40f" @@ -2781,6 +2857,11 @@ devalue@2.0.0: resolved "https://registry.yarnpkg.com/devalue/-/devalue-2.0.0.tgz#2afa0b7c1bb35bebbef792498150663fdcd33c68" integrity sha512-6H2FBD5DPnQS75UWJtQjoVeKZlmXoa765UgYS5RQnx6Ay9LUhUld0w1/D6cYdrY+wnu6XQNlpEBfnJUZK0YyPQ== +diff-match-patch@^1.0.0: + version "1.0.4" + resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.4.tgz#6ac4b55237463761c4daf0dc603eb869124744b1" + integrity sha512-Uv3SW8bmH9nAtHKaKSanOQmj2DnlH65fUpcrMdfdaOxUG02QQ4YGZ8AE7kKOMisF7UqvOlGKVYWRvezdncW9lg== + diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -2812,6 +2893,11 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" +dom-confetti@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-confetti/-/dom-confetti-0.1.1.tgz#f53c355301286430e9f500567adac5041c827468" + integrity sha512-cyTs35FOqOlm+9rC8C5p0BFo0aHR2t6VWHdXmvgUEFHsF/P7tZeS5nw71oX6NifJrlxOmZ6VcmCH/hn99mqaAA== + dom-helpers@^5.0.1: version "5.1.3" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.1.3.tgz#7233248eb3a2d1f74aafca31e52c5299cc8ce821" @@ -2878,6 +2964,18 @@ electron-to-chromium@^1.3.295: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.296.tgz#a1d4322d742317945285d3ba88966561b67f3ac8" integrity sha512-s5hv+TSJSVRsxH190De66YHb50pBGTweT9XGWYu/LMR20KX6TsjFzObo36CjVAzM+PUeeKSBRtm/mISlCzeojQ== +element-ui@^2.12.0: + version "2.12.0" + resolved "https://registry.yarnpkg.com/element-ui/-/element-ui-2.12.0.tgz#a893bc11ae4f7dbb7e9d541606f23e643f131ee4" + integrity sha512-DapyT0PW4i/1ETPHk8K8Qbe8B6hj10+dXsRTrOTFryV9wAs6e9mCxbV65awokyR2/v/KuIHJmqX+mH3wUa4rOQ== + dependencies: + async-validator "~1.8.1" + babel-helper-vue-jsx-merge-props "^2.0.0" + deepmerge "^1.2.0" + normalize-wheel "^1.0.1" + resize-observer-polyfill "^1.5.0" + throttle-debounce "^1.0.1" + elliptic@^6.0.0: version "6.5.1" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.1.tgz#c380f5f909bf1b9b4428d028cd18d3b0efd6b52b" @@ -3273,6 +3371,11 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" +extracted-loader@1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/extracted-loader/-/extracted-loader-1.0.4.tgz#e1a3f1791813c14091a1959e261e23e95dd90115" + integrity sha512-G8A0hT/WCWIjesZm7BwbWdST5dQ08GNnCpTrJT/k/FYzuiJwlV1gyWjnuoizOzAR4jpEYXG2J++JyEKN/EB26Q== + fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" @@ -3293,6 +3396,11 @@ fast-levenshtein@~2.0.4: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= +fastparse@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" + integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== + figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" @@ -3320,6 +3428,14 @@ file-loader@4.2.0: loader-utils "^1.2.3" schema-utils "^2.0.0" +file-loader@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-2.0.0.tgz#39749c82f020b9e85901dcff98e8004e6401cfde" + integrity sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ== + dependencies: + loader-utils "^1.0.2" + schema-utils "^1.0.0" + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -3353,6 +3469,13 @@ find-root@^1.1.0: resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== +find-up@2.1.0, find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + find-up@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.0.0.tgz#c367f8024de92efb75f2d4906536d24682065c3a" @@ -3360,13 +3483,6 @@ find-up@4.0.0: dependencies: locate-path "^5.0.0" -find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -3595,6 +3711,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= +granim@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/granim/-/granim-2.0.0.tgz#cd3905e97dd5cb5ef0b164b68d5073ac43f1eec6" + integrity sha512-aqa79K49ndjoUBtpYzlO8sKcuVQED+5axvX0SveqTLDR+Fa2G42AGntuQ36ysCFOWGVkWCLfHowFwk+D/9rGDg== + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -3741,6 +3862,18 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: dependencies: safer-buffer ">= 2.1.2 < 3" +icss-replace-symbols@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" + integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= + +icss-utils@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" + integrity sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI= + dependencies: + postcss "^6.0.1" + icss-utils@^4.0.0, icss-utils@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" @@ -4420,6 +4553,11 @@ lodash._reinterpolate@^3.0.0: resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= +lodash.camelcase@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" + integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= + lodash.template@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" @@ -4629,7 +4767,7 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.4.2: +mime@^2.0.3, mime@^2.4.2: version "2.4.4" resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== @@ -4644,6 +4782,15 @@ mimic-fn@^2.0.0, mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== +mini-css-extract-plugin@0.4.3: + version "0.4.3" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.3.tgz#98d60fcc5d228c3e36a9bd15a1d6816d6580beb8" + integrity sha512-Mxs0nxzF1kxPv4TRi2NimewgXlJqh0rGE30vviCU2WHrpbta6wklnUV9dr9FUtoAHmB3p3LeXEC+ZjgHvB0Dzg== + dependencies: + loader-utils "^1.1.0" + schema-utils "^1.0.0" + webpack-sources "^1.1.0" + mini-css-extract-plugin@0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz#81d41ec4fe58c713a96ad7c723cdb2d0bd4d70e1" @@ -4818,6 +4965,14 @@ neo-async@^2.5.0, neo-async@^2.6.1: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== +next-fonts@^0.19.0: + version "0.19.0" + resolved "https://registry.yarnpkg.com/next-fonts/-/next-fonts-0.19.0.tgz#0a6d7d8235579d419e55e75a960c17cf19169f51" + integrity sha512-1/1GVBtxTEzGA/WYCWetegnVVzSp3tF0aacRY5mc973R6uPogMfid/nkLLlBgFBrFUy8wtv87Sag7vhNNzuSnA== + dependencies: + file-loader "^2.0.0" + url-loader "^1.1.1" + next@9.1.1: version "9.1.1" resolved "https://registry.yarnpkg.com/next/-/next-9.1.1.tgz#bede2e834548020bc4d3be0c46e3ed7edaac6d14" @@ -5005,6 +5160,11 @@ normalize-url@1.9.1: query-string "^4.1.0" sort-keys "^1.0.0" +normalize-wheel@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/normalize-wheel/-/normalize-wheel-1.0.1.tgz#aec886affdb045070d856447df62ecf86146ec45" + integrity sha1-rsiGr/2wRQcNhWRH32Ls+GFG7EU= + npm-bundled@^1.0.1: version "1.0.6" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" @@ -5678,6 +5838,13 @@ postcss-media-minmax@^4.0.0: dependencies: postcss "^7.0.2" +postcss-modules-extract-imports@^1.2.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz#dc87e34148ec7eab5f791f7cd5849833375b741a" + integrity sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw== + dependencies: + postcss "^6.0.1" + postcss-modules-extract-imports@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" @@ -5685,6 +5852,14 @@ postcss-modules-extract-imports@^2.0.0: dependencies: postcss "^7.0.5" +postcss-modules-local-by-default@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" + integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk= + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + postcss-modules-local-by-default@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915" @@ -5695,6 +5870,14 @@ postcss-modules-local-by-default@^3.0.2: postcss-selector-parser "^6.0.2" postcss-value-parser "^4.0.0" +postcss-modules-scope@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" + integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A= + dependencies: + css-selector-tokenizer "^0.7.0" + postcss "^6.0.1" + postcss-modules-scope@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz#ad3f5bf7856114f6fcab901b0502e2a2bc39d4eb" @@ -5703,6 +5886,14 @@ postcss-modules-scope@^2.1.0: postcss "^7.0.6" postcss-selector-parser "^6.0.0" +postcss-modules-values@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" + integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA= + dependencies: + icss-replace-symbols "^1.1.0" + postcss "^6.0.1" + postcss-modules-values@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" @@ -5832,6 +6023,11 @@ postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: indexes-of "^1.0.1" uniq "^1.0.1" +postcss-value-parser@^3.3.0: + version "3.3.1" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" + integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== + postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz#482282c09a42706d1fc9a069b73f44ec08391dc9" @@ -5846,6 +6042,15 @@ postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: indexes-of "^1.0.1" uniq "^1.0.1" +postcss@^6.0.1, postcss@^6.0.23: + version "6.0.23" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" + integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== + dependencies: + chalk "^2.4.1" + source-map "^0.6.1" + supports-color "^5.4.0" + postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.18, postcss@^7.0.19, postcss@^7.0.2, postcss@^7.0.5, postcss@^7.0.6: version "7.0.21" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" @@ -5877,6 +6082,11 @@ prettier@^1.17.1, prettier@^1.18.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.18.2.tgz#6823e7c5900017b4bd3acf46fe9ac4b4d7bda9ea" integrity sha512-OeHeMc0JhFE9idD4ZdtNibzY0+TPHSpSSb9h8FqtP+YnoZZ1sl8Vc9b1sasjfymH3SonAF4QcA2+mzHPhMvIiw== +prism-react-renderer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/prism-react-renderer/-/prism-react-renderer-1.0.2.tgz#3bb9a6a42f76fc049b03266298c7068fdd4b7ea9" + integrity sha512-0++pJyRfu4v2OxI/Us/5RLui9ESDkTiLkVCtKuPZYdpB8UQWJpnJQhPrWab053XtsKW3oM0sD69uJ6N9exm1Ag== + private@^0.1.6: version "0.1.8" resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" @@ -6166,7 +6376,7 @@ regenerate-unicode-properties@^8.1.0: dependencies: regenerate "^1.4.0" -regenerate@^1.4.0: +regenerate@^1.2.1, regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== @@ -6201,6 +6411,15 @@ regexpp@^2.0.1: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== +regexpu-core@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" + integrity sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs= + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + regexpu-core@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" @@ -6213,11 +6432,23 @@ regexpu-core@^4.6.0: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.1.0" +regjsgen@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" + integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= + regjsgen@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== +regjsparser@^0.1.4: + version "0.1.5" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" + integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= + dependencies: + jsesc "~0.5.0" + regjsparser@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" @@ -6250,6 +6481,11 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= +resize-observer-polyfill@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" + integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== + resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" @@ -6854,7 +7090,7 @@ supports-color@^4.5.0: dependencies: has-flag "^2.0.0" -supports-color@^5.3.0: +supports-color@^5.3.0, supports-color@^5.4.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -6958,6 +7194,11 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= +throttle-debounce@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-1.1.0.tgz#51853da37be68a155cb6e827b3514a3c422e89cd" + integrity sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg== + through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -7094,6 +7335,11 @@ type-fest@^0.5.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== +typed.js@^2.0.11: + version "2.0.11" + resolved "https://registry.yarnpkg.com/typed.js/-/typed.js-2.0.11.tgz#d298a91f959f11a3803bf48b841a6fadd29640d9" + integrity sha512-1ZORHalEyLob34q738mqmwp0pT6syMigB1SZuTItqdhovWBKFIt7I5uVALXAGQZCg2MCtihCt6uqkoqPJK+9iQ== + typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -7208,6 +7454,15 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= +url-loader@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.1.2.tgz#b971d191b83af693c5e3fea4064be9e1f2d7f8d8" + integrity sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg== + dependencies: + loader-utils "^1.1.0" + mime "^2.0.3" + schema-utils "^1.0.0" + url@0.11.0, url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -7271,11 +7526,68 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= +victormono@^1.2.7: + version "1.2.7" + resolved "https://registry.yarnpkg.com/victormono/-/victormono-1.2.7.tgz#e5e11ec9b6a18bd0a1f0e4d120c7273c2f73b72e" + integrity sha512-bZ/ESuooP6qeYdjiLdtIcBJ57E+MbLt2lm33NE28qpMci4WWJ5cqW7JMaxSg7NYGMQnSB3CdZwH0MD9g9UACPA== + dependencies: + animejs "^3.0.1" + core-js "^2.6.5" + dom-confetti "^0.1.1" + element-ui "^2.12.0" + granim "^2.0.0" + typed.js "^2.0.11" + vue "^2.6.10" + vue-codemirror "^4.0.6" + vue-faq-accordion "^1.2.1" + vue-scrollTo "^2.4.1" + vue-social-sharing "^2.4.6" + zooming "^2.1.1" + vm-browserify@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw== +vue-codemirror@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/vue-codemirror/-/vue-codemirror-4.0.6.tgz#b786bb80d8d762a93aab8e46f79a81006f0437c4" + integrity sha512-ilU7Uf0mqBNSSV3KT7FNEeRIxH4s1fmpG4TfHlzvXn0QiQAbkXS9lLfwuZpaBVEnpP5CSE62iGJjoliTuA8poQ== + dependencies: + codemirror "^5.41.0" + diff-match-patch "^1.0.0" + +vue-faq-accordion@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/vue-faq-accordion/-/vue-faq-accordion-1.2.1.tgz#9e64576d7a94debe8624d14afb9b8f9a2b195089" + integrity sha512-dKwiegdnhgOM9ne7vZv45PXpRpN5vrvaLVDcxUA7nLv9YOzH7yxAzuFMszng1wLXNZyqonUT/cOXW+mQhCaNMQ== + dependencies: + vue2-transitions "^0.2.3" + +vue-scrollTo@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/vue-scrollTo/-/vue-scrollTo-2.4.1.tgz#dcb7a68d63fda5ff4c93aa8aa55abaa153412ba8" + integrity sha1-3LemjWP9pf9Mk6qKpVq6oVNBK6g= + dependencies: + bezier-easing "^2.0.3" + +vue-social-sharing@^2.4.6: + version "2.4.6" + resolved "https://registry.yarnpkg.com/vue-social-sharing/-/vue-social-sharing-2.4.6.tgz#7e9f9c62a4ff335da547bd21eed7829c2920608d" + integrity sha512-uhDUA4Ha9+erYeP9/27PEA4pqp8m5UuboP8X8VdD2yw5dJVW+V8NpsixY19avJiP556N5mzZarNjkYhboaJRxQ== + dependencies: + vue "^2.2.4" + +vue2-transitions@^0.2.3: + version "0.2.3" + resolved "https://registry.yarnpkg.com/vue2-transitions/-/vue2-transitions-0.2.3.tgz#69c9d75b1db05f231b80980c03459d68490ba27d" + integrity sha512-Ou5x74AOQbM8JjZV8pIssFFqavvj53QzrEEUr5QnElUYb1ZizPwaUJo0ZqmLPqjwPae7ON4SG8U2cSTI4tHKLg== + +vue@^2.2.4, vue@^2.6.10: + version "2.6.10" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.10.tgz#a72b1a42a4d82a721ea438d1b6bf55e66195c637" + integrity sha512-ImThpeNU9HbdZL3utgMCq0oiMzAkt1mcgy3/E6zWC/G6AaQoeuFdsl9nDhTDU3X1R6FK7nsIUuRACVcjI+A2GQ== + watchpack@2.0.0-beta.5: version "2.0.0-beta.5" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.0.0-beta.5.tgz#c005db39570d81d9d34334870abc0f548901b880" @@ -7481,3 +7793,8 @@ yargs@^12.0.5: which-module "^2.0.0" y18n "^3.2.1 || ^4.0.0" yargs-parser "^11.1.1" + +zooming@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/zooming/-/zooming-2.1.1.tgz#3e05006b4e10335235ca626244d053d90a9c7e72" + integrity sha512-Z38dkZRQsFNBE67+xDBQLNKMs5J1Gc+s3/zO6iezTrC24VYLJV7YPBdBDJmiLhff5qa6Awxv4wsjqx3oYz2MYA== From 455b9dac0b2074391a0350aa416fe99b411a37fe Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sat, 2 Nov 2019 21:06:56 -0700 Subject: [PATCH 12/83] Adjust spacing --- pages/emojis-functional-programming.tsx | 22 ++++++++++++---------- src/components/Warning.tsx | 25 +++++++++++++++---------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index dbbb202f4..c24d17ded 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -19,7 +19,7 @@ import { import locale from 'src/lib/locale' import { DateTime } from 'luxon' import { enBaseUrl } from 'src/lib/meta' -import Warning from 'src/components/Warning' +import Warning, { warningSpacing } from 'src/components/Warning' import Highlight, { defaultProps } from 'prism-react-renderer' import theme from 'prism-react-renderer/themes/nightOwlLight' import 'victormono' @@ -65,15 +65,17 @@ const CodeBlock = ({ children }: { children: string }) => ( > {({ tokens, getLineProps, getTokenProps }) => (
         
( -
( +
{children}
From 906931ffbdeb48f6939195483c1417c5c57ff8f5 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sat, 2 Nov 2019 22:55:19 -0700 Subject: [PATCH 13/83] Improve font loading; continue w/ article --- next.config.js | 6 +- package.json | 5 +- pages/emojis-functional-programming.tsx | 101 +++++- public/static/fonts/VictorMono-SemiBold.woff | Bin 0 -> 49348 bytes public/static/fonts/VictorMono-SemiBold.woff2 | Bin 0 -> 45620 bytes src/components/Warning.tsx | 2 +- src/lib/theme/colors.ts | 3 +- yarn.lock | 336 +----------------- 8 files changed, 104 insertions(+), 349 deletions(-) create mode 100644 public/static/fonts/VictorMono-SemiBold.woff create mode 100644 public/static/fonts/VictorMono-SemiBold.woff2 diff --git a/next.config.js b/next.config.js index 1bf97608c..ca74818b6 100644 --- a/next.config.js +++ b/next.config.js @@ -1,9 +1,5 @@ const path = require('path') -// Necessary for victormono -const withCSS = require('@zeit/next-css') -const withFonts = require('next-fonts') - const config = { webpack(config) { config.resolve.alias = Object.assign({}, config.resolve.alias, { @@ -32,4 +28,4 @@ if (!process.env.PRODUCTION_LOCALE) { } } -module.exports = withFonts(withCSS(config)) +module.exports = config diff --git a/package.json b/package.json index c8a3704b0..6b6502403 100644 --- a/package.json +++ b/package.json @@ -15,8 +15,7 @@ "react-dom": "^16.11.0", "react-spring": "^8.0.27", "smoothscroll-polyfill": "^0.4.4", - "twemoji": "^12.1.3", - "victormono": "^1.2.7" + "twemoji": "^12.1.3" }, "_moduleAliases": { "src": "outDir/tsconfig.scripts.json/src", @@ -57,7 +56,6 @@ "@types/smoothscroll-polyfill": "^0.3.1", "@typescript-eslint/eslint-plugin": "^2.5.0", "@typescript-eslint/parser": "^2.5.0", - "@zeit/next-css": "^1.0.1", "babel-eslint": "^10.0.3", "babel-plugin-emotion": "^10.0.22", "concurrently": "^5.0.0", @@ -73,7 +71,6 @@ "fs-extra": "^8.1.0", "glob": "^7.1.5", "module-alias": "^2.2.2", - "next-fonts": "^0.19.0", "prettier": "^1.18.2", "typescript": "^3.7.1-rc" } diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index c24d17ded..48e234869 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -1,5 +1,5 @@ /** @jsx jsx */ -import { css, jsx } from '@emotion/core' +import { css, jsx, Global } from '@emotion/core' import Page from 'src/components/Page' import Head from 'next/head' import { ns, radii, fontSizes, colors, spaces } from 'src/lib/theme' @@ -8,6 +8,7 @@ import Container from 'src/components/Container' import Emoji from 'src/components/Emoji' import EpisodeHero from 'src/components/EpisodeHero' import EpisodePageFooter from 'src/components/EpisodePageFooter' +import * as R from 'src/components/Runners' import { P, Italic, @@ -22,7 +23,7 @@ import { enBaseUrl } from 'src/lib/meta' import Warning, { warningSpacing } from 'src/components/Warning' import Highlight, { defaultProps } from 'prism-react-renderer' import theme from 'prism-react-renderer/themes/nightOwlLight' -import 'victormono' +// import 'victormono' const date = DateTime.fromISO('2019-11-06T12:00:00Z') const dateString = date @@ -56,7 +57,32 @@ const Subheading = (props: JSX.IntrinsicElements['h3']) => ( /> ) -const CodeBlock = ({ children }: { children: string }) => ( +const codeFontFamily = `'Victor Mono', SFMono-Regular, Consolas, +Liberation Mono, Menlo, Courier, monospace` + +const InlineCode = ({ children }: { children: string }) => ( + + {children} + +) + +const CodeBlock = ({ + children, + shouldHighlight +}: { + children: string + shouldHighlight?: (lineNumber: number, tokenNumber: number) => boolean +}) => ( ( css={[ warningSpacing, css` - background-color: #f5f6ff; + background-color: ${colors('codeBg')}; border-radius: ${radii(0.5)}; - font-weight: bold; - font-family: 'Victor Mono', SFMono-Regular, Consolas, - Liberation Mono, Menlo, Courier, monospace; + font-weight: 600; + font-family: ${codeFontFamily}; margin: ${spaces(1.25)} 0 ${spaces(1.25)}; + font-size: ${fontSizes(0.85)}; ` ]} > @@ -87,9 +113,17 @@ const CodeBlock = ({ children }: { children: string }) => ( {line.map((token, key) => ( ))}
@@ -103,6 +137,20 @@ const CodeBlock = ({ children }: { children: string }) => ( export default () => locale === 'en' ? ( + {titleWithEmoji} @@ -198,11 +246,36 @@ export default () => Identity function in JS

- First, take a look at the following code. It’s an identity function in - JavaScript that returns the argument. + First, take a look at the following code. It’s an{' '} + identity function in JavaScript that returns the + argument. +

+ {`// Identity function in JS +sushi => sushi`} +

+ If you apply the above function on a string{' '} + 'sandwich', then the result would be{' '} + 'sandwich'. +

+ {`// The result would be 'sandwich' +(sushi => sushi)('sandwich')`} +

+ Now, here’s the interesting part: One day, I realized + that the above JS code can be{' '} + described visually using emojis. Check this out:

- {`// Identity function -a => a`} + + An “emoji puzzle” that visually describes +
+ the JS code from the above +
+

+ + lineNumber === 1 && tokenNumber > 1 && tokenNumber < 6 + } + >{`// The result would be 'sandwich' +(sushi => sushi)('sandwich')`}
diff --git a/public/static/fonts/VictorMono-SemiBold.woff b/public/static/fonts/VictorMono-SemiBold.woff new file mode 100644 index 0000000000000000000000000000000000000000..d8340d3ae183ae8948bf56c9731fc9a0de3ff202 GIT binary patch literal 49348 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 C9NJX? literal 0 HcmV?d00001 diff --git a/public/static/fonts/VictorMono-SemiBold.woff2 b/public/static/fonts/VictorMono-SemiBold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..bed97f8522d6af0aea866efcce31c3abef2c2acf GIT binary patch literal 45620 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 literal 0 HcmV?d00001 diff --git a/src/components/Warning.tsx b/src/components/Warning.tsx index 20a492c01..ea2b005d2 100644 --- a/src/components/Warning.tsx +++ b/src/components/Warning.tsx @@ -3,7 +3,7 @@ import { css, jsx } from '@emotion/core' import { ns, radii, colors, spaces } from 'src/lib/theme' export const warningSpacing = css` - padding: ${spaces(0.75)} ${spaces(1)}; + padding: ${spaces(0.75)} ${spaces(0.75)}; ${ns} { padding: ${spaces(1)} ${spaces(1.25)}; diff --git a/src/lib/theme/colors.ts b/src/lib/theme/colors.ts index 481ca6a70..d38d9d783 100644 --- a/src/lib/theme/colors.ts +++ b/src/lib/theme/colors.ts @@ -73,7 +73,8 @@ export const allColors = { deepOrange800: deepOrange[800], cyan100: cyan[100], red100: red[100], - orange100: orange[100] + orange100: orange[100], + codeBg: '#f5f6ff' } const colors = (x: keyof typeof allColors) => allColors[x] diff --git a/yarn.lock b/yarn.lock index 9a87440a8..9b83ae323 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1437,18 +1437,6 @@ resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -"@zeit/next-css@^1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@zeit/next-css/-/next-css-1.0.1.tgz#4f784e841e7ca1b21b3468a902e2c1fa95a3e75c" - integrity sha512-yfHPRy/ne/5SddVClsoy+fpU7e0Cs1gkWA67/wm2uIu+9rznF45yQLxHEt5dPGF3h6IiIh7ZtIgA8VV8YKq87A== - dependencies: - css-loader "1.0.0" - extracted-loader "1.0.4" - find-up "2.1.0" - ignore-loader "0.1.2" - mini-css-extract-plugin "0.4.3" - postcss-loader "3.0.0" - abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" @@ -1506,11 +1494,6 @@ amphtml-validator@1.0.23: commander "2.9.0" promise "7.1.1" -animejs@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/animejs/-/animejs-3.1.0.tgz#748a90fc1d4bef3efed64508af9a6a82babf5c47" - integrity sha512-BjnCroPPQPEAngT0M89pz9TBcOGgOFLnVoq3+jV2upl4rn60k57/AXvESTnuILsNgOEjGuhMEOMp7IlQzk40kA== - ansi-colors@^3.0.0: version "3.2.4" resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz#e3a3da4bfbae6c86a9c285625de124a234026fbf" @@ -1685,13 +1668,6 @@ async-sema@3.0.0: resolved "https://registry.yarnpkg.com/async-sema/-/async-sema-3.0.0.tgz#9e22d6783f0ab66a1cf330e21a905e39b3b3a975" integrity sha512-zyCMBDl4m71feawrxYcVbHxv/UUkqm4nKJiLu3+l9lfiQha6jQ/9dxhrXLnzzBXVFqCTDwiUkZOz9XFbdEGQsg== -async-validator@~1.8.1: - version "1.8.5" - resolved "https://registry.yarnpkg.com/async-validator/-/async-validator-1.8.5.tgz#dc3e08ec1fd0dddb67e60842f02c0cd1cec6d7f0" - integrity sha512-tXBM+1m056MAX0E8TL2iCjg8WvSyXu0Zc8LNtYqrVeyoL3+esHRZ4SieE9fKQyyU09uONjnMEjrNBMqT0mbvmA== - dependencies: - babel-runtime "6.x" - atob@^2.1.1: version "2.1.2" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" @@ -1733,7 +1709,7 @@ axobject-query@^2.0.2: dependencies: ast-types-flow "0.0.7" -babel-code-frame@^6.22.0, babel-code-frame@^6.26.0: +babel-code-frame@^6.22.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" integrity sha1-Y/1D99weO7fONZR9uP42mj9Yx0s= @@ -1759,11 +1735,6 @@ babel-eslint@^10.0.3: eslint-visitor-keys "^1.0.0" resolve "^1.12.0" -babel-helper-vue-jsx-merge-props@^2.0.0: - version "2.0.3" - resolved "https://registry.yarnpkg.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6" - integrity sha512-gsLiKK7Qrb7zYJNgiXKpXblxbV5ffSwR0f5whkPAaBAR4fhi6bwRZxX9wBlIc5M/v8CCkXUbXZL4N/nSE97cqg== - babel-loader@8.0.6: version "8.0.6" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.0.6.tgz#e33bdb6f362b03f4bb141a0c21ab87c501b70dfb" @@ -1824,7 +1795,7 @@ babel-plugin-transform-react-remove-prop-types@0.4.24: resolved "https://registry.yarnpkg.com/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz#f2edaf9b4c6a5fbe5c1d678bfb531078c1555f3a" integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== -babel-runtime@6.x, babel-runtime@^6.26.0: +babel-runtime@^6.26.0: version "6.26.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= @@ -1865,11 +1836,6 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" -bezier-easing@^2.0.3: - version "2.1.0" - resolved "https://registry.yarnpkg.com/bezier-easing/-/bezier-easing-2.1.0.tgz#c04dfe8b926d6ecaca1813d69ff179b7c2025d86" - integrity sha1-wE3+i5JtbsrKGBPWn/F5t8ICXYY= - big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -2243,11 +2209,6 @@ code-point-at@^1.0.0: resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" integrity sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c= -codemirror@^5.41.0: - version "5.49.2" - resolved "https://registry.yarnpkg.com/codemirror/-/codemirror-5.49.2.tgz#c84fdaf11b19803f828b0c67060c7bc6d154ccad" - integrity sha512-dwJ2HRPHm8w51WB5YTF9J7m6Z5dtkqbU9ntMZ1dqXyFB9IpjoUFDj80ahRVEoVanfIp6pfASJbOlbWdEf8FOzQ== - collection-visit@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" @@ -2547,24 +2508,6 @@ css-has-pseudo@^0.10.0: postcss "^7.0.6" postcss-selector-parser "^5.0.0-rc.4" -css-loader@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-1.0.0.tgz#9f46aaa5ca41dbe31860e3b62b8e23c42916bf56" - integrity sha512-tMXlTYf3mIMt3b0dDCOQFJiVvxbocJ5Ho577WiGPYPZcqVEO218L2iU22pDXzkTZCLDE+9AmGSUkWxeh/nZReA== - dependencies: - babel-code-frame "^6.26.0" - css-selector-tokenizer "^0.7.0" - icss-utils "^2.1.0" - loader-utils "^1.0.2" - lodash.camelcase "^4.3.0" - postcss "^6.0.23" - postcss-modules-extract-imports "^1.2.0" - postcss-modules-local-by-default "^1.2.0" - postcss-modules-scope "^1.1.0" - postcss-modules-values "^1.3.0" - postcss-value-parser "^3.3.0" - source-list-map "^2.0.0" - css-loader@3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-3.2.0.tgz#bb570d89c194f763627fcf1f80059c6832d009b2" @@ -2605,15 +2548,6 @@ css-select@^2.0.0: domutils "^1.7.0" nth-check "^1.0.2" -css-selector-tokenizer@^0.7.0: - version "0.7.1" - resolved "https://registry.yarnpkg.com/css-selector-tokenizer/-/css-selector-tokenizer-0.7.1.tgz#a177271a8bca5019172f4f891fc6eed9cbf68d5d" - integrity sha512-xYL0AMZJ4gFzJQsHUKa5jiWWi2vH77WVNg7JYRyewwj6oPh4yb/y6Y9ZCw9dsj/9UauMhtuxR+ogQd//EdEVNA== - dependencies: - cssesc "^0.1.0" - fastparse "^1.1.1" - regexpu-core "^1.0.0" - css-tree@1.0.0-alpha.29: version "1.0.0-alpha.29" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.29.tgz#3fa9d4ef3142cbd1c301e7664c1f352bd82f5a39" @@ -2658,11 +2592,6 @@ cssdb@^4.4.0: resolved "https://registry.yarnpkg.com/cssdb/-/cssdb-4.4.0.tgz#3bf2f2a68c10f5c6a08abd92378331ee803cddb0" integrity sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ== -cssesc@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-0.1.0.tgz#c814903e45623371a0477b40109aaafbeeaddbb4" - integrity sha1-yBSQPkViM3GgR3tAEJqq++6t27Q= - cssesc@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-2.0.0.tgz#3b13bd1bb1cb36e1bcb5a4dcd27f54c5dcb35703" @@ -2766,11 +2695,6 @@ deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -deepmerge@^1.2.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz#10499d868844cdad4fee0842df8c7f6f0c95a753" - integrity sha512-95k0GDqvBjZavkuvzx/YqVLv/6YYa17fz6ILMSf7neqQITCPbnfEnQvEgMPNjH4kgobe7+WIL0yJEHku+H3qtQ== - deepmerge@^4.0.0: version "4.2.1" resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.1.tgz#018a3e5dfe82b95e35e36a9a29ba15ddb194e40f" @@ -2857,11 +2781,6 @@ devalue@2.0.0: resolved "https://registry.yarnpkg.com/devalue/-/devalue-2.0.0.tgz#2afa0b7c1bb35bebbef792498150663fdcd33c68" integrity sha512-6H2FBD5DPnQS75UWJtQjoVeKZlmXoa765UgYS5RQnx6Ay9LUhUld0w1/D6cYdrY+wnu6XQNlpEBfnJUZK0YyPQ== -diff-match-patch@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/diff-match-patch/-/diff-match-patch-1.0.4.tgz#6ac4b55237463761c4daf0dc603eb869124744b1" - integrity sha512-Uv3SW8bmH9nAtHKaKSanOQmj2DnlH65fUpcrMdfdaOxUG02QQ4YGZ8AE7kKOMisF7UqvOlGKVYWRvezdncW9lg== - diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -2893,11 +2812,6 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-confetti@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dom-confetti/-/dom-confetti-0.1.1.tgz#f53c355301286430e9f500567adac5041c827468" - integrity sha512-cyTs35FOqOlm+9rC8C5p0BFo0aHR2t6VWHdXmvgUEFHsF/P7tZeS5nw71oX6NifJrlxOmZ6VcmCH/hn99mqaAA== - dom-helpers@^5.0.1: version "5.1.3" resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.1.3.tgz#7233248eb3a2d1f74aafca31e52c5299cc8ce821" @@ -2964,18 +2878,6 @@ electron-to-chromium@^1.3.295: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.296.tgz#a1d4322d742317945285d3ba88966561b67f3ac8" integrity sha512-s5hv+TSJSVRsxH190De66YHb50pBGTweT9XGWYu/LMR20KX6TsjFzObo36CjVAzM+PUeeKSBRtm/mISlCzeojQ== -element-ui@^2.12.0: - version "2.12.0" - resolved "https://registry.yarnpkg.com/element-ui/-/element-ui-2.12.0.tgz#a893bc11ae4f7dbb7e9d541606f23e643f131ee4" - integrity sha512-DapyT0PW4i/1ETPHk8K8Qbe8B6hj10+dXsRTrOTFryV9wAs6e9mCxbV65awokyR2/v/KuIHJmqX+mH3wUa4rOQ== - dependencies: - async-validator "~1.8.1" - babel-helper-vue-jsx-merge-props "^2.0.0" - deepmerge "^1.2.0" - normalize-wheel "^1.0.1" - resize-observer-polyfill "^1.5.0" - throttle-debounce "^1.0.1" - elliptic@^6.0.0: version "6.5.1" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.1.tgz#c380f5f909bf1b9b4428d028cd18d3b0efd6b52b" @@ -3371,11 +3273,6 @@ extglob@^2.0.4: snapdragon "^0.8.1" to-regex "^3.0.1" -extracted-loader@1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/extracted-loader/-/extracted-loader-1.0.4.tgz#e1a3f1791813c14091a1959e261e23e95dd90115" - integrity sha512-G8A0hT/WCWIjesZm7BwbWdST5dQ08GNnCpTrJT/k/FYzuiJwlV1gyWjnuoizOzAR4jpEYXG2J++JyEKN/EB26Q== - fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" @@ -3396,11 +3293,6 @@ fast-levenshtein@~2.0.4: resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= -fastparse@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.2.tgz#91728c5a5942eced8531283c79441ee4122c35a9" - integrity sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ== - figgy-pudding@^3.5.1: version "3.5.1" resolved "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.1.tgz#862470112901c727a0e495a80744bd5baa1d6790" @@ -3428,14 +3320,6 @@ file-loader@4.2.0: loader-utils "^1.2.3" schema-utils "^2.0.0" -file-loader@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-2.0.0.tgz#39749c82f020b9e85901dcff98e8004e6401cfde" - integrity sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ== - dependencies: - loader-utils "^1.0.2" - schema-utils "^1.0.0" - fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -3469,13 +3353,6 @@ find-root@^1.1.0: resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== -find-up@2.1.0, find-up@^2.0.0, find-up@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" - integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= - dependencies: - locate-path "^2.0.0" - find-up@4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.0.0.tgz#c367f8024de92efb75f2d4906536d24682065c3a" @@ -3483,6 +3360,13 @@ find-up@4.0.0: dependencies: locate-path "^5.0.0" +find-up@^2.0.0, find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + integrity sha1-RdG35QbHF93UgndaK3eSCjwMV6c= + dependencies: + locate-path "^2.0.0" + find-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" @@ -3711,11 +3595,6 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" integrity sha1-TK+tdrxi8C+gObL5Tpo906ORpyU= -granim@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/granim/-/granim-2.0.0.tgz#cd3905e97dd5cb5ef0b164b68d5073ac43f1eec6" - integrity sha512-aqa79K49ndjoUBtpYzlO8sKcuVQED+5axvX0SveqTLDR+Fa2G42AGntuQ36ysCFOWGVkWCLfHowFwk+D/9rGDg== - has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -3862,18 +3741,6 @@ iconv-lite@0.4.24, iconv-lite@^0.4.24, iconv-lite@^0.4.4: dependencies: safer-buffer ">= 2.1.2 < 3" -icss-replace-symbols@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz#06ea6f83679a7749e386cfe1fe812ae5db223ded" - integrity sha1-Bupvg2ead0njhs/h/oEq5dsiPe0= - -icss-utils@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-2.1.0.tgz#83f0a0ec378bf3246178b6c2ad9136f135b1c962" - integrity sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI= - dependencies: - postcss "^6.0.1" - icss-utils@^4.0.0, icss-utils@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz#21170b53789ee27447c2f47dd683081403f9a467" @@ -4553,11 +4420,6 @@ lodash._reinterpolate@^3.0.0: resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= -lodash.camelcase@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" - integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY= - lodash.template@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" @@ -4767,7 +4629,7 @@ mime@1.6.0: resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.0.3, mime@^2.4.2: +mime@^2.4.2: version "2.4.4" resolved "https://registry.yarnpkg.com/mime/-/mime-2.4.4.tgz#bd7b91135fc6b01cde3e9bae33d659b63d8857e5" integrity sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA== @@ -4782,15 +4644,6 @@ mimic-fn@^2.0.0, mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mini-css-extract-plugin@0.4.3: - version "0.4.3" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.3.tgz#98d60fcc5d228c3e36a9bd15a1d6816d6580beb8" - integrity sha512-Mxs0nxzF1kxPv4TRi2NimewgXlJqh0rGE30vviCU2WHrpbta6wklnUV9dr9FUtoAHmB3p3LeXEC+ZjgHvB0Dzg== - dependencies: - loader-utils "^1.1.0" - schema-utils "^1.0.0" - webpack-sources "^1.1.0" - mini-css-extract-plugin@0.8.0: version "0.8.0" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz#81d41ec4fe58c713a96ad7c723cdb2d0bd4d70e1" @@ -4965,14 +4818,6 @@ neo-async@^2.5.0, neo-async@^2.6.1: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== -next-fonts@^0.19.0: - version "0.19.0" - resolved "https://registry.yarnpkg.com/next-fonts/-/next-fonts-0.19.0.tgz#0a6d7d8235579d419e55e75a960c17cf19169f51" - integrity sha512-1/1GVBtxTEzGA/WYCWetegnVVzSp3tF0aacRY5mc973R6uPogMfid/nkLLlBgFBrFUy8wtv87Sag7vhNNzuSnA== - dependencies: - file-loader "^2.0.0" - url-loader "^1.1.1" - next@9.1.1: version "9.1.1" resolved "https://registry.yarnpkg.com/next/-/next-9.1.1.tgz#bede2e834548020bc4d3be0c46e3ed7edaac6d14" @@ -5160,11 +5005,6 @@ normalize-url@1.9.1: query-string "^4.1.0" sort-keys "^1.0.0" -normalize-wheel@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/normalize-wheel/-/normalize-wheel-1.0.1.tgz#aec886affdb045070d856447df62ecf86146ec45" - integrity sha1-rsiGr/2wRQcNhWRH32Ls+GFG7EU= - npm-bundled@^1.0.1: version "1.0.6" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.0.6.tgz#e7ba9aadcef962bb61248f91721cd932b3fe6bdd" @@ -5838,13 +5678,6 @@ postcss-media-minmax@^4.0.0: dependencies: postcss "^7.0.2" -postcss-modules-extract-imports@^1.2.0: - version "1.2.1" - resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.1.tgz#dc87e34148ec7eab5f791f7cd5849833375b741a" - integrity sha512-6jt9XZwUhwmRUhb/CkyJY020PYaPJsCyt3UjbaWo6XEbH/94Hmv6MP7fG2C5NDU/BcHzyGYxNtHvM+LTf9HrYw== - dependencies: - postcss "^6.0.1" - postcss-modules-extract-imports@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz#818719a1ae1da325f9832446b01136eeb493cd7e" @@ -5852,14 +5685,6 @@ postcss-modules-extract-imports@^2.0.0: dependencies: postcss "^7.0.5" -postcss-modules-local-by-default@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz#f7d80c398c5a393fa7964466bd19500a7d61c069" - integrity sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk= - dependencies: - css-selector-tokenizer "^0.7.0" - postcss "^6.0.1" - postcss-modules-local-by-default@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz#e8a6561be914aaf3c052876377524ca90dbb7915" @@ -5870,14 +5695,6 @@ postcss-modules-local-by-default@^3.0.2: postcss-selector-parser "^6.0.2" postcss-value-parser "^4.0.0" -postcss-modules-scope@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz#d6ea64994c79f97b62a72b426fbe6056a194bb90" - integrity sha1-1upkmUx5+XtipytCb75gVqGUu5A= - dependencies: - css-selector-tokenizer "^0.7.0" - postcss "^6.0.1" - postcss-modules-scope@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.1.0.tgz#ad3f5bf7856114f6fcab901b0502e2a2bc39d4eb" @@ -5886,14 +5703,6 @@ postcss-modules-scope@^2.1.0: postcss "^7.0.6" postcss-selector-parser "^6.0.0" -postcss-modules-values@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz#ecffa9d7e192518389f42ad0e83f72aec456ea20" - integrity sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA= - dependencies: - icss-replace-symbols "^1.1.0" - postcss "^6.0.1" - postcss-modules-values@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz#5b5000d6ebae29b4255301b4a3a54574423e7f10" @@ -6023,11 +5832,6 @@ postcss-selector-parser@^6.0.0, postcss-selector-parser@^6.0.2: indexes-of "^1.0.1" uniq "^1.0.1" -postcss-value-parser@^3.3.0: - version "3.3.1" - resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" - integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== - postcss-value-parser@^4.0.0, postcss-value-parser@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.0.2.tgz#482282c09a42706d1fc9a069b73f44ec08391dc9" @@ -6042,15 +5846,6 @@ postcss-values-parser@^2.0.0, postcss-values-parser@^2.0.1: indexes-of "^1.0.1" uniq "^1.0.1" -postcss@^6.0.1, postcss@^6.0.23: - version "6.0.23" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" - integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== - dependencies: - chalk "^2.4.1" - source-map "^0.6.1" - supports-color "^5.4.0" - postcss@^7.0.0, postcss@^7.0.14, postcss@^7.0.16, postcss@^7.0.17, postcss@^7.0.18, postcss@^7.0.19, postcss@^7.0.2, postcss@^7.0.5, postcss@^7.0.6: version "7.0.21" resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.21.tgz#06bb07824c19c2021c5d056d5b10c35b989f7e17" @@ -6376,7 +6171,7 @@ regenerate-unicode-properties@^8.1.0: dependencies: regenerate "^1.4.0" -regenerate@^1.2.1, regenerate@^1.4.0: +regenerate@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" integrity sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg== @@ -6411,15 +6206,6 @@ regexpp@^2.0.1: resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== -regexpu-core@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-1.0.0.tgz#86a763f58ee4d7c2f6b102e4764050de7ed90c6b" - integrity sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs= - dependencies: - regenerate "^1.2.1" - regjsgen "^0.2.0" - regjsparser "^0.1.4" - regexpu-core@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.6.0.tgz#2037c18b327cfce8a6fea2a4ec441f2432afb8b6" @@ -6432,23 +6218,11 @@ regexpu-core@^4.6.0: unicode-match-property-ecmascript "^1.0.4" unicode-match-property-value-ecmascript "^1.1.0" -regjsgen@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" - integrity sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc= - regjsgen@^0.5.0: version "0.5.1" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.1.tgz#48f0bf1a5ea205196929c0d9798b42d1ed98443c" integrity sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg== -regjsparser@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" - integrity sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw= - dependencies: - jsesc "~0.5.0" - regjsparser@^0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" @@ -6481,11 +6255,6 @@ require-main-filename@^1.0.1: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" integrity sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE= -resize-observer-polyfill@^1.5.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" - integrity sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg== - resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" @@ -7090,7 +6859,7 @@ supports-color@^4.5.0: dependencies: has-flag "^2.0.0" -supports-color@^5.3.0, supports-color@^5.4.0: +supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== @@ -7194,11 +6963,6 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -throttle-debounce@^1.0.1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-1.1.0.tgz#51853da37be68a155cb6e827b3514a3c422e89cd" - integrity sha512-XH8UiPCQcWNuk2LYePibW/4qL97+ZQ1AN3FNXwZRBNPPowo/NRU5fAlDCSNBJIYCKbioZfuYtMhG4quqoJhVzg== - through2@^2.0.0: version "2.0.5" resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" @@ -7335,11 +7099,6 @@ type-fest@^0.5.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.5.2.tgz#d6ef42a0356c6cd45f49485c3b6281fc148e48a2" integrity sha512-DWkS49EQKVX//Tbupb9TFa19c7+MK1XmzkrZUR8TAktmE/DizXoaoJV6TZ/tSIPXipqNiRI6CyAe7x69Jb6RSw== -typed.js@^2.0.11: - version "2.0.11" - resolved "https://registry.yarnpkg.com/typed.js/-/typed.js-2.0.11.tgz#d298a91f959f11a3803bf48b841a6fadd29640d9" - integrity sha512-1ZORHalEyLob34q738mqmwp0pT6syMigB1SZuTItqdhovWBKFIt7I5uVALXAGQZCg2MCtihCt6uqkoqPJK+9iQ== - typedarray-to-buffer@^3.1.5: version "3.1.5" resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080" @@ -7454,15 +7213,6 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= -url-loader@^1.1.1: - version "1.1.2" - resolved "https://registry.yarnpkg.com/url-loader/-/url-loader-1.1.2.tgz#b971d191b83af693c5e3fea4064be9e1f2d7f8d8" - integrity sha512-dXHkKmw8FhPqu8asTc1puBfe3TehOCo2+RmOOev5suNCIYBcT626kxiWg1NBVkwc4rO8BGa7gP70W7VXuqHrjg== - dependencies: - loader-utils "^1.1.0" - mime "^2.0.3" - schema-utils "^1.0.0" - url@0.11.0, url@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1" @@ -7526,68 +7276,11 @@ vary@~1.1.2: resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw= -victormono@^1.2.7: - version "1.2.7" - resolved "https://registry.yarnpkg.com/victormono/-/victormono-1.2.7.tgz#e5e11ec9b6a18bd0a1f0e4d120c7273c2f73b72e" - integrity sha512-bZ/ESuooP6qeYdjiLdtIcBJ57E+MbLt2lm33NE28qpMci4WWJ5cqW7JMaxSg7NYGMQnSB3CdZwH0MD9g9UACPA== - dependencies: - animejs "^3.0.1" - core-js "^2.6.5" - dom-confetti "^0.1.1" - element-ui "^2.12.0" - granim "^2.0.0" - typed.js "^2.0.11" - vue "^2.6.10" - vue-codemirror "^4.0.6" - vue-faq-accordion "^1.2.1" - vue-scrollTo "^2.4.1" - vue-social-sharing "^2.4.6" - zooming "^2.1.1" - vm-browserify@^1.0.1: version "1.1.0" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.0.tgz#bd76d6a23323e2ca8ffa12028dc04559c75f9019" integrity sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw== -vue-codemirror@^4.0.6: - version "4.0.6" - resolved "https://registry.yarnpkg.com/vue-codemirror/-/vue-codemirror-4.0.6.tgz#b786bb80d8d762a93aab8e46f79a81006f0437c4" - integrity sha512-ilU7Uf0mqBNSSV3KT7FNEeRIxH4s1fmpG4TfHlzvXn0QiQAbkXS9lLfwuZpaBVEnpP5CSE62iGJjoliTuA8poQ== - dependencies: - codemirror "^5.41.0" - diff-match-patch "^1.0.0" - -vue-faq-accordion@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/vue-faq-accordion/-/vue-faq-accordion-1.2.1.tgz#9e64576d7a94debe8624d14afb9b8f9a2b195089" - integrity sha512-dKwiegdnhgOM9ne7vZv45PXpRpN5vrvaLVDcxUA7nLv9YOzH7yxAzuFMszng1wLXNZyqonUT/cOXW+mQhCaNMQ== - dependencies: - vue2-transitions "^0.2.3" - -vue-scrollTo@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/vue-scrollTo/-/vue-scrollTo-2.4.1.tgz#dcb7a68d63fda5ff4c93aa8aa55abaa153412ba8" - integrity sha1-3LemjWP9pf9Mk6qKpVq6oVNBK6g= - dependencies: - bezier-easing "^2.0.3" - -vue-social-sharing@^2.4.6: - version "2.4.6" - resolved "https://registry.yarnpkg.com/vue-social-sharing/-/vue-social-sharing-2.4.6.tgz#7e9f9c62a4ff335da547bd21eed7829c2920608d" - integrity sha512-uhDUA4Ha9+erYeP9/27PEA4pqp8m5UuboP8X8VdD2yw5dJVW+V8NpsixY19avJiP556N5mzZarNjkYhboaJRxQ== - dependencies: - vue "^2.2.4" - -vue2-transitions@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/vue2-transitions/-/vue2-transitions-0.2.3.tgz#69c9d75b1db05f231b80980c03459d68490ba27d" - integrity sha512-Ou5x74AOQbM8JjZV8pIssFFqavvj53QzrEEUr5QnElUYb1ZizPwaUJo0ZqmLPqjwPae7ON4SG8U2cSTI4tHKLg== - -vue@^2.2.4, vue@^2.6.10: - version "2.6.10" - resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.10.tgz#a72b1a42a4d82a721ea438d1b6bf55e66195c637" - integrity sha512-ImThpeNU9HbdZL3utgMCq0oiMzAkt1mcgy3/E6zWC/G6AaQoeuFdsl9nDhTDU3X1R6FK7nsIUuRACVcjI+A2GQ== - watchpack@2.0.0-beta.5: version "2.0.0-beta.5" resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.0.0-beta.5.tgz#c005db39570d81d9d34334870abc0f548901b880" @@ -7793,8 +7486,3 @@ yargs@^12.0.5: which-module "^2.0.0" y18n "^3.2.1 || ^4.0.0" yargs-parser "^11.1.1" - -zooming@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/zooming/-/zooming-2.1.1.tgz#3e05006b4e10335235ca626244d053d90a9c7e72" - integrity sha512-Z38dkZRQsFNBE67+xDBQLNKMs5J1Gc+s3/zO6iezTrC24VYLJV7YPBdBDJmiLhff5qa6Awxv4wsjqx3oYz2MYA== From 1f3e06c3cbd9198cf2a883ea4b4c63f019d84117 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sat, 2 Nov 2019 23:02:18 -0700 Subject: [PATCH 14/83] Tweak spacing --- pages/emojis-functional-programming.tsx | 2 +- src/components/ContentTags/Headings.tsx | 3 ++- src/lib/theme/lineHeights.ts | 1 + 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 48e234869..6db1a193d 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -52,7 +52,7 @@ const Subheading = (props: JSX.IntrinsicElements['h3']) => (

) diff --git a/src/components/ContentTags/Headings.tsx b/src/components/ContentTags/Headings.tsx index ba50235c3..256b761f1 100644 --- a/src/components/ContentTags/Headings.tsx +++ b/src/components/ContentTags/Headings.tsx @@ -1,5 +1,5 @@ import styled from '@emotion/styled' -import { colors, fontSizes, spaces, ns } from 'src/lib/theme' +import { lineHeights, colors, fontSizes, spaces, ns } from 'src/lib/theme' export const H3 = styled.h3` color: ${colors('grey900')}; @@ -7,6 +7,7 @@ export const H3 = styled.h3` font-size: ${fontSizes(1.2)}; ${ns} { + line-height: ${lineHeights(1.4)}; font-size: ${fontSizes(1.4)}; } ` diff --git a/src/lib/theme/lineHeights.ts b/src/lib/theme/lineHeights.ts index 712e51f5e..ae6e09314 100644 --- a/src/lib/theme/lineHeights.ts +++ b/src/lib/theme/lineHeights.ts @@ -5,6 +5,7 @@ export const allLineHeights = { 1.1: 1.1, 1.2: 1.2, 1.3: 1.3, + 1.4: 1.4, 1.55: 1.55, 2: 2 } From 98d59582a3b0a2aeb5058c9b909ef59c105047ab Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sat, 2 Nov 2019 23:22:35 -0700 Subject: [PATCH 15/83] Update description --- pages/emojis-functional-programming.tsx | 39 +++++++++++-------------- 1 file changed, 17 insertions(+), 22 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 6db1a193d..a4013ffeb 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -9,14 +9,7 @@ import Emoji from 'src/components/Emoji' import EpisodeHero from 'src/components/EpisodeHero' import EpisodePageFooter from 'src/components/EpisodePageFooter' import * as R from 'src/components/Runners' -import { - P, - Italic, - Bold, - InternalLink, - ExternalLink, - H3 -} from 'src/components/ContentTags' +import { P, Italic, Bold, InternalLink, H3 } from 'src/components/ContentTags' import locale from 'src/lib/locale' import { DateTime } from 'luxon' import { enBaseUrl } from 'src/lib/meta' @@ -26,10 +19,10 @@ import theme from 'prism-react-renderer/themes/nightOwlLight' // import 'victormono' const date = DateTime.fromISO('2019-11-06T12:00:00Z') -const dateString = date - .setLocale('en') - .setZone('America/Los_Angeles') - .toFormat('LLL d, yyyy') +// const dateString = date +// .setLocale('en') +// .setZone('America/Los_Angeles') +// .toFormat('LLL d, yyyy') const dateSchemaString = date.setZone('America/Los_Angeles').toISO() const title = 'Using Emojis to Teach Functional Programming to Non-programmers' @@ -44,7 +37,7 @@ const titleSplit = ( ) const description = - 'How to teach lambda calculus, Church encoding, and Y combinator without any code' + 'A visual implementation of Lambda calculus, Church encoding, and Y combinator' const url = `${enBaseUrl}/emojis-functional-programming` const ogImageUrl = `${enBaseUrl}/static/images/blog-og.png` @@ -178,20 +171,22 @@ export default () => padding-bottom: ${spaces(6)}; `} > -
- · Shu - Uesugi ( - - @chibicode - - ) -
+ {description} +

{title} Date: Sat, 2 Nov 2019 23:30:24 -0700 Subject: [PATCH 16/83] Use indigo text --- pages/emojis-functional-programming.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index a4013ffeb..3f6e3e938 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -174,7 +174,7 @@ export default () =>

Date: Sun, 3 Nov 2019 12:19:27 -0800 Subject: [PATCH 17/83] Add job posting --- pages/emojis-functional-programming.tsx | 9 ++++++++- src/components/Warning.tsx | 17 +++++++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 3f6e3e938..19c18f109 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -239,6 +239,12 @@ export default () => familiar with JS, you should still be able to understand it.

+ + 👋 Available for Hire: My name is{' '} + Shu Uesugi, a full-stack engineer who’s looking for a{' '} + full-time position (remote or in SF/LA). Scroll to + the bottom of this post for details. + Identity function in JS

First, take a look at the following code. It’s an{' '} @@ -250,7 +256,8 @@ sushi => sushi`}

If you apply the above function on a string{' '} 'sandwich', then the result would be{' '} - 'sandwich'. + 'sandwich'. (You can run this on your + browser’s developer console.)

{`// The result would be 'sandwich' (sushi => sushi)('sandwich')`} diff --git a/src/components/Warning.tsx b/src/components/Warning.tsx index ea2b005d2..be7c108f0 100644 --- a/src/components/Warning.tsx +++ b/src/components/Warning.tsx @@ -4,19 +4,28 @@ import { ns, radii, colors, spaces } from 'src/lib/theme' export const warningSpacing = css` padding: ${spaces(0.75)} ${spaces(0.75)}; + margin-bottom: ${spaces(1)}; ${ns} { padding: ${spaces(1)} ${spaces(1.25)}; } ` -const Warning = ({ children }: { children: React.ReactNode }) => ( +const Warning = ({ + children, + backgroundColor +}: { + children: React.ReactNode + backgroundColor: 'yellow' | 'red' +}) => (
@@ -24,4 +33,8 @@ const Warning = ({ children }: { children: React.ReactNode }) => (
) +Warning.defaultProps = { + backgroundColor: 'yellow' +} + export default Warning From ebf0bb5dc1ff4bf6b3448b7405fe7e5c6d9c70d6 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sun, 3 Nov 2019 12:22:15 -0800 Subject: [PATCH 18/83] GitHub --- pages/emojis-functional-programming.tsx | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 19c18f109..645df2532 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -9,14 +9,20 @@ import Emoji from 'src/components/Emoji' import EpisodeHero from 'src/components/EpisodeHero' import EpisodePageFooter from 'src/components/EpisodePageFooter' import * as R from 'src/components/Runners' -import { P, Italic, Bold, InternalLink, H3 } from 'src/components/ContentTags' +import { + ExternalLink, + P, + Italic, + Bold, + InternalLink, + H3 +} from 'src/components/ContentTags' import locale from 'src/lib/locale' import { DateTime } from 'luxon' import { enBaseUrl } from 'src/lib/meta' import Warning, { warningSpacing } from 'src/components/Warning' import Highlight, { defaultProps } from 'prism-react-renderer' import theme from 'prism-react-renderer/themes/nightOwlLight' -// import 'victormono' const date = DateTime.fromISO('2019-11-06T12:00:00Z') // const dateString = date @@ -236,7 +242,11 @@ export default () => `} > I’ll use JavaScript in this article. Even if you’re not - familiar with JS, you should still be able to understand it. + familiar with JS, you should still be able to understand it. P.S.{' '} + + The source code for this article is available on GitHub + + —please ★ it!

From 689fbb2c6e318cd5ee607bf3996b3664b0280fcb Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sun, 3 Nov 2019 12:25:16 -0800 Subject: [PATCH 19/83] star --- pages/emojis-functional-programming.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 645df2532..ad0e15800 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -246,7 +246,7 @@ export default () => The source code for this article is available on GitHub - —please ★ it! + —please ★ star it!

From f8ac0e84c2225ca54320e58b0af494e0c1e9612f Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sun, 3 Nov 2019 15:20:56 -0800 Subject: [PATCH 20/83] Continue w/ the blog --- pages/emojis-functional-programming.tsx | 149 +++++++++++++++--------- src/components/Warning.tsx | 4 +- 2 files changed, 100 insertions(+), 53 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index ad0e15800..2e431ff8e 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -6,6 +6,7 @@ import { ns, radii, fontSizes, colors, spaces } from 'src/lib/theme' import { lessonTitle } from 'src/lib/titles' import Container from 'src/components/Container' import Emoji from 'src/components/Emoji' +import EmojiForLetter from 'src/components/EmojiForLetter' import EpisodeHero from 'src/components/EpisodeHero' import EpisodePageFooter from 'src/components/EpisodePageFooter' import * as R from 'src/components/Runners' @@ -23,6 +24,8 @@ import { enBaseUrl } from 'src/lib/meta' import Warning, { warningSpacing } from 'src/components/Warning' import Highlight, { defaultProps } from 'prism-react-renderer' import theme from 'prism-react-renderer/themes/nightOwlLight' +import BubbleQuoteContext from 'src/components/BubbleQuoteContext' +import EmojiWithText from 'src/components/EmojiWithText' const date = DateTime.fromISO('2019-11-06T12:00:00Z') // const dateString = date @@ -205,27 +208,29 @@ export default () => } `} /> -

- Last month, I published a free online course called “ - - Y Combinator for Non-programmers - - ”. In this course, I teach computer science concepts such as - functional programming, lambda calculus, Church encoding, and Y - combinator in a way such that{' '} - - people who have zero programming knowledge can understand - - . -

-

- To explain these concepts, I created{' '} - an educational puzzle using emojis 🍱. In - this article, I’ll explain how my emoji puzzles can represent and - execute functional code visually. If you like to - teach programming to beginners, or if you like functional programming - in general, I think you’ll enjoy this post. -

+ +

+ Last month, I published a free online course called “ + + Y Combinator for Non-programmers + + ”. In this course, I teach computer science concepts such as + functional programming, lambda calculus, Church encoding, and Y + combinator in a way such that{' '} + + people who have zero programming knowledge can understand + + . +

+

+ To explain these concepts, I created{' '} + an educational puzzle using emojis 🍱. + In this article, I’ll explain how my emoji puzzles can represent and + execute functional code visually. If you like to + teach programming to beginners, or if you like functional + programming in general, I think you’ll enjoy this post. +

+

⚠️ Note: This article is for programmers @@ -255,39 +260,79 @@ export default () => full-time position (remote or in SF/LA). Scroll to the bottom of this post for details. - Identity function in JS -

- First, take a look at the following code. It’s an{' '} - identity function in JavaScript that returns the - argument. -

- {`// Identity function in JS + + Identity function in JS +

+ First, take a look at the following code. It’s an{' '} + identity function in JavaScript that returns the + argument. +

+ {`// Identity function in JS sushi => sushi`} -

- If you apply the above function on a string{' '} - 'sandwich', then the result would be{' '} - 'sandwich'. (You can run this on your - browser’s developer console.) -

- {`// The result would be 'sandwich' -(sushi => sushi)('sandwich')`} -

- Now, here’s the interesting part: One day, I realized - that the above JS code can be{' '} - described visually using emojis. Check this out: -

- - An “emoji puzzle” that visually describes -
- the JS code from the above -
-

- - lineNumber === 1 && tokenNumber > 1 && tokenNumber < 6 - } - >{`// The result would be 'sandwich' +

+ If you apply the above function on a string{' '} + 'sandwich', then the result would be{' '} + 'sandwich'. (You can run this on your + browser’s developer console.) +

+ {`// The result would be 'sandwich' (sushi => sushi)('sandwich')`} +

+ Now, here’s the interesting part: One day, I realized + that the above JS code can be{' '} + described visually using emojis. Check this out: +

+ + An “emoji puzzle” that visually describes +
+ the JS code from the above +
+

+ The above emoji puzzle is equivalent to the earlier JS code. First, + the identity function sushi => sushi… +

+ + lineNumber === 0 && tokenNumber > 0 && tokenNumber < 5 + } + >{`(sushi => sushi)('sandwich')`} +

+ …is represented by the bottom two items on the + puzzle, which are both . +

+ + sushi => sushi is represented +
+ by the bottom two items +
+

+ Second, the argument 'sandwich' to the + identity function… +

+ + lineNumber === 0 && tokenNumber > 6 && tokenNumber < 8 + } + >{`(sushi => sushi)('sandwich')`} +

+ …is represented by the top item on the puzzle, + which is a . +

+ + The argument 'sandwich' is represented +
+ by the top item +
+ + Side Note: To keep things simple, the puzzle doesn’t + distinguish between variable names (e.g.{' '} + sushi) and strings (e.g.{' '} + 'sushi'). Both{' '} + sushi and 'sushi'{' '} + will be represented as . + + Running the function +
diff --git a/src/components/Warning.tsx b/src/components/Warning.tsx index be7c108f0..32c988efa 100644 --- a/src/components/Warning.tsx +++ b/src/components/Warning.tsx @@ -16,7 +16,7 @@ const Warning = ({ backgroundColor }: { children: React.ReactNode - backgroundColor: 'yellow' | 'red' + backgroundColor: 'yellow' | 'red' | 'brown' }) => (
Date: Sun, 3 Nov 2019 15:24:34 -0800 Subject: [PATCH 21/83] :pencil: --- pages/emojis-functional-programming.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 2e431ff8e..26a9d44a5 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -6,6 +6,7 @@ import { ns, radii, fontSizes, colors, spaces } from 'src/lib/theme' import { lessonTitle } from 'src/lib/titles' import Container from 'src/components/Container' import Emoji from 'src/components/Emoji' +import H from 'src/components/H' import EmojiForLetter from 'src/components/EmojiForLetter' import EpisodeHero from 'src/components/EpisodeHero' import EpisodePageFooter from 'src/components/EpisodePageFooter' @@ -323,6 +324,11 @@ sushi => sushi`}
by the top item +

+ That’s how my emoji puzzle can visually describe a simple JS + expression. Next, let’s talk about how we can{' '} + it. +

Side Note: To keep things simple, the puzzle doesn’t distinguish between variable names (e.g.{' '} From c0aa25f05d2e598a99ed02eb9cd1145ccf7e316c Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sun, 3 Nov 2019 15:25:12 -0800 Subject: [PATCH 22/83] Update emojis-functional-programming.tsx --- pages/emojis-functional-programming.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 26a9d44a5..01bf371dc 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -337,7 +337,9 @@ sushi => sushi`} sushi and 'sushi'{' '} will be represented as . - Running the function + + Running the function ▶️ + From c5c3004a06ef2cdf273b1f552ff6c4584eb455a6 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sun, 3 Nov 2019 17:37:05 -0800 Subject: [PATCH 23/83] deprecatedPressRun --- src/components/H.tsx | 4 ++-- src/contents/1.en.tsx | 8 ++++---- src/contents/1.jp.tsx | 6 +++--- src/contents/11.en.tsx | 6 +++--- src/contents/11.jp.tsx | 6 +++--- src/contents/2.en.tsx | 6 +++--- src/contents/2.jp.tsx | 6 +++--- src/contents/3.en.tsx | 8 ++++---- src/contents/3.jp.tsx | 8 ++++---- 9 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/components/H.tsx b/src/components/H.tsx index 1478009ed..8b32efb79 100644 --- a/src/components/H.tsx +++ b/src/components/H.tsx @@ -89,7 +89,7 @@ interface HProps { | { name: 'unmatch' } | { name: 'nextButtonNextPagePrimaryText' } | { name: 'nextButtonSecondaryText'; nextEpisodeNumber: number } - | { name: 'pressPlay'; capitalize?: true } + | { name: 'deprecatedPressRun'; capitalize?: true } | { name: 'indexPageLink' } | { name: 'titlePrefix' } | { name: 'titlePrefixColored'; addColon?: boolean } @@ -598,7 +598,7 @@ const H = ({ args, highlightType, episodeNumberOverrides }: HProps) => { return <>{episodePrefix(args.nextEpisodeNumber)}へ } } - if (args.name === 'pressPlay') { + if (args.name === 'deprecatedPressRun') { if (locale === 'en') { return ( diff --git a/src/contents/1.en.tsx b/src/contents/1.en.tsx index 08f8e62fc..008f68f09 100644 --- a/src/contents/1.en.tsx +++ b/src/contents/1.en.tsx @@ -127,7 +127,7 @@ export default () => ( button . If you press it, the mathbox calculates the result.{' '} - on the + on the mathbox below.

@@ -139,7 +139,7 @@ export default () => (

Let’s look at other mathboxes.{' '} - on this one: + on this one:

@@ -234,7 +234,7 @@ export default () => ( <>

Mathboxes can also subtract 1 from a number.{' '} - below: + below:

@@ -325,7 +325,7 @@ export default () => (

Here’s an example.{' '} - : + :

diff --git a/src/contents/1.jp.tsx b/src/contents/1.jp.tsx index 367f1b887..583f13c3c 100644 --- a/src/contents/1.jp.tsx +++ b/src/contents/1.jp.tsx @@ -139,7 +139,7 @@ export default () => ( がついており、それを押すと計算が実行されます。試しに、下の計算箱で - +

@@ -155,7 +155,7 @@ export default () => (

他の計算箱も見てみましょう!たとえばこちらをご覧になり、 - +

@@ -364,7 +364,7 @@ export default () => (

こちらに {' '} を2回使った計算箱を用意したので、実際に試してみましょう。 - +

diff --git a/src/contents/11.en.tsx b/src/contents/11.en.tsx index cb5a2639e..e1be2ad56 100644 --- a/src/contents/11.en.tsx +++ b/src/contents/11.en.tsx @@ -174,7 +174,7 @@ export default () => ( } />

- Take a look at this mathbox and + Take a look at this mathbox and :

@@ -512,7 +512,7 @@ export default () => ( mathbox and see what happens.

- . + .

) @@ -735,7 +735,7 @@ export default () => ( .

- : + :

) diff --git a/src/contents/11.jp.tsx b/src/contents/11.jp.tsx index 4a12772d9..86dcad557 100644 --- a/src/contents/11.jp.tsx +++ b/src/contents/11.jp.tsx @@ -157,7 +157,7 @@ export default () => ( />

まず、こちらの計算箱をご覧になり、 - +

@@ -483,7 +483,7 @@ export default () => ( にそれぞれどんな効果があるか説明する前に、この計算箱を実行してみましょう。

- +

) @@ -698,7 +698,7 @@ export default () => ( になります。

- +

) diff --git a/src/contents/2.en.tsx b/src/contents/2.en.tsx index 3597d2c0d..e80682c91 100644 --- a/src/contents/2.en.tsx +++ b/src/contents/2.en.tsx @@ -236,7 +236,7 @@ export default () => ( <>

- . : + . :

@@ -416,7 +416,7 @@ export default () => ( {' '} and the result is{' '} .{' '} - : + :

@@ -445,7 +445,7 @@ export default () => ( ’s . Take a look at this mathbox, and{' '} - : + :

diff --git a/src/contents/2.jp.tsx b/src/contents/2.jp.tsx index 6bb687764..c957f4f2a 100644 --- a/src/contents/2.jp.tsx +++ b/src/contents/2.jp.tsx @@ -184,7 +184,7 @@ export default () => ( <>

- +

@@ -407,7 +407,7 @@ export default () => ( ということは {' '} を計算してくれるので、結果は{' '} になります。 - +

@@ -436,7 +436,7 @@ export default () => ( を繰り返すこともできます。 こちらの計算箱をご覧になり、 - +

diff --git a/src/contents/3.en.tsx b/src/contents/3.en.tsx index 750610036..a970291d2 100644 --- a/src/contents/3.en.tsx +++ b/src/contents/3.en.tsx @@ -508,7 +508,7 @@ export default () => ( We can {' '} , just like how we can run a mathbox.{' '} - below: + below:

( This one has on the top row and a{' '} and on the bottom row.{' '} - : + :

@@ -652,7 +652,7 @@ export default () => ( This one has and{' '} on the top row and two slices of{' '} on the bottom row.{' '} - : + :

@@ -665,7 +665,7 @@ export default () => ( on the top row and{' '} and a on the bottom row.{' '} - : + :

diff --git a/src/contents/3.jp.tsx b/src/contents/3.jp.tsx index 090d333bd..a1157e757 100644 --- a/src/contents/3.jp.tsx +++ b/src/contents/3.jp.tsx @@ -431,7 +431,7 @@ export default () => ( 試しに、 - +

@@ -531,7 +531,7 @@ export default () => ( が入っています。 - +

@@ -562,7 +562,7 @@ export default () => ( が、下段には がふたつ入っています。 - +

@@ -578,7 +578,7 @@ export default () => ( が入っています。 - +

From a023d816ac7e0c054a2b06957b8a900be2a3eb7a Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sun, 3 Nov 2019 18:52:40 -0800 Subject: [PATCH 24/83] Allow running the code snippet --- pages/emojis-functional-programming.tsx | 229 ++++++++++++++++++------ src/contents/11.en.tsx | 20 ++- src/lib/theme/colors.ts | 4 +- 3 files changed, 190 insertions(+), 63 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 01bf371dc..e9f07d8dd 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -1,5 +1,6 @@ /** @jsx jsx */ import { css, jsx, Global } from '@emotion/core' +import { useState } from 'react' import Page from 'src/components/Page' import Head from 'next/head' import { ns, radii, fontSizes, colors, spaces } from 'src/lib/theme' @@ -10,6 +11,7 @@ import H from 'src/components/H' import EmojiForLetter from 'src/components/EmojiForLetter' import EpisodeHero from 'src/components/EpisodeHero' import EpisodePageFooter from 'src/components/EpisodePageFooter' +import ButtonWithTouchActiveStates from 'src/components/ButtonWithTouchActiveStates' import * as R from 'src/components/Runners' import { ExternalLink, @@ -17,13 +19,14 @@ import { Italic, Bold, InternalLink, + Highlight, H3 } from 'src/components/ContentTags' import locale from 'src/lib/locale' import { DateTime } from 'luxon' import { enBaseUrl } from 'src/lib/meta' import Warning, { warningSpacing } from 'src/components/Warning' -import Highlight, { defaultProps } from 'prism-react-renderer' +import PrismHighlight, { defaultProps } from 'prism-react-renderer' import theme from 'prism-react-renderer/themes/nightOwlLight' import BubbleQuoteContext from 'src/components/BubbleQuoteContext' import EmojiWithText from 'src/components/EmojiWithText' @@ -63,12 +66,18 @@ const Subheading = (props: JSX.IntrinsicElements['h3']) => ( const codeFontFamily = `'Victor Mono', SFMono-Regular, Consolas, Liberation Mono, Menlo, Courier, monospace` -const InlineCode = ({ children }: { children: string }) => ( +const InlineCode = ({ + children, + highlighted +}: { + children: string + highlighted?: boolean +}) => ( ( const CodeBlock = ({ children, - shouldHighlight + shouldHighlight, + result }: { children: string shouldHighlight?: (lineNumber: number, tokenNumber: number) => boolean -}) => ( - - {({ tokens, getLineProps, getTokenProps }) => ( -

 {
+  const [resultVisible, setResultVisible] = useState(false)
+  const buttonOnClick = () => setResultVisible(true)
+  return (
+    <>
+      
-        
- {tokens.map((line, i) => ( -
- {line.map((token, key) => ( - + {({ tokens, getLineProps, getTokenProps }) => ( +
+            
+ {tokens.map((line, i) => ( +
+ {line.map((token, key) => ( + + ))} +
))}
- ))} -
-
- )} -
-) +

+ )} + + {result && ( + <> +
+ {resultVisible ? ( +
+ + Result:{' '} + + + {result} + +
+ ) : ( + + Run ▶️ + + )} +
+ + )} + + ) +} export default () => locale === 'en' ? ( @@ -273,8 +381,7 @@ sushi => sushi`}

If you apply the above function on a string{' '} 'sandwich', then the result would be{' '} - 'sandwich'. (You can run this on your - browser’s developer console.) + 'sandwich'.

{`// The result would be 'sandwich' (sushi => sushi)('sandwich')`} @@ -337,9 +444,17 @@ sushi => sushi`} sushi and 'sushi'{' '} will be represented as .
- - Running the function ▶️ - + Running the function +

+ I’ve added the button to the JS code + snippet so you can see the result.{' '} + + Try pressing : + +

+ {`(sushi => sushi)('sandwich')`} diff --git a/src/contents/11.en.tsx b/src/contents/11.en.tsx index e1be2ad56..920784baa 100644 --- a/src/contents/11.en.tsx +++ b/src/contents/11.en.tsx @@ -174,8 +174,8 @@ export default () => ( } />

- Take a look at this mathbox and - : + Take a look at this mathbox and{' '} + :

@@ -512,7 +512,13 @@ export default () => ( mathbox and see what happens.

- . + + .

) @@ -735,7 +741,13 @@ export default () => ( .

- : + + :

) diff --git a/src/lib/theme/colors.ts b/src/lib/theme/colors.ts index d38d9d783..08fc0240a 100644 --- a/src/lib/theme/colors.ts +++ b/src/lib/theme/colors.ts @@ -16,7 +16,6 @@ import Color from 'color' // https://material.io/design/color/the-color-system.html export const allColors = { - secretCode: '#3B88C3', grey100: grey[100], grey300: grey[300], grey600: grey[600], @@ -74,7 +73,8 @@ export const allColors = { cyan100: cyan[100], red100: red[100], orange100: orange[100], - codeBg: '#f5f6ff' + codeBg: '#f5f6ff', + codeOutput: '#e0e3ff' } const colors = (x: keyof typeof allColors) => allColors[x] From aa743ac04d17c8704a3d647880cba9c0608d9917 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sun, 3 Nov 2019 19:03:27 -0800 Subject: [PATCH 25/83] Tweak colors --- pages/emojis-functional-programming.tsx | 19 ++++++++++++++----- src/components/ContentTags/Inline.tsx | 2 +- src/lib/theme/colors.ts | 2 ++ 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index e9f07d8dd..1e5bda35e 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -77,7 +77,7 @@ const InlineCode = ({ css={css` font-weight: 600; font-family: ${codeFontFamily}; - background-color: ${highlighted ? colors('yellow400') : colors('codeBg')}; + background-color: ${highlighted ? colors('yellow200') : colors('codeBg')}; display: inline-block; font-size: 0.85em; padding: 0.075em 0.2em; @@ -149,8 +149,8 @@ const CodeBlock = ({ !!shouldHighlight && shouldHighlight(i, key) && css` - background: ${colors('yellow400')}; - border-bottom: 2px solid ${colors('deepOrange400')}; + background: ${colors('yellow200')}; + border-bottom: 2px solid ${colors('deepOrange200')}; ` ]} /> @@ -449,12 +449,21 @@ sushi => sushi`} I’ve added the button to the JS code snippet so you can see the result.{' '} - Try pressing : - + If you press , + {' '} + you’ll see that the result is 'sandwich'.

{`(sushi => sushi)('sandwich')`} +

+ Now, we can also run the equivalent emoji puzzle and get the same + result.{' '} + + Try pressing the button below the + puzzle. + +

diff --git a/src/components/ContentTags/Inline.tsx b/src/components/ContentTags/Inline.tsx index ccf05e86a..d3149ac3d 100644 --- a/src/components/ContentTags/Inline.tsx +++ b/src/components/ContentTags/Inline.tsx @@ -29,7 +29,7 @@ const mix = (color: CardProps['color'], base: string) => Color(base) .mix( Color(backgroundColor(color)), - color === 'grey' || color === 'white' ? 0.45 : 0.55 + color === 'white' ? 0.4 : color === 'grey' ? 0.45 : 0.55 ) .hsl() .string() diff --git a/src/lib/theme/colors.ts b/src/lib/theme/colors.ts index 08fc0240a..bcf7bc051 100644 --- a/src/lib/theme/colors.ts +++ b/src/lib/theme/colors.ts @@ -64,9 +64,11 @@ export const allColors = { blue400: blue[400], blue600: blue[600], yellow100: yellow[100], + yellow200: yellow[200], yellow400: yellow[400], yellow900: yellow[900], deepOrange50: deepOrange[50], + deepOrange200: deepOrange[200], deepOrange400: deepOrange[400], deepOrange600: deepOrange[600], deepOrange800: deepOrange[800], From 5d023ec53e1bf67d4b206c6ee3608c808dfeab28 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sun, 3 Nov 2019 19:08:58 -0800 Subject: [PATCH 26/83] Update emojis-functional-programming.tsx --- pages/emojis-functional-programming.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 1e5bda35e..08e27805e 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -363,7 +363,7 @@ export default () => —please ★ star it!

- + 👋 Available for Hire: My name is{' '} Shu Uesugi, a full-stack engineer who’s looking for a{' '} full-time position (remote or in SF/LA). Scroll to @@ -442,7 +442,8 @@ sushi => sushi`} sushi) and strings (e.g.{' '} 'sushi'). Both{' '} sushi and 'sushi'{' '} - will be represented as . + will be represented as , + and this won’t cause an issue for our purporses. Running the function

From 24fa4f58cf23b3b0014a5fc6ad401215adf52321 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sun, 3 Nov 2019 19:14:55 -0800 Subject: [PATCH 27/83] Update emojis-functional-programming.tsx --- pages/emojis-functional-programming.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 08e27805e..a2bfdc920 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -440,10 +440,10 @@ sushi => sushi`} Side Note: To keep things simple, the puzzle doesn’t distinguish between variable names (e.g.{' '} sushi) and strings (e.g.{' '} - 'sushi'). Both{' '} + 'sushi'). Therefore, both{' '} sushi and 'sushi'{' '} - will be represented as , - and this won’t cause an issue for our purporses. + will be represented as . + This won’t cause an issue for our purporses. Running the function

From 4eb43ecf863af5964c20e21b6e33409e7b1cc4e4 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sun, 3 Nov 2019 19:17:16 -0800 Subject: [PATCH 28/83] :pencil: --- pages/emojis-functional-programming.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index a2bfdc920..cd2800385 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -443,7 +443,6 @@ sushi => sushi`} 'sushi'). Therefore, both{' '} sushi and 'sushi'{' '} will be represented as . - This won’t cause an issue for our purporses. Running the function

From 43fa54e9707f4535d5a8d7776ea2a540dcb7e703 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sun, 3 Nov 2019 19:20:25 -0800 Subject: [PATCH 29/83] =?UTF-8?q?post=20=E2=86=92=20article?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/emojis-functional-programming.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index cd2800385..6452a8aaa 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -337,7 +337,7 @@ export default () => In this article, I’ll explain how my emoji puzzles can represent and execute functional code visually. If you like to teach programming to beginners, or if you like functional - programming in general, I think you’ll enjoy this post. + programming in general, I think you’ll enjoy this article.

@@ -367,7 +367,7 @@ export default () => 👋 Available for Hire: My name is{' '} Shu Uesugi, a full-stack engineer who’s looking for a{' '} full-time position (remote or in SF/LA). Scroll to - the bottom of this post for details. + the bottom of this article for details. Identity function in JS From 110584313444a61af44edfb566ec56034e780db1 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sun, 3 Nov 2019 19:20:56 -0800 Subject: [PATCH 30/83] Update emojis-functional-programming.tsx --- pages/emojis-functional-programming.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 6452a8aaa..03c4cd103 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -437,7 +437,7 @@ sushi => sushi`} it.

- Side Note: To keep things simple, the puzzle doesn’t + Side Note: To keep things simple, this puzzle doesn’t distinguish between variable names (e.g.{' '} sushi) and strings (e.g.{' '} 'sushi'). Therefore, both{' '} From 66eb6e3f5586b9cd4dfc27716dd76b6288c33e2e Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sun, 3 Nov 2019 19:22:21 -0800 Subject: [PATCH 31/83] :pencil: --- pages/emojis-functional-programming.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 03c4cd103..c75305b61 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -323,7 +323,7 @@ export default () => Y Combinator for Non-programmers - ”. In this course, I teach computer science concepts such as + ”. In this 17-page course, I teach computer science concepts such as functional programming, lambda calculus, Church encoding, and Y combinator in a way such that{' '} From 7069981ac0456074c3ad8c9e73f8cc2e5fc49111 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Sun, 3 Nov 2019 21:38:29 -0800 Subject: [PATCH 32/83] pointToRunButton --- pages/emojis-functional-programming.tsx | 132 +++++++++++++----- .../ExpressionRunnerConfigContext.ts | 11 ++ .../ExpressionRunnerPrecomputed.tsx | 31 ++++ src/components/H.tsx | 8 ++ src/contents/3.en.tsx | 12 +- src/contents/3.jp.tsx | 7 +- src/lib/theme/colors.ts | 4 +- 7 files changed, 161 insertions(+), 44 deletions(-) create mode 100644 src/components/ExpressionRunnerConfigContext.ts diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index c75305b61..02b7e476a 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -30,6 +30,7 @@ import PrismHighlight, { defaultProps } from 'prism-react-renderer' import theme from 'prism-react-renderer/themes/nightOwlLight' import BubbleQuoteContext from 'src/components/BubbleQuoteContext' import EmojiWithText from 'src/components/EmojiWithText' +import ExpressionRunnerConfigContext from 'src/components/ExpressionRunnerConfigContext' const date = DateTime.fromISO('2019-11-06T12:00:00Z') // const dateString = date @@ -91,11 +92,13 @@ const InlineCode = ({ const CodeBlock = ({ children, shouldHighlight, - result + result, + showGuide }: { children: string shouldHighlight?: (lineNumber: number, tokenNumber: number) => boolean result?: string + showGuide?: boolean }) => { const [resultVisible, setResultVisible] = useState(false) const buttonOnClick = () => setResultVisible(true) @@ -177,8 +180,17 @@ const CodeBlock = ({ border-top-right-radius: 0; border-bottom-left-radius: ${radii(0.5)}; border-bottom-right-radius: ${radii(0.5)}; - background: ${colors('codeOutput')}; - line-height: 1.1rem; + background: #fff; + border-left: 0.25rem solid ${colors('codeBg')}; + border-bottom: 0.25rem solid ${colors('codeBg')}; + border-right: 0.25rem solid ${colors('codeBg')}; + padding-top: 0.425rem; + padding-bottom: 0.425rem; + + ${ns} { + padding-top: 0.65rem; + padding-bottom: 0.65rem; + } ` ]} > @@ -186,6 +198,7 @@ const CodeBlock = ({ css={css` color: ${colors('indigo400')}; font-size: ${fontSizes(0.85)}; + margin-left: -0.25rem; `} > Result:{' '} @@ -199,44 +212,75 @@ const CodeBlock = ({

) : ( - + - Run ▶️ - + &:active:enabled { + background: ${colors('indigo50')}; + } + ` + ]} + > + Run ▶️ + + {showGuide && ( + + ← + + )} + )}
@@ -455,6 +499,7 @@ sushi => sushi`}

{`(sushi => sushi)('sandwich')`}

Now, we can also run the equivalent emoji puzzle and get the same @@ -464,6 +509,17 @@ sushi => sushi`} puzzle.

+ + + +

+ Lorem ipsum dolor, sit amet consectetur adipisicing elit. Voluptatem + itaque error aperiam consequatur debitis tempore quisquam modi illum + tenetur aspernatur velit iure, ea molestiae nisi repudiandae + voluptatibus corporis quas sequi. +

diff --git a/src/components/ExpressionRunnerConfigContext.ts b/src/components/ExpressionRunnerConfigContext.ts new file mode 100644 index 000000000..a15582d53 --- /dev/null +++ b/src/components/ExpressionRunnerConfigContext.ts @@ -0,0 +1,11 @@ +import React from 'react' + +export interface ExpressionRunnerConfigContextProps { + pointToRunButton?: true +} + +export const ExpressionRunnerConfigContextDefault: ExpressionRunnerConfigContextProps = {} + +export default React.createContext( + ExpressionRunnerConfigContextDefault +) diff --git a/src/components/ExpressionRunnerPrecomputed.tsx b/src/components/ExpressionRunnerPrecomputed.tsx index b7612cab3..e2b74fa92 100644 --- a/src/components/ExpressionRunnerPrecomputed.tsx +++ b/src/components/ExpressionRunnerPrecomputed.tsx @@ -28,6 +28,7 @@ import { p, variableExpressionBoxFontSize } from 'src/components/VariableExpressionBox' +import ExpressionRunnerConfigContext from 'src/components/ExpressionRunnerConfigContext' export interface ExpressionRunnerPrecomputedProps { expressionContainers: readonly SteppedExpressionContainer[] @@ -191,6 +192,8 @@ const ExpressionRunnerPrecomputed = ({ variableSize = forceVariableSize } + const { pointToRunButton } = useContext(ExpressionRunnerConfigContext) + return ( + {pointToRunButton && isReady && !resetClicked && ( + <> +
+ ↑ +
+ + )} {!hideRunButton && canStepForward && !skipToTheEnd && diff --git a/src/components/H.tsx b/src/components/H.tsx index 8b32efb79..f892e1748 100644 --- a/src/components/H.tsx +++ b/src/components/H.tsx @@ -168,6 +168,7 @@ interface HProps { | { name: 'runAndShowAllSteps' } | { name: 'ignoreForNow' } | { name: 'aboutMe'; hideNextPageButton?: boolean } + | { name: 'pointToRunButton' } } const H = ({ args, highlightType, episodeNumberOverrides }: HProps) => { @@ -1779,6 +1780,13 @@ const H = ({ args, highlightType, episodeNumberOverrides }: HProps) => { ) } } + if (args.name === 'pointToRunButton') { + if (locale === 'en') { + return <>Press this button! + } else { + return <>押してみてください! + } + } if (args.name === 'aboutMe') { if (locale === 'en') { return ( diff --git a/src/contents/3.en.tsx b/src/contents/3.en.tsx index a970291d2..ba8d4da5b 100644 --- a/src/contents/3.en.tsx +++ b/src/contents/3.en.tsx @@ -22,6 +22,7 @@ import H from 'src/components/H' import BubbleQuotes from 'src/components/BubbleQuotes' import * as R from 'src/components/Runners' import NextLessonButton from 'src/components/NextLessonButton' +import ExpressionRunnerConfigContext from 'src/components/ExpressionRunnerConfigContext' export default () => ( ( We can {' '} , just like how we can run a mathbox.{' '} - below: -

- + {' '} + below: +

+ + + ( (

- + + + allColors[x] From fda6e8d50fb6b7cbf6874e0178b8d71303d03694 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Mon, 4 Nov 2019 07:23:41 -0800 Subject: [PATCH 33/83] Show the number of steps --- pages/emojis-functional-programming.tsx | 108 ++++++++++++++++++++---- 1 file changed, 91 insertions(+), 17 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 02b7e476a..91643d049 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -20,7 +20,10 @@ import { Bold, InternalLink, Highlight, - H3 + H3, + Ul, + Hr, + UlLi } from 'src/components/ContentTags' import locale from 'src/lib/locale' import { DateTime } from 'luxon' @@ -32,6 +35,10 @@ import BubbleQuoteContext from 'src/components/BubbleQuoteContext' import EmojiWithText from 'src/components/EmojiWithText' import ExpressionRunnerConfigContext from 'src/components/ExpressionRunnerConfigContext' +const numSteps = 100 +const wordCount = 10000 +const minRead = wordCount / 200 + const date = DateTime.fromISO('2019-11-06T12:00:00Z') // const dateString = date // .setLocale('en') @@ -55,13 +62,47 @@ const description = const url = `${enBaseUrl}/emojis-functional-programming` const ogImageUrl = `${enBaseUrl}/static/images/blog-og.png` -const Subheading = (props: JSX.IntrinsicElements['h3']) => ( -

+const Subheading = ({ + step, + noHrTop, + children, + ...props +}: JSX.IntrinsicElements['h3'] & { + noHrTop?: boolean + step: number | 'none' +}) => ( + <> + {!noHrTop && ( +
+ )} +

+ {children} + {step !== 'none' && ( + <> + {' '} + + (Step {step}/{numSteps}) + + + )} +

+ ) const codeFontFamily = `'Victor Mono', SFMono-Regular, Consolas, @@ -289,8 +330,9 @@ const CodeBlock = ({ ) } -export default () => - locale === 'en' ? ( +export default () => { + let step = 1 + return locale === 'en' ? ( the bottom of this article for details. - Identity function in JS + + Overview of this article + +
    + + First, I’ll show you how some simple JavaScript code + can be represented using my emoji puzzle. + + + After that, I’ll talk about how to use my emoji + puzzle to talk about lambda calculus, Church encoding, and Y + Combinator. + + + This article is long—it’s about{' '} + {wordCount.toLocaleString('en-US')} words ( + {minRead} min. read). so to indicate how far along + you are in the article, I’ll show a “step” number next to each + subheading. There are a total of {numSteps} steps in + this article. + +
+ Identity function in JS

First, take a look at the following code. It’s an{' '} identity function in JavaScript that returns the @@ -488,7 +552,7 @@ sushi => sushi`} sushi and 'sushi'{' '} will be represented as . - Running the function + Running the function

I’ve added the button to the JS code snippet so you can see the result.{' '} @@ -502,7 +566,7 @@ sushi => sushi`} showGuide >{`(sushi => sushi)('sandwich')`}

- Now, we can also run the equivalent emoji puzzle and get the same + Now, we can also “run” the equivalent emoji puzzle and get the same result.{' '} Try pressing the button below the @@ -515,10 +579,19 @@ sushi => sushi`}

- Lorem ipsum dolor, sit amet consectetur adipisicing elit. Voluptatem - itaque error aperiam consequatur debitis tempore quisquam modi illum - tenetur aspernatur velit iure, ea molestiae nisi repudiandae - voluptatibus corporis quas sequi. + The result is , which is the same as + what happens when you run the JS code ( + 'sandwich'). +

+

+ So, you can an emoji + puzzle just as you can run a piece of JS code. Basically, this is + how I taught functional programming to non-programmers in my course + ( + + Y Combinator for Non-programmers + + )—without showing any code.

@@ -527,3 +600,4 @@ sushi => sushi`} ) : ( <> ) +} From 0bdd3924c492d3bc0608b5de08ced7eb78ca0f5f Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Mon, 4 Nov 2019 07:25:04 -0800 Subject: [PATCH 34/83] Fix step number --- pages/emojis-functional-programming.tsx | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 91643d049..741cc30c1 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -97,7 +97,15 @@ const Subheading = ({ font-weight: normal; `} > - (Step {step}/{numSteps}) + (Step{' '} + + {step} + + /{numSteps}) )} @@ -472,7 +480,7 @@ export default () => { This article is long—it’s about{' '} {wordCount.toLocaleString('en-US')} words ( - {minRead} min. read). so to indicate how far along + {minRead} min. read). To help you track how far along you are in the article, I’ll show a “step” number next to each subheading. There are a total of {numSteps} steps in this article. From 8994b527e42c61d257b692028f04285c85a3df1f Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Mon, 4 Nov 2019 07:38:08 -0800 Subject: [PATCH 35/83] Increase spacing --- src/components/Warning.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Warning.tsx b/src/components/Warning.tsx index 32c988efa..feb6ab02d 100644 --- a/src/components/Warning.tsx +++ b/src/components/Warning.tsx @@ -4,7 +4,7 @@ import { ns, radii, colors, spaces } from 'src/lib/theme' export const warningSpacing = css` padding: ${spaces(0.75)} ${spaces(0.75)}; - margin-bottom: ${spaces(1)}; + margin-bottom: ${spaces(1.25)}; ${ns} { padding: ${spaces(1)} ${spaces(1.25)}; From 974220abc576c32f96d51e6c482004f7f2881a91 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Mon, 4 Nov 2019 10:18:15 -0800 Subject: [PATCH 36/83] Another example --- pages/emojis-functional-programming.tsx | 59 +++++++++--- scripts/lib/initialExpressionContainers.ts | 8 ++ scripts/lib/runnerConfigs.ts | 5 + src/components/{Warning.tsx => Alert.tsx} | 10 +- .../EpisodePageInitialRenderWarning.tsx | 6 +- src/components/Runners/Qcme.tsx | 12 +++ src/components/Runners/fakeIndex.ts | 1 + src/components/Runners/index.ts | 1 + src/lib/runners/qcme.json | 91 +++++++++++++++++++ 9 files changed, 171 insertions(+), 22 deletions(-) rename src/components/{Warning.tsx => Alert.tsx} (84%) create mode 100644 src/components/Runners/Qcme.tsx create mode 100644 src/lib/runners/qcme.json diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 741cc30c1..098b6b8c5 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -28,7 +28,7 @@ import { import locale from 'src/lib/locale' import { DateTime } from 'luxon' import { enBaseUrl } from 'src/lib/meta' -import Warning, { warningSpacing } from 'src/components/Warning' +import Alert, { alertSpacing } from 'src/components/Alert' import PrismHighlight, { defaultProps } from 'prism-react-renderer' import theme from 'prism-react-renderer/themes/nightOwlLight' import BubbleQuoteContext from 'src/components/BubbleQuoteContext' @@ -162,7 +162,7 @@ const CodeBlock = ({ {({ tokens, getLineProps, getTokenProps }) => (
 {
             programming in general, I think you’ll enjoy this article.
           

- +

⚠️ Note: This article is for programmers who are familiar with functional programming. If you’re a @@ -456,13 +456,13 @@ export default () => { —please ★ star it!

-
- + + 👋 Available for Hire: My name is{' '} Shu Uesugi, a full-stack engineer who’s looking for a{' '} full-time position (remote or in SF/LA). Scroll to the bottom of this article for details. - + Overview of this article @@ -474,7 +474,7 @@ export default () => { After that, I’ll talk about how to use my emoji - puzzle to talk about lambda calculus, Church encoding, and Y + puzzle to teach lambda calculus, Church encoding, and Y Combinator. @@ -552,14 +552,14 @@ sushi => sushi`} expression. Next, let’s talk about how we can{' '} it.

- + Side Note: To keep things simple, this puzzle doesn’t distinguish between variable names (e.g.{' '} sushi) and strings (e.g.{' '} 'sushi'). Therefore, both{' '} sushi and 'sushi'{' '} will be represented as . - + Running the function

I’ve added the button to the JS code @@ -588,8 +588,7 @@ sushi => sushi`}

The result is , which is the same as - what happens when you run the JS code ( - 'sandwich'). + what happens when you run the equivalent JS code.

So, you can an emoji @@ -601,6 +600,38 @@ sushi => sushi`} )—without showing any code.

+ Another example +

+ Let’s take a look at another example. Here’s a piece of JS code + that’s slightly different from before. It’s a function that{' '} + ignores the input and always returns{' '} + 'pizza'. +

+ {`// A function that ignores the input +// and always returns 'pizza' +sushi => 'pizza'`} +

+ Let’s run the above code with 'sandwich' as + the argument. +

+ {`(sushi => 'pizza')('sandwich')`} +

+ As expected, the result is 'pizza'. Now, + this code can be represented using my emoji puzzle as follows.{' '} + +

+ + + +

+ Just like the JS code, the emoji puzzle ended up with a{' '} + after running it. +

diff --git a/scripts/lib/initialExpressionContainers.ts b/scripts/lib/initialExpressionContainers.ts index 1f3a2f328..6adf5bd75 100644 --- a/scripts/lib/initialExpressionContainers.ts +++ b/scripts/lib/initialExpressionContainers.ts @@ -25,6 +25,14 @@ export const nyhe = initializeExpressionContainer([ 'b' ]) +export const sckn = initializeExpressionContainer([ + { + arg: 'a', + body: 'f' + }, + 'b' +]) + export const txbv = initializeExpressionContainer([ { arg: 'c', diff --git a/scripts/lib/runnerConfigs.ts b/scripts/lib/runnerConfigs.ts index 849195f95..5b6f17b13 100644 --- a/scripts/lib/runnerConfigs.ts +++ b/scripts/lib/runnerConfigs.ts @@ -1611,6 +1611,11 @@ export const xqjd: ExpressionRunnerShorthandConfig = { showPriorities: true } +export const qcme: ExpressionRunnerShorthandConfig = { + runner: 'runButtonOnly', + initialExpressionContainer: initialExpressionContainers.sckn +} + export const cldb: ExpressionRunnerShorthandConfig = { runner: 'simple', initialExpressionContainer: initialExpressionContainers.smxz, diff --git a/src/components/Warning.tsx b/src/components/Alert.tsx similarity index 84% rename from src/components/Warning.tsx rename to src/components/Alert.tsx index feb6ab02d..24db2ae9c 100644 --- a/src/components/Warning.tsx +++ b/src/components/Alert.tsx @@ -2,7 +2,7 @@ import { css, jsx } from '@emotion/core' import { ns, radii, colors, spaces } from 'src/lib/theme' -export const warningSpacing = css` +export const alertSpacing = css` padding: ${spaces(0.75)} ${spaces(0.75)}; margin-bottom: ${spaces(1.25)}; @@ -11,7 +11,7 @@ export const warningSpacing = css` } ` -const Warning = ({ +const Alert = ({ children, backgroundColor }: { @@ -20,7 +20,7 @@ const Warning = ({ }) => (
) -Warning.defaultProps = { +Alert.defaultProps = { backgroundColor: 'yellow' } -export default Warning +export default Alert diff --git a/src/components/EpisodePageInitialRenderWarning.tsx b/src/components/EpisodePageInitialRenderWarning.tsx index 5af11e6c5..d26d38e66 100644 --- a/src/components/EpisodePageInitialRenderWarning.tsx +++ b/src/components/EpisodePageInitialRenderWarning.tsx @@ -2,15 +2,15 @@ import React, { useContext } from 'react' import EpisodeContext from 'src/components/EpisodeContext' import GlobalContext from 'src/components/GlobalContext' import H from 'src/components/H' -import Warning from 'src/components/Warning' +import Alert from 'src/components/Alert' const EpisodePageInitialRenderWarning = () => { const { episodeNumber } = useContext(EpisodeContext) const { initialRender } = useContext(GlobalContext) return !!episodeNumber && initialRender ? ( - + - + ) : null } diff --git a/src/components/Runners/Qcme.tsx b/src/components/Runners/Qcme.tsx new file mode 100644 index 000000000..a1c3fc122 --- /dev/null +++ b/src/components/Runners/Qcme.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/qcme.json' + +const Qcme = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Qcme diff --git a/src/components/Runners/fakeIndex.ts b/src/components/Runners/fakeIndex.ts index 35aa58b3c..1fe6ff29e 100644 --- a/src/components/Runners/fakeIndex.ts +++ b/src/components/Runners/fakeIndex.ts @@ -230,6 +230,7 @@ export { default as Niwv } from 'src/components/FakeRunner' export { default as Fsgq } from 'src/components/FakeRunner' export { default as Gvxz } from 'src/components/FakeRunner' export { default as Xqjd } from 'src/components/FakeRunner' +export { default as Qcme } from 'src/components/FakeRunner' export { default as Cldb } from 'src/components/FakeRunner' export { default as Sldg } from 'src/components/FakeRunner' export { default as Dtle } from 'src/components/FakeRunner' diff --git a/src/components/Runners/index.ts b/src/components/Runners/index.ts index 68eff993f..b713cd74c 100644 --- a/src/components/Runners/index.ts +++ b/src/components/Runners/index.ts @@ -230,6 +230,7 @@ export { default as Niwv } from 'src/components/Runners/Niwv' export { default as Fsgq } from 'src/components/Runners/Fsgq' export { default as Gvxz } from 'src/components/Runners/Gvxz' export { default as Xqjd } from 'src/components/Runners/Xqjd' +export { default as Qcme } from 'src/components/Runners/Qcme' export { default as Cldb } from 'src/components/Runners/Cldb' export { default as Sldg } from 'src/components/Runners/Sldg' export { default as Dtle } from 'src/components/Runners/Dtle' diff --git a/src/lib/runners/qcme.json b/src/lib/runners/qcme.json new file mode 100644 index 000000000..0bf2ed8da --- /dev/null +++ b/src/lib/runners/qcme.json @@ -0,0 +1,91 @@ +{ + "expressionContainers": [ + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "numLeafNodes": 2, + "containerState": "ready", + "previouslyChangedExpressionState": "default" + }, + { + "expression": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "previouslyChangedExpressionState": "default", + "activePriority": 1, + "containerState": "done", + "numLeafNodes": 1 + } + ], + "speed": 1, + "hideControls": false, + "explanationsVisibility": "hiddenInitialPausedOnly", + "hidePriorities": true, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": true, + "hideFuncUnboundBadgeOnExplanation": true, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "showBottomProgressBar": false +} From 4786d6ff66a623032a489dbefee4df4ef2abcb84 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Mon, 4 Nov 2019 14:48:58 -0800 Subject: [PATCH 37/83] Continue with step 4 --- pages/emojis-functional-programming.tsx | 164 +++++++++++++----- scripts/lib/runnerConfigs.ts | 17 ++ src/components/Alert.tsx | 9 +- .../ExpressionRunnerCaptionOnly.tsx | 14 +- .../ExpressionRunnerCaptionWrapper.tsx | 14 +- src/components/ExpressionRunnerControls.tsx | 9 +- .../ExpressionRunnerPrecomputed.tsx | 56 +++--- src/components/Runners/Bjny.tsx | 12 ++ src/components/Runners/Lngo.tsx | 12 ++ src/components/Runners/Ukzq.tsx | 12 ++ src/components/Runners/fakeIndex.ts | 3 + src/components/Runners/index.ts | 3 + src/contents/4.en.tsx | 3 +- src/lib/runners/bjny.json | 73 ++++++++ src/lib/runners/lngo.json | 36 ++++ src/lib/runners/ukzq.json | 36 ++++ 16 files changed, 384 insertions(+), 89 deletions(-) create mode 100644 src/components/Runners/Bjny.tsx create mode 100644 src/components/Runners/Lngo.tsx create mode 100644 src/components/Runners/Ukzq.tsx create mode 100644 src/lib/runners/bjny.json create mode 100644 src/lib/runners/lngo.json create mode 100644 src/lib/runners/ukzq.json diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 098b6b8c5..5e53e9af1 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -6,6 +6,8 @@ import Head from 'next/head' import { ns, radii, fontSizes, colors, spaces } from 'src/lib/theme' import { lessonTitle } from 'src/lib/titles' import Container from 'src/components/Container' +import ExpressionRunnerSeparator from 'src/components/ExpressionRunnerSeparator' +import ExpressionRunnerCaptionWrapper from 'src/components/ExpressionRunnerCaptionWrapper' import Emoji from 'src/components/Emoji' import H from 'src/components/H' import EmojiForLetter from 'src/components/EmojiForLetter' @@ -28,7 +30,7 @@ import { import locale from 'src/lib/locale' import { DateTime } from 'luxon' import { enBaseUrl } from 'src/lib/meta' -import Alert, { alertSpacing } from 'src/components/Alert' +import BaseAlert, { alertSpacing, AlertProps } from 'src/components/Alert' import PrismHighlight, { defaultProps } from 'prism-react-renderer' import theme from 'prism-react-renderer/themes/nightOwlLight' import BubbleQuoteContext from 'src/components/BubbleQuoteContext' @@ -62,6 +64,14 @@ const description = const url = `${enBaseUrl}/emojis-functional-programming` const ogImageUrl = `${enBaseUrl}/static/images/blog-og.png` +const Alert = (props: AlertProps) => ( + + + +) + +Alert.defaultProps = BaseAlert.defaultProps + const Subheading = ({ step, noHrTop, @@ -142,17 +152,30 @@ const CodeBlock = ({ children, shouldHighlight, result, - showGuide + showGuide, + defaultResultVisible, + caption }: { children: string shouldHighlight?: (lineNumber: number, tokenNumber: number) => boolean result?: string showGuide?: boolean + defaultResultVisible: boolean + caption?: React.ReactNode }) => { - const [resultVisible, setResultVisible] = useState(false) + const [resultVisible, setResultVisible] = useState(defaultResultVisible) const buttonOnClick = () => setResultVisible(true) return ( <> + {caption && ( + + JS code: + + )} { let step = 1 return locale === 'en' ? ( @@ -433,37 +461,36 @@ export default () => { teach programming to beginners, or if you like functional programming in general, I think you’ll enjoy this article.

- - -

- ⚠️ Note: This article is for programmers - who are familiar with functional programming. If you’re a - non-programmer, check out “ - - Y Combinator for Non-programmers - - ” instead. -

-

- I’ll use JavaScript in this article. Even if you’re not - familiar with JS, you should still be able to understand it. P.S.{' '} - - The source code for this article is available on GitHub - - —please ★ star it! -

-
- - 👋 Available for Hire: My name is{' '} - Shu Uesugi, a full-stack engineer who’s looking for a{' '} - full-time position (remote or in SF/LA). Scroll to - the bottom of this article for details. - - + +

+ ⚠️ Note: This article is for + programmers who are familiar with functional programming. If + you’re a non-programmer, check out “ + + Y Combinator for Non-programmers + + ” instead. +

+

+ I’ll use JavaScript in this article. Even if you’re + not familiar with JS, you should still be able to understand it. + P.S.{' '} + + The source code for this article is available on GitHub + + —please ★ star it! +

+
+ + 👋 Available for Hire: My name is{' '} + Shu Uesugi, a full-stack engineer who’s looking for a{' '} + full-time position (remote or in SF/LA). Scroll to + the bottom of this article for details. + Overview of this article @@ -616,21 +643,80 @@ sushi => 'pizza'`}

{`(sushi => 'pizza')('sandwich')`}

As expected, the result is 'pizza'. Now, this code can be represented using my emoji puzzle as follows.{' '}

+ +

+ Just like the JS code, the emoji puzzle ended up with a{' '} + after running it. +

+ +

+ What we learned so far: Simple JS code like below can + be visually represented using emoji puzzles. +

+ JS Code} + >{`(sushi => sushi)('sandwich')`} + Equivalent emoji puzzle: + + +
+ JS Code} + >{`(sushi => 'pizza')('sandwich')`} + Equivalent emoji puzzle: + + +
+ Visualizing evaluation rules +

+ Because you know how to code, you have a mental model of how + function evaluation works. If you see{' '} + (sushi => sushi)('sandwich'), you can + quickly figure out that the result would be{' '} + 'sandwich'. If you see{' '} + (sushi => 'pizza')('sandwich'), you know + that the result would be 'pizza'. You know + what free variables and bound variables mean. +

+

+ On the other hand, non-programmers don’t have a mental model of how + function evaluation works. To help them develop a mental model + without using any code, I created a{' '} + step-by-step visualization of function evaluation + rules using the emoji puzzle I mentioned earlier. +

+

+ On the puzzle below,{' '} + + try pressing the button + + . This button is a bit different from the last time— + + it shows all the steps that happen in between the beginning and + the end + + . +

- + +

Here are the four steps it displayed:

- Just like the JS code, the emoji puzzle ended up with a{' '} - after running it. + Step 1:{' '}

diff --git a/scripts/lib/runnerConfigs.ts b/scripts/lib/runnerConfigs.ts index 5b6f17b13..fb05d36fa 100644 --- a/scripts/lib/runnerConfigs.ts +++ b/scripts/lib/runnerConfigs.ts @@ -426,6 +426,12 @@ export const ilpo: ExpressionRunnerShorthandConfig = { initialExpressionContainer: initialExpressionContainers.nyhe } +export const lngo: ExpressionRunnerShorthandConfig = { + runner: 'simple', + isDone: true, + initialExpressionContainer: initialExpressionContainers.nyhe +} + export const elku: ExpressionRunnerShorthandConfig = { runner: 'simple', initialExpressionContainer: initialExpressionContainers.nyhe, @@ -1616,6 +1622,17 @@ export const qcme: ExpressionRunnerShorthandConfig = { initialExpressionContainer: initialExpressionContainers.sckn } +export const bjny: ExpressionRunnerShorthandConfig = { + runner: 'simple', + initialExpressionContainer: initialExpressionContainers.sckn +} + +export const ukzq: ExpressionRunnerShorthandConfig = { + runner: 'simple', + isDone: true, + initialExpressionContainer: initialExpressionContainers.sckn +} + export const cldb: ExpressionRunnerShorthandConfig = { runner: 'simple', initialExpressionContainer: initialExpressionContainers.smxz, diff --git a/src/components/Alert.tsx b/src/components/Alert.tsx index 24db2ae9c..09407d322 100644 --- a/src/components/Alert.tsx +++ b/src/components/Alert.tsx @@ -11,13 +11,12 @@ export const alertSpacing = css` } ` -const Alert = ({ - children, - backgroundColor -}: { +export interface AlertProps { children: React.ReactNode backgroundColor: 'yellow' | 'red' | 'brown' -}) => ( +} + +const Alert = ({ children, backgroundColor }: AlertProps) => (
(
) diff --git a/src/components/ExpressionRunnerCaptionWrapper.tsx b/src/components/ExpressionRunnerCaptionWrapper.tsx index 0272dfdcc..d5b2753d2 100644 --- a/src/components/ExpressionRunnerCaptionWrapper.tsx +++ b/src/components/ExpressionRunnerCaptionWrapper.tsx @@ -6,14 +6,12 @@ const ExpressionRunnerCaptionWrapper = ( props: JSX.IntrinsicElements['div'] ) => (
) diff --git a/src/components/ExpressionRunnerControls.tsx b/src/components/ExpressionRunnerControls.tsx index 1ada5b779..b120a759b 100644 --- a/src/components/ExpressionRunnerControls.tsx +++ b/src/components/ExpressionRunnerControls.tsx @@ -13,6 +13,7 @@ interface ExpressionRunnerControlsProps { isRunning: boolean showRunButton: boolean skipToTheEnd: boolean + hideForwardButton: boolean onNextClick: () => void onPreviousClick: () => void onAutoClick: () => void @@ -61,7 +62,8 @@ const ExpressionRunnerControls = ({ onPauseClick, onSkipToTheEndClick, skipToTheEnd, - convert + convert, + hideForwardButton }: ExpressionRunnerControlsProps) => { const centerButtonWidth = convert ? 66 : 48 const sideButtonsWidth = (100 - centerButtonWidth) / 2 - 2 @@ -152,7 +154,10 @@ const ExpressionRunnerControls = ({ )} {showRunButton ? ( <> - {!isRunning && canStepForward && !skipToTheEnd ? ( + {!isRunning && + canStepForward && + !skipToTheEnd && + !hideForwardButton ? ( )} @@ -350,34 +351,37 @@ const ExpressionRunnerPrecomputed = ({ size={containerSize === 'xxs' ? 'xs' : 'sm'} horizontalPadding={0} > - {pointToRunButton && isReady && !resetClicked && ( - <> -
+
- ↑ -
- - )} + `} + > + ↑ +
+ + )} {!hideRunButton && canStepForward && !skipToTheEnd && diff --git a/src/components/Runners/Bjny.tsx b/src/components/Runners/Bjny.tsx new file mode 100644 index 000000000..2dae1ddab --- /dev/null +++ b/src/components/Runners/Bjny.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/bjny.json' + +const Bjny = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Bjny diff --git a/src/components/Runners/Lngo.tsx b/src/components/Runners/Lngo.tsx new file mode 100644 index 000000000..b1ba43c1a --- /dev/null +++ b/src/components/Runners/Lngo.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/lngo.json' + +const Lngo = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Lngo diff --git a/src/components/Runners/Ukzq.tsx b/src/components/Runners/Ukzq.tsx new file mode 100644 index 000000000..5cf0e97a5 --- /dev/null +++ b/src/components/Runners/Ukzq.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/ukzq.json' + +const Ukzq = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Ukzq diff --git a/src/components/Runners/fakeIndex.ts b/src/components/Runners/fakeIndex.ts index 1fe6ff29e..388b5e001 100644 --- a/src/components/Runners/fakeIndex.ts +++ b/src/components/Runners/fakeIndex.ts @@ -57,6 +57,7 @@ export { default as Hdxc } from 'src/components/FakeRunner' export { default as Hykj } from 'src/components/FakeRunner' export { default as Iatt } from 'src/components/FakeRunner' export { default as Ilpo } from 'src/components/FakeRunner' +export { default as Lngo } from 'src/components/FakeRunner' export { default as Elku } from 'src/components/FakeRunner' export { default as Vowa } from 'src/components/FakeRunner' export { default as Imyd } from 'src/components/FakeRunner' @@ -231,6 +232,8 @@ export { default as Fsgq } from 'src/components/FakeRunner' export { default as Gvxz } from 'src/components/FakeRunner' export { default as Xqjd } from 'src/components/FakeRunner' export { default as Qcme } from 'src/components/FakeRunner' +export { default as Bjny } from 'src/components/FakeRunner' +export { default as Ukzq } from 'src/components/FakeRunner' export { default as Cldb } from 'src/components/FakeRunner' export { default as Sldg } from 'src/components/FakeRunner' export { default as Dtle } from 'src/components/FakeRunner' diff --git a/src/components/Runners/index.ts b/src/components/Runners/index.ts index b713cd74c..efe32fcad 100644 --- a/src/components/Runners/index.ts +++ b/src/components/Runners/index.ts @@ -57,6 +57,7 @@ export { default as Hdxc } from 'src/components/Runners/Hdxc' export { default as Hykj } from 'src/components/Runners/Hykj' export { default as Iatt } from 'src/components/Runners/Iatt' export { default as Ilpo } from 'src/components/Runners/Ilpo' +export { default as Lngo } from 'src/components/Runners/Lngo' export { default as Elku } from 'src/components/Runners/Elku' export { default as Vowa } from 'src/components/Runners/Vowa' export { default as Imyd } from 'src/components/Runners/Imyd' @@ -231,6 +232,8 @@ export { default as Fsgq } from 'src/components/Runners/Fsgq' export { default as Gvxz } from 'src/components/Runners/Gvxz' export { default as Xqjd } from 'src/components/Runners/Xqjd' export { default as Qcme } from 'src/components/Runners/Qcme' +export { default as Bjny } from 'src/components/Runners/Bjny' +export { default as Ukzq } from 'src/components/Runners/Ukzq' export { default as Cldb } from 'src/components/Runners/Cldb' export { default as Sldg } from 'src/components/Runners/Sldg' export { default as Dtle } from 'src/components/Runners/Dtle' diff --git a/src/contents/4.en.tsx b/src/contents/4.en.tsx index 7e8357145..ab3b52916 100644 --- a/src/contents/4.en.tsx +++ b/src/contents/4.en.tsx @@ -963,7 +963,8 @@ export default () => ( We’ll be using the button with the{' '} “Show every step” functionality - , which automatically goes through each step. + , which automatically shows every step that happens between the + beginning and the end.

If you use this button… diff --git a/src/lib/runners/bjny.json b/src/lib/runners/bjny.json new file mode 100644 index 000000000..cc0d5b242 --- /dev/null +++ b/src/lib/runners/bjny.json @@ -0,0 +1,73 @@ +{ + "expressionContainers": [ + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "numLeafNodes": 2, + "containerState": "ready", + "previouslyChangedExpressionState": "default" + } + ], + "speed": 1, + "hideControls": true, + "explanationsVisibility": "hidden", + "hidePriorities": true, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": false, + "hideFuncUnboundBadgeOnExplanation": false, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "showBottomProgressBar": false +} diff --git a/src/lib/runners/lngo.json b/src/lib/runners/lngo.json new file mode 100644 index 000000000..6868e95ea --- /dev/null +++ b/src/lib/runners/lngo.json @@ -0,0 +1,36 @@ +{ + "expressionContainers": [ + { + "expression": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "previouslyChangedExpressionState": "default", + "activePriority": 1, + "containerState": "done", + "numLeafNodes": 1 + } + ], + "speed": 1, + "hideControls": true, + "explanationsVisibility": "hidden", + "hidePriorities": true, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": false, + "hideFuncUnboundBadgeOnExplanation": false, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "showBottomProgressBar": false +} diff --git a/src/lib/runners/ukzq.json b/src/lib/runners/ukzq.json new file mode 100644 index 000000000..abc3154f6 --- /dev/null +++ b/src/lib/runners/ukzq.json @@ -0,0 +1,36 @@ +{ + "expressionContainers": [ + { + "expression": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "previouslyChangedExpressionState": "default", + "activePriority": 1, + "containerState": "done", + "numLeafNodes": 1 + } + ], + "speed": 1, + "hideControls": true, + "explanationsVisibility": "hidden", + "hidePriorities": true, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": false, + "hideFuncUnboundBadgeOnExplanation": false, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "showBottomProgressBar": false +} From f606b3f0f87804901e1943396d4e7a023f6a9177 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Mon, 4 Nov 2019 22:29:29 -0800 Subject: [PATCH 38/83] Finish step 4 --- pages/emojis-functional-programming.tsx | 91 +++++++++++++++++++- src/contents/4.en.tsx | 109 +++++++++++++----------- 2 files changed, 147 insertions(+), 53 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 5e53e9af1..7d26cccc9 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -8,6 +8,7 @@ import { lessonTitle } from 'src/lib/titles' import Container from 'src/components/Container' import ExpressionRunnerSeparator from 'src/components/ExpressionRunnerSeparator' import ExpressionRunnerCaptionWrapper from 'src/components/ExpressionRunnerCaptionWrapper' +import BottomRightBadge from 'src/components/BottomRightBadge' import Emoji from 'src/components/Emoji' import H from 'src/components/H' import EmojiForLetter from 'src/components/EmojiForLetter' @@ -36,6 +37,15 @@ import theme from 'prism-react-renderer/themes/nightOwlLight' import BubbleQuoteContext from 'src/components/BubbleQuoteContext' import EmojiWithText from 'src/components/EmojiWithText' import ExpressionRunnerConfigContext from 'src/components/ExpressionRunnerConfigContext' +import { + StepOne, + StepTwo, + InstructionTwo, + StepThree, + InstructionThree, + InstructionFour, + StepFour +} from 'src/contents/4.en' const numSteps = 100 const wordCount = 10000 @@ -691,12 +701,20 @@ sushi => 'pizza'`} what free variables and bound variables mean.

- On the other hand, non-programmers don’t have a mental model of how - function evaluation works. To help them develop a mental model - without using any code, I created a{' '} + On the other hand, non-programmers may not have a mental model of + how function evaluation works. To help them develop a mental model + without showing them any code, I created a{' '} step-by-step visualization of function evaluation rules using the emoji puzzle I mentioned earlier.

+

Let’s reuse the earlier example again:

+ JS Code} + >{`(sushi => sushi)('sandwich')`} + Equivalent emoji puzzle:

On the puzzle below,{' '} @@ -717,7 +735,74 @@ sushi => 'pizza'`}

Here are the four steps it displayed:

Step 1:{' '} + + + +

+

+ First, we label each emoji.{' '} + + The top item is labeled as{' '} + (for “ + Top”), the left item is labeled as{' '} + (for “ + Left”), and the right item is labeled as{' '} + (for + “Right”). + +

+ + + +

+ Step 2:{' '} + + + +

+

+ Second, +

+ + + +

+ Step 3:{' '} + + + +

+

+ Third, This step, combined with the + previous step, describes how the variable{' '} + sushi is bound to{' '} + 'sandwich'. +

+ + + +

+ Step 4:{' '} + + + +

+

+ Finally, +

+ + + + + +

+ The above steps visually represent how functions are evaluated—they + are equivalent to how JavaScript evaluates{' '} + (sushi => sushi)('sandwich'). By following + these rules, non-programmers can intuitively learn to evaluate + functions without learning about how variable bindings work.

+ If there’s no match diff --git a/src/contents/4.en.tsx b/src/contents/4.en.tsx index ab3b52916..4eea215f4 100644 --- a/src/contents/4.en.tsx +++ b/src/contents/4.en.tsx @@ -24,6 +24,51 @@ import ExpressionRunnerSeparator from 'src/components/ExpressionRunnerSeparator' import H from 'src/components/H' import NextLessonButton from 'src/components/NextLessonButton' +export const StepOne = ({ + includeFuncUnbound +}: { + includeFuncUnbound?: boolean +}) => ( + <> + Label:{' '} + {' '} + {' '} + {includeFuncUnbound && ( + <> + {' '} + + )} + + +) + +export const StepTwo = () => ( + <> + Match:{' '} + {' '} + {' '} + + +) + +export const StepThree = () => ( + <> + Copy:{' '} + ↘️{' '} + + + + +) + +export const StepFour = () => ( + <> + Remove: 💥{' '} + {' '} + + +) + export const BasicRules = ({ includeFuncUnbound }: { @@ -31,64 +76,28 @@ export const BasicRules = ({ }) => ( <>

- 1. Label:{' '} - {' '} - {' '} - {includeFuncUnbound && ( - <> - {' '} - - )} - + 1.

- Label:{' '} - {' '} - {' '} - {includeFuncUnbound && ( - <> - {' '} - - )} - +

- 2. Match:{' '} - {' '} - {' '} - + 2.

- Match:{' '} - {' '} - {' '} - +

- 3. Copy:{' '} - {' '} - ↘️{' '} - - - + 3.

- Copy:{' '} - {' '} - ↘️{' '} - - - +

- 4. Remove: 💥{' '} - {' '} - + 4.

- Remove: 💥{' '} - {' '} - + @@ -125,10 +134,10 @@ export const Unmatched = () => ( ) -export const InstructionTwo = () => ( +export const InstructionTwo = ({ lowerCase }: { lowerCase?: boolean }) => ( <> - We check to see if some of{' '} + {lowerCase ? 'w' : 'W'}e check to see if some of{' '} ’s and ’s match.{' '} @@ -139,10 +148,10 @@ export const InstructionTwo = () => ( ) -export const InstructionThree = () => ( +export const InstructionThree = ({ lowerCase }: { lowerCase?: boolean }) => ( <> - We copy{' '} + {lowerCase ? 'w' : 'W'}e copy{' '} ’s to where the matched{' '} @@ -151,10 +160,10 @@ export const InstructionThree = () => ( ) -export const InstructionFour = () => ( +export const InstructionFour = ({ lowerCase }: { lowerCase?: boolean }) => ( <> - We remove{' '} + {lowerCase ? 'w' : 'W'}e remove{' '} ’s and ’s. From 17ad28df93b66de1a752d9014177fa9067f38d09 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Mon, 4 Nov 2019 23:13:01 -0800 Subject: [PATCH 39/83] Continue with step 5 --- pages/emojis-functional-programming.tsx | 78 +++++- scripts/lib/runnerConfigs.ts | 24 ++ src/components/Runners/Gogn.tsx | 12 + src/components/Runners/Gthd.tsx | 12 + src/components/Runners/Nsds.tsx | 12 + src/components/Runners/Zvpc.tsx | 12 + src/components/Runners/fakeIndex.ts | 4 + src/components/Runners/index.ts | 4 + src/contents/6.en.tsx | 2 +- src/lib/runners/gogn.json | 74 ++++++ src/lib/runners/gthd.json | 316 ++++++++++++++++++++++++ src/lib/runners/nsds.json | 74 ++++++ src/lib/runners/zvpc.json | 75 ++++++ 13 files changed, 688 insertions(+), 11 deletions(-) create mode 100644 src/components/Runners/Gogn.tsx create mode 100644 src/components/Runners/Gthd.tsx create mode 100644 src/components/Runners/Nsds.tsx create mode 100644 src/components/Runners/Zvpc.tsx create mode 100644 src/lib/runners/gogn.json create mode 100644 src/lib/runners/gthd.json create mode 100644 src/lib/runners/nsds.json create mode 100644 src/lib/runners/zvpc.json diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 7d26cccc9..f3753b09d 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -734,7 +734,7 @@ sushi => 'pizza'`}

Here are the four steps it displayed:

- Step 1:{' '} + Step 1.{' '} @@ -755,40 +755,41 @@ sushi => 'pizza'`}

- Step 2:{' '} + Step 2.{' '}

- Second, + Second, In this case, both the + bottom-left and the bottom-right are , + so there’s a match.

- Step 3:{' '} + Step 3.{' '}

- Third, This step, combined with the - previous step, describes how the variable{' '} - sushi is bound to{' '} - 'sandwich'. + Third, In this case, we copy the{' '} + on the top to the bottom-right.

- Step 4:{' '} + Step 4.{' '}

- Finally, + Finally, We’re left with just the{' '} + at the end.

@@ -803,6 +804,63 @@ sushi => 'pizza'`} functions without learning about how variable bindings work.

If there’s no match +

Let’s take a look at the other example from earlier:

+ JS Code} + >{`(sushi => 'pizza')('sandwich')`} + Equivalent emoji puzzle: +

+ + Try pressing the button and see what + happens: + +

+ +

Here are the three steps it displayed:

+

+ Step 1.{' '} + + + —this is the same as before. + +

+ + + +

+ Step 2.{' '} + + This time, there’s no match between{' '} + and{' '} + . The + bottom-left is , but the bottom-right + is . + +

+ + No match:{' '} + {' '} + {' '} + + +

+ If there’s no match,{' '} + + we skip step 3 () and go directly to step 4. + +

+

+ Step 4.{' '} + + + +

+ + + diff --git a/scripts/lib/runnerConfigs.ts b/scripts/lib/runnerConfigs.ts index fb05d36fa..55b16c2f3 100644 --- a/scripts/lib/runnerConfigs.ts +++ b/scripts/lib/runnerConfigs.ts @@ -1622,6 +1622,30 @@ export const qcme: ExpressionRunnerShorthandConfig = { initialExpressionContainer: initialExpressionContainers.sckn } +export const gthd: ExpressionRunnerShorthandConfig = { + runner: 'runButtonOnly', + skipToTheEnd: false, + initialExpressionContainer: initialExpressionContainers.sckn +} + +export const gogn: ExpressionRunnerShorthandConfig = { + runner: 'simple', + initialExpressionContainer: initialExpressionContainers.sckn, + initialState: 'showFuncBound' +} + +export const zvpc: ExpressionRunnerShorthandConfig = { + runner: 'simple', + initialExpressionContainer: initialExpressionContainers.sckn, + initialState: 'betaReducePreviewBefore' +} + +export const nsds: ExpressionRunnerShorthandConfig = { + runner: 'simple', + initialExpressionContainer: initialExpressionContainers.sckn, + initialState: 'betaReducePreviewCrossed' +} + export const bjny: ExpressionRunnerShorthandConfig = { runner: 'simple', initialExpressionContainer: initialExpressionContainers.sckn diff --git a/src/components/Runners/Gogn.tsx b/src/components/Runners/Gogn.tsx new file mode 100644 index 000000000..b94493ff8 --- /dev/null +++ b/src/components/Runners/Gogn.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/gogn.json' + +const Gogn = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Gogn diff --git a/src/components/Runners/Gthd.tsx b/src/components/Runners/Gthd.tsx new file mode 100644 index 000000000..5c890ad82 --- /dev/null +++ b/src/components/Runners/Gthd.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/gthd.json' + +const Gthd = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Gthd diff --git a/src/components/Runners/Nsds.tsx b/src/components/Runners/Nsds.tsx new file mode 100644 index 000000000..fe4bfd4c7 --- /dev/null +++ b/src/components/Runners/Nsds.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/nsds.json' + +const Nsds = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Nsds diff --git a/src/components/Runners/Zvpc.tsx b/src/components/Runners/Zvpc.tsx new file mode 100644 index 000000000..25ee9a581 --- /dev/null +++ b/src/components/Runners/Zvpc.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/zvpc.json' + +const Zvpc = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Zvpc diff --git a/src/components/Runners/fakeIndex.ts b/src/components/Runners/fakeIndex.ts index 388b5e001..9cf58b93d 100644 --- a/src/components/Runners/fakeIndex.ts +++ b/src/components/Runners/fakeIndex.ts @@ -232,6 +232,10 @@ export { default as Fsgq } from 'src/components/FakeRunner' export { default as Gvxz } from 'src/components/FakeRunner' export { default as Xqjd } from 'src/components/FakeRunner' export { default as Qcme } from 'src/components/FakeRunner' +export { default as Gthd } from 'src/components/FakeRunner' +export { default as Gogn } from 'src/components/FakeRunner' +export { default as Zvpc } from 'src/components/FakeRunner' +export { default as Nsds } from 'src/components/FakeRunner' export { default as Bjny } from 'src/components/FakeRunner' export { default as Ukzq } from 'src/components/FakeRunner' export { default as Cldb } from 'src/components/FakeRunner' diff --git a/src/components/Runners/index.ts b/src/components/Runners/index.ts index efe32fcad..bef8b89d5 100644 --- a/src/components/Runners/index.ts +++ b/src/components/Runners/index.ts @@ -232,6 +232,10 @@ export { default as Fsgq } from 'src/components/Runners/Fsgq' export { default as Gvxz } from 'src/components/Runners/Gvxz' export { default as Xqjd } from 'src/components/Runners/Xqjd' export { default as Qcme } from 'src/components/Runners/Qcme' +export { default as Gthd } from 'src/components/Runners/Gthd' +export { default as Gogn } from 'src/components/Runners/Gogn' +export { default as Zvpc } from 'src/components/Runners/Zvpc' +export { default as Nsds } from 'src/components/Runners/Nsds' export { default as Bjny } from 'src/components/Runners/Bjny' export { default as Ukzq } from 'src/components/Runners/Ukzq' export { default as Cldb } from 'src/components/Runners/Cldb' diff --git a/src/contents/6.en.tsx b/src/contents/6.en.tsx index ea379c70c..6cf72637d 100644 --- a/src/contents/6.en.tsx +++ b/src/contents/6.en.tsx @@ -703,7 +703,7 @@ export default () => ( children: ( <>

- Next, there’s a in the + Next, there’s in the middle, so we label all{' '} as{' '} 🅱️. diff --git a/src/lib/runners/gogn.json b/src/lib/runners/gogn.json new file mode 100644 index 000000000..6e14e0819 --- /dev/null +++ b/src/lib/runners/gogn.json @@ -0,0 +1,74 @@ +{ + "expressionContainers": [ + { + "expression": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "showFuncBound", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "previouslyChangedExpressionState": "showFuncBound", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 2 + } + ], + "speed": 1, + "hideControls": true, + "explanationsVisibility": "hidden", + "hidePriorities": true, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": false, + "hideFuncUnboundBadgeOnExplanation": false, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "showBottomProgressBar": false +} diff --git a/src/lib/runners/gthd.json b/src/lib/runners/gthd.json new file mode 100644 index 000000000..1652de5ff --- /dev/null +++ b/src/lib/runners/gthd.json @@ -0,0 +1,316 @@ +{ + "expressionContainers": [ + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "numLeafNodes": 2, + "containerState": "ready", + "previouslyChangedExpressionState": "default" + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "active", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "previouslyChangedExpressionState": "active", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 2 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "showFuncBound", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "previouslyChangedExpressionState": "showFuncBound", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 2 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "highlighted", + "topLeftBadgeType": "unmatch", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "highlighted", + "topLeftBadgeType": "unmatch", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "betaReducePreviewBefore", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "previouslyChangedExpressionState": "betaReducePreviewBefore", + "matchExists": false, + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 2 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "betaReducePreviewCrossed", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "previouslyChangedExpressionState": "betaReducePreviewCrossed", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 2 + }, + { + "expression": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "previouslyChangedExpressionState": "default", + "activePriority": 1, + "containerState": "done", + "numLeafNodes": 1 + } + ], + "speed": 1, + "hideControls": false, + "explanationsVisibility": "hiddenInitialPausedOnly", + "hidePriorities": true, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": false, + "hideFuncUnboundBadgeOnExplanation": true, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "showBottomProgressBar": false +} diff --git a/src/lib/runners/nsds.json b/src/lib/runners/nsds.json new file mode 100644 index 000000000..0af4bbe16 --- /dev/null +++ b/src/lib/runners/nsds.json @@ -0,0 +1,74 @@ +{ + "expressionContainers": [ + { + "expression": { + "arg": { + "name": "b", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "betaReducePreviewCrossed", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "previouslyChangedExpressionState": "betaReducePreviewCrossed", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 2 + } + ], + "speed": 1, + "hideControls": true, + "explanationsVisibility": "hidden", + "hidePriorities": true, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": false, + "hideFuncUnboundBadgeOnExplanation": false, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "showBottomProgressBar": false +} diff --git a/src/lib/runners/zvpc.json b/src/lib/runners/zvpc.json new file mode 100644 index 000000000..b570fb5e4 --- /dev/null +++ b/src/lib/runners/zvpc.json @@ -0,0 +1,75 @@ +{ + "expressionContainers": [ + { + "expression": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "highlighted", + "topLeftBadgeType": "unmatch", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "highlighted", + "topLeftBadgeType": "unmatch", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "betaReducePreviewBefore", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "previouslyChangedExpressionState": "betaReducePreviewBefore", + "matchExists": false, + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 2 + } + ], + "speed": 1, + "hideControls": true, + "explanationsVisibility": "hidden", + "hidePriorities": true, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": false, + "hideFuncUnboundBadgeOnExplanation": false, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "showBottomProgressBar": false +} From 5204b299d80acf5d619b57cf9574d60d434d6ad5 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Mon, 4 Nov 2019 23:29:40 -0800 Subject: [PATCH 40/83] Finish step 5 --- pages/emojis-functional-programming.tsx | 29 +++++++++++++++++++++++++ src/components/Alert.tsx | 4 +++- 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index f3753b09d..dd15bc460 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -861,6 +861,35 @@ sushi => 'pizza'`} +

+ That’s how the emoji puzzle visualizes the evaluation of a function + when there’s no matching variable in the function body—like{' '} + {`(sushi => 'pizza')('sandwich')`}. +

+ +

+ More examples (optional read): Here are more examples + that might be helpful for your understanding. You can press{' '} + on each example to + see the evaluation visualization.{' '} + +

+ 'bread')`} + showGuide + caption={<>JS Code} + >{`(pizza => pizza)(spaghetti => 'bread')`} + Equivalent emoji puzzle: +
+ JS Code} + >{`(salad => 'hotDog')(curry => 'tacos')`} + Equivalent emoji puzzle: +
diff --git a/src/components/Alert.tsx b/src/components/Alert.tsx index 09407d322..acdef3a21 100644 --- a/src/components/Alert.tsx +++ b/src/components/Alert.tsx @@ -13,7 +13,7 @@ export const alertSpacing = css` export interface AlertProps { children: React.ReactNode - backgroundColor: 'yellow' | 'red' | 'brown' + backgroundColor: 'yellow' | 'red' | 'brown' | 'blue' } const Alert = ({ children, backgroundColor }: AlertProps) => ( @@ -26,6 +26,8 @@ const Alert = ({ children, backgroundColor }: AlertProps) => ( ? colors('yellow100') : backgroundColor === 'brown' ? colors('brown50') + : backgroundColor === 'blue' + ? colors('blue50') : colors('pink50')}; ` ]} From 816dde7294a3dcd0c963cfa3d77161d4fc59f9d3 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Tue, 5 Nov 2019 09:08:51 -0800 Subject: [PATCH 41/83] Tweaks --- pages/emojis-functional-programming.tsx | 10 ++++++---- src/lib/{date.tsx => date.ts} | 0 2 files changed, 6 insertions(+), 4 deletions(-) rename src/lib/{date.tsx => date.ts} (100%) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index dd15bc460..94b458614 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -51,7 +51,7 @@ const numSteps = 100 const wordCount = 10000 const minRead = wordCount / 200 -const date = DateTime.fromISO('2019-11-06T12:00:00Z') +const date = DateTime.fromISO('2019-11-08T12:00:00Z') // const dateString = date // .setLocale('en') // .setZone('America/Los_Angeles') @@ -869,9 +869,11 @@ sushi => 'pizza'`}

More examples (optional read): Here are more examples - that might be helpful for your understanding. You can press{' '} - on each example to - see the evaluation visualization.{' '} + that might be helpful for your understanding. You can{' '} + + press + {' '} + on each example to see the evaluation visualization.{' '}

Date: Tue, 5 Nov 2019 09:38:20 -0800 Subject: [PATCH 42/83] Update 0 --- src/contents/0.en.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/contents/0.en.tsx b/src/contents/0.en.tsx index be89f078a..77a9c5606 100644 --- a/src/contents/0.en.tsx +++ b/src/contents/0.en.tsx @@ -76,17 +76,17 @@ export default () => ( solving puzzles—no coding required - . Here’s a quick demo. I’ll explain how this puzzle works on the - next page, but for now,{' '} + . Here’s a quick demo. I’ll explain how this puzzle works later, + but for now,{' '} try pressing and see what happens:

- + You’ll see puzzles like this:
Try pressing . -
+ ) }, From 16932ae0ea046787767ac69a9460834a86114dad Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Tue, 5 Nov 2019 09:57:30 -0800 Subject: [PATCH 43/83] CoveredIn --- pages/emojis-functional-programming.tsx | 84 ++++++++++++++++--------- 1 file changed, 55 insertions(+), 29 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 94b458614..81ff47833 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -86,10 +86,12 @@ const Subheading = ({ step, noHrTop, children, + coveredIn, ...props }: JSX.IntrinsicElements['h3'] & { noHrTop?: boolean step: number | 'none' + coveredIn: number | 'none' }) => ( <> {!noHrTop && ( @@ -100,6 +102,39 @@ const Subheading = ({ `} /> )} + {step !== 'none' && coveredIn !== 'none' && ( +
+ Step{' '} + + {step} + {' '} + of {numSteps} · From the course’s{' '} + + + {' '} + level +
+ )}

{children} - {step !== 'none' && ( - <> - {' '} - - (Step{' '} - - {step} - - /{numSteps}) - - - )}

) @@ -501,7 +514,7 @@ export default () => { full-time position (remote or in SF/LA). Scroll to the bottom of this article for details.
- + Overview of this article
    @@ -518,12 +531,14 @@ export default () => { This article is long—it’s about{' '} {wordCount.toLocaleString('en-US')} words ( {minRead} min. read). To help you track how far along - you are in the article, I’ll show a “step” number next to each + you are in the article, I’ll show a “step” number above each subheading. There are a total of {numSteps} steps in this article.
- Identity function in JS + + Identity function in JS +

First, take a look at the following code. It’s an{' '} identity function in JavaScript that returns the @@ -597,7 +612,9 @@ sushi => sushi`} sushi and 'sushi'{' '} will be represented as . - Running the function + + Running the function +

I’ve added the button to the JS code snippet so you can see the result.{' '} @@ -637,7 +654,9 @@ sushi => sushi`} )—without showing any code.

- Another example + + Another example +

Let’s take a look at another example. Here’s a piece of JS code that’s slightly different from before. It’s a function that{' '} @@ -689,7 +708,9 @@ sushi => 'pizza'`} - Visualizing evaluation rules + + Visualizing evaluation rules +

Because you know how to code, you have a mental model of how function evaluation works. If you see{' '} @@ -803,7 +824,9 @@ sushi => 'pizza'`} these rules, non-programmers can intuitively learn to evaluate functions without learning about how variable bindings work.

- If there’s no match + + If there’s no match +

Let’s take a look at the other example from earlier:

'pizza'`} >{`(salad => 'hotDog')(curry => 'tacos')`} Equivalent emoji puzzle: + + More complicated expressions + From bd048573cd8efb63e13a2a80ac50380cf116eb7b Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Tue, 5 Nov 2019 10:12:48 -0800 Subject: [PATCH 44/83] Polish intro --- pages/emojis-functional-programming.tsx | 46 ++++++++++++++++--------- src/components/Alert.tsx | 1 + src/components/ContentTags/Inline.tsx | 2 +- 3 files changed, 32 insertions(+), 17 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 81ff47833..df94caa7e 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -196,7 +196,7 @@ const CodeBlock = ({ margin-top: ${spaces(1.25)}; `} > - JS code: + {caption} )} { To explain these concepts, I created{' '} an educational puzzle using emojis 🍱. In this article, I’ll explain how my emoji puzzles can represent and - execute functional code visually. If you like to - teach programming to beginners, or if you like functional - programming in general, I think you’ll enjoy this article. + execute functional code visually. Here’s a sneak + peek— + + try pressing below! + + : +

+ Functional JS Code:} + >{`(sushi => sushi)('sandwich')`} + + Equivalent emoji puzzle: + +

+ If you like to teach programming to beginners, or if you like + functional programming in general, I think you’ll enjoy this + article.

@@ -692,7 +712,7 @@ sushi => 'pizza'`} defaultResultVisible result={`'sandwich'`} showGuide - caption={<>JS Code} + caption={<>Functional JS Code:} >{`(sushi => sushi)('sandwich')`} Equivalent emoji puzzle: @@ -702,7 +722,7 @@ sushi => 'pizza'`} defaultResultVisible result={`'pizza'`} showGuide - caption={<>JS Code} + caption={<>Functional JS Code:} >{`(sushi => 'pizza')('sandwich')`} Equivalent emoji puzzle: @@ -730,10 +750,7 @@ sushi => 'pizza'`}

Let’s reuse the earlier example again:

JS Code} + caption={<>Functional JS Code:} >{`(sushi => sushi)('sandwich')`} Equivalent emoji puzzle:

@@ -829,10 +846,7 @@ sushi => 'pizza'`}

Let’s take a look at the other example from earlier:

JS Code} + caption={<>Functional JS Code:} >{`(sushi => 'pizza')('sandwich')`} Equivalent emoji puzzle:

@@ -903,7 +917,7 @@ sushi => 'pizza'`} defaultResultVisible result={`(spaghetti => 'bread')`} showGuide - caption={<>JS Code} + caption={<>Functional JS Code:} >{`(pizza => pizza)(spaghetti => 'bread')`} Equivalent emoji puzzle:


@@ -911,7 +925,7 @@ sushi => 'pizza'`} defaultResultVisible result={`'hotDog'`} showGuide - caption={<>JS Code} + caption={<>Functional JS Code:} >{`(salad => 'hotDog')(curry => 'tacos')`} Equivalent emoji puzzle:
diff --git a/src/components/Alert.tsx b/src/components/Alert.tsx index acdef3a21..6c25e4cdb 100644 --- a/src/components/Alert.tsx +++ b/src/components/Alert.tsx @@ -5,6 +5,7 @@ import { ns, radii, colors, spaces } from 'src/lib/theme' export const alertSpacing = css` padding: ${spaces(0.75)} ${spaces(0.75)}; margin-bottom: ${spaces(1.25)}; + margin-top: ${spaces(1.25)}; ${ns} { padding: ${spaces(1)} ${spaces(1.25)}; diff --git a/src/components/ContentTags/Inline.tsx b/src/components/ContentTags/Inline.tsx index d3149ac3d..8bb781791 100644 --- a/src/components/ContentTags/Inline.tsx +++ b/src/components/ContentTags/Inline.tsx @@ -29,7 +29,7 @@ const mix = (color: CardProps['color'], base: string) => Color(base) .mix( Color(backgroundColor(color)), - color === 'white' ? 0.4 : color === 'grey' ? 0.45 : 0.55 + color === 'white' ? 0.35 : color === 'grey' ? 0.45 : 0.55 ) .hsl() .string() From 519a1fa5201eee58cd14b6e4044a8ae3e7309e99 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Tue, 5 Nov 2019 10:14:17 -0800 Subject: [PATCH 45/83] Wordsmith --- pages/emojis-functional-programming.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index df94caa7e..defd34506 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -508,11 +508,11 @@ export default () => {

⚠️ Note: This article is for programmers who are familiar with functional programming. If - you’re a non-programmer, check out “ + you’re a non-programmer, check out the course itself instead: “ Y Combinator for Non-programmers - ” instead. + ”.

{ > I’ll use JavaScript in this article. Even if you’re not familiar with JS, you should still be able to understand it. - P.S.{' '} + Also,{' '} - The source code for this article is available on GitHub + the source code for this article is available on GitHub —please ★ star it!

From 443f1dc9b4b1885701bffd884c2128c68efcd42b Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Tue, 5 Nov 2019 10:17:11 -0800 Subject: [PATCH 46/83] Wordsmith --- pages/emojis-functional-programming.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index defd34506..a8e9f74bc 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -837,9 +837,9 @@ sushi => 'pizza'`}

The above steps visually represent how functions are evaluated—they are equivalent to how JavaScript evaluates{' '} - (sushi => sushi)('sandwich'). By following - these rules, non-programmers can intuitively learn to evaluate - functions without learning about how variable bindings work. + (sushi => sushi)('sandwich'). By learning + these rules, non-programmers can evaluate functions intuitively, + without learning about how variable bindings work.

If there’s no match From b68ac5976234d9cf5965d8f9c154cc15425e5ee9 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Tue, 5 Nov 2019 10:47:01 -0800 Subject: [PATCH 47/83] Tweet link --- pages/emojis-functional-programming.tsx | 23 +++++++++++++++++++++++ src/components/CustomEmoji/TwitterSvg.tsx | 15 +++++++++++++++ src/components/CustomEmoji/index.tsx | 4 +++- 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/components/CustomEmoji/TwitterSvg.tsx diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index a8e9f74bc..fad96724c 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -14,6 +14,7 @@ import H from 'src/components/H' import EmojiForLetter from 'src/components/EmojiForLetter' import EpisodeHero from 'src/components/EpisodeHero' import EpisodePageFooter from 'src/components/EpisodePageFooter' +import CustomEmoji from 'src/components/CustomEmoji' import ButtonWithTouchActiveStates from 'src/components/ButtonWithTouchActiveStates' import * as R from 'src/components/Runners' import { @@ -47,6 +48,8 @@ import { StepFour } from 'src/contents/4.en' +const hackerNewsLink = `` + const numSteps = 100 const wordCount = 10000 const minRead = wordCount / 200 @@ -74,6 +77,10 @@ const description = const url = `${enBaseUrl}/emojis-functional-programming` const ogImageUrl = `${enBaseUrl}/static/images/blog-og.png` +const tweetUrl = `https://twitter.com/intent/tweet?url=${encodeURIComponent( + url +)}&via=chibicode&text=${encodeURIComponent(title)}` + const Alert = (props: AlertProps) => ( @@ -555,6 +562,22 @@ export default () => { subheading. There are a total of {numSteps} steps in this article. + + If you decide to read later: I’d appreciate it if you + could share this article before you go!{' '} + + {' '} + Click here to Tweet this article. + + {hackerNewsLink && ( + <> + {' '} + You can also discuss this on{' '} + Hacker News + . + + )} + Identity function in JS diff --git a/src/components/CustomEmoji/TwitterSvg.tsx b/src/components/CustomEmoji/TwitterSvg.tsx new file mode 100644 index 000000000..ff9363497 --- /dev/null +++ b/src/components/CustomEmoji/TwitterSvg.tsx @@ -0,0 +1,15 @@ +import * as React from 'react' + +const Twitter = (props: React.SVGProps) => ( + + + + + +) + +export default Twitter diff --git a/src/components/CustomEmoji/index.tsx b/src/components/CustomEmoji/index.tsx index f9a001c6b..d625185d1 100644 --- a/src/components/CustomEmoji/index.tsx +++ b/src/components/CustomEmoji/index.tsx @@ -31,6 +31,7 @@ import MultiplyWhiteSvg from 'src/components/CustomEmoji/MultiplyWhiteSvg' import TwentyFourSvg from 'src/components/CustomEmoji/TwentyFourSvg' import QuestionMinusOne from 'src/components/CustomEmoji/QuestionMinusOne' import TwentySvg from 'src/components/CustomEmoji/TwentySvg' +import TwitterSvg from 'src/components/CustomEmoji/TwitterSvg' import FourLunchboxesSvg from 'src/components/CustomEmoji/FourLunchboxesSvg' import Emoji, { EmojiProps } from 'src/components/Emoji' @@ -67,7 +68,8 @@ export const customEmojiToComponent = { zeroOne: ZeroOneSvg, fourLunchboxes: FourLunchboxesSvg, nodes: NodesSvg, - complexCalculations: ComplexCalculationsSvg + complexCalculations: ComplexCalculationsSvg, + twitter: TwitterSvg } const CustomEmoji = ({ From a867cfd2109938d7fa1126bd6f62f53932b139cd Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Tue, 5 Nov 2019 10:47:48 -0800 Subject: [PATCH 48/83] freelance --- pages/emojis-functional-programming.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index fad96724c..b85eeb81b 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -537,9 +537,9 @@ export default () => { 👋 Available for Hire: My name is{' '} - Shu Uesugi, a full-stack engineer who’s looking for a{' '} - full-time position (remote or in SF/LA). Scroll to - the bottom of this article for details. + Shu Uesugi, a freelance full-stack engineer who’s + looking for a full-time position (remote or in + SF/LA). Scroll to the bottom of this article for details. Overview of this article From 9dfbafa2c3d167b0738c056eaeef3a4a4b5b0bfd Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Tue, 5 Nov 2019 12:14:27 -0800 Subject: [PATCH 49/83] Cleanup --- pages/emojis-functional-programming.tsx | 112 +++++++++++++++++------- 1 file changed, 78 insertions(+), 34 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index b85eeb81b..9d2f9c6db 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -3,7 +3,7 @@ import { css, jsx, Global } from '@emotion/core' import { useState } from 'react' import Page from 'src/components/Page' import Head from 'next/head' -import { ns, radii, fontSizes, colors, spaces } from 'src/lib/theme' +import { ns, radii, fontSizes, colors, spaces, maxWidths } from 'src/lib/theme' import { lessonTitle } from 'src/lib/titles' import Container from 'src/components/Container' import ExpressionRunnerSeparator from 'src/components/ExpressionRunnerSeparator' @@ -112,14 +112,8 @@ const Subheading = ({ {step !== 'none' && coveredIn !== 'none' && (
Step{' '} @@ -129,17 +123,28 @@ const Subheading = ({ `} > {step} - {' '} - of {numSteps} · From the course’s{' '} - - - {' '} - level + + /{numSteps} + + {' '} + · From my course’s{' '} + + + {' '} + level +
)}

{caption} @@ -220,9 +225,10 @@ const CodeBlock = ({ background-color: ${colors('codeBg')}; font-weight: 600; font-family: ${codeFontFamily}; - margin: ${caption ? 0 : spaces(1.25)} 0 - ${result ? 0 : spaces(1.25)}; + margin: ${caption ? 0 : spaces(1.75)} auto + ${result ? 0 : spaces(1.75)}; font-size: ${fontSizes(0.85)}; + max-width: ${maxWidths('xs')}; `, result ? css` @@ -271,7 +277,10 @@ const CodeBlock = ({ <>
{resultVisible ? ( @@ -411,6 +420,7 @@ export default () => { format('woff2'), url('/static/fonts/woff/SemiBold.woff') format('woff'); font-weight: 400; + font-display: fallback; font-style: normal; } ` @@ -473,11 +483,14 @@ export default () => { />

- Last month, I published a free online course called “ - - Y Combinator for Non-programmers - - ”. In this 17-page course, I teach computer science concepts such as + + Last month, I published a free online course called “ + + Y Combinator for Non-programmers + + ”. + {' '} + In this 17-page course, I teach computer science concepts such as functional programming, lambda calculus, Church encoding, and Y combinator in a way such that{' '} @@ -499,7 +512,7 @@ export default () => { Functional JS Code:} + caption={<>Functional JS code:} >{`(sushi => sushi)('sandwich')`} 'pizza'`} defaultResultVisible result={`'sandwich'`} showGuide - caption={<>Functional JS Code:} + caption={<>Functional JS code:} >{`(sushi => sushi)('sandwich')`} Equivalent emoji puzzle: @@ -745,7 +758,7 @@ sushi => 'pizza'`} defaultResultVisible result={`'pizza'`} showGuide - caption={<>Functional JS Code:} + caption={<>Functional JS code:} >{`(sushi => 'pizza')('sandwich')`} Equivalent emoji puzzle: @@ -773,7 +786,7 @@ sushi => 'pizza'`}

Let’s reuse the earlier example again:

Functional JS Code:} + caption={<>Functional JS code:} >{`(sushi => sushi)('sandwich')`} Equivalent emoji puzzle:

@@ -869,7 +882,7 @@ sushi => 'pizza'`}

Let’s take a look at the other example from earlier:

Functional JS Code:} + caption={<>Functional JS code:} >{`(sushi => 'pizza')('sandwich')`} Equivalent emoji puzzle:

@@ -940,7 +953,7 @@ sushi => 'pizza'`} defaultResultVisible result={`(spaghetti => 'bread')`} showGuide - caption={<>Functional JS Code:} + caption={<>Functional JS code:} >{`(pizza => pizza)(spaghetti => 'bread')`} Equivalent emoji puzzle:


@@ -948,13 +961,44 @@ sushi => 'pizza'`} defaultResultVisible result={`'hotDog'`} showGuide - caption={<>Functional JS Code:} + caption={<>Functional JS code:} >{`(salad => 'hotDog')(curry => 'tacos')`} Equivalent emoji puzzle: More complicated expressions +

+ Let’s take a look at more complicated functional JS expressions and + see if they can be represented using an emoji puzzle. Check out the + following JS expression, and + + {' '} + try to guess what the result would be before pressing the{' '} + button. + +

+ + Guess what the result would be +
+ before pressing the button. + + } + >{`(sushi => sandwich => sushi)( + 'hamburger' +)('chicken')`}
+

+ The result was {`'hamburger'`}. It’s + because {'sushi'} is bound to{' '} + {`'hamburger'`},{' '} + {'sandwich'} is bound to{' '} + {`'chicken'`}, and it returns what’s in{' '} + {'sushi'}. +

+

And here’s the equivalent emoji puzzle:

From 0986c947d7378c11bcb3f1db29550be299a4c8ef Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Tue, 5 Nov 2019 12:52:32 -0800 Subject: [PATCH 50/83] Continue with 6 --- pages/emojis-functional-programming.tsx | 79 +++++++++++----- scripts/lib/runnerConfigs.ts | 20 ++++ src/components/Runners/Lxzn.tsx | 12 +++ src/components/Runners/fakeIndex.ts | 1 + src/components/Runners/index.ts | 1 + src/components/VariableExpressionBox.tsx | 20 ++-- src/components/VariableShadeContext.tsx | 1 + src/contents/3.en.tsx | 25 +++-- src/contents/3.jp.tsx | 29 ++++-- src/lib/runners/lxzn.json | 113 +++++++++++++++++++++++ 10 files changed, 258 insertions(+), 43 deletions(-) create mode 100644 src/components/Runners/Lxzn.tsx create mode 100644 src/lib/runners/lxzn.json diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 9d2f9c6db..f9ab00c89 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -47,6 +47,7 @@ import { InstructionFour, StepFour } from 'src/contents/4.en' +import VariableShadeContext from 'src/components/VariableShadeContext' const hackerNewsLink = `` @@ -407,6 +408,26 @@ CodeBlock.defaultProps = { defaultResultVisible: false } +const PointToRunButton = ({ children }: { children: React.ReactNode }) => ( + + {children} + +) + +const DimUnhighlighted = ({ children }: { children: React.ReactNode }) => ( + + {children} + +) + export default () => { let step = 1 return locale === 'en' ? ( @@ -481,6 +502,7 @@ export default () => { } `} /> +

@@ -514,11 +536,9 @@ export default () => { showGuide caption={<>Functional JS code:} >{`(sushi => sushi)('sandwich')`} - + Equivalent emoji puzzle: - +

If you like to teach programming to beginners, or if you like functional programming in general, I think you’ll enjoy this @@ -632,11 +652,13 @@ sushi => sushi`} …is represented by the bottom two items on the puzzle, which are both .

- - sushi => sushi is represented -
- by the bottom two items -
+ + + sushi => sushi is represented +
+ by the bottom two items +
+

Second, the argument 'sandwich' to the identity function… @@ -650,11 +672,13 @@ sushi => sushi`} …is represented by the top item on the puzzle, which is a .

- - The argument 'sandwich' is represented -
- by the top item -
+ + + The argument 'sandwich' is represented +
+ by the top item +
+

That’s how my emoji puzzle can visually describe a simple JS expression. Next, let’s talk about how we can{' '} @@ -691,11 +715,9 @@ sushi => sushi`} puzzle.

- + - +

The result is , which is the same as what happens when you run the equivalent JS code. @@ -801,11 +823,9 @@ sushi => 'pizza'`} .

- + - +

Here are the four steps it displayed:

Step 1.{' '} @@ -999,6 +1019,21 @@ sushi => 'pizza'`} {'sushi'}.

And here’s the equivalent emoji puzzle:

+ +

Let’s break it down. First, the function expression…

+ + lineNumber === 0 && tokenNumber > 0 && tokenNumber < 9 + } + >{`(sushi => sandwich => sushi)( + 'hamburger' +)('chicken')`} +

…is represented by the bottom row:

+ + + sushi => sandwich => sushi + +
diff --git a/scripts/lib/runnerConfigs.ts b/scripts/lib/runnerConfigs.ts index 55b16c2f3..939347d8e 100644 --- a/scripts/lib/runnerConfigs.ts +++ b/scripts/lib/runnerConfigs.ts @@ -194,6 +194,26 @@ export const cvtc: ExpressionRunnerShorthandConfig = { showPriorities: true } +export const lxzn: ExpressionRunnerShorthandConfig = { + runner: 'simple', + initialExpressionContainer: initialExpressionContainers.pisd, + showPriorities: true, + highlightOverrides: { + a: 'highlighted', + b: 'highlighted' + } +} + +export const ujuq: ExpressionRunnerShorthandConfig = { + runner: 'simple', + initialExpressionContainer: initialExpressionContainers.pisd, + showPriorities: true, + highlightOverrides: { + c: 'highlighted', + d: 'highlighted' + } +} + export const oork: ExpressionRunnerShorthandConfig = { runner: 'simple', initialExpressionContainer: initialExpressionContainers.hrdv, diff --git a/src/components/Runners/Lxzn.tsx b/src/components/Runners/Lxzn.tsx new file mode 100644 index 000000000..3cf581e5c --- /dev/null +++ b/src/components/Runners/Lxzn.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/lxzn.json' + +const Lxzn = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Lxzn diff --git a/src/components/Runners/fakeIndex.ts b/src/components/Runners/fakeIndex.ts index 9cf58b93d..754beac1f 100644 --- a/src/components/Runners/fakeIndex.ts +++ b/src/components/Runners/fakeIndex.ts @@ -23,6 +23,7 @@ export { default as Mqvu } from 'src/components/FakeRunner' export { default as Bgfl } from 'src/components/FakeRunner' export { default as Cpkp } from 'src/components/FakeRunner' export { default as Cvtc } from 'src/components/FakeRunner' +export { default as Lxzn } from 'src/components/FakeRunner' export { default as Oork } from 'src/components/FakeRunner' export { default as Diis } from 'src/components/FakeRunner' export { default as Dkiy } from 'src/components/FakeRunner' diff --git a/src/components/Runners/index.ts b/src/components/Runners/index.ts index bef8b89d5..282e951ec 100644 --- a/src/components/Runners/index.ts +++ b/src/components/Runners/index.ts @@ -23,6 +23,7 @@ export { default as Mqvu } from 'src/components/Runners/Mqvu' export { default as Bgfl } from 'src/components/Runners/Bgfl' export { default as Cpkp } from 'src/components/Runners/Cpkp' export { default as Cvtc } from 'src/components/Runners/Cvtc' +export { default as Lxzn } from 'src/components/Runners/Lxzn' export { default as Oork } from 'src/components/Runners/Oork' export { default as Diis } from 'src/components/Runners/Diis' export { default as Dkiy } from 'src/components/Runners/Dkiy' diff --git a/src/components/VariableExpressionBox.tsx b/src/components/VariableExpressionBox.tsx index 4e34e27f0..423f03ad1 100644 --- a/src/components/VariableExpressionBox.tsx +++ b/src/components/VariableExpressionBox.tsx @@ -48,10 +48,11 @@ export const variableExpressionBoxFontSize = ( }[size]) const VariableEmoji = ({ expression }: VariableExpressionBoxProps) => { - const { variableSize } = useContext(ExpressionRunnerContext) - const { hideBottomRightBadges, bottomRightBadgeOverrides } = useContext( - ExpressionRunnerContext - ) + const { + hideBottomRightBadges, + bottomRightBadgeOverrides, + variableSize + } = useContext(ExpressionRunnerContext) if (expression.shorthandNumberAfterConvert) { return ( @@ -401,13 +402,16 @@ const VariableEmoji = ({ expression }: VariableExpressionBoxProps) => { } const VariableExpressionBox = ({ expression }: VariableExpressionBoxProps) => { - const { hidePriorities, variableSize } = useContext(ExpressionRunnerContext) + const { hidePriorities, variableSize, highlightOverrides } = useContext( + ExpressionRunnerContext + ) const { conditionalState } = useContext(ConditionalContext) const { binaryState } = useContext(BinaryContext) const { shadeNonNumbers, shadeNonHighlightedFunc, - shadeNonFactorial + shadeNonFactorial, + shadeNonHighlighted } = useContext(VariableShadeContext) return ( @@ -423,7 +427,9 @@ const VariableExpressionBox = ({ expression }: VariableExpressionBoxProps) => { expression.shorthandNumber !== 3 && expression.shorthandNumber !== 4 && expression.shorthandNumber !== 5 && - expression.name !== 'blankNumber')) && ( + expression.name !== 'blankNumber') || + (shadeNonHighlighted && + highlightOverrides[expression.name] !== 'highlighted')) && ( ( @@ -431,16 +432,28 @@ export default () => ( Explanation: In this example, the top section has a{' '} :

- - The top section has a - + + + The top section has a + +

And each of the bottom two sections has{' '} , a traditional Japanese food:

- - Each of the bottom two sections has - + + + Each of the bottom two sections has + + ( ( が入っており、

- - 上段には - - + + + 上段には + + +

下段には がふたつ入っています。

- - 下段には - - + + + 下段には + + + Date: Tue, 5 Nov 2019 13:42:25 -0800 Subject: [PATCH 51/83] Continue with 6 --- pages/emojis-functional-programming.tsx | 17 +++- src/components/Runners/Ujuq.tsx | 12 +++ src/components/Runners/fakeIndex.ts | 1 + src/components/Runners/index.ts | 1 + src/lib/runners/ujuq.json | 113 ++++++++++++++++++++++++ 5 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 src/components/Runners/Ujuq.tsx create mode 100644 src/lib/runners/ujuq.json diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index f9ab00c89..d762f5c0b 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -527,7 +527,7 @@ export default () => { execute functional code visually. Here’s a sneak peek— - try pressing below! + try pressing below! :

@@ -1034,6 +1034,21 @@ sushi => 'pizza'`} sushi => sandwich => sushi +

And the two arguments…

+ + (lineNumber === 1 && tokenNumber > 0 && tokenNumber < 2) || + (lineNumber === 2 && tokenNumber > 2 && tokenNumber < 4) + } + >{`(sushi => sandwich => sushi)( + 'hamburger' +)('chicken')`} +

…are represented by the top and the middle rows:

+ + + ('hamburger')('chicken') + + diff --git a/src/components/Runners/Ujuq.tsx b/src/components/Runners/Ujuq.tsx new file mode 100644 index 000000000..c6f0c50d5 --- /dev/null +++ b/src/components/Runners/Ujuq.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/ujuq.json' + +const Ujuq = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Ujuq diff --git a/src/components/Runners/fakeIndex.ts b/src/components/Runners/fakeIndex.ts index 754beac1f..761980786 100644 --- a/src/components/Runners/fakeIndex.ts +++ b/src/components/Runners/fakeIndex.ts @@ -24,6 +24,7 @@ export { default as Bgfl } from 'src/components/FakeRunner' export { default as Cpkp } from 'src/components/FakeRunner' export { default as Cvtc } from 'src/components/FakeRunner' export { default as Lxzn } from 'src/components/FakeRunner' +export { default as Ujuq } from 'src/components/FakeRunner' export { default as Oork } from 'src/components/FakeRunner' export { default as Diis } from 'src/components/FakeRunner' export { default as Dkiy } from 'src/components/FakeRunner' diff --git a/src/components/Runners/index.ts b/src/components/Runners/index.ts index 282e951ec..26f5b85e6 100644 --- a/src/components/Runners/index.ts +++ b/src/components/Runners/index.ts @@ -24,6 +24,7 @@ export { default as Bgfl } from 'src/components/Runners/Bgfl' export { default as Cpkp } from 'src/components/Runners/Cpkp' export { default as Cvtc } from 'src/components/Runners/Cvtc' export { default as Lxzn } from 'src/components/Runners/Lxzn' +export { default as Ujuq } from 'src/components/Runners/Ujuq' export { default as Oork } from 'src/components/Runners/Oork' export { default as Diis } from 'src/components/Runners/Diis' export { default as Dkiy } from 'src/components/Runners/Dkiy' diff --git a/src/lib/runners/ujuq.json b/src/lib/runners/ujuq.json new file mode 100644 index 000000000..3e6ee1730 --- /dev/null +++ b/src/lib/runners/ujuq.json @@ -0,0 +1,113 @@ +{ + "expressionContainers": [ + { + "expression": { + "arg": { + "name": "d", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "c", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "a", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "numLeafNodes": 3, + "containerState": "ready", + "previouslyChangedExpressionState": "default" + } + ], + "speed": 1, + "hideControls": true, + "explanationsVisibility": "hidden", + "hidePriorities": false, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": false, + "hideFuncUnboundBadgeOnExplanation": false, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": { + "c": "highlighted", + "d": "highlighted" + }, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "showBottomProgressBar": false +} From b7717dd24637fe76eefd96b423dc913ec0550459 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Tue, 5 Nov 2019 14:03:10 -0800 Subject: [PATCH 52/83] Tweak overview, continue with 6 --- pages/emojis-functional-programming.tsx | 124 +++++++++++++++++------- 1 file changed, 91 insertions(+), 33 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index d762f5c0b..04f509c27 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -13,6 +13,7 @@ import Emoji from 'src/components/Emoji' import H from 'src/components/H' import EmojiForLetter from 'src/components/EmojiForLetter' import EpisodeHero from 'src/components/EpisodeHero' +import InlinePrioritiesLabel from 'src/components/InlinePrioritiesLabel' import EpisodePageFooter from 'src/components/EpisodePageFooter' import CustomEmoji from 'src/components/CustomEmoji' import ButtonWithTouchActiveStates from 'src/components/ButtonWithTouchActiveStates' @@ -518,7 +519,7 @@ export default () => { people who have zero programming knowledge can understand - . + —without sacrificing rigor.

To explain these concepts, I created{' '} @@ -544,43 +545,14 @@ export default () => { functional programming in general, I think you’ll enjoy this article.

- -

- ⚠️ Note: This article is for - programmers who are familiar with functional programming. If - you’re a non-programmer, check out the course itself instead: “ - - Y Combinator for Non-programmers - - ”. -

-

- I’ll use JavaScript in this article. Even if you’re - not familiar with JS, you should still be able to understand it. - Also,{' '} - - the source code for this article is available on GitHub - - —please ★ star it! -

-
- - 👋 Available for Hire: My name is{' '} - Shu Uesugi, a freelance full-stack engineer who’s - looking for a full-time position (remote or in - SF/LA). Scroll to the bottom of this article for details. - - Overview of this article + Overview
    First, I’ll show you how some simple JavaScript code - can be represented using my emoji puzzle. + can be represented using my emoji puzzle. Even if you’re not + familiar with JS, you should still be able to understand it. After that, I’ll talk about how to use my emoji @@ -611,7 +583,41 @@ export default () => { )} + + Also,{' '} + + the source code for this article is available on GitHub + + —please ★ star it! +
+ +
+ ⚠️ Note: This article is for + programmers. If you’re a non-programmer, check out the course + itself instead: “ + + Y Combinator for Non-programmers + + ”. +
+
+ +
+ 👋 Available for Hire: My name is{' '} + Shu Uesugi, a freelance full-stack engineer who’s + looking for a full-time position (remote or in + SF/LA). Scroll to the bottom of this article for details. +
+
Identity function in JS @@ -1049,6 +1055,58 @@ sushi => 'pizza'`} ('hamburger')('chicken') +

+ Now, let’s talk about how we evaluate this function. In JS, we first + evaluate the function call with the argument{' '} + 'hamburger'. +

+ In JS, we evaluate this part first} + shouldHighlight={(lineNumber, tokenNumber) => + lineNumber === 0 || + (lineNumber === 1 && tokenNumber > 0 && tokenNumber < 2) || + (lineNumber === 2 && tokenNumber < 2) + } + >{`(sushi => sandwich => sushi)( + 'hamburger' +)('chicken')`} +

+ Equivalently, in the emoji puzzle,{' '} + we evaluate the bottom two rows first. We ignore + the top row initially, which is shaded in blue. +

+ + Focus on the bottom 2 rows, and +
+ Ignore the top row for now +
+

+ If you look at the left edge of the puzzle, the bottom two rows + correspond to the pair of{' '} + 1 + ’s. That’s the rule:{' '} + + In an emoji puzzle with 3 rows, you start with the pair of{' '} + 1’s. + +

+

+ Next, let’s label each item. This time, in addition to{' '} + {' '} + {' '} + ,{' '} + + we now have a new label{' '} + . + {' '} + for the . +

+ + There’s a new label{' '} + +
+ for the +
From 4c5462bcd66dae8afecdda41c64aa5e1224291c9 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Tue, 5 Nov 2019 14:04:37 -0800 Subject: [PATCH 53/83] Wordsmith --- pages/emojis-functional-programming.tsx | 5 +++-- src/contents/5.en.tsx | 6 +++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 04f509c27..0572af1c8 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -1076,7 +1076,7 @@ sushi => 'pizza'`} the top row initially, which is shaded in blue.

- Focus on the bottom 2 rows, and + Focus on the bottom two rows, and
Ignore the top row for now
@@ -1091,7 +1091,8 @@ sushi => 'pizza'`}

- Next, let’s label each item. This time, in addition to{' '} + Next, let’s label each item on the bottom two rows. This time, in + addition to{' '} {' '} {' '} ,{' '} diff --git a/src/contents/5.en.tsx b/src/contents/5.en.tsx index 76da27cae..15dcbeb72 100644 --- a/src/contents/5.en.tsx +++ b/src/contents/5.en.tsx @@ -422,8 +422,8 @@ export default () => ( Focus on{' '} - the bottom 2 rows, which correspond - to the pair of{' '} + the bottom two rows, which + correspond to the pair of{' '} 1 @@ -444,7 +444,7 @@ export default () => ( ]} /> - Focus on the bottom 2 rows, and + Focus on the bottom two rows, and
Ignore the top row for now
From 50d4e9204c8d36815133d585c822e37e06a57411 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Tue, 5 Nov 2019 14:42:17 -0800 Subject: [PATCH 54/83] Finish 6 --- pages/emojis-functional-programming.tsx | 124 ++++++++- scripts/lib/runnerConfigs.ts | 33 +++ src/components/ExpressionRunnerSeparator.tsx | 11 +- src/components/Runners/Itvv.tsx | 12 + src/components/Runners/Iwxm.tsx | 12 + src/components/Runners/Nefh.tsx | 12 + src/components/Runners/Qwtn.tsx | 12 + src/components/Runners/fakeIndex.ts | 4 + src/components/Runners/index.ts | 4 + src/lib/runners/itvv.json | 112 ++++++++ src/lib/runners/iwxm.json | 261 +++++++++++++++++++ src/lib/runners/nefh.json | 111 ++++++++ src/lib/runners/qwtn.json | 111 ++++++++ 13 files changed, 807 insertions(+), 12 deletions(-) create mode 100644 src/components/Runners/Itvv.tsx create mode 100644 src/components/Runners/Iwxm.tsx create mode 100644 src/components/Runners/Nefh.tsx create mode 100644 src/components/Runners/Qwtn.tsx create mode 100644 src/lib/runners/itvv.json create mode 100644 src/lib/runners/iwxm.json create mode 100644 src/lib/runners/nefh.json create mode 100644 src/lib/runners/qwtn.json diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 0572af1c8..04f1431a5 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -189,14 +189,14 @@ const CodeBlock = ({ children, shouldHighlight, result, - showGuide, + pointToRunButton, defaultResultVisible, caption }: { children: string shouldHighlight?: (lineNumber: number, tokenNumber: number) => boolean result?: string - showGuide?: boolean + pointToRunButton?: boolean defaultResultVisible: boolean caption?: React.ReactNode }) => { @@ -370,7 +370,7 @@ const CodeBlock = ({ > Run ▶️ - {showGuide && ( + {pointToRunButton && ( {

Functional JS code:} >{`(sushi => sushi)('sandwich')`} @@ -711,7 +711,7 @@ sushi => sushi`}

{`(sushi => sushi)('sandwich')`}

Now, we can also “run” the equivalent emoji puzzle and get the same @@ -775,7 +775,6 @@ sushi => 'pizza'`} Functional JS code:} >{`(sushi => sushi)('sandwich')`} Equivalent emoji puzzle: @@ -785,7 +784,6 @@ sushi => 'pizza'`} Functional JS code:} >{`(sushi => 'pizza')('sandwich')`} Equivalent emoji puzzle: @@ -978,7 +976,6 @@ sushi => 'pizza'`} 'bread')`} - showGuide caption={<>Functional JS code:} >{`(pizza => pizza)(spaghetti => 'bread')`} Equivalent emoji puzzle: @@ -986,7 +983,6 @@ sushi => 'pizza'`} Functional JS code:} >{`(salad => 'hotDog')(curry => 'tacos')`} Equivalent emoji puzzle: @@ -1098,7 +1094,7 @@ sushi => 'pizza'`} ,{' '} we now have a new label{' '} - . + {' '} for the .

@@ -1108,6 +1104,114 @@ sushi => 'pizza'`}
for the +

+ Here’s the rule:{' '} + + The middle items on the bottom row are labeled as{' '} + , + and you can ignore them. + {' '} + You can pretend that{' '} + + ’s don’t exist and apply the other rules from before. +

+

Let’s take a look at the next few steps in this iteration:

+ + + + + + + +

This is exactly like how the earlier JS code is evaluated.

+ After evaluating this part…} + shouldHighlight={(lineNumber, tokenNumber) => + lineNumber === 0 || + (lineNumber === 1 && tokenNumber > 0 && tokenNumber < 2) || + (lineNumber === 2 && tokenNumber < 2) + } + >{`(sushi => sandwich => sushi)( + 'hamburger' +)('chicken')`} + + + …it becomes this, which is +
+ equivalent to the above emoji puzzle + + } + >{`(sandwich => 'hamburger')('chicken')`}
+

+ But we’re not done yet! Let’s continue to the end by{' '} + + pressing the button below: + +

+ Let’s continue to the end! +

+ We ended up with a , which is exactly + the same as what the JS code evaluated to. So we’ve shown that + complex functional JS expressions can be represented using an emoji + puzzle. +

+ +

+ What we learned so far: Complex functional JS + expressions can be represented using an emoji puzzle. +

+ Functional JS code:} + >{`(sushi => sandwich => sushi)( + 'hamburger' +)('chicken')`} + + Equivalent emoji puzzle: +
+ (Start with the pair of{' '} + 1’s) +
+ + +
+ +

+ More examples (optional read): Here are more examples + that might be helpful for your understanding. Again, remember + that: +

+
    + + We start with the pair of{' '} + 1’s. + + + The middle items on the bottom row are labeled as{' '} + , + and you can ignore them. + +
+

+ You can{' '} + + press + {' '} + on each example to see the evaluation visualization.{' '} + {' '} +

+ Functional JS code:} + >{`(friedPotatoes => pizza => pizza)( + 'spaghetti' +)('salad')`} + Equivalent emoji puzzle: +
diff --git a/scripts/lib/runnerConfigs.ts b/scripts/lib/runnerConfigs.ts index 939347d8e..2ad3f48af 100644 --- a/scripts/lib/runnerConfigs.ts +++ b/scripts/lib/runnerConfigs.ts @@ -34,6 +34,30 @@ export const pbhg: ExpressionRunnerShorthandConfig = { } } +export const itvv: ExpressionRunnerShorthandConfig = { + runner: 'simple', + initialExpressionContainer: initialExpressionContainers.pisd, + initialState: 'betaReducePreviewBefore', + showPriorities: true, + explanationsVisibility: 'visible' +} + +export const nefh: ExpressionRunnerShorthandConfig = { + runner: 'simple', + initialExpressionContainer: initialExpressionContainers.pisd, + initialState: 'betaReducePreviewAfter', + showPriorities: true, + explanationsVisibility: 'visible' +} + +export const qwtn: ExpressionRunnerShorthandConfig = { + runner: 'simple', + initialExpressionContainer: initialExpressionContainers.pisd, + initialState: 'betaReducePreviewCrossed', + showPriorities: true, + explanationsVisibility: 'visible' +} + export const wwtl: ExpressionRunnerShorthandConfig = { runner: 'singleStep', initialExpressionContainer: initialExpressionContainers.pisd, @@ -530,6 +554,15 @@ export const kvso: ExpressionRunnerShorthandConfig = { skipToTheEnd: false } +export const iwxm: ExpressionRunnerShorthandConfig = { + runner: 'runButtonOnly', + initialExpressionContainer: initialExpressionContainers.pisd, + nextIterations: 1, + initialState: 'active', + showPriorities: true, + skipToTheEnd: false +} + export const sgnp: ExpressionRunnerShorthandConfig = { runner: 'simple', initialExpressionContainer: initialExpressionContainers.pisd, diff --git a/src/components/ExpressionRunnerSeparator.tsx b/src/components/ExpressionRunnerSeparator.tsx index 891f3898e..985bca3d1 100644 --- a/src/components/ExpressionRunnerSeparator.tsx +++ b/src/components/ExpressionRunnerSeparator.tsx @@ -3,11 +3,18 @@ import { css, jsx } from '@emotion/core' import { spaces } from 'src/lib/theme' import CustomEmoji from 'src/components/CustomEmoji' -const ExpressionRunnerSeparator = ({ blank }: { blank?: boolean }) => ( +const ExpressionRunnerSeparator = ({ + blank, + halfMargin +}: { + blank?: boolean + halfMargin?: boolean +}) => (
{!blank && } diff --git a/src/components/Runners/Itvv.tsx b/src/components/Runners/Itvv.tsx new file mode 100644 index 000000000..9ece647dd --- /dev/null +++ b/src/components/Runners/Itvv.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/itvv.json' + +const Itvv = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Itvv diff --git a/src/components/Runners/Iwxm.tsx b/src/components/Runners/Iwxm.tsx new file mode 100644 index 000000000..741198895 --- /dev/null +++ b/src/components/Runners/Iwxm.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/iwxm.json' + +const Iwxm = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Iwxm diff --git a/src/components/Runners/Nefh.tsx b/src/components/Runners/Nefh.tsx new file mode 100644 index 000000000..de402b20f --- /dev/null +++ b/src/components/Runners/Nefh.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/nefh.json' + +const Nefh = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Nefh diff --git a/src/components/Runners/Qwtn.tsx b/src/components/Runners/Qwtn.tsx new file mode 100644 index 000000000..4ca031017 --- /dev/null +++ b/src/components/Runners/Qwtn.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/qwtn.json' + +const Qwtn = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Qwtn diff --git a/src/components/Runners/fakeIndex.ts b/src/components/Runners/fakeIndex.ts index 761980786..9959d7873 100644 --- a/src/components/Runners/fakeIndex.ts +++ b/src/components/Runners/fakeIndex.ts @@ -2,6 +2,9 @@ export { default as Aaov } from 'src/components/FakeRunner' export { default as Qxob } from 'src/components/FakeRunner' export { default as Bcgp } from 'src/components/FakeRunner' export { default as Pbhg } from 'src/components/FakeRunner' +export { default as Itvv } from 'src/components/FakeRunner' +export { default as Nefh } from 'src/components/FakeRunner' +export { default as Qwtn } from 'src/components/FakeRunner' export { default as Wwtl } from 'src/components/FakeRunner' export { default as Vdhd } from 'src/components/FakeRunner' export { default as Ltpe } from 'src/components/FakeRunner' @@ -72,6 +75,7 @@ export { default as Jwzh } from 'src/components/FakeRunner' export { default as Keck } from 'src/components/FakeRunner' export { default as Knhw } from 'src/components/FakeRunner' export { default as Kvso } from 'src/components/FakeRunner' +export { default as Iwxm } from 'src/components/FakeRunner' export { default as Sgnp } from 'src/components/FakeRunner' export { default as Beiz } from 'src/components/FakeRunner' export { default as Laea } from 'src/components/FakeRunner' diff --git a/src/components/Runners/index.ts b/src/components/Runners/index.ts index 26f5b85e6..2f9443768 100644 --- a/src/components/Runners/index.ts +++ b/src/components/Runners/index.ts @@ -2,6 +2,9 @@ export { default as Aaov } from 'src/components/Runners/Aaov' export { default as Qxob } from 'src/components/Runners/Qxob' export { default as Bcgp } from 'src/components/Runners/Bcgp' export { default as Pbhg } from 'src/components/Runners/Pbhg' +export { default as Itvv } from 'src/components/Runners/Itvv' +export { default as Nefh } from 'src/components/Runners/Nefh' +export { default as Qwtn } from 'src/components/Runners/Qwtn' export { default as Wwtl } from 'src/components/Runners/Wwtl' export { default as Vdhd } from 'src/components/Runners/Vdhd' export { default as Ltpe } from 'src/components/Runners/Ltpe' @@ -72,6 +75,7 @@ export { default as Jwzh } from 'src/components/Runners/Jwzh' export { default as Keck } from 'src/components/Runners/Keck' export { default as Knhw } from 'src/components/Runners/Knhw' export { default as Kvso } from 'src/components/Runners/Kvso' +export { default as Iwxm } from 'src/components/Runners/Iwxm' export { default as Sgnp } from 'src/components/Runners/Sgnp' export { default as Beiz } from 'src/components/Runners/Beiz' export { default as Laea } from 'src/components/Runners/Laea' diff --git a/src/lib/runners/itvv.json b/src/lib/runners/itvv.json new file mode 100644 index 000000000..b5015f367 --- /dev/null +++ b/src/lib/runners/itvv.json @@ -0,0 +1,112 @@ +{ + "expressionContainers": [ + { + "expression": { + "arg": { + "name": "d", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "c", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "highlighted", + "topLeftBadgeType": "match", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "a", + "highlightType": "highlighted", + "topLeftBadgeType": "match", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "betaReducePreviewBefore", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "numLeafNodes": 3, + "containerState": "stepped", + "previouslyChangedExpressionState": "betaReducePreviewBefore", + "matchExists": true, + "activePriority": 1 + } + ], + "speed": 1, + "hideControls": true, + "explanationsVisibility": "visible", + "hidePriorities": false, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": false, + "hideFuncUnboundBadgeOnExplanation": false, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "showBottomProgressBar": false +} diff --git a/src/lib/runners/iwxm.json b/src/lib/runners/iwxm.json new file mode 100644 index 000000000..265f99298 --- /dev/null +++ b/src/lib/runners/iwxm.json @@ -0,0 +1,261 @@ +{ + "expressionContainers": [ + { + "expression": { + "arg": { + "name": "d", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "c", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "active", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "previouslyChangedExpressionState": "active", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 2 + }, + { + "expression": { + "arg": { + "name": "d", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "c", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "showFuncBound", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "previouslyChangedExpressionState": "showFuncBound", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 2 + }, + { + "expression": { + "arg": { + "name": "d", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "highlighted", + "topLeftBadgeType": "unmatch", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "c", + "highlightType": "highlighted", + "topLeftBadgeType": "unmatch", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "betaReducePreviewBefore", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "previouslyChangedExpressionState": "betaReducePreviewBefore", + "matchExists": false, + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 2 + }, + { + "expression": { + "arg": { + "name": "d", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "c", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "betaReducePreviewCrossed", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "previouslyChangedExpressionState": "betaReducePreviewCrossed", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 2 + }, + { + "expression": { + "name": "c", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "previouslyChangedExpressionState": "default", + "activePriority": 1, + "containerState": "done", + "numLeafNodes": 1 + } + ], + "speed": 1, + "hideControls": false, + "explanationsVisibility": "hiddenInitialPausedOnly", + "hidePriorities": false, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": false, + "hideFuncUnboundBadgeOnExplanation": true, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "showBottomProgressBar": false +} diff --git a/src/lib/runners/nefh.json b/src/lib/runners/nefh.json new file mode 100644 index 000000000..02afa3cb2 --- /dev/null +++ b/src/lib/runners/nefh.json @@ -0,0 +1,111 @@ +{ + "expressionContainers": [ + { + "expression": { + "arg": { + "name": "d", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "c", + "highlightType": "betaReduceCallArgHighlighted", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "c", + "highlightType": "highlighted", + "topLeftBadgeType": "betaReduced", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "betaReducePreviewAfter", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "numLeafNodes": 3, + "containerState": "stepped", + "previouslyChangedExpressionState": "betaReducePreviewAfter", + "activePriority": 1 + } + ], + "speed": 1, + "hideControls": true, + "explanationsVisibility": "visible", + "hidePriorities": false, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": false, + "hideFuncUnboundBadgeOnExplanation": false, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "showBottomProgressBar": false +} diff --git a/src/lib/runners/qwtn.json b/src/lib/runners/qwtn.json new file mode 100644 index 000000000..e6bb2f8a0 --- /dev/null +++ b/src/lib/runners/qwtn.json @@ -0,0 +1,111 @@ +{ + "expressionContainers": [ + { + "expression": { + "arg": { + "name": "d", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "c", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "c", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "betaReducePreviewCrossed", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "numLeafNodes": 3, + "containerState": "stepped", + "previouslyChangedExpressionState": "betaReducePreviewCrossed", + "activePriority": 1 + } + ], + "speed": 1, + "hideControls": true, + "explanationsVisibility": "visible", + "hidePriorities": false, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": false, + "hideFuncUnboundBadgeOnExplanation": false, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "showBottomProgressBar": false +} From 871c181e1392f047b237e6345780a0787a3cd588 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Tue, 5 Nov 2019 17:42:39 -0800 Subject: [PATCH 55/83] Continue with 6 --- pages/emojis-functional-programming.tsx | 57 +- scripts/lib/initialExpressionContainers.ts | 32 + scripts/lib/runnerConfigs.ts | 14 + src/components/Alert.tsx | 39 +- src/components/Runners/Hyvj.tsx | 12 + src/components/Runners/Xhje.tsx | 12 + src/components/Runners/fakeIndex.ts | 2 + src/components/Runners/index.ts | 2 + src/lib/runners/hyvj.json | 597 ++++++++++++++ src/lib/runners/xhje.json | 918 +++++++++++++++++++++ 10 files changed, 1649 insertions(+), 36 deletions(-) create mode 100644 src/components/Runners/Hyvj.tsx create mode 100644 src/components/Runners/Xhje.tsx create mode 100644 src/lib/runners/hyvj.json create mode 100644 src/lib/runners/xhje.json diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 04f1431a5..c340739ac 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -767,7 +767,7 @@ sushi => 'pizza'`} Just like the JS code, the emoji puzzle ended up with a{' '} after running it.

- +

What we learned so far: Simple JS code like below can be visually represented using emoji puzzles. @@ -1006,7 +1006,7 @@ sushi => 'pizza'`} <> Guess what the result would be
- before pressing the button. + before pressing the button! } >{`(sushi => sandwich => sushi)( @@ -1157,7 +1157,7 @@ sushi => 'pizza'`} complex functional JS expressions can be represented using an emoji puzzle.

- +

What we learned so far: Complex functional JS expressions can be represented using an emoji puzzle. @@ -1180,9 +1180,33 @@ sushi => 'pizza'`}

- More examples (optional read): Here are more examples - that might be helpful for your understanding. Again, remember - that: + More examples (optional read): Here’s another example + that might be helpful for your understanding. Check out the + following JS expression, and{' '} + + try to guess what the result would be before pressing the{' '} + button. + +

+ + Guess what the result would be +
+ before pressing the button! + + } + >{`(friedPotatoes => pizza => pizza)( + spaghetti => spaghetti +)('salad')`}
+

+ The result was 'salad'. Now, here’s the + equivalent emoji puzzle below.{' '} + + Try pressing . + {' '} + Again, remember that:

    @@ -1195,22 +1219,17 @@ sushi => 'pizza'`} and you can ignore them.
+ Equivalent emoji puzzle: +

- You can{' '} + Next, here’s slightly different JS code.{' '} - press - {' '} - on each example to see the evaluation visualization.{' '} - {' '} + There’s an extra pair of parenthesis around{' '} + (spaghetti => spaghetti)('salad'), so + this will be evaluated first. +

- Functional JS code:} - >{`(friedPotatoes => pizza => pizza)( - 'spaghetti' -)('salad')`} - Equivalent emoji puzzle: +
diff --git a/scripts/lib/initialExpressionContainers.ts b/scripts/lib/initialExpressionContainers.ts index 6adf5bd75..79ba2ee99 100644 --- a/scripts/lib/initialExpressionContainers.ts +++ b/scripts/lib/initialExpressionContainers.ts @@ -168,6 +168,38 @@ export const epon = initializeExpressionContainer([ 'h' ]) +export const mfca = initializeExpressionContainer([ + { + arg: 'e', + body: { + arg: 'f', + body: 'f' + } + }, + { + arg: 'g', + body: 'g' + }, + 'h' +]) + +export const csqx = initializeExpressionContainer([ + { + arg: 'e', + body: { + arg: 'f', + body: 'f' + } + }, + [ + { + arg: 'g', + body: 'g' + }, + 'h' + ] +]) + export const lqti = initializeExpressionContainer([ { arg: 'b', diff --git a/scripts/lib/runnerConfigs.ts b/scripts/lib/runnerConfigs.ts index 2ad3f48af..45f51de47 100644 --- a/scripts/lib/runnerConfigs.ts +++ b/scripts/lib/runnerConfigs.ts @@ -448,6 +448,20 @@ export const hdxc: ExpressionRunnerShorthandConfig = { skipToTheEnd: false } +export const xhje: ExpressionRunnerShorthandConfig = { + runner: 'runButtonOnly', + initialExpressionContainer: initialExpressionContainers.mfca, + showPriorities: true, + skipToTheEnd: false +} + +export const hyvj: ExpressionRunnerShorthandConfig = { + runner: 'runButtonOnly', + initialExpressionContainer: initialExpressionContainers.csqx, + showPriorities: true, + skipToTheEnd: false +} + export const hykj: ExpressionRunnerShorthandConfig = { runner: 'runButtonOnly', skipToTheEnd: false, diff --git a/src/components/Alert.tsx b/src/components/Alert.tsx index 6c25e4cdb..27e662a7f 100644 --- a/src/components/Alert.tsx +++ b/src/components/Alert.tsx @@ -1,6 +1,7 @@ /** @jsx jsx */ import { css, jsx } from '@emotion/core' import { ns, radii, colors, spaces } from 'src/lib/theme' +import { CardColorContext } from 'src/components/Card' export const alertSpacing = css` padding: ${spaces(0.75)} ${spaces(0.75)}; @@ -14,27 +15,31 @@ export const alertSpacing = css` export interface AlertProps { children: React.ReactNode - backgroundColor: 'yellow' | 'red' | 'brown' | 'blue' + backgroundColor: 'yellow' | 'pink' | 'brown' | 'blue' } const Alert = ({ children, backgroundColor }: AlertProps) => ( -
- {children} -
+
+ {children} +
+ ) Alert.defaultProps = { diff --git a/src/components/Runners/Hyvj.tsx b/src/components/Runners/Hyvj.tsx new file mode 100644 index 000000000..73a1d8445 --- /dev/null +++ b/src/components/Runners/Hyvj.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/hyvj.json' + +const Hyvj = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Hyvj diff --git a/src/components/Runners/Xhje.tsx b/src/components/Runners/Xhje.tsx new file mode 100644 index 000000000..7664bcb04 --- /dev/null +++ b/src/components/Runners/Xhje.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/xhje.json' + +const Xhje = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Xhje diff --git a/src/components/Runners/fakeIndex.ts b/src/components/Runners/fakeIndex.ts index 9959d7873..b33836cd3 100644 --- a/src/components/Runners/fakeIndex.ts +++ b/src/components/Runners/fakeIndex.ts @@ -59,6 +59,8 @@ export { default as Uvmv } from 'src/components/FakeRunner' export { default as Mutg } from 'src/components/FakeRunner' export { default as Hvqh } from 'src/components/FakeRunner' export { default as Hdxc } from 'src/components/FakeRunner' +export { default as Xhje } from 'src/components/FakeRunner' +export { default as Hyvj } from 'src/components/FakeRunner' export { default as Hykj } from 'src/components/FakeRunner' export { default as Iatt } from 'src/components/FakeRunner' export { default as Ilpo } from 'src/components/FakeRunner' diff --git a/src/components/Runners/index.ts b/src/components/Runners/index.ts index 2f9443768..23d72b8fa 100644 --- a/src/components/Runners/index.ts +++ b/src/components/Runners/index.ts @@ -59,6 +59,8 @@ export { default as Uvmv } from 'src/components/Runners/Uvmv' export { default as Mutg } from 'src/components/Runners/Mutg' export { default as Hvqh } from 'src/components/Runners/Hvqh' export { default as Hdxc } from 'src/components/Runners/Hdxc' +export { default as Xhje } from 'src/components/Runners/Xhje' +export { default as Hyvj } from 'src/components/Runners/Hyvj' export { default as Hykj } from 'src/components/Runners/Hykj' export { default as Iatt } from 'src/components/Runners/Iatt' export { default as Ilpo } from 'src/components/Runners/Ilpo' diff --git a/src/lib/runners/hyvj.json b/src/lib/runners/hyvj.json new file mode 100644 index 000000000..a7320137c --- /dev/null +++ b/src/lib/runners/hyvj.json @@ -0,0 +1,597 @@ +{ + "expressionContainers": [ + { + "expression": { + "arg": { + "arg": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1, + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "g", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 2 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "g", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 1 + }, + "func": { + "arg": { + "name": "e", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "numLeafNodes": 3, + "containerState": "ready", + "previouslyChangedExpressionState": "default" + }, + { + "expression": { + "arg": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1, + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "g", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 2 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "g", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 1 + }, + "func": { + "arg": { + "name": "e", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "active", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "previouslyChangedExpressionState": "active", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 3 + }, + { + "expression": { + "arg": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1, + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "g", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 2 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "g", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 1 + }, + "func": { + "arg": { + "name": "e", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "showFuncUnbound", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "previouslyChangedExpressionState": "showFuncUnbound", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 3 + }, + { + "expression": { + "arg": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1, + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "g", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 2 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "g", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 1 + }, + "func": { + "arg": { + "name": "e", + "highlightType": "highlighted", + "topLeftBadgeType": "unmatch", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "highlighted", + "topLeftBadgeType": "unmatch", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "betaReducePreviewBefore", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "previouslyChangedExpressionState": "betaReducePreviewBefore", + "matchExists": false, + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 3 + }, + { + "expression": { + "arg": { + "arg": { + "name": "h", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1, + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "g", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 2 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "g", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 1 + }, + "func": { + "arg": { + "name": "e", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "betaReducePreviewCrossed", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "previouslyChangedExpressionState": "betaReducePreviewCrossed", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 3 + }, + { + "expression": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "previouslyChangedExpressionState": "default", + "activePriority": 1, + "containerState": "done", + "numLeafNodes": 1 + } + ], + "speed": 1, + "hideControls": false, + "explanationsVisibility": "hiddenInitialPausedOnly", + "hidePriorities": false, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": false, + "hideFuncUnboundBadgeOnExplanation": true, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "showBottomProgressBar": false +} diff --git a/src/lib/runners/xhje.json b/src/lib/runners/xhje.json new file mode 100644 index 000000000..ec01b50d7 --- /dev/null +++ b/src/lib/runners/xhje.json @@ -0,0 +1,918 @@ +{ + "expressionContainers": [ + { + "expression": { + "arg": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "arg": { + "name": "g", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "g", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "func": { + "arg": { + "name": "e", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "numLeafNodes": 3, + "containerState": "ready", + "previouslyChangedExpressionState": "default" + }, + { + "expression": { + "arg": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "arg": { + "name": "g", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "g", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "func": { + "arg": { + "name": "e", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "active", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "numLeafNodes": 3, + "containerState": "stepped", + "previouslyChangedExpressionState": "active", + "activePriority": 1 + }, + { + "expression": { + "arg": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "arg": { + "name": "g", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "g", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "func": { + "arg": { + "name": "e", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "showFuncUnbound", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "numLeafNodes": 3, + "containerState": "stepped", + "previouslyChangedExpressionState": "showFuncUnbound", + "activePriority": 1 + }, + { + "expression": { + "arg": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "arg": { + "name": "g", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "g", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "func": { + "arg": { + "name": "e", + "highlightType": "highlighted", + "topLeftBadgeType": "unmatch", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "highlighted", + "topLeftBadgeType": "unmatch", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "betaReducePreviewBefore", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "numLeafNodes": 3, + "containerState": "stepped", + "previouslyChangedExpressionState": "betaReducePreviewBefore", + "matchExists": false, + "activePriority": 1 + }, + { + "expression": { + "arg": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "arg": { + "name": "g", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "g", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "func": { + "arg": { + "name": "e", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "betaReducePreviewCrossed", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "numLeafNodes": 3, + "containerState": "stepped", + "previouslyChangedExpressionState": "betaReducePreviewCrossed", + "activePriority": 1 + }, + { + "expression": { + "arg": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "numLeafNodes": 2, + "containerState": "ready", + "previouslyChangedExpressionState": "default", + "activePriority": 1 + }, + { + "expression": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "active", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "previouslyChangedExpressionState": "active", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 2 + }, + { + "expression": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "showFuncBound", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "previouslyChangedExpressionState": "showFuncBound", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 2 + }, + { + "expression": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "f", + "highlightType": "highlighted", + "topLeftBadgeType": "match", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "highlighted", + "topLeftBadgeType": "match", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "betaReducePreviewBefore", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "previouslyChangedExpressionState": "betaReducePreviewBefore", + "matchExists": true, + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 2 + }, + { + "expression": { + "arg": { + "name": "h", + "highlightType": "betaReduceCallArgHighlighted", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "h", + "highlightType": "highlighted", + "topLeftBadgeType": "betaReduced", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "betaReducePreviewAfter", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "previouslyChangedExpressionState": "betaReducePreviewAfter", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 2 + }, + { + "expression": { + "arg": { + "name": "h", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "f", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "betaReducePreviewCrossed", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "previouslyChangedExpressionState": "betaReducePreviewCrossed", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 2 + }, + { + "expression": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "previouslyChangedExpressionState": "default", + "activePriority": 1, + "containerState": "done", + "numLeafNodes": 1 + } + ], + "speed": 1, + "hideControls": false, + "explanationsVisibility": "hiddenInitialPausedOnly", + "hidePriorities": false, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": false, + "hideFuncUnboundBadgeOnExplanation": true, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "showBottomProgressBar": false +} From 8bcaa54156e67b27dc3953bf5b459f113495c90d Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Tue, 5 Nov 2019 17:50:58 -0800 Subject: [PATCH 56/83] Remove word count --- pages/emojis-functional-programming.tsx | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index c340739ac..603fb2790 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -53,8 +53,6 @@ import VariableShadeContext from 'src/components/VariableShadeContext' const hackerNewsLink = `` const numSteps = 100 -const wordCount = 10000 -const minRead = wordCount / 200 const date = DateTime.fromISO('2019-11-08T12:00:00Z') // const dateString = date @@ -560,12 +558,9 @@ export default () => { Combinator. - This article is long—it’s about{' '} - {wordCount.toLocaleString('en-US')} words ( - {minRead} min. read). To help you track how far along - you are in the article, I’ll show a “step” number above each - subheading. There are a total of {numSteps} steps in - this article. + To help you track how far along you are in the article, I’ll show + a “step” number above each subheading. There are a + total of {numSteps} steps in this article. If you decide to read later: I’d appreciate it if you From d1c8858f1530a29efe659f21815b862b431773c1 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Tue, 5 Nov 2019 19:17:45 -0800 Subject: [PATCH 57/83] Support applicative order --- scripts/lib/buildExpressionContainers.ts | 17 +- ...uildExpressionRunnerConfigFromShorthand.ts | 11 +- .../lib/expressionRunnerShorthandConfig.ts | 8 +- scripts/lib/findNextExecutableAndParent.ts | 124 +++- scripts/lib/prioritizeExpression.ts | 154 +++-- scripts/lib/prioritizeExpressionContainer.ts | 28 +- scripts/lib/runnerConfigs.ts | 3 +- scripts/lib/stepExpressionContainer.ts | 20 +- src/lib/runners/hyvj.json | 628 +++++++++++++++--- src/types/ExpressionRunnerTypes.ts | 1 + 10 files changed, 819 insertions(+), 175 deletions(-) diff --git a/scripts/lib/buildExpressionContainers.ts b/scripts/lib/buildExpressionContainers.ts index 5b13b2bd9..ddf246df4 100644 --- a/scripts/lib/buildExpressionContainers.ts +++ b/scripts/lib/buildExpressionContainers.ts @@ -1,6 +1,7 @@ import { ExpressionRunnerConfig } from 'scripts/lib/buildExpressionRunnerConfigFromShorthand' import { isContainerWithState } from 'src/lib/expressionContainerGuards' import stepExpressionContainer from 'scripts/lib/stepExpressionContainer' +import prioritizeExpressionContainer from 'scripts/lib/prioritizeExpressionContainer' import { ExpressionContainer, SteppedExpressionContainer @@ -18,15 +19,25 @@ const buildExpressionContainers = ({ hideControls, lastAllowedExpressionState, lastAllowedExpressionStateAfterIterations, + applicativeOrder, hideRunButton }: ExpressionRunnerConfig): readonly ExpressionContainer[] => { if (initialExpressionContainer) { let currentExpressionContainer: SteppedExpressionContainer = initialExpressionContainer + + if (applicativeOrder) { + currentExpressionContainer = prioritizeExpressionContainer( + initialExpressionContainer, + applicativeOrder + ) + } + const results: ExpressionContainer[] = [] const stepOptions = { showAllShowSteps, skipAlphaConvert, - skipActive + skipActive, + applicativeOrder } initializeInstructions.forEach(initializeInstruction => { @@ -128,7 +139,9 @@ const buildExpressionContainers = ({ return results } } else if (initialExpressionContainers) { - return initialExpressionContainers + return initialExpressionContainers.map(x => + applicativeOrder ? prioritizeExpressionContainer(x, applicativeOrder) : x + ) } else { throw new Error() } diff --git a/scripts/lib/buildExpressionRunnerConfigFromShorthand.ts b/scripts/lib/buildExpressionRunnerConfigFromShorthand.ts index a9a4c460c..e006df226 100644 --- a/scripts/lib/buildExpressionRunnerConfigFromShorthand.ts +++ b/scripts/lib/buildExpressionRunnerConfigFromShorthand.ts @@ -8,13 +8,15 @@ import { isExpressionRunnerRunButtonOnlyConfig, isExpressionRunnerSingleStepConfig } from 'scripts/lib/expressionRunnerShorthandConfig' -import { ExpressionContainer } from 'src/types/ExpressionContainerTypes' +import { + ExpressionContainer, + SteppedExpressionContainer +} from 'src/types/ExpressionContainerTypes' import { InitializeInstruction, ExpressionRunnerContextProps, expressionRunnerContextDefault } from 'src/types/ExpressionRunnerTypes' -import { SteppedExpressionContainer } from 'src/types/ExpressionContainerTypes' import { ExpressionRunnerProps } from 'src/types/ExpressionRunnerTypes' export interface ExpressionRunnerConfig { @@ -42,6 +44,7 @@ export interface ExpressionRunnerConfig { highlightFunctions: boolean convert?: ExpressionRunnerProps['convert'] crossed?: boolean + applicativeOrder?: boolean } const expressionRunnerDefaults = { @@ -114,6 +117,7 @@ const buildExpressionRunnerConfigFromShorthand = ( initialState, isDone, skipAlphaConvert, + applicativeOrder, skipActive, showDefaultAndActiveOnly, nextIterations, @@ -139,6 +143,7 @@ const buildExpressionRunnerConfigFromShorthand = ( showAllShowSteps, highlightOverridesCallArgAndFuncUnboundOnly, skipAlphaConvert, + applicativeOrder, skipActive, showDefaultAndActiveOnly, bottomRightBadgeOverrides, @@ -165,6 +170,7 @@ const buildExpressionRunnerConfigFromShorthand = ( showAllShowSteps, speed, skipAlphaConvert, + applicativeOrder, skipActive, showDefaultAndActiveOnly, highlightOverrides, @@ -183,6 +189,7 @@ const buildExpressionRunnerConfigFromShorthand = ( hideFuncUnboundBadgeOnExplanation, skipToTheEnd, skipAlphaConvert, + applicativeOrder, skipActive, showDefaultAndActiveOnly, explanationsVisibility: diff --git a/scripts/lib/expressionRunnerShorthandConfig.ts b/scripts/lib/expressionRunnerShorthandConfig.ts index 0596da39f..ae6dce22b 100644 --- a/scripts/lib/expressionRunnerShorthandConfig.ts +++ b/scripts/lib/expressionRunnerShorthandConfig.ts @@ -1,6 +1,8 @@ -import { ExpressionContainer } from 'src/types/ExpressionContainerTypes' +import { + ExpressionContainer, + SteppedExpressionContainer +} from 'src/types/ExpressionContainerTypes' import { ExpressionRunnerProps } from 'src/types/ExpressionRunnerTypes' -import { SteppedExpressionContainer } from 'src/types/ExpressionContainerTypes' export const expressionRunnerSimpleConfigDefault = { isDone: false, @@ -16,6 +18,7 @@ interface ExpressionRunnerSimpleConfig { initialState?: ExpressionContainer['previouslyChangedExpressionState'] isDone?: boolean skipAlphaConvert?: boolean + applicativeOrder?: boolean skipActive?: boolean showDefaultAndActiveOnly?: boolean nextIterations?: number @@ -65,6 +68,7 @@ interface ExpressionRunnerRunButtonOnlyConfig { showAllShowSteps?: ExpressionRunnerProps['showAllShowSteps'] speed?: number skipAlphaConvert?: boolean + applicativeOrder?: boolean skipActive?: boolean showDefaultAndActiveOnly?: boolean highlightOverrides?: ExpressionRunnerProps['highlightOverrides'] diff --git a/scripts/lib/findNextExecutableAndParent.ts b/scripts/lib/findNextExecutableAndParent.ts index ee5359d62..a5e56a04a 100644 --- a/scripts/lib/findNextExecutableAndParent.ts +++ b/scripts/lib/findNextExecutableAndParent.ts @@ -17,6 +17,7 @@ import { BinaryExpression, ExecutableBinary } from 'src/types/ExpressionTypes' +import { StepOptions } from 'scripts/lib/stepExpressionContainer' export interface FindResult { readonly expression?: @@ -42,7 +43,8 @@ function helper({ callParent, callParentKey, binaryParent, - binaryParentKey + binaryParentKey, + applicativeOrder }: { expression: CallExpression | ConditionalExpression | BinaryExpression conditionalParent?: ConditionalExpression @@ -50,16 +52,19 @@ function helper({ callParent?: CallExpression callParentKey?: 'func' | 'arg' binaryParentKey?: 'first' | 'second' + applicativeOrder?: boolean }): FindResult { if (isCall(expression)) { - if (isExecutableCall(expression)) { - return { - expression, - callParent, - callParentKey, - binaryParentKey, - conditionalParent, - binaryParent + if (!applicativeOrder) { + if (isExecutableCall(expression)) { + return { + expression, + callParent, + callParentKey, + binaryParentKey, + conditionalParent, + binaryParent + } } } @@ -67,7 +72,8 @@ function helper({ const result: FindResult = helper({ expression: expression.func, callParentKey: 'func', - callParent: expression + callParent: expression, + applicativeOrder }) if (result.expression) { return result @@ -78,21 +84,37 @@ function helper({ const result: FindResult = helper({ expression: expression.arg, callParentKey: 'arg', - callParent: expression + callParent: expression, + applicativeOrder }) if (result.expression) { return result } } + + if (applicativeOrder) { + if (isExecutableCall(expression)) { + return { + expression, + callParent, + callParentKey, + binaryParentKey, + conditionalParent, + binaryParent + } + } + } } else if (isConditional(expression)) { - if (isExecutableConditional(expression)) { - return { - expression, - callParent, - callParentKey, - binaryParentKey, - conditionalParent, - binaryParent + if (!applicativeOrder) { + if (isExecutableConditional(expression)) { + return { + expression, + callParent, + callParentKey, + binaryParentKey, + conditionalParent, + binaryParent + } } } @@ -103,21 +125,37 @@ function helper({ ) { const result: FindResult = helper({ expression: expression.condition, - conditionalParent: expression + conditionalParent: expression, + applicativeOrder }) if (result.expression) { return result } } + + if (applicativeOrder) { + if (isExecutableConditional(expression)) { + return { + expression, + callParent, + callParentKey, + binaryParentKey, + conditionalParent, + binaryParent + } + } + } } else { - if (isExecutableBinary(expression)) { - return { - expression, - callParent, - callParentKey, - binaryParentKey, - conditionalParent, - binaryParent + if (!applicativeOrder) { + if (isExecutableBinary(expression)) { + return { + expression, + callParent, + callParentKey, + binaryParentKey, + conditionalParent, + binaryParent + } } } @@ -129,7 +167,8 @@ function helper({ const result: FindResult = helper({ expression: expression.first, binaryParent: expression, - binaryParentKey: 'first' + binaryParentKey: 'first', + applicativeOrder }) if (result.expression) { return result @@ -144,12 +183,26 @@ function helper({ const result: FindResult = helper({ expression: expression.second, binaryParent: expression, - binaryParentKey: 'second' + binaryParentKey: 'second', + applicativeOrder }) if (result.expression) { return result } } + + if (applicativeOrder) { + if (isExecutableBinary(expression)) { + return { + expression, + callParent, + callParentKey, + binaryParentKey, + conditionalParent, + binaryParent + } + } + } } const notFound: FindResult = {} @@ -157,11 +210,15 @@ function helper({ } export default function findNextExecutableAndParent( - expression: Expression + expression: Expression, + stepOptions: StepOptions ): FindResult { const notFound: FindResult = {} if (isCall(expression) || isConditional(expression) || isBinary(expression)) { - return helper({ expression }) + return helper({ + expression, + applicativeOrder: stepOptions.applicativeOrder + }) } else if (isFunction(expression)) { let currentExpression: Expression = expression let previousExpression: FunctionExpression | null = null @@ -175,7 +232,8 @@ export default function findNextExecutableAndParent( isBinary(currentExpression) ) { const helperResult = helper({ - expression: currentExpression + expression: currentExpression, + applicativeOrder: stepOptions.applicativeOrder }) if ( helperResult.callParent || diff --git a/scripts/lib/prioritizeExpression.ts b/scripts/lib/prioritizeExpression.ts index 59eb2c860..3fce08d3d 100644 --- a/scripts/lib/prioritizeExpression.ts +++ b/scripts/lib/prioritizeExpression.ts @@ -16,10 +16,12 @@ import populateMaxNestedFunctionDepths from 'scripts/lib/populateMaxNestedFuncti function prioritizeCallExpressionHelper({ expression, - priority + priority, + applicativeOrder }: { expression: E priority: number + applicativeOrder?: boolean }): { expression: E maxDescendantPriority: number @@ -38,17 +40,20 @@ function prioritizeCallExpressionHelper({ if (isCall(expression.func)) { funcResult = prioritizeCallExpressionHelper({ expression: expression.func, - priority + priority, + applicativeOrder }) } else if (isConditional(expression.func)) { funcResult = prioritizeConditionalExpressionHelper({ expression: expression.func, - priority + priority, + applicativeOrder }) } else { funcResult = prioritizeBinaryExpressionHelper({ expression: expression.func, - priority + priority, + applicativeOrder }) } @@ -56,7 +61,7 @@ function prioritizeCallExpressionHelper({ currentPriority = funcResult.maxDescendantPriority + 1 maxDescendantPriority = currentPriority } else { - newFunc = prioritizeExpressionHelper(expression.func) + newFunc = prioritizeExpressionHelper(expression.func, applicativeOrder) } if ( @@ -68,24 +73,27 @@ function prioritizeCallExpressionHelper({ if (isCall(expression.arg)) { argResult = prioritizeCallExpressionHelper({ expression: expression.arg, - priority: currentPriority + 1 + priority: currentPriority + (applicativeOrder ? 0 : 1), + applicativeOrder }) } else if (isConditional(expression.arg)) { argResult = prioritizeConditionalExpressionHelper({ expression: expression.arg, - priority: currentPriority + 1 + priority: currentPriority + (applicativeOrder ? 0 : 1), + applicativeOrder }) } else { argResult = prioritizeBinaryExpressionHelper({ expression: expression.arg, - priority: currentPriority + 1 + priority: currentPriority + (applicativeOrder ? 0 : 1), + applicativeOrder }) } newArg = argResult.expression maxDescendantPriority = argResult.maxDescendantPriority } else { - newArg = prioritizeExpressionHelper(expression.arg) + newArg = prioritizeExpressionHelper(expression.arg, applicativeOrder) } return { @@ -93,7 +101,14 @@ function prioritizeCallExpressionHelper({ ...expression, func: newFunc, arg: newArg, - priority: currentPriority + priority: + currentPriority + + (applicativeOrder && + (isCall(expression.arg) || + isConditional(expression.arg) || + isBinary(expression.arg)) + ? 1 + : 0) }, maxDescendantPriority } @@ -101,10 +116,12 @@ function prioritizeCallExpressionHelper({ function prioritizeBinaryExpressionHelper({ expression, - priority + priority, + applicativeOrder }: { expression: E priority: number + applicativeOrder?: boolean }): { expression: E maxDescendantPriority: number @@ -123,17 +140,20 @@ function prioritizeBinaryExpressionHelper({ if (isCall(expression.first)) { funcResult = prioritizeCallExpressionHelper({ expression: expression.first, - priority + priority, + applicativeOrder }) } else if (isConditional(expression.first)) { funcResult = prioritizeConditionalExpressionHelper({ expression: expression.first, - priority + priority, + applicativeOrder }) } else { funcResult = prioritizeBinaryExpressionHelper({ expression: expression.first, - priority + priority, + applicativeOrder }) } @@ -141,7 +161,7 @@ function prioritizeBinaryExpressionHelper({ currentPriority = funcResult.maxDescendantPriority + 1 maxDescendantPriority = currentPriority } else { - newFirst = prioritizeExpressionHelper(expression.first) + newFirst = prioritizeExpressionHelper(expression.first, applicativeOrder) } if ( @@ -153,24 +173,27 @@ function prioritizeBinaryExpressionHelper({ if (isCall(expression.second)) { argResult = prioritizeCallExpressionHelper({ expression: expression.second, - priority: currentPriority + 1 + priority: currentPriority + (applicativeOrder ? 0 : 1), + applicativeOrder }) } else if (isConditional(expression.second)) { argResult = prioritizeConditionalExpressionHelper({ expression: expression.second, - priority: currentPriority + 1 + priority: currentPriority + (applicativeOrder ? 0 : 1), + applicativeOrder }) } else { argResult = prioritizeBinaryExpressionHelper({ expression: expression.second, - priority: currentPriority + 1 + priority: currentPriority + (applicativeOrder ? 0 : 1), + applicativeOrder }) } newSecond = argResult.expression maxDescendantPriority = argResult.maxDescendantPriority } else { - newSecond = prioritizeExpressionHelper(expression.second) + newSecond = prioritizeExpressionHelper(expression.second, applicativeOrder) } return { @@ -178,7 +201,14 @@ function prioritizeBinaryExpressionHelper({ ...expression, first: newFirst, second: newSecond, - priority: currentPriority + priority: + currentPriority + + (applicativeOrder && + (isCall(expression.second) || + isConditional(expression.second) || + isBinary(expression.second)) + ? 1 + : 0) }, maxDescendantPriority } @@ -188,10 +218,12 @@ function prioritizeConditionalExpressionHelper< E extends ConditionalExpression >({ expression, - priority + priority, + applicativeOrder }: { expression: E priority: number + applicativeOrder?: boolean }): { expression: E maxDescendantPriority: number @@ -211,24 +243,30 @@ function prioritizeConditionalExpressionHelper< if (isCall(expression.condition)) { conditionResult = prioritizeCallExpressionHelper({ expression: expression.condition, - priority + priority, + applicativeOrder }) } else if (isConditional(expression.condition)) { conditionResult = prioritizeConditionalExpressionHelper({ expression: expression.condition, - priority + priority, + applicativeOrder }) } else { conditionResult = prioritizeBinaryExpressionHelper({ expression: expression.condition, - priority + priority, + applicativeOrder }) } newCondition = conditionResult.expression currentPriority = conditionResult.maxDescendantPriority + 1 maxDescendantPriority = currentPriority } else { - newCondition = prioritizeExpressionHelper(expression.condition) + newCondition = prioritizeExpressionHelper( + expression.condition, + applicativeOrder + ) } if ( @@ -240,23 +278,29 @@ function prioritizeConditionalExpressionHelper< if (isCall(expression.trueCase)) { trueCaseResult = prioritizeCallExpressionHelper({ expression: expression.trueCase, - priority: currentPriority + 1 + priority: currentPriority + (applicativeOrder ? 0 : 1), + applicativeOrder }) } else if (isConditional(expression.trueCase)) { trueCaseResult = prioritizeConditionalExpressionHelper({ expression: expression.trueCase, - priority: currentPriority + 1 + priority: currentPriority + (applicativeOrder ? 0 : 1), + applicativeOrder }) } else { trueCaseResult = prioritizeBinaryExpressionHelper({ expression: expression.trueCase, - priority: currentPriority + 1 + priority: currentPriority + (applicativeOrder ? 0 : 1), + applicativeOrder }) } newTrueCase = trueCaseResult.expression maxDescendantPriority = trueCaseResult.maxDescendantPriority } else { - newTrueCase = prioritizeExpressionHelper(expression.trueCase) + newTrueCase = prioritizeExpressionHelper( + expression.trueCase, + applicativeOrder + ) } if ( @@ -268,23 +312,29 @@ function prioritizeConditionalExpressionHelper< if (isCall(expression.falseCase)) { falseCaseResult = prioritizeCallExpressionHelper({ expression: expression.falseCase, - priority: currentPriority + 1 + priority: currentPriority + (applicativeOrder ? 0 : 1), + applicativeOrder }) } else if (isConditional(expression.falseCase)) { falseCaseResult = prioritizeConditionalExpressionHelper({ expression: expression.falseCase, - priority: currentPriority + 1 + priority: currentPriority + (applicativeOrder ? 0 : 1), + applicativeOrder }) } else { falseCaseResult = prioritizeBinaryExpressionHelper({ expression: expression.falseCase, - priority: currentPriority + 1 + priority: currentPriority + (applicativeOrder ? 0 : 1), + applicativeOrder }) } newFalseCase = falseCaseResult.expression maxDescendantPriority = falseCaseResult.maxDescendantPriority } else { - newFalseCase = prioritizeExpressionHelper(expression.falseCase) + newFalseCase = prioritizeExpressionHelper( + expression.falseCase, + applicativeOrder + ) } return { @@ -293,14 +343,28 @@ function prioritizeConditionalExpressionHelper< condition: newCondition, trueCase: newTrueCase, falseCase: newFalseCase, - priority: currentPriority + priority: + currentPriority + + (applicativeOrder && + (isCall(expression.falseCase) || + isConditional(expression.falseCase) || + isBinary(expression.falseCase)) + ? 1 + : 0) + + (applicativeOrder && + (isCall(expression.trueCase) || + isConditional(expression.trueCase) || + isBinary(expression.trueCase)) + ? 1 + : 0) }, maxDescendantPriority } } function prioritizeExpressionHelper( - expression: E + expression: E, + applicativeOrder?: boolean ): E { if (isVariable(expression)) { return { @@ -311,28 +375,31 @@ function prioritizeExpressionHelper( } else if (isCall(expression)) { return prioritizeCallExpressionHelper({ priority: 1, - expression + expression, + applicativeOrder }).expression } else if (isFunction(expression)) { return { ...expression, - arg: prioritizeExpressionHelper(expression.arg), - body: prioritizeExpressionHelper(expression.body) + arg: prioritizeExpressionHelper(expression.arg, applicativeOrder), + body: prioritizeExpressionHelper(expression.body, applicativeOrder) } } else if (isConditional(expression)) { return prioritizeConditionalExpressionHelper({ priority: 1, - expression + expression, + applicativeOrder }).expression } else if (isRepeat(expression)) { return { ...expression, - child: prioritizeExpressionHelper(expression.child) + child: prioritizeExpressionHelper(expression.child, applicativeOrder) } } else if (isBinary(expression)) { return prioritizeBinaryExpressionHelper({ priority: 1, - expression + expression, + applicativeOrder }).expression } else { throw new Error() @@ -426,11 +493,12 @@ function populatePriorityAggs({ } export default function prioritizeExpression( - expression: E + expression: E, + applicativeOrder?: boolean ): E { return populatePriorityAggs({ expression: populateMaxNestedFunctionDepths( - prioritizeExpressionHelper(expression) + prioritizeExpressionHelper(expression, applicativeOrder) ), argPriorityAgg: [] as number[], funcPriorityAgg: [] as number[] diff --git a/scripts/lib/prioritizeExpressionContainer.ts b/scripts/lib/prioritizeExpressionContainer.ts index 83ab02cee..6b0e86f33 100644 --- a/scripts/lib/prioritizeExpressionContainer.ts +++ b/scripts/lib/prioritizeExpressionContainer.ts @@ -1,15 +1,33 @@ import prioritizeExpression from 'scripts/lib/prioritizeExpression' -import { ContainerWithState } from 'src/types/ExpressionContainerTypes' +import { + ContainerWithState, + ExpressionContainer +} from 'src/types/ExpressionContainerTypes' import { Expression } from 'src/types/ExpressionTypes' +import { isContainerWithState } from 'src/lib/expressionContainerGuards' export default function prioritizeExpressionContainer( - expressionContainer: ContainerWithState<'needsPrioritize', E> -): ContainerWithState<'ready', E> { + expressionContainer: ContainerWithState<'done', E>, + applicativeOrder?: boolean +): ContainerWithState<'done', E> +export default function prioritizeExpressionContainer( + expressionContainer: ExpressionContainer, + applicativeOrder?: boolean +): ContainerWithState<'ready', E> +export default function prioritizeExpressionContainer( + expressionContainer: ExpressionContainer, + applicativeOrder?: boolean +) { return { ...expressionContainer, - containerState: 'ready', + containerState: isContainerWithState(expressionContainer, 'done') + ? 'done' + : 'ready', previouslyChangedExpressionState: expressionContainer.previouslyChangedExpressionState, - expression: prioritizeExpression(expressionContainer.expression) + expression: prioritizeExpression( + expressionContainer.expression, + applicativeOrder + ) } } diff --git a/scripts/lib/runnerConfigs.ts b/scripts/lib/runnerConfigs.ts index 45f51de47..48f5193a1 100644 --- a/scripts/lib/runnerConfigs.ts +++ b/scripts/lib/runnerConfigs.ts @@ -459,7 +459,8 @@ export const hyvj: ExpressionRunnerShorthandConfig = { runner: 'runButtonOnly', initialExpressionContainer: initialExpressionContainers.csqx, showPriorities: true, - skipToTheEnd: false + skipToTheEnd: false, + applicativeOrder: true } export const hykj: ExpressionRunnerShorthandConfig = { diff --git a/scripts/lib/stepExpressionContainer.ts b/scripts/lib/stepExpressionContainer.ts index 9e3c369c9..57027e138 100644 --- a/scripts/lib/stepExpressionContainer.ts +++ b/scripts/lib/stepExpressionContainer.ts @@ -47,20 +47,24 @@ import { } from 'src/types/ExpressionTypes' import prioritizeExpression from 'scripts/lib/prioritizeExpression' -interface StepOptions { +export interface StepOptions { showAllShowSteps?: boolean skipAlphaConvert?: boolean skipActive?: boolean + applicativeOrder?: boolean } const stepExpressionContainerReset = ( - e: ContainerWithState<'needsReset'> + e: ContainerWithState<'needsReset'>, + stepOptions: StepOptions ): ContainerWithState<'done'> | ContainerWithState<'ready'> => { const newContainer = prioritizeExpressionContainer( - resetExpressionContainer(e) + resetExpressionContainer(e), + stepOptions.applicativeOrder ) const nextCallExpressionAndParent = findNextExecutableAndParent( - newContainer.expression + newContainer.expression, + stepOptions ) if (nextCallExpressionAndParent.expression) { return newContainer @@ -312,7 +316,7 @@ const runStep = ( callParentKey, binaryParentKey, binaryParent - } = findNextExecutableAndParent(e.expression) + } = findNextExecutableAndParent(e.expression, stepOptions) if (!expression) { // Special case - already done to begin with return { @@ -344,7 +348,7 @@ const runStep = ( const newContainer = { expression: previouslyChangedExpressionState === 'betaReducePreviewAfter' - ? prioritizeExpression(nextExpression) + ? prioritizeExpression(nextExpression, stepOptions.applicativeOrder) : nextExpression, previouslyChangedExpressionState, matchExists, @@ -413,7 +417,7 @@ const runStep = ( ...e, expression: previouslyChangedExpressionState === 'betaReducePreviewAfter' - ? prioritizeExpression(newExpression) + ? prioritizeExpression(newExpression, stepOptions.applicativeOrder) : newExpression, containerState: 'stepped', matchExists, @@ -434,7 +438,7 @@ export default function stepExpressionContainer( const result = runStep(e, stepOptions) if (isContainerWithState(result, 'needsReset')) { - return stepExpressionContainerReset(result) + return stepExpressionContainerReset(result, stepOptions) } else { return result } diff --git a/src/lib/runners/hyvj.json b/src/lib/runners/hyvj.json index a7320137c..031a32740 100644 --- a/src/lib/runners/hyvj.json +++ b/src/lib/runners/hyvj.json @@ -10,8 +10,8 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 1, - 2 + 2, + 1 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -27,7 +27,7 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 2 + 1 ], "emphasizePriority": false, "bound": false, @@ -50,7 +50,7 @@ }, "state": "default", "type": "call", - "priority": 2, + "priority": 1, "maxNestedFunctionDepth": 1 }, "func": { @@ -62,7 +62,7 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 1 + 2 ], "emphasizePriority": false, "bound": false, @@ -101,7 +101,7 @@ }, "state": "default", "type": "call", - "priority": 1, + "priority": 2, "maxNestedFunctionDepth": 2 }, "numLeafNodes": 3, @@ -118,8 +118,8 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 1, - 2 + 2, + 1 ], "funcPriorityAgg": [], "emphasizePriority": true, @@ -135,9 +135,9 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 2 + 1 ], - "emphasizePriority": false, + "emphasizePriority": true, "bound": false, "maxNestedFunctionDepth": 0 }, @@ -156,30 +156,30 @@ "type": "function", "maxNestedFunctionDepth": 1 }, - "state": "default", + "state": "active", "type": "call", - "priority": 2, + "priority": 1, "maxNestedFunctionDepth": 1 }, "func": { "arg": { "name": "e", - "highlightType": "active", + "highlightType": "default", "topLeftBadgeType": "none", "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 1 + 2 ], - "emphasizePriority": true, + "emphasizePriority": false, "bound": false, "maxNestedFunctionDepth": 0 }, "body": { "arg": { "name": "f", - "highlightType": "active", + "highlightType": "default", "topLeftBadgeType": "none", "bottomRightBadgeType": "none", "type": "variable", @@ -191,7 +191,7 @@ }, "body": { "name": "f", - "highlightType": "active", + "highlightType": "default", "topLeftBadgeType": "none", "bottomRightBadgeType": "none", "type": "variable", @@ -207,15 +207,15 @@ "type": "function", "maxNestedFunctionDepth": 2 }, - "state": "active", + "state": "default", "type": "call", - "priority": 1, + "priority": 2, "maxNestedFunctionDepth": 2 }, - "previouslyChangedExpressionState": "active", - "activePriority": 1, + "numLeafNodes": 3, "containerState": "stepped", - "numLeafNodes": 3 + "previouslyChangedExpressionState": "active", + "activePriority": 1 }, { "expression": { @@ -227,8 +227,8 @@ "bottomRightBadgeType": "callArg", "type": "variable", "argPriorityAgg": [ - 1, - 2 + 2, + 1 ], "funcPriorityAgg": [], "emphasizePriority": true, @@ -240,13 +240,13 @@ "name": "g", "highlightType": "active", "topLeftBadgeType": "none", - "bottomRightBadgeType": "callArg", + "bottomRightBadgeType": "funcArg", "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 2 + 1 ], - "emphasizePriority": false, + "emphasizePriority": true, "bound": false, "maxNestedFunctionDepth": 0 }, @@ -254,7 +254,7 @@ "name": "g", "highlightType": "active", "topLeftBadgeType": "none", - "bottomRightBadgeType": "callArg", + "bottomRightBadgeType": "funcBound", "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [], @@ -265,32 +265,32 @@ "type": "function", "maxNestedFunctionDepth": 1 }, - "state": "default", + "state": "showFuncBound", "type": "call", - "priority": 2, + "priority": 1, "maxNestedFunctionDepth": 1 }, "func": { "arg": { "name": "e", - "highlightType": "active", + "highlightType": "default", "topLeftBadgeType": "none", - "bottomRightBadgeType": "funcArg", + "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 1 + 2 ], - "emphasizePriority": true, + "emphasizePriority": false, "bound": false, "maxNestedFunctionDepth": 0 }, "body": { "arg": { "name": "f", - "highlightType": "active", + "highlightType": "default", "topLeftBadgeType": "none", - "bottomRightBadgeType": "funcUnbound", + "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [], @@ -300,9 +300,9 @@ }, "body": { "name": "f", - "highlightType": "active", + "highlightType": "default", "topLeftBadgeType": "none", - "bottomRightBadgeType": "funcBound", + "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [], @@ -316,15 +316,15 @@ "type": "function", "maxNestedFunctionDepth": 2 }, - "state": "showFuncUnbound", + "state": "default", "type": "call", - "priority": 1, + "priority": 2, "maxNestedFunctionDepth": 2 }, - "previouslyChangedExpressionState": "showFuncUnbound", - "activePriority": 1, + "numLeafNodes": 3, "containerState": "stepped", - "numLeafNodes": 3 + "previouslyChangedExpressionState": "showFuncBound", + "activePriority": 1 }, { "expression": { @@ -336,8 +336,8 @@ "bottomRightBadgeType": "callArg", "type": "variable", "argPriorityAgg": [ - 1, - 2 + 2, + 1 ], "funcPriorityAgg": [], "emphasizePriority": true, @@ -347,23 +347,133 @@ "func": { "arg": { "name": "g", - "highlightType": "active", - "topLeftBadgeType": "none", - "bottomRightBadgeType": "callArg", + "highlightType": "highlighted", + "topLeftBadgeType": "match", + "bottomRightBadgeType": "funcArg", "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 2 + 1 ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "g", + "highlightType": "highlighted", + "topLeftBadgeType": "match", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "betaReducePreviewBefore", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "func": { + "arg": { + "name": "e", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 2 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], "emphasizePriority": false, "bound": false, "maxNestedFunctionDepth": 0 }, "body": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "numLeafNodes": 3, + "containerState": "stepped", + "previouslyChangedExpressionState": "betaReducePreviewBefore", + "matchExists": true, + "activePriority": 1 + }, + { + "expression": { + "arg": { + "arg": { + "name": "h", + "highlightType": "betaReduceCallArgHighlighted", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 2, + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { "name": "g", "highlightType": "active", "topLeftBadgeType": "none", - "bottomRightBadgeType": "callArg", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "h", + "highlightType": "highlighted", + "topLeftBadgeType": "betaReduced", + "bottomRightBadgeType": "funcBound", "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [], @@ -374,32 +484,32 @@ "type": "function", "maxNestedFunctionDepth": 1 }, - "state": "default", + "state": "betaReducePreviewAfter", "type": "call", - "priority": 2, + "priority": 1, "maxNestedFunctionDepth": 1 }, "func": { "arg": { "name": "e", - "highlightType": "highlighted", - "topLeftBadgeType": "unmatch", - "bottomRightBadgeType": "funcArg", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 1 + 2 ], - "emphasizePriority": true, + "emphasizePriority": false, "bound": false, "maxNestedFunctionDepth": 0 }, "body": { "arg": { "name": "f", - "highlightType": "active", + "highlightType": "default", "topLeftBadgeType": "none", - "bottomRightBadgeType": "funcUnbound", + "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [], @@ -409,9 +519,9 @@ }, "body": { "name": "f", - "highlightType": "highlighted", - "topLeftBadgeType": "unmatch", - "bottomRightBadgeType": "funcBound", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [], @@ -425,16 +535,15 @@ "type": "function", "maxNestedFunctionDepth": 2 }, - "state": "betaReducePreviewBefore", + "state": "default", "type": "call", - "priority": 1, + "priority": 2, "maxNestedFunctionDepth": 2 }, - "previouslyChangedExpressionState": "betaReducePreviewBefore", - "matchExists": false, - "activePriority": 1, + "numLeafNodes": 3, "containerState": "stepped", - "numLeafNodes": 3 + "previouslyChangedExpressionState": "betaReducePreviewAfter", + "activePriority": 1 }, { "expression": { @@ -446,8 +555,8 @@ "bottomRightBadgeType": "callArg", "type": "variable", "argPriorityAgg": [ - 1, - 2 + 2, + 1 ], "funcPriorityAgg": [], "emphasizePriority": true, @@ -459,21 +568,21 @@ "name": "g", "highlightType": "removed", "topLeftBadgeType": "none", - "bottomRightBadgeType": "callArg", + "bottomRightBadgeType": "funcArg", "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 2 + 1 ], - "emphasizePriority": false, + "emphasizePriority": true, "bound": false, "maxNestedFunctionDepth": 0 }, "body": { - "name": "g", - "highlightType": "removed", + "name": "h", + "highlightType": "active", "topLeftBadgeType": "none", - "bottomRightBadgeType": "callArg", + "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [], @@ -484,11 +593,372 @@ "type": "function", "maxNestedFunctionDepth": 1 }, - "state": "default", + "state": "betaReducePreviewCrossed", "type": "call", - "priority": 2, + "priority": 1, "maxNestedFunctionDepth": 1 }, + "func": { + "arg": { + "name": "e", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 2 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "numLeafNodes": 3, + "containerState": "stepped", + "previouslyChangedExpressionState": "betaReducePreviewCrossed", + "activePriority": 1 + }, + { + "expression": { + "arg": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "e", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "numLeafNodes": 2, + "containerState": "ready", + "previouslyChangedExpressionState": "default", + "activePriority": 1 + }, + { + "expression": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "e", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "active", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "previouslyChangedExpressionState": "active", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 2 + }, + { + "expression": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "e", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "showFuncUnbound", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "previouslyChangedExpressionState": "showFuncUnbound", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 2 + }, + { + "expression": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "e", + "highlightType": "highlighted", + "topLeftBadgeType": "unmatch", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "highlighted", + "topLeftBadgeType": "unmatch", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "betaReducePreviewBefore", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "previouslyChangedExpressionState": "betaReducePreviewBefore", + "matchExists": false, + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 2 + }, + { + "expression": { + "arg": { + "name": "h", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, "func": { "arg": { "name": "e", @@ -543,7 +1013,7 @@ "previouslyChangedExpressionState": "betaReducePreviewCrossed", "activePriority": 1, "containerState": "stepped", - "numLeafNodes": 3 + "numLeafNodes": 2 }, { "expression": { diff --git a/src/types/ExpressionRunnerTypes.ts b/src/types/ExpressionRunnerTypes.ts index 9150c4078..b9662ba2a 100644 --- a/src/types/ExpressionRunnerTypes.ts +++ b/src/types/ExpressionRunnerTypes.ts @@ -47,6 +47,7 @@ export interface ExpressionRunnerProps { speed: number showAllShowSteps?: boolean skipAlphaConvert?: boolean + applicativeOrder?: boolean skipToTheEnd: boolean hideFuncUnboundBadgeOnExplanation: boolean highlightOverridesCallArgAndFuncUnboundOnly: boolean From eec9a2c74bcb3eaec8a5088718260bc942756071 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Tue, 5 Nov 2019 19:28:49 -0800 Subject: [PATCH 58/83] Finish 6 --- pages/emojis-functional-programming.tsx | 56 +++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 3 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 603fb2790..65ea26a6e 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -1219,12 +1219,62 @@ sushi => 'pizza'`}

Next, here’s slightly different JS code.{' '} - There’s an extra pair of parenthesis around{' '} + There’s an extra pair of parentheses around{' '} (spaghetti => spaghetti)('salad'), so - this will be evaluated first. + this will be evaluated first + , and the result will be different from the last time.

- + pizza`} + caption={ + <> + Guess what the result would be +
+ before pressing the button! + + } + >{`(friedPotatoes => pizza => pizza)( + (spaghetti => spaghetti)("salad") +)`}
+

+ Let’s take a look at the equivalent emoji puzzle. This time,{' '} + + the pair of 1’s + is on the top two rows + {' '} + instead.{' '} + + Try pressing + {' '} + and see what happens! +

+ + This time, the pair of{' '} + 1’s is +
+ on the top two rows instead +
+

+ Summary: +

+
    + + In JavaScript, you can change the evaluation order + of an expression by placing parentheses{' '} + on different locations. + + + In emoji puzzles, you can change the evaluation + order by placing{' '} + + the numbers (e.g.{' '} + 1’s and{' '} + 2’s) + {' '} + on different locations. + +
From 022166ce9681d23fae13b5911482d12f5b4a280b Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Tue, 5 Nov 2019 19:38:26 -0800 Subject: [PATCH 59/83] Sort priority aggs --- scripts/lib/prioritizeExpression.ts | 24 +- src/lib/runners/ancc.json | 8 +- src/lib/runners/hyvj.json | 24 +- src/lib/runners/kmgw.json | 4 +- src/lib/runners/olqy.json | 4 +- src/lib/runners/qurt.json | 4 +- src/lib/runners/rrmc.json | 652 +++++++-------- src/lib/runners/txxw.json | 4 +- src/lib/runners/xbki.json | 1180 +++++++++++++-------------- src/lib/runners/zick.json | 4 +- src/lib/runners/zlfx.json | 4 +- 11 files changed, 962 insertions(+), 950 deletions(-) diff --git a/scripts/lib/prioritizeExpression.ts b/scripts/lib/prioritizeExpression.ts index 3fce08d3d..1d08c0f08 100644 --- a/scripts/lib/prioritizeExpression.ts +++ b/scripts/lib/prioritizeExpression.ts @@ -420,13 +420,17 @@ function populatePriorityAggs({ ...expression, arg: populatePriorityAggs({ expression: expression.arg, - argPriorityAgg: [...argPriorityAgg, expression.priority], + argPriorityAgg: [...argPriorityAgg, expression.priority].sort( + (a, b) => a - b + ), funcPriorityAgg: [] as number[] }), func: populatePriorityAggs({ expression: expression.func, argPriorityAgg: [] as number[], - funcPriorityAgg: [expression.priority, ...funcPriorityAgg] + funcPriorityAgg: [expression.priority, ...funcPriorityAgg].sort( + (a, b) => a - b + ) }) } } else if (isFunction(expression)) { @@ -450,7 +454,9 @@ function populatePriorityAggs({ ...expression, falseCase: populatePriorityAggs({ expression: expression.falseCase, - argPriorityAgg: [...argPriorityAgg, expression.priority], + argPriorityAgg: [...argPriorityAgg, expression.priority].sort( + (a, b) => a - b + ), funcPriorityAgg: [] as number[] }), condition: populatePriorityAggs({ @@ -461,7 +467,9 @@ function populatePriorityAggs({ trueCase: populatePriorityAggs({ expression: expression.trueCase, argPriorityAgg: [] as number[], - funcPriorityAgg: [expression.priority, ...funcPriorityAgg] + funcPriorityAgg: [expression.priority, ...funcPriorityAgg].sort( + (a, b) => a - b + ) }) } } else if (isRepeat(expression)) { @@ -478,13 +486,17 @@ function populatePriorityAggs({ ...expression, first: populatePriorityAggs({ expression: expression.first, - argPriorityAgg: [...argPriorityAgg, expression.priority], + argPriorityAgg: [...argPriorityAgg, expression.priority].sort( + (a, b) => a - b + ), funcPriorityAgg: [] as number[] }), second: populatePriorityAggs({ expression: expression.second, argPriorityAgg: [] as number[], - funcPriorityAgg: [expression.priority, ...funcPriorityAgg] + funcPriorityAgg: [expression.priority, ...funcPriorityAgg].sort( + (a, b) => a - b + ) }) } } else { diff --git a/src/lib/runners/ancc.json b/src/lib/runners/ancc.json index ab4c4111c..dd89fb782 100644 --- a/src/lib/runners/ancc.json +++ b/src/lib/runners/ancc.json @@ -14,8 +14,8 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 2, - 1 + 1, + 2 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -80,8 +80,8 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 2, - 1 + 1, + 2 ], "funcPriorityAgg": [], "emphasizePriority": false, diff --git a/src/lib/runners/hyvj.json b/src/lib/runners/hyvj.json index 031a32740..3431077b3 100644 --- a/src/lib/runners/hyvj.json +++ b/src/lib/runners/hyvj.json @@ -10,8 +10,8 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 2, - 1 + 1, + 2 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -118,8 +118,8 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 2, - 1 + 1, + 2 ], "funcPriorityAgg": [], "emphasizePriority": true, @@ -227,8 +227,8 @@ "bottomRightBadgeType": "callArg", "type": "variable", "argPriorityAgg": [ - 2, - 1 + 1, + 2 ], "funcPriorityAgg": [], "emphasizePriority": true, @@ -336,8 +336,8 @@ "bottomRightBadgeType": "callArg", "type": "variable", "argPriorityAgg": [ - 2, - 1 + 1, + 2 ], "funcPriorityAgg": [], "emphasizePriority": true, @@ -446,8 +446,8 @@ "bottomRightBadgeType": "callArg", "type": "variable", "argPriorityAgg": [ - 2, - 1 + 1, + 2 ], "funcPriorityAgg": [], "emphasizePriority": true, @@ -555,8 +555,8 @@ "bottomRightBadgeType": "callArg", "type": "variable", "argPriorityAgg": [ - 2, - 1 + 1, + 2 ], "funcPriorityAgg": [], "emphasizePriority": true, diff --git a/src/lib/runners/kmgw.json b/src/lib/runners/kmgw.json index 030d2f2cd..2736dfd92 100644 --- a/src/lib/runners/kmgw.json +++ b/src/lib/runners/kmgw.json @@ -112,9 +112,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, diff --git a/src/lib/runners/olqy.json b/src/lib/runners/olqy.json index f6df81394..0ab8ad7ef 100644 --- a/src/lib/runners/olqy.json +++ b/src/lib/runners/olqy.json @@ -112,9 +112,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, diff --git a/src/lib/runners/qurt.json b/src/lib/runners/qurt.json index e53e1b804..76b9e4f81 100644 --- a/src/lib/runners/qurt.json +++ b/src/lib/runners/qurt.json @@ -14,8 +14,8 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 2, - 1 + 1, + 2 ], "funcPriorityAgg": [], "emphasizePriority": false, diff --git a/src/lib/runners/rrmc.json b/src/lib/runners/rrmc.json index 0d804d04a..ae5a1f4f6 100644 --- a/src/lib/runners/rrmc.json +++ b/src/lib/runners/rrmc.json @@ -113,9 +113,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -486,9 +486,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -911,9 +911,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -1141,9 +1141,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -1403,9 +1403,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -1633,9 +1633,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -1897,9 +1897,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -2126,9 +2126,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -2310,9 +2310,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -2566,9 +2566,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -2795,9 +2795,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -2979,9 +2979,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -3168,9 +3168,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 6, 4, - 5 + 5, + 6 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -3344,9 +3344,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -3574,9 +3574,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -3800,9 +3800,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 6, 4, - 5 + 5, + 6 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -3976,9 +3976,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -4206,9 +4206,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -4402,9 +4402,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 6, 4, - 5 + 5, + 6 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -4579,9 +4579,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -4809,9 +4809,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -4998,9 +4998,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 6, 4, - 5 + 5, + 6 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -5175,9 +5175,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -5405,9 +5405,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -5571,9 +5571,9 @@ "type": "variable", "argPriorityAgg": [ 1, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -5748,9 +5748,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -5978,9 +5978,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -6144,9 +6144,9 @@ "type": "variable", "argPriorityAgg": [ 1, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -6321,9 +6321,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -6551,9 +6551,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -6684,9 +6684,9 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 4, 2, - 3 + 3, + 4 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -6861,9 +6861,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -7091,9 +7091,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -7221,9 +7221,9 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 4, 2, - 3 + 3, + 4 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -7398,9 +7398,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -7628,9 +7628,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -7758,9 +7758,9 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -7937,9 +7937,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -8166,9 +8166,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -8350,9 +8350,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -8472,9 +8472,9 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -8651,9 +8651,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -8880,9 +8880,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -9064,9 +9064,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -9186,9 +9186,9 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 3, 1, - 2 + 2, + 3 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -9298,9 +9298,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 6, 4, - 5 + 5, + 6 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -9474,9 +9474,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -9704,9 +9704,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -9863,9 +9863,9 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 3, 1, - 2 + 2, + 3 ], "funcPriorityAgg": [], "emphasizePriority": true, @@ -9975,9 +9975,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 6, 4, - 5 + 5, + 6 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -10151,9 +10151,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -10381,9 +10381,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -10621,12 +10621,12 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 10, 3, - 8, 5, 6, - 7 + 7, + 8, + 10 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -10821,9 +10821,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -11051,9 +11051,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -11168,8 +11168,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 9, - 8 + 8, + 9 ], "emphasizePriority": false, "bound": true, @@ -11306,12 +11306,12 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 10, 3, - 8, 5, 6, - 7 + 7, + 8, + 10 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -11506,9 +11506,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -11736,9 +11736,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -11853,8 +11853,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 9, - 8 + 8, + 9 ], "emphasizePriority": false, "bound": true, @@ -11969,12 +11969,12 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 9, 2, - 7, 4, 5, - 6 + 6, + 7, + 9 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -12169,9 +12169,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -12399,9 +12399,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -12516,8 +12516,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 8, - 7 + 7, + 8 ], "emphasizePriority": false, "bound": true, @@ -12632,12 +12632,12 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 9, 2, - 7, 4, 5, - 6 + 6, + 7, + 9 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -12832,9 +12832,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -13062,9 +13062,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -13179,8 +13179,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 8, - 7 + 7, + 8 ], "emphasizePriority": false, "bound": true, @@ -13272,12 +13272,12 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 8, 1, - 6, 3, 4, - 5 + 5, + 6, + 8 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -13472,9 +13472,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -13702,9 +13702,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -13819,8 +13819,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 7, - 6 + 6, + 7 ], "emphasizePriority": false, "bound": true, @@ -13912,12 +13912,12 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 8, 1, - 6, 3, 4, - 5 + 5, + 6, + 8 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -14112,9 +14112,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -14342,9 +14342,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -14459,8 +14459,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 7, - 6 + 6, + 7 ], "emphasizePriority": false, "bound": true, @@ -14520,11 +14520,11 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 7, - 5, 2, 3, - 4 + 4, + 5, + 7 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -14719,9 +14719,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -14949,9 +14949,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -15066,8 +15066,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 6, - 5 + 5, + 6 ], "emphasizePriority": false, "bound": true, @@ -15124,11 +15124,11 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 7, - 5, 2, 3, - 4 + 4, + 5, + 7 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -15323,9 +15323,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -15553,9 +15553,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -15670,8 +15670,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 6, - 5 + 5, + 6 ], "emphasizePriority": false, "bound": true, @@ -15728,11 +15728,11 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 8, - 6, 3, 4, - 5 + 5, + 6, + 8 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -15929,9 +15929,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -16158,9 +16158,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -16342,9 +16342,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -16451,8 +16451,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 7, - 6 + 6, + 7 ], "emphasizePriority": false, "bound": true, @@ -16509,11 +16509,11 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 8, - 6, 3, 4, - 5 + 5, + 6, + 8 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -16710,9 +16710,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -16939,9 +16939,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -17123,9 +17123,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -17232,8 +17232,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 7, - 6 + 6, + 7 ], "emphasizePriority": false, "bound": true, @@ -17290,11 +17290,11 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 6, - 4, 1, 2, - 3 + 3, + 4, + 6 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -17424,9 +17424,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 6, 4, - 5 + 5, + 6 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -17600,9 +17600,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -17830,9 +17830,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -17976,8 +17976,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 5, - 4 + 4, + 5 ], "emphasizePriority": false, "bound": true, @@ -18034,11 +18034,11 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 6, - 4, 1, 2, - 3 + 3, + 4, + 6 ], "funcPriorityAgg": [], "emphasizePriority": true, @@ -18168,9 +18168,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 6, 4, - 5 + 5, + 6 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -18344,9 +18344,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -18574,9 +18574,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -18720,8 +18720,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 5, - 4 + 4, + 5 ], "emphasizePriority": false, "bound": true, @@ -18881,14 +18881,14 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 15, - 13, 4, - 10, 6, 7, 8, - 9 + 9, + 10, + 13, + 15 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -19103,9 +19103,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -19333,9 +19333,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -19472,8 +19472,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 11, - 10 + 10, + 11 ], "emphasizePriority": false, "bound": true, @@ -19516,8 +19516,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 14, - 13 + 13, + 14 ], "emphasizePriority": false, "bound": true, @@ -19677,14 +19677,14 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 15, - 13, 4, - 10, 6, 7, 8, - 9 + 9, + 10, + 13, + 15 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -19899,9 +19899,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -20129,9 +20129,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -20268,8 +20268,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 11, - 10 + 10, + 11 ], "emphasizePriority": false, "bound": true, @@ -20312,8 +20312,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 14, - 13 + 13, + 14 ], "emphasizePriority": false, "bound": true, @@ -20451,14 +20451,14 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 14, - 12, 3, - 9, 5, 6, 7, - 8 + 8, + 9, + 12, + 14 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -20673,9 +20673,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -20903,9 +20903,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -21042,8 +21042,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 10, - 9 + 9, + 10 ], "emphasizePriority": false, "bound": true, @@ -21086,8 +21086,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 13, - 12 + 12, + 13 ], "emphasizePriority": false, "bound": true, @@ -21225,14 +21225,14 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 14, - 12, 3, - 9, 5, 6, 7, - 8 + 8, + 9, + 12, + 14 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -21447,9 +21447,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -21677,9 +21677,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -21816,8 +21816,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 10, - 9 + 9, + 10 ], "emphasizePriority": false, "bound": true, @@ -21860,8 +21860,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 13, - 12 + 12, + 13 ], "emphasizePriority": false, "bound": true, @@ -21977,14 +21977,14 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 13, - 11, 2, - 8, 4, 5, 6, - 7 + 7, + 8, + 11, + 13 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -22199,9 +22199,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -22429,9 +22429,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -22568,8 +22568,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 9, - 8 + 8, + 9 ], "emphasizePriority": false, "bound": true, @@ -22612,8 +22612,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 12, - 11 + 11, + 12 ], "emphasizePriority": false, "bound": true, @@ -22729,14 +22729,14 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 13, - 11, 2, - 8, 4, 5, 6, - 7 + 7, + 8, + 11, + 13 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -22951,9 +22951,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -23181,9 +23181,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -23320,8 +23320,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 9, - 8 + 8, + 9 ], "emphasizePriority": false, "bound": true, @@ -23364,8 +23364,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 12, - 11 + 11, + 12 ], "emphasizePriority": false, "bound": true, @@ -23458,14 +23458,14 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 12, - 10, 1, - 7, 3, 4, 5, - 6 + 6, + 7, + 10, + 12 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -23680,9 +23680,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -23910,9 +23910,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -24049,8 +24049,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 8, - 7 + 7, + 8 ], "emphasizePriority": false, "bound": true, @@ -24093,8 +24093,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 11, - 10 + 10, + 11 ], "emphasizePriority": false, "bound": true, @@ -24187,14 +24187,14 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 12, - 10, 1, - 7, 3, 4, 5, - 6 + 6, + 7, + 10, + 12 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -24409,9 +24409,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -24639,9 +24639,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -24778,8 +24778,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 8, - 7 + 7, + 8 ], "emphasizePriority": false, "bound": true, @@ -24822,8 +24822,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 11, - 10 + 10, + 11 ], "emphasizePriority": false, "bound": true, @@ -24877,8 +24877,8 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 3, - 1 + 1, + 3 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -24910,8 +24910,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 2, - 1 + 1, + 2 ], "emphasizePriority": false, "bound": true, @@ -24965,8 +24965,8 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 3, - 1 + 1, + 3 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -24998,8 +24998,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 2, - 1 + 1, + 2 ], "emphasizePriority": true, "bound": true, @@ -25053,8 +25053,8 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 2, - 1 + 1, + 2 ], "funcPriorityAgg": [], "emphasizePriority": false, diff --git a/src/lib/runners/txxw.json b/src/lib/runners/txxw.json index 3d05c0772..66efbe00f 100644 --- a/src/lib/runners/txxw.json +++ b/src/lib/runners/txxw.json @@ -113,9 +113,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, diff --git a/src/lib/runners/xbki.json b/src/lib/runners/xbki.json index c3ed312f8..b44fafbb2 100644 --- a/src/lib/runners/xbki.json +++ b/src/lib/runners/xbki.json @@ -113,9 +113,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -486,9 +486,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -911,9 +911,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -1141,9 +1141,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -1403,9 +1403,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -1633,9 +1633,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -1897,9 +1897,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -2126,9 +2126,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -2310,9 +2310,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -2566,9 +2566,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -2795,9 +2795,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -2979,9 +2979,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -3168,9 +3168,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 6, 4, - 5 + 5, + 6 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -3344,9 +3344,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -3574,9 +3574,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -3800,9 +3800,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 6, 4, - 5 + 5, + 6 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -3976,9 +3976,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -4206,9 +4206,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -4402,9 +4402,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 6, 4, - 5 + 5, + 6 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -4579,9 +4579,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -4809,9 +4809,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -4998,9 +4998,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 6, 4, - 5 + 5, + 6 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -5175,9 +5175,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -5405,9 +5405,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -5571,9 +5571,9 @@ "type": "variable", "argPriorityAgg": [ 1, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -5748,9 +5748,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -5978,9 +5978,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -6144,9 +6144,9 @@ "type": "variable", "argPriorityAgg": [ 1, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -6321,9 +6321,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -6551,9 +6551,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -6684,9 +6684,9 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 4, 2, - 3 + 3, + 4 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -6861,9 +6861,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -7091,9 +7091,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -7221,9 +7221,9 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 4, 2, - 3 + 3, + 4 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -7398,9 +7398,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -7628,9 +7628,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -7758,9 +7758,9 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -7937,9 +7937,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -8166,9 +8166,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -8350,9 +8350,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -8472,9 +8472,9 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -8651,9 +8651,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -8880,9 +8880,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -9064,9 +9064,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -9186,9 +9186,9 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 3, 1, - 2 + 2, + 3 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -9298,9 +9298,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 6, 4, - 5 + 5, + 6 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -9474,9 +9474,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -9704,9 +9704,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -9863,9 +9863,9 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 3, 1, - 2 + 2, + 3 ], "funcPriorityAgg": [], "emphasizePriority": true, @@ -9975,9 +9975,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 6, 4, - 5 + 5, + 6 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -10151,9 +10151,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -10381,9 +10381,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -10621,12 +10621,12 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 10, 3, - 8, 5, 6, - 7 + 7, + 8, + 10 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -10821,9 +10821,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -11051,9 +11051,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -11168,8 +11168,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 9, - 8 + 8, + 9 ], "emphasizePriority": false, "bound": true, @@ -11306,12 +11306,12 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 10, 3, - 8, 5, 6, - 7 + 7, + 8, + 10 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -11506,9 +11506,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -11736,9 +11736,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -11853,8 +11853,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 9, - 8 + 8, + 9 ], "emphasizePriority": false, "bound": true, @@ -11969,12 +11969,12 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 9, 2, - 7, 4, 5, - 6 + 6, + 7, + 9 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -12169,9 +12169,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -12399,9 +12399,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -12516,8 +12516,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 8, - 7 + 7, + 8 ], "emphasizePriority": false, "bound": true, @@ -12632,12 +12632,12 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 9, 2, - 7, 4, 5, - 6 + 6, + 7, + 9 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -12832,9 +12832,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -13062,9 +13062,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -13179,8 +13179,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 8, - 7 + 7, + 8 ], "emphasizePriority": false, "bound": true, @@ -13272,12 +13272,12 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 8, 1, - 6, 3, 4, - 5 + 5, + 6, + 8 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -13472,9 +13472,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -13702,9 +13702,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -13819,8 +13819,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 7, - 6 + 6, + 7 ], "emphasizePriority": false, "bound": true, @@ -13912,12 +13912,12 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 8, 1, - 6, 3, 4, - 5 + 5, + 6, + 8 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -14112,9 +14112,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -14342,9 +14342,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -14459,8 +14459,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 7, - 6 + 6, + 7 ], "emphasizePriority": false, "bound": true, @@ -14520,11 +14520,11 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 7, - 5, 2, 3, - 4 + 4, + 5, + 7 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -14719,9 +14719,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -14949,9 +14949,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -15066,8 +15066,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 6, - 5 + 5, + 6 ], "emphasizePriority": false, "bound": true, @@ -15124,11 +15124,11 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 7, - 5, 2, 3, - 4 + 4, + 5, + 7 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -15323,9 +15323,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -15553,9 +15553,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -15670,8 +15670,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 6, - 5 + 5, + 6 ], "emphasizePriority": false, "bound": true, @@ -15728,11 +15728,11 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 8, - 6, 3, 4, - 5 + 5, + 6, + 8 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -15929,9 +15929,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -16158,9 +16158,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -16342,9 +16342,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -16451,8 +16451,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 7, - 6 + 6, + 7 ], "emphasizePriority": false, "bound": true, @@ -16509,11 +16509,11 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 8, - 6, 3, 4, - 5 + 5, + 6, + 8 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -16710,9 +16710,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -16939,9 +16939,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -17123,9 +17123,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -17232,8 +17232,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 7, - 6 + 6, + 7 ], "emphasizePriority": false, "bound": true, @@ -17290,11 +17290,11 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 6, - 4, 1, 2, - 3 + 3, + 4, + 6 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -17424,9 +17424,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 6, 4, - 5 + 5, + 6 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -17600,9 +17600,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -17830,9 +17830,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -17976,8 +17976,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 5, - 4 + 4, + 5 ], "emphasizePriority": false, "bound": true, @@ -18034,11 +18034,11 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 6, - 4, 1, 2, - 3 + 3, + 4, + 6 ], "funcPriorityAgg": [], "emphasizePriority": true, @@ -18168,9 +18168,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 6, 4, - 5 + 5, + 6 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -18344,9 +18344,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -18574,9 +18574,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -18720,8 +18720,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 5, - 4 + 4, + 5 ], "emphasizePriority": false, "bound": true, @@ -18881,14 +18881,14 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 15, - 13, 4, - 10, 6, 7, 8, - 9 + 9, + 10, + 13, + 15 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -19103,9 +19103,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -19333,9 +19333,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -19472,8 +19472,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 11, - 10 + 10, + 11 ], "emphasizePriority": false, "bound": true, @@ -19516,8 +19516,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 14, - 13 + 13, + 14 ], "emphasizePriority": false, "bound": true, @@ -19677,14 +19677,14 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 15, - 13, 4, - 10, 6, 7, 8, - 9 + 9, + 10, + 13, + 15 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -19899,9 +19899,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -20129,9 +20129,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -20268,8 +20268,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 11, - 10 + 10, + 11 ], "emphasizePriority": false, "bound": true, @@ -20312,8 +20312,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 14, - 13 + 13, + 14 ], "emphasizePriority": false, "bound": true, @@ -20451,14 +20451,14 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 14, - 12, 3, - 9, 5, 6, 7, - 8 + 8, + 9, + 12, + 14 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -20673,9 +20673,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -20903,9 +20903,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -21042,8 +21042,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 10, - 9 + 9, + 10 ], "emphasizePriority": false, "bound": true, @@ -21086,8 +21086,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 13, - 12 + 12, + 13 ], "emphasizePriority": false, "bound": true, @@ -21225,14 +21225,14 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 14, - 12, 3, - 9, 5, 6, 7, - 8 + 8, + 9, + 12, + 14 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -21447,9 +21447,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -21677,9 +21677,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -21816,8 +21816,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 10, - 9 + 9, + 10 ], "emphasizePriority": false, "bound": true, @@ -21860,8 +21860,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 13, - 12 + 12, + 13 ], "emphasizePriority": false, "bound": true, @@ -21977,14 +21977,14 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 13, - 11, 2, - 8, 4, 5, 6, - 7 + 7, + 8, + 11, + 13 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -22199,9 +22199,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -22429,9 +22429,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -22568,8 +22568,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 9, - 8 + 8, + 9 ], "emphasizePriority": false, "bound": true, @@ -22612,8 +22612,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 12, - 11 + 11, + 12 ], "emphasizePriority": false, "bound": true, @@ -22729,14 +22729,14 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 13, - 11, 2, - 8, 4, 5, 6, - 7 + 7, + 8, + 11, + 13 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -22951,9 +22951,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -23181,9 +23181,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -23320,8 +23320,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 9, - 8 + 8, + 9 ], "emphasizePriority": false, "bound": true, @@ -23364,8 +23364,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 12, - 11 + 11, + 12 ], "emphasizePriority": false, "bound": true, @@ -23458,14 +23458,14 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 12, - 10, 1, - 7, 3, 4, 5, - 6 + 6, + 7, + 10, + 12 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -23680,9 +23680,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -23910,9 +23910,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -24049,8 +24049,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 8, - 7 + 7, + 8 ], "emphasizePriority": false, "bound": true, @@ -24093,8 +24093,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 11, - 10 + 10, + 11 ], "emphasizePriority": false, "bound": true, @@ -24187,14 +24187,14 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 12, - 10, 1, - 7, 3, 4, 5, - 6 + 6, + 7, + 10, + 12 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -24409,9 +24409,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -24639,9 +24639,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -24778,8 +24778,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 8, - 7 + 7, + 8 ], "emphasizePriority": false, "bound": true, @@ -24822,8 +24822,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 11, - 10 + 10, + 11 ], "emphasizePriority": false, "bound": true, @@ -24884,13 +24884,13 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 11, - 9, - 6, 2, 3, 4, - 5 + 5, + 6, + 9, + 11 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -25105,9 +25105,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -25335,9 +25335,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -25474,8 +25474,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 7, - 6 + 6, + 7 ], "emphasizePriority": false, "bound": true, @@ -25515,8 +25515,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 10, - 9 + 9, + 10 ], "emphasizePriority": false, "bound": true, @@ -25577,13 +25577,13 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 11, - 9, - 6, 2, 3, 4, - 5 + 5, + 6, + 9, + 11 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -25798,9 +25798,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -26028,9 +26028,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -26167,8 +26167,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 7, - 6 + 6, + 7 ], "emphasizePriority": false, "bound": true, @@ -26208,8 +26208,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 10, - 9 + 9, + 10 ], "emphasizePriority": false, "bound": true, @@ -26270,13 +26270,13 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 12, - 10, - 7, 3, 4, 5, - 6 + 6, + 7, + 10, + 12 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -26493,9 +26493,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -26722,9 +26722,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -26906,9 +26906,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -27037,8 +27037,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 8, - 7 + 7, + 8 ], "emphasizePriority": false, "bound": true, @@ -27078,8 +27078,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 11, - 10 + 10, + 11 ], "emphasizePriority": false, "bound": true, @@ -27140,13 +27140,13 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 12, - 10, - 7, 3, 4, 5, - 6 + 6, + 7, + 10, + 12 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -27363,9 +27363,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -27592,9 +27592,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -27776,9 +27776,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -27907,8 +27907,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 8, - 7 + 7, + 8 ], "emphasizePriority": false, "bound": true, @@ -27948,8 +27948,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 11, - 10 + 10, + 11 ], "emphasizePriority": false, "bound": true, @@ -28010,13 +28010,13 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 10, - 8, - 5, 1, 2, 3, - 4 + 4, + 5, + 8, + 10 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -28166,9 +28166,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 6, 4, - 5 + 5, + 6 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -28342,9 +28342,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -28572,9 +28572,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -28740,8 +28740,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 6, - 5 + 5, + 6 ], "emphasizePriority": false, "bound": true, @@ -28781,8 +28781,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 9, - 8 + 8, + 9 ], "emphasizePriority": false, "bound": true, @@ -28843,13 +28843,13 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 10, - 8, - 5, 1, 2, 3, - 4 + 4, + 5, + 8, + 10 ], "funcPriorityAgg": [], "emphasizePriority": true, @@ -28999,9 +28999,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 6, 4, - 5 + 5, + 6 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -29175,9 +29175,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -29405,9 +29405,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -29573,8 +29573,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 6, - 5 + 5, + 6 ], "emphasizePriority": false, "bound": true, @@ -29614,8 +29614,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 9, - 8 + 8, + 9 ], "emphasizePriority": false, "bound": true, @@ -29801,16 +29801,16 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 21, - 19, - 16, 5, - 12, 7, 8, 9, 10, - 11 + 11, + 12, + 16, + 19, + 21 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -30045,9 +30045,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -30275,9 +30275,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -30436,8 +30436,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 13, - 12 + 12, + 13 ], "emphasizePriority": false, "bound": true, @@ -30502,8 +30502,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 17, - 16 + 16, + 17 ], "emphasizePriority": false, "bound": true, @@ -30543,8 +30543,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 20, - 19 + 19, + 20 ], "emphasizePriority": false, "bound": true, @@ -30730,16 +30730,16 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 21, - 19, - 16, 5, - 12, 7, 8, 9, 10, - 11 + 11, + 12, + 16, + 19, + 21 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -30974,9 +30974,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -31204,9 +31204,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -31365,8 +31365,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 13, - 12 + 12, + 13 ], "emphasizePriority": false, "bound": true, @@ -31431,8 +31431,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 17, - 16 + 16, + 17 ], "emphasizePriority": false, "bound": true, @@ -31472,8 +31472,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 20, - 19 + 19, + 20 ], "emphasizePriority": false, "bound": true, @@ -31637,16 +31637,16 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 20, - 18, - 15, 4, - 11, 6, 7, 8, 9, - 10 + 10, + 11, + 15, + 18, + 20 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -31881,9 +31881,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -32111,9 +32111,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -32272,8 +32272,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 12, - 11 + 11, + 12 ], "emphasizePriority": false, "bound": true, @@ -32338,8 +32338,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 16, - 15 + 15, + 16 ], "emphasizePriority": false, "bound": true, @@ -32379,8 +32379,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 19, - 18 + 18, + 19 ], "emphasizePriority": false, "bound": true, @@ -32544,16 +32544,16 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 20, - 18, - 15, 4, - 11, 6, 7, 8, 9, - 10 + 10, + 11, + 15, + 18, + 20 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -32788,9 +32788,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -33018,9 +33018,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -33179,8 +33179,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 12, - 11 + 11, + 12 ], "emphasizePriority": false, "bound": true, @@ -33245,8 +33245,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 16, - 15 + 15, + 16 ], "emphasizePriority": false, "bound": true, @@ -33286,8 +33286,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 19, - 18 + 18, + 19 ], "emphasizePriority": false, "bound": true, @@ -33429,16 +33429,16 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 19, - 17, - 14, 3, - 10, 5, 6, 7, 8, - 9 + 9, + 10, + 14, + 17, + 19 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -33673,9 +33673,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -33903,9 +33903,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -34064,8 +34064,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 11, - 10 + 10, + 11 ], "emphasizePriority": false, "bound": true, @@ -34130,8 +34130,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 15, - 14 + 14, + 15 ], "emphasizePriority": false, "bound": true, @@ -34171,8 +34171,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 18, - 17 + 17, + 18 ], "emphasizePriority": false, "bound": true, @@ -34314,16 +34314,16 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 19, - 17, - 14, 3, - 10, 5, 6, 7, 8, - 9 + 9, + 10, + 14, + 17, + 19 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -34558,9 +34558,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -34788,9 +34788,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -34949,8 +34949,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 11, - 10 + 10, + 11 ], "emphasizePriority": false, "bound": true, @@ -35015,8 +35015,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 15, - 14 + 14, + 15 ], "emphasizePriority": false, "bound": true, @@ -35056,8 +35056,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 18, - 17 + 17, + 18 ], "emphasizePriority": false, "bound": true, @@ -35177,16 +35177,16 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 18, - 16, - 13, 2, - 9, 4, 5, 6, 7, - 8 + 8, + 9, + 13, + 16, + 18 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -35421,9 +35421,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -35651,9 +35651,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -35812,8 +35812,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 10, - 9 + 9, + 10 ], "emphasizePriority": false, "bound": true, @@ -35878,8 +35878,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 14, - 13 + 13, + 14 ], "emphasizePriority": false, "bound": true, @@ -35919,8 +35919,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 17, - 16 + 16, + 17 ], "emphasizePriority": false, "bound": true, @@ -36040,16 +36040,16 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 18, - 16, - 13, 2, - 9, 4, 5, 6, 7, - 8 + 8, + 9, + 13, + 16, + 18 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -36284,9 +36284,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -36514,9 +36514,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -36675,8 +36675,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 10, - 9 + 9, + 10 ], "emphasizePriority": false, "bound": true, @@ -36741,8 +36741,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 14, - 13 + 13, + 14 ], "emphasizePriority": false, "bound": true, @@ -36782,8 +36782,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 17, - 16 + 16, + 17 ], "emphasizePriority": false, "bound": true, @@ -36880,16 +36880,16 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 17, - 15, - 12, 1, - 8, 3, 4, 5, 6, - 7 + 7, + 8, + 12, + 15, + 17 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -37124,9 +37124,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -37354,9 +37354,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -37515,8 +37515,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 9, - 8 + 8, + 9 ], "emphasizePriority": false, "bound": true, @@ -37581,8 +37581,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 13, - 12 + 12, + 13 ], "emphasizePriority": false, "bound": true, @@ -37622,8 +37622,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 16, - 15 + 15, + 16 ], "emphasizePriority": false, "bound": true, @@ -37720,16 +37720,16 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 17, - 15, - 12, 1, - 8, 3, 4, 5, 6, - 7 + 7, + 8, + 12, + 15, + 17 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -37964,9 +37964,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -38194,9 +38194,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -38355,8 +38355,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 9, - 8 + 8, + 9 ], "emphasizePriority": false, "bound": true, @@ -38421,8 +38421,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 13, - 12 + 12, + 13 ], "emphasizePriority": false, "bound": true, @@ -38462,8 +38462,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 16, - 15 + 15, + 16 ], "emphasizePriority": false, "bound": true, @@ -38520,9 +38520,9 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 6, + 1, 4, - 1 + 6 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -38576,8 +38576,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 2, - 1 + 1, + 2 ], "emphasizePriority": false, "bound": true, @@ -38617,8 +38617,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 5, - 4 + 4, + 5 ], "emphasizePriority": false, "bound": true, @@ -38675,9 +38675,9 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 6, + 1, 4, - 1 + 6 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -38731,8 +38731,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 2, - 1 + 1, + 2 ], "emphasizePriority": false, "bound": true, @@ -38772,8 +38772,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 5, - 4 + 4, + 5 ], "emphasizePriority": false, "bound": true, @@ -38830,9 +38830,9 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 5, + 1, 3, - 1 + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -38864,8 +38864,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 2, - 1 + 1, + 2 ], "emphasizePriority": false, "bound": true, @@ -38905,8 +38905,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 4, - 3 + 3, + 4 ], "emphasizePriority": false, "bound": true, @@ -38963,9 +38963,9 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 5, + 1, 3, - 1 + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -38997,8 +38997,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 2, - 1 + 1, + 2 ], "emphasizePriority": true, "bound": true, @@ -39038,8 +39038,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 4, - 3 + 3, + 4 ], "emphasizePriority": false, "bound": true, @@ -39096,9 +39096,9 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 4, + 1, 2, - 1 + 4 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -39149,8 +39149,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 3, - 2 + 2, + 3 ], "emphasizePriority": false, "bound": true, @@ -39207,9 +39207,9 @@ "bottomRightBadgeType": "none", "type": "variable", "argPriorityAgg": [ - 4, + 1, 2, - 1 + 4 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -39260,8 +39260,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 3, - 2 + 2, + 3 ], "emphasizePriority": false, "bound": true, @@ -39317,8 +39317,8 @@ "bottomRightBadgeType": "none", "emphasizePriority": false, "argPriorityAgg": [ - 3, - 1 + 1, + 3 ], "funcPriorityAgg": [], "shorthandNumber": 2, @@ -39348,8 +39348,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 2, - 1 + 1, + 2 ], "emphasizePriority": false, "bound": true, @@ -39405,8 +39405,8 @@ "bottomRightBadgeType": "none", "emphasizePriority": false, "argPriorityAgg": [ - 3, - 1 + 1, + 3 ], "funcPriorityAgg": [], "shorthandNumber": 2, @@ -39436,8 +39436,8 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 2, - 1 + 1, + 2 ], "emphasizePriority": true, "bound": true, @@ -39493,8 +39493,8 @@ "bottomRightBadgeType": "none", "emphasizePriority": false, "argPriorityAgg": [ - 2, - 1 + 1, + 2 ], "funcPriorityAgg": [], "shorthandNumber": 2, @@ -39559,8 +39559,8 @@ "bottomRightBadgeType": "none", "emphasizePriority": false, "argPriorityAgg": [ - 2, - 1 + 1, + 2 ], "funcPriorityAgg": [], "shorthandNumber": 2, diff --git a/src/lib/runners/zick.json b/src/lib/runners/zick.json index 3225004ef..a9e6ec947 100644 --- a/src/lib/runners/zick.json +++ b/src/lib/runners/zick.json @@ -68,9 +68,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, diff --git a/src/lib/runners/zlfx.json b/src/lib/runners/zlfx.json index ec8ac4abc..db498d635 100644 --- a/src/lib/runners/zlfx.json +++ b/src/lib/runners/zlfx.json @@ -113,9 +113,9 @@ "type": "variable", "argPriorityAgg": [ 2, - 5, 3, - 4 + 4, + 5 ], "funcPriorityAgg": [], "emphasizePriority": false, From 34cad397e93596c5c82d90576e1962ced03fb1a0 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Tue, 5 Nov 2019 19:40:59 -0800 Subject: [PATCH 60/83] Note potential bug --- scripts/lib/prioritizeExpression.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/scripts/lib/prioritizeExpression.ts b/scripts/lib/prioritizeExpression.ts index 1d08c0f08..94280bf2a 100644 --- a/scripts/lib/prioritizeExpression.ts +++ b/scripts/lib/prioritizeExpression.ts @@ -269,6 +269,10 @@ function prioritizeConditionalExpressionHelper< ) } + // TODO: There's probably a bug around currentPriority here - + // If both trueCase / falseCase go into if(){} then + // currentPriority will be duplicated + if ( isCall(expression.trueCase) || isConditional(expression.trueCase) || From a0dee613b430e85bc643d97b9ac2e53e8575cf6a Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Tue, 5 Nov 2019 21:44:14 -0800 Subject: [PATCH 61/83] Start 7 --- pages/emojis-functional-programming.tsx | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 65ea26a6e..6060d497b 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -1276,6 +1276,27 @@ sushi => 'pizza'`}
+ + Church numerals + +

+ Let’s now talk about one of the most important topics in functional + programming: higher-order functions. A higher order + function (1) takes a function as an argument, (2){' '} + returns a function as its result, or (3){' '} + does both. +

+

+ Here’s a higher-order function called{' '} + convert that takes a function as an + argument. It then applies (n => n + 1)(0){' '} + to it. +

+ A higher-order function} + >{`function convert(f) { + return f(n => n + 1)(0) +}`} From a6eff851f11bbad12132d8331bedee082109a37b Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Tue, 5 Nov 2019 22:15:15 -0800 Subject: [PATCH 62/83] Continue with 7 --- pages/emojis-functional-programming.tsx | 100 ++++++++++++++++++++---- 1 file changed, 85 insertions(+), 15 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 6060d497b..0708a5665 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -427,6 +427,14 @@ const DimUnhighlighted = ({ children }: { children: React.ReactNode }) => ( ) +const guessTheResult = ( + <> + Guess what the result would be +
+ before pressing the button! + +) + export default () => { let step = 1 return locale === 'en' ? ( @@ -1185,13 +1193,7 @@ sushi => 'pizza'`}

- Guess what the result would be -
- before pressing the button! - - } + caption={guessTheResult} >{`(friedPotatoes => pizza => pizza)( spaghetti => spaghetti )('salad')`}
@@ -1227,13 +1229,7 @@ sushi => 'pizza'`}

pizza`} - caption={ - <> - Guess what the result would be -
- before pressing the button! - - } + caption={guessTheResult} >{`(friedPotatoes => pizza => pizza)( (spaghetti => spaghetti)("salad") )`}
@@ -1293,10 +1289,84 @@ sushi => 'pizza'`} to it.

A higher-order function} + caption={ + <> + A higher-order function: +
+ Takes a function as an argument + + } >{`function convert(f) { return f(n => n + 1)(0) }`}
+

+ Now, suppose that we apply convert on this + function: sushi => sandwich => sandwich. + What would the result be?{' '} + + Try to guess before pressing the {' '} + button! + +

+ {`function convert(f) { + return f(n => n + 1)(0) +} + +convert(sushi => sandwich => + sandwich +)`} +

+ The result is 0 because: +

+
    + + sushi is bound to{' '} + n => n + 1 + + + sandwich is bound to{' '} + 0 + + + And it returns sandwich, which is{' '} + 0. + +
+

+ Now, what if the input changes as follows?{' '} + + Try pressing on each example. + +

+ {`convert(sushi => sandwich => + sushi(sandwich) +)`} + {`convert(sushi => sandwich => + sushi(sushi(sandwich)) +)`} + {`convert(sushi => sandwich => + sushi(sushi(sushi(sandwich))) +)`} +

+ The results are 1,{' '} + 2, and 3{' '} + respectively because: +

+
    + + sushi is bound to{' '} + n => n + 1 + + + sandwich is bound to{' '} + 0 + + + So it applies n => n + 1 to{' '} + 0 for the number of times{' '} + sushi is used in the function body. + +
From 7002147316c75369487ef201b0b0d1f11b29370e Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Wed, 6 Nov 2019 07:56:14 -0800 Subject: [PATCH 63/83] Continue with 7 --- pages/emojis-functional-programming.tsx | 74 +++++++++++++++++++------ 1 file changed, 56 insertions(+), 18 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 0708a5665..287b269ce 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -1276,27 +1276,12 @@ sushi => 'pizza'`} Church numerals

- Let’s now talk about one of the most important topics in functional - programming: higher-order functions. A higher order - function (1) takes a function as an argument, (2){' '} - returns a function as its result, or (3){' '} - does both. -

-

- Here’s a higher-order function called{' '} - convert that takes a function as an + Let’s take a look at something more interesting. Here’s a function + called convert that takes a function as an argument. It then applies (n => n + 1)(0){' '} to it.

- - A higher-order function: -
- Takes a function as an argument - - } - >{`function convert(f) { + {`function convert(f) { return f(n => n + 1)(0) }`}

@@ -1367,6 +1352,59 @@ convert(sushi => sandwich => sushi is used in the function body. + +

+ What we learned so far: If we have a function that + has one of the following patterns: +

+ {`// a & b can be any variable name +a => b => b +a => b => a(b) +a => b => a(a(b)) +a => b => a(a(a(b))) +// ...and so on...`} +

+ Then, when the function is passed to{' '} + convert(),{' '} + + it returns the number of times a is + applied to b + {' '} + in the function body. +

+ {`convert(a => b => b) // 0 +convert(a => b => a(b)) // 1 +convert(a => b => a(a(b))) // 2 +convert(a => b => a(a(a(b)))) // 3 +// ...and so on...`} +
+

+ These functions that can be converted to numbers using{' '} + convert() have a{' '} + special name. They are called{' '} + + Church numerals + + . Each function represents some Church numeral. +

+ {`// Church numeral 0 +a => b => b + +// Church numeral 1 +a => b => a(b) + +// Church numeral 2 +a => b => a(a(b))) + +// Church numeral 3 +a => b => a(a(a(b)))) + +// ...and so on...`} +

+ You might be wondering: “What’s the point of this?” + I’ll explain it shortly, but before I do so, let me explain how my + emoji puzzles can express Church numerals. +

From d26109ee54edb2a87960a2e4bf0daf7790fc9a47 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Wed, 6 Nov 2019 09:32:28 -0800 Subject: [PATCH 64/83] Finish step 7 --- pages/emojis-functional-programming.tsx | 1693 +++++++++-------- .../ExpressionRunnerConfigContext.ts | 1 + src/components/ExpressionRunnerControls.tsx | 21 +- .../ExpressionRunnerExplanation.tsx | 64 +- src/components/H.tsx | 40 + 5 files changed, 978 insertions(+), 841 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 287b269ce..5e2c1831a 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -1,6 +1,6 @@ /** @jsx jsx */ import { css, jsx, Global } from '@emotion/core' -import { useState } from 'react' +import { useState, useContext } from 'react' import Page from 'src/components/Page' import Head from 'next/head' import { ns, radii, fontSizes, colors, spaces, maxWidths } from 'src/lib/theme' @@ -407,15 +407,19 @@ CodeBlock.defaultProps = { defaultResultVisible: false } -const PointToRunButton = ({ children }: { children: React.ReactNode }) => ( - - {children} - -) +const PointToRunButton = ({ children }: { children: React.ReactNode }) => { + const config = useContext(ExpressionRunnerConfigContext) + return ( + + {children} + + ) +} const DimUnhighlighted = ({ children }: { children: React.ReactNode }) => ( { } `} /> - - -

- - Last month, I published a free online course called “ - - Y Combinator for Non-programmers - - ”. - {' '} - In this 17-page course, I teach computer science concepts such as - functional programming, lambda calculus, Church encoding, and Y - combinator in a way such that{' '} - - people who have zero programming knowledge can understand - - —without sacrificing rigor. -

-

- To explain these concepts, I created{' '} - an educational puzzle using emojis 🍱. - In this article, I’ll explain how my emoji puzzles can represent and - execute functional code visually. Here’s a sneak - peek— - - try pressing below! - - : -

- Functional JS code:} - >{`(sushi => sushi)('sandwich')`} - - Equivalent emoji puzzle: - -

- If you like to teach programming to beginners, or if you like - functional programming in general, I think you’ll enjoy this - article. -

- - Overview - -
    - - First, I’ll show you how some simple JavaScript code - can be represented using my emoji puzzle. Even if you’re not - familiar with JS, you should still be able to understand it. - - - After that, I’ll talk about how to use my emoji - puzzle to teach lambda calculus, Church encoding, and Y - Combinator. - - - To help you track how far along you are in the article, I’ll show - a “step” number above each subheading. There are a - total of {numSteps} steps in this article. - - - If you decide to read later: I’d appreciate it if you - could share this article before you go!{' '} - - {' '} - Click here to Tweet this article. - - {hackerNewsLink && ( - <> - {' '} - You can also discuss this on{' '} - Hacker News - . - - )} - - - Also,{' '} - - the source code for this article is available on GitHub - - —please ★ star it! - -
- -
- ⚠️ Note: This article is for - programmers. If you’re a non-programmer, check out the course - itself instead: “ - - Y Combinator for Non-programmers - - ”. -
-
- -
- 👋 Available for Hire: My name is{' '} - Shu Uesugi, a freelance full-stack engineer who’s - looking for a full-time position (remote or in - SF/LA). Scroll to the bottom of this article for details. -
-
- - Identity function in JS - -

- First, take a look at the following code. It’s an{' '} - identity function in JavaScript that returns the - argument. -

- {`// Identity function in JS + + +

+ + Last month, I published a free online course called “ + + Y Combinator for Non-programmers + + ”. + {' '} + In this 17-page course, I teach computer science concepts such as + functional programming, lambda calculus, Church encoding, and Y + combinator in a way such that{' '} + + people who have zero programming knowledge can understand + + —without sacrificing rigor. +

+

+ To explain these concepts, I created{' '} + an educational puzzle using emojis 🍱. + In this article, I’ll explain how my emoji puzzles can represent + and execute functional code visually. Here’s a + sneak peek— + + try pressing below! + + : +

+ Functional JS code:} + >{`(sushi => sushi)('sandwich')`} + + Equivalent emoji puzzle: + +

+ If you like to teach programming to beginners, or if you like + functional programming in general, I think you’ll enjoy this + article. +

+ + Overview + +
    + + First, I’ll show you how some simple JavaScript + code can be represented using my emoji puzzle. Even if you’re + not familiar with JS, you should still be able to understand it. + + + After that, I’ll talk about how to use my emoji + puzzle to teach lambda calculus, Church encoding, and Y + Combinator. + + + To help you track how far along you are in the article, I’ll + show a “step” number above each subheading. There + are a total of {numSteps} steps in this article. + + + If you decide to read later: I’d appreciate it if + you could share this article before you go!{' '} + + {' '} + Click here to Tweet this article. + + {hackerNewsLink && ( + <> + {' '} + You can also discuss this on{' '} + + Hacker News + + . + + )} + + + Also,{' '} + + the source code for this article is available on GitHub + + —please ★ star it! + +
+ +
+ ⚠️ Note: This article is for + programmers. If you’re a non-programmer, check out the course + itself instead: “ + + Y Combinator for Non-programmers + + ”. +
+
+ +
+ 👋 Available for Hire: My name is{' '} + Shu Uesugi, a freelance full-stack engineer who’s + looking for a full-time position (remote or in + SF/LA). Scroll to the bottom of this article for details. +
+
+ + Identity function in JS + +

+ First, take a look at the following code. It’s an{' '} + identity function in JavaScript that returns the + argument. +

+ {`// Identity function in JS sushi => sushi`} -

- If you apply the above function on a string{' '} - 'sandwich', then the result would be{' '} - 'sandwich'. -

- {`// The result would be 'sandwich' +

+ If you apply the above function on a string{' '} + 'sandwich', then the result would be{' '} + 'sandwich'. +

+ {`// The result would be 'sandwich' (sushi => sushi)('sandwich')`} -

- Now, here’s the interesting part: One day, I realized - that the above JS code can be{' '} - described visually using emojis. Check this out: -

- - An “emoji puzzle” that visually describes -
- the JS code from the above -
-

- The above emoji puzzle is equivalent to the earlier JS code. First, - the identity function sushi => sushi… -

- - lineNumber === 0 && tokenNumber > 0 && tokenNumber < 5 - } - >{`(sushi => sushi)('sandwich')`} -

- …is represented by the bottom two items on the - puzzle, which are both . -

- - - sushi => sushi is represented -
- by the bottom two items -
-
-

- Second, the argument 'sandwich' to the - identity function… -

- - lineNumber === 0 && tokenNumber > 6 && tokenNumber < 8 - } - >{`(sushi => sushi)('sandwich')`} -

- …is represented by the top item on the puzzle, - which is a . -

- - - The argument 'sandwich' is represented +

+ Now, here’s the interesting part: One day, I realized + that the above JS code can be{' '} + described visually using emojis. Check this out: +

+ + An “emoji puzzle” that visually describes
- by the top item -
-
-

- That’s how my emoji puzzle can visually describe a simple JS - expression. Next, let’s talk about how we can{' '} - it. -

- - Side Note: To keep things simple, this puzzle doesn’t - distinguish between variable names (e.g.{' '} - sushi) and strings (e.g.{' '} - 'sushi'). Therefore, both{' '} - sushi and 'sushi'{' '} - will be represented as . - - - Running the function - -

- I’ve added the button to the JS code - snippet so you can see the result.{' '} - - If you press , - {' '} - you’ll see that the result is 'sandwich'. -

- {`(sushi => sushi)('sandwich')`} -

- Now, we can also “run” the equivalent emoji puzzle and get the same - result.{' '} - - Try pressing the button below the - puzzle. - -

- - - -

- The result is , which is the same as - what happens when you run the equivalent JS code. -

-

- So, you can an emoji - puzzle just as you can run a piece of JS code. Basically, this is - how I taught functional programming to non-programmers in my course - ( - - Y Combinator for Non-programmers - - )—without showing any code. -

- - Another example - -

- Let’s take a look at another example. Here’s a piece of JS code - that’s slightly different from before. It’s a function that{' '} - ignores the input and always returns{' '} - 'pizza'. -

- {`// A function that ignores the input + the JS code from the above + +

+ The above emoji puzzle is equivalent to the earlier JS code. + First, the identity function{' '} + sushi => sushi… +

+ + lineNumber === 0 && tokenNumber > 0 && tokenNumber < 5 + } + >{`(sushi => sushi)('sandwich')`} +

+ …is represented by the bottom two items on the + puzzle, which are both . +

+ + + sushi => sushi is represented +
+ by the bottom two items +
+
+

+ Second, the argument 'sandwich' to the + identity function… +

+ + lineNumber === 0 && tokenNumber > 6 && tokenNumber < 8 + } + >{`(sushi => sushi)('sandwich')`} +

+ …is represented by the top item on the puzzle, + which is a . +

+ + + The argument 'sandwich' is represented +
+ by the top item +
+
+

+ That’s how my emoji puzzle can visually describe a simple JS + expression. Next, let’s talk about how we can{' '} + it. +

+ + Side Note: To keep things simple, this puzzle doesn’t + distinguish between variable names (e.g.{' '} + sushi) and strings (e.g.{' '} + 'sushi'). Therefore, both{' '} + sushi and{' '} + 'sushi' will be represented as{' '} + . + + + Running the function + +

+ I’ve added the button to the JS code + snippet so you can see the result.{' '} + + If you press , + {' '} + you’ll see that the result is 'sandwich'. +

+ {`(sushi => sushi)('sandwich')`} +

+ Now, we can also “run” the equivalent emoji puzzle and get the + same result.{' '} + + Try pressing the button below the + puzzle. + +

+ + + +

+ The result is , which is the same as + what happens when you run the equivalent JS code. +

+

+ So, you can an emoji + puzzle just as you can run a piece of JS code. Basically, this is + how I taught functional programming to non-programmers in my + course ( + + Y Combinator for Non-programmers + + )—without showing any code. +

+ + Another example + +

+ Let’s take a look at another example. Here’s a piece of JS code + that’s slightly different from before. It’s a function that{' '} + ignores the input and always returns{' '} + 'pizza'. +

+ {`// A function that ignores the input // and always returns 'pizza' sushi => 'pizza'`} -

- Let’s run the above code with 'sandwich' as - the argument. -

- {`(sushi => 'pizza')('sandwich')`} -

- As expected, the result is 'pizza'. Now, - this code can be represented using my emoji puzzle as follows.{' '} - -

- -

- Just like the JS code, the emoji puzzle ended up with a{' '} - after running it. -

-

- What we learned so far: Simple JS code like below can - be visually represented using emoji puzzles. + Let’s run the above code with 'sandwich'{' '} + as the argument.

{`(sushi => 'pizza')('sandwich')`} +

+ As expected, the result is 'pizza'. Now, + this code can be represented using my emoji puzzle as follows.{' '} + +

+ +

+ Just like the JS code, the emoji puzzle ended up with a{' '} + after running it. +

+ +

+ What we learned so far: Simple JS code like below + can be visually represented using emoji puzzles. +

+ Functional JS code:} + >{`(sushi => sushi)('sandwich')`} + Equivalent emoji puzzle: + + +
+ Functional JS code:} + >{`(sushi => 'pizza')('sandwich')`} + Equivalent emoji puzzle: + + +
+ + Visualizing evaluation rules + +

+ Because you know how to code, you have a mental model of how + function evaluation works. If you see{' '} + (sushi => sushi)('sandwich'), you can + quickly figure out that the result would be{' '} + 'sandwich'. If you see{' '} + (sushi => 'pizza')('sandwich'), you know + that the result would be 'pizza'. You + know what free variables and bound variables mean. +

+

+ On the other hand, non-programmers may not have a mental model of + how function evaluation works. To help them develop a mental model + without showing them any code, I created a{' '} + step-by-step visualization of function evaluation + rules using the emoji puzzle I mentioned earlier. +

+

Let’s reuse the earlier example again:

+ Functional JS code:} >{`(sushi => sushi)('sandwich')`} Equivalent emoji puzzle: +

+ On the puzzle below,{' '} + + try pressing the button + + . This button is a bit different from the last time— + + it shows all the steps that happen in between the beginning and + the end + + . +

+ + + +

Here are the four steps it displayed:

+

+ Step 1.{' '} + + + +

+

+ First, we label each emoji.{' '} + + The top item is labeled as{' '} + (for + “Top”), the left item is labeled as{' '} + (for + “Left”), and the right item is labeled as{' '} + {' '} + (for “Right”). + +

+ + + +

+ Step 2.{' '} + + + +

+

+ Second, In this case, both the + bottom-left and the bottom-right are , + so there’s a match. +

+ + + +

+ Step 3.{' '} + + + +

+

+ Third, In this case, we copy the{' '} + on the top to the bottom-right. +

+ + + +

+ Step 4.{' '} + + + +

+

+ Finally, We’re left with just the{' '} + at the end. +

+ + + -
+

+ The above steps visually represent how functions are + evaluated—they are equivalent to how JavaScript evaluates{' '} + (sushi => sushi)('sandwich'). By learning + these rules, non-programmers can evaluate functions intuitively, + without learning about how variable bindings work. +

+ + If there’s no match + +

Let’s take a look at the other example from earlier:

Functional JS code:} >{`(sushi => 'pizza')('sandwich')`} Equivalent emoji puzzle: +

+ + Try pressing the button and see + what happens: + +

+ +

Here are the three steps it displayed:

+

+ Step 1.{' '} + + + —this is the same as before. + +

+ + + +

+ Step 2.{' '} + + This time, there’s no match between{' '} + and{' '} + . + The bottom-left is , but the + bottom-right is . + +

+ + No match:{' '} + {' '} + {' '} + + +

+ If there’s no match,{' '} + + we skip step 3 () and go directly to step 4. + +

+

+ Step 4.{' '} + + + +

+ -
- - Visualizing evaluation rules - -

- Because you know how to code, you have a mental model of how - function evaluation works. If you see{' '} - (sushi => sushi)('sandwich'), you can - quickly figure out that the result would be{' '} - 'sandwich'. If you see{' '} - (sushi => 'pizza')('sandwich'), you know - that the result would be 'pizza'. You know - what free variables and bound variables mean. -

-

- On the other hand, non-programmers may not have a mental model of - how function evaluation works. To help them develop a mental model - without showing them any code, I created a{' '} - step-by-step visualization of function evaluation - rules using the emoji puzzle I mentioned earlier. -

-

Let’s reuse the earlier example again:

- Functional JS code:} - >{`(sushi => sushi)('sandwich')`} - Equivalent emoji puzzle: -

- On the puzzle below,{' '} - - try pressing the button - - . This button is a bit different from the last time— - - it shows all the steps that happen in between the beginning and - the end - - . -

- - - -

Here are the four steps it displayed:

-

- Step 1.{' '} - - - -

-

- First, we label each emoji.{' '} - - The top item is labeled as{' '} - (for “ - Top”), the left item is labeled as{' '} - (for “ - Left”), and the right item is labeled as{' '} - (for - “Right”). - -

- - - -

- Step 2.{' '} - - - -

-

- Second, In this case, both the - bottom-left and the bottom-right are , - so there’s a match. -

- - - -

- Step 3.{' '} - - - -

-

- Third, In this case, we copy the{' '} - on the top to the bottom-right. -

- - - -

- Step 4.{' '} - - - -

-

- Finally, We’re left with just the{' '} - at the end. -

- - - - - -

- The above steps visually represent how functions are evaluated—they - are equivalent to how JavaScript evaluates{' '} - (sushi => sushi)('sandwich'). By learning - these rules, non-programmers can evaluate functions intuitively, - without learning about how variable bindings work. -

- - If there’s no match - -

Let’s take a look at the other example from earlier:

- Functional JS code:} - >{`(sushi => 'pizza')('sandwich')`} - Equivalent emoji puzzle: -

- - Try pressing the button and see what - happens: - -

- -

Here are the three steps it displayed:

-

- Step 1.{' '} - - - —this is the same as before. - -

- - - -

- Step 2.{' '} - - This time, there’s no match between{' '} - and{' '} - . The - bottom-left is , but the bottom-right - is . - -

- - No match:{' '} - {' '} - {' '} - - -

- If there’s no match,{' '} - - we skip step 3 () and go directly to step 4. - -

-

- Step 4.{' '} - - - -

- - - -

- That’s how the emoji puzzle visualizes the evaluation of a function - when there’s no matching variable in the function body—like{' '} - {`(sushi => 'pizza')('sandwich')`}. -

-

- More examples (optional read): Here are more examples - that might be helpful for your understanding. You can{' '} + That’s how the emoji puzzle visualizes the evaluation of a + function when there’s no matching variable in the function + body—like{' '} + {`(sushi => 'pizza')('sandwich')`}. +

+ +

+ More examples (optional read): Here are more + examples that might be helpful for your understanding. You can{' '} + + press + {' '} + on each example to see the evaluation visualization.{' '} + +

+ 'bread')`} + caption={<>Functional JS code:} + >{`(pizza => pizza)(spaghetti => 'bread')`} + Equivalent emoji puzzle: +
+ Functional JS code:} + >{`(salad => 'hotDog')(curry => 'tacos')`} + Equivalent emoji puzzle: +
+ + More complicated expressions + +

+ Let’s take a look at more complicated functional JS expressions + and see if they can be represented using an emoji puzzle. Check + out the following JS expression, and - press - {' '} - on each example to see the evaluation visualization.{' '} - + {' '} + try to guess what the result would be before pressing the{' '} + button. +

'bread')`} - caption={<>Functional JS code:} - >{`(pizza => pizza)(spaghetti => 'bread')`} - Equivalent emoji puzzle: -
- Functional JS code:} - >{`(salad => 'hotDog')(curry => 'tacos')`} - Equivalent emoji puzzle: -
- - More complicated expressions - -

- Let’s take a look at more complicated functional JS expressions and - see if they can be represented using an emoji puzzle. Check out the - following JS expression, and - - {' '} - try to guess what the result would be before pressing the{' '} - button. - -

- - Guess what the result would be -
- before pressing the button! - - } - >{`(sushi => sandwich => sushi)( - 'hamburger' -)('chicken')`}
-

- The result was {`'hamburger'`}. It’s - because {'sushi'} is bound to{' '} - {`'hamburger'`},{' '} - {'sandwich'} is bound to{' '} - {`'chicken'`}, and it returns what’s in{' '} - {'sushi'}. -

-

And here’s the equivalent emoji puzzle:

- -

Let’s break it down. First, the function expression…

- - lineNumber === 0 && tokenNumber > 0 && tokenNumber < 9 - } - >{`(sushi => sandwich => sushi)( - 'hamburger' -)('chicken')`} -

…is represented by the bottom row:

- - - sushi => sandwich => sushi - - -

And the two arguments…

- - (lineNumber === 1 && tokenNumber > 0 && tokenNumber < 2) || - (lineNumber === 2 && tokenNumber > 2 && tokenNumber < 4) - } - >{`(sushi => sandwich => sushi)( + result={`'hamburger'`} + caption={ + <> + Guess what the result would be +
+ before pressing the button! + + } + >{`(sushi => sandwich => sushi)( 'hamburger' )('chicken')`}
-

…are represented by the top and the middle rows:

- - - ('hamburger')('chicken') - - -

- Now, let’s talk about how we evaluate this function. In JS, we first - evaluate the function call with the argument{' '} - 'hamburger'. -

- In JS, we evaluate this part first} - shouldHighlight={(lineNumber, tokenNumber) => - lineNumber === 0 || - (lineNumber === 1 && tokenNumber > 0 && tokenNumber < 2) || - (lineNumber === 2 && tokenNumber < 2) - } - >{`(sushi => sandwich => sushi)( +

+ The result was {`'hamburger'`}. It’s + because {'sushi'} is bound to{' '} + {`'hamburger'`},{' '} + {'sandwich'} is bound to{' '} + {`'chicken'`}, and it returns what’s in{' '} + {'sushi'}. +

+

And here’s the equivalent emoji puzzle:

+ +

Let’s break it down. First, the function expression…

+ + lineNumber === 0 && tokenNumber > 0 && tokenNumber < 9 + } + >{`(sushi => sandwich => sushi)( 'hamburger' )('chicken')`} -

- Equivalently, in the emoji puzzle,{' '} - we evaluate the bottom two rows first. We ignore - the top row initially, which is shaded in blue. -

- - Focus on the bottom two rows, and -
- Ignore the top row for now -
-

- If you look at the left edge of the puzzle, the bottom two rows - correspond to the pair of{' '} - 1 - ’s. That’s the rule:{' '} - - In an emoji puzzle with 3 rows, you start with the pair of{' '} - 1’s. - -

-

- Next, let’s label each item on the bottom two rows. This time, in - addition to{' '} - {' '} - {' '} - ,{' '} - - we now have a new label{' '} - - {' '} - for the . -

- - There’s a new label{' '} - -
- for the -
-

- Here’s the rule:{' '} - - The middle items on the bottom row are labeled as{' '} - , - and you can ignore them. - {' '} - You can pretend that{' '} - - ’s don’t exist and apply the other rules from before. -

-

Let’s take a look at the next few steps in this iteration:

- - - - - - - -

This is exactly like how the earlier JS code is evaluated.

- After evaluating this part…} - shouldHighlight={(lineNumber, tokenNumber) => - lineNumber === 0 || - (lineNumber === 1 && tokenNumber > 0 && tokenNumber < 2) || - (lineNumber === 2 && tokenNumber < 2) - } - >{`(sushi => sandwich => sushi)( +

…is represented by the bottom row:

+ + + sushi => sandwich => sushi + + +

And the two arguments…

+ + (lineNumber === 1 && tokenNumber > 0 && tokenNumber < 2) || + (lineNumber === 2 && tokenNumber > 2 && tokenNumber < 4) + } + >{`(sushi => sandwich => sushi)( 'hamburger' )('chicken')`} - - - …it becomes this, which is -
- equivalent to the above emoji puzzle - - } - >{`(sandwich => 'hamburger')('chicken')`}
-

- But we’re not done yet! Let’s continue to the end by{' '} - - pressing the button below: - -

- Let’s continue to the end! -

- We ended up with a , which is exactly - the same as what the JS code evaluated to. So we’ve shown that - complex functional JS expressions can be represented using an emoji - puzzle. -

- +

…are represented by the top and the middle rows:

+ + + ('hamburger')('chicken') + +

- What we learned so far: Complex functional JS - expressions can be represented using an emoji puzzle. + Now, let’s talk about how we evaluate this function. In JS, we + first evaluate the function call with the argument{' '} + 'hamburger'.

Functional JS code:} + caption={<>In JS, we evaluate this part first} + shouldHighlight={(lineNumber, tokenNumber) => + lineNumber === 0 || + (lineNumber === 1 && tokenNumber > 0 && tokenNumber < 2) || + (lineNumber === 2 && tokenNumber < 2) + } >{`(sushi => sandwich => sushi)( 'hamburger' )('chicken')`} - - Equivalent emoji puzzle: +

+ Equivalently, in the emoji puzzle,{' '} + we evaluate the bottom two rows first. We ignore + the top row initially, which is shaded in blue. +

+ + Focus on the bottom two rows, and
- (Start with the pair of{' '} - 1’s) -
- - -
- + Ignore the top row for now +

- More examples (optional read): Here’s another example - that might be helpful for your understanding. Check out the - following JS expression, and{' '} + If you look at the left edge of the puzzle, the bottom two rows + correspond to the pair of{' '} + 1 + ’s. That’s the rule:{' '} - try to guess what the result would be before pressing the{' '} - button. + In an emoji puzzle with 3 rows, you start with the pair of{' '} + 1’s.

- {`(friedPotatoes => pizza => pizza)( - spaghetti => spaghetti -)('salad')`}

- The result was 'salad'. Now, here’s the - equivalent emoji puzzle below.{' '} + Next, let’s label each item on the bottom two rows. This time, in + addition to{' '} + {' '} + {' '} + ,{' '} - Try pressing . + we now have a new label{' '} + {' '} - Again, remember that: + for the .

-
    - - We start with the pair of{' '} - 1’s. - - + + There’s a new label{' '} + +
    + for the +
    +

    + Here’s the rule:{' '} + The middle items on the bottom row are labeled as{' '} , and you can ignore them. - -

- Equivalent emoji puzzle: -
-

- Next, here’s slightly different JS code.{' '} - - There’s an extra pair of parentheses around{' '} - (spaghetti => spaghetti)('salad'), so - this will be evaluated first - - , and the result will be different from the last time. + {' '} + You can pretend that{' '} + + ’s don’t exist and apply the other rules from before.

+

Let’s take a look at the next few steps in this iteration:

+ + + + + + + +

This is exactly like how the earlier JS code is evaluated.

pizza`} - caption={guessTheResult} - >{`(friedPotatoes => pizza => pizza)( - (spaghetti => spaghetti)("salad") -)`} + caption={<>After evaluating this part…} + shouldHighlight={(lineNumber, tokenNumber) => + lineNumber === 0 || + (lineNumber === 1 && tokenNumber > 0 && tokenNumber < 2) || + (lineNumber === 2 && tokenNumber < 2) + } + >{`(sushi => sandwich => sushi)( + 'hamburger' +)('chicken')`}
+ + + …it becomes this, which is +
+ equivalent to the above emoji puzzle + + } + >{`(sandwich => 'hamburger')('chicken')`}

- Let’s take a look at the equivalent emoji puzzle. This time,{' '} + But we’re not done yet! Let’s continue to the end by{' '} - the pair of 1’s - is on the top two rows - {' '} - instead.{' '} - - Try pressing - {' '} - and see what happens! + pressing the button below: +

- - This time, the pair of{' '} - 1’s is -
- on the top two rows instead -
+ Let’s continue to the end!

- Summary: + We ended up with a , which is exactly + the same as what the JS code evaluated to. So we’ve shown that + complex functional JS expressions can be represented using an + emoji puzzle.

-
    - - In JavaScript, you can change the evaluation order - of an expression by placing parentheses{' '} - on different locations. - - - In emoji puzzles, you can change the evaluation - order by placing{' '} + +

    + What we learned so far: Complex functional JS + expressions can be represented using an emoji puzzle. +

    + Functional JS code:} + >{`(sushi => sandwich => sushi)( + 'hamburger' +)('chicken')`} + + Equivalent emoji puzzle: +
    + (Start with the pair of{' '} + 1’s) +
    + + +
    + +

    + More examples (optional read): Here’s another + example that might be helpful for your understanding. Check out + the following JS expression, and{' '} - the numbers (e.g.{' '} - 1’s and{' '} - 2’s) + try to guess what the result would be before pressing the{' '} + button. + +

    + {`(friedPotatoes => pizza => pizza)( + spaghetti => spaghetti +)('salad')`} +

    + The result was 'salad'. Now, here’s the + equivalent emoji puzzle below.{' '} + + Try pressing . {' '} - on different locations. - -

- - - Church numerals - -

- Let’s take a look at something more interesting. Here’s a function - called convert that takes a function as an - argument. It then applies (n => n + 1)(0){' '} - to it. -

- {`function convert(f) { + Again, remember that: +

+
    + + We start with the pair of{' '} + 1’s. + + + The middle items on the bottom row are labeled as{' '} + + , and you can ignore them. + +
+ Equivalent emoji puzzle: +
+

+ Next, here’s slightly different JS code.{' '} + + There’s an extra pair of parentheses around{' '} + (spaghetti => spaghetti)('salad'), so + this will be evaluated first + + , and the result will be different from the last time. +

+ pizza`} + caption={guessTheResult} + >{`(friedPotatoes => pizza => pizza)( + (spaghetti => spaghetti)("salad") +)`} +

+ Let’s take a look at the equivalent emoji puzzle. This time,{' '} + + the pair of 1’s + is on the top two rows + {' '} + instead.{' '} + + Try pressing + {' '} + and see what happens! +

+ + This time, the pair of{' '} + 1’s is +
+ on the top two rows instead +
+

+ Summary: +

+
    + + In JavaScript, you can change the evaluation + order of an expression by placing{' '} + parentheses on different locations. + + + In emoji puzzles, you can change the evaluation + order by placing{' '} + + the numbers (e.g.{' '} + 1’s and{' '} + 2’s) + {' '} + on different locations. + +
+ + + Church numerals + +

+ Let’s take a look at something more interesting. Here’s a function + called convert that takes a function as + an argument. It then applies{' '} + (n => n + 1)(0) to it. +

+ {`function convert(f) { return f(n => n + 1)(0) }`} -

- Now, suppose that we apply convert on this - function: sushi => sandwich => sandwich. - What would the result be?{' '} - - Try to guess before pressing the {' '} - button! - -

- {`function convert(f) { +

+ Now, suppose that we apply convert on + this function:{' '} + sushi => sandwich => sandwich. What would + the result be?{' '} + + Try to guess before pressing the {' '} + button! + +

+ {`function convert(f) { return f(n => n + 1)(0) } convert(sushi => sandwich => sandwich )`} -

- The result is 0 because: -

-
    - - sushi is bound to{' '} - n => n + 1 - - - sandwich is bound to{' '} - 0 - - - And it returns sandwich, which is{' '} - 0. - -
-

- Now, what if the input changes as follows?{' '} - - Try pressing on each example. - -

- {`convert(sushi => sandwich => +

+ The result is 0 because: +

+
    + + sushi is bound to{' '} + n => n + 1 + + + sandwich is bound to{' '} + 0 + + + And it returns sandwich, which is{' '} + 0. + +
+

+ Now, what if the input changes as follows?{' '} + + Try pressing on each example. + +

+ {`convert(sushi => sandwich => sushi(sandwich) )`} - {`convert(sushi => sandwich => + {`convert(sushi => sandwich => sushi(sushi(sandwich)) )`} - {`convert(sushi => sandwich => + {`convert(sushi => sandwich => sushi(sushi(sushi(sandwich))) )`} -

- The results are 1,{' '} - 2, and 3{' '} - respectively because: -

-
    - - sushi is bound to{' '} - n => n + 1 - - - sandwich is bound to{' '} - 0 - - - So it applies n => n + 1 to{' '} - 0 for the number of times{' '} - sushi is used in the function body. - -
-

- What we learned so far: If we have a function that - has one of the following patterns: + The results are 1,{' '} + 2, and 3{' '} + respectively because:

- {`// a & b can be any variable name +
    + + sushi is bound to{' '} + n => n + 1 + + + sandwich is bound to{' '} + 0 + + + So it applies n => n + 1 to{' '} + 0 for the number of times{' '} + sushi is used in the function body. + +
+ +

+ What we learned so far: If we have a function that + has one of the following patterns: +

+ {`// a & b can be any variable name a => b => b a => b => a(b) a => b => a(a(b)) a => b => a(a(a(b))) // ...and so on...`} -

- Then, when the function is passed to{' '} - convert(),{' '} - - it returns the number of times a is - applied to b - {' '} - in the function body. -

- {`convert(a => b => b) // 0 +

+ Then, when the function is passed to{' '} + convert(),{' '} + + it returns the number of times a is + applied to b + {' '} + in the function body. +

+ {`convert(a => b => b) // 0 convert(a => b => a(b)) // 1 convert(a => b => a(a(b))) // 2 convert(a => b => a(a(a(b)))) // 3 // ...and so on...`} -
-

- These functions that can be converted to numbers using{' '} - convert() have a{' '} - special name. They are called{' '} - - Church numerals - - . Each function represents some Church numeral. -

- {`// Church numeral 0 +
+

+ These functions that can be converted to numbers using{' '} + convert() have a{' '} + special name. They are called{' '} + + Church numerals + + . Each function represents some Church numeral. +

+ {`// Church numeral 0 a => b => b // Church numeral 1 @@ -1400,12 +1415,62 @@ a => b => a(a(b))) a => b => a(a(a(b)))) // ...and so on...`} -

- You might be wondering: “What’s the point of this?” - I’ll explain it shortly, but before I do so, let me explain how my - emoji puzzles can express Church numerals. -

-
+

+ You might be wondering: “What’s the point of this?” + I’ll explain it shortly, but before I do so, let me explain how my + emoji puzzles can express Church numerals. +

+

+ Here’s an emoji puzzle that represents{' '} + sushi => sandwich => sandwich, which is{' '} + Church numeral 0. +

+ + Represents: +
+ sushi => sandwich => sandwich +
+ (Church numeral 0) +
+

+ Here’s what’s new:{' '} + + We now have a {' '} + button below the puzzle which converts it to the corresponding + Church number. + {' '} + Try pressing it. +

+ +

+ Other Church numeral functions can also be represented using emoji + puzzles, and they can be converted as well. Of course, the emojis + don’t need to be and{' '} + + —they can be other emojis, as long as they follow the same + pattern. +

+ + Represents: +
+ + hamburger => chicken => hamburger(chicken) + +
+ (Church numeral 1) +
+ + Church numeral 2 + + + Church numeral 3 + +

+ Now that we’ve covered the basics of Church numerals, we’ll talk + next about why Church numerals are interesting. +

+
+ diff --git a/src/components/ExpressionRunnerConfigContext.ts b/src/components/ExpressionRunnerConfigContext.ts index a15582d53..054187715 100644 --- a/src/components/ExpressionRunnerConfigContext.ts +++ b/src/components/ExpressionRunnerConfigContext.ts @@ -2,6 +2,7 @@ import React from 'react' export interface ExpressionRunnerConfigContextProps { pointToRunButton?: true + churchNumerals?: true } export const ExpressionRunnerConfigContextDefault: ExpressionRunnerConfigContextProps = {} diff --git a/src/components/ExpressionRunnerControls.tsx b/src/components/ExpressionRunnerControls.tsx index b120a759b..8d4f734f1 100644 --- a/src/components/ExpressionRunnerControls.tsx +++ b/src/components/ExpressionRunnerControls.tsx @@ -1,10 +1,12 @@ /** @jsx jsx */ import { css, jsx } from '@emotion/core' +import { useContext } from 'react' import H from 'src/components/H' import { colors, spaces, fontSizes } from 'src/lib/theme' import Emoji from 'src/components/Emoji' import { ExpressionRunnerProps } from 'src/types/ExpressionRunnerTypes' import ExpressionRunnerButton from 'src/components/ExpressionRunnerButton' +import ExpressionRunnerConfigContext from 'src/components/ExpressionRunnerConfigContext' import locale from 'src/lib/locale' interface ExpressionRunnerControlsProps { @@ -67,6 +69,7 @@ const ExpressionRunnerControls = ({ }: ExpressionRunnerControlsProps) => { const centerButtonWidth = convert ? 66 : 48 const sideButtonsWidth = (100 - centerButtonWidth) / 2 - 2 + const { churchNumerals } = useContext(ExpressionRunnerConfigContext) return (
) : skipToTheEnd ? ( convert ? ( - + churchNumerals ? ( + + ) : ( + + ) ) : ( ) @@ -146,7 +156,14 @@ const ExpressionRunnerControls = ({ ) ) : convert ? ( - + churchNumerals ? ( + + ) : ( + + ) ) : ( )} diff --git a/src/components/ExpressionRunnerExplanation.tsx b/src/components/ExpressionRunnerExplanation.tsx index 37ffc2f81..f6447e948 100644 --- a/src/components/ExpressionRunnerExplanation.tsx +++ b/src/components/ExpressionRunnerExplanation.tsx @@ -1,4 +1,4 @@ -import React from 'react' +import React, { useContext } from 'react' import { Bold } from 'src/components/ContentTags' import EmojiNumber from 'src/components/EmojiNumber' import Emoji from 'src/components/Emoji' @@ -13,6 +13,7 @@ import H from 'src/components/H' import InlinePrioritiesLabel from 'src/components/InlinePrioritiesLabel' import InlineBorder from 'src/components/InlineBorder' import { ExpressionRunnerPrecomputedProps } from 'src/components/ExpressionRunnerPrecomputed' +import ExpressionRunnerConfigContext from 'src/components/ExpressionRunnerConfigContext' interface ExpressionRunnerExplanationProps { expressionContainer: SteppedExpressionContainer @@ -358,30 +359,43 @@ const ExpressionRunnerExplanation = ({ showAllShowSteps, hideFuncUnboundBadge, convert -}: ExpressionRunnerExplanationProps) => ( - <> - { - <> - {isDone ? ( - convert ? ( - +}: ExpressionRunnerExplanationProps) => { + const { churchNumerals } = useContext(ExpressionRunnerConfigContext) + return ( + <> + { + <> + {isDone ? ( + convert ? ( + churchNumerals ? ( + + ) : ( + + ) + ) : ( + + ) ) : ( - - ) - ) : ( - !isRunning && ( - - ) - )} - - } - -) + !isRunning && ( + + ) + )} + + } + + ) +} export default ExpressionRunnerExplanation diff --git a/src/components/H.tsx b/src/components/H.tsx index f892e1748..d86ca4320 100644 --- a/src/components/H.tsx +++ b/src/components/H.tsx @@ -140,6 +140,10 @@ interface HProps { | { name: 'undoConvertToMathbox' } | { name: 'doneConvertToMathbox' } | { name: 'canBeConverted' } + | { name: 'convertToChurchNumeral'; lowerCase?: true } + | { name: 'undoConvertToChurchNumeral' } + | { name: 'doneConvertToChurchNumeral' } + | { name: 'canBeConverted' } | { name: 'plusOneFeature'; capitalize?: true } | { name: 'minusOneFeature'; capitalize?: true; addNewline?: true } | { name: 'repeatFeature'; capitalize?: true; addNewline?: true } @@ -1414,6 +1418,42 @@ const H = ({ args, highlightType, episodeNumberOverrides }: HProps) => { ) } } + if (args.name === 'convertToChurchNumeral') { + if (locale === 'en') { + return ( + <> + {args.lowerCase ? 'c' : 'C'}onvert to a Number{' '} + 🔢 + + ) + } else { + return <> + } + } + if (args.name === 'undoConvertToChurchNumeral') { + if (locale === 'en') { + return ( + + Undo + + ) + } else { + return <> + } + } + if (args.name === 'doneConvertToChurchNumeral') { + if (locale === 'en') { + return ( + <> + + Converted to a number! + + + ) + } else { + return <> + } + } if (args.name === 'canBeConverted') { if (locale === 'en') { return <>Lunchbox that can be converted to From 54e790fe704850dc378a6c1c7db3e36aef74d341 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Wed, 6 Nov 2019 09:49:32 -0800 Subject: [PATCH 65/83] Try to fix priorities --- pages/emojis-functional-programming.tsx | 11 +- ...uildExpressionRunnerConfigFromShorthand.ts | 2 + .../lib/expressionRunnerShorthandConfig.ts | 1 + scripts/lib/runnerConfigs.ts | 22 +++ src/components/Runners/Fgen.tsx | 12 ++ src/components/Runners/Pebp.tsx | 12 ++ src/components/Runners/fakeIndex.ts | 2 + src/components/Runners/index.ts | 2 + src/lib/runners/fgen.json | 129 +++++++++++++++ src/lib/runners/pebp.json | 150 ++++++++++++++++++ 10 files changed, 339 insertions(+), 4 deletions(-) create mode 100644 src/components/Runners/Fgen.tsx create mode 100644 src/components/Runners/Pebp.tsx create mode 100644 src/lib/runners/fgen.json create mode 100644 src/lib/runners/pebp.json diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 5e2c1831a..c4846e864 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -1459,16 +1459,19 @@ a => b => a(a(a(b))))
(Church numeral 1) - + Church numeral 2 - - + + Church numeral 3 - +

Now that we’ve covered the basics of Church numerals, we’ll talk next about why Church numerals are interesting.

+ + You can do maths with functions + diff --git a/scripts/lib/buildExpressionRunnerConfigFromShorthand.ts b/scripts/lib/buildExpressionRunnerConfigFromShorthand.ts index e006df226..462b78973 100644 --- a/scripts/lib/buildExpressionRunnerConfigFromShorthand.ts +++ b/scripts/lib/buildExpressionRunnerConfigFromShorthand.ts @@ -241,6 +241,7 @@ const buildExpressionRunnerConfigFromShorthand = ( showPriorities, explanationsVisibility, showAllShowSteps, + applicativeOrder, nextIterations, skipToTheEnd, convert @@ -254,6 +255,7 @@ const buildExpressionRunnerConfigFromShorthand = ( hidePriorities: !showPriorities, hideFuncUnboundBadgeOnExplanation, hideRunButton: false, + applicativeOrder, explanationsVisibility, lastAllowedExpressionStateAfterIterations: nextIterations, showAllShowSteps, diff --git a/scripts/lib/expressionRunnerShorthandConfig.ts b/scripts/lib/expressionRunnerShorthandConfig.ts index ae6dce22b..92bbef832 100644 --- a/scripts/lib/expressionRunnerShorthandConfig.ts +++ b/scripts/lib/expressionRunnerShorthandConfig.ts @@ -120,6 +120,7 @@ interface ExpressionRunnerPredefinedConfig { hideFuncUnboundBadgeOnExplanation?: boolean showPriorities?: boolean nextIterations?: number + applicativeOrder?: boolean explanationsVisibility?: ExpressionRunnerProps['explanationsVisibility'] showAllShowSteps?: ExpressionRunnerProps['showAllShowSteps'] skipToTheEnd?: boolean diff --git a/scripts/lib/runnerConfigs.ts b/scripts/lib/runnerConfigs.ts index 48f5193a1..9fb283ed6 100644 --- a/scripts/lib/runnerConfigs.ts +++ b/scripts/lib/runnerConfigs.ts @@ -760,6 +760,17 @@ export const epoi: ExpressionRunnerShorthandConfig = { convert: 'toMathBox' } +export const fgen: ExpressionRunnerShorthandConfig = { + runner: 'predefined', + initialExpressionContainers: [ + initialExpressionContainers.nskn, + initialExpressionContainers.hdpc + ], + showPriorities: true, + convert: 'toMathBox', + applicativeOrder: true +} + export const nlyu: ExpressionRunnerShorthandConfig = { runner: 'simple', showPriorities: true, @@ -867,6 +878,17 @@ export const vlob: ExpressionRunnerShorthandConfig = { convert: 'toMathBox' } +export const pebp: ExpressionRunnerShorthandConfig = { + runner: 'predefined', + initialExpressionContainers: [ + initialExpressionContainers.tgxv, + initialExpressionContainers.qjcv + ], + showPriorities: true, + convert: 'toMathBox', + applicativeOrder: true +} + export const dubm: ExpressionRunnerShorthandConfig = { runner: 'simple', showPriorities: true, diff --git a/src/components/Runners/Fgen.tsx b/src/components/Runners/Fgen.tsx new file mode 100644 index 000000000..212cb71b0 --- /dev/null +++ b/src/components/Runners/Fgen.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/fgen.json' + +const Fgen = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Fgen diff --git a/src/components/Runners/Pebp.tsx b/src/components/Runners/Pebp.tsx new file mode 100644 index 000000000..37d14f9c2 --- /dev/null +++ b/src/components/Runners/Pebp.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/pebp.json' + +const Pebp = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Pebp diff --git a/src/components/Runners/fakeIndex.ts b/src/components/Runners/fakeIndex.ts index b33836cd3..7ee8e1324 100644 --- a/src/components/Runners/fakeIndex.ts +++ b/src/components/Runners/fakeIndex.ts @@ -104,6 +104,7 @@ export { default as Jjjh } from 'src/components/FakeRunner' export { default as Dwzy } from 'src/components/FakeRunner' export { default as Mifg } from 'src/components/FakeRunner' export { default as Epoi } from 'src/components/FakeRunner' +export { default as Fgen } from 'src/components/FakeRunner' export { default as Nlyu } from 'src/components/FakeRunner' export { default as Jyqf } from 'src/components/FakeRunner' export { default as Mzqc } from 'src/components/FakeRunner' @@ -120,6 +121,7 @@ export { default as Jwah } from 'src/components/FakeRunner' export { default as Nbck } from 'src/components/FakeRunner' export { default as Cawl } from 'src/components/FakeRunner' export { default as Vlob } from 'src/components/FakeRunner' +export { default as Pebp } from 'src/components/FakeRunner' export { default as Dubm } from 'src/components/FakeRunner' export { default as Rnug } from 'src/components/FakeRunner' export { default as Jzwg } from 'src/components/FakeRunner' diff --git a/src/components/Runners/index.ts b/src/components/Runners/index.ts index 23d72b8fa..2c17538f8 100644 --- a/src/components/Runners/index.ts +++ b/src/components/Runners/index.ts @@ -104,6 +104,7 @@ export { default as Jjjh } from 'src/components/Runners/Jjjh' export { default as Dwzy } from 'src/components/Runners/Dwzy' export { default as Mifg } from 'src/components/Runners/Mifg' export { default as Epoi } from 'src/components/Runners/Epoi' +export { default as Fgen } from 'src/components/Runners/Fgen' export { default as Nlyu } from 'src/components/Runners/Nlyu' export { default as Jyqf } from 'src/components/Runners/Jyqf' export { default as Mzqc } from 'src/components/Runners/Mzqc' @@ -120,6 +121,7 @@ export { default as Jwah } from 'src/components/Runners/Jwah' export { default as Nbck } from 'src/components/Runners/Nbck' export { default as Cawl } from 'src/components/Runners/Cawl' export { default as Vlob } from 'src/components/Runners/Vlob' +export { default as Pebp } from 'src/components/Runners/Pebp' export { default as Dubm } from 'src/components/Runners/Dubm' export { default as Rnug } from 'src/components/Runners/Rnug' export { default as Jzwg } from 'src/components/Runners/Jzwg' diff --git a/src/lib/runners/fgen.json b/src/lib/runners/fgen.json new file mode 100644 index 000000000..ada838969 --- /dev/null +++ b/src/lib/runners/fgen.json @@ -0,0 +1,129 @@ +{ + "expressionContainers": [ + { + "expression": { + "arg": { + "name": "e", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1, + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "e", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "e", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "numLeafNodes": 3, + "containerState": "ready", + "previouslyChangedExpressionState": "default" + }, + { + "expression": { + "name": "shorthandNumber", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "shorthandNumber": 2, + "maxNestedFunctionDepth": 0 + }, + "numLeafNodes": 1, + "containerState": "done", + "previouslyChangedExpressionState": "default" + } + ], + "speed": 1, + "hideControls": false, + "explanationsVisibility": "hiddenInitialPausedOnly", + "hidePriorities": false, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": true, + "hideFuncUnboundBadgeOnExplanation": false, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "convert": "toMathBox", + "showBottomProgressBar": false +} diff --git a/src/lib/runners/pebp.json b/src/lib/runners/pebp.json new file mode 100644 index 000000000..d151ffdfa --- /dev/null +++ b/src/lib/runners/pebp.json @@ -0,0 +1,150 @@ +{ + "expressionContainers": [ + { + "expression": { + "arg": { + "name": "g", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "arg": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1, + 2, + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "g", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "g", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "g", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "numLeafNodes": 4, + "containerState": "ready", + "previouslyChangedExpressionState": "default" + }, + { + "expression": { + "name": "shorthandNumber", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "shorthandNumber": 3, + "maxNestedFunctionDepth": 0 + }, + "numLeafNodes": 1, + "containerState": "done", + "previouslyChangedExpressionState": "default" + } + ], + "speed": 1, + "hideControls": false, + "explanationsVisibility": "hiddenInitialPausedOnly", + "hidePriorities": false, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": true, + "hideFuncUnboundBadgeOnExplanation": false, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "convert": "toMathBox", + "showBottomProgressBar": false +} From 566b13b21d019dcd74123351efa3ab05e75b89f2 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Wed, 6 Nov 2019 10:14:50 -0800 Subject: [PATCH 66/83] Update title --- pages/emojis-functional-programming.tsx | 27 +++++++++---------------- 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index c4846e864..a11e439d4 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -61,19 +61,10 @@ const date = DateTime.fromISO('2019-11-08T12:00:00Z') // .toFormat('LLL d, yyyy') const dateSchemaString = date.setZone('America/Los_Angeles').toISO() -const title = 'Using Emojis to Teach Functional Programming to Non-programmers' -const titleWithEmoji = `🍱 ${title}` -const titleSplit = ( - <> - Using Emojis to Teach -
- Functional Programming to -
- Non-programmers - -) +const title = 'You Don’t Need Code to Explain Functional Programming' +const titleWithEmoji = `🍣 ${title} 🥪` const description = - 'A visual implementation of Lambda calculus, Church encoding, and Y combinator' + 'An emoji-based implementation of Lambda calculus, Church encoding, and Y combinator' const url = `${enBaseUrl}/emojis-functional-programming` const ogImageUrl = `${enBaseUrl}/static/images/blog-og.png` @@ -476,7 +467,7 @@ export default () => { padding-top: ${spaces(1.5)}; `} > - + { —without sacrificing rigor.

- To explain these concepts, I created{' '} - an educational puzzle using emojis 🍱. - In this article, I’ll explain how my emoji puzzles can represent - and execute functional code visually. Here’s a - sneak peek— + I didn’t use any code to explain these concepts. Instead, I + created an emoji puzzle that works as a runtime for + functional expressions. In this article, I’ll explain how my emoji + puzzles can represent and execute functional code{' '} + visually. Here’s a sneak peek— try pressing below! From 97b3c5ce2374b668aa5caf04e39f240f6c8d97e1 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Wed, 6 Nov 2019 10:16:43 -0800 Subject: [PATCH 67/83] Wordsmith --- pages/emojis-functional-programming.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index a11e439d4..e29097244 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -522,7 +522,7 @@ export default () => { people who have zero programming knowledge can understand - —without sacrificing rigor. + .

I didn’t use any code to explain these concepts. Instead, I @@ -559,8 +559,8 @@ export default () => { After that, I’ll talk about how to use my emoji - puzzle to teach lambda calculus, Church encoding, and Y - Combinator. + puzzle to teach functional programming concepts such as lambda + calculus, Church encoding, and Y Combinator. To help you track how far along you are in the article, I’ll From 635e16244efdb4c012094a0b0778a6c52cd64c9e Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Wed, 6 Nov 2019 10:26:23 -0800 Subject: [PATCH 68/83] Fix priority calculation --- scripts/lib/prioritizeExpression.ts | 85 ++++++++++++++--------------- src/lib/runners/pebp.json | 6 +- 2 files changed, 44 insertions(+), 47 deletions(-) diff --git a/scripts/lib/prioritizeExpression.ts b/scripts/lib/prioritizeExpression.ts index 94280bf2a..b44ad4d0b 100644 --- a/scripts/lib/prioritizeExpression.ts +++ b/scripts/lib/prioritizeExpression.ts @@ -58,8 +58,12 @@ function prioritizeCallExpressionHelper({ } newFunc = funcResult.expression - currentPriority = funcResult.maxDescendantPriority + 1 - maxDescendantPriority = currentPriority + if (applicativeOrder) { + currentPriority = funcResult.expression.priority + 1 + } else { + currentPriority = funcResult.maxDescendantPriority + 1 + maxDescendantPriority = currentPriority + } } else { newFunc = prioritizeExpressionHelper(expression.func, applicativeOrder) } @@ -91,7 +95,11 @@ function prioritizeCallExpressionHelper({ } newArg = argResult.expression - maxDescendantPriority = argResult.maxDescendantPriority + if (applicativeOrder) { + currentPriority = argResult.expression.priority + 1 + } else { + maxDescendantPriority = argResult.maxDescendantPriority + } } else { newArg = prioritizeExpressionHelper(expression.arg, applicativeOrder) } @@ -101,14 +109,7 @@ function prioritizeCallExpressionHelper({ ...expression, func: newFunc, arg: newArg, - priority: - currentPriority + - (applicativeOrder && - (isCall(expression.arg) || - isConditional(expression.arg) || - isBinary(expression.arg)) - ? 1 - : 0) + priority: currentPriority }, maxDescendantPriority } @@ -158,8 +159,12 @@ function prioritizeBinaryExpressionHelper({ } newFirst = funcResult.expression - currentPriority = funcResult.maxDescendantPriority + 1 - maxDescendantPriority = currentPriority + if (applicativeOrder) { + currentPriority = funcResult.expression.priority + 1 + } else { + currentPriority = funcResult.maxDescendantPriority + 1 + maxDescendantPriority = currentPriority + } } else { newFirst = prioritizeExpressionHelper(expression.first, applicativeOrder) } @@ -191,7 +196,11 @@ function prioritizeBinaryExpressionHelper({ } newSecond = argResult.expression - maxDescendantPriority = argResult.maxDescendantPriority + if (applicativeOrder) { + currentPriority = argResult.expression.priority + 1 + } else { + maxDescendantPriority = argResult.maxDescendantPriority + } } else { newSecond = prioritizeExpressionHelper(expression.second, applicativeOrder) } @@ -201,14 +210,7 @@ function prioritizeBinaryExpressionHelper({ ...expression, first: newFirst, second: newSecond, - priority: - currentPriority + - (applicativeOrder && - (isCall(expression.second) || - isConditional(expression.second) || - isBinary(expression.second)) - ? 1 - : 0) + priority: currentPriority }, maxDescendantPriority } @@ -260,8 +262,12 @@ function prioritizeConditionalExpressionHelper< }) } newCondition = conditionResult.expression - currentPriority = conditionResult.maxDescendantPriority + 1 - maxDescendantPriority = currentPriority + if (applicativeOrder) { + currentPriority = conditionResult.expression.priority + 1 + } else { + currentPriority = conditionResult.maxDescendantPriority + 1 + maxDescendantPriority = currentPriority + } } else { newCondition = prioritizeExpressionHelper( expression.condition, @@ -269,10 +275,6 @@ function prioritizeConditionalExpressionHelper< ) } - // TODO: There's probably a bug around currentPriority here - - // If both trueCase / falseCase go into if(){} then - // currentPriority will be duplicated - if ( isCall(expression.trueCase) || isConditional(expression.trueCase) || @@ -299,7 +301,11 @@ function prioritizeConditionalExpressionHelper< }) } newTrueCase = trueCaseResult.expression - maxDescendantPriority = trueCaseResult.maxDescendantPriority + if (applicativeOrder) { + currentPriority = trueCaseResult.expression.priority + 1 + } else { + maxDescendantPriority = trueCaseResult.maxDescendantPriority + } } else { newTrueCase = prioritizeExpressionHelper( expression.trueCase, @@ -333,7 +339,11 @@ function prioritizeConditionalExpressionHelper< }) } newFalseCase = falseCaseResult.expression - maxDescendantPriority = falseCaseResult.maxDescendantPriority + if (applicativeOrder) { + currentPriority = falseCaseResult.expression.priority + 1 + } else { + maxDescendantPriority = falseCaseResult.maxDescendantPriority + } } else { newFalseCase = prioritizeExpressionHelper( expression.falseCase, @@ -347,20 +357,7 @@ function prioritizeConditionalExpressionHelper< condition: newCondition, trueCase: newTrueCase, falseCase: newFalseCase, - priority: - currentPriority + - (applicativeOrder && - (isCall(expression.falseCase) || - isConditional(expression.falseCase) || - isBinary(expression.falseCase)) - ? 1 - : 0) + - (applicativeOrder && - (isCall(expression.trueCase) || - isConditional(expression.trueCase) || - isBinary(expression.trueCase)) - ? 1 - : 0) + priority: currentPriority }, maxDescendantPriority } diff --git a/src/lib/runners/pebp.json b/src/lib/runners/pebp.json index d151ffdfa..86ed84d1d 100644 --- a/src/lib/runners/pebp.json +++ b/src/lib/runners/pebp.json @@ -39,7 +39,7 @@ "argPriorityAgg": [ 1, 2, - 2 + 3 ], "funcPriorityAgg": [], "emphasizePriority": false, @@ -92,7 +92,7 @@ "type": "variable", "argPriorityAgg": [], "funcPriorityAgg": [ - 2 + 3 ], "emphasizePriority": false, "bound": true, @@ -100,7 +100,7 @@ }, "state": "default", "type": "call", - "priority": 2, + "priority": 3, "maxNestedFunctionDepth": 0 }, "type": "function", From 466f7d996cc37a7056c4205b29709cf85f1f9730 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Wed, 6 Nov 2019 10:27:45 -0800 Subject: [PATCH 69/83] Wordsmith --- pages/emojis-functional-programming.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index e29097244..38e656d43 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -558,7 +558,7 @@ export default () => { not familiar with JS, you should still be able to understand it. - After that, I’ll talk about how to use my emoji + After that, I’ll talk about how I used my emoji puzzle to teach functional programming concepts such as lambda calculus, Church encoding, and Y Combinator. From 6383184d3b07a2bf8cb0a9dee2a760a9ab81b9cc Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Wed, 6 Nov 2019 11:01:32 -0800 Subject: [PATCH 70/83] Clean up container and update og image --- pages/emojis-functional-programming.tsx | 12 +++--------- public/static/images/blog-og.png | Bin 87055 -> 93852 bytes 2 files changed, 3 insertions(+), 9 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 38e656d43..c5887a1d7 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -461,21 +461,15 @@ export default () => { - - - +

F(~3PU)^CB&0;?mX=bw8xulwQp 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 N?r51 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�u*IXKRA*KRu>GJ?k_3zVDTEh7T|w%t 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⪚}Hnw0@&Jioq3I>E4~?Z%=J+7yT7X!LI*aazVQ4^}kn z$LAF1W4bkxtZFnai>6IWHAV?npde_rljmJ?I?(a)9PJR*U+?UqZQIf$boUkd+{_~$ zmHwD4b$;?xSV8&r12Xa=ihL&6NCqFZQfN-ZTf?~&!?EQ$|H+C%CfeHaE?sZI59{Oh zoIIXwX+@l^gwnUtU9U5>d7Hq|tU`RaqvrDSf-|hygbUfANTLAQ)4j|d!6MvTdO7LF zx+VH>`&_*G?2P;Jy@=yjOVkEiTY)H0Z*Elo@|gfuf*tY$hye_gzP& z{=7EGKKgY)^P)Dc$4hUXi}QbR`#P*wGr>6aa;CBU;T0?$e@l1;e>LwLV7V!?-d?qd1JtsrjcJImLoceX(8?WxqN-9x*Sf9CiuSKTd$Zf|X>w}q2t3&M=71~gs z1uVua+ScQbAKo(E+0T&dG$z-@VcQNJiY90$`M!_|RrH&$gSI{AC%o{s34lfLHI%lE3u{5hMZE3*3h^wr74G} zDEO589Dx@$4*{;7pA3NuUsBKvG?v&`U|fvx;9o9$-Ju2#mJ||1e5U94gYLbito2#f zvqAXbbzxfTR{x_rJ7rr3Vs=gsp{CobfAEa&j8MBINRN+6Kl$JUENU~9YOPu`=G7beW_5u=3{}5REEHi^vCES8;fMMs|EbwGJsBnTppGxG}k)t z`pA;st4tEi^`+2)IHZNg^{^zz-B?EQ@Dc6I|p5E9ZcHx^vG18CUdcB~_ZcI7zsLRu)DHH%*c zvE1}jQe<<@$S8k+PB5(I*vz9dSNx2@G`vT`RY+Ec$8Kb4oT>4$|8t>qpSRGm zKpf2vWYp3|%VPJBCAykqr`KiTyzKq9DHSymf`PPhMH`fK;x14s6`VlkVD|0LaN14i_hni{2E;QH^4mk4R4^{8 zjaF%kT}a5r9lF!i2^W4^F_)*|qA+-TCAA*tW;C+9E4--~O#+og9^fSWw{JgWjF6OA zvffP-=aMib*lSM7Rtv3u@28C=Eu_^Kfi(i~UK&(M>ybyl7#=qiN2$EawYR6}YiA0E ze{ocw_dv)bdBwA5IYkerHGe7ibjLe{&d`GmZD3MGISt5qA+PDhGcBbX*!oxam0+vy z;TC11$wQDKHU$Dl_RGY>8?x=g0hvF5ECD<>ONEAN=c`Ix*AZzHT9Bf4^a>;j{XLb8 zF@iJyq!=Hdz9D;uG!hD3J8fjwUGO2BDa<1FjgJLdkAYXZF<-3+nG_$9AcSY) zZ>9*_pL9>AhedBlpG{w#za0)xg-#68!b|@b+^fIw>Y1kL=4bt=gYe=FL{J8ZI~enf zUL!xpkWb<2_?$x(Z%rcG>nj8{qk%dK8uA?(H_yca9ro;IT77jCW7*4`%c-wwW-!Z~0?yJsdWDpTr3CZSK|Kd7M-f*P zd|yViziI#vpu$|gI@zh3GYgof$#y$~;Md}>6JjNpb&PF%v+1FubVy$rcNXAr|BfP( z&=pq%>gSc;MTAlK@GBB9sR1+$z*2Sl3Mg6(%xy$$g$HV4UqmegD$xLA!f554HSmMW zC;o$6%pgZCOGY0L2FF}P(rakP1LI+<96yV5|9wJ5sRFe{0I2iHiHFCGCL@$o3?{DM za@rLd$Jp(cBUOu!pp~yuu3$MBv?wo3OF~)TTWQ&oe5Ycu&A%jibEi2?3n5MMk-Yxm za|M))RmmdS+iMii*AHaWzxO_sc6y>Fr##U%o^?1ClT3(<=tJNJNKp_90%V;^{b_5C z$c9S%4IEsv(@4``a0R$d6I+)s;Iz0YQQcg74$@J(qxJ8XRQ{yz0VlA zgURObk?RbZeVPyhU59K;79d)=@bI4VaT57(c;DRm#95ba;s>np^H9U@=y`};SEirI z?p+9B7 zqCj&@iObx{5E|AeDtJXs$InSZvz>c*-*4Ho(^isU={f(H^BTy;t5H6IuYUb`e*arb zHn~9{owHc7;VjB$yYC}XNqG~lPDwB0(s#NI@FYA@P5cIpQm)UA9GVbAM6OS^fMq;s z{A0KrW${5kvjk+&q4o+c&hfo8vdt4{a{{kuU4g?42_0^95l+p`#PEgfR=OsZuE-AC zR@zwBTL%d5iOB)R9LQ-lN- zzAdZs<@Y3F`&&MIb;5g~kIuibE^Xtf#4lIvio~yBWFqztMu9f!-evLBS`nCj)SiHu zld|2o8|kvObU|`(U-*4>?xy2TVmN_!`H#9YkOpoTUl@i7OFqXGn^J2W!nEnw;dP4& z;#HF(d7n2w^$@~xDrIe2E%Idwy&fUaLq4#tIz*kbwWh_~&z&$JnYo}9t01g;<#ON& zr8j7f8DHQzc=7al9y$z0H*MpjY9-Cu6251iroijALk-r_lC}Vg+wGZR-tKV~rZ=4O z{2{vk&}89crtbPuTy6UQ5%rc)QMO&6@X#$ocMKpc-AE1HpmcY4cgWBo5=wVUgLHRy zBa+hH4QG75?>%SnkHxxnC;Q%eqe;aV?d1GUm_47|T8Yr=u7<_eN0*psol;u%mv7Vv zk;033rwWnr!Dg@BL^GIsa?WysQqfYUN_Fn`WcbVbyg5* z<{9P>>*vw0ws@mTGbN0=4m$1m{Vow|Y5@VA+$LPNFjvnGG7KcBN^V77s#=6a+-jMn zd?za^2b*bhw+FmTwnUUAL)UjAH*yq>kI(PPkO^OP4zb}h03(*`m8!?6_EkLyr6=~Y zC_0Ig1TCqacqm%W9&5)A16JodC~(6=*phd6sop94#oHZP zMvjn8@rucjlWhBZBe>K!SNpa-+}3ptBw}yyFcJ7YZ^N%?40Gw4^zJ)!TQOTdTKxLb zEJ=saL{EbIwPdGoKv~XZY^_;;M^t+At~ymnQg%L{HqYeFLHWydby_MeTcDL2`?7Pe zm_bMH*~;v=!pdKqzj~qDrjB086Y{-U6CZ}qnf-9ca~D_m_QC+1wXM?2hx(4KPYdoO zu9|6~GqbMr-ZCVy?UZUu#@(XyHz3q-AijEJmx1~>WfM!hge^@7D;6R8(eXcHt_c<8i1#JWw(eLmsi*y@IjemDA9+?v`C8R)w?lwV(JGsl zrh8qsXqMh`xNtG=aVed}bn)d_&?zF@)O2(29?#-lO9^u{b@=&Rf-#LS%j#yNdf6ZK zHwlhJv7yx26g#Pyrf}5jEm041G@MmD)XE}&7EM%mj41p(XEPsvS1Ar1*~$#%uP=|~ zfgGL!B;n|>l4SAfBILik#mA9#>N@JSGH$UDFEQCo{k_E%WuWYgS{{fR;VqOg(C-2K0@50)(57u@4O;+C7gp{@W z@(%gV>72{dO~fFCo!uu|POggVz-RS?;h}cTYNGT5V}4HY2QocrlvB_HINO;>z(@Rk zqpY*S{9U&(a2Rn_;iN6TTzIcv-Y+DcM2&H~!+eJe>?n}`-V|%Wj)qO)h%RF>u-9{) za?E`Z!8*+tSS#O;Zvu*UZPx25rjs(2W1mGKQ^laZFCUeTe-pZ1l6NE>O_~6ns7JJm zvg?@qiWXC=M-)F817IY>69wcb*WG4 zTIHnGOW|@SBW$$0HdpUE{Lmz)DDnp zf?u}G+e?;LVNs*0Y@n7}^kxrnl&6qGXIEBBZ$>R7QuP!=U#S$7yFg(j0_+;XB(bH_Np1K>SNT`TEWs*{o1in@( zA<0C#Jo(uwwshq>Y8+i^`w+saxzYw2Y8skSKY3r(=Ke7-t|<vi(;yFt}SkLX-NZ!a`ol>WvVH6r^#E!yvW8hgDKWx;yH zBFa6U2_rEJoSIM|R=ud)QPmV5-i|*=5-=qqvgl@#$$9&tLLQ)I?E4|t)4hp58hzLW zH|%|d4m4Kqf7vg~%EG0L-uV?%J9p6M`T<@6sa8rC0mhwT0X0z82 zt^3{gk!zwpc}K#}(lSZTU7(?NG+tx(#$7Wgy45Ozxzx za?Mi~&=?#~^nCn6ucFGQ(H-kI0d31vX;gX7JcySlv1|Hv7!~z)8nFK?%UDrqexwy5 zxW}7WLuZx6XQeN{SSei5t@lVpk~9oEwsCINIoYd@7fX+gh2|;LAsWBq1N=rLdx;`H z_321_7<1cWyGnZf3!R`0%`xN?!8t}krBr_PI{mguEe+1u7Jgn`mC!hSoxsjGyYW=~ zsn(!(mOh z8|hSKx&bEHJ5CyMAs+#f+oruE9859J^n{$h{XejZI5zDW6RBy#<&zL^A!|Z`?y*>) z8Q4kNcRJ&~nU)@6@?Y`z2z>40Kgowwr*aB!$wVLkB}~USWJ+)khqBA}oe-!fs-U-E zoW5_%<$cG&6iWQ?cS{iv+5YSYil0C zPc!3}-I$dNeUv^+i-ELD6P1k!F@suEX6{bOia z8PaTMl}9a4!Zx6c?BE?h~C*)@L40`xz7XB{7e zw&Uu#KECh03LR;nzr>n**19o$J}~Cw9R4`$7`c#sOr9tBv4urj*xcfEP{qEkKgWT3 z3;kXa6LY^`43_t5?3Ye)M^OBLZk|eI_1|{G;S9VyL4FIbh_JpMO1G?_hB##TzvsyW1XNOyi(&V=S#9W>G(Q6-dz76xU8-01Q1nLsoE{qwz zqLpCcu_7jYJo!!5>I+U)!bluu6~p-6`aZ~NuNC>~|jgGOCcCO5CjdBR0X z!a^9@a)G8SDDyrf!jE1!-04hIww+JfC;|u{G4L9_7TSzW4-}G7XDr59Z>}0c7QU~y zx}3oL!MN<7-Kx6(lccoBCR21ugOyX-LKj26j+E=>C_RjipbE+iIwU1v#d z)fFrlu5knyS({Pl#m0)E z{F^ksT>{p1&De>6r-@a`MZ9_KBCl_Y!Qm`{X?*awaIRT_S%*A5c=_1qbI0W2-ax5u@;XVQiqck437vCSDKVDCx{IPt9 zO;g#LhMi^;L9!v8O^wfjKv>Elad6>MF@NCgS%4w6 zS1b?3S2HC&F3;+SY7CjLI=Ww~ba2#Y0`fCYHE9vl3&WI0IuMWmbFje_Ioe zdFOZ9X981^;V*ykv~I&$gUpjgXCt6{EvuYaA2RQwxxNrSdv^Gnt|TPvBAbGjT+R0U z*;XpND}MdOE!F9ql)j4MK5w0v(^I77mkyzdCpJ2-j5Ny7^4hmWCAgc3DDHkk%~ZY$ zGZhTNnyl9LlYjQ%rgP!Zmj{>eiST<2{>mBXSRgL?WwT5mxP2}XhAP?kdgi^6D60W8 z)yYA*tK*PjM=0a!6#i3J!V_1Fdwua2Q=yDuJ4fKp_BEX*j$iQcGgpqCn(5WGQ)P_mhh@S;y2NMW6`h zVr0HnDgT}F4sS^H)Q<+2jeVXzEI^))KhH)hgcwxw&q{tL0y#`5bVukId$fP7b7{B^ zb&pT2{YZ9$j&*)o#{|d;t7Cs+MX?_xU@=#3467!Im zpx?4LsmbTiz~MT-EB9_4Mq{?u#NrbVJU1l4sK-7SDR`W`r*gZA zCW%M(V@eCMg;MQ8j`GFjRzOBPDW1cM{)d_*LPgm&%EZ)?@A=#P9br@YdPF00+O6?9 zRtsOTJ_YTiPw0;%H^x>)SXZ(?LjPl@GCqy=QOE|wxM#r4m~%tIXCjo`;{aNp%jW5w zW$Jkie6IOI)RjT69#OBqTseXx`a3j?v}}Y40~0Mw-1T{6bDO)Q%% z01*d!(x@&4YlRhxp6ej|DNU(@x$dGu@x^nx347&|p>w!ITl8O4+zD|tc@00_pwjbN zcM{AZj)i|rC2o;)4FAy`fQfQ)E=$&ZP_DXDOJ^W&(CERhJr_;D!X!OyejM4SkBqsJ zZl9V_A+}#Q{_SDzk1lH?j2IU1E0rief&h`|@V7e6*zX@oB))94Rax|{J$5Bw=Vp{R zGbixx{lu1kWgvJb`S{+R4akl}WOASDM*BQFW>Qg;>Wcp>pAn^0yD8dlkav}nzx;Hl zH`h?($kl#Pqdwmzj;tFtmqCezZ^;f1&Y>$Rh97z1 z2a#hv&bnOHAUc9qpQL(lZbWjA^U-Ym)6;7s9jMO(YkO%x>L(t9yvA|sYh`5Tp`fa9 zm+f~kNr@@x>}=PW2mf704lJ$<-RL1_#B9>~M9Qd%eT{xJAp7nl12ZbrslY4>$xodz&jx717n2&P+OW>WDA{_iqGS>6%)L!CbV&T z5d@*L!uw(~7{?$ko;r8MM2Ts{kxi{t$n;<$8igJRGY54bv$W=7w-RsQU*G}AP1^wY zxYa_Y>v1x_*zYNXJO+9ZnsV+r~-bIVn+-{KIv$xXrGHu zqokFgGVR@~9}dc&@axrqU(*##WRcb=?N|y;1y(qm&G<}{#8ZCHo4sK;4;V>3A{ zi@_I#2dCcApw@H83jpI>6jI^@o`BdV_YF`G! zoVAVj7qUHTmGT~f_f>dbI=4kZN!)isSFU&zof&MgzqSobk`NXQlQc>sryfuPW4Ubo ziNX5TaPtd4GY6Z)!__W-+Mp3UcwImT^ZI3ngcf$p@$~moo|@OhalBi9@JQO$$NpV; zO3;1l8u}acxf9w%p#}T+M1OhPP1Bz@wYW0#mL&^>9&-+TbWq=zhvySk6b{M(@F0GK z1l__EM49NU`K{x^9x{I8rR23?NV-fo!aq}f2{jKMG#rlQ8PTNYCd8!86#BI7LyyVt zqXybtJy+B67r*O|zWdXZn7M?ldbcLtpi$OtPug7JZCz#_P+a%ntJvTEp!whP`h(@1 ztfjz2cyTq(&kfZ-duUs_n++NTkjR$SE**b zGmCmhR!79%1^xVrsB7%`@H*HC7J$Yh^RPn3^WgV|B9iJ;>b6MmZT4|yWI_lZCdB*A z6TvhcelbnRsP69DghIr7Iz#oh!K_{jor9^;?Z-vu5vn7omTTMpUv9PpZ@ zJw0wDux~)qd@l4+F;(jJ<>l^MF>5eUsve(_HII;^gf zLIWjo4l%~9RE+8QM^P{M5sT{-o1{Lr;=_uZ*3Ry;LsC(eD%H9Kl5hd|QGhz2eQ<?Se%lAcl41x0r6ys6etAIeX5lZ%b*bwuM z_Z$AUoRlA}FnIRWHTiG&@dcg~1|C5E7kE)Ze(idoD1Gz@W4j@5~42>ZdP27>Hr9}`Mgk4#z^h{jeIs?A#v&egNl7{V@-qa8&T^M(gLnBdIw2oh z8s;@OQT#w?r`Vj38FVYX*4&M);&1g4zlowa@Oa+H1Rt8iX1n!#uEF|uyX6tvybmDZcL}+ozCKdX|QWKX7mD&N3Rc@D053?y6i0i zD8u5Q>1r5Ktq&FswcOD$+GqMPzx*@Z5svNSlsue$TJ|UNDul(1y$0XquLuD`3|w=` z0MQ(*Z7l`M`jE})1l)3HxdQCr*YE)=o9vHb8>wXg>!jaitsKQiKgcy8iX#&r&)*Bc zeSL_dYJ}?YcA?dCVi32LDA94~MQ6)s*uGg*J%&wyA`J}Hgn|7IzpdqrLAs3 z()}Jx(`GxQSk|`!;8S*+JL4n8VKvIkq~_cNi7JjUW{lKt*x65=UMarp2`~WW#qkhb z0|Q2rkG`xptte7&Ecq>(@E|opftR*oZIJ-fr4Eg-2t|-?%KDH}(eph@teAI42>-%D zG*w(pSMQnS#~NwXzjSTWR1TP;zE0>YKhLdv5OjGsIAogBNCLU61W%T!KbuaP?x*qX zn44ZfEFoH*$0{71;u#a83yy%#IU7_!gL-;!48njZ^SNL0YYTKwMv%X-J>Lor2%BV^ZSbgJUTH57DD)5@35gKF1+TQe~nr07Vu-1 zAuD>!5|~?We`h?h_3hBfCGX2P6uKirHXggNNB=NB`}zE&(8kvJF*5F!3InciKP1Ca zDf#gQO{Yp1%0Hz6Qm6#F&? zGy`yOSl&O_jXq@ZFDq?&j6VubmJ%xvXfHGdQ@hkB>K^a<6*j+#rQ|F`o^d&)jVrDf*MuedU^ag6zYl zJOMdE$OdFG4zHCU^3ciOZQ)C}R4HLcvTY3aS(4Lt8sX&i`bT5>I83)4#U zNQd`|7i7yHZWP_2!QWG2aH)`1gLQpw*8H%>H15luBPRd1Yc1q;|XB>5=xAP&iMtnWyCTx?UG9&~z&6z~#5 zHh=tUxbnh>A3yyMxm+_=<48|(2`7`rIqa~4^``E^P~ z$qTfsZx@d7M=(X_z2o^xhG9aWXL>^-dj~osmfJ~VX$5Z9LFxcKiSMlGz2aRWh$0z; zK^G1Hl|$Son_o;e_8T{=Zz)8`&UDX0M8g0cWxYlFW`~Db{Yp=s80$RqxW8V-s{!GX zRIlpb5{ANk|CcB2J7wgTr;&Rdtcx?18&*M~aggIKuF(cQ;D<(do~%`1p7ovCpw#5f z;9|}AIerwJg-y6I*5 z9&aw05*Y-@vR`luTz}hWvZmwQeQXJQ6U?mk3q!URUCeV(L=$pXmAmi_^!oDDb z{0M*?-M)$gHjCy}Bk!K_xfyPDHN~GZi^c<(JdWR_RgihjwXe!%Iyk1~Z7jFm350FO zn%s5^f#5}-aDPh=0-u)nv0UdDy#p*ZJo#Y&L8`sdq4~E22Xj?SJ3c0v7e~?kAjsp6 z^I4H^`swc_JQxuChJt&y`yceYde_o|EbzlcVQR4QHxK}zwEwX=Ns)X}>YL$LX4?l` za8sw+?g*ub(sZJZGdu|d2%B@m8O9iqBp7d|ps2AosP>{s1wFEoz3D*g?DM|eQR)Q) z79C`#f`-rP(Rc;1HMS&&0IR=GnaDdXgl(L1X1T(vQgIFe!GNH^&B(f}ULCIai(~8u zzt2bdD8>dnAt2?ut<01|osM-vQjxulFF;tJ$&KlUy6cTCcl}UKuaLbj5IDe8s%dJ; zsj*H`@&4dB^uGG`2Wlq&sPOUO*<&^CpVpf#{s&mw7;vELj+>#sG*n*U`yM=#`f^yV z_C^oe*+5u83FjgD+PAN11p>Ezrl>qe2MaD%q2O!b(rLgBhU}x})+8Fr!m$f2Ag`;$`)%;)x=3VE}-&(EQexwdDh{&+fuG!sF|- za8zvq>n^x?KP-Rzz<>A@GILAe6j%=gpRbcRf*=~YH^(Ts;SE{_r*~|PJeUYzWWYJO z#>iL0gF_>oB2(v->_T-URaV0z3;`@5fn`Uc-G&G3ARxBV=M0eBoqV#=H zA5m^pP|}XBegRaVfT=92Fw-298>iV7$F11XN6q{pOI}3jXl21A1Y4JPVKY+_UCyCXE5_OejJ~uz|fAG8R=0ssq(oSf35^?`61JSkUmx22|60mijX} zq}&~&(YAPKq$Q^fpx7}JrX?L4?R%H0<~wc$#eCL3uIJyu@Em zYC`<;&|g5`k@L~t=`6+k-#fcLwr)1~G?dnNxYF8K;CLVyOh4?NT&;;n?${gVl*s-DQ$APB^1@Kx6^!y)5GRas6Yc2*z)ii}&ro3CiC_2l?ozV-o_ zMTmYEAlpV@#`g0HTnC#QM13e2b8YnvmJ)7Muwc~4Z1_a(k5@3qV z`{VX(JjzyUhCv^Q93H56za0jg@SIC-LA?_UBn~Qg3I_^6*orY&)?9q1!?qc;YwuUVOi&3JKO05<1J`q`s(Hv50Mnp+cO#aU2*v0hFoy*Kv**X~S7hU!MJcch z@@#eiuR{z8I0filSSgH|_k&JK2pbGVkP-wb8$30~>VdN~xYb5R>J=bofpUEJv8?t# zVnnv*)IBvmhDcmN*##BYGwxZkHS*>i2=W=_&C_O;ke2}jIh51y=Om$_oR$>@BVz`b zpE2j;H+6^vtOjUkZWwyzzyCr|HjVtwowZOVy0t*5#>)wr*pmP|0!T;xu`jaX==k)h zlfMpq*ltL-2Qo3S>e&&VXh)Zxc`fL=Zn@@vhtFMwTn0<|Yn{fYmu&nD2HBl}g&sAE z1{U)7y*VDjCSnf;00aOji_Zr!woe~C&@bb>_suyzQ+@C#Xk*?yic&#Ss^AWm?V`c% zObmjy9rERLfnce`fqF zx4Hs!)1neBS%|mIf`htnR6_vd3&jdgQYWlrjOeE0bd*!xn|X38d@0F$Z~bp&A48y^ zoakT@Wr&c8i2L#>Xfvum{J4_44i5EClSprGDm+QU4T|UMN1{BIZiyz~%qG)pHw(cH zs+N~BP{x;T3WgDtX~H%`ZD~tT5OW{BXaqpo-bJHiVoFV$mS6DAVPF27 zRa8mGg1LRaEz=hsMXjbA6!Xe2&=_Gi{YR*C5xvPkMe6zD{Z$~13p>YdSC4LLA2$Cd zgN9bsN&*Jp<&+s|(D_zT=PWsiD%%b<3INnhTcIZl1B|i&09`;T73|jTw3)Bpah&~v z6ktTXEc5Ho3nvyB9jKCMJ?t4NFzTwhg#cm+A`ijjEk_OyY5nn9W`sx6GD_* zz0xk~0;PVqL?sg*zcYmbm11I7CcFZysEiRf3=s?L4=^4P_EpFm*8a2Vte+%GuNnWe zDo2Funjuntx4d|Fxv^`Xf=D#1v=>E;JS?nQstABkkpLhCu&ogJFHr6C)Qgm;;U%9h zZqEN%&xf9<-cDYqT=%Lr#^-hc54M;#)Rg0X0I{S<_|OImqNKnF#dkqy>q2wIV1Wq= zCUN9UWgizx3M3FAfBp(LenJ9|`QCKs(a!0&Bt5M1;UklHAVrfPbL-$ZW5bHl*Fp(r z-W3DBV)cZ=%WPz{!7ufd42YH^K&hIdE!2kRfJ? zgr9cx9q9>hfGe|m_(Aa&;Lex!??{bymIjt;?PmEA!77zG5myG%7`$u%WbdU`?jT=! zg>3}^wGIqPK5BuwQG}gDwJ1FUtI&EDo}{3tQye{{sSLp(f?uv_4$U znlc_K8quY|Y~5Itp!j+2w~*`0oW*yy$uV>p`+?b{=621oEgXjhunIghg<7)>)5sye>rn@+WBlQk`Iwx7}i@@lyR1I5iJ2E%KZ7yYyrUA za)uEkAhtrD^4rh)oiEgIpk|)}4LT`GJ6j?`po#w4Vc_Az#c|^enshNnZfAVvFg4g{ zHaAgSq;lNZS&(xJPEj%TJh)mu?8KOs6%!WfG@{6n%^@!f670&0M#Pp<++qvX8f%Mg z3Oj}d*Mic`I-iFa+rP;oi6YZ}`=9a9%u*_g4sl1m@6pz-Et4&B)}x#|96EvTYXoaG zJ~mP{vL0!?M1d4lwd|nBx-shlx(~-jmF9*Uuh!f;)b)uJ)wwZ((H3`_TIxjH5BpJ~ zzEDZa5WQba=-$PW{O4qb#P?8Y)rb?_ik(+9+}^_$Dl|@P*6uk`Gj;x43*vD6oA6#q za=e%Z4uYE^vGqT-E)?qsjyJ+)d<}_{CyGOX{FUw0`Ygp>ToWHAh-xC-m$c-^2iXyS z2jqF?Lc}prrnI~F{>5;7BB!kR>^`oXUJlgK4_PnpnSNaTMot=JmLM$g5Yl}6_Q|tn3d?DZn z9u&Ee{~tN0o`zKsY*wSg*5ut2h6V&Mxnkb9!KzF9^k$Gs#W#AO$tJuKOI?lM{wu<6 zZ}|_}TGoa)0Sz*))9cX*p&v->zy(&~*v|gQocZX*y|_!WuV><41?#gSoFei#I6}Xz z%Mk$}Jrn@QUwg=Xj}b|r=jgdRSb55k0M{IKSYaENK=oO0K~ebNv}8lqWgh8uC-kyY zYMT1sD;78L{HZj)+?Z%dK^IK|7s@I$NB|&k1c=}OMUzO<_acprs>T3Hx1>A{b+m=4 z5-EHP2;rNW25kWW`bDFbzV6`i!#mCPI{}I0X$QfEcUy2RW}gmR;6;%|Wh^A0NbnBb zXiF8g6NCvaI zO~HuBM6}GLCkmNehO->xzJe#tr`^SdE|pFc%T0C)!x99$$yc@ko)HZ=e_UEQwsGa; z6gCkN0U*pzr3~cQ(vq(F*1yY%H1@u45i%fW>V|F6Q3@;{!%39pl*G_0!a`*e=>`Sf z#BfT*DoQvA3tFem-CB1%)QEsXZZ)HVgZi%Tf%_}3M=4BK(%I>UX;(ivk&vxJXWodF zsw_GRq05nh`)Zq~D@|^{7@a;|J?@-IX|JD`6~;}4$18-anyLOXasb%D6SdtxGT-H! z@-}lV+IJ^92@&Zx;JiKlh(e`Lrn}2>3c5dXH%%Vff6Sjj=xOIyYy%ieW=(FS7F>a; z0J*)_AUoUAXJdC|+VWJ+gnp5i%?q;5*!kmnlPq@En$0nR&r1^annKBJ1f4Svds^yU ze79aw<4n?=j_Q9e3TsML??p>guzAF>5+q@e#}Q@WpovNA&;%Q(S)!_>*m?KJyyeeV zou0JqFHnvIZ&R>Es%L?(kA7|_1CVeiiDGZSnfq(`tx$g1+3|# z%A?}t!1$DYN6fn6hUmU;PD>!k(i}5@k}Lm~O05IVJTQ8THXqqi;>^plsB_{qE}%U> zMOf+{E-2n}7|&xTZfm%`so42Y|83!M-BI9`0|!@iL`|)EmmBk-i~doeedF>O>|nfqt8Lu6D|zxDyxRrV8C>kAf#1jsenGR0x~%4r z;gI#6@NfngH%bJ>8~2<&nS#ZqJz_Ot2@u&)Ic7$5&Y6hYVXBB~!-qX%NBw4?1qs<} zR!bgsXPs40d}_BG8S)3*7E-A*GUUMMoW9cQZ}@ULP%cFjs;J(UH$(>z56W~pM!dhq zu>ICGOYsKhZTMbZW%ak)4sYA&+xe``*&Cs}MMS*f*BOx zKD8zb;JD+;qani}FZ(hz3nXfJzLw}NAuEpV1rBUjR{W4SCRA(MIJLi#^|TDAdbnp= z=|W1K+%92)*kA*{$QIcAm%h=UK@{y3!923QmD?5nItQCC0p6y?>rp7N2UiE`-C3d~ zs+%;QJQ|HpoounvY+;ZtS|bsWp>v^#?=c{cN@`6VRpwp8^n08Fnr&t%j45Ah_c$iQ zniy9iuJy5D!GInX-^a%NK0p0~o^?xVE^7NO@m-v%)uAUJ3iWd0)iD-7bE%doWgGGE zqdSa~2iX$W;5aXREI6JNXkGy0p5Mx5lKB_={^n z00@2CqbQ5f@9pzDR11-_x${{oMo1;A++s|m^B@QA*|BVh+Q{PAQPWyXq=P(Phs~qR zEt!)zT5r8iI3gIYj)z{G^0-opDBEe8WhOL$P;GDi3@-lz{oZGb&(5soeo0^o#?|Nrs;~!8O~H zytXRd6X|u!%z;9i7mC6c#XKSQT8~EQ(>U!Kl482b%!In-`rA7KiT^Ltr$L6SluPz- z$@*>@SSg&*iVS^xMTIsgR(>6)wl)j`F>z;)N z`M~o`J|TzaU+{4scQclr|BQ%y5q44dFSDnTq_jId?!(iASSK*0q7mas0l>j=8}V54oYFRTu1}~O9J}7ub1tUchH9${_JauMkjF#Q3{&)6oUK>Aw)?W6 z$SnWVzgI~jjhPiJEzC}oa|ah($wgw3u*Tw4QGtWB(r&Pf`Yx6z2tv4TEH*Mw()oc2 zv(G7HEn7?oxi-Hfn(QJoQsPxN9p)v+aQgAEVN$ zYek8cv_;i+?)B*6PGG%|S_WU%?lk>Snw0(tt%TX(ax?O8iTA5Pp8|X zGbfe!oIz>&mjU)xcwdGsvOmdc(D)q_&G1!_m7@OO_LL^O0N30QhzqoFr{xJ$bP=_h z$z|*mPWeE#7g4#_PS4KdW1KGlNWIyD|7XdWS?3#yl{tMpu}39+xpziO1qN6xOBkaG zoZ5j_S`-XIz7%zkHfQR>J$VmTR%(wCOvIQU@8rEXNO5t0V$1ktPg~(4Ra<68)mfo$;0?Qmg859reC-t`u;6Q zl`UN!|ECGaE708WW(SscxQ{53E|CP`9fa8aP1Fh-2iOog=&U2RREo;0$%0zjlSC*y z4CJ^t8eW6rl>KB^4-5k4QwnCrQvn+?q+}gH{j8xGvwK#X zD{Ty}2^E`u9-qwZdB<+LX})ly0E}(@L(dgCtTjxeWQ*g2RpjY)Xz`)7m-VV^!Pf6& zkDo)^qXwfPud5$INnh%>CI#7Lwb%Ls(UFZuTN?0oJ{+0Ov)rM%t=UecE!c@QXXn$W z&ksHC$o!_|p@gSArb>pJJ{UJi9~fp~7vp_BcXEJOsGkRejwNHqN3wV}U}i6VI2K&T zNQJK7wR!DJH#={q){Dgku5&H59Ctr!8d~thPiLJu2!EX5yN{x7NYp4rn&Bo?z^?Hi zCdm@fPU+8JRlN^BMWQHX6WMt%Z_%@cGz&w6Ce;*P&j8vxW9-JsSsR_}F9=|lX^z+6 zDHupgF9(%MGw;x){M3Fa(TCoc! z4ymPoCB;*Zbe=oLWOu#Ll-8+QrdkC7gW^{U3<`N7?T9TMKFq;mnD^N0Pfb1hPcDa9 zYN++-5_kGGJ41H?H2FgK|GMAy7-h|U>Ym&hY!Ui;yyD{cviLPw*=Khyo|o|581bXU z{Fv&Wr?qZJ1Du0e;Q^hX)1?d5doR~nqHaUYkAJU%WN)9J-{Y99r>3_(Y90-LUv#ss zR}&GybqVHoc^%Q?p{uUY|5v4B6+s(`x~!S%2=A~uWcM?=n22Fujd?L8M- z6HBIV5S3Vte(YJtc2og`__9%^K#Xda%)Z&(~4D$P|T1kH+#H;mUw1~V^s%f)5$5K#ap2Ct zej{WhCw!kQWbJL!EF7P|vrE+IRGxaIsL3Ehq=C~aieXRuHnScnd=3%gkEe;>zUmK_ zY~Sk(3hLu`JIBl$v$sNn_=P(*)8R!8nMa8K%b@bFz1MKGqKav}o$# zf~LkAuCtQfDXr&H$!ErMpbc*p&ZzMhdYO=l0x27A)P7ub*pz0kJZ zfqdCrRv`pYzI!amXzaC<8q~cQ)W9w_TFT_t7*5S*t&|7;glr^AH#r%B9Dp^Nf0<$KAqPBG?Lt9V`JU1{d? z5fx07_>tss0U+;CA%98zlXc2PhZ=Cpra~3Wz{eM+)E99b0oS$#x)*Df4tTjoFBA`g zTmHL4F(t#&c_K?VC*O(qRmq<-R>DbExLdPxeuj{>_*8vTgcc@jk+HAO*6cXi&Lkx; z(pKenyE;dm+zll#$ir~ZP69okel9zaBAZen5m#U3|59>{;=9Z$VBWc5_Tmw76?zj$ zlun%5J5lwJ>Fu9Q#|xSQ z1q0=)=#t#=@3`WK)OKJLr>dD?zOscHJQ5UjT!&O`QNc7pi}Lj+7DV9yk9AjH<&O5p z0T@Bkk0tSo7)aSuh{AoRcSeO5uU|p_pc!|5i9qE5UBnPs3+5|xPq$TBh{qFitarBS zycsnNwAzFE?)=+4|DRpCU`|;Z)$pkxm9is|J{dIRYWTy0@Y!lr`b-=a8- zuv3nDGoejCs2{g+=v>P@e<=(a^kR$j3XXsNr6VV*_0Vg>g7MB-xbqg%)Kolske7__ zcKf~)f(8LV@KN29^H*Nz-DwF*64u1HNf0Fb|Dw-SH4zo4QmZNgIYf`(dsj2cgtq!Fbthg4GzQ0hVN9|wuWyZRtTfNpSOy@=Jo)Kf4z8ip#YuM>;_z#< z?oA7;s^FZ{s~-;He#L?TnrNcuypp7tO+OlfNPwp_*t}3@mA?>ei5o6;?ue~g5R;G& z{K;?u3-b16^Su6588iET=z7bjxSFO56lWmF;1CiRB)BD5@L}-agdoA4;O@@g?he5% z!9BPHC%A{4A*@!Ox)O(LqMx#NtsE+zEEuGca zthM8sYImK3k;D>4Q?CirQPDRM$_py0C#+hIVVFJ@iZ7?>y)2X)A*P{7AR?woG#FWG z0d4~Pu?4&r^goHhJZWh>`-j-(H5iu;?~^jw8K+dU3Jj`IuP;Eva&=&rfEWkwTGU*vGB+^$Ec)GF-UpN72pR}pB>Jo<>5TUXMf95^ zQTBXCW&M*`!9tAyqlkC!q+N2Eypl5C;lrWB%l{X~>p#&mU3Yk0%Ttg1ykO#PZtXJzRR^91mE9=XZ`vWVvN&%kmQ5+&>FjHbL4nU4?s4bqKr^tDEo7tT0 z>Ddave(9wRKiq6A$XFlp|5Hug|C4ECi*^O;H4hz+|8NZ!Xoi`nbHR{d-=j0()Tj{E zq@-e8$HCXTK#!qV)RxD4+1qzAA4jn4p4Ulfbju^?*s)=ZgQ7%Wc{3Qe>VE~ zoeeXL{g0Q+&;jk1nfLYib+^|9_+NCQ)}|;v3F4m7#_RhuVmYlZ?UQ$e^ZA>H)QBt!!bMt z0zgj}I;ED_kL{FQheG86AOfKz+)$LLl`$Z6`|o-z$ZQ_b+hV|luXWi4@Ls9=hS1sH z3w|$>VCRA)G7b=#6d=Hx<^)R<88qMGCApg8M7%RcWMtR1AN}m#1*3%@95J;k-vRAB(4EAUKcGE_}zl{9|zz?OG-b^#%=f173mjZ zy0tQIZYTeIxs^Klg9*(FKNCGwc`|H8+#Fi6ksDqQ@{8qttZ!RYkW)!^wO{Rc?Wgp| zILz*7qVACsOB(-E%l2r8*k9GQwZFHXJ?9SOfrXQ2Z#mUJ1Lv#E;!&X7f zZR;%%U`S+!NLI}%kphd3Pg65CQ+ZLS$Q=I%E>8tOSfJZVLu_b?rHy98(MYFUJfW61 zeaA~baOEX=V9sv!dmbb}H5~Jl!2?B*Tz;l4m~IUrccK0ut$+x5Wrq*>X_NXhE(FC- zsc6;O5u`Trlv?>wxnn+#W2OG5!9PFU!;Tx>EkBLZys6FcwYmY%Z~ zUE19ji=hRVhgu{Q*m8~%GT3leOUuQBWI0(z_<^>N;l4ZT8JJi7ujdh}O8Xx;$*f7Q zz^1=`EC|pa$Q#Gv>NZu=6%QbQ&?nuy#eu6cr``kq9IT|UfM$zfKLx4RIIhUDS;TDI|b$xzRXZ)z9nhG_SBC@1GSnG6R zD!j@+o;rLxxV3Wb#>|Wfl|IJm=y!T}V?)^;xm#iyXq=4hd$14`faycLYZCa{#>oSw zEQipIctM5^090ejrLzM9j<7+iE+X+{8>Y@QpUjexM6`uHJ^QB`*v)?n2d3d-<;g+! zi#;xcX`7mMwbZ_!idhF2`HU20Z5A^dk8}Z~jsuZpcLfRp>`aApbj+29s=xDS6}M#!eUMAmOeTCKy;} zO2f}xOOO2-wlaRR9C7jIA(-4}s}KQhfo)(!Dz}aRk{J$!%TT1k->beXYii}(RGm5< z7{)uj)O7#uoU%b2LG!<*M1%3!UIHq)|ytR_=I zv|zsuQ)E9`frxCuHp*D`4BAr6GokccpKTMBoIE1P-9m!F`5*c>{V>t}5&0j{k0tCE z%gRGT20@AQR~oY=vV8If(;`7=Q~G;a76(MYHIt~qR>HSs@@TtUs%^TxI=j`8Avs+F zOlcxWlP*hHcKK5o2q28VxkI(aMfMzXbLO`?6#vlhzoahB+}hgt1)xQg%*34oS`Z@W zRxyHH5OPp*@FS_@+7}D`Ii}+KBtaUrj`DH}PLAm3T11mEeMfP!G{x33Y`0LpYf&Va z4-W-0IKI(-xKJP}u(@4Z^t4_O(D44l-1y<6()hr0e{60r%_0C<*F$k1HXWGyL;2|w zdkC85mxm+H*WMF!fdF;sJdUNpp7_iiPO)(A#A48ceIHWV*1R3fb?C~v1h#pN02kc& zBCY=t-O*c6c53%l@Bf1_L99CU>3&l8W`HaEMulWI zz}xypA)}8-GuC+gm};DSdA9c9{W~rq4#S1YInPwJr#8aA0Es&Aq>B9pA(z&+ePl~T zn3C8}1_BEN)@88Ilz}6x;E47Eci%QGAY`lskJ|-EL1=Lu*BRwIdmcHdl4qZNiga>; zWyeR{4)qDjdk+lq5=YRVSLUjb;pLO?GX~>>It*9^2t0%R7VqV5DQhYUH5Xu<-0WVT z0z*!Hd_Z9Y)jBS3JL=f4oe>eQZ)TEV1N}@PNQ8H~EHU zD>ETtH1s!6?qhll!DasWZ!9mT>{Uw8J`P7!;!AG#UxOG?Pq=Z_8QL;{vN zBayvgJw$T56Fx!rT&arlbBU)!` zkBPc0NC>%r6@oRr&x$7ITCkp4tDQvGuPpJEKEElwx7jS%HJHM}MLowp)beX%*wYi+ zO>(5W0S>}q&Veg^?GD_3*hFjud8N26umK+L>LA?e?sP44Tklf$oWgPTQ=F0V5&p7# zfJ}DNX%splxQzQ>IN*IlV`}to%l`{L7_7M%^4maB7WDnemsbe62xxU}+^(vritQFS zlwG2tYM%IlSh?)xt%DjtKi;qE;_z@w+oSCoK2cSHa6q*JBq~oVl zyzP#I4t2XmN1#IEYaKpPgYM)AA`|^ctEJny`mG$-cQ4YEk9@S>`KFG`Rkc2ulCbwU zK?q%<`C`!jM!dv`-5i;M)<<m291Gj|#Mp&$v98=(FrP-hQYuDiz%)OM+V_FQ{S zyee<3ymY;N)?R+_w`GUTrcl)$lQn`^BU5L|09!}jzb~cl&v$50GBxTR8mqJGb$o%0 zQPimC6ah>c#xHL(h&>{>y~b#Cf%DwF{jjy{8NGW0KQKQ*qxL(|8@5*Hfe!qY7B@@_ z3o}m5Hhx@YnEC=<_-h$Pi%b>sNT|L!Iu5CbG(=-eU_few=d;E2uDBV*ZWvmBdu zqDQ_xO44CY!jaTV@LyXTA4ox#bdlQ71#J<+T0w#`B{~?WVvHdJ4a<^29#s8evr3ET zu1?u;-J^>!;QHaAZ~u~K?Lf%N5OSM}IRgndK~b7BN}s|;6C1OB&aXmBn5Czh(A%Y* zcVEp*W*~P_VAU+!dzYytP-;__puh~cb>phuedB1e zGBFUIxm_Kj7f+lVOTNEui-QIs1etII?yn>KHw|HV*N;MPo2~YH_^`pM(Z13BL7CQC z4mv&o#p(N8Lf4%YOT8g*1gfX4Rdm?rFyk8}vZ;hrB>46Ekj6vH0*N8ZYmg`g?V<551bi6szps!L_dKF`zrdLEOp$$ zAB->JwFD&HlY4KQPZ)-%&a^$*ZDA;dn3#0aj&h7AD2sbs9`^iSdg|iciql zH1@OdFM4I=;nLnH)gd0HUB$gk{Jm3+EUP^4@fLA@hMT)e)3;(BzLc1f7ZhHm_ik-A z`;?U!^_Q+nAf{8~+@@XsSj6s^0scx<_;VijRC5_~zASEk|E_VCnSPg0(-+X>y%^jV zDKeh?C0N;?s2VIXOW(oA-T&XukMPFJE6JSa_=?a#MCGq+Tio#YEnpnkvYo% zK7bY0YJO?6+hvw*2EKS*6cEDpT14@;5UyQWW<%><@eHaMJ#kdd@VN(UaP!8<8+dh} z?cq>39)=p^LZ0fox;$t1F7fnJZk0GmDce5!5W;YM z_kccR107NS+_kQ>VLWg!wnGC4WTW6?^^elxkEQnwiH$;+BS{|w zzkLpB2O@-QmK#_*mjCkv3S7L*BISyc-Z}FpvmOo5<{P#;Ykg@u&)SEa-*i~Vcfy2T zoBBE}X0$NTn>PeDxbx1w@yWjz9iRKtjfU`~*MivOsqk|LAYcc;Xa-B48L@NZV?&ZZ zskSY9<_#Ep9!%97*xhR}I2lixQa69iRP}_1lO%sbc15VDMeRivLN!ZY$_H>M)KpMf z6vQ>4W%zypwYdU!hj!Z%&cO+)`c#g^SOFj3FPk+~U~3p5fT(8sfADAR$~Z}ZexYoW z>%+tY9fGLaTGdEEvgORE2IQYa*SyJ1h-!-2cF-@>gZft&Q#@rgxG51p^`_yU`N5{o zkG6#=mCIrWUzNlI^}9#ph7n-O+?Ngs6mgv_y-nVU@O}iUEO~rKal5>-#j>= zuDqXfe;#$AW`!$Zl}e)Sbqz{BKN`EeJ2M3H9+eDLcB77*)%h_Ld3{&v>!pO5br+cI zjT@_M?np4vW*qg8ETpnC5@u}&L}plyoyt2_Ou7pk%TV~@caY~LCiU4Yd6413QKp#h zi9-^vKTv^dV)Vuu9V9tjn9M4aeNvn?O9YgQz0UAYdT-U(j$iHZ7CCHL)KNZSaF%v5 zJ9k&4;Z9QyjRRE&03(0=Jw#h=&&N;o1&=3ms^ zcwsE3XvhzKsSm58oPgYEl7L7uF=9Oh81ltz$@luGnSdkFX-ZqAxEYG>*rFlE!uc9x zxaluJxg|4F$ndm`>pRz)($;6CYo#Sc=4mL%-DCg_#+P&`dHen)F~+7qI+NGHKRb2} z;=8x#Bf>b`PwXc8X6-2NBx_qBu&#mZHYX~MZ@<6Jug#{32&ld$XT^4!xQ_r7#EisD zt7u8lXGhnT9UhiLEA*z?fvL23*-->IHx_u3!$*w3Gt{k;5Hq_!zZ-9A6K7(3 z!(K6Wi=MUY&k;0SosFF`pgrxkATd;)1g`7t--?X<_L@v!!|=;NTb$c0b{c$1T2j9g z-6ck6EnQ;4kgP?NpySf5`A1UU)#H)BU>2w}aBdla>Pq~boFc&KCSVXrMj$48dN{u`0UWa#l=HQ4u8wgR{q`@z2B|!g|haBn;1y za|^yUIdyrk>S^)&Al@v(LcT2S^B=5y+qaw4o%5gU>Z0O$mfBZx$x)7@Fzi|Vj)6-W*&KDo8Ci9ULMp}Q)6xv^tN4UV6E z6$xd)C+G7F*#&^dF6Wx3|H-@#(^?}MW@2AOp;rhqeX2Xo+Rs<)YoHV4wZa$zP#mh4 zS@|H`zE;fw$>3qB9*&d?m+gBLbH`CLT+V-cApvvO{5VL@kQR#A9o)!oqjO>#a5v+` zP+t5Ob)=E2i@HC|7SY&{W7mk8z?V|<1SFJT#O}>Ld}%#diB|8`17$Grt1=)6JKaX< zztSDt%#^h;pTv2u+){pv9u*=+l#pWndZ;n`#8juBz2#bNUkKCpo1&c~OWnDNcz3Ay z3(zmg1HTpG)5*c{(Y;5RLiTCw=9l%9E*1pSsOkrb-1XPeAN^uCw#Lz62hnN&rcFK! z=lkSk4H3L2MY=;{F(M%n)+5{Z#EKVosu;sA=<~q>m!*wwzg--}!B9U&c|pE()B29c zL>>o@+HQ_%{`g8+Yp>669GWi<6LQHN3IHN??I82IgljOB3VxZ0^6BH{$?dsG|K%$Ca=jIlmLxy92zu+JT4>6Sw6WcJ< zE6!JD<^ zDeFcdhX2>{fXaiUFn0Q+h9~iRzDosPibx@z<);1)%uC0~Rs-m`@gLtebaqH{z6BR+ zvHa{8Y}3iJzoQ%A%E12Nt;V}a9k;Z@1(+{2!4K;9U9?FKqN zeRU=+IQ51@@9Y}gk^8@}U*t4NJDXS4Hk`ZYV3dn;xk@_MxIBN;irrUvs21)TtzP5Euh6UzT@t(lM3?YQJiciBYwlYaEepjXn ziE4w8ThL^h6oL|=C3PFEGzPh>`7YC{I`aL#z)vYQKE3*j?ddIfW)(?%4SqTlw2!g! zv}91V8epWs&V0d%)ORfkxl@l%c_QPt6VxW!<@l7CFa`f8S)P}4Nvj`ip0~!A2iWsZ zWB$7e$g+W7)tbE08=n@9i2T+{+~B7r(C=+Nsx`0epOgB1gQoOL{pQPN=g4!k?EN~p zMO}K&9;$E6qcra4Tz#yRcJXbS_s&W6_N?5#E9 z&~qF3)3S1(l$R2RXi~K-_%iSBbsjB+mguyIlgolgek^G7=DhZym;wO(90e z7fvhVqaK2vjOZASSFe3v_@9RDs0|MDAfZ@%mhPy2=q;er7Go$aq!3`nW3zjC_gu)1 z#!sD_EuUYe`(M;ffn!wSs!gem?ea(>Q_Y+3N~zxX<6xdedsFz_qW`J!2R$b`_6eb> zd*FOOd&Tr)O3R_X_GFqDJ0DUONm&(*-$OEjiw@@&ER|vDL7+;R)5q(^#e`$VHT|9I zSg|iL+AeWu!gid|tvN2ytr6MwF29YCdMaqEF#1Zc7^VWJcWJzS`s;Zzsvq|Js-JA1 zVEk2pfSx36r1Xgy*`<7QksB|ILS<->*nbAZUc3w0{r5H7LC%$qq}u2GmsL*|h(16; z$t_7|>hd@nQdZ2~I*+?@WD-3do$&PFEAg0|7hb7#H?EgYnSBjQ1kp@%K-zsC4FWl) zFdTz9on=lX-k{|1U)lv!pt?AUBgf09ss?9$xc#N_q%LgVEgEHzou$v^Lvj7@lLvrEh7pMR zz*-84Y|yiy)+|KSz_)Cz|Jo1{)}0|n39_`KjW_TB4h#@rp@ReZDvK$i#n;-G%t!?; zZQd$g0q`gtqoWp8pHm+J4tk!JOXb($6Ab<4kRp^d{3w7UVH7VPZ*t)*nB)?Tc_)Et z^~;y5${ZXaU4q_Is_h!C!U3IMEm|cCryTL~|3Th(C~pR<>S!&dI3@KxTi%(vmVABU zwD6a6v~%!>S5fj0Tw)#b9+BBlnc@IW>jDfjh7&bY0Gox$46l#^DP7fcX6K3SC!rVe z_XepIyb==r6G&JamJ{9HfAXs~@-4QQvPNvzRmVKf@V^_clr(HzKL4O;GG>)^z3v0= zCoI2u_+MfqK10Us0Efo>8o)RFx6yTE=~FmA>TO7Vpz5_wnuZvH{Td*77T?p=Jn z0ocbuv60``%q`#iB&WYt2$no4c$@mG_l&&lCTc{E#-~P!s^qIaCjqzy8#x#H6Cqbd z0)z@%K=-Vy;XOj7FSFcCATA%e$4UF@DSaG|Yq$K_N2qK{sqwjk^SzPIkJC@TMhcv; zs)ct)yH@`D9Kt>u+>N$#x(ezdh)h8kMijaE*oa^JGXgR+bU2Jd2qX8O8%3Svv1TMshjqwTVBV(l^Hqj=^sN7i<`*QY)SEkwi{gs~{2NR2N-A5( zIKO4C{0xQXp!MccT^f&_^^t$V%|7@8>U2-_r9KZ)Qc}OP_rKievvODnV^AcJ8}XJZ z;kUn@v4S@B30=8=NAv!aZSFE}^h&<-_l3TP!jj}ghu>2x{>ktbI_I+M7FEt5dz)lv zB~L{`?#Uv8yD}IxL(@ODFD_N(EkIbgd6ClnF+3UHwxM&Xo!ifqmHg#XTVd2POQrha z#{0$Na3;yu$AO^yoP-vErRSRdd$05Q=WBr+vSGa&DdUY4{m{!W%dviB_`ejg#2TvixdGCC;hX#7_o?6vx5W|T+y-`!S^>t3wQSoYHo)w zCbVQ24m#Yk!9iYL&vIh+g%}2;h>2*3Gh+ zFmpb`1i~Wr7p01C_%V5pxj)lRM~DD8v^h5&oBGGQJ^NYNT ztTcPyJE?D17+OB;Zi9#Y6+YMfy&l-?=XJ_s2pv-yPh84fgSKy!?-?~;qmt)BrER?; z5Mcn*2l=+<{T?#XyybKFyhplZ`n4iNa#_7T-8a)kc@>~SF1~G{@ADF~9uDkr?zs>9 z?2H{d{<`k}72$=CpO75E!dDCy`=+SvC`x3pIe3PqHH#MAYB!wCuRX2 zj1sZ@IF0lV=4L?tu^)26mqWna=%=eMpX@}uLma5{`oGqM=P4H87$jZiU%#bFot`6l z41*{^@WT@-F?;c4dZX`z9BJ8~;@tVVzW9aOCEW0p=b{O@KoU)s)VfK_Ae0?l+Hxht z7=7#pez8w<@*PoS?{`emz1^%4m~c*o^{NiL>PRcshKdhG(mp)s+&@#B5`8;S%|If0 zDfBzw=#}y@V|cnCmUT~>YA_;{HX`puYL8;~?(tXb*==M9MMABrA$F|*U6W?W<>c+GRKH>#ZN=uzf#l0$CE9ShV`X8S>5n8RAwwc<)&|9N*x~GT`P@<$4(yr@yiaID6Kc+)5V{Kt0rrU!lp#(l zrx>qHHEZ&{Or0dje=%*#{HMCNrXBg-W<2iugW8X2*}YRA$Uf>?>1DsR>4JvlU_9f8 z_CfK`_iGDIORSpXK}05} zbsoD5cFQE^7Hn=PVP#t97RR5rQ#UY})*n8h>NC|0o(;AKuwwPruzXr`%JcZe+o#VR9I!u-o*j1FxJn(r-1=W#(!v0*$&j|_5 zSp(IbSZtcZ94xprb$rA){{@mIxibbZe@v=dN-4(6@j4v4nA> zS4o8}ZF>dIvbFx&+q%=>t+QjQxlD5iJBK4uMNzS#fmUo|b7%bQ-6wHxb*uk=taud3 zs(ZyWG)ersPpx^}_dxq(yhI@}Iiw=BhVZb`PRHLz;lT9xRMT}-AoJOm|LIizTJyCB zpVvx338!5<(A;MYqf zkbViK11_`!LNUpP0RpThJ&+QVmW@IJP9~ylCkOekwoL@8$m2L!mks*M_^SAk!(o-+kbJUS=M?^FojnHO72+s# zYDCfj%E0JZ)W@>653yDdF2UZQ=yy=_2P7ErwpfRHbNerwUFOyMRuetdol?Wavojgl zvpaz=0JwOUJN<>N>}4dA@Ry1$k=tkI^r?2U4q@c3H(CPGPT2={QvniF+bpEK_IprE z&-%s&G9HWJipMp3#!5cz|H99It^|veMgYxBam;h0AW~`6r2KHtu~2YFLxa$M=R-lD z`j3BJ+&Am6406h={l4LPm#3lKth>|qwt`Q%WzA|j~Iy;<`& z4vJI5l(=XeA%|l&D`8r!dvwwtSJ7ZJ4X!UrcTRW*Da|p^;;>4b2ue;>ok-#5o!cS= z*!*6=C_8?tmo!EhDTK>g?2sdYgY+bV2Rv+rM*w;T|GHawK>#4ma z#q-{|Nt+l;=v4e2MY>N(7zr@2)qHRyDjIx%UIl@=dL3}oKM;b|s%1y-Rc&u|dlBHq z+~^|UcS0CEkc|($PcIy7FDe9cyG#e7y_H=*)h9}8h6*A|5uNR9mhJjp-|Z^!c)qSX z&u15)Vq_JaCkBr4sM+5Zgz*HNe;}OZD&ff$@A^y(H2QlvQ`5TH@N}pu7If-37w+H) zB-1cSR90G1+W3Kvv>JkW9?jQfkA6&0{e00%j6^w<>jnr!Toi;1m;4;ap);J~b8{U& zyjingrRMD1d+e(>qnYF{+>cgwl=H_dG1)WP+_tb8zCQFkV<6eDJFu?s_{9e5MtEb? zYkpY7Xxy6> zx40ElAMg=#-;c^4r+o{=Dd`ki0zVQQta6M%HHhRxr7b>=aX>>|KiZx5Eq|0R7VTtqQ@Gm!WOsQjZ~ZQH>N*>+5G%%*q4TQNzLVW z!=2Q`NowW@n@&`N9976St$(ojAFJ_R929=dUDd+SvC@*s=YYN__xeh5`$A3d@czQiut9XbRt=rig%(30x zERIw}EYoytUKS1D@GI<3fneP|159w9YMmW(1TqZtZnrYf$S>BW3!_@YMi&=b%fvvr zGxL*2ZR0KXabWv&ck65U`^Vo$1AP?2_G*V75t#3E@7dNV?^V9^cU0s+PBjltZO6GV zo=z(@md_*3Ri2*p4{|_!;?7ftao4I5K_<(@aHUtt?5Fi?h4pVZSM~UD|2J z^Hzs9WRWadD46dz|KcC}F>SC{DU^x-(9I%CyA-IW`ZUX8tNcrDE}P8gvq_{y_S+VT zrFk6P=);DED`^}r3nXy2I;~+*WX+Hacrchk!RIJN4i#pOgGjw#@q4}b7sfC;O!iO) z3&Fr-q)?96q~v?UVoBH}Ix;GKhX?(tz*FJIXA;y6QZKIX4>$E|W%fH<($a2~ITwO9!7izg&DbEN*L$ z>%{vzo$)RvF7x?S{n)iFC)d}@omI62vCpGeU%1J`P&73{+)vjV2q~P(y_2jwk|%H( z@#V`GXAhEQuFV$?b?D#3EuT{qGhhH5mJAO@2b)#I>W#YOxc;BoO*`BdD6mi&p#O4f zHF+jGQ*4^0GP;(T?2paeSr3Hw`aLeU&&L+r^QLQ)Nwyu+TXg4Rt`hCH-s}kcy#jw4 zXlY)JDGswz2&?g>nJxc{kPp2aw2CI<*AoXhEl)oD{X8k&z3`jm&jQakY`4wp&wJf8 z-QQHsB)Wx8Gzarc$?}z#Ob0$R{;FgidG``@i$q2R)fi+0K7tdqjV9tE0AHHR2M?vS zoPr;SyZ*EK0buntBGpi<;$Ml4)jk*EOj}YC1qnB5W``}4#T`k1)J*btx%fCN_|kbN|k6B%joH>GefO`~_-#m6C_629(~}MrHr2 z+SpeV`nJ?$17A=Mt79=eig{u!i>U)V$Bl`}jRa3x8~e zCXoBV4=CcTIs;wJLgAI?g#}mhDfRuT0#q39wjD$+-_Vcg1g8lu@HNu`2USMD+>NF5 z<>JCo!V26pV@|F(ogeK{?&?-Pdzxwdb`J^>k|CCvq0}>to*`Kf*j-5DYna)$M2|Y~ z>T`hkRYfMrhD&!Yjzq0^kC;Q?Td_3pk#AXR$12_c#e*I6z;oxuMM8*!zx3VdJNSC8 zH4`8E@IPP?p{p;EE9rgpVjwEzX!z)0I?|M6aJW5nEOYkUZb}O-S~jukri0<> zx~!ri`tgbNvZz0+A<)VDeAL$Cp7MR*5dZfl@AG+#k6i6@bnVCrQb|>+-hcPu=UJ3` z3ynz-M4SIO@&dA+RkS9*UUjN47@sQs+m}G@*LHH- z5}J>5i3^Xn9`ng_JxOW?9dBJ%TW)M*xfEr!yyV#8!3^<}M0#H&zubOIS7)>C`ZEu! z%6~&@>o~ke#ENNF=Vn%Na;!(_OijbDhm!(=u$UI&0i_MM0yVNdK)HcA&KK&zC4RnQ z!CnX8yihh=7_4R-)Y;*ApN!qR6ktxcX*pkx5r6NEa%_47jiXLqEq;mW@&1FRke~^3 zQfnHf9>Cy!*Ta|vF72?V9$db1oUrtlK*$YKbGV)Tz1Bqq5QWRHD|qkCe_Ca9&aOv- zWrmiJor5Hzbj39AXQ!!^$@h;djSgGNl{pILR%v_%0CIj?j=TtGE#$X2i{_R0;BedD z;)uR>kuY!VeWckBdANh`j)s^G89yMJc>}ZqdCqj}pgg8T(jXEHe{%4|qHxQj()b^+$|mS3_Cn&DYHU#i`YNrn_E2)MPpkS}1LGt@VroZ`pb`tQ>na>GE^wC}njP z$rnk7-Y{bwOK0O`fm}Yz*W$K!-?y%bQ9rI2zyPDODSki#6IbDb2r)Qv@t~klDh1k3 z_y%(B<~1$Xkb*Ry>(4HBuvhb3vjEKod;gc8clzNc6MrpV*VChCTl=f{L3?r0OnTqU z{Wx8TWKFDmT6`aeK;ZKL)zE!uz`1*PvU=6n69_Q8%3|LGTQsV1%!{ey?d{+G8zln@W+-mIIjlF9j;)|J9^*0q_du<7NA;9H^dDbjW1S9$dFD@~VJhG}YUHpd z+Bd17fzn0^At-yC;I9r%$++-&WGCYO%wwXE9s}OGO+joAeUV)SvkX76?M~i6>;~t| zM)QT=myd6PW{S1WqkSk`+h2SrDSV-zujOS{NV5F}f4ValXNc=Br&$I9oR+7b1v)@7 zjtoN*cW}N(ss9mm+|o2@PvBDiJEZgriw*R1>f}dixuqZQ1#Oq)tf> z)lrIk=63ch453?FjVoi6`XeoeYn}2xv;O;)=mn{}$?gRTyY1mD9nKGTX*2_b?3qqR z-W&^4x!s&AC(dO!p}!ix|5#G?Ds9`*wj5>XuBnGM_>+-kq- zp-MvWL%OWdE8%^OmUO?*&}pXvvQdcE_IJk(?botxWgS|6Vn@4b&&>j_PwklA&tMWs zb5PGpRhLgpFe1aTz}J>Rk&?rMZYc^-L zt2*D}JX^%d-D>skO+l)6G8VZ8^w{No5Kj1lM9qxl=ZBa>)wfG^!~utw%8N(Qm{i-} zPnk^mswa(YC%!kg#J&1PFV1KBa^^PAeB=NMQtM))R-&!K1UZZVlBzk5Ked0MAwz#; z5E9j`5QaAdh51+1-{mR^#1=uPf+r11mLbi*%OCBqb|zx&ah!*oY>Zl@m7>WG0CvH4 z)sjXDB^*gJvk0X-yax1p&;r7;vWD>KO`esL%0wNx_F2Yjex_#bzY^D)Mc1^kM!~}1 zZn{dhH!ap7%Cy|i-s-n2(z6S1x##-BA2Xe8-(1$JC$<`)r+!MT*9;b zhf3cE*h{!h)`;oOp$$-c@xKl7+-C`gORZ{;626MX*9tkqUTpIVA6^f3MY0bFES8L^ zLugS!FEj^@!%@znd5D381LfbZcw9K~p9H|ZsluNh&j_DYq{3W%cR97fI>dBudNV_1 zTGVz#(!Hy*{GmCXMG~{wh#KMnXVHd$E+Qd6g~D-Ig#ql`@Qke!{m0I))=(+tc>;cY zZGClgc^2`WVAKeoUTXYA*J%(0zMBt}Vs#H^RfW>>S|RasHa>aXvSWGIF8$&8Kt){!)%dhu$@L++{M2--nG{v@{woatz}+gXeM4 z0~V|ADGB^yd$&?iL44f!cTjVlxJ0!OXFV)79uIk^g!QqJTMW%VpYq#<(CP>pOO?xk<$1!yVYJkx$n>XnV zr{x^0{4a8-(N@Ba6aHUASH%y#y9z{Qz?4ctdpgTD)K|gy@K(j;OzRI+WYa1HIeRRO z&Dt)Emg*f@r8I;J#XFD@i_~Aq(haQ7J~aFJac+YsL%g~9V6|#>IiG6}`*ToZPLM2Z ziE!>)C`gr|1T3Oyo+o|f+5DBDK`1qOZF6<~knn&n!27$vbFcdG7`HWJ*lkR_Y<2IQ zS3dP8pyeB+05_@tAy-4rF%`!b5y1r;?>I@0F2A-8xwQtMv9Eq7AEs-gBx|YR<)pky zJc?mq6Op-wM?U;zZW7(Wl~GZ3tuP8n2urgE zItQ*?n;}PC$48**>yB%=e7>q{%#Pt}6pduu*Yrz3z_mKdgRIpfN=BgI1bO0=|CkoF zt4U+y3imc+bnA07dMwI#KZHPq4EI9hgU)lE7f?O%jP!1_svB0PTH6^_YoG~o)ofb& zjxsPH(#!Yf5lrb6$%R+~c8eROV(sI^=kqv40F5%o->k3&I7$q2MqZ6G@HH{b=CuB9 zr5@zF_+in#{XiVt{l3ckkA5+W2<+TAQIx_azHPEuIg6bNh?Lz!v>$2Nb)L-s&q8~X zYs8rF-fLPQPLoQhzHZ^Yw(6%>zem^I4N~!VSmzeyU0S&|c9FZNM9&$SSi0S4^dXgq zZx|tKl#WD%+3^DPrNQWjMLTMRin%qv>se;&-`B#Hw@A{f%h#7&)^g(w_#{q!;*DvYWa>Fc%vN_=-5GqEb+JoYbU9jxKm>(Z;~+vy zes;G~XS++_AGSy(HCmsbtqXDyMymAPd8?(X(`t4od@97ynW|YkzH=q%QjqEWGM`_; zgvL9VIXMOM2Y<`VQv532?aBHU>A%=V>+Rrr=06_biBI4M{#Hj@{L`qWEN^vii+)MU z^5=yog&gC#>!;b2;U%4{R_^t_@ad5CVIk{qUz?Cmv?BT>VbWF#5SBI<^%tmOcTwL@ zPP|ucL-F;RSwJ>IWckv%7oSb}!QDkAg9M(6U%p8jyWXEWf5>^Ez?C5WBtIxFPqNPm z4K)C`gXuL<1lU8l{d;Z3M=9u-r^&obt%k?e$%s~~N<={H0ygFO+>!T@uwp#tdHv7v zij`CC>+NJj{sR=3vk^X^bEAtRh!H8n)Fy7}kV}kP%5sPDr@ML8`0OPa((jSqzFfKQs>NKjXWrQQ^(9(-~mkUI$K11BN2~lLzdl2r)1?AgT6D zhCl}36+ENG$q?b=ug)Y4HG!cN0}w%7ObM-SBrS7uqt7fyUfTkV!MgU2ULO5wJ5NPT zOURx>{Ww0!E4vB2-}%<4@jxaTe&FE~{j*6C1O0Ko86u)!*Q}UE`h{y-EMf>;KKYQf zbvm$J8eZHn0~4)Yp+==I4>R(9Nb3FXld2R-2_<7eLGMhJgOTin&F3@AJVc*L9(bDptFMDwp$7W_-Q= zhO*|S+4y!x?8p4M&T)`U}{9*kOPkr~s1pm+R-BMJUDp+&so(l)mtnv;B8KFsPeN1!rsxO8Bxik>a(gK7zhes|4D^8pzNe4CKhYgDewV8>uzvdfm4f>x=b8Vf zr>l;N`uW;R$p;ZxT6!0dZX`r<=@4mK1V;)o@X8Bi83lA)YyyiBScGA1v} z+`eXi9(o}snz+QpxDC&yY( zxTS63$$Mef`pr~<462Uj1J3tS4OnS7`u?hY@(kwTOZEp ztx3J}a|F%{aOVA-^oAbS%%S+9SYMPA%S|rYnc&khQ`DHe{mr`1WyW8{WZqJOz%VVA z$AztFGyq)3g^(qox%-@r(Ag;Z7hQMUrixCvCaDy`CG62Z#W-(caI<6LCVwX^j#Zh6 zV}GfARs?DMS58euAX<#XaY8NZQf`4AKdBR9ekY4zr|-X$bT7^@yJO`r9Minmw^q+O zv~RcCs3Kx&!A?I@D@)(D7K@kIxlKlUSh!gkrc|UIo^&_S=~CsrlA3V8QT@-s4sPcc zebk5Aay*mFKa&M4)!CQ=?q5teGjsO$wS@&yg>vWI@ZiAxy#LfekA>ROSfTCsF9r(p zuUr<$KloV^_@Hdm+q;#fz`}mf1wtC~*p1PsOZNN2jYRH2Y7TJ|F_3?m83-d3+v?2$ z8!aFZcu&ZoDEit^@`(dpn1VFl%SCqoxf;)B5nUnw0?^riv)L);-4@WMh^S39u=)G? zi-br1T0v1P;mUFPumL8)ZMVbll_JbdhVB8inRZzra{D#zdSwUODAWX;%-dX?a>-M`+_^3Q z3kD}9^~~Ja`NZ0)rhqF-u@goQ^XOtIaIQ915lMZqE&B{Ul^z zY85bpukX^H@g!j~TzY_R0VcUdScZ)l0{fQPDMUNG-bl6hX@I5%6WnU_U>I$Kb=)F&8kx@a-C_B#U)hUh5e}*=OaCb z8{@`>tjBV9eT*&8+N~(6J*uKn*#z@(0Y+>EZ1oi3oDbq+gI?M;@k)B#Vr_Nnj&}W* zt=&7qJZf9@eXiq?$4d1U3sO<#*1=;SvhaZV_;1SXtLGWWK>}=;Fj-SgAs;EKG`g*0 z;{kZ}Kqd0OA3YpOm5j&ZA>b>ksw(}rbthT2g z;Bxt_-#xh0`Txy_nKaN2zI*t5*_XB^Il!PYvnP?8)YVD#_LWlPC{0cJpVrHSK%ywz zJ5i%SEEwvvFCqbL|0as1OxG6dQ9 z1(g{eYpt=Pw|w`Am*qYnRAt|X1xtB$e}~}DOtjfx$^KPW*aPsl4VjP_oi5z+e?l%w zGknP=6}o!k@&4ZxP3i=8a*DUG+z1E$^|T;EeUJ5TChV*xEMs)#OM5Mi;Y_!?91G@4 z7Y0z$b_xvE)S<$h#k7S^z%~p@zFWx-A3fSlA!f+S94as8Z{uFU|yk!$3ezh-rJxLGa^5z?qg6p zersC6#g0^a1er8Pe5Bf5!q-S%4S{LPD)&J?GUSU1KY8QLsgAoA| zAdIOq1l*P%AsM;k$?c1-qp}Qq|EOWL`_NNMsIKSMhkdV7Nkfk%T}}%8mFL-}{#2^) z%QRLi-s<6t;f^mjDNEzXH265uFLXvf_0qS30B3fih&f9bcT=p0MaAnrB8sPg07>Mk&LgO-(t z>&ARH1OLN1`vb*;yE_9~{)dxuI-dJws7uR4?z0Qi)DYDx(Nvk ziTdI5%3hJ}-lZ87iAx}h00&|l0c)Y)xx1V&ekmY_16b)$Mu3@+ce@gmrAnFHdhrk5 zgGpI1zL!lL3`52z;6mkr=d!>w5$2nuGw5`N`t+r25ES_vw|@*Qp{PQV2c z<1hu``rU!qoT#b(n7wyq0w7S0Yl=clz^ABju38>rTMjz>_pJla@$c^YCk z^$kN^gxYX3BeC==5CE!Nh)+glU?;rq9_zbLjd;J@REJ z;c~`;B2CZ+P7eZ`GB*gIF)4yy2;rAru9;I=io7eN4?w}Fhas1sTNaq%c3|bxbAu2| z{1?)fG<;q~u^rL^cbDnG;LgLD8}E-qX1lrMYfm|6`R`G6F5J%6r0;|ogMzasXP@pB zkeUO3J;jZm@s{V&C*FCC*DcOi#K~T?#JbA>9F!C#91q_?7cOXb`D)#j);ns%O7v2}dBSB(! zXX}bx*f3zBVtDF%qpUG>-9z7#-k&*nIXM=*PnC9w;VWx5c&gao1gw;dh@1J;dS{#m zM^7?2q&ri4XOOuKO2UBEdu3`|A}{iD9=))QTbd_XE4~}cDpXTbtoQn2JO~Q@!jum6 zA4Z(HRA-Wvg-OX2y?rZeViyUnlKd^rt`k$3taXMio+dq>!ZzouWL5Eb{wp2p-)_7%6$@aC(flQBVxC{M#6wxkytd&IClw1p`3MVz2N)Oe?*;G*>_-LZ#X zrF7{`5XshPnY+IhE{HNLKLmnAKMwP}MTQ>fUfzBb_`}Q}Fo=gd{5BtIdHiiZrj_bu zWhPGlMvnDyIcMB#lT+Ot)5zHSR8}m|r`n}0O6af8H~DXGOb+fsCNF>UfTed7BTss` zAxOBh?IeC~rV-G4%Fa-9a{f?g#}$K14j3|dcsnB2|6~7e|L@n;4S0%;iugg@S1_|r=R|0+!SZc z>38<(+^YkmBoQZ5w>)VcWM(%^n;Xkjf*@d!ym55TO+w**`Jij}vAy3rAGW;@yuPuQ zB-h%m^aC5qZ75RjSfw4WYpz#y=trn^7QXT&#gf!aDmmzob zIJy5CxSd*@K`AE{JZT*vO}U$Ie)xFS(`5SYuA(lNM^B5d^o8?+x6PPPm30xm-i-H$ zd07@^u)j2bXm8!3>D712zpFg7A5u%lF@*dz}pB1WEV=>r*;9X1_23pH)OCej#$Q*9SFcu4793dx zUzDuRe?G3XpthE!yNe{0XFwtVXokgS!{djV7j^Fo9STiJd4sThrRhV=gIq}JbBn_X zXKbic-<;Tu;K{n&#*a!G-w%3Diph3DRcIqGPO%p?;6Q_i+b_ek)y`o$gbbaV`@L9hRQZRsZ1XMDA2zHolA{BXJ_ zMcV5=VmTCR@wm9o`s^AR?>$;(`4axNcpkl4G(3-$5I0NU@( zgS2e@20%+84Hi~8H2yI+qI5W;>i~kkSyEClhn){G{%Ef;tYOlGXJPv+%3bKA7^Vl} zP1~(CBw@*$ytoUQ-Mdtuzs{{*uHNI_y2vr7>-(<+H)-$#vr|ClI6>wJ$e5AO^Unkp zwxc{9rko$AD>fQLYVq+%Is*;fsZ$d8v+(pay0Ah|I}WQL9^dcK0fy`ZImC*nJY?&K zHY&)Hkyh%mjAYaASD}c*azn{OQyh@+GjZEd$2+j>3o<@=Ga`+}&vT)er5hsvp_-01 ziRf->^hHY!c=pS0adN{n;EddkWxAiR29F*$X%`2)BpxtoJCwXS6eVu&zVXz;Wgx!S zO*p2s5e5N9Lf4!+pMZjWMjeL~ou15%ni7f(u*S0%OR`6TGf8Q+ojy~7LRPF`Gn!b$ z=iiQ}ZkIz|xRAkk&8cr)m$b7kVj0!LcS$^0@no~mCg>j+iWl|-R$dPM{zcSi?Cj+ny&Y}rwmn6bLT)C0H@1-`M7AI z<@Pjr+9X=FdnpM5T%VBN9FDU-Mno)8yik6A5za37p6 zcwf+fUyiG?2m*`ztyFxiZ;5{ipR#H14t`CNq8-Ob$UrR$rDGIS!}F5Aj`f+NfC8{M zjrG|}^KU<8=LSoWE}m;)YUvq82K^JqZ`??$T}KL$fcDFG3K+fmF~FIBy#GO^QGl^l z;ALCW7se4G@dB}+HlrTA)l&@zO)xT6xpHrYW&lq!GW{d?${sK3Mp9ISM73CH`LJV3 zj{kTUYOMb0yk}jNXi_^{oDX0^LLTvNCO5q4X)}{xrA5h+cH$|*8m^8^Rl^b3sMJ0A z;x#2PT-j_|iP%{U0&yl}sUKC(76rGo&skfi_0L-tS)_})2b7)c3iMv3hyXsIn9X4I z80q9M8`65a_vPnYt*H8!U_|zK$29ZWsywiD{*f9gg`MD`{`;loL|Ahz0s@k0eoZiMvIi+h=4`zI;L zaraU$y#Cbb50%OTh3JnRB-EkS5*10TA{a}Em0Dm`|x0VRV(6ha`t%j=?%8cqr@D^Lcq_SY}oJKmWM+oFk zVss1y=AA)7@xozw8t1!1d=*+cIc2wk-4okahikApy5FqA13*9yu?ml+<|t|{7z#r<=}aAkI=mg5o}nBgTxQ^Q#@17 zr$pr*sDWHuS@5Ac{)1uqP-5siFd~!3Jqj^>K3q53hxcI=?R{b4xUms@a(!Ado+q3fxaB0N{~|OlU&e)4}0( ze&GS)x@{j`WFk3fZ zNEc65dDe+~n&efJg$H($@Ff8>;mxes9MV%!7L+N6ds2y!@gdz;t?=TbK;OEiaq=Yd z(duNyR3rNMtSX2_5Fho`^Po?N6znEPK^`19-i`qte7lTAdi9zLYNEfJp)g^+I(bQuxbdLmg;)u%A%BgO#Aw}A!VmJ>Qf)5CkDsl1}xotoQnXxEn(Xle0uiinq+!6Z^ z!4{#HjFIg@lZVcEU0qIh+_gY@Of{V~C<1!{=h*B9nvL)$E z3GWw^<+DFK-N}jEAX^&o5C$_vmh?H;tiPnmeIN6R*ETU8k^Dw)mJKUE1q@&=dDO$0V7W)VO z{NlvatEw9MyVl7B1vA;bj)#6Q64>*M9u`=nzwqea8m3p7xP?QfTq(co%V3U~U?ikE zH7&|Mn)a*v(fG`%*mZc(&yP~h_cNWjU9~v=Zdd=cuY5Y|7 zCMT`y)PcHYDOW2?Q0Hg5e~qK_oCFjQOoNgulCtY^n3l@wB`w?iRHkYmJQos=zOvw$ zk5)5(Ri%JLRckyot6)5`@z0go4jz}XSy|mavh9uOcT(=W!opOzxssu}L}+OL zo|VmXI8PfTQ?m>Cj6W(UofQGegW3o&Aq|oaD|U4HyM6hd`#Ir}-s?X4M&yEpE9NRg zMb>#nOl=={->@>~BT4-}^*Q`=YK;+J+ei|YP@81Hc$Jjwm~PG!w;RJ=($1f2BWY+0 z&+kg{O8twWC&i5}bhaGELzIb^wj+#7o3zur{;2a3iHBm!jBN|!uc7TxM{@J%8O1g_3d1L6>}*99?W)f{4}zHp3^_(+<496TZKIYAp8 zZ4e;%spwMH?xd_l)_O=gQ}#+#L^#4VoGI)iLcDg}`5YPIT(9xEtxg7B-1At*f|@)_ z0#y&`hgpec>O)lb96wQdy)`WySKM)QX13!;K)@d5uc~5;dTm9RVJYW|F96r<)I5Js z%s`C~LOb;VjXiG*&baBXyfThpEY4XabuaxP;|obUXTf@I&xd}$z);7`Gm>`Rj>(F8 z2;h>*9kzKQXSj_w#p+h6m@XaStcpYRrCm=*4Y7y6RX1si+mh*t-DpgAgXo!tswOe_P4v5 zfv9(M6S%Ts{^N&+%K*kgWtMSz#Ujlush+u}z=0|cgbQ4ies^^-BK;tLqb%Q{B1}jM z_9*wr-k|42WWL0pT1?~4_TpD1n#AHFK7fX>1zRwUg97(kbeL5Nn0MdXy+`@tNdfO+ zk|l_Jfr-%VcSc6)!A4hEAjz{FFc?;_H4Z;Zb(CRQ=IhBLjG237;~s{ci4TbY+$s3L#2*>YDR#D;4g{CkN!tevO&3#8kOJRbY5WVe^-Ttt0 z{OwL}SR@1nTy@JI2uyjQr=k8VXZEfPK}CXtl(?O5@{{Jx=9EcO+)g?IXpUvY3H=*IL(m06xj`Z)V!RWYT>rx&YNFUUj zC2tU9Ao`)+u((io*aSjh#n58VWBYH3;)HTqYQcLSBR4y8;pJUf?c1oe`cNj;_Sa{s zr3pI+4n>mezcgcK)&3Hz-YlxjD4S{6Si*MamzKg6-a_*10eCU~%}EC(e&7oCm!iRp zqzBcd+H)pO%JZ?Kkty%h;t4)~B8|R}oh-vH(Tlw^wgDEH-5!1V)U&U_!m!Ing^ZL- zYD#WcIF}Kd>kkLlR5~%-75_G%yx^BzMujaNU!oRw)GQ=ndG+YP<#*`WTOI}Aa(aBV zUtCx8et+QK|eD zuv_Ew?P$k{-}O&2kk6nbmWF(f7u|`#ua2jnD$29G^!|RJKp*XCZOln(YJ_w1I)z&5 z{9#Dj_G%S7I!jq!IZj%3%y8L4!B)-qM25t-toI$E^!M4^5Qaa&n!?$RgzKeGO4{+T z$Wf?ioE((>8FB#7B(&67mcI3#;Z2{c9dak_Y<(Y;_NMozKMG6lQj6%tVNWcd9e`No zH6h39!8Q=p@T`zyU31(GU>2u>u+kP#>-cF}WDa-vhr*MJZ;4x*-R_2Q*%s@v$t3LSNekf7@@#6h+LyMrjxVsuQ7ky9%m0BOKU-VVi z5A0V(dF&^$>0@}7jh#nC_pt2)q=Ug%76xy59#eOJ6Rb`6jAa7aA}Ebo64fHZeUDe* zfHOhWr@gL^7s}^#*)uE}lb~hcnnJ|+3-Ff&EmoK49&$YQU<*KTvHZSyu|@LX{U4(! zu#?|f7B_xtZQ$g%0xOkztE}uJb1l`k+)=@nA!|BVD!BEnq4Xggg&(w3jeh|mk z_T?y*u^;>9EF&LW_VZ2GOLeXYR{r4F_^mufo^zU73QAat-@Ve=t$b#ZKh^d~7mOQu z_NlVHHO#7{P?D!|Q}yfkbV_(>vJ$Q!=b$_^4yV4F+Fxlyq zKiG?BskVJNbcK`yK3-H)EpHNSX<{Bq{}Jg_(keOl6pqwk@Oi+r+QK_|4%&h^3TsR^fq3@Wd3bmmnu-Vz%;n^5z<_t`-G%{{vPge$gdMk|1@rBfvTz1o?EVz8Tl4PEST7V zomwHa-*Q9cciG9X_cK)d=Ffv+yxqJj5oZKs<#(NE-BJF}QQ1PdntDurz~mj+%j1J7 z>QCoW_H!F!I!m&)Brj7pjz7zF_2)tpnuVgIv3R89Qc*EhX6?ZYZbRYtm$zrO>5QU! zAs^m^FpzpzWZHWY^^5I;w)(XBT8N3U6UEu(!oFv$sHquS^3r!(<<}+KT^hTG{G=~5 z>$}r4S2xD-%q@mEF=kqZbdl$r1=ZbF$_O%3qb@byZ9Z;xtYmH?^s@UJRRMnOfZ*?< zkwomQOiZoF_SzaOMRhO8038yb*N$l&W7e*Q!r}_CzrS=l_}KeMvq=7t?xS?d-0r|W zWgd?yi1%Lz;H99`tCl$&zsDC9Ia`pnIo#|u>^W9=qG@ORE5i82M9wqG_^h0-ZCf!< z*)nsfa5v|O;z&`G1gBI!IHjJ!LoTgh;7|9Jw>=K(2}P>$6M~0{DPj(WV`M93mi6A5 z+iqhvRd^i@Q3@SS7hos#z#^1+hxMS4oC2x+Zrdc=wExI;MTQ?^8qa_gGk%qP7>0?D zsGl`cgao(ct=h+j1lR3`5U25>W&^n=pl1D=%UKATB7Is%7yRlL!S(GE_)0AD)q0uf zYtY|iNHMNZacujdO{ZB@_OL>JV8;QRNmK?TddFnglB~5sZI1wV z*B+HjIT=xy>P%zq4)?y|ApY#8-e@{q7XXge#m=$0VZ047m9+>ZM3>v_Ac(yNawDme z{dwC00|)5+gzcQ+x;#MeKxeJ$O?+u)&L`4CZPhc2r5TDP{M*M!NXe)%ZFNYOk|Ip` z+;ufow`!sp`&~O@fgEvu2>k>ripsv)_6MTO#P3(E96n-YF!N7oje1i!{HE8~M9 tv(GiN(!CT*O3d+-m3_Fcs&;N=?}!ttg-2F|H31OjqoSZ8Uk~vWx4|_?aA$CLPtXwDgIj=ydvLcP3GVLh5D4z>?z;2+cK5$` z=A3umz1_E~x~eBsSyAde3L(myH*em{NQ`bZ<_(++2oCm32gMQUo40B+GUB4@ zZf}pgjgrzD{&Kv&Cbf}6Dr{=)cZM0GU2nHi(v;`2HHXWb4#ZA&z9E{#s4r{$TYe?l zGDQ>0zp91fE;tq*4X(|?-99Arm3g_m91#9YwmWR|{KrG<2F`=_5YN8xMYZw69bewo zAuqm>KF-HXa?oaY-~GjK@bv4p)V7W3_G;!Bcbw~+&viH}*E`sA%K|G839N4O7cpB( zH7_mOv~OR)vHf*rVHWyz>EXH4ydX??HaFx;$2I}F2*j;NKsduzsj{MsZu<-(*f{v1 zk+W3>T4b+rHZsjmX(xvTA)*2q^OG!yBOnEjPc>N1tdYMIxs_l ze|8SKE_$m)!ee<;-pwFGoJ`N6BK%One0zRO#lP&6$jwpF7V0|a zZmY)bDDg&VAT52fKbzn5#eD5Q9&UFnQoy<})vhRrFk&kwL^xYLzFS=vBNU2&$AafJ zp`XC;qdi(-GsQV&Y9M}!a+pyKxDE3<9#^0S8DC!wk+eY)1jt09;}60H!_X3`dx^}MdK z5>JGW;(U-Zae5YADC;}Q=pB-duaYAFD2|cYp?4l-aMF$IhCNw_K)7$>{5TloNLFH( zlYQ9#RZ=lPFvZwr7q+jCD9+FS7L>}K=13tUzQdK0j2n4$o`eA?1){9HPTS0Dn))Zi z*PgEd+*^VZzPITobsa@^s2oYYlgF!A@y`~m)wcH?#PVMzAy-6T`17{o&d!9tjdvo@ zBH$!+XTHt8_%u zbqF&_iF?>x?kaV4k1>W#sn4-eH#`hrDNJ~caFv?ybNFfMZ;BTdwCyYM=JWWt&m}7U z{LcHghmNK=t9nNExrV6ls&JQ1oHtlqtjt4K)@aH83saZV?E{^|iDs#&NTMZ4ZWmdi za$(9xqVI)1Fk30!JpCI}HBX^K^QQpy#{Eqkfgnb5NnOaz!|movi0z*hHWDuTcoZzkM9vx8o|wgRQOthHyY&)n zWML(kz9Z32AACy6<&FiIt}khF&24NU8)q?}+0I`>ICXah@O+n9welE8**pqkc+86N zkxxT0e!DEZ7csmIAdewSu5QP%ZSyDX39ebr8<=3Xj;(ORK!&5+VKtMmF|j+(8c-#R(`XQL&X@439u#?$#sC z0K~0So9Jq3RIwhM83pK!&-UN#T7J*Z^F(hiZDg<(cth?>mWX6>7gJa6k=%?0Z`FsE zW}#!rb~l|^%GbwYrLst&?WFNKg9$IB0VgP3jh%MSoF|Gox&WuN8_aCa($wYCxGBhG z>}BsC8r#`0+|+6zG%7d#4_Kpr`@`tdpOYV6#UDPeav{-%G|FJC4R_5K!mBj;V}SFY z8$T~iyt*ojOSf80;kq@gQ--laMka8=L|%A#4yP0^>gUo$plzroLQh#btz(7JnhIc? zaCU1+QT*SkI^Ctr=n!!&YB#cVPf_j2Qe)K$19W)9NQ}R3+rJ@g0%9aK_T)jh_x-k6v`XuFfhxSDuLH_oaPfpUD-W z9mp!*aK9Bl)@K-ySBZAzGP4@$WjjNQMDTa8qww?n&dB{oSylbt45N2{!%3tGEc+6# z34*vB&aW!tYe~+rggAXh$w3x|)60fy+NjLB%+;Jko`SL|A(!LSUc+Ncoy(3^q9TD+PRf6i^rqCIA}8swp`x=t zEz$m}k-rYRB{i)-$vztuwcgrzBcZ$VGU3BN60E#jwFjY@(zIR|we7QNpi-_>YwHJrrk6QGb*J7+!AI*PEi?U%Ou1T>cm3H@SaHqkEH zf`pK<3~c|wKN=3*oMK`_Dd}f$5!4SC2)s81JLdy#vbe2{qdk8k@UB}?dGRfi zjOALRrYCita$K#;fR`Z}A_$^4+hNu6qqw##S|0Jp{vK38qt;#cxc261f;77Ks>W$$ zKqu{I@!c5Twa*foFzN69*yDF$?zuf_E71@aLI((WHz$6)6s??g^=fBOV z`~HibRq&!5e45fz!W|VUY)qDoXM*6LeyJvc@0qhpZrY8#EPqedL-Z?(Lhtw0Y~{~L z>}DSZ$XB(j{o-!we8_O#TKnbi;Q})}unZN@|2`}k zuU>3Ao0RGjJ7Xad{qll~XuZL^4b}o*VLWkZ7Og7Zn$DrAN;6DfcNk~Bmd0zPHpbG= z03RM|1O?k&Z&DKW0sY-L>wjKwdW26lu)uuHu4uXgdcRWn)_8#?{sBvIU1SSMN6z(!&_9pTX0 z_%k`X`5P*6-1bxy@omlb2QT{54Br`L@7W8}#oJ#?#Uwx4iVN~m$wNAytx)03%=2FS z9CXDq?^@;SM3#tF&t{|QjC95GB~!@0)gc}GeRgO*Ie`=v_}Sa#So+2v^2KoriB-YN zbS^fz|7;PI{>Gnk9M#I>9^|$A=+n63@TF9LnmPPN@r?pPeVZT{-p0?ZB!>TG^DBDA zaYXOe@GrPSJ~4Qi1S-~x#&*zF6JpT_qxq9|&J`TXsLBSme=2MB(X1?1i+o%j$><8p z?F!$APW8o1IJ~6~?J%SG%*kL0&K_ugd0S|fzDa?Na3KCi9QDn4fD80h=9-Qpy2m)vv8h{rPI3H|bDT%_RVy@0AWJw19CWq% zRCpUA7jizZ<5lQeGOt!h_IY~~B*z4wQwVBZgtMz`V^$W6?jR>Hq=X+0?*8-VxBkiD z8n)X)G7dGw>bMQGL zkvo?*&E?vrCCblY8Xw^uNeMsuuo2-n9efx;q{pQ`lAC2s`CXk>!w#`dO>+FjCyy!@ zdCDA^K>1gmPXW>y)mrDjWr#+EI5EX74VEINFPM5CUc;73%=kSr9<;GQi)()L@oW&C zYwlE$U;F;p3o8V%n(v@K=c4YfY){d^%MCeApSGSf2T@ICeNM(pZJF()xrwaC>A`@L zk%^zD)BeQ@(W=n`Tz5-43#YZ;H}tne0blznysYyLKT$tgRSL@w<4z9UJKiSlRd;rp zwDV;g01jLA*<&@V6-_H|h8=_Oof~N~iLfP*$k@#tl(zF3J=Ve<3ge3}WXzwRw^}+K z)dhrSR8~}@AH5b zAxxV&$w6UvSzS;XC4R(<;P zuPa!xK(^SWIq2SCntVc*IIOL*`woa_kn?Saxh0?aS3Z$`+fumw-iYc6XMa5{9I{o+ zoGK}?T-_pf9F|PFT7Y{L{h^Bx(ign8sG+Q~)ZDJgaY6H8`{k9_;G}DlmAN%BInp}D zyxm1@vJ7#-n1Gh(%Pl^qzVAGJ2DLOOWt(plLBmY^Ra)}lSAJMQ`E$s*klbwWbkPqN zRDwGdzg&OvFgT)VIQ$RKb*b+DaHpO7ztxY@94{pfsKP?e;w56hSeol~qsxv*ams7A z%Zx$>C5v$DpWhpKg?w}5{1#9U_mCDoO%c*EMBx6%TYBe{r-PAnzoL!}HI+07*%;06 z1ozYJ;)ge6LUg$j=UZzChYx*g4y-mFsZVIZ_QBOdy9)gM)V>UXXK(3le@e3Dj22jtkAw&Q{c2}8hD$75w0>OQehQ`n;3Gv;Qdu^to>37c zV8qFz74RIUdM<#GYkIcQclY>#eW2;{r<<4bAEA^zIV=ST8cz{!zt8=!-OW@?_R~uh zVCOifp4~!@!}!7x>0(zm2e&*|z-;d^hC86x;4eQL?8^@GQ%tgB$>QcSFHH)1y_!BG zlsTY8wPi)dz-#1P6D9P$2i(1t50frRB=#_&{(Ia={Zi`}(=MMU3~c;zV7he95_Jh3 zaS*I4pFnAUCFOWImS=Pb(P&59tl^ap*EJPi)%@Ct1%f8p zPY4K3zCpuMqmrq?e?;j|(z`#xxv5IulJS~8fUuxlV40#S8SujD&0+|JB4H=af zm{@6}UtQhE)|YzPi2vb4!JM@&oi2`St^3lsxc>Dma zR)6#My9VD2c+KRgjKEJ{JZ>ieR$9k)?wBagelYM2oYu)JXTpQUewae@>{3L4a8_h!Q0u|J-=K&2x~06d*sW({6OKnO}{`B2ZSI5@Nv&1WfhsJ74X=UrK%0I&Tc) z%el=Zd9%EvO{8Clnjo7s2$mROZragZEl-uz87x6jI{rn{0#}bJU28>JPNs+kYEbJ& zZ`}~zjrss`$kvpIIkU*k=B)jnyF6^_;&i{%j@+qMlsULgAKnaGTY2)nQT-S+QDvso zRfFe@D8N1yuk_O!WC%~ay$J<5U!eYb*d7i){9akU<-(6qQ_d0BGn}YL@EP50X13q_ z(6w(y(a$diGf*d+f|sql9N_pr^>u%a2d^+;LlxLc$*_?jZztDX1ISSZZog2z=Mbh* zHvcSvQ?PT?bpKG-ak*`TDxhB@S~-U6?`-8{Wr>5WMNA{6RAb|-ZdE6h z1u2;;F9+Mcss|H=pT$#%YZZGa2=sm3J(0aNZQIg_Qlo_u zAs0hl=isi9BqDyBpC?qY`74k7oHTIr(>i|032-?yOA$fJ!`K&7mCRfFLpO_^TddJR zvoq=xckxv=^m^8tK|k==a)GeDUN&Gi+JJ*`QO@MZ|^0jyEF=h!&_g_oO&% z%mMtFQ?|cb4wNV$u;sd2)XR^nZXMgyn|W>JgSbuY{|?}ld;Pj!6nsiIOV~5_E~6vx z?mWU731?O+YUSc-7A(dR546e6$z-nhA=hII%X)=i(P~nfG{}`M$5L`Z{n$T!j63ke z^mNMAJRv) zaKbqh>u=S;dbyB|q%Ds`q7tZoWf?s4OD*waEN#^iugWi`FEl9p%<^zgi`8LAG=G z-b0rzSV$K0A)0w&_WnDZh2_(Ml`krMXdKZL5A&sKy0fJI-bL4kg5F?`hI$)5qs9zd zx4|{^Yz>td+W{X3WkE*)$!6>v#Aqo@OU-Zn6(t<3d93)+Kui&~R;%}(yIQRAg=s4g ziW0`yjQ4cs9{8ND(`PUlQuue7Jn(R zid&@4UvcAx4S&K;GMkzWl0a{byEiG*Qa`=G?PTMM1a}$y`($w}*Svda({2-dBI*yE zy<_h=%#vm6W&bA}iitNMXYE7gjQ?z>EPhz}X;&@clz>Xiezv2O`EWY-#R`9W09B8T zr34(Bu*%cmxoMuBh(QHZAZRUfFs2=UU=;90vyj_eGwqY+l7>n@`QDTT$c0%RUWB)u zyv2kcB!GYW0sg}~I#C%cs<05*7$zD2Y%Fn6gtwxOKZ`=d2T?$Rg6;*V-gbd@7}xsk zmBm)82L}gw^=4zbo{b_+&9=*KH-fuICS{~F$g(XC#d~{|)pzB6JHLmk(pc)j0}9oo zIwY5|tzm*$eNT*hoN?mPl7=*1_`bcp+h$`=y4b>`uiF!`S$-z{;{>ELDma;XBd>v& zqx@?*9*MmJVyd-e3^{fCRt^&dskl3UZBq41t^MPvuWTnWp>^;9t&NJ8xCDtwzP>#=&agGP$rf4<%^h|bw9~S!adFyIm4`(Loogz74zf*!>v+&)%+ja5g{$=|T z&zH7cz*BY!&*oWKsB7UUhrxS+?>W0;8O`7KCNRxcb0`UPsLxR8wQDUE zF6d?3Qw-04Dyh=2{ueyn(fwNWMm~SxQ!OKvJ@N5E54n0qQ`$dR@nAkfIEcLV4k_D{ z5Y7nmuo@|;v~MOg1gPwaAp(bCp|Mn8h8I5rcR!vJbm9EKT{3a2-7-5t*WJJ?$qG8H(X6fDbz(5e zYt0TrHUR!+5iOY)0lv^h^%o5Yj&1AZxOq*;j*XV(g{2-C1VceJrxU!NA1oaM9q^al zI%Wdf2NvRd@4Dpe*C@P5d`EquMPekaxqmw>saqOU&a7jyOq11rKE`l^p>#luRc?*V z;#kVH3ihlWj-~m}bxY^9{B&^cY84HD0Dv8fB_^sg^j2Dv`(E0O1x}uH-tMFCZBV_1 z=C3zGLDc`0WkCGS2Uxb03NwfP1-gdoB|<3SX$l}QJB?7wi?w$_)A-fDGyxG%4!FxY z7nOmLjKlnFK$y}?RqzX~;+JV(-LxHo?)SvBz+O>078IF%>pLBxO-D1{)ZDAqNMB}a zKOwhm>R-1E-A*Vd5E}~`!gL6JCpg6T%EfySt;UnipMo-g44DRZe$7_pNF~h9swmN{ z67>T^A;4#X?G!VQ{Gm6~_AZ=WHRsEo2@j`Iktl;}g>WDvD#9OvgzG@eia1J>t8eO6 zsbJ)@Z?ARBM7b~_6QB$-3K5M?2kRQ~ZcJ0}znX&bZj?Y4bmjNJ#MzdT{Fh5csJoVz z3Wd=*1Ji$3OMn*m#k77j@1!<%ntJu^EM|Ru#)q?KV;umKBv?VUWif<1Yi@<9yu&Sy zUKzi=EBUab@n2BvO__NhXlz8EQ-Z%$$x_WpcPKI&(3Nw#SoJ6$9{KjBNWOLygQe4=}c&M<1y%Y?nRRYO>k1SK2TNe;2*OS2;BWSdx_Vg}zV z{E(kp%li*Y4|%^#3d^Ei%%iWbX43i|rz} z#mxwl8felD%w~9Zio;`!u`ALw)WHaHA!#dCBL`v_qYQOXAtTN>J=?=tS>AO@veV{C zv`u6@-(B1^@mN-Gmeo5u#b|jTTex24xuz{Lh-Z=7(%btb!NKVG&UY6TM$sAh z2XrRCadw2u1dgyU6|q1JsHAjoJ8*f(kQ?$Naoijj9tJ3W4Q?9gi%g?YOkXNrmAgAl z7&eNqdNa713yv0>=sQ1Ga5vNC2Sc26(ho*0@TLh7CAh?T< zeJ=vcWkr7ojjmFO$A)HNYDq~9PYaD`FSVaeUdSPYzXt_~6QTXa%ayn8up zeMY}^2at_!=&{9DbjefVl1*Us0ZtVG9WU^vgQ0(!o(=_$XAo9zIF&V9XnYFKge%;u z_RZe=8;=n1=a<)NA3%`-FrxDZ@fjlMJ^(&gwZTMy0O0<@i=XUtQ2cOI2+r4_*2gH5 zRAdMa)Eoqf5Qn7(t*|U4@!ZBB;JF()2Qo>=&|jd#jXK|?fdIRpY`s-lNGUL^Bkn3F zZfm`~EHJK=R*PwbE2qyqD)=xW+nW#Roy*e zq(2#N&Par7wZ3+y2a=WEc`fgdMZXU1CrUxxt{=Sje68<{htnIwY303KVN6pjq!aBb z>~I17feb8Vg2KRXLzjJ?v|)>7-qhJaCY9&+wHq&mwg!fZCv8hd$zD< zu=;o6Zi{7-G7Ye_FVuN$FX)hcOcyd)`D(s|^kxCtn~ zO8>)zx}7|Y9`oOrFjglaOL~nK60vP)l`W%Q(Bs(}?S8KM&e=pVm}`gT?eqk=Rt&G} z+!cOqnQVH$%A|jRykb7qLY-BzQgNS_Ar+m``)wl@3^!Ti4>s27FRQhCMHV>BlVDUs z4{V~*Mcf;A6u&pPy!?l)nXHo9qmSbA3mz8YK#AX+=PlK+r@IUoj~-2&BVSl43Eks_ zm5L^3N{Mn<-w||D1`HnKI1R!FFz0n(u?);g|W1(BUQ~I~A)cbMl5|63) z&%<#4#OuXjZKa)p?LrN&yQ{fGR{^injpfNxQ3L0+B*@{#{m4CeKf8ZV-^^3l^lf76 z;#9q_@0&jikwn}Ij~}B2Z|*{3?L-qlrM)~IA7oY78te=2#Rf%67hWGfQs_gbDvJ$P zYssk!Dx=HIwF86(FnmxFIead+wGg>1{*D|sDt$kmEY(w@Wz~a{{eGebl3%NLnPeHJ z_%K7KeIHVU8vI3(7blJcM^w{S+5Y@4rtz*{(xAJ+zLB_y>!j z!VqIHQtoFA&}`Me;Vua>Iv2xXBeYp-?U|V{%2P~l+Kcd426urd0Y!Otv!-W1D{kX# z|B6VrVne=`yN%&`+vRgb(0FDu`c#im|EC)Bc|^oWqK4%lwcufWBsmasI5yOI+-|Y0 z-TCmQMNHq<HTNE&*_ae)E|^=S55h#w*?+89Uvl0pLWR?nurx92p} zUu+bSv0p>E{v)znEKZ^k3qlVjeP+uDL24u3^3(_#0Q6+FSVwt}U_3-=K81-f2r>e| z(4@!Z1Ap~kU${xtI$HOnrCf>O<>p&=-V`vS1e&pL!_^`QX>Aua=p7aCSv}2y`Jvo%Z-6==qyKF@3>LYuRYqQs_N&Zi(ZF-962-3s9 zz+F>?Cn9P#?JuPq8{5X;PvAfLGML`*7mb|?F;ZbD5z1+|BgK;QGs6L&HI;F&@|`TZ#XMmR@?i0_|SlZu0gYPjzZKD8Hu62Y39?$p41o_Fxa zWR+yQm$sF)SSif5VlT>kwqufah-hzN^A-?iNoNEUW$^2zBIr6geh`Rp<=H5%J_Ro| zroY^C*B7FZv2n%No-UNqHbLDBS=au}zH?u?LslEiS>sVizXxSfs8{2`v1NfTY}%P< z0oEt~Q{svT^=$$&{N1r@(l914jA(dWC^Gp%h}zcFiY^nu9*yn0vm+BJ(#Y4HD&inW zb|e_C+2vTq6IZ|C3hCCk)?#Y?9#5Zu%ZmdI^c4+pyVy@yr&JlQA~=ShDu4?3@nvd> zdt&{`SxB#$UK=iYsV)WtOT+|O1LtW5_<-!U7Zq^1!y@;BKKoe(%bBicZb(T{B#Exb zHuy8GFXf&!!UZ`M12%>cyJh?jsYn_>{2gmJ{|kR`*YxDbN36ts%M>>&A0jI{wS=!w zSmQ~?ZIqs~9wqy_W6TZ_-@;-da*TTzO(X+9hcF%=a&JzY1_cI-vurW_i*FbE$8IJ_ zp$PK5|0fLTnKJO&|7USJ3SF7zS2J51zY_+)E~hJ$65nw~H#K=m7Bhs26)i|5gBu*O z6;O`FL5HFwqWjuAGRHE|0STJc&HG&gL)Y9)WQaD~+=74L@cNA(G{BV~11k^aTROj$ zria4kyNAy_UH-zz(Fd_mxQ=fmbPmS4A!4xp2@;qpW_d;VF+yPjD0dTH<%|Yw;GVI; zY3uyTQ+|faa)6r*&54eO^}l1Ky>pltyfXvqd1gmnb;SoMkk2+hWMS`{#A{1Gl1tmK z>xs+a=*u>9z3b|#+>A|GFW4ZEwIv$#{Ax_-gk${NH*Elp_ryScpRmbdW1Q5Og^8jGVx9oDz() zjijc(b!g{0FCUcm`lFN1Hc@pa_7Lpv+;C0m6IuVMbc<#OO-tu!X4&KgSETJO@g33n6Zl@ed zFa*F^BZ4&XGz7a)0*AA9@({qju|W{z9Csc-)s+a(_sus@MU#{j5>W&)YDva~rcL^F z<$L2zA8G|f7vytP>|<{4-IR8U1r>S|Gs)#sAPgpuTs(j-oYf^}l|TUo0qfXZ6Ouz- z&=6?}iXX`ABYoT7mX2Q#GP$b^=JSQfb>In<^j%5ob!|txuL&AesqTXt8rL@Xh}xgf zt*2HN?{n5llvjVrOpT_sJNI?)V<6CWBznvKh~Gwn^r+;j{es8L*%3Fvs_ywZpQg(G zHEJDuSp`;qSZ}fu-h1%k8#};c!T6`asvS;RAj!8m783#xQMtR0iQ{|*t(WLjt4ZVe zS1o1sUN7Yw?c#P53&=o(;#nlQ3QY>=dS0uTQ4!vtWdY@A%#bRk#@fE_K)}bSsIId_YM;e?ZRhc%P~S>L#PF20`X?Wjd9pD>xyXA8n#O z;=x^`OE-E%SN5nwJ~nVmMfRKd(*m*nUrC^CfixHhW4Tt05Oua1-@^#y-gd&Ws&4P( z^=3BudC6O2UECz~cfK74$I6s`*^1yU?R5C?gT{E(;z%PKBA7G;VKZS2$l1H}a2r5D z<@)b4!5fFRK!w?Op(<$och<*dLDcwY0fgW5w!anp#4qCE6+oycH~?5mnoBU6hokvPZ$VLs6raZ8FAH^r8gs`Pw z@Qh$S4u3IY9_mU)^Ye`i9t4FF4*;*h*2Q@BU{9}g!G>}KSRL(8TXi;mbIbQ36(e%d zfx-#3!HJTP15bP?6^@xbC1p}LEL<5dOMrT{s=UlWL+Jvh%GLo^T#RIJZY=B=7E}Fd z@H1e^Z9bH=y0}6ngGR37`fMv0pfUYZ0?AcV0ANk$$CKpBxI5QS%VISyr-SBCZXp&o zLf~Iz`?SEyZ1z3Cx)jTv4yG7QRu}EqYsmj5B@ial;EgvX_VVSaVbRs~^qFnD`-~flb4ZPE#~J{BUbV{y&RnAF%4jOOYScz-{9n!C@B7x+p!47sa!AOrnW?w9OHYk z$&B#OZ6zIq<_2+5P`E6V5^#CwDa`WSzG=XuTy;Fq|J>sB_-}T_p0TEP`>{pp!qE1S zQGUFd1|)k4fc=X+eZfkKl-F3-*j-1n*%kn6$^XKi&n0CY^I6&*JR? zL{x%6d2-Lq44A`~ELXP`0+v(10eA15JW&8HWI09vCOS%7;$(N$sRo;i7Q>%x`zSzF^7%~T*$f7F5gt=wuOPF1B z)PPG3+R=Vu=>nE0PO?68O>3M;@rpW&Ead(Ur#=!N4&y6;{TLf{|SC zKZg*0Anwru^W~jq$VPXRrW_D}EV*RwsM2uVk!4h*HkvcbRy@)T`2O=x04XxW60OM_ zzwC$@t1AR1Rh6)zpq~Y!R>7>;aZ{IP1uy@QMt1=LJ2mp6UZA2ywG#S$h|#o(T$FVn zl;5X||H+{(vQQ&L1= zwL6fF9DkBuMYU&Fo$-m^1PB%ePynP#u@_++FzHz-Nr8w7ttb((ly|Zaher&Cf~x;V zgcVXlXE7?QF~pUkcMnT6Z&u)pSzEM=grNgSgpZadAP8(-4T@j@9P74&4YkaIXSp&? zS%%oFFhukzrzLr3;<%3N2*bo`<5V}=Z#qUX18R&Tz!2GiF(Fx$Ok0_Fr8 zb+Hc!7FlDMr%lami1PDvr1wWJJ||wEVOF};9&f0(Z|!h)-ZrDRzVu1sAl=$Bju@O( zUb>RH1DIWZ#6Kb%^@xHj+Bn@vm|7w>t~!pLG^&1Il^-EP%rkF2d%lkIe_}OqUT5!u z1xsU2e*o`4iu+(B|hlJmm zTFZnSSaDX%Da_D=;+q2C0Rou53r|zS7BJc;FAD+KQxXk%{BPrf{(OKh9{;nMKnwd$ zC6@d!8e*~0v5e~_{6|s6?RCn&8F~G3S+^!6-8yT|HaV1!_YDeCR8&KT*@F5M8QH>_ zQD81A06aP)0}5RkuRDG`9`;24O4Q~2PKikh5f5-phHy5NgjmC1BvMU2e4|PQ1@(pjrUePcRhQXva?^ST{|7A z`Lr6t7U9_SuzIMjDHuV{_*l$U9DxFW8S;u8oXym&`DPfVR9!neyM;}0*h#}baNDiG zx!>^erKxz?!8EW#>u7aydKW`FSjY`b1CcLq^?5!nGq3RzTQ)m5$KG|YXt>V(6al`vY2FJvx3Lh_Nr7MMQsJcTTxVEaif6)=@lrYGx2@597`yp@`<{bQpla zWH zpTPbewWMYqw=08LKpSK3v;en-NDf?~FOzdi~E$xpHDncyzp#TE&xdNM%%yE1d|N0rgyO6e2E$`tH-q>+p4?Y+R^#Hf@51|DP>bqOz6_* zt~Dn{Xoxmv1Nm5bD`9Tf_W;Cnuw#<*8BmeS{uKklYJG=aKQ88r;I1Z%owY}i%ON0S zA_QyWS!aP5mN0uMSS~;?pN~&x8boSj;EGe$;zB72b(xa0^f#uBM zGLhGO>x{K;^R(I3q}lZ}jos98voD%=^j5kj+7q1R z_dLq7+z1w6GE~@7kf3 z&+<2Zdi5t)dy}8;jbJgrQ-$(Jlk&^yBdJd$GI&3ouu(ir?(=p_%~{gR>w z5k1aE8ndw5pmnEFI>$7*rlK1qx*c~Cp->Dj#4Cm$8X`ik2ofDU!W&1#kB6z47)8no zbzp)wTjt99Bp>JM@b*HErF8?rz^9Ry5;`!OqzDDIuw5zG{vhS|8M|kW|FDiQ?{Re$ z7;QlX5YA-#g0E8xv-X{yzb(DsuORqE(UI8={HOK&VAh|A5AG+kzLER()sN0T=NAdh zMNIxal>70O!JiROmrQx9Vujpaq&+ILX<16dEFN06>45)3U`@t=x5+uFkPMlxkoX$R($Wmn>YKa1-q<$(?WYc4s!Q-+8^K&t+4 z$9CC+T~``QnE+BV%FgdKOcJZ!&)yFkYqL`Tz<(H8==(D29(OVBP>vBO_BGh2#(euC z!78>A(O(pw@J$LX58o9w^u1L~0FqZzj?Sg#St6w^_7@u`d}aP;%7j7yT&BWLn26eE zoL%XaeIKg&vPW@Mr#JpXjfCg>!piRP(|VS#&|zIV%+PGHnk5~62sYV$x|dTcR4g`V z7fqd_%B2B>k9aM|;r-D`vO4tE@Uj;pm=IeCZAJdJ@mLzV3E=RlK(!MFAdsy=i_f}K zbj$n|1xt-<_H9I(c9gHn0WkL(TB6@}y=(E8izkh8D3)X}O4gw)OKL=8vKy`dIb5Qm zV}ZQTt$5~m&BMR>jcNA15e5M=8O-}l7lVTAp&>H0w%y!94P>Gfaw<1W*_E1eC zfH;r>M1fID?FH^aCvhJ?qyaj1>|8e9y@dndg^RPmmf8U;opPJ@S3WoH@ToAXeh0gY zs?w~5+bMf%?bNp??qlrVzp`J+9x!Y&P`+(-KmK2xP@wfycw8O$JFYk($H4m^ zYCu6>0JAwvA={;2RTn@NK@9boP0|?;8BE|_IO1q3R-}VXsh+nD?V-u~DUts^-;1 zPIth9U<(-fOSS#(Z}AF|e7y4!XzmC(Cjr*0u&9E&RI!*XVnR0zKsa9G@_oIlNo`dk z?O(R4XQ=~It`PL0t*<_ zHUC>=`=?4I*TH!*l428d{s-K=r4bD@;4OU6|6%GZ{Gy8XXs_f@GIRZSHATuFQa6w|u2|kuyrTMH%B-r@7;Z6QkRg24>Oo5fgv#~EFm1 zNnIZ*&NAF8aG(YP5HDNwcMd$x*wg#|EI1IU#K+AxPc-W+k#zpAHO`R0ttW%UhQs>Z zpI`Rve0as6w-kf0xH=}k-3(gaJp(LU+Yt^9io`nc$}&bUh^tB~Eqfk1oZ(6XLy@m} zNF$AXeV`|};odx8`8 zr=GTMnsI15Y@$$|VFqDSq3ca{J;5-T~5m9H(rr+(5M9-=-I_EEl2_e!>a}3 z1aLwQZxWDSZ`MS}#1?UrCBS}g=n8sJ{F_klut_09!V9oI++ z7K()b-rrRS4}U%xef^NZW2fX(J%!(M8Su!|n5UDK9W9rXN~iVxw$L*w#md2FYPPDA z-TC2~T+Ki_850Oj*dC4tu-}I(NLLI2!X8}#`W(GTK=T4M9#;>z1aV!upaXIYa`7Xtp#&+)p;UgJl|R z7aA?b_rmvdTb!?U$Jcs@!k3o6e&u+!R08qWEq0iS##n#2Bz*~~34+g=|AeGa;WZGXbwUJZ)9%Y|pshn+}$PHx%}-zt!7$UmY2=ZR7B{=BozA z!&z-eEj?lN82PpDww4nAHm;7|Ih*FR#6*ytE&{R!u$O<9eh5nR`;&cSLF(6KWhJ!d zv%7Db$;IzvHuEW`145);N+V+L!MEJ>K|zbYHBRrIQD3MPQPc-<7=vZ8@X=}(lFNSs z@-#ZHdGmXTiO2LhZEi_u=sWUP1C|!Q=!+GaTV(7-V=P{&QhO+p(rh1YjFf*3iJ@90 zjAQ}J>KV&%Fi&9~#M{k{g`XKCIy6h;i|_v$#e|@jVhFmQC>=^m9BE0@I-f_au0;F% z^$>Bt%O{&3rVEgXN}5Is`2j*G+9C7d&T$BdlqXBeeX~br$*Iwl=}%da+u;?)UPbD! zqluQdEc=b|--o^WZ7ckVEnwryjHv^|{G>!q$2A0eke2aB!#{=jLylJ6Ui;0bazB-~ zqX;XVfXm&&dG$HP7%NYKC&Cl0NDeN3yHTiG+}1Zxwm_Gd=iqT{bBnIQoG^Z3M1+%p z0_P(4vdzz-LX0AuU?CrYi;~M58cuE8tKNi@BH+yWna;#yg$gG5#{TX+*{Yl)uY*&q zP3XW5Fr6Iqa@c(O=8u9aR!&4BrbCmlZ+F6tfvAK%>@39ZsmLE;7YreLyJtkK2!fPS zl32q(u6;qmh(aktRtD`PXi$LOhB)Qmr@=$RZJ2vmS=M0jV2JPpGQCJ0b<3J~(#0Jn~`{*yc z1vQfp=@fKkCF`q)EX$&$Lz6{b@3aHgclMXP>$foRsVcxf0tVEZiC;u2*THLmsR0}~ z`{i-{*nI6{&S}8j`g-slrTQMei0Z59Z|oo%9)Q-LI=c4!^m^P5XUN2MXMp@`*|&Ev zwo_O0qdS~tqE8`^-wD;!Y8n(%#713DIDx&jWezTCDEW7uOO_HbJ$R1jsmU&s_VpPl zcn9-;Q^Xo(|4@%%vvyn_9JlV=weBL)e>ryg?j)GkVh8s+27X7=nC1GQnQ@>{Njk4Y zxV$=dOj&H4!vXBl+tvE&ogf}jpqNTpX1y3I#9`Q=$Pkr^LsTG(4tw1w_~V`&y{pWb zCk_jh1i4^Ngn;!g!m#>ie{_#4*AKnI{*d|0s~exB#5ZQYkk~5z!Z~5yPf#l9Jbt=} z1M9u~J}u)|YdN604WH+sPT`aEgc}_>j!ymppySGMl_l9&`Ln>)mVuo|ah_$=*8`u7 z#nCxWyq4))Z%an#pHIU2Ml>t*u&iKg>+%oh+Zhfbc-I4qNnNv4?Fk!@O40aexN^p0 zjukV3Y$-~XB>#IKdPcyB4oyr5NQ(3Mj{HHVPkQ-rM4E!y3~xL98>$$dHOmjZ*-16} zubU1z+j!0N>?zhx5zv>fh9i#`Il|=lBlS3d4uGj9!Zx$}3z1U01^ErB-}QnBW;V=k ze*N7OayFltC<6V{RYF#{yTQFOw+>K|Zy|q9C@3klZ>z?IYx+UH1MOPb)+5 zA$|0h2}hc)78b5HX>iNonPksc*XzKScC^&!7OV`)kGC&DJEz(Czc?EKH%1eFl5)sj zmG5faB#OOQ_~C{;gU`wN=U}Gyb|AA}W8nPQpIrY$yCR;~X0hn^7p!eT)DnMa0t1&A z-Yn|(x1?pn^!w`HYD*v}eRTTiYBQ~!(uxu0U(qqjilIB2L5)L$-O^eYC&@9FN$}@F zh;-cAvnO(dZ3fOazQJodi6iq4fxP*n-va#!A2(wq_wGhyd;OSz&*j)B8{T$7yWMq2 zuaVbXgJFB_ArJ?^m4Ogm3{3H2y$koJX+XUo4oWO$W!7u6oc{)76nrg_uij_K)JJD> zcq~Wy-L5t@TG+@T8w{YEylc^>a%C>uw>=++Mbc8 zP_gZI-?H=Ro2Bl~nm{iBw-G8@Bn&x}c}Gu`0me3|&maava$eaD}55?L27dk3z?0 z-Wo)$Qeg!Xmhx{8qfz@N8x3jd87~<1k(H>!RD8utbgK~mUSdxca8&%V!vP^|FODX} zlzM=85~gpXJS3$mKe)puf9=9Q2y{0-bb%s zjcKdhhi_Mz2|`Z^L}GA(8eM2|0fw*k5<<)B2>Tu*G2WpV)koiuO{Np1p_&AzgW*w% z%gohgmuEG!x@X|H!O#ndi&;`C{5eKb_!E0SAxxISagC6xcpfUSEJuV6Qa-im7WkKA zMFbBay}JqS>+<)q>vF3Slv1-D;-x~WOMSz*)a73}6hbz<3a@~3xvORuayN2Gny*K1 zSm_B)omR*#3L;!b3W_rg4^?&jk?N(Mx}t?-{db*qg}zi4Hhs>q?Z~8{_0tNEe9*_D zFbNQ|DF|XDo58BerWcC#%5fwTB=DJb)MGE2UGbd6ZC zLy|i2YmQ9wtr&kb*HZDR3jU2xKhrSTlPo|L;2c#v-i=gHB3dQZnf4 zX04=UzF3fyCb%Yjy$=48x?~WQAM)6A7o)zqeuganz9}6oLY{6n&MbOv23}Z~{wr+0 zi59EJr^TVJ9x1YfN<*;iC(jGYZql$$q(6clAwLIe!7E6Fd&BmSsTNza;TRK1!)uoUT3gSMf|vP&tN12(z~ z#0Ea5VRWotZhb<0GcJt4W#d9M(p`X69W;=_lg zRbS#sGP1C@?ZWO=qSJN8MnvC_P&eqQWQGjM(f$Y@he>(|O)4qt06S0B1CIz;FA#q; z@nzX(RDpsW#52k7=)6SH3BhP7jYqwHB;C zj$6^`v$%9nBz%)ytdmouHGuJ!JN_LfJ~k6$hq(B@bL<)2tWbmkt6(=LH#frddShs! z^3Pz;k(UVx6JG{48gLli+P(uO-0FlW5zua@js+A}HMr@xJ9jB={t^ zoRt*j+<#QD#ifG{F3!Z=N>ZoaW-iPzcMr^Mh_S4-~?SnQ=5J6_VhIdCQF=4*7 zAKb=&VU*ETzrSmMI%U7`gRXclyy=$S*EJduj;(01n8{k3;mjGEh6zP!STR3*<^V$R z;F1DUdD}@4mB~TSjxz@kDos{DyD=Bt_NVfxx;JUc$Bq%|#zj6Jr6kueXRWU+x8U}kRkQ{Gnm_B<+C># z*@m0RfK!tmz}mu%9DKGx^&v~iOg+I5;8JEzUY#msrhiZ>X^c~t-ocl>&g<`;9$%sp zhu*HzxEeX9^M53Wq%e3(2+S2cHMZ*5~EriFA+YqA4h)(=&}c zyaS_i;lHX(H6}9`xG~=Ey>};B-ZS#pnS9XnToHwW?q;sTkz$1wn@*#0{jO ztm+s2Z-~xhWI_-o=F!+or!huXF}L4Zrd%WQ#$0-@pq3T^I28T&9Si61Hav*kRR|poIp@<3^2%CCir6O#4L!u4vr5D^`;BR@Fhi-s*8AosjkC#l{ ztk-7|6x|gzCtG(wA!6*&jdHRqrXylx36LzIC0%BE6||+dA4{|3^TI>^J{C0J`8}v8 zpl-a6v0oqbk~^~sEF-!-t&QwVtnBcjwjJ1h&wwJ2g_>M6OQ_i&waICM1w}VBpkL|u zbXo(@1mB{g+)ID_#aZ2u5V~3+szpYDC`4g?o8;#5&!eQfgQw(y=al-SL!d-|!MWfg zgT6t@3UDl`^MG=GCHcWgy&ItdAuxG(R+Ef9a)#r=fT`Q4^mel=0sofOj+)IxQ=NKD zcu!h;@)5g!S!#d?tBKgR6f*OVzRo&PZ&<+Gz1QvK9`d7nVA|r>qKJPN)!BF0@ z%uc44QB*`~9x7P%xkGk-+Cjl@54=MlCQTbvzESYybhZ4K)tp|+bTVC^L>fcsP*iwm z8Eg{I%&$G&HlPMa)kYs5As1hk)#optP?Eb}ds62+DbV@$0p&X=q3RE0s(dVHT>Fo8 zGFZ#20tgAzWA{jNKcpFh-6s}cHc}FGK#*=A-wrdjrnw)UR{Jwo!A8!u%|dYwvY{G6=XqHGGjM|e!x7oE(N8@Gs!45~*_sWi28l#q%8 z9sTgWr|;;131t&XP&vo zrf2#;^QAWT=Cj{-Lgf8nnf{qfU%$-N%M)!>Q4msm`Bv&8UnJ7OX8PCX3qeS_;o(A_ z?5J@PH~FClevXd*S1nUDoE}MNe1IkTl9nK6vKH0z@Uub({b9h#9O4Z{HGsJ+;PiOc zAS9V~VW{~816C)+Cr2Qu!X_~MozHy(pH}Arzalxy@jlwKf!1HF&w@{R%I$2S*Uq`( zpoc=^yK+v)Hq+zJorn|UH`%*JxUyZ1?m8*?kZ>KUwuOd>EK}v)6htz$f#Fy`&e{n%y;zPY7)jDL)IEqyoBES}8vp#pRWasY zK3o=@FPW*+rnJ|8emeZxM|r1J`Lv~!ZW{}?*Ecak^D*yLDF;H=ZCQjhw$1@|OiA?X zO8Jecml0PzW1(iWc(3#~W=uJ}Z@=V>B!RUw$}oGXp=O6kR2?#thT>TNBD6un4xN+y z8%-bF_Z)N~r1NZz&jsa>kDRzElu$LCIm*ly;c!CG(@A&rNeJR*E^p&LKjsr#-8WvN zTe3+IsTrSEEujhyO55F{kPtH)0ZipMlyUcBp4t=d5aN5K1d<;`pS59NQB4i1Iag%L z+{-n#gn_LCz)-$dOHHQ=pp8DcpXVjtRVa0}=vO=^gYhtwY|)Ic!4jo`Zq80_-jo{z zjx?l((duV3>H%$h3@HKMBkIr8-2MPB7>2b-0!>XVkymA9 z&+pxNUPhniW;jNlh5Q2R?Op;Cjck{HSpF@$5lyQ*E5OUGT6zR*YIxEZmpupjwHoq| zPg6$yRJ&sz;Osl8rVKaFDfBa(2eY}ST-U@ z?u~nMaQM;tM~*_>ziLApKBoJb^e3^4j5Z=G;r?a)05un0b(Xs+fpjQjr$?c+4=9IP z6?zxfOQ#AMm)8k2qki{)Qpd8KcOte1mF?C#T#gqp$bIVp@FT?Lw@-)pXk&0#%xbGq z&nRkqd42ug>lz*Qj3(DZxB80}_q7krj?5<^dAxM1>s(zB_&jbL#hxK^5wh-Y)aISf z*CY~l;Jp(`7jzeSewfuZ$`!bBSv(e|86LUc%P}&1UOy3TG&qyS=B)hwJ(6pt^|xrw z4pOgs4-ir)sN(UdK~#6@>2qh#R+)7h{VhzVWC-3(Y4zyW5pvC}eHW5uG!r08b}pSk z&NLG2%-@?j!oqYGSBx0CEnXp$);>%CTV3&r6`EnwQxV0MlK~xyZq}Gp>@bIIA2X0Q zrzihh%`AEpAk-M&yq(^EVI)_|;#*i?)QKGa5iW;;Zh1(xUAsFO6bm`30GvH5l2DJ9 zmWxyiby~tsQPbVW6X6_)mg}gNoyoCplU;7+pI4}_X(J9aSvxtZX$Vy1# zgky5~a;F8K-L8}gv#T!2B_r_zaxVc6$QG0&cKJM-mpW_&G6$PP0Wu8PuNM!-w~UI3 zwgP}sO?NkK2|rg>7=OP%&n1D+5dP>M&trSL?=mUuzc=xeF?ul+Z#pTmG^pEu8H{N` z&zt3avstd~&to|iH}HkL{BDIF-0!mBb3qnv?{GC&^&;YVp0qpuA#S8xS!BWVq>V;b z=?FNTiU4xs`=?1DNAG5>3O6s$t-R=q98=tOWg5#(B;sRcWo6DWhLS3>e^$>vP*NM< zO*yk(V@fCT>`_<0vh-c|!fA_Ezr%;SVm91#!uja#+Dx|9;MRV7wLQ#fDo(oN>NkSr zXU`*L^rofe$H!4Tc=vzuGtYI!uwo_;9Ve=~{Tm}t(E6RGg_Ap|ghxLEk(^BvB~i8o z=`NGT9MEGo72Cfd60^NKz^cJ7I2ZQ}F;W7(SSbnj^>%LN4iRMEb7g=``c#Q>v7vNx z+2<3VACRk7!Z(g!Qsqf=Vdf|=K!`Qg1xx#!2=5_unbh7*{qbw#pFA97%$M!IZ>#iM zZ@MpAVtKsA9%8p#yZrox-Fw4UzT1JF$T9bh)s;mvRXfGmz`GVXK;KKFonS)K0I94! zAKxe@Ie+@^kD>C+Ej+2LMmy4#1JRyQ!&NJ+8N3eSiL{C@H_6l}(YNUi2mn?s;xvO> ztqVm|ugub`w+$YB%e%fR$zQYKAm@j4-f8bE0zhixiTD^w4=4XD@-T~=9Epk#O?#6; z8BVAq;<;@+j`YuR3&S7_&zGk^XV0_E;h$R(6qKUx8J7A1XXlCA`D{IZ1b@@GXBOpi znqx?DAlO=PVj`zC25J0DHKy;v`DxcO2`tqKP!zZ7KIgZW? zrVJ{LN-UlW>%8WJd=9{Yk}+kVLHYc`Y_7kena;5}weX|K5NmSeuYu)Mx4L(_HK=w;3tWcKCv+gK;{V}v^oxz%Ty#*uHueBg+-cb#U zM^*^dl2dQ#$hC6le(>vVBdt;a+w_e`dO~N5%?+0KlXRlH4oX9)`swyobujUpsr_X zg-nhp;@YQ&B^~{EHC6Nrc;oMz5JR|(v_lD~(Nn;bvH13{g<+1MN2$_opdLzrZFIO8j+IlYftjFRrm(m6{aGp>LO#zpI|n(R#VHk?j|XTQVQ%Yg(J3^P64*-q1m)KX zWxJyjvcXEIEXn$Sv>(!WI4}hDe6M;7o1&!~uJ6LtnripPjD>;ueD4*2=u)#uJFs_r zdhSYc=NjjI)zHH)?<7s_^*WTQ^sbMNr%x$qm5fX6qEITh{Zg(Ep3ZhHAB|(p>&h?Y zl2g1u`isNzZ7>e>6d{?n*8Ox(R(>d$Sm>OdlKBY-+Aavu1uX=#B8X3&pTnF&9KH>l z%c)AQBxVhq$!c8a)&T2UM1G9rg8s$hIr!5neakesV@A92j+peo^HeX$yij&aethPNfY}R_ANB+HiX4a`wyW zE8I_4Q`NL&_k3C%|HN81B@4>`nabaKSA{P2)wI)(6{0%wAc4ib?)1@p{}y&W2R<$K zoLR)Uo`~TCoR6JYjB`o#;t~a({W}fTRrF_yZBJq)(6EvvE5dm{kDY+fOV2wGndd}uZeW#O;K z`HOdoRQW{(2@5cprm4!J!CBSj%UFS-`P8vuV1gtPbUIjHVOPa_b4^!WkUfUO>SKjF zbjU;oMkeIL*mq}v3@tYAR2IJCN>WXHh;ASDZ}3D`UGCNox@3_I&Bxtw_=v;$byv=Y zS10{w?wjI=>V_hDZOZUhn>5?H3|K8Hr!Wf!>o6w6w$GRQHNbYdfe9@_hJp&X^05$* z6p(Z?3ghK!M@WVfW!X=jK_>fxkYP|4ZqTjW$eu5-c68L}r?}bKKsfxm4XeUK5$v&& zc)&n@m&LPoI4)lbM3^W#Mk9Fa7O`Hl6FTx!{$u6ua@jwyl}ntw7QqdwDl zvO3Ldxi#5iQ5Jx^>mlj`Y}Fzk>;^6|&a9wwLO$Fjie>n<5h`dnGo1U^=Hpsx4fp-u z$8z?m1!Uo_wuLPHcOlN0WRLf!ookAv_k7OVmI(t9&`K6qT#dK_ z;U29m?@YxvEQf920l3A;7KIYtEA8)ovtRwn%|eltd(#F+*cc26DcOsd!Yp`9(SPD_ zS8DT6CBudSDNLq6j?YU&i{IRO*r{L(@(1~5b`v8?Y*3H{5B}sjf>aR#>}!0U$k#QD zi_tqg(sChDdl2tDTors&0i5n>3sec*< zBeQ!7+7rx(4a?AXoMW$6yUHHr{)0`bMD9l3u{D=cvJCCmOn;?W!wAJ7*|12$nV*FN ztRfKa+xK-84j7a;`#9h8Mzv3V`ykGrSXMONg<3ST$FX+YGTsG&!(EgJiMjT3!5xpN ze~L(z^k$5s4fJXe+>)-j^qc&sI^dcS$!<=bn96<>kG7RSO*ETycCe^cKZ_jB|5Y~& z?%9EhEGzaEOwwvfFH1yCkp4*f=-K%r-d>qh$gCN-jwedt>ATk(%32N-7m=(8fl9b) zoZS3@iUp;+KdnxSXgz-A+^LnrDS_I(6We7pLVYB9Q6SoAY%s8Nyc&larKote#f|bO z(y+=;zF5@9d?J$^Pmb4utoHoq5Ev-3#502J^S&dYf_=9|Gr!hBRipJvj3lKMnWW*D zr_0IC?(DB*@tIDR&8@u<^{MHkYPbzwgv!tcshlqR&EZN88^N*T!-?tCe#* zMlkaIo{$Jw^tEuHG7VyV)ilF|VFvk1OFj>O=UMGpqj+fudY9aflpjESwf8`-C$(My zxMpFA)dsEC5wOF4(L(dTuYICrF44gvNxrJtn-kHKYqc~K3J0^YdQF}g znqbhE&z|&|ud=|QtvF;NUIWLygUVTS${T3nc|;>YS1E3E5d6|RI8v`9D#cUeKzAr8 zETTKv@K+`D2sZ^8N{HAz(P{|fiM|z=4pDrhE0I5@jhURYb9=Z4vftT4U-Y{>_^pNf zQv!jtqFj-!r>7S|xnhrsx;3EuS0^XFp4>vwBY2-2T)DlWLksQ+H=yq^6c;z1DQs$~ zmf@h}qVbzF6&7p04WA~x_34F)dYqLkjiw}PE)XODan^YsEC|Nu()TTY6l<&lu$9YZyGX<^x7fj) zKlS~T!Xqo{E5oCA8c>}$F0Mr8F)RqR(doe%^VtuRX2)?>sK-$s(cVBikj^x-Vx<#v zzTHabmhHn1a#Q;Eqd}Lh-l%QJ`8d#o@EsE02a!E3^2b4PzJvhh_U~u= zInISV?@Kn=7yoS_4X!<|@S%eNg)o+2qBq#u78DSe;`(Pk05ziAnLIxHLd-39$AZe+>zOrM4Z^7}TjB~d`|9CiTy_a=X#(ebmVXU}o6`_Vk&$;Nf~&bzs9PrjBy zKYaV$S*^0`3%ldtPGOGSL9uDM3n3Vb6pP7uEzoy*C8qi{&vT zhUzj)f!YV71~vsAoL*+aMbt?6fm&s{4xll zfiWE1R_w}czx)e$&$8>t-uc(wL>O4^#hgaqPPUBRVJ|D zvIWegfSL^{6DulMoke2YGy{)rg&^$gdc|1-&&`MLHY5NHuQSm75RNcVx>=s>-~_J| zS2S9k~$iQYb04P=#z!Os|t^`U9s-GCaDcRh4YWdK)ByadS z!8a5P-T$-Ee&5a)fNpO`3%eq@Ji5E=lT+`UZ${*odem*n6DV9tzNjcE{NeoVZDO7K z>Fe{1CWkebvOR0w&1WO&IQOxr~&S#3iKfv~_U4H-Z zR|xpG7c~55_FN}VB3NLaf(jN+sE~5MUi5{(8PM`$p#a#a2GtHusvhNp?h|eflG$*4 znrOpi(r>n$E#oHXm~S&boDlYo{rIgk7h7o7#3pi*cbO$MMbn!^?Rs0-`x*!8u{Ytn zr?FORp6OENEfbs5uEHrH!TKkwzO7phhx|zyWP&=qIo%2HVq6Ajfj{IxuSpGuV-cId zs8L5AE$i>vP!zQKky*I`CSxQrQR+joY(zFsF4#F`@@X9kvf+eKPjdr<32!P`V1WXS z$Zl_!Ii24|yaI)&U;D?6$H23K9Sschy25j)8`LX4WU2u~(!CY`-f0n5z2TQQ!e~ib z0+Q8+>0!|VPG{@!jmH9K-L5zql0~n9%k4Si<=}V(;goz&I8anuMhrCINb88#=BaWZ z%yB_2!|-L^LVvrafZ_hj$346vfNLav_s9ss<|c+CdRNYt4L)xZc`T>(Qs7KM+{Nzc zp=>B)wKoEKHSD3Fw?0jn|I$S@01-qrfnw5AHgO$#qEA6dF3ZrZE&H?y9?yG1Ru*3U zUgTa-{6E+XDG?Z%GqK-L`(Y5VKt5+X#0UMw`L<3QlgTFs9OQp}!Qip^on^bo_K7nC z-S?rR85sV7U*bPwG1-u{#t{epb|waa@xbYW$XKT8=wNWG7y0aQ&RZz?MXCtN-c)kQ zRDmt9xV_Nx^rRP{(=1<)(jQ>cEwFoHvVY)uP{34@>zk~WZ+{3A6s@+2xhj*ct65I>>w318Og^Wmv%4bxmY^VIl zWN-V;{H%M-ak$Lf4`CMohCCIF|DuHo0Ar8x@%8uoUg;ff$o5D&VBy;mL;6kzQ1a^x znOB2^?uTMKJv>?b?-@yYf59*{`9B8%pCv(QO=B0wc4(^4~0@17|EGyA_q3`04mvyWwBK-c{gO3bQ zP&+2kJ6zR3DAo%-3W!^yi9x{g9G7)q=c|-FsJzYd!fj+vTyo=^TO;Z0BXDH*q6O9l z1Qy7IK#$IEBX1dQz{IG8pA&z?RQa(-g7OdyfsOYbBJO{dP1#X>!h^tsB$Bjg`?NH9 zQ8s|I8&w3$9_zDGN7Q@EA!W7{@VTsP?3?=58^*uvj`C};v$2J8L#6j)5=tQD9EG(- zlitB*;d`L2DsG}sV}NcZzTHcdV3i^vKu5$43VOoSZEFTh3mp{G!5Ej!uU|++-Cq3S zDM4lDfpsH3*ps3!LF%$d>c1+kiShY_=5;=9U_&tywf@z+y`TlUyh4THTHvsbL|0;YVbz7+n4vnY_u)A&7?@)RuS1oF@pt%A?oaTL&sNR6HP??qD< zk59?^0u+mGJF%_Xmd*f9y!e5A!4Rv{PhUW%h^5-7}d;efi7!&92(>RF+2#8zP z`rs9SgQPKf0cx_Uk>cr^PedIPi{e)Vxd=MgwezU@(H*4G3=1MEO zc3oBB$Ni~|?L&Y-bAesfp{QS+z~2yuXCMA7Cco4JpSyu7^q#wf&;bh+A4$6iB^@2xd2U*;KnyK&RI>< z&9SBGFz`Oml+rXPMR~RMVyyI@NFb@fpz)EDROmJU=u7NsktM#fEEtR{$W5Uu&@y@7 zh}2`VLL8d+wn;|lNg)?VzFZF)YyJbZA7eOevvHt9{A5CpiAz7%2=8h4+KmORFjNfb zFleIx)_{?nfRZ-3%eShJpNM0jAUnzD0<6VS7XpR0Xf`073Ox{TJNo?mNV5kNdHuK; z<7_W@sqorks+wuNsk55&)^A>yrX3aV1F*NZynd*=(k!6-(EmJFCf8^X?EW2#ItKM` zIU>HHd(#LxzxJ+~h9_#jv!NAgYU~2+if0vP5P>fZ0#hdnBmzp?3i*Z@w1_pNt)rpH zP{Y58g!Ws`5C>ZMP6ANOaAXbAINjO5<~weIen$GQ(nD{1a|-er3=P4w1k{TuOa>V0 zRL3o7A76d(z;5~zYBBy{qZWT7)lJ^mEx@nP))SbC3vRKbL0C7V$cU36)r_lufj+s^ zD*dQssEYW+uCLv90_V|Dnr5Zh-twkT0TO z4Yz{czhcQc1JKKN-}_(c%E9>G%qeP`JFK0tqX&II?>GHW0JU7In&{g&IAV|l0;gc* zDWMyJIT0wx1l!roIqf~D#WK>LA_!MEWI`r@`O~Ffd#*2;n+b;V7Wra`zEr#>jGrynS`z+_NyMG!D!FJTtT}G zd8cSS0PjL$G=`>a{bya~pN4>)ZnqP&!1uGnq!ji)zF|jes}X;zRPYR$hQ$e{TqT8U zBPVwGK=+M|Lmy6nk``D~q*=Gq@0*#?s&olZgcqv)PJ0{Hoo|AKEG}Gx-2Kw5b%-yZ zBm!R_3=OLgqm7km6SSjk%ku-76y})@PK;(Bd9tL=-`O62 z8^e2lG{)7#LI_dlC|#m}{^9yb5Lkz6Z?X(0c3%Qiz8J2&lL3TI&B4j7RRMgu3&pqf zzyDiHwA14>3`Vk~Dl(8cGOW*21BE~2Xu3YfJHmn&s1h@{5Fh`eoi5d%@f$|bN%rd`;lrG#P{d#Z021YJp=vwzXq3JH&Usn(<5#9vpiZN z(sFWKW^h>zWYz=iBLLF%zq|Ov3e&#Fl+>rEg8|K-W4_|ReAtJHuP4O39Gg$lj*tT2 z`&lA6!3c(-sW$!y-Kl92=bV&#e)nJgoj{M3icx z`_zHc)6<-df6FUM6-)!uai3@2fQ>nKET|(2ISv60%9dWhKxBVI&-u;x%By9g$0DTG zwoTgd492$qf1gDaUpuoWo6!_IyQM~#C67cjNYa!f%78pI?g5^O1zXA^p7jEX@9HS* z+<4smUn6s$?%xf%?q%24K#Yyj{3LOfBriAOTo*`RLVwjXKiz_&nM#b#Q*FN^tNbAQAGpM5m__0IPA8$bBKvul>1m!h(AA z*7noV^^@h;CQWV^RLYyJ**J|&$K`XEi&@3H~DZWxd1K=yH`z!Iig; z1YK*A?>@I4?zI7E_2<`WBm*et5Oiw84{Hrg)?3GRfhAZ$MeRDZMmYG-TOUynCNn4t6tV2B0{Z`W zf-%*0+BA$QA=H67^JUm6xg;X^Fn>|McMwc>tN|NSTUl-YXC9& zc@aH{PnOK({ybCfcIJILd5yJk#DwF2EIsxZ0Rf+di1p+F;Q1mx+%?hPcE`ps&+xkh zo_l5*g|a+>?yZ^+gvvK7V0fDl@a~BgSt4fAq}&@Et%e<#KQlwJ>YSqJBT*|M>lK-` zb&IAME}{RNmd%6uu4PHsd3{#`vI+U#0f{9-d2vJVhbH^jES6XS<;lx~ z%xf87?y-4B#{#vnB5YoU_ebV>pLm8f)^&uuT9O;~EW|aTZ}^k^EvZI>NTxVv3H4*{ zyeYDh4z*v;BOPo^t9Rb??P5AJ9K88Akb>dY5UD#N){Jb2I2W?wI@u9r#9VxxG9|QM zrJEJ?JaKD>_{S)vX?XAEu-U0)cPV+BM{!nGB0DJj=O5)L!5;b`dnHWEyGoGv zY}d8f9YVzFq#~bM5x79iWC+wfF1e4I+u#K}doE19=W6~PYzR_ChW{KMWo-a@Uq?bd z6p5;5Xi9?`b$;p${@@i}-nIQmyzFuCnLn@UcHB=B$_ES^;(X8bZ9?!&>MqT4(dDU0 zHW_-y!td6NTnD+a^!3&|<@EB>4Si3!4OExd#CXErm$|hg2fmt9Cc0bdZU3}^)~$P; zNI^`42Fa2{$yw`OF#gtR9v*C&SBvJiynQ(lIihcnmuPH|(|oI9*EjWD9s+|a71|Kx zV}4BY*h<_l!_GOG7S>|wN+ydv!0M)6vkKe|!+$t~FHm_%a{u;88Bx{E=Q>O3mU}@1 z(TA0TvwP_Q8ZJ!)v7J9t)fk*@13L}x==z-FX(_jMPNmP-daI0f=?^7g zrk40uD`O^iXAuk}kv?z!l3GwgT&>z0BE#E+yQ~Hil8|y)4&9+?E4Tz<)#YI3u2BjP zAjX8su>E4u^6A<}kWUNBFQk%_G6#Nbom!12-)l_XR0Qbhm1najZq&oVS`lvk&cZ7U z5#}ik2vH0mZN!ps)&Rl|nWu47id|lf)BWBWoR4DQ_Fuh?VWapEu}!I^dMiQGf$wX6 ztz=&t%FNypFAEL`pd^>tK)$(utwI;2cM`FlkfN-Hw*4l6(u4IZb#o9cHj$iOT~J~0 ztYY* zm6}Gl*;J%JY7^XmqQxknpQ6|sbBVnzhdI^^>n0CaZ+1WTx^m2I*XcXsXhjq*wo1>^ zr(lH_diC;xU zSCn`1tA)GnbJbi?TbHFiP9|ZJ>ZGX!M=JuVlzHS7AXomZru>ay4r; zI$J>c%Hz?Qf2M4cQVk_73S8s*uv`3aNU7>tXl>bHgNRai4!f&#=x_)-!ACpm0SOk% zyic#jjgRBAe{c6iU^QA#5hOnX{0a94gTJjAJ5i*388;}A1BNo0l;BO^p;iOvI$e*F zv^hcFUw9TTzaw#RGga*Q+$2Xh7nmDP69fjN^`Mk5f)R+i{O?Y1iKjAg>t|J1|n)?EhRw>N5ct;Tx@EC&z;HzarV|jf6~9eZz({n6=%0Q6akmwD_BHjYf9_fX+POc`fq^BQ z_!%&8pnBtJt!y#R0ftlkkCV4ob$;D9Wq39fK%dA*mHv11 zFclT~`mM9qPnGiO$~G(^#6EMHDx-PLFm+HMwHzu!K0A>qYn_-;@*6N`udeTH9(KxM zyS0;CgEWEHRzCMj6Bv40VCuL1<|eSbdoX)ZDow*P{Q=M_DIydMd*Gw36CiTKmeOYv znts=^PH=%@#y({b@Ut)#>-eW?LxL>E*KTiP;VIcTmFO(fzs^Uwo@ zd?mq}^o}&8FZDcYoLb34E&aXB@Jf7$aDf!KKg@x;O)@*@U*wg<@PfLw3$X%{pqJky z-MAg?eVG~6h0b~ZZu6%{gVrj|#WvKDEg~g?2Zn~r9hf&gfM{f(-A3HP1 z2FA-}$v5V73B4qN8MO5Xe}#4rqc$&Rjfv9aK)}@qSo?&9W+*wDFP5uubosBf!1BxxD?+FQw4q7_dn;-xFlMZ2N- zI4xo$PSaBd#jd+qfHBsj-V!(Ymryo)jnBMohJbSc@p^I{rB@wjPyiv)B?j<-WxC=* z;|pn(JBX{ZHL#1mg_<+5{wB&zTi5058Mj87{|XPl%(a*QUW`dmn2Xb7;s<#G&k)JX z7tQnUehSp5z`Twc3^qVxB%}EfjBJrn;)aHG^%@WY`lBlU#=Q7lQ?22Q5Vy>K(EVI> zLOE!PM5EB(s8*6NVDNZ7ZKUHB$w*- z51O*nVCX&c9f_;R3YJTSpy-uw9Dt>`ZqYA{F;g@33k1v3ixU04JFR0{$HZ)XJlZ!*6w+i5KnpIQV z4q>LQa{t{<P{1M+iYr^Xns$fy5q$pE$r9Ny7RSHt!P zC6Q${X(w7%mcL3Eq9lI>xyvIgswELs09gBUZkbu&41U|Cc`uMM143=dJ?Xc_!mHLK4g5ilop&8kW;+#G$FZE%>zPjUv1lI*>gLwqBu$k>def#FlY#@_&iH%g||kJYNJAyOO+lt(2e01(!-c+te?HQy+m2L_`7X$t3Z7C{0Kl7Js_;9t*Hkp@ljxV$ro zz0|n-!&e^B06>0N~nn?4$)L8l$E!d5$lzKJ~^J<=?1CfGa>y48%6f=ZTqC z863$Emyu%&*jnbxzm_7(?OO3F&rq)*=?93g@TN|o_g-BQH=nq z>RT%pP19ILjCK4uU0Ang)GuIxC9a6O4-IygE@c+ug3Tmvy1C6P0RnhXQDTztIn`i~Q6g2%v!Dw!)&;%spEg z2tbJNm$VQ*^5))LAbOd3FeoL@``!){OkXu~-p7zDc(K9C_Im~3`bP;aJb#%7Of3+g zPoYy;+k_WF2b3>Ncvivyv@jT&=%h!|jXr&;NHy1#RJ#}^4{*eRi?Kdv!7+9otofS} zU^GsUP!2ZtB2K#0Ol&o)7*FFSt-cf@Dx) zdKg!K6L)0;pt$ky>Kpi5E747@vT#(T2lF(0 zk)9K7{x#I?@S`$IRNpiawx) zeGvm~1S$iL5l?!i^sxeh68Oltgpm;7;%l?C!eL4dKT!}Yi{+y=WwErrp?epttV9-r z5+R1LK?FM3E`O@o{w(5f+V+o{3s4NvlQ{oFB5?CsP95zUlp#uiT>7Si%Oqu#iv&z+ z_zUAv5#irh--6La2$BKOMv4o`_tK(*y{G(#yLCk6mmfm?TGR#RZJu0@ithVWe1QFj zDZJmX1xTo7o;@cR*yyx59+zMfeM*0ejjh+du>>@&K-+q?p&;ke7hd545ulc-3pI1m zJ4tcwbIHR%`_NG7dtXhu^WA3_uijG1K>$+-Oxj&0H#JUuxy(0YfL`AE`~H9J!89y^ zC7)_$Cmr)rAMY2-2|4wFITLUcXBbI+@4M2(S!VE>3gm?uH(wjP9UpH|CKUb)dydS@ zg$jt+@745UO}0w|idy83&7Cp&;ya_wW*&2P?d!n@cAeW4L3e*I)@6MmAhNZy@jJJ8 zl4ro(2MDbEV{8eGFTZ!Defi-#cPrV&cuOT5q>|Xa{_p>KXFBg%E^q)o+)C@Mj2ERs zpT6LK3C?(2LUkYhDbcai_D0}{azu8cHX(~a!mt$g?e=4`88E+U19UX465aQJ%y7G! z9-fyaF`>@gInsi~!G;ShXsek0vdm;F)VqoN;}1N~Mm`&WkV~RMA8UOTls956UpgBF zil)5o=|Bn};_{ZVOjt?XsL`LKca9uS`=(qiSwh$rw@J+I~$e#GSQeOqNY&IW=~7|E!? zU)PE1dpuFwU^1*a5jq&k%sIV6&o%t|9{X|Lk65_rbneE_518rue{VOpm-s~MEZoCj9@Gkf?42RD|6T9Vlf^V}jwre>ssaxh)O%u7|d!YOP9iQTEP) zJMLcyjL%%B)&Z(8ukA9g&3h`(BZnhKpk!+3Qo6{$d_1ihMElA3BHbqso0u(LtYP|S z&PiZ3mA_h|pK$=u^I|aHUUzeuciA@!!r9c&V*%aMvw2TAN4JGsmiVe~`mag>?z#BC zPLS8-Kss&wxe-B`zmlQwDN+6ZR@x1C?N$STK&acRVhtKmlVGwUEvy5mEExrei~y&p zAD?4PG*RSsQabW}PpIk<4{Gss=>7EZseUsK0s*Ws&x=DFt?V_hwV|{`73gVlglh{0 zf)+v{9jFbM|IVjAqGnx_KB3do6IjlnZ)(_o*uRl%Flcx)l#2TXtA?n< zm_dDlisRWeBvOID)frGj?Fa6@5i=kx8@v=q0ilSqauEL29b1D=%>S|zZT2Z*&V9f% z`?4|`aX8)=S&89Qv3|kvsmJ|d*k6gKCwehKhQm;uCFKc0(343vGiUd%r*Z^ z&hh?zh;7~zGgA(*+SQv;*eO9cypS65d&@9Fb~(~z6?xFTqNr+74GwgR_8F+Pc!_)e zkwf=^Rty?SOV>*uu*ZC=*V9~9A`G;3-SO`T>bQ2v&|z1C-dMbLAVgW!XYOhc3)RR#a4ltGtIE`@4lngq(1Z%0Un6ptz zfeb7~*kR-KO7@VaDs#yMls z24C*BwjCOOq_pgRAKswTZn6&2ktBQ=D$S<;m+4#wD9%C8fsJGq9L0giTLGBH6cCk| z$gp;OQW0ZoYW5=lAoIB>r}Ix1&`u+J07x6}d=2c*2C_qUMiZnjz9MZDE(j3BUIUKa zbF4w1q)Y*?J7l>6t5kW^?wdqTkGOck%`e*cCgNs4i0I4qi(u+$zzgbAdW{2|z=zN% z;N?wdsoMRro~s;ydBbs+9O?Oy`Q4vwKBHBb|cpxXmlY$_I!$kMU526O7a$I&V+??$Qi)MCRy0Zh! zN90Gmmz!C;wpIhBD{VTqRo!$6#_XDHumgHFia+tx@hS1dWpX+ng>$8)ql^PStGYv# z`%xh$e_GbA?D^1{zWocpOT1ZSb379FAOosgjP#iEF3a2XEoKTT1HrT9`x;{U;E!@S zqQFGi_!b=6y~4weX;5((;;nz;Um;@x%-$l5ec=|khqmbFuk=xkVsW5H7IGhyRySl011_4zt$;?6QtPM6H#1#q8ZZ_K+ zssw8f)BtHWa5QcZ*$_vRAEa9+DqZT#>G$sAH!fN3P%!uO`b;n3#&dYaD(XAs87%)1 z242~udW%ufNRH8IX$CdC!5u%;Uo!vU5}J$k^pW0WQI+4NU|h+BX>P{6OER0!qqLj- zjriURFknhbcJI1Bn~~GIR&3BlSM8ufIZ=8&NAV3~h3b1EhpPFje1HDAn$IekAJP%{ z;xOn7?OTuc!?AdtBki$Ye+|qHF+kA)R#T6HI6bF4Yqd0%3SzMPG8ziD4~1(r8ANgf zH+Er4=q)v!tgtYUQ~VGu+s0SkMFj^z^bv9jdel&+gzF0zfNG0@AYjkC(ia5en10|_ zMaOWu^ia$(c1*`jJ{2{l!k^kgybUR0!yw*o++>^(Vyz2H$t{Tm5)ecNUVns8lb;;& z5m7L9s;kQd8R`C)l;A)n1w0soHU8PQws?sz>w31vIks{+75fOz4bl2v8m&^Ddi}}X z7gKkb$n;`C6VKVF3`Gc;O(^dkmh||e*E^WZFZO2xui>4x&~ki#nmhV!Lj9-Pw% zTVNQKVH%7<7NBrLcs+@Ls!h40wf$-Hsl|oRKVExf?myI%x;jMxM#o)ZvdC6E`_h0; z46lbTU>3ow?85)HMxs9p6pAkg$jMM{wH~I}9|{4d$wM*S3}s_#s|&7er=-6bHK1su zgZRyW7vJaWOc)-``a)^>@0dSKZ@Uyj7QF{_0`1;!bAtS|4e8f(L+o6VDeBif9&Ntf00THA!ZwqoxONOc#a zu(9Q|cXn+Hp9?JVkw^a~F33p-xofrR0V+a48M4kzf)CVUtpk%nXc_2F-Y{&Yb<2Fx zEM02UKzBPR%pcT=p*&Lr+2s1(fk)ri54x4Rmy1FJW7o@cW5%fjP7Z3%4XG%HvucN)E|Go1FE2Z{=Kju~6OKH;vxWRd0~{(L5<| zw#Ns&K|rQyj?Abz5|?Jl*59&vxb_^h$pQkDUp64W^7h|GUc+r{0>8UUvPKs`cHQ}L z3&89Qs;z&Kdt?_p^up^}XAPTj>F-Xo4E(DACm>G85$%Q3#*G_R}&K&*6kU7 zn}=ZG^I5<#4VI>{-K??ls%O9R-+{R1`!pTh$SI3l;G6txGG*~d$E`^SKygHBjA0Qg z3j%BU+M)4lwEKT+$}aW&>O(81hnLnN=Vvld(++n`;yaDO>nAyMyja_BgYutU2q^XX zdioc27+>?B*24BFIEWQz%}CH@=jZHd`F{9yY!^S?ZHAaKIx3`2>$;5)86v4WH1db4 zDYaZl^!cON+!F_#(fpafB!a7`I{i$O5g=Z#16Ij({S?;g&WjsG(2oI;9~1v5f5#3i zMbpY4DS#kl>$5vR^NkxL%v z&&!&`{~qRUxNCt^Q(#U%^iE<1WNR(Ei`0Cz{4s@iwq~E_??u=oA|+=j!Ov!9W~*F0JWla{{&Wp;e@y(dv3+!+AlzVrbfYr5C+r=u z%~8u<+mzb4I}=iAJ!(_fTzuN9QSw)@~^83Njj|;xQj% z@cv9darsEjFmresCV@ZdoObd@S9vZ|38c~I&=ZBGf<_{2h112XW{%t1{1cil--$`e zt1ac|*vJBcu;NN^rT{G~n?TKLdv&2*#``Yoke6o^>Ai`%K~>LH1A7Yf=glS;vPLPH z23ZZfn0#Uq3yuu<7-Ws^%%K_z`CnX&zw8cWvSWqUe?f;pG4!xAOJ%*V7V`FZb@HQy zTTS*=x=Et&$iLs}_C(EmjH6CpybW>p0FFY01ar<0B6j`Hb(nv>i`1A>D(6$ow7$f6 zt}?{+e0zse`e3_e*WKq1Xppdp#lz#}`^#@~Qa z*3axv;*>f{!K+V$+tjT-;pcvD5NOr*Ms1RbxlI0Ya_G0zY!%h7xr-VG3Tu+D8%m>) zGP%q6{ry&7B;qw%D-dF8-S)6EaP&@#$(ntfMm0TphF)BZ67L0X;!U3%rle`7mmxBo z9v%dyX^TtoWAL|_BXTD~fU}I8JPgjR2@8VpX_Oisqmgt|@-)MbF3YG=06SOWgeuSJ zgfun4DbC>>6IX7d2~eLwM$V=I?9fot2J>zudZdEdJ`zNuEd>ix_B6AuN-k=NWo)G#j_ ztU6_;ubSS20GCnE@oyW#DIL_M$(85*#Kw2Tj+a`UTYX7gM0K3 zk02WyD6wP7m)84WGCQibj%*GT_|U`)#jK5qbQR1uwvS0~_LuDZ7znN$9!|kD&(n;siF8T(ypO3;S-_uNioZqvO8Wo9PW7V>DR+A&X}jO?1fd@S zMdx+Sm1hLrHnd4G#Lw3j@!M_WtmVf!1l6`L_w%;y`s#zu8fIj`$m!owYV(?yMHqN9 z|Hp1mFlO>~{+C2Ne4YZ_M&Ft0^P3+9U@1Ik#ER#dx*lZ;l|)4*4b*LRVfP@p<#J*J zSA%S0GP`|&9@g+-Pr88X>rTo-H76EA{+$LM)KM3{cBF)c9o3!gsM5YGN$~HxL$+!J zOxPL@6_d-qr4v~^CpWWo&nY^XtP2z)IC&ox;=I9dK1605D2wF#a33j5-HG3inu*pQ zu|2s>sR(j1efr{HcMPc9s1YMdLTU2b9?4sNtBS4h$X&=^-y4At1AZAit@~)zutO8= z{8;qt{;EDKJ6&FxOQ)a|yB@5=`h7lpe#*{Aw**|A*HAi5pJELuSVePF7WUX3syeRO z`?KGZx?|LkU$3x!Mi_f$!fneX=aVP8aR^(KO|O~~Czqs46A77xDmUqR+#J@;-emqy z#dmv6r@T=NkRAj87-I422!U~|(IwCY{S&5~JAkWJbN+eZhj^(Y1v_)jtj&iDkwrf#r(fz0nuwcaP8zB27_Sl5vWf2wVByt)s!7he8H`t&IV&H4YTS ztDU-t7PPm}PXi(U;DLb?XF0_H+f!2|0K1+n_i}D^%jt6+<^sis9O78sP(iOdi#EGy z?9>BKu+XPsHZYVW3Jeh2`3KTnO>!|*C_p|*lorP1*nV@6K)shQy=0Z&#>rl4EpfXL zLRQQ7MBcj|O_jeIPU!t_kI+jk!p???ye#&^|2_tLJTI{Ph+|sIFwt~zvD5p$f*D1v z8CL*1AE^$bV1&7o1u4+sZC9Zn*l*6HKPfo(d=YLJr8n*Ke8PS~>Ek2>)N>Lda$(vn zJf$Z~V7n_gQL~xmY(7GJ*4UU`I?*7R#wOv8m84b#iUoXR0~w@1`HJbKO@t9nPoKIn zS;IO5L!`l7C3r9}x<;o$F!=ZF=E`kbk2mfvuY|h!0q;MA72givm`+?S{vs(%`*R#AGJ%U zzPAn*$xK3y#PLw^tiXjRdnHuUUo2|U*{8nX^oWNe40cwSpRQpuE%S@GP*ij*(Oqr= zPZhpoq7rrE^Z^!y@LuIAiVg~*^4Vghk0#>|Sd$iXHg$N$thfIXH~LN-QtdE}&Z=qawfz?%-RlM+ zTIpj5Sl@Gnz38+v8J+U(IkNo+cBYzu9F6GiChI5;bmYqyf`5S1?Nef9iQwk|WLkz&UeNf0Jrv9=r&jKka_DtqA zY`J|g7pnJfb)#;HM)w{BbvK08U}pLAeADGdxq@71rvO z&Z(EQWF57P$=2Ip*HAX_nVSe*PM=EJRLX<*Mpv(Sdg%=A<6g|EE|8SNAM_yf#@pj zC&0b>g&L?WPT36oxTYwuR!Aj8(6NT5k68MkHH!tIL)W*zDO3VQ>urV5R%rGkh_x(^ z;&eG93wfbV1#c*2oeqmb8$3n{z0w4}0UO;hLp06dRBgz?<*n#l!;gNp1lG%keh0Gh z{4qo=1MkuUY+?Je)|-zYhlicEG7Qc-d9<`sJ)=(9?%@B%S}<@vw=L@rdL@wP%atd^ zyQpN_CaGFA(bFgN2~zw*ZmI#U;CB#mm^-4|Uo`GdFIBN@5J_*qT$csf_?!a1NcsD2 zH?5qisfw7#)tL3G=sjb;#zKlBR5t#@)td)yC=5(9u#hsFDtb2&V^T2@Zx#X0msgB^fgk^IJGQ0GE1yZ>hHyp>mNmR8Nny|$| z$f;Lc&E|c-Eg)Glr&xld&Xe%7t{aP~HA>6LUruR)bhX2a`kyv`%|k)B@5n zl@hFgdbKjaeD)OP`SX)BNvWeh_@Z0SS_F&AhiG|RrZ|vB+2jsqUc30q{(#eJ{Tg)( zNE*PD`!GV#^pp6f=B3+kUl433s z>l;9h0|%%5X$ zKRkkeKmTyqM&cOWryoH6pwDc@^Ou>08(zGnF-ybfZf4(?s4xx;^=o-0{MmbNX+g8< zk=pDma{$L@Ij{Oy{JySqgQMTB{kal2-1PLICP>UsDk{#Wa(=GE@>ZMQ*<7+1++N_4 zK%Z}njOTY#xft39Lk&lpY?@%oDhscjGHb?5ikr$Vd-8puMEbKr5Dd`B7Bf$@ZC4tu z37mMK5=A>=Fy?$|5+iH}MF^(A*(}5yato1=zN?u~j>Y=xExXLH4pRNy)ysxhI^(yC z4ylm^MK3d4kN7h%77+PRgm7AP^hreUNnKli?ZKvep(Y1UK}$F*gKPBNJ|*(({sv}J z0WSnflc#Nuom+!yftOXd8FZbd&`|m*+oGRtf;w8{;lrp1GI$DgKFc_h*_;8?FLmT5 z$xK7Dye9V1O7N8|o|1``$w79qy$8F4`8!%QeB|$KRnK?WEL4_izi~of8gNUS2UdGz zNmIaJ==l4x0e|Zt>c)8%3hJXC<@ zVGos1fug3{MP@z~wIP^~wvjK2PMhog!Zo-Uj77}^uIAdycQ4lj{HQxAU(a);4C53q z)cYJ`LS^c7rTKfh<+NFceU{TM2R#x#z0{8KPsb#%hdCQ}%$>;KPLR;+PgbhWx^GH~HY+H!Dmg?ECa`)x6vIu<5>Qpgn07PMBS# z(B(8f%1RHT0G7R$p0~u`IF{@1LR{!o$NJg(WrRUg$nVMMrC3A>tuq>s5yu=*9U5z< zYCq5OVFJ-ma?lZ)bAciC<5tcQ1gTK~`ERrG6MxuuJG5co{+RcSyFv;EHjyx3mcJ%s zlnVaBIVTA}k;P}=#eb-gMj#2_so1LyThx6{0tZhcy?uDiuSMEyD54Qa!l-|#wu2JC z{>b6>HZdS>aI1fMX3#3v|33C^HyBZYrQ7>f)Z=JQt>t(8uuZ-k$e*+Ap*O)`juB?~ zxY62tfb}l~Yg{$QT_U~hI1HS%%SAElGL0}w!O77^CzlmejV+<_aF9&Pq+GrkAN5YR z&Z`y3BEZ1f^+qT-iIa$JM#HlS-P2mJhrbBVI|L*=5_AxQqDP}chDhBa&>yvkoKKgP za(HVIZJ?&>wK(iEK^tH1kwegycoDLBG)u!o&VB1W=Jv2 z<@rm~&*!`+`^-nys|UPAsB3V}{B8Z4Ei--qf;h(Q4TXIrL)ubfgms*>+7bHta^zFP zYRax_^+FUvO#?D7TR_nH_SX(zOCr*nai6bHd8mY*l6YZFO^zd~QtrW#@rzJt9>KXe zn9;3&w_}ozQYgJLi*g9UXMt%$PEC@)o2lMFsU{2~WbKaWX<#2=#k)X+eOO2kGBX~Y z@rWO$=K=$dYb#THr9diAnn_U)|Lu+RXSoAwqvu)VVM$0oH6Rk z?<56lI1()kaJ7`^wNqTnCc!G&#P{Ex9XTloxtvHF_e#i^)ysN*pYYUyaWQ=8&O~l9 zav}XwL2>1|0ZhxY5snpp#b4`5dWkWdE1kDVY#~okWaOP~b-bcB`g*++y6Pyqx3OM2 zPikbcS-ns_U47UjWt^vMevVc0<*-`m_zZb-V38MNYq^ zgzXKD6q9oV<(fG{Du^jFWTZCyF1D~*+2LU9r4Q%5oX16 zq6r47WkAoukh+=q?QG^CaMwWP|I8dc%1DAC0L%REIE2oN>b{z|b zE~qzVoopT}&$2P?LhN!@d_t6h`^OB8Gi~FC!bT=>6x<_q0aD9AbC6>)^}CR_fYR4|+DPRtHOI1Ww~8cQ{kzzCEi+Amdf?C!ivZ1W3If1yKkHuV z{nH*kTzw+Ogvd6EwNdp=3^1yDi-pFxq&ymnd*8<)+>PC%YZ}&vluH?i?Bzz(b7p4n zveg=l+Jm5J=Zv0Y(M`7icOvYqeG{=spm1UoVU;2A5< zNZ@Mxo2(F?KJ9ydJ&uAsd%S$Vd9htg9Uknv*5uNk_Te#-^0~BDZY$OaVPzm;CCcK@ ziYmk8UO6OmHni=w7FJxh-pc?>acNKj9UuPMCQ~Iakm6~5l)=#!XRno$Y{zX`9`J@T ziQSY~$0`qKO%{SVAeMcuE`~?$MRM~EvnhLzxfvzMKHD!|1K}tQ7JpicRGza~{5xK3 zHPd-!QZ8YBs?U2c`(XLcU!riFqQJ8P(#c{ujf4SG@2T*TlMLBaNa2JZH$))#!q+2R zRVp6qos63@WHeFqjhdDWohUtz!}2$%VTP(?;{9{@EZfHEeyJR?-5NF$%4=XnVyi`W zXofwhiEWt$f#r*D(8jM7Ji+DGN1&Zp-rcn8%idjAU_2@?aIZc1Czl!f52kzuoIEwm z)~LKMQuBId_TJ(R`3(M@Tb?Nk7+l+iODl*<_TSA_vFeOG<1!K&kGc1+^&U6br*o#9 z60lf_RyFiJJgmj!kUt@V7MA>4!I$qW#yl?zm59w-n-;FMB8@d7Rnq~Rw>iiK|1VD{R{GawhTkX-cSpgVtpn_t*<{#D}3VPy1()K zcFd#!rbun_jLx==n6xt#z=`#0@zAz$cU6YECbWfW#vvqfn$Z{&qM0hXg!tt)9zC1-Qb_{Yv~THP73)&@N2=4`91OtA z(Nj)byG2rNAErJYB17;y;5o$kLEmN8PBZl&i+Mmx!BGj@pt&(RW%7xxTDv`uOn4tz zYHhauP!WuAg|apT5Ha|=+w1w?9%CEii0m(S-?Ps z58@Wu1>iUC`HBizDqSZ(+ndG&z%LqM*SIb4v!9_%e&V8wNX2G>JZAbACyxel#103Y zk)MG22-6LD44I@$*S5T$e-6o3^p(9Dxi?_&y8@#AnxSG*=e%hECLqJ8aMEl7`;$m+ zVt-Uc+cgOwURW`iP6CGz$ISI@Ev#kxf5#N>T_?Bv^_s6?^CKu!-mICdKDF6=X1LzB zL9qOH$7h|R0)mON>*@-gWQ^EK~GxqmY3!HHndyO$k{dzbzhFFUb;4E@A({ z;gsdMaeD&?e~F*6z+UGDyawN{yzb>D=zXwxNC5!DKu`moSrXKjv3nNro~lE1TR-Tv zf0cma-A^95_SfV9v93Oro||;M<3|s3a}QbT40S7WN&TKxf$Ak*znqex5#uE^N?Kz6 zY?Vi{-)5hu)hE30r$2=E`KP=)Cgl+K%O?HAL>G!q`MRk1uqp8kX8+7#+T^zWDKPIm zNppPY%4mW0`amuLcGlWK9>CgdCSRW0s+826NYQKeRSO2c)yBHCsq9vT(|JR!K!DhR zB;X~C3L&;ixOE9D!+kDYYIO=r)+fvCW ztf6KFacKzYn{^(!1zHc^&wWDQ*q<$~cYkanCqPFo;M4aM8?hB6s~Wl{>KX-~Za&A? zD)*SZXPhZ-#QRv>MWvz$Q0VyW?w7O9I&NqJLVk$`TUE+cT8o_u@ignTyBWbB=YiX}T|S=R;YmfH z7eFyetB0AB-Zly>|4vK0VN3%?y?rXv`4#yg>Ow^rKJ!Hb+4}hYovV)u?Ue}gs}Q2m zD?(#9M)JF(jO@={b}8zU`DhYF97L54cc3z#9vVT#W;x9vKYw=uuqZTO{#h|f^q!A+14_OR-V;t@|f|pAZ*J9 zj<=#d%!o>5=|v}OE7Fg8gipG4A+P7U9GZ zrScx21*N4tMA`oP*^p$!qjc(>q~Rr+!;_o%u@V{eW4ty;WyN>#(cBT-rLwl5FD#6* ztxAp)9D$K}%d_51t1m0FoI1a}(5grtFCLyCsZA=|Ycoe_(NuUc^>{sGzvGptd|&#o zkyq57Ss*PD)m3_HUDapT`P$7`*xxGSljRduJjz!?)T5`HQ@C4No?r<4{6$j1hqvd# z302JF;jAQ<)f8yn>f*PVY$QH0;7ZW)@Z~?7 zBvOY~VHt_$EP-6nF@i_6G2;f6W(6T5IUs!_7fjbD#kjpCFsJrRPD=^tQpZPM@%aZ? z=Aq6$GpcwS?`Fi?s#Q}>Vk44Vv|gUN_cxGKS3D86-Fyv}Ne0j&eESo^km3BtVnNp| z>_M+t`np0bDW5ynb3R z=8trS`9FvRXDlM(c@PY^>w|6oscPIWk0ma_SiUWxX0npVhL^Vy(pI(P0Ie3jb#(uR z3`lD^5LMcRa2`>v#Dm5kY_leQ!T?k-Zb*(f6^j7@{d{^qxKhxCL2&6~LZm+vJydR}juhbTHFHx(b-bW3JAegE{inulHc747octqm3*@G`nZ6{%VbtBJ3|pBH@B2%+_%R-vGbRf-7wl#p#Ae&Cwh3#`P>;M_&4Osv^%v z&f$6#&kp2pD>qQU*C1!=--U}u5?0H3liJW@rudMIwP&|LA#mXXgxO;2Vrlq>T4l(A zF+J1U{?iAnr)tHri}YCwieJN3)z4T*R#Dtsa%|wPJc5svMHk<8+N)cObzaE&6cxI$ zgQx{HWsxqFVOaY?VnKc0+4Z|L|0KE&+c#Tk`=0y1v#>lzd75}eF=cC6FP{#p&nda( zR?SuxSY-%+!;JYsvqE`#cjlnXr@1|qG_aZEibD+=(wyg0+vu^#w|gC4;Vcf1z6Xw< zQm9$vNv~9_ykP}>K3LdPuQ<>vrkic;;NR@JqN)E7P{_QgeuLHvgizsC#SWzHbCH_f zpQV!Wf`d&;KX_ifA$I=OwZyboXMug{@cGzRAml5wKvl0HTu>`ddjDP`Jj&p?C9=;# zi}h~*Ey1u^wqeuE|-L*z`2r6{XW_xJ87$}QX)434C%6zD%26gQ(!Hd?O zh~(5w^Ncw}4=Oy%^-fgKeu0Z1Rh|At;4Orx6Lg2Ju}hYbZ~XdxXwC`w-#{eXtH7F7 z-_Bf}2wh9$JOox&q)YMyU5YG&D!SIKph6AA_7oQ2ALSa8`cge*q9`LSz>;iLLk{#k>&no>8fc?QD&+qFH!#nxTrFzM z#Uu{C(?Os6tcCNiO~u90+_lX$hSL^t38AIhcHs}*f4CXW){ZR@Ek-!Rz5X1(jpL>A z>FG>Qv~U1J4iuvPl*%!c*;VKEj!i1hfv|s0^4)W6A5%4zSIE1AA#BuLeu|$4{b+>< zbB}_I2jdAQo|9*G-wUxV!>0Es6PBsH`R4=du^7T|Y*8{F=!1RsTE1 z?xBtNi@Ez$M%pU@-`MoHdZMR)rFWr&%Y4biOVD?Hf;AFUBUwUTsj}pQ z#W6_lD4ESaHu*;5<#PvI+4-nHH`p5W(}Z`CMeO!$7U;{Abb+A=J)-5`i>u?Io=gl2&Zv9~uhm7dBTlT4kqkNVtRjQ%ZMcd}^ ze@+`moyp&+K}No=xup2UCi>TP;0Dr6XhYzT2j@jCSVrnbmnNDXYc68~dLmrjWO0Pf z%ddxJWtUdlIqUAGES(^r8d2e%Y!!v>QO6Z^;qFL~icHgTU(`K-Z`_2BiqFJN-dO|# zheowfF1iiXYqj-+{K5}RSwiLeZst)V4)xzqHaFp(4)=za1p6CWzScXqk3PMm@$94s zw#QOqjAQZjbQbM3?G7soF3Bvgr_w_(Jkr#kF=*fwR=T3T_^{+>E`SUCoTyP1h;6H< zGC-nyE@dpN5jg9gb{lvI_zV2}f|ch)d6F_Znz#NmI^2YSH^Z(V%y(n5AP9%fkX!h4 z!l?Z&^+CT`GZsZM{@n+fJllU$S(YnGgcF-FXlkqn=7EA*QFyjLgd8Z+&jcJmnKD6{ zvzAwo%<+H*Yn7r{s<3{2G!^r7M5@zymO?c+uM&1Hj6oN*I48a?H77m`;_mvZ0*kCC zT~e(Ea!va#c7vP>#LraeZ^RpH10Jww`4U9v{@rK2^(lCwUaq6(m=!L>A$9$%#c+h6 z<8PXY<}f4(^}<2c;;qt;e84WMX&KR8!P?dV=HALQb>MZ{UI%)jTx$SPPENc9U&fh}cT-&Cm+bK() z#fM7?pkF^)3HL*kS&K3)YizA#xecFSMR;am`Ye<5lZQq}hg#wI{xH9gGB- z=DTvgNrH{sIsQEx2qTkji*heH`N)P{rs=ax`m5Q)oNUqWlP}&IJk>0_=3&Czan!Q= zOQgkh4GWjB2Mvojc~GqbXW`*8=i1Fo@@@rm48t+nKYOI%RUnCAb1cG;^5mPD`_YLY zUq$F}yO=xzaHyszIV5y1E<1d%W4`Gc>hc-+hIH)vO4fR0a_SfsOcCxyR3kwLqGj*` zs5@XfEJgUU;^}4tP4Ml0o7Vg%P!3k0|34sd0b!<0aePLNFxY z%X9T5a9;&CjT@^D>oFg3528Vr#wupMctYjI4P*14bAld!EF2^slRFCGj{WYW z;7Vb=w1sgwaVh#tx^_)%{eV?m#yr5y(qa&mOS$l5XJCaRH!xJ|!J8~m$y z6Cn5mE2Yxw1B%%FJge>GLFbbN*m5!HG2jz=SShP0K6<*N;B7op2v!Zs_|F4+3v{n} zH{K=h$VO7Kf0&+V0wAaX4}CvXEz%^V84CVjT;n2E++cfKUK&4!WxISBY~o5-?RAAm zzx`-~|1nBPw01>RSH=MUgN$ORHhi?J2ipj@CJTOD163? zEc612>)-h|Y7OBJLMj*E$D%|BFNOQaxp%q&Io>M?W6u5gZnKHm0GFZ~F%#7w4=wP! z5TV~g6k6IFWI**&4@uc=-7jJGpo4`MmqRtp7%;?d4WIc!`zx+n&P9i5=DCC;LcT4* zf7RX64`a7~yy8I~1jCxN@wJTPQ`%%fmyTM>!lJs0c+k%)oUv4hyq!1+OU zM6b@-KiEurpJZB46`mm41aYQJtk?SyiLqegu-mw)Mn$9w)qarOvCl^n2XBWg z8(Y$Na%xw*T2b=3N!V5|(0ZK43}M5ok-Xughm;gdtu>eyHpyhiFeawGc1`k&Do0RO z{h3vmzL5{_NT@(WS@Y50PNXmcPk9GnLX- zfNEPB#vT$`YPQ`mt(7F-Ysb9KOsSc}5uMT21`8xI2|YUBr|1_+cV>jz&t`xO(XZ6b zk5g=n0+^Wmri6iw9Co)8yFiFUkvpQg{ZZ4Uh=3J43)_<2I|Md?y>FiKchT07BCT91 zcKs8v@im@JD!wSqA*)n2n-Xl4hK)>QoG=tciYdp9HH9A(P!VUma*ukekM$s4e=eGL z$b{}xQF0h4usgHWLVO&bf2pR{Q1_QxAQ90ua&6oe0x|ItR?*L}@a>>rl38dn0}o+r zg{G$#lp|%nK@z2g&m?~!&{>bV(yIk-5=+rjlg|YNGu>epn_2nATr_7j&@TT3|M1XS zzCG!+>&4)nQv7~!C*a>thUQ=2!IoYMtA%Jg?YpI7o?W1qWdm>o7Xo9Lq5L(%DC7(9isJU{%n6ym(nl zx$Y3@u4tftGS0RIOSk`?a!y{B4rYyw8|0~0z@Z%?*b`!+Rf~@7BV6z6^mgSNI=NB} z61QxyVPgM{Rs!>E;$_M@<*6`-X8d;dO}0q4;X-!+(5S|_C!@YDO@j(Cm%}l)rVGoa z%_&P?w1ud9%Noij8|C5H^VwD%NiF!=y~noM{OGOiU~=2r()Bcd7hH4Ar;}dK8vUM3xa^*zp4$lnFg)d z?-4Zk?#9ZnR34^46VQX(C8OmHPt7|kUDu;AYRc*t2BXdhyqfR&3TwqocL0Hz#;E4x zm_9p~g#*#jDAsBOrh<>=@8Rm?{^Er_N=IIJahd@#n4V82W=-ai17G}mfLkqsSKbZKy!^(DC>BinUikDaaaEYQ7zZKVY zbrqj{I?xE~*i-~}?*nBdxgg!VLLK`FM3e@RZWxe~1_|lzR2rnDq`RfNyT9Y_dEWPX zFE0L>>&)!ESKRB~Ypt{Q=~%*GTmK^BW`jeJGZA(sq;yT7Bskdr$+1Lay7w#Tr2tX- z)I*B@3R{3#@C};KS5orh2AjMW{EPT(WG_|tHTpdC9a|+>-$sTvRDHOqLRR4Su24R0 z-}l{ZxnyySy_3F*I(ckN)o6(lc&>ALM^ZOkcnd|>42dhws? zx!$KFs+>D#5OhN%5Uy>yR?dB&YG$V8B*VRpD*9Xdm2D|}p*+-D1P&IsXz{kvrC>zT z+Hu!GX(*PRAUlfiCZ>y2AZn3Cx2G{DS(}XSw?yGWQLI#OJZnDZvl-VcrkzC zJx-_9Ox*i~1yi0v!FWih=iU~35+m~XPKR{H8)cnZ;MT8y{%Z&E-QDPeF7`8yNseGx zdz5vk=ie2LuyRbw7e_v{A;~*f60cBbDI|3wD+Y;*pJ7Fl9h~Z`S07w25n1{CtOno4 zj8r9O~j9=W1$ND`=G6?+K zEp9OO|Fs)GV@g8wa7~vKUv0Y>-A2;NXXDwYB%Y0rEzw8;HhIVm6{n7J{UAZ&`sir4 zz*7+&DhEYm_4OT)xcSmGwvxZDqJ4V#Eugvk!5-Bg_VML+5DrsW$4AJN^3OOCU&zYi z>@wLQz??kN_wu(*U1-N7<-ypfA|yvoHC<~5ecHS+RPrLLRWTFE2+<|uGV~x*4*V(1 z@9M{|_6A35p4q{{6J&~WAxWpu1LV^4&7N2YwDak`(#%~97yWHa_)o$>o=kk~N3cH( ztO)jXAg1}wyC|6z?jUo|gW`>b5VZQT=tnx|-9`Hx2W@B(ID??`=g5w8IJ3=%mCo#_ z!PzgJq12L)_#12+^Rux1;i^T|ZfN^tFC_#KC`JIWu3n+0jp^y<8A%HIb@>d5E}JD5 z8`(~Wgl4y!W2c3^MaV(WE4$jq1szR{6Y~EpaQ$h5_F62kw&VBq z3{qnVEQNcBp0wmvJjS;Yqf0_`4*Vw0owe*}V=MxM!IBtee}AmWS8}fxoN8?ZnyKX4 z8)`7y__RGt!~o|rs5Y(d7B8J^SPisAxBcGdzLsGTCAvjM!N9g`ZejxO>)JEld-JrA zHhRy>7oYI6s{Rh0hKNzPIoE};b*mIG$${&?t;GuHK(H}N^A2ok)4iy&M~V4Mw%uA07cS`e&qIv}5pBgn z+D~i_BRz%owQaEdVMqS;@ylE_N+w|_X#^=hp`)J^z(LL{{o*^-No*2>B4i7sOm04L3A^Q|WNNQHe@20QB^9gtPldRP0hE7l@ zJ#wCZQo{Aen?|R@oy)p`_clnI52=t1+~L;~{_a5Qyd;E}a{RoTB9jjJI9+Eji&NNC zK9lZdWu_%w@OiJ*2_2hmCPS3a-&4k}2!ES@Fe&c$3CWJBdrwv6U|C8yXZht-WFEPB z)08S0+yAf5b2MC!)gv><=d*I_VNDT5frGkXU4P}{BOB;|Bfb7UPB(_Jvt+@-+i~Ba zS^Ina4UfVeME`)d;5fgqu%N&@=Y@O~hn}z4;__gEZzpwD`p47ZR`UHo0^2=w#_`Iq zk22*I2wUzm6h&SE9#b(1rWfv=>XULUW|9l1M96{1vdR)L9e5iI|KABSv4*Upm>Wp-q5BL>hY?Grt?*AEyA+wBUX&ftL0~Z(toxbf7+-Bea8<974 zP4428gCoG$nP!u3uFid`&l#fr&unsj91@88q=G_Jpm%!El9eqKIl$f9y<`tL1)Cif zy~uX!%6?~`m%~s(RH~Y==tZ6`c#M6IHS9Uhmu8F7%<_;-cz}_{G-KHgc;3L8qqHv# zF`}e!EBymie}8p&1&kT1t9@)q4Xpdge{(R=D_-02(Y2BSW1BRSFEYQIClf$M0k<+Z zO$>WVX2l93k2dEYxGHZu`@cSq6zRzuVZs_}@zP2qSD>@@Dg`#u^vKo^*x_W9tG@x^ z)T?Xn6pH}R$;s>Y|9#=%>uYT>`z~HN zKBFk$S!lbxnAhs2$9pgx9n~Wfm$Z=0zoj4fNCWdINy38;kkZ56njNxdWY@Jwc0H1-m4~V5`$2}>&CI=)9&MI*=&R}M z3mNZfac*d)o^>ScC^D%_y1+ad;u z{4aWYCY0D7axgaD$_O@L#C&4A2gB9hn5W9^j4z6<>KL(L*0$U3>3Sf9mz&$lX$Q`? zM^@l7O`KRx9N^bc;Bxg)P0MCoD>aKVg&!^I*l^~pinnUp>O`XB1d;EUGWOOB#>dJO zm$I&UBc=i{v$MQlmAu#mH8cCr1k2uJ#O6;QRn9xx_y3bc3Lo+`SG^ z`tdRb3la2kY&Q%Qf(lU}28WCkn(BCPss!Tr9+7-e5965<=4nK|&0dRC?-kBJ`qN98 z`{$J(8g*=aO}t!rT(8rFl+XVwg&Z!rOvyVNEI3*95^*e7FPmlj*BErfkD%F2tx0&| z{NsI}&8>(bjeaA+7%ciiKeWa#YKKr%5d{|42ZH60{>{RDM+eF*UR8kMG(QxG+dgBx zN|G`S#qp6meob|VLmt$pN@o^-=M?BA?G?->@qfji!sKH zE`WhRxtZ@H26G?2aX(E`Gg6PfYUg?iF210OXNHVkmO@OPqd*isf*_+|Zo?COiSemJ zgC-RDY|We$D! z=lky>eHN5Vwttpf$y!VMu~xLsme4J=!2a428;#D%4Wb&)Kx%6Y40LHb(zUopgEJ-= zMzd}!g>wHmut(vmv5^H;rE+MbSB(><#h7{RzE@~E;{$sg>*=Rf`mO%|D*2NVGYoQ~ zWP0jTyuNby(z5gxEwlLFs3B!G5?f88a&i2&5k!7bz#%DM!snpO#-|{JiN?8YAu6ZR zYPc|w$iBPz6uo9eU%Z^s(5*sU+9feR#hV}$NZ%N}F|-a4CkQOW*qM~&k4m>hpAeiv8-A`ryesD&c`p^(U*GRNii=Hay5Ks!*FD9p+2pLlfLJ=UbK?Iq zr3P9^(T^YwG`dF>oUyu^bn5-I(H7Y88?JTFfM+ryjE)~jv+{82Q8E?&-_`vrWMKtE zG?Yw(jns^^HxA%E6>-}w=zbNMWw>y;&)0|49}KAmz4YqMm3f3c6NY|4ugCvw( zJ%87J7nAPY9W@!3wv7Y%EwO#&KX$Eso1_{k=T-eUu+ztd5$FuouVQukD|KM-!H{Mq zE@7F3C3{?#XIk`t_Ma8t%)0rf`Ew3gQ0YaMp=Tr(MhNMTvP0E86arhbI(O^MqF2@T z$w7#u#Q%e)bg}^mG`cSOjibvrVr*L+=;G{((;d!3c3A|vEY|Z-r z3hcQ+-W~DVpu$7*JVC8-2U>1fC`gWSZ<(uCUTQa(xy%B`22f1}I+oHfc1RsJeUE{x19Rcs0*{_T5GTQA)O=c9vynD+`kAJT@Cp46fzzc z6=^~R!LfllUNyc%UG*WYd-3qMmM_rnawk2h#Abl{I(F_6RdrDoCj zXxi_Yn)m#V-jCw4KD6;A#QjQT_VMpNy`{$U0_U1Qxk9WD0mK2dd-cBb2bmb|{7mBw zDPo8E4%^&7_{Z0M>a$)Dk_=FEE~hW|*ss&l{1M06NP>PNA1bf9`f556zY#ohMLgji znULC1w;E#ULxm7$eK+d)TKUJ7pW5oIWjI&3VZV#W^ zDf#p{BW?59NPUO=>0SH8wI#bdOEps5819+2KdoS-OA~^yYrObHXsrJ28vjIGp6?3JeFBw-Z~KC8wEbRR6I{~2V~U6 z*W zgsF{MpI8T%hfnlmV8Y@EAS;DJY@WC{E)8X84~L%!l7knnE6&HQrcPTHrQIaXt<6bW zc+jw>)5mWvxc3ehE(ExZX4fO8-Vm0?ya4q4tXKp)5#2XR&f|u9Bw5PM0c(%$vk0t2 zf_iOUpN5x)gUT}E?w9?`GI}jg@xmW_REz)MQ=YKy7Dyr$1$vk zol0+|EMppWObd8+WZ(s%VzCbg-J(QF?v+LpQ?LGrU)*F}By-adR)#0(&5mXWnbWyZ zPo-SfzF0o;FAS(t{e|};e2R5}0xX|b0Fb2D!BFv)Y=gg`+l~zAkP0nX>8oDaSmmz$ zxFhaS5=B}tK#>aYc8^hFn#*Foy}Ulh7n{_s{z?l=+P_SWY~HG)N7yS2ee>@!pKlO8 za33Aqo;q)&UB3Uw?zreJ&|F6L(~)xl72+>H{W>7@Qb}P(^!exW@t*W<#&T+%yG=z~ z8|cj9f9zpzCU=D|+Ccn1&cIx8C(s>`Is}x?T#8H0tc^N*qb(t zp?S04AIO%9KRW3Xj|k>&cH4GstW0d($*z$<;n1)Xz4CDtkT_(Te7ycklRn}k9~M2Z z0$AClUZ=l2yF9JzUGvr)XS1v_9;G;gf4+RRO6mPwcdN6{-#o_X<^TAwPO-)^4#x^# zZ+vIhgfe3^Fd;fU4UMyb(AXX;mi`BWp(%pPu+ zP@GxjI~z@628Vx<$HM!Jx?z+JV?@ISm#l*0Gi$`Kl!vEGRU_>uh3)!&*DaPmb_S~3 zEV^GuNi&fw%=Q`Cywf4y0R5kOtDQ=?#4Fvm8b|tF31H(>gb|V3x){7OE3XL!)omaPj zKUgY{ymUaNbHkhw}i&D{O!<#3=*VX_64?C||MkFfpc&mK;BOSQq z3-PUJ`Dr;clJofWIr>&n+SXi?7ugKMv(kP=J~LLQaQYxi3kd$*!BMgE`e z%*&{yEoTB@N7RHDZsE&EvD7(ddmi%}r@znR(rQ^)#K?^@L9))w2j`s!p5Q5b`v;}3 zo6SNU>D|n7HQuM_cUIPTX&(otx16WqleMzt9Ai;Ye<$6pPG>mF`@U8f61$Qt|2k*o;Y`A6 zIM&7x*BV0~yi&zYFEal2MatuA?)=LcrpNA)zip~AF-Gsw59M5}nUwX%1G{mIV_FmL zdN39&(i!iL^n?%3+;mSIcc$NtMA(b-vbO4=IeLvG|6{B=MoCQGvEgY1Nm02_USO}B zAdd#7+$p-G>A&5RC5`8{@NQghqrQ6)C~9+M;^m?g6RYdp?F;!?Qhm;R-uP5&Ut=Rv zV~EB|xB6-BA8ARI;%L$qS!*;CRRr~-{1Z2SVg`nuQw2} z7)4g#8U(b_qe!SOx1Y)?4#u43;z$g89d?kNl=YsjIt?%a8XE^RrbAc4;fNcnlt`(q z`2q3*QgxQ~egzA$9GDb^);@okntUvh2jQP?uC$PcL$v?+D-n>m zH2Q=adsknqh7M>@)27$L=Pd$&#znM_mpz_fGo{Zh$V7}g7}tiP&a*W??AcT zruSfx^rH2b^!pD<&lgR9E_FwaEnfaTAka#GbRfla)36f15%n&ayO29?xMd|3PZPPR z=WSkuQMvxSOu-n#vbu=upfw~C{QC_ei_$>IgtfX_`f_vOpusdz&-NoW7Su}UEZ-+%-?oPS>)jD50$Gyj@z}i=GwLfRgRQfa*8i5MQ3LP{1a)gJ0CslY_ zD3m3ZBqvbQfcXvGuVp3WqaQy15@e9sCVR?~G9u zq)|hGGb8>ZQ6ZLAeNNtlU3M|lO#M<|q$OVS$E11R3L)Oc{S)KZS}(U@dso-RPQNv2 zmEOnwsVb|hl1LTo_c709KY_p_He@dysMmr??%hAAMQI1{wXp>7eI{yvg5g_>z?OZ= ze#_%m&h%iH21(C>&teP5w;N|B0C|$P+73L>Y4<{PoyD_7c*?pislBcm6C77X?%;YG z=;o2DXh}Ag$uT|*d|O&@IiHM-3G!d`qU(TC~n4pmsH@t9Kj3`Ip2bgjSY zanI+&D4o|nVfkF#yPeP(J;b5HnRWkXi4>0adKcnM=CSNo;%|{~X5$f_UXaNHsl>4} zK7R>K@)=Z8s>Sm`L=qm$esl2zWHKa6L?Yd^U`|{nq3{@Ul&BMTk2k2l{?24YKZgwi z_Sp)Svt&P^8(?!3gg%{6E3aM9upJ!v()uV;a!)+aJv(DL zdZSnPCt4Qun&h%Q(w9H-*~eEf)+hTA`&Q%! zP5APN&CyNP3!(p#V%6W~Gr{pGDQZS;A5IKZ_2(bkTgIMi=}QSGW)mwAeR8LL45Hd_C9`Zchu`tS(9)tigHkqzDJ=057#kJE)(3DIf zO2|*1nn9gUs0drPsQmHF*ApS~O#$V1)r5~z+8vX)Rxy9pctGtm=mPSdN6kM_X>8RtzOnN3VYg+qEZ1sUM*- z%AKUdBDAD_@>00SGe%?;YWp3h_K`(}_Ty;!BhMRcCs)sbHbNu3C72<=mTQutg-MBN z;gw_8aN?IwiAzZYa87vSNRN2s0x&bP7J4kvVV{{`AWGGL8dcilytO4a@7sE<^`eoOh8jrbuHnt!6ojC8AdMc8Y-|8h%M+n<7G`iay`=o>o6eIGx(ZBv!3A@;1kNfdt-7{=deASX8 zDY9jl4v*rQ_|G4cbUZmg%J`F1Xaqm7*SqsJLOn+#uh3osqz_xfFisCH;6xH-U#Omrm=C&F7zC;q`{%Tx`htPVKb<7~jyAC><3|oG2bY;ntrlV#DlI+guRi3n=Nme; zB-*%+!3K%WEn8XZ4#{7gA*^1JJnIcy;ac%OG-iSRDjxN}@?1(1}Td zG0edhG)4l4IqW|kseU%0Qz5r;$!nu2*b}UJ3j%lHBBj_B%h{gS0(P5FJhGQL^YnBwFc787ZFE3R>H z$S0phnf}f$SwFz@K6^51(bHjw+7Zq z?}5zErK-iAIc(%Q z*_R>h#g|CctVX*S376>B$Y9?JbxBo3G&Y2U<34vSf9dNKYopHBydteAk&tgLGNh^~ zzQgUaEWyvS_R6u@d*w*QrP~7LOqK&_Ayp`lPy%ovuDIn_$&E2V9(INnSG~W=7Q?sR ziXr$y8Vvw}d}+@m@2XE6Ql&%tLTJ|%`QU9Z>p?4wxLvzGZZMBcR7M4O=drj>!2~%7 z+?eziWfAMh<+pmrZyG;u^$FCjCFAR<&J{9aecQ&HiaYu)Pj*>L{VKD> z(b}+q)oHdJ{h()LEZa2JQrZ?sDsW+AA@w6@K_)Ie5JKaHc%}J~v`ZuHmkGJWV-3bJ z>SNDTWwm4R2?!xLt$q++H6y*tg`(5{wwER@-h3cB!(9Ptud;y^9iuoN(r+tq&mra< zHnnmeZTBW*ZT)Gg%((&oVCcs-IDqt-0un6~@3zGhTy z7&cJ*mdA(7nH7}Jt;BmPGP*rxCx+)#9Xx&nwNKhy>Ucf$9||X)mhSm-Sqy$%6!Nxv zmR+{lju#?`LkwCj4KvwpY&WLBf=|zzLVrF$64&Otg78~~!?Nv|p6z#u32fHsa6^3| zO3x6mwX6^XP{MEW9~>XJJ9+XGC04?OukYGOkINFx_R|af z|{Tg@B4OlSYHlb&yvWA0;fR8!v8OmD^D5_qDnKk{|~#N6Tyd@ zV=BZ>cgakQ2ZyTSQxY}^j!_qdZ&dBS2RxfkzE{i3-6x(?a*~+qGh!*yfGOiInwY*$ z`hH8T;}eQt4N^JLfSQjlg?XD_;LUn288;oi!u(pX zER*=e5!AksFqrb|Uqx0!7-P4QyB94sYNS1p*YOSa2TK)9!>8bK(G*=Hjm&DNOhH}% zWTcwla`c{+Km=1^!24Z*8~Qr>O`}RY?NKWxX^OtDTEWEaVpKtfeOKSX7gTo zcBZN)%Kx1#=XF}2VlXSKTshZEdn`FBaAmY``8PxL8G1oTOfKTIlJrV3a9J?mj4}yG zcFt7q4PqUoqi#>M2T_{j<$;iKS%y_u2oNGSw8{grq(|9Czd{BA4zb5a&X>I-2hjzi zA`x1ZK*h`t_^9;B`sC;J~iod+V2S7IDU&W7;|G5<~geHy}plrZJ6Ke!BeIZG2fA8A*!v}#q zvz^dG)oaXcxw!p2@|^!ETo&waPv6~;;fv1fbV;~$G9#Y~pw0_}z}vjup1z{_4qQ`q znlaC6{10jV)k^$<`rdVy`5HD7gv?2h91=^!1P07uV#38knvo&$j&*{W?$f$US{@zy zV5#9a+VyWDwrcBAF%Q}QbQ_xeT$)>cJC}%Q((#px0Urfic)!l)KZ%PH@;2piV@acm zxqoN~Gqz`tz8zQT8A|M4e?Aylb^*Hno}a66vIt?zJX%(s;d51?%L zItkKWQBEqJ7#VmRtM1psBj+gGL-6CfE4f|x-W|FFA;QWl`7gW&C(ZsT(7Xf|FhT^B z;CgshIKmKN>Oc|!l9;0|KO~fYnTi%GH%ng@=Q)n8ONgq3x*QZ&)2s~F`4sg_!+JQe zIbT-m&^0k4aPcxZLVV~$dj<+n<{N|&OH+>^3!99FHco@Q({Vc+_r(=M>{Q2J8tYWw zl2Ty6&_nh%ibw7Fz(S%hpoIuqDQl8~OzUbMh&Oynh|n;cR#EUj3GRwY&QJ6iCrziJ zwR7F_B(oa-?Hk?(ss%d4JTFe{(-}3~YhEvl<4wL+*~jUS$tYQO;gRJd-VAXrk9 zz}pR?wDQ2%mML|$IbsY23!J%ews0N`kg!g;d*+*Bpd<1U)LyF{0fs1K19s)KJAAF_ z-@ZU$KZH474`e4kuTU3ACRdULMy_lIr+LONT*J<#k{|2Yocn#WgOrR&g$IcC{F3`H zun>r=GmIxF7;tbG&@G+NFOt2X75gN#3pa`#hmpV@J{O{V%fmWOx}e=^v##oOQnYZc zKdLZVz^Gn$UdBnxW8J-ruxDbi;F2rcm%99hmAT)Uu2)4j57zsXmxEyXliHcV__v16 zjAsL$7Li6(H2(mK&$HjeJUu48QX&%sG5Gi^xVMCPJ>YmW-c>B$QK>HpJh}C#uVSm( zD3*;e@?5Z57g;O8MHN%)`_!iFFO>TwjSU4rX;g@_7$qfu8G!M?rvnp)rPvEmVCN!0 z^8l$WG98FLp~mnzy<(mr_Zz2TAES1};4CF~@767JRl1vXz6<5@lYNn7D6iZ%Y<#~i zEAPGfZt^1gx)XTI>b9@iF<4SQID##6b>%087DQ|URqk2YHo3~NG zDS9BFR@Rsj3OE`V5157A05yXEc^%+~v)UoVC3^qLIv_esp{D)=b9mizcZ$C6#$qBG zK7SoZdE^e;sj2Oau*5UFl%+5phZgmG1)`BCk3QcHMb@9Xw01OWI^euGcZl;@OVu~QS0HoaW?%w4vTE}LFHBISG1 z0seo*A8;j6QiO#dN>UGhu|{$yOIj@_W;jPlosM^T&_`iWs~_?^Smx@7)RvTWgS6z~ zYRn>C84y$?&&n<#OzNm5ff;*L()Y;gA0m6TBr1EPd?w6gzPuakNObv96}g9N%AvzPZ=gU zm|G2MnmMG8|9Cr~%dccgx~U@~>dST4V`cqs-fo_iJ%26Vm@yBjN=WL3CeB@i&u0W&v!UPR{0$h%*6+_+K4jUn7wxTkv#6T2a2bGbbgB^hX z>)xoi6V95MUGZlX10Ky-|8WS)(#REP@CCnF zP_MXI;;hng#@P~=OTk=_N#1ivy3A}ZntNg|&aeT9j>hQD0%tW=9GT7ufx?I~`zYxZ z{69l*y;dTyp#H+E)fiZ?`Fp$S)Tbhlo$<_;xYDR6Z{>ed$)X|q?PN?akXr%L*bq}* z;KoLWMv?E-U<)@1+BV!{;bx-o`wc{miWPNo52%>LS~6>eHr%p9v<#C*IU~ zwBS^F4h$;1RJj<90m@%;Acmh!DAnL*9W(u8qt{N3Jt$3^W7 zBMRC2QtLO4B zmIl$OLs60CvD7b@5;ZChuQf>g`;PkTThc0h?DF=XU6q>a4h@OA3G!YDF#^u?dD<@u z-|_yO(@a?l>J0Owc+**)z)?>#GVfP`YKiE_K(s_kOzn4Vq9W13#bH*fuMfI@V$GZH zK1He#*(phXbMmb@H43nWXf6=scGw1^fu8&Ab_oce*k*A-5X+hx%-(<196 z)%)9MzX%gSM_M1lH{S>TY72o8@nOL|8NBY+{*?xBReKN&7G}5;|S*dlrX7m3{f9}jk{L?RVL7HJNf8`-#u{76E zWwMA-7_!E&SOaF7WkO#Qjm@%4C-GS|s2RL{Mx5gNToC~lM2@f{>d47t5Kt-M; z_CHBR#V{Wf*0XA;@lZ0!mDJVrTkWb9*`6$`V6)aPXk?~&=t-^u?*=m}A0EtE$fYuq z4ZqXb;AfK_uIU)s{i$zv@WlTzlOAbCHgWZxm-#1qdh!!!#4#fH{^1Dw8`Z z+UgS=GXgojH+;89`=aZ(Vf&Y3Hip+-W^w#|d|5ejF0{Ek^6~SLktg7s43ap=gX7vQ z^6UIYpPGpa=hwey-X)QYo!@HlG7SyYd2k1i`qO|b)BfR#rko6nku78qUU%vsDq4!d zD0(CMvap~^9LCNfSMpSh-Q%U+x@D24C5Ok$+LQb3m6boL*vKf%%*IKeohdnXZ201D zJ01v(_GONb7sjrb_bgJad{a$zfLQ={XF!zo;>nvNWnZ;!y5qZ~nc9VeuqaBeLkT{% zmN~-qw1X^HAq7|YFV2CRtr*AYdph7bMg7B`DhAh#Hy5hZ?|xqt;bSc6B@@w5CE$U?!>1kfQPV;U6=SCb&c6AROKwM#frU`Y2MlX?N;V}`MGLx5-QMp#gU3aeA(^WXudknr zhYS>r;IjYro5jutPic(}Pkfk?pwf;MmVjPi zf+&#B6qIdf;LIE9ht5-(^jtXHJAw?w^zefIDCzISX?Aa9k(;Fvdys+`Ca-fNeIPqA z+b$23!)i2ZB&@Vg)r9cw%Okdo)e<$m%OlU61pvlzZlLFM5q77%Z`ytNbkD#gE5i;C z%iOlI=yQ$vUC;!n-g^Vf%c*W9GM6{6VX`FN(B_zmiK>l+P;5w*q8o!EwxBHw$56Zi zGjw{XkH!M+nX@2nZP8NyY}x43ah9|nB)Thm(LZUu_*|hMmPzcX?y#R1X4rd66tR~} z9qzu909r_lvgoDcAs`c0CYjUsMVi_H_&nlb9v`@i>|Q#~4Tf7Aoxy__K0`osouI0i zEnMWD5;y{l0$suiZMm<1Q9(fQhs&0^LSR{*27bpg!X4prKQ`tm^}o*pZ_&N`c;BJX zm9Wg3`f@o9ahKcXea|2IArY!u6OD<`(Z;lcX=-do#5KO@P(ZjT<$OvfgpI#1=o{_i z_$lWL2_3a7xsvg4rCpHjKJW)&yt+A`3i|bHvEzAna?XQU?~fGb%gTv|(vL870hYR9 ziaq~_T{Eu^2c^+?j-x?SQc4Au$2E9?UYjQ>GX4#_pO}uQHtU<*)3AAm)5q!`g!Q=N zKNA{17GLPi`O7P21P)dwcVB^l+isEl>krKZs zT2;3f>TJHY3W)3ST-ItZWQT`{MHT*Q4GY$U?Wg7w?eT=r@G6M-h+@jr+h*xX$Xs5L zT|-;X7w^~irEVfxS|e|ls&Ga)e_=}oCc-AV#Zb04P(}l)RyzAjO%@f&?oj(oeGDy= zovGD+{b^9?i|-B4*;)Pmdf=+wu*VbOk|a0k3@WNSaOWeJxB{&po!K4gS&Mkkn8iaF zr#du?{t3*J%88Eaw2P&@^annTTeB8(sXrkL=`ntjex|b8sX7&b*H-$ub~_i!r|MSI_3Op&K4>8;2197BZVW$t2tD| z21vyhaT;wh1=Tf`X>8Xhd9|rcx<@TStnjJ-U2_f|?^}5_5S<92xqWdG+;yEHEE}I; zor|~zvA-*V|4pKH`TY$9HjWLpVEpWZ{S@ae;4gtLsw`hinUZ|;h#yz?D{9oD2!fZ{ zh^ddeXvHyVoHm8eBv6qJPZ*eV?>;_(F)YVVp44uz%Du)69-Y(pTw3bK$Lz3W+H;uU zE}{I;hu#^+(?5rPk1c@t6$c4>n9p#=Mh6S&6X@m1#-e2Ucd+UH;2kn`9tocSPlKuNPN5ytPMIky(c~Q; zR{n(w1?w;m`+cU4RV3W9mDS6{&@CqZ)? z8>t4p@MARR5>z9q$PRuD_f^A!c*X&VI(2??0`;r;cZ9r;RwoUJFtarR{5F_iA%Yo)g z?;7E=FVa|f^816^>2R+%5BsX&C9=R z@LNq2nP)wQPb5dmOmls`Y*OZ;%(-Z*uw_&+I=e`%eF|X7(&yyI6~#CtGd8aoAK&fy zmq}HHddENO3J&CVRzGr9DmHg+ur2vd>?Yp*78UcYc&q${8VtBDJsY+Nq&+!{oi5uQ zL>E`EAJ;ADgkD(u)@^U#4rluV2C^O58Mn}VQog{3`y`&2cngf=NtS5b zVtZp|=+L73`!IMf(4utYwHG7UH-mY3!pV60@U$;ueYvwL!^zae;*su_D!KERO|JmQ z0@ue(S&>n#JG-Fk51mJ?a*UaloquG*6*VpgNNxr8WtJBoM;P2qDb@89ahJn?-wlVn?>|CPCF-RNrqn zDZNFJ=zEzypmdhrq;wjMar#`1Mdg0P|HV-`fta$NP0Oi|6UvG0t~Y=`H2)WW*rne$ zjp-LO1ij0lURA=B1U%2E+@M$jvLZp<47}M8=lEm{r78vvGs~A;gUfyU_QX)WJ_3`b zb#H>oR%QCbk5@e&8`}#VR1k_QUhBTmoK&pS@+D4OcP37b5<>91{FIw>^=jG|^0-RG zD(~Lq6$oJSM$Gy6{@T*9FTOf&{0PqJ@;O@DnHGG$0qH9$_{MLEJWaxV@S!Y(vMV5( zlN246{slE=TvTZn*CdTODrYA$i zu&8jE-<*c`{ZgpPjFGMpzt6*!^q-~(lgYm@W&)bI?)Lp++6gXaZ|C4ffNb$c2@)7&-eU6Mw`*>CM5d0Y1$7=Rbx`5X!G+#^49bR)hCtRAPmsCJt zmo5PnDT&>cZcu6I?vid6kj4cBK?wl?X{5WmyHmQm*}Hy!_j51*@qu$b=ggUR-e;b9 z=ABKEk9Tb*hkrVUm=a@g`w!144D1Z-kd-lSqSwMU`^YY<(Y6EQ?EE7e+lkO&$syqx z^%4x`Y!>n;Rg#B z9v18Y8xIHzUxJD;kSzG-+&zV^t>4Q__2a@)@aj|1bxbJH;AluoR>kinOY~T6!nT?H z8~Pt*g2m*r-cvu1{)H%3Z<4SHI5=><%!alnz`X>%_PPFKr$mQMW&R#W6xBr&JUkSu z;QNl3dA}pDRd_Z*pu&nG2UfEq5A?5UiN5>H_$rr;15Pf8C*7g}B9!`vpx9bPsLdn= zq-R|a08hjM5ZS=k$$BMbT{?Zq@|3E)pt7yu68+<%UF8;#1_ARX1+ z6M_CeWZ^14$5JRG0em%TWc#Izp*U zm(d~ybhD7E9F_ZGgmBWK&Bkw>d=6Z7FKx136jmbc+8z{T%biY!lHPz;)?FI(jAk?#@l(1 zSNmRC)uS;;e-gWP!i^=t2laJ?+JB}<{lBJ&-nsJN7QJ?6x&M}!5$9iUqV@$42<-ny zVHJ>qx#Z4p{w*eslG$D3S3^vk%jrWUah0whxZ-uW06ES%ZDMu1s9FAwHy3&OArmzO zAnEK*c>V6t{Q12N1gVCEX2{KPzB^PSn0oim?vMwqm(=z{H>nAzN4&3Evxhd=McVuNrB&wJyKOo>4)MJk`t%^r2_?PYvT8xI;uNssvL99=^aFH{C4 z>zNn&VgxGgW%2F>xQO}vCvug$kyvkG;PqvGbY zFS*3fA=-&>6d@7apPS`RuRO1jpGt-WB&e-uueXIO233vK|DaY`vQloyKQ8bmbH%;O z!^7SE6N?A807v|o3Bx%i<~ z@D6&LnK7u%;B6rzb*gsWNr zpw#KDI*ykxpi=$LnYZdwt>A9Jyltp(&6YXloYcgoSl=ST%Z^}0^&vNvTBt1p+Iyia z()oF5w?x)GYo!GTpq}J?UrG^80^!S0eYgf}$36$Be|7SKuP$9W;&_2@s z)ZsPHb6pZpRKLU5@j%G6RRX+_nS+JQZfdQmIn!-|ry7UU;I&<=Qog&5#A?+rssWuW z>5Fyxsr1&`dB!FQ9PsT}B~uI4P)uQ!E#?cW{gJ3b@@dYfbVpImnzJGIO8}68MU5&H zmED-ID=`?yS;yOF8iE{QVHO5nJuNR=4PC;vqSJp$gXi)>!}F<Q)K)0)izt>p_|KT9ytOjeIqt1W*l9T0W+8=e#v zVDE`OhXO`shTare+)qc2-%Bun3S%N;muv3qWB{LNP7cHnEx@P_p%2h?{DWnlLbLA;5cfTrC6?BBbB%P zHx6iF!Jk!k26@I(Ke9}V1U*19(1<2t(bMI9{f*4=)`;LO&qrTvenB&$)>ZK0IeI6d z`HkLzeqyra%5EN-G5W4|fvEGCNsakddUYJ0kp~|u$A8}>&N^3D(cjJBq)SVo80l=&sLp1n5?40*J$HC8}#&wPBAR!h9-9YaLFGXF~ z(^dbK&4@b*eBO%R7e{{DJsdaB0#p%+->Q(=?j&b(>;QH2cS)(OtmODfy%D)pkQN*T zJDP-MeWF;d?_Gi8%h=7&1@;xjN%WJd;ddM{HbrB;) zDOVm@wyGmPIVf8p3Uy}rav&-%^1t2sjr!r^Ir+BZYRB|&?SC1OQvkP-gBfsb@k)5T zt1nVAuuR>0uI)Lv+FHL2Um)|d>*ZOy!3s;SY8D+eXRR3DTxa#ZxdoqJIHeH(TUA)? z|Im$|g#xy5VL%)gyX~CAMPN4(9P;_(AAhL*k7W!|T&sL}wuClxqhpKHamckpr^NZC zj?|Mdg6HolE&r;&3XTnKYT_-u^@$yuX$Usj{QYgT1%Fa(su5?yFKK9KfIYc2Md8|8 z5IjVh8d2FgP!Mlkz~?n9;AGC~1$xiHzWhOmJ)HY5@0c6Ltg0;Z2zLY>gPN#LIg7#= zKV}mXo`dl^?L+bvwTZz`}<{dOn4AR+=k5Yn=B66Alk7o(wp<3YE#=qG#If=77v zY{Ap?fFfodshNcR@eVWcjm7B8qYOU7DD92R$h%~@cbPw$oaWI{yY!%|BRY&ng)VPk zm6XM5Ngg9Gt`)9FFO7ms3H&$JUZ-oMC>V@%jlzd_ER=2mHyh%GV})*QFQL`ikJYyy zUi@t4sZtlcS0jJ6{VGZR9yKnQ;eGK{MKKPN7&l1YZ)-XwxIO~!*NV!wG$IZIY896FwHY%M51kh@}uYPAql0zp1Etzu;y{3;)DG;KKd zTNsqQTPzw!?n?<$3_TTk+;AUAPQQ7*d9$7GZ!^Dgzb~oW@@?!%Y9Cz@wuV1A@{VC=OSV)G|+ zuhWi1i49a9k$ir3t90&4hz^_ii^~P-fXXR<6p6qGIH{5e(R~jr4Jl?uRk9Qu<=iVX zxQ6D1m5Q5&7QTMbLlIu0HLOA-3HTqCa_H?PX|#^z`&{t3B{Mx{R9tuJV{bEm+`hE< z6gHg|8t5-_yaR`cH%noFk0$3!dn3_{tVT2BE~Q=UR-dUe{p8;by1x-6x)4?YS~QYA zkqS=d;?=P-Kvazl6cEt)TBo@jiu65ei^^5XVOF(d!E;WPmFoup85uHY;oIg0sI)cV zXU>YHJ!HmlfQf=Q7A^CHRvA=1;^^pn){tah{KqTRVlQw-={b`TZRfhK7TGvhonnSG>qrKMinGz?|dt9{+SR$m8O-V?(!2 zJ=2hoy*8ow-9Xo@=rBp7#Go(Rje}e#SJ9UIb!}w9hujBq-*sR8JtDZO{Ee|5O!}r% zh`o2HX(~-wkO&JVME5MgG+leS`fy8^8MuZjOkjf9*35rr%}xHw;j|6CpXFN(aS(UD z-f#XYeEzA1zLZjywFV6EmdFi=nGszPb7b$!51d z_w&!s9jdX|@#0!|`m=KP2gNqDF2t9PIkVE$<*W(Z{R^&`{L!qcV~ZvwZ#(QFez&Bf zWvYc1>d@3^S|X$A`PqH{1O{bMV`TCavsNddWqx&>-Hi;gr&mgx0FThfk?1{}C&8Xd z`e6TnY?O}S`&el|9wu1%?Idy93w>U1852$Xcf&*(hy{?Ap72e=tz0D8;zq@W@an=T zJ?7+z0R&JdnxkDyS;HYWTc*(~U>-=9@u66gO!Eh24&_=2GbLLyyVfG78RPLh4WbQ` zE4$Xp3l&WT9noMhAO;2&JcDuxmirtOdz2d-i^x7m`%1qDe-5k~NQBb?9D=1y!xk+3 zk1yISR7uA_fTs|+V#&TayuKwKdHIsds*Z*;I6yJL(3fQ-)HVN8Rsyrh@aaN!0u>s( zEjzoT=x*7KW>SmB$Kqu~U=Sg9f&~5gVsx>R_1gTi@ zwjIM9W{&u|Ums^f+5WFl=~^Uk$=aVbiBsexg=|}=#v0K1p{E2Fq!AWbsfwrIkKz+Y z-Tm;g#t_FoD7w%<6xy(*z6Q#>IG^$?_lkQ(TYuc!R5yb^YdFdCu+Y9NCyiVC1@3Ypwl23T*1cCK1175PN#y>OWEN=Iwfk+w-~; zCf^S*FJfl)ZZ>5UZU1ZBDyUO4n-;j1#cbswGa=AIDyET3G^=C!D6^B?m}4@jZd}IY zGIP1TWMh;5wW3RzGL+^eC&xuB|+NY@tDV3rK}Uqbp~* zioCGP_GF;Jez=Pjx=SJ=`bnMiCJv?ivHyG%ah_Z5-pyPxEh|bTx3DGGSl!#E!lh2n zrNGD`k3DRi3F%R%4JlUYdm<|?gKEJ`jOXA=;-7TMQDw&>BDPm9J{o>wle(2##nl$X zWRz}@s(t3K(;QMY5`yQz4<*=|AkgdEPp)U>w z_;LKj;~GJIDk|Et%9GW0LlD{-JJp>unl4St%yGpJ3|kJ@=~r`&3FZ zotMKWg&PMu=S`muxEFVmp=T>Pz~%bIQ%*cnm{>No0e_hJsNV==h1PjEI%J z{b3?N2;=!D51_cFnVA_z)t8gGt8bkHGGdC2Dh44{)O~&T@Qh4E>hf@ay~Qysx+~ja!DzHpo`) zPvkq(aR3DNVuh7rmM{lGb34A=g3zF-*13!xF}}|KF0aD?Kf@27u)y6Wh}Dzx@NSNz zTb^&;GraIKtTy^$qEud`o4EK*v9Y8!wc2bm#|o&Kq6sCI^!Uv{K@8n>w)JQxi? zsot>qVVLtKjLD|gs0`ROb;K1d>$B)lP>^gEbMyjYIc9QWjLgnqKBKjhPSIR7t zx-n9cDms}iE$P8S*eA=vaUYzDF?X1fnF0JTI zK)E`Wue|$Fpn@W7_sm2gI26DzAG$sUfLt0OX1Df2NupdP~tNwziiPZrF+9~ zRcyFtc+lu?($AY(*xJznfeC<9zV~Fw*jP3L+r)535tOehQewU~KgMk{Z~6yS64nMv zBfQO9pqeUxBSc$MiVJ({;%Au zvt&EcTxKhV6BSv>w*`K_E2pONYMY=A@L3RRw4t?XHa!xfCvf-XHVqg*q$#YU^ZF`I z-golnGA_e!*~YSm9Tg|Ufo-`lbbwSnIs4-2UT1I~p*0b^f{FE=GqVIH_8(Hz~U9DS2 zOKKKa54KgA;AhSGzT8QZTH*FX3`@korTvxQY$K?slFB0pB3!5_R zTN&#F)wQ2yCzZsun4w}u0I=y#aUnt=uJ8Txju1R#b;^V^D+0VwV3cb?m{!o&Cm%@6 z#3>wUl$krMOUQjbfUWS7pr$g~RnPvkXysLXx^G39TZhXJ{|E-mbjG!J(%MlWSf7r2 zmQfodicTT}{XOYKEzpN*ogRYyKR78fQJM3ZqmzrUb}SMRgv|F3V;%D99ZG4VoK~Sb{l1ld0=6AX?zbfupBQAS#$W5@cpQER3qrGi@I8XOxM~IdFueJzMyIY``>r;MT%y*HxW1>5=IliWdohW0!R^XAhLIt~qbFE?lS zP{fteB?eg{U9K-o-tBQeq`zf@JrEeY!~Y!U?6E6IYM5S{z>6afaE&rxTT!p@G*cNvR-~4HMD<4TXwP!!9geWKrlrJbgJJ z1gG3+o|i)yyW)p=;_-~>{Os9krDY&6eaBE^O`9mp@JJtZ%%xl+^X)Y4NKMc=VdHat zcH-ib3ky0c9hP39hg8-T7b#i|L1m8yLD9S(;$q*Id7u(J%6ZfAyv`@&|2#{j^PSw% z?BmdX%UnT@Y&zQR7mB!$|0w~4agd*3#F**t-0ltm)8`+caY%a;Ox zMCPtdmEZs%amafrH^wt-L9v9tsN&OhH|u1nc4s$Z-K4>n3;f0shXEy&j1vn0_Fu(- z_pE0dm9p<$f;5H`RoQJ@U`bPEnHB>E>a>B}tXj)Xu0x!E1qPIRwLRH}KRz`!RyF`^ zjEtI~Xu0lxv>ZQGn`V_#9`ov1jP-6+^h|zwNGMSjf74@&l2QS)RrA1T0^Z`>*N4W( z^~vK5?rSn%pc`edpxlqe617NPTw0W!xO=)(<$`WYP_b#%mG3>`ueL90ciC)4Y-7Sz z@d;k`{jjhS!PmF+U9vK^OMl${Gb^QkHu12b9(%lYl>@g|^bxO|>EuV|D$6GRmH8{r zNb#BlNF^d_o{@oE>17$BzxYAIe$sd#-+cK8$SG%uya>evKl^>k9X`L`#TmYK5@%gB zwbgc3WD53I!!P^d<4f8;0z@f(XM(D5zd-;t`#)CM%o~dG_^*03K9peKnlPPWN=uhuB|`MD3PPUs z`quq{n?E7o@--#K8*T|Fo;tk5zXx!h5lpVTqO_}9N-0FQ4Rf)sDOmIUOEsmJcm}TK ze7>v{N~gme0@0W-6b%N*NluSWMPOAJxSiW3qpCo;!I=nt8&HQg3rZcND&$n0IDI#9 zK8R%8)rplMkzRJI@OtP`{CjTTQfon#P%nJ1ePd}jwJ?>;g-7TMLx-d0@~lrkpbO&A z0H4*DbNf0_rh+@b7XR7ZfO|sFPBWiZ`6TKo%g;!N2B;I}C|6&ywe-!|i zH5O`}VzV(*BVCB@IITsEjzFq~>41LQ4#vyncKu)5b*f`R?q= ze_;ycKgpcEL{#ksfTEDmo69F`+$$Hm zbww@>(--DHq$8uvG6QccfU^er`uo)| zz&PWrXn+?V$ikFe9=*-(QXi?j2J}7RTa>v{G~`4JMXZLwA$|pauLwZ$tb9MheH_tfRE_$|}V?c-G39|PeTmvr}$L74ybP7nqF-?5Y( ziD1%97p~4R8q?vW7HCvJ$k&TK>Vk!Bb;)l3k=c!S%De_ z2_zSa8^&_bWhC4^bra-YI)I#6RtcCHE1%?Dnzjs~Iev%3YJ09BS{_&7UM7w!*@$lY z=te4j5=m6;7so+>4A=%%aRllg%mp9-yzcKmPzuQLgHXjwEL5w<*oBa=h{cn)&x15q z@!$Yg8cEIe*QC%=c7b6^A73uA@D^G<;LN*$4JQTc3cFCI=VEmGq12yMOjwly@2q+P zQ2RG(VO(?e7VE#uaEjim*LNWJAz;eYfXc65p@M3dlDCx(fX67Gh~2kouUV@^b~W>| zQf0GnyvB*TnFnPOj3-1EpzP{t{2S_wKMV#fylbdarJSwYg4XC(Ut0dPT<4IR3G(HJ zSpMC~_<(>P2y_|9^~eX20Wv9^J%f@`cU{j5c-)7C{}5*)m=Cp%dlRzXgK+#3P6GHk zoR#-?4LYr?ygE|M8Jr<`%uZ*qG^Bu4;8~7-YKWV`6f{_~j@`M@QI>=W1sY4;TKI6g z;{Rl31Pn=b0s%ytmS`S{AEG`1H|l-v)4AMZxA=0EC8&+8sj2CdS_AO`C~-Ot+03?{=BQsQ03ga+z<`NelDbQ;q!ZH8S8ZFQIks6SAUxv#yP_ej-e?rq*Fx&NZV3@ zl}xvmz+l{*G~5*^`|O|BRuaM_4t$B(P=e>|?PvhCp4T$?04_TZqytL2E3&n&6us3pj<^|HIA1Cy`>sF6+^>emNw)Z^HTk`PSt1dGa zw>O3{-d~KMqrwC#X}>M1bDMY{EK64tVwJf^y^+c@p8Jop;3e5@Q12?RbY{VOn#)10 ze(#bR8rd1i6RXKVY3)t&be=&1%f+Y?U>b+p}O)g z-aJ=PIJ@b9$g1GhBC-|jpFA#&Z*$>k%gqD=8?&EN$H>af$;em;h9l6nNYH_diKVN$ zq(#hJl5#uTkZWp+IA+xMj{8&)rO9b7Eon>)&(jYs0|a5oFQgZIUua05vbUrVKUi`{ zgX6UJqcq;;|6b@?L-UHR2imKs%xN#&cuJx&kLuCzBO_JAtBDTT15w}|V} zvL`xtRiD#|MX0!k5Y4}6X<5J}Wiv;-+fVR4*x7`ntk3t;1i@`~{L%I$3z=yR|wRI;iA3V5fn49vY7&RPz%7x|Rq9 zKwE!y`5UI3xO`C4-gyG_m^!>KslO~mPKLD1ZjU zNlDfn673!oeA$Yi1N6E~E+l53Z``$9_HP@~$E`rw9&8l4Mh?KQ?HLlj$19`i1s_Ht zC&KNvKl8?6OKOIWP#ty&>$~?AbuwchS399j88CsA|VhPND@R0Ru(dfv`>f+-5eaf%?!&Q@r9o=?0%4W#>=O5t@0-#)`lj+ z#TXkmFu_V@U_G9>@3jE@q>R~*b~vGmsY zQtAIok9&J~x>30R`Pd!2u7r8ke>p4(rL=8q6#Do4=>$Lww!&3ZBe`xE-ao^KBi^%Z zO2;e`De)FG&{ljyijY~bd@*G;Eh!6nq%JTWU{Ix7>;28Ve`Kl41BA&Dd(s=1Dao+l z(Uc0b-hdl`f*?48ej~Zu8mm4O@@<~&p^~lvC0J28>X#ZV~>=KD0 zv;<&VTnsfhiKOdd4|StfAz}p+UfM;N_XgivZGsK#J8jO;#5LF(k^}@5)*n1~(!={l z0IGysW-+3g6)_&tsZRAsLCo^%bV)zF=UAL3XSefl+hh(ur_=}<&F&0fUiAl)afFo5 za)dLB6`v3FqDorMf+|CLBBB-#*FlYuwMmx*S(qF-7-=RTpay}&6Hqpb@Uix}QT;K? z-CMQ?GErNT?U@53f=j7KCy|{T7aT#Xv|!XxR|xtO(81|c#p1a7bZQPaOr+V$AGE@5ei-})ssz3ijb%9ST#8VBtj*^!CM0PHDS`PPOIGsN* ze2{V_$lLL0+{bJ7rwt<#+)Dder!BKG)Kcnez8V2!gd^DoP-BwGgUN#%Gyz~JEDiux zym7gMZL74y@}PhN{|at64Sa+i&SwS(f+Yd|erFvQm%SC7J>DTeGG;6}X#gqgzrP$n z0h9I=(qyP#d}>TAk{iV9JW5iqX})L9hk@j3-8#}i=+a~$*%e;^xM5L(lsN!s4TKqn z;$(qpHIHh+vH@SP0AzfWZF@vuEYwY~%q@>8+Ef5wJ_H&R!w=>GL|wrMZy_YIhdS3! z!yS{oNXQJC(SxuQLyn!L0O+Wv3#6vG5Blp>fVVo+2*hB*12P+O!uPQM-~9*>h?F8c zqZt5V$moApI%>NIVF6(-8C4vInUf!qCCsrK^kQzCClA*1Xk}X~IuD;ZZ=_S@&L2>> zSJ~xOJrrsJ*d9c#G0}k2jp9{F`Q1inPjdJeruNhf06!WCBO{TNHjxnwC7VdFM$oR( zDiHvDs|NNzkE5Wa)4LCkyf%mNC&U?9>i}|V13|#GiZ|S3!NeyaJ=EiFHXA730M1)cqdh(@L!tLPBf+ShNAg$YFMyHmn9%rMUfQ zZNsvs0a*Vfk@|4jDegpoW~hGcynxAIjJgH+6o_Nk5S4e}p&qw#_veM5ayOBPNWe5e`X#Pei~U4^c0) z!+uAXD)OP%yrJeWMuja>*_G}Cz~z^XwhY>c<}FZ$>fC12kJJ(X|2#Liilyyq zvFB_5!U6|&L?2sx4VZ~y8;d7K9T%L~gu9SSUh+e$1lN5L1EM)AEmm9MpO1JT{`JB( zm!+H50b*IsT^--#cfDf*4(NDn{BL2LP| zPCX863xd*pV6RJ_xbKl(#69?NJm@W>son?xZ?wMB4b4_O*eKGybO^IipdDVM*vyyr z)lzHV-59==;YEX(A(YQuN&)ge|_3>p2S;Y znA={(jsfI!aq;XqW4$ zi`EvFcWJsWuxUTe=U zR8@+NZ=_cAiw-*Z%fZ+qS>DL$fj^2bwi8szrr;6^8eex}q`A6}P_E-l>Nn@Cf;y0;3r1LcWM}_Ghdm)^L^sFnH)2=~d6u+*Oyw%X!XJcu~Cc7Q)_= zFk5!uYClc1uu-y9h;v5HoeCFbcTBvaKl+d$rDbz(5BhBOI7q(WLVywYI3e90A8~mU zZp{h-CdmzoHpnkMEVl)mJwwVu{swG6yrc~z$-k@qmR8)=(Di7QWqll^R3OX-V9eIv zoq4rV{k6?MiQ=mHMgx>4Ez~Vm4b=WP5T4{%*s8-{;J_;bOv=YOKuht^3<>!=I#*!t zF`qwHg@&{tQK)=>QGwHsdxpb#?>~jc!jAP~@w-(1dJ-uaABLdRPMEiS>{a*F%)u}7 zeSe>M{s0iTV)})0oor)DRVv?>urk1Dl^n9a9+$O968GeJ>&5DRy1`yONx<7TP~f9f z;t|^(n$kV(iOcZ8iR)Tk)&)&RsfxEFb!hFZ5EN#aZnMVk+D3$O9FVBL0M`7U8 z7#jr1z>=K>*%@1s7Ft|!EniDefr?1?Og2WP(o=}Yu+Z21;w8*&XRgxb^}>+oKZCQ# zXERp34a?Q)^&xSaN*R5+}SjR%wmAPodku#e( zsCw1)URt)rvj;WZRI4m;tz@IK`$t^==i0CtlifQ5Wf5tB#0?GM7}=S~Yn~{2kG>b5 zNJVW{rqsfX)q>za5_%zxDfCm5CSKi1;S+OCQ1Flki=1TnZSOb6-n%jj7Hp9|y!JBz1;)OGuym zxQGbIGo0i;RRO%+#Zh+U@tu6~ed!Cz(*hl;3?^9U_LQOL=?OqLOdHH;)IM}dC1iYP zvu_jkaP{J;~UZ$K6X|6v#iLcL~^-N z?z6LdZpW`pGw9D%0MnK$x9bg$Kln$GV968-CrJbYd0J!2=9^)LI&b~b@r`e| zpuq7+DF=h%nD)dsWU%kwXF@*)P)?AV_q}Kd%ltwJg?Tu_^TWI4V8ivDt!$!(qg0H? zr(Tbo+@A`|-c(^%Z{^r`GUvoR;Q8&pI$tOK!zBw`cy+SV*$|XWX#oiI=~W=2d!s+^ zeRcG}8Ee(URTUNCQEU?69VSi#KXe0v9Aorw=`TpS9c0~uZ|y1BgXqKB(I;39dT~s4 zm1VwfGro-jTI;IixNIfd7qsvFYU;3xZk%9v)3K~76OXqYUE}F?m#L-&11{6rlKc|o zw{Fc>lmm!OjL;2z3ftaL#5N^>u^$#7z;2ovJgTqdd0z&B7Jh~s%N6*^7Dwp90Dn{TY_P0n zmHg_tEG4l|&Npqw`+Ppf-KIgm5#Y)Kh(>7i9sio)8Bx;@dYrc-kYf0FAE=z^F4Mcy zWKqMVS5)&jy?E#CL>M;rA_>}SlQg$%q8&}|Tl#gD^ozV2bJqI%Z=1EM)kUD(t0z*y z(-=-Shhr4pM}_LR4c3iU@1Fx!Y3luv!3p)L^0>vDWLRZgF-KI!ZQ7N3Vg8FuRK8kz zn`ShV?8*;sck`o?y%oinrwuMy-96vv;y?MYZ0F?gQvqgq^kc)+Zit3ei?H%L&$|=V z-U8ez9NqUKTIY;_eOm5{qd&l&*2@fQTxW0prPN<$HbCq>O^g81Ci3j=hz4 z^z^bJ@sW6=fBu{WbLeMwZaj;bxzfaIqpA^|rcp{J^yxoua~kk1_VwzIa7UZFy6>I>q5u9Q#vNt~rR_kH}`^h_vQ zJZW{x+E6F7t?#}afK?{mocNc-$~PX!qml;_JuiGnPYe}!`RlORmPuekHvrqWbc-Am zl+l?3nDLUgOhT$t&)xTB3UJS*eqH^^ceq9dfAy)(P+)tMFC0Fy^rm0WZToMbvc6-I zv%7wjo<>>H$ch|n0h0}Y!TI{q5Sm%p3u-*S!!sMyT!6b;>ImpX%W9>Ap=jLb0~5(N z_wm5nW=9t~oNQNVSaN+6q*L>?;IEkB4rm$XuiDE9)S?)TK+l+sYP!_d?B`2bE3>Cp z>@VGPdz6C(X%a2T%IP&VB4!p8Zz>0&fQ<#lKEKl;BD6lYGj1^hOb=5D3mAHZI3Vb? z$@4$dX-KPQCOlUFTOF$Xy{HOWmd#g)jx`Q%G1OFGbjb`XR516}+mE<) zu$X3rFJgMnF1q0qAQFo?Vk>PU0`cD{RFnc3&@Razl_m{M+QCgeiUjmj(5R8M-N;;{ zj_O9X%DrVD!^(S63*LQKNZEag+Fc&L>_1j?CFy;+j_>@bNLNT!$$B;3)@M7p+r0l^ z=oFX?Y7mlj2?~V+hkwuZof|Zg!tTD(UD{{|6X=Q}vnXtQ^ocEADk=ak=Nv%AzhICWt(i^hNkbD z-AZNwCB+V2`-7!C%q@7HAIT(nF!ytR&JOHg&$4`f(m5qGZfPdFSc_H?&ZI1R9NM~T z69g~CtC^^ATf>_lP7MlV1Eq(4uybPDME{&jPUAzM7YO>h~D#HS>XB}*`6Hhia)YmihH5G&}@ciec@ zwj`a?`%uBx9zq_WO-f*e6-dB-YyOJDm199TCx#<|4($0Up_NWEfHf9a8{dxFc$bg- zm;UZE^0s!Q1@ke(aWw#Oz^{QnB%V*HQ!l(cD>1|$4qvPB3<5dRjiKH{RZn+4U*w4d zY&qy-;m0cv^mCOokj~xE{L8nywNd_>ABuS;9JxL{!xvy<0(^Rnbj>?(R7gLxj)%AC@3KsR91f zQQl7Lv9xKNY)GN1&4e7d%4MAu>M|Pso)&!hz!m#}^VZvd=eyWsG0R^$ZmuLpoDY$+ z7xK4z1eXjcVp6&$vH7{8ZX=ihpyP#!+yV2?uX}o>Q{J8Dqw?iw7hWN3_t9do5VpXm z{zlvi@J)b^mBJ2&ggs~0MA_Li1I-lO{85iq{>bOr;g|I+w?X>{5sivOy$DC?Z=j`? z1JCY3^X*v|Ryi%T6s_ucig%v+k>Q}&Q|(=|B=IJttjU8ars*%Ifc%m&m5+Z?onAau z4lPQOHF*5mGI8*tlU>E9mn*JJ+2tIEQ_?^U|4QxZ)r7fTE%7ifUcBfUZSc2uoUvnU zs?qd(sYYOf%KN0gk*~&MogzP-B*Tv>=a(2Pguj*+1PW za#QSchz61($%OdOcKy2v>T-xzrpX#8{+x8DGGIaP*#p{qHTYA7^$9};wmcH97_8sX z|EU)%A?=qD^JH=CBPQ@tpz9YM;_|R*sW>H{C%)g1;q)1ik}us|tndG0{Vm%>f!5#m zeTaK;_>C~y%P1Q@Ea-sBdwh*n!7Gel4+! z$$4AQhU1S6D_v1E9=ZfU9l7}!7ziX$j=DOB_iXJ2xMCRK^kL#pT**Y3OYgZSP1SIFCgwVfZ@)|4&VcDix zcMgr(_KL;v|0h0t`!6at>Jo%&tl?i{fpTVl@2~n6u#p8n&1UeVK+Ijgt_NChxei>* z)^88)SgAuHP857W2)2#zHPe*qa7fFWJjyrz#owyEx ze|DdOOw0!DFGPC~1jhoKJOV_@eF=Z_d3HwXzlv%v$kz;fO+KHW?3DF{`MvGxa3u!8 z%@Y73Am4MP=USs%PgHO( znelx#NU%%ju$ZjKB!mfY2*T4a?AE0p;d;EN6xn6 zFPVFT03cUQ?lZ0&Z1Q~90h~atI)t#vL&X@s`e6&Dn&83 z)IkD5FN#I&K@jWdV}bH^vz0nR>|b(o@{))+i#s5VP1d5?PD%gP@*b z$FrM4{C6zG|A)jXad_c?yH2%%arreqLE*$}n{WN-ino{CY#YZ*n9Q82$)g~#ytDNA z$$I(8Q_D-h4?;CFAP4{|LLXy+w`MdJc>MBwzKtpNrFVO0i&Ta}w8B|q%A<)|KLqqh z?T01^-n69-(b;=$zZA_LfV@FT0^VJrP*=KOZx76E?4Jt6YQ4^~I`@?UoF6d5AA5(I zC}^e3u0OItf;g{_w1>LacK%r4Sc26`=s#uoL=(WqPo9!G(?~3)?pZTTP=(QC4&i7j z19lf&D5-@l(_Ybq+-T!$)) zxd1i@9?Uf5t~ClAikpd%`uC^8QP6fI(x9S25G+XNI<7AkV}Yp~RMYHJEC0?4IQRma zXa%g{I2*(<)Lw~4K(K0qYd7|eGOmWPQyxkQa4JKU#auq2jw`w()t-;hR|dDdJuW=O zH5HRYjUYG{xLqyA0&_o~@p82(93wnlM_z;IEuY+8Zu)G{Z?Z&iM+Ht(=_mtFQlShK zQ&){Fmrn>+GA5}$2_cRF^pydEAY#UgB2>l#%UFWn9mL{tGm}B= z11TLGe6m)r05<4zD2pJ#_2sjty#|>@*cEfvD+q?DYubGI@_y)Ro0AY;Zw4A@_v(=Y z6Fy+$ishr{+#o?HASApfLS-zljx~1ww03C8*UGlp+tDrNveB7Xi#8?8Ly}JUo<)*;_In{$2B6 zVvUlE##kU=4rRL?P@dCB#%d)OfXL&Nmhksn>nT-Rdz4nsXM;-sgIGA3hEaXnG1RI*8Qm*5o@*%Wy0( zD~tuAM895j#sU=z*c=!GhUvI~_?YP4-?9DoukAO=4Iy>Vt^I0=P)vRQkTTnvZvun0 z8y|CF717iX`xJCKm!UXIX+a19v5`I{AuM&+X^Q*{ir!n|2hilfw3pyf%GE?mqf3O? z_cQ-yMjAv+24jKO7lW}t1tXa|-=7o82X(vsYU=_YO-NlKrh{a9QV_HS-m%8+$^_LQ zKo~hkHc>o>i-HEvCn0npLC$5&>ud63w|kSPLhOcX`DW!MIkaYq058e@=x3=D5fCBb zu|TCo5jf{?ymE?0GC2I{@3!6f;m6abAV_^;Ei;OYG?F3w>QlEc+7mZ}laVen5-?Q%ZUt3T17i`D=0qS-;5(PfwoIvxu&UXhAtlijiuqGgO z_`lqm-1WKf(a!C~N7vH+{f@aiaiU8a)Rg9j+l@tf+f*;img|$=pR_0LyPrMHfE(c|eG#{S*F&au;-BWxHuJh~rt-#ge4jTfiB7=3EEY78BnI zD;U>drDOJ00Sb#E%2>n9do?&PX5d_H#RkDEVX)zrAgpudy&UFc3891USIPqy#Puuh z(S#5}lIpL0akHOE1*%c@Qiv&2WDz>8e^1HimyZR8)c>5l8cptO3LST@#+|od{Ie)K zY!krO;I(m$u)Qn3Va=t~;lW>2|E%yYbWrMeF(;`WgqqUt_L>>mQWF!Z=4iG)HE_xE z_*h`>f8bsXIjTBg3j#pgY@?RR+dj3>)3bg1u|VH@HIC;f)E9uH^Ig^PZ4G{>B43+g7Q}aE vKX7WZ{~TBRRInP;OE*>Dw6fHp_Y3_4C5Hlc@4-ae00000NkvXXu0mjf-4q4( From 7c72c005e92bac62d6dfb6beb3b63d6caa1af88b Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Wed, 6 Nov 2019 13:10:20 -0800 Subject: [PATCH 71/83] Continue with 8 --- pages/emojis-functional-programming.tsx | 97 +++++++++++++++++++++---- 1 file changed, 84 insertions(+), 13 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index c5887a1d7..273d33fba 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -74,7 +74,19 @@ const tweetUrl = `https://twitter.com/intent/tweet?url=${encodeURIComponent( const Alert = (props: AlertProps) => ( - +

+ +
) @@ -192,7 +204,13 @@ const CodeBlock = ({ const [resultVisible, setResultVisible] = useState(defaultResultVisible) const buttonOnClick = () => setResultVisible(true) return ( - <> +
{caption && ( {resultVisible ? ( @@ -373,7 +402,7 @@ const CodeBlock = ({ margin-left: 0; } 50% { - margin-left: -0.5em; + margin-left: -0.25em; } 100% { margin-left: 0; @@ -390,7 +419,7 @@ const CodeBlock = ({
)} - +

) } @@ -559,7 +588,7 @@ export default () => { To help you track how far along you are in the article, I’ll show a “step” number above each subheading. There - are a total of {numSteps} steps in this article. + are a total of {numSteps} steps. If you decide to read later: I’d appreciate it if @@ -1287,7 +1316,7 @@ sushi => 'pizza'`} the result be?{' '} Try to guess before pressing the {' '} - button! + button.

b => a(a(a(b)))) Now that we’ve covered the basics of Church numerals, we’ll talk next about why Church numerals are interesting.

- + You can do maths with functions +

+ Church numerals are interesting because{' '} + they let you do maths with functions. First, take + a look at this function: +

+ {`sushi => sandwich => pizza => + sandwich( + sushi(sandwich)(pizza) + )`} +

+ It looks pretty complicated, but don’t worry too much. Now, + suppose that: +

+
    + + We apply the above function to the Church numeral zero ( has the + pattern a => b => b), and + + + Run convert() on it. What would the + result be? + +
+

+ Let’s take a look.{' '} + + Try to guess before pressing the {' '} + button! + +

+ {`// Function from the above +const f = sushi => sandwich => pizza => + sandwich( + sushi(sandwich)(pizza) + ) + +// Church numeral zero +const zero = chicken => salad => salad + +// What happens when you apply f to zero, +// and convert it? +convert(f(zero))`} From 78d1f139484e6c956a3936dc736a404723ea46f0 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Wed, 6 Nov 2019 13:22:48 -0800 Subject: [PATCH 72/83] Continue with 8 --- pages/emojis-functional-programming.tsx | 31 +++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 273d33fba..26d6b220c 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -173,7 +173,7 @@ const InlineCode = ({ }) => ( b => a(a(a(b)))) pattern a => b => b), and
- Run convert() on it. What would the - result be? + Run convert() (from earlier) on it. + What would the result be?

@@ -1528,6 +1528,29 @@ const zero = chicken => salad => salad // What happens when you apply f to zero, // and convert it? convert(f(zero))`} +

+ The result is 1, which is 1 greater than + the input Church numeral, which was 0. + Basically, 0 became{' '} + 1. +

+

+ Here’s the secret:{' '} + + This function we used actually adds 1 to the input + church numeral. + {' '} + When you apply this function to a Church numeral, it returns a{' '} + new Church numeral that’s 1 greater than before. +

+ {`// If we apply this function to a +// Church numeral, it returns a new +// Church numeral that’s greater by 1. +const f = sushi => sandwich => pizza => + sandwich( + sushi(sandwich)(pizza) + )`} +

You can try out more examples to verify this:

From 362ab787d4ed8749e123b647890da5c120178012 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Wed, 6 Nov 2019 13:49:59 -0800 Subject: [PATCH 73/83] Wordsmith --- pages/emojis-functional-programming.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 26d6b220c..8f322fbd4 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -763,7 +763,8 @@ sushi => sushi`} Y Combinator for Non-programmers - )—without showing any code. + )—without showing any code. I could have used letters instead of + emojis, but emojis are less scary-looking for non-programers.

Another example From 9a4435ffc1aa92155bdbe0d27067f2d2f9c9119c Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Wed, 6 Nov 2019 18:16:56 -0800 Subject: [PATCH 74/83] Continue with 8 --- pages/emojis-functional-programming.tsx | 75 +- scripts/lib/initialExpressionContainers.ts | 10 + scripts/lib/runnerConfigs.ts | 36 + src/components/ExpressionRunnerSeparator.tsx | 10 +- src/components/H.tsx | 5 +- src/components/Runners/Afxj.tsx | 12 + src/components/Runners/Hfgh.tsx | 12 + src/components/Runners/Qyhn.tsx | 12 + src/components/Runners/Uxno.tsx | 12 + src/components/Runners/fakeIndex.ts | 4 + src/components/Runners/index.ts | 4 + src/lib/runners/afxj.json | 2644 ++++++++++++++++++ src/lib/runners/hfgh.json | 86 + src/lib/runners/qyhn.json | 147 + src/lib/runners/uxno.json | 108 + 15 files changed, 3170 insertions(+), 7 deletions(-) create mode 100644 src/components/Runners/Afxj.tsx create mode 100644 src/components/Runners/Hfgh.tsx create mode 100644 src/components/Runners/Qyhn.tsx create mode 100644 src/components/Runners/Uxno.tsx create mode 100644 src/lib/runners/afxj.json create mode 100644 src/lib/runners/hfgh.json create mode 100644 src/lib/runners/qyhn.json create mode 100644 src/lib/runners/uxno.json diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 8f322fbd4..e6ba93347 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -15,6 +15,7 @@ import EmojiForLetter from 'src/components/EmojiForLetter' import EpisodeHero from 'src/components/EpisodeHero' import InlinePrioritiesLabel from 'src/components/InlinePrioritiesLabel' import EpisodePageFooter from 'src/components/EpisodePageFooter' +import EmojiNumber from 'src/components/EmojiNumber' import CustomEmoji from 'src/components/CustomEmoji' import ButtonWithTouchActiveStates from 'src/components/ButtonWithTouchActiveStates' import * as R from 'src/components/Runners' @@ -1456,7 +1457,9 @@ a => b => a(a(a(b)))) {' '} Try pressing it.

- + + +

Other Church numeral functions can also be represented using emoji puzzles, and they can be converted as well. Of course, the emojis @@ -1552,6 +1555,76 @@ const f = sushi => sandwich => pizza => sushi(sandwich)(pizza) )`}

You can try out more examples to verify this:

+ {`// Church numeral one +const one = chicken => salad => + chicken(salad) + +convert(f(one))`} + {`// Church numeral two +const two = chicken => salad => + chicken(chicken(salad)) + +convert(f(two))`} +

+ This is what I mean by “ + doing maths with functions”: +

+
    + + You can calcultate someNumber + 1… + + + By using a Church numeral function that can be converted to{' '} + someNumber… + + + And the function f we saw earlier. + +
+

+ + Now, let’s see if we can explain this to non-programmers using + emoji puzzles. + {' '} + First, here’s an emoji puzzle representation of the Church numeral{' '} + 0. You can confirm that it can be converted to{' '} + by pressing the button. +

+ + Represents: +
+ chicken => sandwich => sandwich +
+ (Church numeral 0) +
+

+ And here’s the function f we saw earlier, + represented as an emoji puzzle: +

+ {`const f = sushi => sandwich => pizza => + sandwich( + sushi(sandwich)(pizza) + )`} + + Equivalent emoji puzzle: +

+ Let’s apply f to the Church numeral{' '} + 0. To do that, we just combine the above two emoji + puzzles and run it. +

+ Combined the above two emoji puzzles +

+ The result is equivalent to{' '} + sandwich => pizza => sandwich(pizza), + which is Church numeral 1. +

+ + Represents: +
+ sandwich => pizza => sandwich(pizza) +
+ (Church numeral 1) +
diff --git a/scripts/lib/initialExpressionContainers.ts b/scripts/lib/initialExpressionContainers.ts index 79ba2ee99..c89c92185 100644 --- a/scripts/lib/initialExpressionContainers.ts +++ b/scripts/lib/initialExpressionContainers.ts @@ -363,6 +363,7 @@ export const jpac = initializeExpressionContainer( ) export const xvjz = initializeExpressionContainer(numberParams('f', 'g', 0)) +export const yqiv = initializeExpressionContainer(numberParams('d', 'h', 0)) const yCombinator: FunctionExpressionParams = { arg: 'a', @@ -2217,6 +2218,15 @@ export const ntes = initializeExpressionContainer(numberParams('c', 'd', 1)) export const tgxv = initializeExpressionContainer(numberParams('g', 'h', 3)) +export const nzne = initializeExpressionContainer(numberParams('b', 'f', 1)) + +export const hgjl = initializeExpressionContainer(succParams('a', 'b', 'f')) + +export const psen = initializeExpressionContainer([ + succParams('a', 'b', 'f'), + numberParams('d', 'h', 0) +]) + export const jxur = initializeExpressionContainer([ succParams('a', 'b', 'c'), [succParams('a', 'b', 'c'), numberParams('d', 'e', 2)] diff --git a/scripts/lib/runnerConfigs.ts b/scripts/lib/runnerConfigs.ts index 9fb283ed6..d29f0d234 100644 --- a/scripts/lib/runnerConfigs.ts +++ b/scripts/lib/runnerConfigs.ts @@ -723,6 +723,42 @@ export const jarm: ExpressionRunnerShorthandConfig = { initialExpressionContainer: initialExpressionContainers.mzxw } +export const afxj: ExpressionRunnerShorthandConfig = { + runner: 'runButtonOnly', + showPriorities: true, + skipToTheEnd: false, + initialExpressionContainer: initialExpressionContainers.psen, + applicativeOrder: true, + speed: 1.25 +} + +export const uxno: ExpressionRunnerShorthandConfig = { + runner: 'predefined', + showPriorities: true, + initialExpressionContainers: [ + initialExpressionContainers.nzne, + initialExpressionContainers.ntua + ], + convert: 'toMathBox' +} + +export const qyhn: ExpressionRunnerShorthandConfig = { + runner: 'simple', + showPriorities: true, + initialExpressionContainer: initialExpressionContainers.hgjl, + applicativeOrder: true +} + +export const hfgh: ExpressionRunnerShorthandConfig = { + runner: 'predefined', + showPriorities: true, + initialExpressionContainers: [ + initialExpressionContainers.yqiv, + initialExpressionContainers.irhr + ], + convert: 'toMathBox' +} + export const jjjh: ExpressionRunnerShorthandConfig = { runner: 'predefined', initialExpressionContainers: [ diff --git a/src/components/ExpressionRunnerSeparator.tsx b/src/components/ExpressionRunnerSeparator.tsx index 985bca3d1..152aa25b2 100644 --- a/src/components/ExpressionRunnerSeparator.tsx +++ b/src/components/ExpressionRunnerSeparator.tsx @@ -5,16 +5,20 @@ import CustomEmoji from 'src/components/CustomEmoji' const ExpressionRunnerSeparator = ({ blank, - halfMargin + halfMargin, + halfMarginBottom, + halfMarginTop }: { blank?: boolean halfMargin?: boolean + halfMarginBottom?: boolean + halfMarginTop?: boolean }) => (
{!blank && } diff --git a/src/components/H.tsx b/src/components/H.tsx index d86ca4320..5dd732830 100644 --- a/src/components/H.tsx +++ b/src/components/H.tsx @@ -1422,8 +1422,7 @@ const H = ({ args, highlightType, episodeNumberOverrides }: HProps) => { if (locale === 'en') { return ( <> - {args.lowerCase ? 'c' : 'C'}onvert to a Number{' '} - 🔢 + {args.lowerCase ? 'c' : 'C'}onvert to a Number ) } else { @@ -1434,7 +1433,7 @@ const H = ({ args, highlightType, episodeNumberOverrides }: HProps) => { if (locale === 'en') { return ( - Undo + Reset ) } else { diff --git a/src/components/Runners/Afxj.tsx b/src/components/Runners/Afxj.tsx new file mode 100644 index 000000000..79d66bdb2 --- /dev/null +++ b/src/components/Runners/Afxj.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/afxj.json' + +const Afxj = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Afxj diff --git a/src/components/Runners/Hfgh.tsx b/src/components/Runners/Hfgh.tsx new file mode 100644 index 000000000..b75d6bc6d --- /dev/null +++ b/src/components/Runners/Hfgh.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/hfgh.json' + +const Hfgh = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Hfgh diff --git a/src/components/Runners/Qyhn.tsx b/src/components/Runners/Qyhn.tsx new file mode 100644 index 000000000..458234d55 --- /dev/null +++ b/src/components/Runners/Qyhn.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/qyhn.json' + +const Qyhn = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Qyhn diff --git a/src/components/Runners/Uxno.tsx b/src/components/Runners/Uxno.tsx new file mode 100644 index 000000000..688481b3b --- /dev/null +++ b/src/components/Runners/Uxno.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/uxno.json' + +const Uxno = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Uxno diff --git a/src/components/Runners/fakeIndex.ts b/src/components/Runners/fakeIndex.ts index 7ee8e1324..bfadb068e 100644 --- a/src/components/Runners/fakeIndex.ts +++ b/src/components/Runners/fakeIndex.ts @@ -100,6 +100,10 @@ export { default as Rqjo } from 'src/components/FakeRunner' export { default as Sgfj } from 'src/components/FakeRunner' export { default as Hehx } from 'src/components/FakeRunner' export { default as Jarm } from 'src/components/FakeRunner' +export { default as Afxj } from 'src/components/FakeRunner' +export { default as Uxno } from 'src/components/FakeRunner' +export { default as Qyhn } from 'src/components/FakeRunner' +export { default as Hfgh } from 'src/components/FakeRunner' export { default as Jjjh } from 'src/components/FakeRunner' export { default as Dwzy } from 'src/components/FakeRunner' export { default as Mifg } from 'src/components/FakeRunner' diff --git a/src/components/Runners/index.ts b/src/components/Runners/index.ts index 2c17538f8..471d71809 100644 --- a/src/components/Runners/index.ts +++ b/src/components/Runners/index.ts @@ -100,6 +100,10 @@ export { default as Rqjo } from 'src/components/Runners/Rqjo' export { default as Sgfj } from 'src/components/Runners/Sgfj' export { default as Hehx } from 'src/components/Runners/Hehx' export { default as Jarm } from 'src/components/Runners/Jarm' +export { default as Afxj } from 'src/components/Runners/Afxj' +export { default as Uxno } from 'src/components/Runners/Uxno' +export { default as Qyhn } from 'src/components/Runners/Qyhn' +export { default as Hfgh } from 'src/components/Runners/Hfgh' export { default as Jjjh } from 'src/components/Runners/Jjjh' export { default as Dwzy } from 'src/components/Runners/Dwzy' export { default as Mifg } from 'src/components/Runners/Mifg' diff --git a/src/lib/runners/afxj.json b/src/lib/runners/afxj.json new file mode 100644 index 000000000..27392d244 --- /dev/null +++ b/src/lib/runners/afxj.json @@ -0,0 +1,2644 @@ +{ + "expressionContainers": [ + { + "expression": { + "arg": { + "arg": { + "name": "d", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "a", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 3 + }, + "numLeafNodes": 5, + "containerState": "ready", + "previouslyChangedExpressionState": "default" + }, + { + "expression": { + "arg": { + "arg": { + "name": "d", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "a", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "state": "active", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 3 + }, + "previouslyChangedExpressionState": "active", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 5 + }, + { + "expression": { + "arg": { + "arg": { + "name": "d", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "a", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "state": "showFuncUnbound", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 3 + }, + "previouslyChangedExpressionState": "showFuncUnbound", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 5 + }, + { + "expression": { + "arg": { + "arg": { + "name": "d", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "highlighted", + "topLeftBadgeType": "match", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "highlighted", + "topLeftBadgeType": "unmatch", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "highlighted", + "topLeftBadgeType": "unmatch", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "a", + "highlightType": "highlighted", + "topLeftBadgeType": "match", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "highlighted", + "topLeftBadgeType": "unmatch", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "state": "betaReducePreviewBefore", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 3 + }, + "previouslyChangedExpressionState": "betaReducePreviewBefore", + "matchExists": true, + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 5 + }, + { + "expression": { + "arg": { + "arg": { + "name": "d", + "highlightType": "betaReduceCallArgHighlighted", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "betaReduceCallArgHighlighted", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "h", + "highlightType": "betaReduceCallArgHighlighted", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "d", + "highlightType": "highlighted", + "topLeftBadgeType": "betaReduced", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "highlighted", + "topLeftBadgeType": "betaReduced", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "h", + "highlightType": "highlighted", + "topLeftBadgeType": "betaReduced", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "func": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "type": "function", + "maxNestedFunctionDepth": 4 + }, + "type": "function", + "maxNestedFunctionDepth": 5 + }, + "state": "betaReducePreviewAfter", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 5 + }, + "previouslyChangedExpressionState": "betaReducePreviewAfter", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 5 + }, + { + "expression": { + "arg": { + "arg": { + "name": "d", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "h", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "d", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "func": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "type": "function", + "maxNestedFunctionDepth": 4 + }, + "type": "function", + "maxNestedFunctionDepth": 5 + }, + "state": "betaReducePreviewCrossed", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 5 + }, + "previouslyChangedExpressionState": "betaReducePreviewCrossed", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 5 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "d", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "type": "function", + "maxNestedFunctionDepth": 4 + }, + "previouslyChangedExpressionState": "default", + "activePriority": 1, + "containerState": "ready", + "numLeafNodes": 4 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "d", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "active", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "type": "function", + "maxNestedFunctionDepth": 4 + }, + "previouslyChangedExpressionState": "active", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 4 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "d", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "showFuncUnbound", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "type": "function", + "maxNestedFunctionDepth": 4 + }, + "previouslyChangedExpressionState": "showFuncUnbound", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 4 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "d", + "highlightType": "highlighted", + "topLeftBadgeType": "unmatch", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "h", + "highlightType": "highlighted", + "topLeftBadgeType": "unmatch", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "betaReducePreviewBefore", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "type": "function", + "maxNestedFunctionDepth": 4 + }, + "previouslyChangedExpressionState": "betaReducePreviewBefore", + "matchExists": false, + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 4 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "d", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "betaReducePreviewCrossed", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "type": "function", + "maxNestedFunctionDepth": 4 + }, + "previouslyChangedExpressionState": "betaReducePreviewCrossed", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 4 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1, + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "previouslyChangedExpressionState": "default", + "activePriority": 1, + "containerState": "ready", + "numLeafNodes": 3 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1, + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "active", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "previouslyChangedExpressionState": "active", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 3 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1, + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "showFuncBound", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "previouslyChangedExpressionState": "showFuncBound", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 3 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1, + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "h", + "highlightType": "highlighted", + "topLeftBadgeType": "match", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "h", + "highlightType": "highlighted", + "topLeftBadgeType": "match", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "betaReducePreviewBefore", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "previouslyChangedExpressionState": "betaReducePreviewBefore", + "matchExists": true, + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 3 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "betaReduceCallArgHighlighted", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1, + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "highlighted", + "topLeftBadgeType": "betaReduced", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "betaReducePreviewAfter", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "previouslyChangedExpressionState": "betaReducePreviewAfter", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 3 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1, + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "h", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "betaReducePreviewCrossed", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "previouslyChangedExpressionState": "betaReducePreviewCrossed", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 3 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "previouslyChangedExpressionState": "default", + "activePriority": 1, + "containerState": "done", + "numLeafNodes": 2 + } + ], + "speed": 1, + "hideControls": false, + "explanationsVisibility": "hiddenInitialPausedOnly", + "hidePriorities": false, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": false, + "hideFuncUnboundBadgeOnExplanation": true, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "showBottomProgressBar": false +} diff --git a/src/lib/runners/hfgh.json b/src/lib/runners/hfgh.json new file mode 100644 index 000000000..289df6f87 --- /dev/null +++ b/src/lib/runners/hfgh.json @@ -0,0 +1,86 @@ +{ + "expressionContainers": [ + { + "expression": { + "arg": { + "name": "d", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "numLeafNodes": 1, + "containerState": "ready", + "previouslyChangedExpressionState": "default" + }, + { + "expression": { + "name": "shorthandNumber", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "shorthandNumber": 0, + "maxNestedFunctionDepth": 0 + }, + "numLeafNodes": 1, + "containerState": "done", + "previouslyChangedExpressionState": "default" + } + ], + "speed": 1, + "hideControls": false, + "explanationsVisibility": "hiddenInitialPausedOnly", + "hidePriorities": false, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": true, + "hideFuncUnboundBadgeOnExplanation": false, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "convert": "toMathBox", + "showBottomProgressBar": false +} diff --git a/src/lib/runners/qyhn.json b/src/lib/runners/qyhn.json new file mode 100644 index 000000000..80b629fab --- /dev/null +++ b/src/lib/runners/qyhn.json @@ -0,0 +1,147 @@ +{ + "expressionContainers": [ + { + "expression": { + "arg": { + "name": "a", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "a", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "numLeafNodes": 4, + "containerState": "ready", + "previouslyChangedExpressionState": "default" + } + ], + "speed": 1, + "hideControls": true, + "explanationsVisibility": "hidden", + "hidePriorities": false, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": false, + "hideFuncUnboundBadgeOnExplanation": false, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "showBottomProgressBar": false +} diff --git a/src/lib/runners/uxno.json b/src/lib/runners/uxno.json new file mode 100644 index 000000000..02aef1254 --- /dev/null +++ b/src/lib/runners/uxno.json @@ -0,0 +1,108 @@ +{ + "expressionContainers": [ + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "numLeafNodes": 2, + "containerState": "ready", + "previouslyChangedExpressionState": "default" + }, + { + "expression": { + "name": "shorthandNumber", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "shorthandNumber": 1, + "maxNestedFunctionDepth": 0 + }, + "numLeafNodes": 1, + "containerState": "done", + "previouslyChangedExpressionState": "default" + } + ], + "speed": 1, + "hideControls": false, + "explanationsVisibility": "hiddenInitialPausedOnly", + "hidePriorities": false, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": true, + "hideFuncUnboundBadgeOnExplanation": false, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "convert": "toMathBox", + "showBottomProgressBar": false +} From be2ade6f89cbf913bf10d77d6bc474ac9bf4e101 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Wed, 6 Nov 2019 20:12:22 -0800 Subject: [PATCH 75/83] Finish 8 --- pages/emojis-functional-programming.tsx | 92 +- scripts/lib/initialExpressionContainers.ts | 23 + scripts/lib/runnerConfigs.ts | 44 + src/components/H.tsx | 10 +- src/components/Runners/Dvio.tsx | 12 + src/components/Runners/Egka.tsx | 12 + src/components/Runners/Kqtz.tsx | 12 + src/components/Runners/Pjih.tsx | 12 + src/components/Runners/Yfwq.tsx | 12 + src/components/Runners/fakeIndex.ts | 5 + src/components/Runners/index.ts | 5 + src/components/VariableExpressionBox.tsx | 5 +- src/lib/runners/afxj.json | 2 +- src/lib/runners/dvio.json | 129 + src/lib/runners/egka.json | 3251 ++++++++++++++++++++ src/lib/runners/kqtz.json | 171 + src/lib/runners/pjih.json | 171 + src/lib/runners/yfwq.json | 108 + 18 files changed, 4069 insertions(+), 7 deletions(-) create mode 100644 src/components/Runners/Dvio.tsx create mode 100644 src/components/Runners/Egka.tsx create mode 100644 src/components/Runners/Kqtz.tsx create mode 100644 src/components/Runners/Pjih.tsx create mode 100644 src/components/Runners/Yfwq.tsx create mode 100644 src/lib/runners/dvio.json create mode 100644 src/lib/runners/egka.json create mode 100644 src/lib/runners/kqtz.json create mode 100644 src/lib/runners/pjih.json create mode 100644 src/lib/runners/yfwq.json diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index e6ba93347..bffc03961 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -1585,7 +1585,9 @@ convert(f(two))`} Now, let’s see if we can explain this to non-programmers using emoji puzzles. - {' '} + +

+

First, here’s an emoji puzzle representation of the Church numeral{' '} 0. You can confirm that it can be converted to{' '} by pressing the button. @@ -1593,7 +1595,7 @@ convert(f(two))`} Represents:
- chicken => sandwich => sandwich + chicken => salad => salad
(Church numeral 0)
@@ -1625,6 +1627,92 @@ convert(f(two))`}
(Church numeral 1) + +

+ What just happened: An emoji puzzle that can be + converted to became a puzzle that can + be converted to . +

+ + + +

+ In other words:{' '} + + We can use an emoji puzzle to calculate{' '} + someNumber + 1, in a way that’s + equivalent to using Church numeral functions in JS. + +

+ + +

+ More examples (optional read): Let’s see if we can + calculate 1 + 1 = 2 using the same method. Here’s an emoji + puzzle that can be converted to : +

+ + Represents: +
+ chicken => salad => chicken(salad) +
+ (Church numeral 1) +
+

+ And let’s combine it with the earlier emoji puzzle and run it.{' '} + +

+ +

+ The result is equivalent to Church numeral 2 and + can be converted to . +

+ + Church numeral 2 + +

+ So, it successfully calculated 1 + 1 = 2! Again, this is what + just happened: +

+ + + +
+ +

+ Side Note (optional read): What we saw was an + example of higher-order functions, one of the core + concepts of functional programming. +

+

+ A higher-order function is{' '} + + a function that takes a function or returns a function + + . The function we used earlier that calculates{' '} + someNumber + 1 was a higher-order + function because: +

+
    + It takes a Church numeral, which is a function + + It returns a new Church numeral that’s greater by 1, which is + also a function. + +
+

+ And as we just saw, higher-order functions can be taught to + non-programmers using emoji puzzles! +

+
diff --git a/scripts/lib/initialExpressionContainers.ts b/scripts/lib/initialExpressionContainers.ts index c89c92185..30cbc3b82 100644 --- a/scripts/lib/initialExpressionContainers.ts +++ b/scripts/lib/initialExpressionContainers.ts @@ -364,6 +364,7 @@ export const jpac = initializeExpressionContainer( export const xvjz = initializeExpressionContainer(numberParams('f', 'g', 0)) export const yqiv = initializeExpressionContainer(numberParams('d', 'h', 0)) +export const aeoc = initializeExpressionContainer(numberParams('d', 'h', 1)) const yCombinator: FunctionExpressionParams = { arg: 'a', @@ -2219,6 +2220,7 @@ export const ntes = initializeExpressionContainer(numberParams('c', 'd', 1)) export const tgxv = initializeExpressionContainer(numberParams('g', 'h', 3)) export const nzne = initializeExpressionContainer(numberParams('b', 'f', 1)) +export const fkvc = initializeExpressionContainer(numberParams('b', 'f', 2)) export const hgjl = initializeExpressionContainer(succParams('a', 'b', 'f')) @@ -2227,6 +2229,27 @@ export const psen = initializeExpressionContainer([ numberParams('d', 'h', 0) ]) +export const dzod = initializeExpressionContainer([ + succParams('a', 'b', 'f'), + numberParams('d', 'h', 1) +]) + +export const nhmt = initializeExpressionContainer([ + succParams('a', 'b', 'f'), + { + shorthandNumber: 0, + shorthandNumberAfterConvert: 'number' + } +]) + +export const sjbn = initializeExpressionContainer([ + succParams('a', 'b', 'f'), + { + shorthandNumber: 1, + shorthandNumberAfterConvert: 'number' + } +]) + export const jxur = initializeExpressionContainer([ succParams('a', 'b', 'c'), [succParams('a', 'b', 'c'), numberParams('d', 'e', 2)] diff --git a/scripts/lib/runnerConfigs.ts b/scripts/lib/runnerConfigs.ts index d29f0d234..3b8d25c68 100644 --- a/scripts/lib/runnerConfigs.ts +++ b/scripts/lib/runnerConfigs.ts @@ -723,6 +723,20 @@ export const jarm: ExpressionRunnerShorthandConfig = { initialExpressionContainer: initialExpressionContainers.mzxw } +export const pjih: ExpressionRunnerShorthandConfig = { + runner: 'simple', + showPriorities: true, + initialExpressionContainer: initialExpressionContainers.nhmt, + applicativeOrder: true +} + +export const kqtz: ExpressionRunnerShorthandConfig = { + runner: 'simple', + showPriorities: true, + initialExpressionContainer: initialExpressionContainers.sjbn, + applicativeOrder: true +} + export const afxj: ExpressionRunnerShorthandConfig = { runner: 'runButtonOnly', showPriorities: true, @@ -732,6 +746,15 @@ export const afxj: ExpressionRunnerShorthandConfig = { speed: 1.25 } +export const egka: ExpressionRunnerShorthandConfig = { + runner: 'runButtonOnly', + showPriorities: true, + skipToTheEnd: false, + initialExpressionContainer: initialExpressionContainers.dzod, + applicativeOrder: true, + speed: 1.25 +} + export const uxno: ExpressionRunnerShorthandConfig = { runner: 'predefined', showPriorities: true, @@ -742,6 +765,17 @@ export const uxno: ExpressionRunnerShorthandConfig = { convert: 'toMathBox' } +export const dvio: ExpressionRunnerShorthandConfig = { + runner: 'predefined', + showPriorities: true, + initialExpressionContainers: [ + initialExpressionContainers.fkvc, + initialExpressionContainers.hdpc + ], + convert: 'toMathBox', + applicativeOrder: true +} + export const qyhn: ExpressionRunnerShorthandConfig = { runner: 'simple', showPriorities: true, @@ -759,6 +793,16 @@ export const hfgh: ExpressionRunnerShorthandConfig = { convert: 'toMathBox' } +export const yfwq: ExpressionRunnerShorthandConfig = { + runner: 'predefined', + showPriorities: true, + initialExpressionContainers: [ + initialExpressionContainers.aeoc, + initialExpressionContainers.ntua + ], + convert: 'toMathBox' +} + export const jjjh: ExpressionRunnerShorthandConfig = { runner: 'predefined', initialExpressionContainers: [ diff --git a/src/components/H.tsx b/src/components/H.tsx index 5dd732830..7d27215ab 100644 --- a/src/components/H.tsx +++ b/src/components/H.tsx @@ -139,11 +139,10 @@ interface HProps { | { name: 'convertToMathbox'; lowerCase?: true } | { name: 'undoConvertToMathbox' } | { name: 'doneConvertToMathbox' } - | { name: 'canBeConverted' } | { name: 'convertToChurchNumeral'; lowerCase?: true } | { name: 'undoConvertToChurchNumeral' } | { name: 'doneConvertToChurchNumeral' } - | { name: 'canBeConverted' } + | { name: 'canBeConverted'; emojiPuzzle?: true } | { name: 'plusOneFeature'; capitalize?: true } | { name: 'minusOneFeature'; capitalize?: true; addNewline?: true } | { name: 'repeatFeature'; capitalize?: true; addNewline?: true } @@ -1455,7 +1454,12 @@ const H = ({ args, highlightType, episodeNumberOverrides }: HProps) => { } if (args.name === 'canBeConverted') { if (locale === 'en') { - return <>Lunchbox that can be converted to + return ( + <> + {args.emojiPuzzle ? 'Emoji puzzle' : 'Lunchbox'} that can be converted + to + + ) } else { return <>に変換できる弁当箱 } diff --git a/src/components/Runners/Dvio.tsx b/src/components/Runners/Dvio.tsx new file mode 100644 index 000000000..36fe2cb2d --- /dev/null +++ b/src/components/Runners/Dvio.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/dvio.json' + +const Dvio = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Dvio diff --git a/src/components/Runners/Egka.tsx b/src/components/Runners/Egka.tsx new file mode 100644 index 000000000..b9f418191 --- /dev/null +++ b/src/components/Runners/Egka.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/egka.json' + +const Egka = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Egka diff --git a/src/components/Runners/Kqtz.tsx b/src/components/Runners/Kqtz.tsx new file mode 100644 index 000000000..e9aeb4c18 --- /dev/null +++ b/src/components/Runners/Kqtz.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/kqtz.json' + +const Kqtz = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Kqtz diff --git a/src/components/Runners/Pjih.tsx b/src/components/Runners/Pjih.tsx new file mode 100644 index 000000000..96806f6f3 --- /dev/null +++ b/src/components/Runners/Pjih.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/pjih.json' + +const Pjih = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Pjih diff --git a/src/components/Runners/Yfwq.tsx b/src/components/Runners/Yfwq.tsx new file mode 100644 index 000000000..a00316ec2 --- /dev/null +++ b/src/components/Runners/Yfwq.tsx @@ -0,0 +1,12 @@ +import React from 'react' +import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' +import config from 'src/lib/runners/yfwq.json' + +const Yfwq = ({ children }: { children?: React.ReactNode }) => ( + // @ts-ignore + + {children} + +) + +export default Yfwq diff --git a/src/components/Runners/fakeIndex.ts b/src/components/Runners/fakeIndex.ts index bfadb068e..785487a00 100644 --- a/src/components/Runners/fakeIndex.ts +++ b/src/components/Runners/fakeIndex.ts @@ -100,10 +100,15 @@ export { default as Rqjo } from 'src/components/FakeRunner' export { default as Sgfj } from 'src/components/FakeRunner' export { default as Hehx } from 'src/components/FakeRunner' export { default as Jarm } from 'src/components/FakeRunner' +export { default as Pjih } from 'src/components/FakeRunner' +export { default as Kqtz } from 'src/components/FakeRunner' export { default as Afxj } from 'src/components/FakeRunner' +export { default as Egka } from 'src/components/FakeRunner' export { default as Uxno } from 'src/components/FakeRunner' +export { default as Dvio } from 'src/components/FakeRunner' export { default as Qyhn } from 'src/components/FakeRunner' export { default as Hfgh } from 'src/components/FakeRunner' +export { default as Yfwq } from 'src/components/FakeRunner' export { default as Jjjh } from 'src/components/FakeRunner' export { default as Dwzy } from 'src/components/FakeRunner' export { default as Mifg } from 'src/components/FakeRunner' diff --git a/src/components/Runners/index.ts b/src/components/Runners/index.ts index 471d71809..5032fa7b5 100644 --- a/src/components/Runners/index.ts +++ b/src/components/Runners/index.ts @@ -100,10 +100,15 @@ export { default as Rqjo } from 'src/components/Runners/Rqjo' export { default as Sgfj } from 'src/components/Runners/Sgfj' export { default as Hehx } from 'src/components/Runners/Hehx' export { default as Jarm } from 'src/components/Runners/Jarm' +export { default as Pjih } from 'src/components/Runners/Pjih' +export { default as Kqtz } from 'src/components/Runners/Kqtz' export { default as Afxj } from 'src/components/Runners/Afxj' +export { default as Egka } from 'src/components/Runners/Egka' export { default as Uxno } from 'src/components/Runners/Uxno' +export { default as Dvio } from 'src/components/Runners/Dvio' export { default as Qyhn } from 'src/components/Runners/Qyhn' export { default as Hfgh } from 'src/components/Runners/Hfgh' +export { default as Yfwq } from 'src/components/Runners/Yfwq' export { default as Jjjh } from 'src/components/Runners/Jjjh' export { default as Dwzy } from 'src/components/Runners/Dwzy' export { default as Mifg } from 'src/components/Runners/Mifg' diff --git a/src/components/VariableExpressionBox.tsx b/src/components/VariableExpressionBox.tsx index 423f03ad1..6f72a42c1 100644 --- a/src/components/VariableExpressionBox.tsx +++ b/src/components/VariableExpressionBox.tsx @@ -18,6 +18,7 @@ import { ExpressionRunnerContextProps } from 'src/types/ExpressionRunnerTypes' import CustomEmoji, { customEmojiToComponent } from 'src/components/CustomEmoji' import locale from 'src/lib/locale' import VariableShadeContext from 'src/components/VariableShadeContext' +import ExpressionRunnerConfigContext from './ExpressionRunnerConfigContext' interface VariableExpressionBoxProps { expression: VariableExpression @@ -53,6 +54,7 @@ const VariableEmoji = ({ expression }: VariableExpressionBoxProps) => { bottomRightBadgeOverrides, variableSize } = useContext(ExpressionRunnerContext) + const { churchNumerals } = useContext(ExpressionRunnerConfigContext) if (expression.shorthandNumberAfterConvert) { return ( @@ -73,7 +75,8 @@ const VariableEmoji = ({ expression }: VariableExpressionBoxProps) => { > diff --git a/src/lib/runners/afxj.json b/src/lib/runners/afxj.json index 27392d244..adf1a28e9 100644 --- a/src/lib/runners/afxj.json +++ b/src/lib/runners/afxj.json @@ -2627,7 +2627,7 @@ "numLeafNodes": 2 } ], - "speed": 1, + "speed": 1.25, "hideControls": false, "explanationsVisibility": "hiddenInitialPausedOnly", "hidePriorities": false, diff --git a/src/lib/runners/dvio.json b/src/lib/runners/dvio.json new file mode 100644 index 000000000..303b62571 --- /dev/null +++ b/src/lib/runners/dvio.json @@ -0,0 +1,129 @@ +{ + "expressionContainers": [ + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1, + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "numLeafNodes": 3, + "containerState": "ready", + "previouslyChangedExpressionState": "default" + }, + { + "expression": { + "name": "shorthandNumber", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "shorthandNumber": 2, + "maxNestedFunctionDepth": 0 + }, + "numLeafNodes": 1, + "containerState": "done", + "previouslyChangedExpressionState": "default" + } + ], + "speed": 1, + "hideControls": false, + "explanationsVisibility": "hiddenInitialPausedOnly", + "hidePriorities": false, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": true, + "hideFuncUnboundBadgeOnExplanation": false, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "convert": "toMathBox", + "showBottomProgressBar": false +} diff --git a/src/lib/runners/egka.json b/src/lib/runners/egka.json new file mode 100644 index 000000000..69eb8fccc --- /dev/null +++ b/src/lib/runners/egka.json @@ -0,0 +1,3251 @@ +{ + "expressionContainers": [ + { + "expression": { + "arg": { + "arg": { + "name": "d", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "d", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "a", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 3 + }, + "numLeafNodes": 6, + "containerState": "ready", + "previouslyChangedExpressionState": "default" + }, + { + "expression": { + "arg": { + "arg": { + "name": "d", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "d", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "a", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "state": "active", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 3 + }, + "previouslyChangedExpressionState": "active", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 6 + }, + { + "expression": { + "arg": { + "arg": { + "name": "d", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "d", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "a", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "state": "showFuncUnbound", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 3 + }, + "previouslyChangedExpressionState": "showFuncUnbound", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 6 + }, + { + "expression": { + "arg": { + "arg": { + "name": "d", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "d", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "highlighted", + "topLeftBadgeType": "match", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "highlighted", + "topLeftBadgeType": "unmatch", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "highlighted", + "topLeftBadgeType": "unmatch", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "a", + "highlightType": "highlighted", + "topLeftBadgeType": "match", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "highlighted", + "topLeftBadgeType": "unmatch", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "state": "betaReducePreviewBefore", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 3 + }, + "previouslyChangedExpressionState": "betaReducePreviewBefore", + "matchExists": true, + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 6 + }, + { + "expression": { + "arg": { + "arg": { + "name": "d", + "highlightType": "betaReduceCallArgHighlighted", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "betaReduceCallArgHighlighted", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "betaReduceCallArgHighlighted", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "d", + "highlightType": "betaReduceCallArgHighlighted", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "d", + "highlightType": "highlighted", + "topLeftBadgeType": "betaReduced", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "highlighted", + "topLeftBadgeType": "betaReduced", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "highlighted", + "topLeftBadgeType": "betaReduced", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "d", + "highlightType": "highlighted", + "topLeftBadgeType": "betaReduced", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "func": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "type": "function", + "maxNestedFunctionDepth": 4 + }, + "type": "function", + "maxNestedFunctionDepth": 5 + }, + "state": "betaReducePreviewAfter", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 5 + }, + "previouslyChangedExpressionState": "betaReducePreviewAfter", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 7 + }, + { + "expression": { + "arg": { + "arg": { + "name": "d", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "d", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "d", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "d", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "func": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "type": "function", + "maxNestedFunctionDepth": 4 + }, + "type": "function", + "maxNestedFunctionDepth": 5 + }, + "state": "betaReducePreviewCrossed", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 5 + }, + "previouslyChangedExpressionState": "betaReducePreviewCrossed", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 7 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "d", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "d", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "type": "function", + "maxNestedFunctionDepth": 4 + }, + "previouslyChangedExpressionState": "default", + "activePriority": 1, + "containerState": "ready", + "numLeafNodes": 5 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "d", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "d", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "active", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "type": "function", + "maxNestedFunctionDepth": 4 + }, + "previouslyChangedExpressionState": "active", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 5 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "d", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "d", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "showFuncUnbound", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "type": "function", + "maxNestedFunctionDepth": 4 + }, + "previouslyChangedExpressionState": "showFuncUnbound", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 5 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "d", + "highlightType": "highlighted", + "topLeftBadgeType": "match", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "highlighted", + "topLeftBadgeType": "unmatch", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "d", + "highlightType": "highlighted", + "topLeftBadgeType": "match", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "betaReducePreviewBefore", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "type": "function", + "maxNestedFunctionDepth": 4 + }, + "previouslyChangedExpressionState": "betaReducePreviewBefore", + "matchExists": true, + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 5 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "betaReduceCallArgHighlighted", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "d", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcUnbound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "highlighted", + "topLeftBadgeType": "betaReduced", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "betaReducePreviewAfter", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "type": "function", + "maxNestedFunctionDepth": 4 + }, + "previouslyChangedExpressionState": "betaReducePreviewAfter", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 5 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "d", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "state": "betaReducePreviewCrossed", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 2 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 2 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "type": "function", + "maxNestedFunctionDepth": 4 + }, + "previouslyChangedExpressionState": "betaReducePreviewCrossed", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 5 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1, + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "previouslyChangedExpressionState": "default", + "activePriority": 1, + "containerState": "ready", + "numLeafNodes": 4 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1, + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "active", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "previouslyChangedExpressionState": "active", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 4 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1, + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "showFuncBound", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "previouslyChangedExpressionState": "showFuncBound", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 4 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1, + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "h", + "highlightType": "highlighted", + "topLeftBadgeType": "match", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "highlighted", + "topLeftBadgeType": "match", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "highlighted", + "topLeftBadgeType": "unmatch", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "betaReducePreviewBefore", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "previouslyChangedExpressionState": "betaReducePreviewBefore", + "matchExists": true, + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 4 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "betaReduceCallArgHighlighted", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1, + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "h", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "highlighted", + "topLeftBadgeType": "betaReduced", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcBound", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "betaReducePreviewAfter", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "previouslyChangedExpressionState": "betaReducePreviewAfter", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 4 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "callArg", + "type": "variable", + "argPriorityAgg": [ + 1, + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": true, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "h", + "highlightType": "removed", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "funcArg", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": true, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "active", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "state": "betaReducePreviewCrossed", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 1 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "previouslyChangedExpressionState": "betaReducePreviewCrossed", + "activePriority": 1, + "containerState": "stepped", + "numLeafNodes": 4 + }, + { + "expression": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1, + 2 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "previouslyChangedExpressionState": "default", + "activePriority": 1, + "containerState": "done", + "numLeafNodes": 3 + } + ], + "speed": 1.25, + "hideControls": false, + "explanationsVisibility": "hiddenInitialPausedOnly", + "hidePriorities": false, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": false, + "hideFuncUnboundBadgeOnExplanation": true, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "showBottomProgressBar": false +} diff --git a/src/lib/runners/kqtz.json b/src/lib/runners/kqtz.json new file mode 100644 index 000000000..45a1a2d98 --- /dev/null +++ b/src/lib/runners/kqtz.json @@ -0,0 +1,171 @@ +{ + "expressionContainers": [ + { + "expression": { + "arg": { + "name": "shorthandNumber", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "shorthandNumber": 1, + "shorthandNumberAfterConvert": "number", + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "a", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 3 + }, + "numLeafNodes": 6, + "containerState": "ready", + "previouslyChangedExpressionState": "default" + } + ], + "speed": 1, + "hideControls": true, + "explanationsVisibility": "hidden", + "hidePriorities": false, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": false, + "hideFuncUnboundBadgeOnExplanation": false, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "showBottomProgressBar": false +} diff --git a/src/lib/runners/pjih.json b/src/lib/runners/pjih.json new file mode 100644 index 000000000..f6c2450d0 --- /dev/null +++ b/src/lib/runners/pjih.json @@ -0,0 +1,171 @@ +{ + "expressionContainers": [ + { + "expression": { + "arg": { + "name": "shorthandNumber", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "shorthandNumber": 0, + "shorthandNumberAfterConvert": "number", + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "a", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "arg": { + "name": "f", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 2, + 3 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "arg": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "a", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1, + 2 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 2, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "b", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 3 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 3, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "type": "function", + "maxNestedFunctionDepth": 3 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 3 + }, + "numLeafNodes": 6, + "containerState": "ready", + "previouslyChangedExpressionState": "default" + } + ], + "speed": 1, + "hideControls": true, + "explanationsVisibility": "hidden", + "hidePriorities": false, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": false, + "hideFuncUnboundBadgeOnExplanation": false, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "showBottomProgressBar": false +} diff --git a/src/lib/runners/yfwq.json b/src/lib/runners/yfwq.json new file mode 100644 index 000000000..6274c7da3 --- /dev/null +++ b/src/lib/runners/yfwq.json @@ -0,0 +1,108 @@ +{ + "expressionContainers": [ + { + "expression": { + "arg": { + "name": "d", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": false, + "maxNestedFunctionDepth": 0 + }, + "body": { + "arg": { + "name": "h", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [ + 1 + ], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "func": { + "name": "d", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [ + 1 + ], + "emphasizePriority": false, + "bound": true, + "maxNestedFunctionDepth": 0 + }, + "state": "default", + "type": "call", + "priority": 1, + "maxNestedFunctionDepth": 0 + }, + "type": "function", + "maxNestedFunctionDepth": 1 + }, + "type": "function", + "maxNestedFunctionDepth": 2 + }, + "numLeafNodes": 2, + "containerState": "ready", + "previouslyChangedExpressionState": "default" + }, + { + "expression": { + "name": "shorthandNumber", + "highlightType": "default", + "topLeftBadgeType": "none", + "bottomRightBadgeType": "none", + "type": "variable", + "argPriorityAgg": [], + "funcPriorityAgg": [], + "emphasizePriority": false, + "bound": true, + "shorthandNumber": 1, + "maxNestedFunctionDepth": 0 + }, + "numLeafNodes": 1, + "containerState": "done", + "previouslyChangedExpressionState": "default" + } + ], + "speed": 1, + "hideControls": false, + "explanationsVisibility": "hiddenInitialPausedOnly", + "hidePriorities": false, + "hideRunButton": false, + "hideBottomRightBadges": false, + "skipToTheEnd": true, + "hideFuncUnboundBadgeOnExplanation": false, + "highlightOverridesCallArgAndFuncUnboundOnly": false, + "bottomRightBadgeOverrides": {}, + "highlightOverrides": {}, + "highlightOverrideActiveAfterStart": false, + "highlightFunctions": false, + "convert": "toMathBox", + "showBottomProgressBar": false +} From 647fdf137b09232f7d48238f010c29fde9bf1351 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Wed, 6 Nov 2019 21:39:45 -0800 Subject: [PATCH 76/83] Clean up intro --- pages/emojis-functional-programming.tsx | 79 +++++++++---------------- src/components/Alert.tsx | 4 +- 2 files changed, 32 insertions(+), 51 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index bffc03961..d4d59762a 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -23,6 +23,7 @@ import { ExternalLink, P, Italic, + HighlightBold, Bold, InternalLink, Highlight, @@ -51,8 +52,6 @@ import { } from 'src/contents/4.en' import VariableShadeContext from 'src/components/VariableShadeContext' -const hackerNewsLink = `` - const numSteps = 100 const date = DateTime.fromISO('2019-11-08T12:00:00Z') @@ -575,48 +574,37 @@ export default () => { Overview +

+ This article has 10 steps. +

    - First, I’ll show you how some simple JavaScript - code can be represented using my emoji puzzle. Even if you’re - not familiar with JS, you should still be able to understand it. - - - After that, I’ll talk about how I used my emoji - puzzle to teach functional programming concepts such as lambda - calculus, Church encoding, and Y Combinator. - - - To help you track how far along you are in the article, I’ll - show a “step” number above each subheading. There - are a total of {numSteps} steps. - - - If you decide to read later: I’d appreciate it if - you could share this article before you go!{' '} - - {' '} - Click here to Tweet this article. - - {hackerNewsLink && ( - <> - {' '} - You can also discuss this on{' '} - - Hacker News - - . - - )} + In steps 1 through 6, I’ll show you how some simple + JavaScript code can be represented using my emoji puzzle. Even + if you’re not familiar with JS, you should still be able to + understand it. - Also,{' '} - - the source code for this article is available on GitHub - - —please ★ star it! + In steps 7 through 10, I’ll talk about how I used + my emoji puzzle to teach functional programming concepts such as + lambda calculus, Church encoding, and Y Combinator.
+

+ If you plan to read later, I’d love it if you could share on + Twitter before you go.{' '} + + + Click here to Tweet this + article. + + {' '} + Also, the source code for this article is{' '} + + available on GitHub + + . +

{ ”.
- -
- 👋 Available for Hire: My name is{' '} - Shu Uesugi, a freelance full-stack engineer who’s - looking for a full-time position (remote or in - SF/LA). Scroll to the bottom of this article for details. -
-
Identity function in JS @@ -1713,6 +1689,9 @@ convert(f(two))`} non-programmers using emoji puzzles!

+ + More complicated computations + diff --git a/src/components/Alert.tsx b/src/components/Alert.tsx index 27e662a7f..d982bcbeb 100644 --- a/src/components/Alert.tsx +++ b/src/components/Alert.tsx @@ -15,7 +15,7 @@ export const alertSpacing = css` export interface AlertProps { children: React.ReactNode - backgroundColor: 'yellow' | 'pink' | 'brown' | 'blue' + backgroundColor: 'yellow' | 'pink' | 'brown' | 'blue' | 'indigo' } const Alert = ({ children, backgroundColor }: AlertProps) => ( @@ -33,6 +33,8 @@ const Alert = ({ children, backgroundColor }: AlertProps) => ( ? colors('brown50') : backgroundColor === 'blue' ? colors('blue50') + : backgroundColor === 'indigo' + ? colors('indigo50') : colors('pink50')}; ` ]} From 697e4c19cd3208799dfdafc334742f39efecef12 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Wed, 6 Nov 2019 21:41:56 -0800 Subject: [PATCH 77/83] Wordsmith --- pages/emojis-functional-programming.tsx | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index d4d59762a..07e24ce3c 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -611,9 +611,8 @@ export default () => { font-size: ${fontSizes(0.85)}; `} > - ⚠️ Note: This article is for - programmers. If you’re a non-programmer, check out the course - itself instead: “ + ⚠️ This article is for programmers. If you’re a + non-programmer, check out the course itself instead: “ Y Combinator for Non-programmers @@ -1661,8 +1660,8 @@ convert(f(two))`}

Side Note (optional read): What we saw was an - example of higher-order functions, one of the core - concepts of functional programming. + example of higher-order functions, one of the + core concepts of functional programming.

A higher-order function is{' '} From f6ea97491dae14c583220218d28fc089f5676549 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Wed, 6 Nov 2019 21:43:24 -0800 Subject: [PATCH 78/83] Remove side note --- pages/emojis-functional-programming.tsx | 31 ------------------------- 1 file changed, 31 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 07e24ce3c..9b925c61d 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -1657,37 +1657,6 @@ convert(f(two))`} - -

- Side Note (optional read): What we saw was an - example of higher-order functions, one of the - core concepts of functional programming. -

-

- A higher-order function is{' '} - - a function that takes a function or returns a function - - . The function we used earlier that calculates{' '} - someNumber + 1 was a higher-order - function because: -

-
    - It takes a Church numeral, which is a function - - It returns a new Church numeral that’s greater by 1, which is - also a function. - -
-

- And as we just saw, higher-order functions can be taught to - non-programmers using emoji puzzles! -

-
More complicated computations From 4a3607346241724dd7a22fc83fb1d5823bb1b2c0 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Wed, 6 Nov 2019 21:46:31 -0800 Subject: [PATCH 79/83] numsteps, wordsmith --- pages/emojis-functional-programming.tsx | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index 9b925c61d..a7bf743ee 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -52,7 +52,7 @@ import { } from 'src/contents/4.en' import VariableShadeContext from 'src/components/VariableShadeContext' -const numSteps = 100 +const numSteps = 10 const date = DateTime.fromISO('2019-11-08T12:00:00Z') // const dateString = date @@ -580,14 +580,14 @@ export default () => {
    In steps 1 through 6, I’ll show you how some simple - JavaScript code can be represented using my emoji puzzle. Even + JavaScript code can be represented using my emoji puzzles. Even if you’re not familiar with JS, you should still be able to understand it. In steps 7 through 10, I’ll talk about how I used - my emoji puzzle to teach functional programming concepts such as - lambda calculus, Church encoding, and Y Combinator. + my emoji puzzles to teach functional programming concepts such + as lambda calculus, Church encoding, and Y Combinator.

@@ -688,7 +688,7 @@ sushi => sushi`}

- That’s how my emoji puzzle can visually describe a simple JS + That’s how my emoji puzzles can visually describe a simple JS expression. Next, let’s talk about how we can{' '} it.

@@ -763,7 +763,7 @@ sushi => 'pizza'`} >{`(sushi => 'pizza')('sandwich')`}

As expected, the result is 'pizza'. Now, - this code can be represented using my emoji puzzle as follows.{' '} + this code can be represented using an emoji puzzle as follows.{' '}

From 767afe4b9cb7176aa1f87030dbdfcf1d6f7378d6 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Wed, 6 Nov 2019 21:47:53 -0800 Subject: [PATCH 80/83] Lowercase --- pages/emojis-functional-programming.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pages/emojis-functional-programming.tsx b/pages/emojis-functional-programming.tsx index a7bf743ee..90bacadf3 100644 --- a/pages/emojis-functional-programming.tsx +++ b/pages/emojis-functional-programming.tsx @@ -587,7 +587,7 @@ export default () => { In steps 7 through 10, I’ll talk about how I used my emoji puzzles to teach functional programming concepts such - as lambda calculus, Church encoding, and Y Combinator. + as lambda calculus, Church encoding, and Y combinator.

From 7ef8674bc41d5c01e7639d3affe838ffcf7ee8f9 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Thu, 7 Nov 2019 08:48:49 -0800 Subject: [PATCH 81/83] Update packages --- package.json | 22 +- yarn.lock | 739 ++++++++++++++++++++++++++++++++------------------- 2 files changed, 471 insertions(+), 290 deletions(-) diff --git a/package.json b/package.json index 6b6502403..b45df0f9d 100644 --- a/package.json +++ b/package.json @@ -5,11 +5,11 @@ }, "dependencies": { "@emotion/core": "^10.0.22", - "@emotion/styled": "^10.0.22", - "@material-ui/core": "^4.5.0", + "@emotion/styled": "^10.0.23", + "@material-ui/core": "^4.6.0", "color": "^3.1.2", - "luxon": "^1.19.3", - "next": "9.1.1", + "luxon": "^1.21.1", + "next": "9.1.2", "prism-react-renderer": "^1.0.2", "react": "^16.11.0", "react-dom": "^16.11.0", @@ -48,16 +48,16 @@ "@types/glob": "^7.1.1", "@types/luxon": "^1.15.2", "@types/material-ui": "^0.21.7", - "@types/node": "^12.11.7", + "@types/node": "^12.12.6", "@types/nprogress": "^0.2.0", "@types/prettier": "^1.18.3", "@types/react": "^16.9.5", - "@types/react-dom": "^16.9.1", + "@types/react-dom": "^16.9.4", "@types/smoothscroll-polyfill": "^0.3.1", - "@typescript-eslint/eslint-plugin": "^2.5.0", - "@typescript-eslint/parser": "^2.5.0", + "@typescript-eslint/eslint-plugin": "^2.6.1", + "@typescript-eslint/parser": "^2.6.1", "babel-eslint": "^10.0.3", - "babel-plugin-emotion": "^10.0.22", + "babel-plugin-emotion": "^10.0.23", "concurrently": "^5.0.0", "eslint": "^6.5.1", "eslint-config-prettier": "^6.4.0", @@ -69,9 +69,9 @@ "eslint-plugin-react": "^7.16.0", "eslint-plugin-react-hooks": "1.x", "fs-extra": "^8.1.0", - "glob": "^7.1.5", + "glob": "^7.1.6", "module-alias": "^2.2.2", "prettier": "^1.18.2", - "typescript": "^3.7.1-rc" + "typescript": "^3.7.2" } } diff --git a/yarn.lock b/yarn.lock index 9b83ae323..f593c1d2d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,31 +2,37 @@ # yarn lockfile v1 -"@ampproject/toolbox-core@^1.0.1", "@ampproject/toolbox-core@^1.1.1": +"@ampproject/toolbox-core@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@ampproject/toolbox-core/-/toolbox-core-1.1.1.tgz#540c8f3ab0f5d1faa1ba35282cd5f5f3f0e16a76" integrity sha512-jcuVJUnGDRUEJgMYO6QVdf1dBy/oLZX3NjN2hYG48biFcPCvXevuv4xYFZMJsnsHSvXKg8y0qB8rANNyhTUN/A== dependencies: node-fetch "2.6.0" -"@ampproject/toolbox-optimizer@1.0.1": - version "1.0.1" - resolved "https://registry.yarnpkg.com/@ampproject/toolbox-optimizer/-/toolbox-optimizer-1.0.1.tgz#5eeda7bc84c23237479c35442d4696c4bdbeb1d3" - integrity sha512-zz1cJsQWBvfg2h1ce2/bbgNdSkTjIY7PaF7QhWMzYVcfvdxGSAykA+Ajt+F13H6adNAtIn09s96z/+6pn7XiXQ== +"@ampproject/toolbox-optimizer@1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@ampproject/toolbox-optimizer/-/toolbox-optimizer-1.1.1.tgz#be66245c966ba9b0f5e3020109f87fea90ea377d" + integrity sha512-LTtTM5FSOrWuTJ6mOwPfZmpUDI6polrNz3tX2EmDmDkjDK+43vSpq1OHtukivIFHafdixJuoeki5dF3PC/ZoWw== dependencies: - "@ampproject/toolbox-core" "^1.0.1" - "@ampproject/toolbox-runtime-version" "^1.0.1" + "@ampproject/toolbox-core" "^1.1.1" + "@ampproject/toolbox-runtime-version" "^1.1.1" + "@ampproject/toolbox-script-csp" "^1.1.1" css "2.2.4" parse5 "5.1.0" parse5-htmlparser2-tree-adapter "5.1.0" -"@ampproject/toolbox-runtime-version@^1.0.1": +"@ampproject/toolbox-runtime-version@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@ampproject/toolbox-runtime-version/-/toolbox-runtime-version-1.1.1.tgz#628fe5091db4f90b68960620e22ad64f9f2563bd" integrity sha512-ibmw5p+0Sz+wingbX/Dyboe8a0+XDkMfFGSM7KFE0h2z3Op9MADup8ZPLeHT54Z7cYKmB6ob60FVHtQQDhEXNw== dependencies: "@ampproject/toolbox-core" "^1.1.1" +"@ampproject/toolbox-script-csp@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@ampproject/toolbox-script-csp/-/toolbox-script-csp-1.1.1.tgz#0b049a1c86c99f300162a10e1b9ce83c6e354a45" + integrity sha512-gACGfsVKinCy/977FSrlVgo6jxTZ0lcTCvCnRlNwvSOcxJVm+jJR3sP7/F43fpak9Gsq/EwFaatfnNMbunPc+w== + "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.5.5.tgz#bc0782f6d69f7b7d49531219699b988f669a8f9d" @@ -34,27 +40,7 @@ dependencies: "@babel/highlight" "^7.0.0" -"@babel/core@7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.4.5.tgz#081f97e8ffca65a9b4b0fdc7e274e703f000c06a" - integrity sha512-OvjIh6aqXtlsA8ujtGKfC7LYWksYSX8yQcM8Ay3LuvVeQ63lcOKgoZWVqcpFwkd29aYU9rVx7jxhfhiEDV9MZA== - dependencies: - "@babel/code-frame" "^7.0.0" - "@babel/generator" "^7.4.4" - "@babel/helpers" "^7.4.4" - "@babel/parser" "^7.4.5" - "@babel/template" "^7.4.4" - "@babel/traverse" "^7.4.5" - "@babel/types" "^7.4.4" - convert-source-map "^1.1.0" - debug "^4.1.0" - json5 "^2.1.0" - lodash "^4.17.11" - resolve "^1.3.2" - semver "^5.4.1" - source-map "^0.5.0" - -"@babel/core@^7.4.5": +"@babel/core@7.6.4", "@babel/core@^7.4.5": version "7.6.4" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.6.4.tgz#6ebd9fe00925f6c3e177bb726a188b5f578088ff" integrity sha512-Rm0HGw101GY8FTzpWSyRbki/jzq+/PkNQJ+nSulrdY6gFGOsNseCqD6KHRYe2E+EdzuBdr2pxCp6s4Uk6eJ+XQ== @@ -74,7 +60,7 @@ semver "^5.4.1" source-map "^0.5.0" -"@babel/generator@^7.4.4", "@babel/generator@^7.6.3", "@babel/generator@^7.6.4": +"@babel/generator@^7.6.3", "@babel/generator@^7.6.4": version "7.6.4" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.6.4.tgz#a4f8437287bf9671b07f483b76e3bb731bc97671" integrity sha512-jsBuXkFoZxk0yWLyGI9llT9oiQ2FeTASmRFE32U+aaDTfoE92t78eroO7PTpU/OrYq38hlcDM6vbfLDaOLy+7w== @@ -84,6 +70,16 @@ lodash "^4.17.13" source-map "^0.5.0" +"@babel/generator@^7.7.2": + version "7.7.2" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.7.2.tgz#2f4852d04131a5e17ea4f6645488b5da66ebf3af" + integrity sha512-WthSArvAjYLz4TcbKOi88me+KmDJdKSlfwwN8CnUYn9jBkzhq0ZEPuBfkAWIvjJ3AdEV1Cf/+eSQTnp3IDJKlQ== + dependencies: + "@babel/types" "^7.7.2" + jsesc "^2.5.1" + lodash "^4.17.13" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.0.0.tgz#323d39dd0b50e10c7c06ca7d7638e6864d8c5c32" @@ -91,6 +87,13 @@ dependencies: "@babel/types" "^7.0.0" +"@babel/helper-annotate-as-pure@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.7.0.tgz#efc54032d43891fe267679e63f6860aa7dbf4a5e" + integrity sha512-k50CQxMlYTYo+GGyUGFwpxKVtxVJi9yh61sXZji3zYHccK9RYliZGSTOgci85T+r+0VFN2nWbGM04PIqwfrpMg== + dependencies: + "@babel/types" "^7.7.0" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.1.0.tgz#6b69628dfe4087798e0c4ed98e3d4a6b2fbd2f5f" @@ -116,25 +119,33 @@ "@babel/traverse" "^7.4.4" "@babel/types" "^7.4.4" -"@babel/helper-create-class-features-plugin@^7.4.4", "@babel/helper-create-class-features-plugin@^7.6.0": - version "7.6.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.6.0.tgz#769711acca889be371e9bc2eb68641d55218021f" - integrity sha512-O1QWBko4fzGju6VoVvrZg0RROCVifcLxiApnGP3OWfWzvxRZFCoBD81K5ur5e3bVY2Vf/5rIJm8cqPKn8HUJng== +"@babel/helper-create-class-features-plugin@^7.5.5", "@babel/helper-create-class-features-plugin@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.7.0.tgz#bcdc223abbfdd386f94196ae2544987f8df775e8" + integrity sha512-MZiB5qvTWoyiFOgootmRSDV1udjIqJW/8lmxgzKq6oDqxdmHUjeP2ZUOmgHdYjmUVNABqRrHjYAYRvj8Eox/UA== dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-member-expression-to-functions" "^7.5.5" - "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-function-name" "^7.7.0" + "@babel/helper-member-expression-to-functions" "^7.7.0" + "@babel/helper-optimise-call-expression" "^7.7.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.5.5" - "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/helper-replace-supers" "^7.7.0" + "@babel/helper-split-export-declaration" "^7.7.0" -"@babel/helper-define-map@^7.5.5": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.5.5.tgz#3dec32c2046f37e09b28c93eb0b103fd2a25d369" - integrity sha512-fTfxx7i0B5NJqvUOBBGREnrqbTxRh7zinBANpZXAVDlsZxYdclDp467G1sQ8VZYMnAURY3RpBUAgOYT9GfzHBg== +"@babel/helper-create-regexp-features-plugin@^7.7.0": + version "7.7.2" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.7.2.tgz#6f20443778c8fce2af2ff4206284afc0ced65db6" + integrity sha512-pAil/ZixjTlrzNpjx+l/C/wJk002Wo7XbbZ8oujH/AoJ3Juv0iN/UTcPUHXKMFLqsfS0Hy6Aow8M31brUYBlQQ== dependencies: - "@babel/helper-function-name" "^7.1.0" - "@babel/types" "^7.5.5" + "@babel/helper-regex" "^7.4.4" + regexpu-core "^4.6.0" + +"@babel/helper-define-map@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.7.0.tgz#60b0e9fd60def9de5054c38afde8c8ee409c7529" + integrity sha512-kPKWPb0dMpZi+ov1hJiwse9dWweZsz3V9rP4KdytnX1E7z3cTNmFGglwklzFPuqIcHLIY3bgKSs4vkwXXdflQA== + dependencies: + "@babel/helper-function-name" "^7.7.0" + "@babel/types" "^7.7.0" lodash "^4.17.13" "@babel/helper-explode-assignable-expression@^7.1.0": @@ -154,6 +165,15 @@ "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" +"@babel/helper-function-name@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.7.0.tgz#44a5ad151cfff8ed2599c91682dda2ec2c8430a3" + integrity sha512-tDsJgMUAP00Ugv8O2aGEua5I2apkaQO7lBGUq1ocwN3G23JE5Dcq0uh3GvFTChPa4b40AWiAsLvCZOA2rdnQ7Q== + dependencies: + "@babel/helper-get-function-arity" "^7.7.0" + "@babel/template" "^7.7.0" + "@babel/types" "^7.7.0" + "@babel/helper-get-function-arity@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz#83572d4320e2a4657263734113c42868b64e49c3" @@ -161,6 +181,13 @@ dependencies: "@babel/types" "^7.0.0" +"@babel/helper-get-function-arity@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.7.0.tgz#c604886bc97287a1d1398092bc666bc3d7d7aa2d" + integrity sha512-tLdojOTz4vWcEnHWHCuPN5P85JLZWbm5Fx5ZsMEMPhF3Uoe3O7awrbM2nQ04bDOUToH/2tH/ezKEOR8zEYzqyw== + dependencies: + "@babel/types" "^7.7.0" + "@babel/helper-hoist-variables@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.4.tgz#0298b5f25c8c09c53102d52ac4a98f773eb2850a" @@ -168,6 +195,13 @@ dependencies: "@babel/types" "^7.4.4" +"@babel/helper-hoist-variables@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.7.0.tgz#b4552e4cfe5577d7de7b183e193e84e4ec538c81" + integrity sha512-LUe/92NqsDAkJjjCEWkNe+/PcpnisvnqdlRe19FahVapa4jndeuJ+FBiTX1rcAKWKcJGE+C3Q3tuEuxkSmCEiQ== + dependencies: + "@babel/types" "^7.7.0" + "@babel/helper-member-expression-to-functions@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.5.5.tgz#1fb5b8ec4453a93c439ee9fe3aeea4a84b76b590" @@ -175,6 +209,13 @@ dependencies: "@babel/types" "^7.5.5" +"@babel/helper-member-expression-to-functions@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.7.0.tgz#472b93003a57071f95a541ea6c2b098398bcad8a" + integrity sha512-QaCZLO2RtBcmvO/ekOLp8p7R5X2JriKRizeDpm5ChATAFWrrYDcDxPuCIBXKyBjY+i1vYSdcUTMIb8psfxHDPA== + dependencies: + "@babel/types" "^7.7.0" + "@babel/helper-module-imports@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.0.0.tgz#96081b7111e486da4d2cd971ad1a4fe216cc2e3d" @@ -182,6 +223,13 @@ dependencies: "@babel/types" "^7.0.0" +"@babel/helper-module-imports@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.7.0.tgz#99c095889466e5f7b6d66d98dffc58baaf42654d" + integrity sha512-Dv3hLKIC1jyfTkClvyEkYP2OlkzNvWs5+Q8WgPbxM5LMeorons7iPP91JM+DU7tRbhqA1ZeooPaMFvQrn23RHw== + dependencies: + "@babel/types" "^7.7.0" + "@babel/helper-module-transforms@^7.1.0", "@babel/helper-module-transforms@^7.4.4": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.5.5.tgz#f84ff8a09038dcbca1fd4355661a500937165b4a" @@ -194,6 +242,18 @@ "@babel/types" "^7.5.5" lodash "^4.17.13" +"@babel/helper-module-transforms@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.7.0.tgz#154a69f0c5b8fd4d39e49750ff7ac4faa3f36786" + integrity sha512-rXEefBuheUYQyX4WjV19tuknrJFwyKw0HgzRwbkyTbB+Dshlq7eqkWbyjzToLrMZk/5wKVKdWFluiAsVkHXvuQ== + dependencies: + "@babel/helper-module-imports" "^7.7.0" + "@babel/helper-simple-access" "^7.7.0" + "@babel/helper-split-export-declaration" "^7.7.0" + "@babel/template" "^7.7.0" + "@babel/types" "^7.7.0" + lodash "^4.17.13" + "@babel/helper-optimise-call-expression@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.0.0.tgz#a2920c5702b073c15de51106200aa8cad20497d5" @@ -201,6 +261,13 @@ dependencies: "@babel/types" "^7.0.0" +"@babel/helper-optimise-call-expression@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.7.0.tgz#4f66a216116a66164135dc618c5d8b7a959f9365" + integrity sha512-48TeqmbazjNU/65niiiJIJRc5JozB8acui1OS7bSd6PgxfuovWsvjfWSzlgx+gPFdVveNzUdpdIg5l56Pl5jqg== + dependencies: + "@babel/types" "^7.7.0" + "@babel/helper-plugin-utils@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.0.0.tgz#bbb3fbee98661c569034237cc03967ba99b4f250" @@ -224,6 +291,17 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.0.0" +"@babel/helper-remap-async-to-generator@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.7.0.tgz#4d69ec653e8bff5bce62f5d33fc1508f223c75a7" + integrity sha512-pHx7RN8X0UNHPB/fnuDnRXVZ316ZigkO8y8D835JlZ2SSdFKb6yH9MIYRU4fy/KPe5sPHDFOPvf8QLdbAGGiyw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.7.0" + "@babel/helper-wrap-function" "^7.7.0" + "@babel/template" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + "@babel/helper-replace-supers@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.5.5.tgz#f84ce43df031222d2bad068d2626cb5799c34bc2" @@ -234,6 +312,16 @@ "@babel/traverse" "^7.5.5" "@babel/types" "^7.5.5" +"@babel/helper-replace-supers@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.7.0.tgz#d5365c8667fe7cbd13b8ddddceb9bd7f2b387512" + integrity sha512-5ALYEul5V8xNdxEeWvRsBzLMxQksT7MaStpxjJf9KsnLxpAKBtfw5NeMKZJSYDa0lKdOcy0g+JT/f5mPSulUgg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.7.0" + "@babel/helper-optimise-call-expression" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + "@babel/helper-simple-access@^7.1.0": version "7.1.0" resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.1.0.tgz#65eeb954c8c245beaa4e859da6188f39d71e585c" @@ -242,6 +330,14 @@ "@babel/template" "^7.1.0" "@babel/types" "^7.0.0" +"@babel/helper-simple-access@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.7.0.tgz#97a8b6c52105d76031b86237dc1852b44837243d" + integrity sha512-AJ7IZD7Eem3zZRuj5JtzFAptBw7pMlS3y8Qv09vaBWoFsle0d1kAn5Wq6Q9MyBXITPOKnxwkZKoAm4bopmv26g== + dependencies: + "@babel/template" "^7.7.0" + "@babel/types" "^7.7.0" + "@babel/helper-split-export-declaration@^7.4.4": version "7.4.4" resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz#ff94894a340be78f53f06af038b205c49d993677" @@ -249,6 +345,13 @@ dependencies: "@babel/types" "^7.4.4" +"@babel/helper-split-export-declaration@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.7.0.tgz#1365e74ea6c614deeb56ebffabd71006a0eb2300" + integrity sha512-HgYSI8rH08neWlAH3CcdkFg9qX9YsZysZI5GD8LjhQib/mM0jGOZOVkoUiiV2Hu978fRtjtsGsW6w0pKHUWtqA== + dependencies: + "@babel/types" "^7.7.0" + "@babel/helper-wrap-function@^7.1.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.2.0.tgz#c4e0012445769e2815b55296ead43a958549f6fa" @@ -259,7 +362,17 @@ "@babel/traverse" "^7.1.0" "@babel/types" "^7.2.0" -"@babel/helpers@^7.4.4", "@babel/helpers@^7.6.2": +"@babel/helper-wrap-function@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.7.0.tgz#15af3d3e98f8417a60554acbb6c14e75e0b33b74" + integrity sha512-sd4QjeMgQqzshSjecZjOp8uKfUtnpmCyQhKQrVJBBgeHAB/0FPi33h3AbVlVp07qQtMD4QgYSzaMI7VwncNK/w== + dependencies: + "@babel/helper-function-name" "^7.7.0" + "@babel/template" "^7.7.0" + "@babel/traverse" "^7.7.0" + "@babel/types" "^7.7.0" + +"@babel/helpers@^7.6.2": version "7.6.2" resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.6.2.tgz#681ffe489ea4dcc55f23ce469e58e59c1c045153" integrity sha512-3/bAUL8zZxYs1cdX2ilEE0WobqbCmKWr/889lf2SS0PpDcpEIY8pb1CCyz0pEcX3pEb+MCbks1jIokz2xLtGTA== @@ -277,11 +390,16 @@ esutils "^2.0.2" js-tokens "^4.0.0" -"@babel/parser@^7.0.0", "@babel/parser@^7.4.5", "@babel/parser@^7.6.0", "@babel/parser@^7.6.3", "@babel/parser@^7.6.4": +"@babel/parser@^7.0.0", "@babel/parser@^7.6.0", "@babel/parser@^7.6.3", "@babel/parser@^7.6.4": version "7.6.4" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.6.4.tgz#cb9b36a7482110282d5cb6dd424ec9262b473d81" integrity sha512-D8RHPW5qd0Vbyo3qb+YjO5nvUVRTXFLQ/FsDxJU2Nqz4uB5EnUN0ZQSEYpvTIbRuttig1XbHWU5oMeQwQSAA+A== +"@babel/parser@^7.7.0", "@babel/parser@^7.7.2": + version "7.7.2" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.7.2.tgz#ea8334dc77416bfd9473eb470fd00d8245b3943b" + integrity sha512-DDaR5e0g4ZTb9aP7cpSZLkACEBdoLGwJDWgHtBhrGX7Q1RjhdoMOfexICj5cqTAtpowjGQWfcvfnQG7G2kAB5w== + "@babel/plugin-proposal-async-generator-functions@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.2.0.tgz#b289b306669dce4ad20b0252889a15768c9d417e" @@ -291,14 +409,22 @@ "@babel/helper-remap-async-to-generator" "^7.1.0" "@babel/plugin-syntax-async-generators" "^7.2.0" -"@babel/plugin-proposal-class-properties@7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.4.4.tgz#93a6486eed86d53452ab9bab35e368e9461198ce" - integrity sha512-WjKTI8g8d5w1Bc9zgwSz2nfrsNQsXcCf9J9cdCvrJV6RF56yztwm4TmJC0MgJ9tvwO9gUA/mcYe89bLdGfiXFg== +"@babel/plugin-proposal-class-properties@7.5.5": + version "7.5.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.5.5.tgz#a974cfae1e37c3110e71f3c6a2e48b8e71958cd4" + integrity sha512-AF79FsnWFxjlaosgdi421vmYG6/jg79bVD0dpD44QdgobzHKuLZ6S3vl8la9qIeSwGi8i1fS0O1mfuDAAdo1/A== dependencies: - "@babel/helper-create-class-features-plugin" "^7.4.4" + "@babel/helper-create-class-features-plugin" "^7.5.5" "@babel/helper-plugin-utils" "^7.0.0" +"@babel/plugin-proposal-dynamic-import@^7.5.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.7.0.tgz#dc02a8bad8d653fb59daf085516fa416edd2aa7f" + integrity sha512-7poL3Xi+QFPC7sGAzEIbXUyYzGJwbc2+gSD0AkiC5k52kH2cqHdqxm5hNFfLW3cRSTcx9bN0Fl7/6zWcLLnKAQ== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" + "@babel/plugin-proposal-json-strings@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz#568ecc446c6148ae6b267f02551130891e29f317" @@ -307,15 +433,7 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-json-strings" "^7.2.0" -"@babel/plugin-proposal-object-rest-spread@7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.4.tgz#1ef173fcf24b3e2df92a678f027673b55e7e3005" - integrity sha512-dMBG6cSPBbHeEBdFXeQ2QLc5gUpg4Vkaz8octD4aoW/ISO+jBOcsuxYL7bsb5WSu8RLP6boxrBIALEHgoHtO9g== - dependencies: - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-syntax-object-rest-spread" "^7.2.0" - -"@babel/plugin-proposal-object-rest-spread@^7.4.4": +"@babel/plugin-proposal-object-rest-spread@7.6.2", "@babel/plugin-proposal-object-rest-spread@^7.6.2": version "7.6.2" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.6.2.tgz#8ffccc8f3a6545e9f78988b6bf4fe881b88e8096" integrity sha512-LDBXlmADCsMZV1Y9OQwMc0MyGZ8Ta/zlD9N67BfQT8uYwkRswiu2hU6nJKrjrt/58aH/vqfQlR/9yId/7A2gWw== @@ -331,14 +449,13 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" -"@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.6.2.tgz#05413762894f41bfe42b9a5e80919bd575dcc802" - integrity sha512-NxHETdmpeSCtiatMRYWVJo7266rrvAC3DTeG5exQBIH/fMIUK7ejDNznBbn3HQl/o9peymRRg7Yqkx6PdUXmMw== +"@babel/plugin-proposal-unicode-property-regex@^7.6.2": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.7.0.tgz#549fe1717a1bd0a2a7e63163841cb37e78179d5d" + integrity sha512-mk34H+hp7kRBWJOOAR0ZMGCydgKMD4iN9TpDRp3IIcbunltxEY89XSimc6WbtSLCDrwcdy/EEw7h5CFCzxTchw== dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.7.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.6.0" "@babel/plugin-syntax-async-generators@^7.2.0": version "7.2.0" @@ -347,7 +464,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-syntax-dynamic-import@7.2.0": +"@babel/plugin-syntax-dynamic-import@7.2.0", "@babel/plugin-syntax-dynamic-import@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz#69c159ffaf4998122161ad8ebc5e6d1f55df8612" integrity sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w== @@ -396,14 +513,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-async-to-generator@^7.4.4": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.5.0.tgz#89a3848a0166623b5bc481164b5936ab947e887e" - integrity sha512-mqvkzwIGkq0bEF1zLRRiTdjfomZJDV33AH3oQzHVGkI2VzEmXLpKKOBvEVaFZBJdN0XTyH38s9j/Kiqr68dggg== +"@babel/plugin-transform-async-to-generator@^7.5.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.7.0.tgz#e2b84f11952cf5913fe3438b7d2585042772f492" + integrity sha512-vLI2EFLVvRBL3d8roAMqtVY0Bm9C1QzLkdS57hiKrjUBSqsQYrBsMCeOg/0KK7B0eK9V71J5mWcha9yyoI2tZw== dependencies: - "@babel/helper-module-imports" "^7.0.0" + "@babel/helper-module-imports" "^7.7.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-remap-async-to-generator" "^7.1.0" + "@babel/helper-remap-async-to-generator" "^7.7.0" "@babel/plugin-transform-block-scoped-functions@^7.2.0": version "7.2.0" @@ -412,7 +529,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-block-scoping@^7.4.4": +"@babel/plugin-transform-block-scoping@^7.6.3": version "7.6.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.6.3.tgz#6e854e51fbbaa84351b15d4ddafe342f3a5d542a" integrity sha512-7hvrg75dubcO3ZI2rjYTzUrEuh1E9IyDEhhB6qfcooxhDA33xx2MasuLVgdxzcP6R/lipAC6n9ub9maNW6RKdw== @@ -420,18 +537,18 @@ "@babel/helper-plugin-utils" "^7.0.0" lodash "^4.17.13" -"@babel/plugin-transform-classes@^7.4.4": - version "7.5.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.5.5.tgz#d094299d9bd680a14a2a0edae38305ad60fb4de9" - integrity sha512-U2htCNK/6e9K7jGyJ++1p5XRU+LJjrwtoiVn9SzRlDT2KubcZ11OOwy3s24TjHxPgxNwonCYP7U2K51uVYCMDg== +"@babel/plugin-transform-classes@^7.5.5": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.7.0.tgz#b411ecc1b8822d24b81e5d184f24149136eddd4a" + integrity sha512-/b3cKIZwGeUesZheU9jNYcwrEA7f/Bo4IdPmvp7oHgvks2majB5BoT5byAql44fiNQYOPzhk2w8DbgfuafkMoA== dependencies: - "@babel/helper-annotate-as-pure" "^7.0.0" - "@babel/helper-define-map" "^7.5.5" - "@babel/helper-function-name" "^7.1.0" - "@babel/helper-optimise-call-expression" "^7.0.0" + "@babel/helper-annotate-as-pure" "^7.7.0" + "@babel/helper-define-map" "^7.7.0" + "@babel/helper-function-name" "^7.7.0" + "@babel/helper-optimise-call-expression" "^7.7.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-replace-supers" "^7.5.5" - "@babel/helper-split-export-declaration" "^7.4.4" + "@babel/helper-replace-supers" "^7.7.0" + "@babel/helper-split-export-declaration" "^7.7.0" globals "^11.1.0" "@babel/plugin-transform-computed-properties@^7.2.0": @@ -441,23 +558,22 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-destructuring@^7.4.4": +"@babel/plugin-transform-destructuring@^7.6.0": version "7.6.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.6.0.tgz#44bbe08b57f4480094d57d9ffbcd96d309075ba6" integrity sha512-2bGIS5P1v4+sWTCnKNDZDxbGvEqi0ijeqM/YqHtVGrvG2y0ySgnEEhXErvE9dA0bnIzY9bIzdFK0jFA46ASIIQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.6.2.tgz#44abb948b88f0199a627024e1508acaf8dc9b2f9" - integrity sha512-KGKT9aqKV+9YMZSkowzYoYEiHqgaDhGmPNZlZxX6UeHC4z30nC1J9IrZuGqbYFB1jaIGdv91ujpze0exiVK8bA== +"@babel/plugin-transform-dotall-regex@^7.6.2": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.7.0.tgz#c5c9ecacab3a5e0c11db6981610f0c32fd698b3b" + integrity sha512-3QQlF7hSBnSuM1hQ0pS3pmAbWLax/uGNCbPBND9y+oJ4Y776jsyujG2k0Sn2Aj2a0QwVOiOFL5QVPA7spjvzSA== dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.7.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.6.0" -"@babel/plugin-transform-duplicate-keys@^7.2.0": +"@babel/plugin-transform-duplicate-keys@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.5.0.tgz#c5dbf5106bf84cdf691222c0974c12b1df931853" integrity sha512-igcziksHizyQPlX9gfSjHkE2wmoCH3evvD2qR5w29/Dk0SMKE/eOI7f1HhBdNhR/zxJDqrgpoDTq5YSLH/XMsQ== @@ -501,7 +617,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-modules-amd@^7.2.0": +"@babel/plugin-transform-modules-amd@^7.5.0": version "7.5.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.5.0.tgz#ef00435d46da0a5961aa728a1d2ecff063e4fb91" integrity sha512-n20UsQMKnWrltocZZm24cRURxQnWIvsABPJlw/fvoy9c6AgHZzoelAIzajDHAQrDpuKFFPPcFGd7ChsYuIUMpg== @@ -510,16 +626,7 @@ "@babel/helper-plugin-utils" "^7.0.0" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-commonjs@7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.4.4.tgz#0bef4713d30f1d78c2e59b3d6db40e60192cac1e" - integrity sha512-4sfBOJt58sEo9a2BQXnZq+Q3ZTSAUXyK3E30o36BOGnJ+tvJ6YSxF0PG6kERvbeISgProodWuI9UVG3/FMY6iw== - dependencies: - "@babel/helper-module-transforms" "^7.4.4" - "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-simple-access" "^7.1.0" - -"@babel/plugin-transform-modules-commonjs@^7.4.4": +"@babel/plugin-transform-modules-commonjs@7.6.0": version "7.6.0" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.6.0.tgz#39dfe957de4420445f1fcf88b68a2e4aa4515486" integrity sha512-Ma93Ix95PNSEngqomy5LSBMAQvYKVe3dy+JlVJSHEXZR5ASL9lQBedMiCyVtmTLraIDVRE3ZjTZvmXXD2Ozw3g== @@ -529,12 +636,22 @@ "@babel/helper-simple-access" "^7.1.0" babel-plugin-dynamic-import-node "^2.3.0" -"@babel/plugin-transform-modules-systemjs@^7.4.4": - version "7.5.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.5.0.tgz#e75266a13ef94202db2a0620977756f51d52d249" - integrity sha512-Q2m56tyoQWmuNGxEtUyeEkm6qJYFqs4c+XyXH5RAuYxObRNz9Zgj/1g2GMnjYp2EUyEy7YTrxliGCXzecl/vJg== +"@babel/plugin-transform-modules-commonjs@^7.6.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.7.0.tgz#3e5ffb4fd8c947feede69cbe24c9554ab4113fe3" + integrity sha512-KEMyWNNWnjOom8vR/1+d+Ocz/mILZG/eyHHO06OuBQ2aNhxT62fr4y6fGOplRx+CxCSp3IFwesL8WdINfY/3kg== dependencies: - "@babel/helper-hoist-variables" "^7.4.4" + "@babel/helper-module-transforms" "^7.7.0" + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/helper-simple-access" "^7.7.0" + babel-plugin-dynamic-import-node "^2.3.0" + +"@babel/plugin-transform-modules-systemjs@^7.5.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.7.0.tgz#9baf471213af9761c1617bb12fd278e629041417" + integrity sha512-ZAuFgYjJzDNv77AjXRqzQGlQl4HdUM6j296ee4fwKVZfhDR9LAGxfvXjBkb06gNETPnN0sLqRm9Gxg4wZH6dXg== + dependencies: + "@babel/helper-hoist-variables" "^7.7.0" "@babel/helper-plugin-utils" "^7.0.0" babel-plugin-dynamic-import-node "^2.3.0" @@ -546,12 +663,12 @@ "@babel/helper-module-transforms" "^7.1.0" "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-named-capturing-groups-regex@^7.4.5": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.6.3.tgz#aaa6e409dd4fb2e50b6e2a91f7e3a3149dbce0cf" - integrity sha512-jTkk7/uE6H2s5w6VlMHeWuH+Pcy2lmdwFoeWCVnvIrDUnB5gQqTVI8WfmEAhF2CDEarGrknZcmSFg1+bkfCoSw== +"@babel/plugin-transform-named-capturing-groups-regex@^7.6.3": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.7.0.tgz#358e6fd869b9a4d8f5cbc79e4ed4fc340e60dcaf" + integrity sha512-+SicSJoKouPctL+j1pqktRVCgy+xAch1hWWTMy13j0IflnyNjaoskj+DwRQFimHbLqO3sq2oN2CXMvXq3Bgapg== dependencies: - regexpu-core "^4.6.0" + "@babel/helper-create-regexp-features-plugin" "^7.7.0" "@babel/plugin-transform-new-target@^7.4.4": version "7.4.4" @@ -560,7 +677,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-object-super@^7.2.0": +"@babel/plugin-transform-object-super@^7.5.5": version "7.5.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.5.5.tgz#c70021df834073c65eb613b8679cc4a381d1a9f9" integrity sha512-un1zJQAhSosGFBduPgN/YFNvWVpRuHKU7IHBglLoLZsGmruJPOo6pbInneflUdmq7YvSVqhpPs5zdBvLnteltQ== @@ -630,10 +747,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-runtime@7.4.4": - version "7.4.4" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.4.4.tgz#a50f5d16e9c3a4ac18a1a9f9803c107c380bce08" - integrity sha512-aMVojEjPszvau3NRg+TIH14ynZLvPewH4xhlCW1w6A3rkxTS1m4uwzRclYR9oS+rl/dr+kT+pzbfHuAWP/lc7Q== +"@babel/plugin-transform-runtime@7.6.2": + version "7.6.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.6.2.tgz#2669f67c1fae0ae8d8bf696e4263ad52cb98b6f8" + integrity sha512-cqULw/QB4yl73cS5Y0TZlQSjDvNkzDbu0FurTZyHlJpWE5T3PCMdnyV+xXoH1opr1ldyHODe3QAX3OMAii5NxA== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" @@ -647,7 +764,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-spread@^7.2.0": +"@babel/plugin-transform-spread@^7.6.2": version "7.6.2" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.6.2.tgz#fc77cf798b24b10c46e1b51b1b88c2bf661bb8dd" integrity sha512-DpSvPFryKdK1x+EDJYCy28nmAaIMdxmhot62jAXF/o99iA33Zj2Lmcp3vDmz+MUh0LNYVPvfj5iC3feb3/+PFg== @@ -677,82 +794,83 @@ dependencies: "@babel/helper-plugin-utils" "^7.0.0" -"@babel/plugin-transform-typescript@^7.3.2": - version "7.6.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.6.3.tgz#dddb50cf3b8b2ef70b22e5326e9a91f05a1db13b" - integrity sha512-aiWINBrPMSC3xTXRNM/dfmyYuPNKY/aexYqBgh0HBI5Y+WO5oRAqW/oROYeYHrF4Zw12r9rK4fMk/ZlAmqx/FQ== +"@babel/plugin-transform-typescript@^7.6.0": + version "7.7.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.7.2.tgz#eb9f14c516b5d36f4d6f3a9d7badae6d0fc313d4" + integrity sha512-UWhDaJRqdPUtdK1s0sKYdoRuqK0NepjZto2UZltvuCgMoMZmdjhgz5hcRokie/3aYEaSz3xvusyoayVaq4PjRg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.6.0" + "@babel/helper-create-class-features-plugin" "^7.7.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-typescript" "^7.2.0" -"@babel/plugin-transform-unicode-regex@^7.4.4": - version "7.6.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.6.2.tgz#b692aad888a7e8d8b1b214be6b9dc03d5031f698" - integrity sha512-orZI6cWlR3nk2YmYdb0gImrgCUwb5cBUwjf6Ks6dvNVvXERkwtJWOQaEOjPiu0Gu1Tq6Yq/hruCZZOOi9F34Dw== +"@babel/plugin-transform-unicode-regex@^7.6.2": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.7.0.tgz#743d9bcc44080e3cc7d49259a066efa30f9187a3" + integrity sha512-RrThb0gdrNwFAqEAAx9OWgtx6ICK69x7i9tCnMdVrxQwSDp/Abu9DXFU5Hh16VP33Rmxh04+NGW28NsIkFvFKA== dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.7.0" "@babel/helper-plugin-utils" "^7.0.0" - "@babel/helper-regex" "^7.4.4" - regexpu-core "^4.6.0" -"@babel/preset-env@7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.4.5.tgz#2fad7f62983d5af563b5f3139242755884998a58" - integrity sha512-f2yNVXM+FsR5V8UwcFeIHzHWgnhXg3NpRmy0ADvALpnhB0SLbCvrCRr4BLOUYbQNLS+Z0Yer46x9dJXpXewI7w== +"@babel/preset-env@7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.6.3.tgz#9e1bf05a2e2d687036d24c40e4639dc46cef2271" + integrity sha512-CWQkn7EVnwzlOdR5NOm2+pfgSNEZmvGjOhlCHBDq0J8/EStr+G+FvPEiz9B56dR6MoiUFjXhfE4hjLoAKKJtIQ== dependencies: "@babel/helper-module-imports" "^7.0.0" "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-proposal-async-generator-functions" "^7.2.0" + "@babel/plugin-proposal-dynamic-import" "^7.5.0" "@babel/plugin-proposal-json-strings" "^7.2.0" - "@babel/plugin-proposal-object-rest-spread" "^7.4.4" + "@babel/plugin-proposal-object-rest-spread" "^7.6.2" "@babel/plugin-proposal-optional-catch-binding" "^7.2.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-proposal-unicode-property-regex" "^7.6.2" "@babel/plugin-syntax-async-generators" "^7.2.0" + "@babel/plugin-syntax-dynamic-import" "^7.2.0" "@babel/plugin-syntax-json-strings" "^7.2.0" "@babel/plugin-syntax-object-rest-spread" "^7.2.0" "@babel/plugin-syntax-optional-catch-binding" "^7.2.0" "@babel/plugin-transform-arrow-functions" "^7.2.0" - "@babel/plugin-transform-async-to-generator" "^7.4.4" + "@babel/plugin-transform-async-to-generator" "^7.5.0" "@babel/plugin-transform-block-scoped-functions" "^7.2.0" - "@babel/plugin-transform-block-scoping" "^7.4.4" - "@babel/plugin-transform-classes" "^7.4.4" + "@babel/plugin-transform-block-scoping" "^7.6.3" + "@babel/plugin-transform-classes" "^7.5.5" "@babel/plugin-transform-computed-properties" "^7.2.0" - "@babel/plugin-transform-destructuring" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" - "@babel/plugin-transform-duplicate-keys" "^7.2.0" + "@babel/plugin-transform-destructuring" "^7.6.0" + "@babel/plugin-transform-dotall-regex" "^7.6.2" + "@babel/plugin-transform-duplicate-keys" "^7.5.0" "@babel/plugin-transform-exponentiation-operator" "^7.2.0" "@babel/plugin-transform-for-of" "^7.4.4" "@babel/plugin-transform-function-name" "^7.4.4" "@babel/plugin-transform-literals" "^7.2.0" "@babel/plugin-transform-member-expression-literals" "^7.2.0" - "@babel/plugin-transform-modules-amd" "^7.2.0" - "@babel/plugin-transform-modules-commonjs" "^7.4.4" - "@babel/plugin-transform-modules-systemjs" "^7.4.4" + "@babel/plugin-transform-modules-amd" "^7.5.0" + "@babel/plugin-transform-modules-commonjs" "^7.6.0" + "@babel/plugin-transform-modules-systemjs" "^7.5.0" "@babel/plugin-transform-modules-umd" "^7.2.0" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.4.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.6.3" "@babel/plugin-transform-new-target" "^7.4.4" - "@babel/plugin-transform-object-super" "^7.2.0" + "@babel/plugin-transform-object-super" "^7.5.5" "@babel/plugin-transform-parameters" "^7.4.4" "@babel/plugin-transform-property-literals" "^7.2.0" "@babel/plugin-transform-regenerator" "^7.4.5" "@babel/plugin-transform-reserved-words" "^7.2.0" "@babel/plugin-transform-shorthand-properties" "^7.2.0" - "@babel/plugin-transform-spread" "^7.2.0" + "@babel/plugin-transform-spread" "^7.6.2" "@babel/plugin-transform-sticky-regex" "^7.2.0" "@babel/plugin-transform-template-literals" "^7.4.4" "@babel/plugin-transform-typeof-symbol" "^7.2.0" - "@babel/plugin-transform-unicode-regex" "^7.4.4" - "@babel/types" "^7.4.4" + "@babel/plugin-transform-unicode-regex" "^7.6.2" + "@babel/types" "^7.6.3" browserslist "^4.6.0" core-js-compat "^3.1.1" invariant "^2.2.2" js-levenshtein "^1.1.3" semver "^5.5.0" -"@babel/preset-react@7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.0.0.tgz#e86b4b3d99433c7b3e9e91747e2653958bc6b3c0" - integrity sha512-oayxyPS4Zj+hF6Et11BwuBkmpgT/zMxyuZgFrMeZID6Hdh3dGlk4sHCAhdBCpuCKW2ppBfl2uCCetlrUIJRY3w== +"@babel/preset-react@7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.6.3.tgz#d5242c828322520205ae4eda5d4f4f618964e2f6" + integrity sha512-07yQhmkZmRAfwREYIQgW0HEwMY9GBJVuPY4Q12UC72AbfaawuupVWa8zQs2tlL+yun45Nv/1KreII/0PLfEsgA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-transform-react-display-name" "^7.0.0" @@ -760,30 +878,23 @@ "@babel/plugin-transform-react-jsx-self" "^7.0.0" "@babel/plugin-transform-react-jsx-source" "^7.0.0" -"@babel/preset-typescript@7.3.3": - version "7.3.3" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.3.3.tgz#88669911053fa16b2b276ea2ede2ca603b3f307a" - integrity sha512-mzMVuIP4lqtn4du2ynEfdO0+RYcslwrZiJHXu4MGaC1ctJiW2fyaeDrtjJGs7R/KebZ1sgowcIoWf4uRpEfKEg== +"@babel/preset-typescript@7.6.0": + version "7.6.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.6.0.tgz#25768cb8830280baf47c45ab1a519a9977498c98" + integrity sha512-4xKw3tTcCm0qApyT6PqM9qniseCE79xGHiUnNdKGdxNsGUc2X7WwZybqIpnTmoukg3nhPceI5KPNzNqLNeIJww== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-transform-typescript" "^7.3.2" + "@babel/plugin-transform-typescript" "^7.6.0" -"@babel/runtime-corejs2@7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.4.5.tgz#3d892f0560df21bafb384dd7727e33853e95d3c9" - integrity sha512-5yLuwzvIDecKwYMzJtiarky4Fb5643H3Ao5jwX0HrMR5oM5mn2iHH9wSZonxwNK0oAjAFUQAiOd4jT7/9Y2jMQ== +"@babel/runtime-corejs2@7.6.3": + version "7.6.3" + resolved "https://registry.yarnpkg.com/@babel/runtime-corejs2/-/runtime-corejs2-7.6.3.tgz#de3f446b3fb688b98cbd220474d1a7cad909bcb8" + integrity sha512-nuA2o+rgX2+PrNTZ063ehncVcg7sn+tU71BB81SaWRVUbGwCOlb0+yQA1e0QqmzOfRSYOxfvf8cosYqFbJEiwQ== dependencies: core-js "^2.6.5" regenerator-runtime "^0.13.2" -"@babel/runtime@7.4.5": - version "7.4.5" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.4.5.tgz#582bb531f5f9dc67d2fcb682979894f75e253f12" - integrity sha512-TuI4qpWZP6lGOGIuGWtp9sPluqYICmbk8T/1vpSysqJxRPkudh/ofFWyqdcMsDf2s7KvDL4/YHgKyvcS3g9CJQ== - dependencies: - regenerator-runtime "^0.13.2" - -"@babel/runtime@^7.3.1", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3": +"@babel/runtime@7.6.3", "@babel/runtime@^7.3.1", "@babel/runtime@^7.4.2", "@babel/runtime@^7.4.4", "@babel/runtime@^7.4.5", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.2", "@babel/runtime@^7.6.3": version "7.6.3" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.6.3.tgz#935122c74c73d2240cafd32ddb5fc2a6cd35cf1f" integrity sha512-kq6anf9JGjW8Nt5rYfEuGRaEAaH1mkv3Bbu6rYvLOpPh/RusSJXuKPEAoZ7L7gybZkchE8+NV5g9vKF4AGAtsA== @@ -799,7 +910,16 @@ "@babel/parser" "^7.6.0" "@babel/types" "^7.6.0" -"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4", "@babel/traverse@^7.4.5", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.2", "@babel/traverse@^7.6.3": +"@babel/template@^7.7.0": + version "7.7.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.7.0.tgz#4fadc1b8e734d97f56de39c77de76f2562e597d0" + integrity sha512-OKcwSYOW1mhWbnTBgQY5lvg1Fxg+VyfQGjcBduZFljfc044J5iDlnDSfhQ867O17XHiSCxYHUxHg2b7ryitbUQ== + dependencies: + "@babel/code-frame" "^7.0.0" + "@babel/parser" "^7.7.0" + "@babel/types" "^7.7.0" + +"@babel/traverse@^7.0.0", "@babel/traverse@^7.1.0", "@babel/traverse@^7.4.4", "@babel/traverse@^7.5.5", "@babel/traverse@^7.6.2", "@babel/traverse@^7.6.3": version "7.6.3" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.6.3.tgz#66d7dba146b086703c0fb10dd588b7364cec47f9" integrity sha512-unn7P4LGsijIxaAJo/wpoU11zN+2IaClkQAxcJWBNCMS6cmVh802IyLHNkAjQ0iYnRS3nnxk5O3fuXW28IMxTw== @@ -814,6 +934,21 @@ globals "^11.1.0" lodash "^4.17.13" +"@babel/traverse@^7.7.0": + version "7.7.2" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.7.2.tgz#ef0a65e07a2f3c550967366b3d9b62a2dcbeae09" + integrity sha512-TM01cXib2+rgIZrGJOLaHV/iZUAxf4A0dt5auY6KNZ+cm6aschuJGqKJM3ROTt3raPUdIDk9siAufIFEleRwtw== + dependencies: + "@babel/code-frame" "^7.5.5" + "@babel/generator" "^7.7.2" + "@babel/helper-function-name" "^7.7.0" + "@babel/helper-split-export-declaration" "^7.7.0" + "@babel/parser" "^7.7.2" + "@babel/types" "^7.7.2" + debug "^4.1.0" + globals "^11.1.0" + lodash "^4.17.13" + "@babel/types@^7.0.0", "@babel/types@^7.2.0", "@babel/types@^7.3.0", "@babel/types@^7.4.4", "@babel/types@^7.5.5", "@babel/types@^7.6.0", "@babel/types@^7.6.3": version "7.6.3" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.6.3.tgz#3f07d96f854f98e2fbd45c64b0cb942d11e8ba09" @@ -823,6 +958,15 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" +"@babel/types@^7.7.0", "@babel/types@^7.7.2": + version "7.7.2" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.7.2.tgz#550b82e5571dcd174af576e23f0adba7ffc683f7" + integrity sha512-YTf6PXoh3+eZgRCBzzP25Bugd2ngmpQVrk7kXX0i5N9BO7TFBtIgZYs7WtxtOGs8e6A4ZI7ECkbBCEHeXocvOA== + dependencies: + esutils "^2.0.2" + lodash "^4.17.13" + to-fast-properties "^2.0.0" + "@csstools/convert-colors@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@csstools/convert-colors/-/convert-colors-1.4.0.tgz#ad495dc41b12e75d588c6db8b9834f08fa131eb7" @@ -864,10 +1008,10 @@ resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.7.3.tgz#a166882c81c0c6040975dd30df24fae8549bd96f" integrity sha512-14ZVlsB9akwvydAdaEnVnvqu6J2P6ySv39hYyl/aoB6w/V+bXX0tay8cF6paqbgZsN2n5Xh15uF4pE+GvE+itw== -"@emotion/is-prop-valid@0.8.3": - version "0.8.3" - resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.3.tgz#cbe62ddbea08aa022cdf72da3971570a33190d29" - integrity sha512-We7VBiltAJ70KQA0dWkdPMXnYoizlxOXpvtjmu5/MBnExd+u0PGgV27WCYanmLAbCwAU30Le/xA0CQs/F/Otig== +"@emotion/is-prop-valid@0.8.5": + version "0.8.5" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.5.tgz#2dda0791f0eafa12b7a0a5b39858405cc7bde983" + integrity sha512-6ZODuZSFofbxSbcxwsFz+6ioPjb0ISJRRPLZ+WIbjcU2IMU0Io+RGQjjaTgOvNQl007KICBm7zXQaYQEC1r6Bg== dependencies: "@emotion/memoize" "0.7.3" @@ -887,28 +1031,39 @@ "@emotion/utils" "0.11.2" csstype "^2.5.7" +"@emotion/serialize@^0.11.14": + version "0.11.14" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-0.11.14.tgz#56a6d8d04d837cc5b0126788b2134c51353c6488" + integrity sha512-6hTsySIuQTbDbv00AnUO6O6Xafdwo5GswRlMZ5hHqiFx+4pZ7uGWXUQFW46Kc2taGhP89uXMXn/lWQkdyTosPA== + dependencies: + "@emotion/hash" "0.7.3" + "@emotion/memoize" "0.7.3" + "@emotion/unitless" "0.7.4" + "@emotion/utils" "0.11.2" + csstype "^2.5.7" + "@emotion/sheet@0.9.3": version "0.9.3" resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-0.9.3.tgz#689f135ecf87d3c650ed0c4f5ddcbe579883564a" integrity sha512-c3Q6V7Df7jfwSq5AzQWbXHa5soeE4F5cbqi40xn0CzXxWW9/6Mxq48WJEtqfWzbZtW9odZdnRAkwCQwN12ob4A== -"@emotion/styled-base@^10.0.22": - version "10.0.22" - resolved "https://registry.yarnpkg.com/@emotion/styled-base/-/styled-base-10.0.22.tgz#2b6e86e477ed81bd74aa6cef5f403d500503df5b" - integrity sha512-ikSuAcz86BcmlZM5EysqCH0EUssYm5ardrWNVM3Ri5ODpOlKPrT//jVozJU2uK3q5GRcqZHLqagP/nd9beNUfQ== +"@emotion/styled-base@^10.0.23": + version "10.0.24" + resolved "https://registry.yarnpkg.com/@emotion/styled-base/-/styled-base-10.0.24.tgz#9497efd8902dfeddee89d24b0eeb26b0665bfe8b" + integrity sha512-AnBImerf0h4dGAJVo0p0VE8KoAns71F28ErGFK474zbNAHX6yqSWQUasb+1jvg/VPwZjCp19+tAr6oOB0pwmLQ== dependencies: "@babel/runtime" "^7.5.5" - "@emotion/is-prop-valid" "0.8.3" - "@emotion/serialize" "^0.11.12" + "@emotion/is-prop-valid" "0.8.5" + "@emotion/serialize" "^0.11.14" "@emotion/utils" "0.11.2" -"@emotion/styled@^10.0.22": - version "10.0.22" - resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-10.0.22.tgz#ee398710876ebda5a418f84359516c6a1c5c41b1" - integrity sha512-3+dnBk8NjXnddI8Gi2VJLMmup0bCG8HQkZLaeNky+GSLl8VyxQfuaK5I5aDVvgQ3UzkxrcZrFB3vHYU/iUakBA== +"@emotion/styled@^10.0.23": + version "10.0.23" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-10.0.23.tgz#2f8279bd59b99d82deade76d1046249ddfab7c1b" + integrity sha512-gNr04eqBQ2iYUx8wFLZDfm3N8/QUOODu/ReDXa693uyQGy2OqA+IhPJk+kA7id8aOfwAsMuvZ0pJImEXXKtaVQ== dependencies: - "@emotion/styled-base" "^10.0.22" - babel-plugin-emotion "^10.0.22" + "@emotion/styled-base" "^10.0.23" + babel-plugin-emotion "^10.0.23" "@emotion/stylis@0.8.4": version "0.8.4" @@ -930,39 +1085,36 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.4.tgz#622a72bebd1e3f48d921563b4b60a762295a81fc" integrity sha512-6PYY5DVdAY1ifaQW6XYTnOMihmBVT27elqSjEoodchsGjzYlEsTQMcEhSud99kVawatyTZRTiVkJ/c6lwbQ7nA== -"@material-ui/core@^4.5.0": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.5.1.tgz#6f1bbb298cc2893b29169ab9398a00ca5a6ac971" - integrity sha512-6pyk7diT7bflf4qUpqgPCpKYqjhRHPFwsgEV2Gv71lMqwxuRygFGHE2TdZ+l5T249H66Doj2P/j6fW7yzgxTWw== +"@material-ui/core@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.6.0.tgz#098a61d2af1778433d2d9a76de95be5f6aa87922" + integrity sha512-nzD0oO3R2dcX/+hmi5FUFSddMKySK76Ryuno3J/iOotbKvzXwbf9szzhL8KPNmsj+vizVNfkEfhzOuuCHRBKKQ== dependencies: "@babel/runtime" "^7.4.4" - "@material-ui/styles" "^4.5.0" - "@material-ui/system" "^4.5.0" + "@material-ui/styles" "^4.6.0" + "@material-ui/system" "^4.5.2" "@material-ui/types" "^4.1.1" - "@material-ui/utils" "^4.4.0" + "@material-ui/utils" "^4.5.2" "@types/react-transition-group" "^4.2.0" clsx "^1.0.2" convert-css-length "^2.0.1" - deepmerge "^4.0.0" hoist-non-react-statics "^3.2.1" - is-plain-object "^3.0.0" normalize-scroll-left "^0.2.0" popper.js "^1.14.1" prop-types "^15.7.2" react-transition-group "^4.3.0" -"@material-ui/styles@^4.5.0": - version "4.5.0" - resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.5.0.tgz#4e591b8d44c7ecce318634bd8ac652499b6c277a" - integrity sha512-O0NSAECHK9f3DZK6wy56PZzp8b/7KSdfpJs8DSC7vnXUAoMPCTtchBKLzMtUsNlijiJFeJjSxNdQfjWXgyur5A== +"@material-ui/styles@^4.6.0": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.6.0.tgz#15679fab6dcbe0cc2416f01a22966f3ea26607c5" + integrity sha512-lqqh4UEMdIYcU1Yth4pQyMTah02uAkg3NOT3MirN9FUexdL8pNA6zCHigEgDSfwmvnXyxHhxTkphfy0DRfnt9w== dependencies: "@babel/runtime" "^7.4.4" "@emotion/hash" "^0.7.1" "@material-ui/types" "^4.1.1" - "@material-ui/utils" "^4.1.0" + "@material-ui/utils" "^4.5.2" clsx "^1.0.2" csstype "^2.5.2" - deepmerge "^4.0.0" hoist-non-react-statics "^3.2.1" jss "^10.0.0" jss-plugin-camel-case "^10.0.0" @@ -974,13 +1126,13 @@ jss-plugin-vendor-prefixer "^10.0.0" prop-types "^15.7.2" -"@material-ui/system@^4.5.0": - version "4.5.1" - resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.5.1.tgz#d2d249667ca7ee8ff9f93517c06ee41eb89729de" - integrity sha512-M72CGz3MYxXTFLet2qWmQDBXZdtF7JKGqYaf7t9MPDYD6WYG6wKM2hUbgUtRKOwls8ZBXQGKsiAX8K4v5pXSPw== +"@material-ui/system@^4.5.2": + version "4.5.2" + resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.5.2.tgz#7143bd8422a3f33f435c23f378136254004bbd60" + integrity sha512-h9RWvdM9XKlHHqwiuhyvWdobptQkHli+m2jJFs7i1AI/hmGsIc4reDmS7fInhETgt/Txx7uiAIznfRNIIVHmQw== dependencies: "@babel/runtime" "^7.4.4" - deepmerge "^4.0.0" + "@material-ui/utils" "^4.5.2" prop-types "^15.7.2" "@material-ui/types@^4.1.1": @@ -990,10 +1142,10 @@ dependencies: "@types/react" "*" -"@material-ui/utils@^4.1.0", "@material-ui/utils@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.4.0.tgz#9275421e2798a067850d201212d46f12725828ad" - integrity sha512-UXoQVwArQEQWXxf2FPs0iJGT+MePQpKr0Qh0CPoLc1OdF0GSMTmQczcqCzwZkeHxHAOq/NkIKM1Pb/ih1Avicg== +"@material-ui/utils@^4.5.2": + version "4.5.2" + resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.5.2.tgz#4c2fb531d357cf0da8cece53b588dff9b0bde934" + integrity sha512-zhbNfHd1gLa8At6RPDG7uMZubHxbY+LtM6IkSfeWi6Lo4Ax80l62YaN1QmUpO1IvGCkn/j62tQX3yObiQZrJsQ== dependencies: "@babel/runtime" "^7.4.4" prop-types "^15.7.2" @@ -1181,11 +1333,16 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== -"@types/node@*", "@types/node@^12.11.7": +"@types/node@*": version "12.11.7" resolved "https://registry.yarnpkg.com/@types/node/-/node-12.11.7.tgz#57682a9771a3f7b09c2497f28129a0462966524a" integrity sha512-JNbGaHFCLwgHn/iCckiGSOZ1XYHsKFwREtzPwSGCVld1SGhOlmZw2D4ZI94HQCrBHbADzW9m4LER/8olJTRGHA== +"@types/node@^12.12.6": + version "12.12.6" + resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.6.tgz#a47240c10d86a9a57bb0c633f0b2e0aea9ce9253" + integrity sha512-FjsYUPzEJdGXjwKqSpE0/9QEh6kzhTAeObA54rn6j3rR4C/mzpI9L0KNfoeASSPMMdxIsoJuCLDWcM/rVjIsSA== + "@types/nprogress@^0.2.0": version "0.2.0" resolved "https://registry.yarnpkg.com/@types/nprogress/-/nprogress-0.2.0.tgz#86c593682d4199212a0509cc3c4d562bbbd6e45f" @@ -1213,10 +1370,10 @@ dependencies: "@types/react" "*" -"@types/react-dom@^16.9.1": - version "16.9.3" - resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.3.tgz#4006ff0e13958af91313869077c04cb20d9b9d04" - integrity sha512-FUuZKXPr9qlzUT9lhuzrZgLjH63TvNn28Ch3MvKG4B+F52zQtO8DtE0Opbncy3xaucNZM2WIPfuNTgkbKx5Brg== +"@types/react-dom@^16.9.4": + version "16.9.4" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.9.4.tgz#0b58df09a60961dcb77f62d4f1832427513420df" + integrity sha512-fya9xteU/n90tda0s+FtN5Ym4tbgxpq/hb/Af24dvs6uYnYn+fspaxw5USlw0R8apDNwxsqumdRoCoKitckQqw== dependencies: "@types/react" "*" @@ -1240,46 +1397,47 @@ resolved "https://registry.yarnpkg.com/@types/smoothscroll-polyfill/-/smoothscroll-polyfill-0.3.1.tgz#77fb3a6e116bdab4a5959122e3b8e201224dcd49" integrity sha512-+KkHw4y+EyeCtVXET7woHUhIbfWFCflc0E0mZnSV+ZdjPQeHt/9KPEuT7gSW/kFQ8O3EG30PLO++YhChDt8+Ag== -"@typescript-eslint/eslint-plugin@^2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.5.0.tgz#101d96743ce3365b3223df73d641078c9b775903" - integrity sha512-ddrJZxp5ns1Lh5ofZQYk3P8RyvKfyz/VcRR4ZiJLHO/ljnQAO8YvTfj268+WJOOadn99mvDiqJA65+HAKoeSPA== +"@typescript-eslint/eslint-plugin@^2.6.1": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.6.1.tgz#e34972a24f8aba0861f9ccf7130acd74fd11e079" + integrity sha512-Z0rddsGqioKbvqfohg7BwkFC3PuNLsB+GE9QkFza7tiDzuHoy0y823Y+oGNDzxNZrYyLjqkZtCTl4vCqOmEN4g== dependencies: - "@typescript-eslint/experimental-utils" "2.5.0" + "@typescript-eslint/experimental-utils" "2.6.1" eslint-utils "^1.4.2" functional-red-black-tree "^1.0.1" regexpp "^2.0.1" tsutils "^3.17.1" -"@typescript-eslint/experimental-utils@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.5.0.tgz#383a97ded9a7940e5053449f6d73995e782b8fb1" - integrity sha512-UgcQGE0GKJVChyRuN1CWqDW8Pnu7+mVst0aWrhiyuUD1J9c+h8woBdT4XddCvhcXDodTDVIfE3DzGHVjp7tUeQ== +"@typescript-eslint/experimental-utils@2.6.1": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-2.6.1.tgz#eddaca17a399ebf93a8628923233b4f93793acfd" + integrity sha512-EVrrUhl5yBt7fC7c62lWmriq4MIc49zpN3JmrKqfiFXPXCM5ErfEcZYfKOhZXkW6MBjFcJ5kGZqu1b+lyyExUw== dependencies: "@types/json-schema" "^7.0.3" - "@typescript-eslint/typescript-estree" "2.5.0" + "@typescript-eslint/typescript-estree" "2.6.1" eslint-scope "^5.0.0" -"@typescript-eslint/parser@^2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.5.0.tgz#858030ddd808fbbe88e03f42e5971efaccb8218a" - integrity sha512-9UBMiAwIDWSl79UyogaBdj3hidzv6exjKUx60OuZuFnJf56tq/UMpdPcX09YmGqE8f4AnAueYtBxV8IcAT3jdQ== +"@typescript-eslint/parser@^2.6.1": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-2.6.1.tgz#3c00116baa0d696bc334ca18ac5286b34793993c" + integrity sha512-PDPkUkZ4c7yA+FWqigjwf3ngPUgoLaGjMlFh6TRtbjhqxFBnkElDfckSjm98q9cMr4xRzZ15VrS/xKm6QHYf0w== dependencies: "@types/eslint-visitor-keys" "^1.0.0" - "@typescript-eslint/experimental-utils" "2.5.0" - "@typescript-eslint/typescript-estree" "2.5.0" + "@typescript-eslint/experimental-utils" "2.6.1" + "@typescript-eslint/typescript-estree" "2.6.1" eslint-visitor-keys "^1.1.0" -"@typescript-eslint/typescript-estree@2.5.0": - version "2.5.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.5.0.tgz#40ada624d6217ef092a3a79ed30d947ad4f212ce" - integrity sha512-AXURyF8NcA3IsnbjNX1v9qbwa0dDoY9YPcKYR2utvMHoUcu3636zrz0gRWtVAyxbPCkhyKuGg6WZIyi2Fc79CA== +"@typescript-eslint/typescript-estree@2.6.1": + version "2.6.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-2.6.1.tgz#fb363dd4ca23384745c5ea4b7f4c867432b00d31" + integrity sha512-+sTnssW6bcbDZKE8Ce7VV6LdzkQz2Bxk7jzk1J8H1rovoTxnm6iXvYIyncvNsaB/kBCOM63j/LNJfm27bNdUoA== dependencies: debug "^4.1.1" glob "^7.1.4" is-glob "^4.0.1" lodash.unescape "4.0.1" semver "^6.3.0" + tsutils "^3.17.1" "@webassemblyjs/ast@1.8.5": version "1.8.5" @@ -1768,6 +1926,22 @@ babel-plugin-emotion@^10.0.22: find-root "^1.1.0" source-map "^0.5.7" +babel-plugin-emotion@^10.0.23: + version "10.0.23" + resolved "https://registry.yarnpkg.com/babel-plugin-emotion/-/babel-plugin-emotion-10.0.23.tgz#040d40bf61dcab6d31dd6043d10e180240b8515b" + integrity sha512-1JiCyXU0t5S2xCbItejCduLGGcKmF3POT0Ujbexog2MI4IlRcIn/kWjkYwCUZlxpON0O5FC635yPl/3slr7cKQ== + dependencies: + "@babel/helper-module-imports" "^7.0.0" + "@emotion/hash" "0.7.3" + "@emotion/memoize" "0.7.3" + "@emotion/serialize" "^0.11.14" + babel-plugin-macros "^2.0.0" + babel-plugin-syntax-jsx "^6.18.0" + convert-source-map "^1.5.0" + escape-string-regexp "^1.0.5" + find-root "^1.1.0" + source-map "^0.5.7" + babel-plugin-macros@^2.0.0: version "2.6.1" resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-2.6.1.tgz#41f7ead616fc36f6a93180e89697f69f51671181" @@ -2695,11 +2869,6 @@ deep-is@~0.1.3: resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= -deepmerge@^4.0.0: - version "4.2.1" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.1.tgz#018a3e5dfe82b95e35e36a9a29ba15ddb194e40f" - integrity sha512-32P7FIV6JKt0hPMFNlWFytzVGpppYHFKdnhFUEMXheWc8Lw4HnHEzJa5yxhaQedDAXv2SI6zD7+UbqnC5k9g9Q== - defaults@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" @@ -3557,7 +3726,7 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^7.0.3, glob@^7.1.3, glob@^7.1.4, glob@^7.1.5: +glob@^7.0.3, glob@^7.1.3, glob@^7.1.4: version "7.1.5" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.5.tgz#6714c69bee20f3c3e64c4dd905553e532b40cdc0" integrity sha512-J9dlskqUXK1OeTOYBEn5s8aMukWMwWfs+rPTn/jn50Ux4MNXVhubL1wu/j2t+H4NVI+cXEcCaYellqaPVGXNqQ== @@ -3569,6 +3738,18 @@ glob@^7.0.3, glob@^7.1.3, glob@^7.1.4, glob@^7.1.5: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.6: + version "7.1.6" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + globals@^11.1.0, globals@^11.7.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -4063,13 +4244,6 @@ is-plain-object@^2.0.1, is-plain-object@^2.0.3, is-plain-object@^2.0.4: dependencies: isobject "^3.0.1" -is-plain-object@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-3.0.0.tgz#47bfc5da1b5d50d64110806c199359482e75a928" - integrity sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg== - dependencies: - isobject "^4.0.0" - is-promise@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" @@ -4104,6 +4278,11 @@ is-windows@^1.0.2: resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== +is-wsl@2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.1.1.tgz#4a1c152d429df3d441669498e2486d3596ebaf1d" + integrity sha512-umZHcSrwlDHo2TGMXv0DZ8dIUGunZ2Iv68YZnrmCiBPkZ4aaOhtv7pXJKeki9k3qJ3RJr0cDyitcl5wEH3AYog== + is-wsl@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" @@ -4131,11 +4310,6 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= -isobject@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-4.0.0.tgz#3f1c9155e73b192022a80819bacd0343711697b0" - integrity sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA== - jest-worker@24.9.0: version "24.9.0" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-24.9.0.tgz#5dbfdb5b2d322e98567898238a9697bcce67b3e5" @@ -4466,10 +4640,10 @@ lru-cache@5.1.1, lru-cache@^5.1.1: dependencies: yallist "^3.0.2" -luxon@^1.19.3: - version "1.19.3" - resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.19.3.tgz#86c04a1395529b4386ae235a8fe16d0a82a0695b" - integrity sha512-YwTDjGRQC0QC9Iya2g2eKZfgEFqRId4ZoLHORQcfTMB/5xrTx427V7ZPjQJ1vzvhA2vJfG2bh1Kv8V8IFMWCUA== +luxon@^1.21.1: + version "1.21.1" + resolved "https://registry.yarnpkg.com/luxon/-/luxon-1.21.1.tgz#00c9c9e624e66cfef745a8476c4ead14a3966a61" + integrity sha512-3zxaKX7mj7eA80TU0sm4CfNEtiUZ2QXGjMc80rfG4d1dOnnOOWz63U9j4nYR7+1w716DYtWfdOeVhDXYlH+D4w== make-dir@^1.0.0: version "1.3.0" @@ -4818,23 +4992,23 @@ neo-async@^2.5.0, neo-async@^2.6.1: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz#ac27ada66167fa8849a6addd837f6b189ad2081c" integrity sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw== -next@9.1.1: - version "9.1.1" - resolved "https://registry.yarnpkg.com/next/-/next-9.1.1.tgz#bede2e834548020bc4d3be0c46e3ed7edaac6d14" - integrity sha512-++jiUA1GN/dOqe6+oLT78rdrRnPmf5yHUbug1tdZBYeQ6HE+ypDIeVelmCmyGx+JDNB3TcxNx5R2+D/Cbrwnng== +next@9.1.2: + version "9.1.2" + resolved "https://registry.yarnpkg.com/next/-/next-9.1.2.tgz#ed708301c8265c36006f28672904715e5c592420" + integrity sha512-AQoyCOYMPyttZl7Qvyfnku3SkG6c/jJe7fvTEsYGJ3CJFj0fQALoDZg7Wv+nMvzQR+h2MZUUWyaoFURPBxEd4A== dependencies: - "@ampproject/toolbox-optimizer" "1.0.1" - "@babel/core" "7.4.5" - "@babel/plugin-proposal-class-properties" "7.4.4" - "@babel/plugin-proposal-object-rest-spread" "7.4.4" + "@ampproject/toolbox-optimizer" "1.1.1" + "@babel/core" "7.6.4" + "@babel/plugin-proposal-class-properties" "7.5.5" + "@babel/plugin-proposal-object-rest-spread" "7.6.2" "@babel/plugin-syntax-dynamic-import" "7.2.0" - "@babel/plugin-transform-modules-commonjs" "7.4.4" - "@babel/plugin-transform-runtime" "7.4.4" - "@babel/preset-env" "7.4.5" - "@babel/preset-react" "7.0.0" - "@babel/preset-typescript" "7.3.3" - "@babel/runtime" "7.4.5" - "@babel/runtime-corejs2" "7.4.5" + "@babel/plugin-transform-modules-commonjs" "7.6.0" + "@babel/plugin-transform-runtime" "7.6.2" + "@babel/preset-env" "7.6.3" + "@babel/preset-react" "7.6.3" + "@babel/preset-typescript" "7.6.0" + "@babel/runtime" "7.6.3" + "@babel/runtime-corejs2" "7.6.3" amphtml-validator "1.0.23" async-retry "1.2.3" async-sema "3.0.0" @@ -4860,6 +5034,7 @@ next@9.1.1: fresh "0.5.2" ignore-loader "0.1.2" is-docker "2.0.0" + is-wsl "2.1.1" jest-worker "24.9.0" launch-editor "2.2.1" loader-utils "1.2.3" @@ -4887,6 +5062,7 @@ next@9.1.1: terser "4.0.0" unfetch "4.1.0" url "0.11.0" + use-subscription "1.1.1" watchpack "2.0.0-beta.5" webpack "4.39.0" webpack-dev-middleware "3.7.0" @@ -7111,10 +7287,10 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c= -typescript@^3.7.1-rc: - version "3.7.1-rc" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.1-rc.tgz#2054b872d67f8dc732e36c1df397f9327f37ada0" - integrity sha512-2rMtWppLsaPvmpXsoIAXWDBQVnJMw1ITGGSnidMuayLj9iCmMRT69ncKZw/Mk5rXfJkilApKucWQZxproALoRw== +typescript@^3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.7.2.tgz#27e489b95fa5909445e9fef5ee48d81697ad18fb" + integrity sha512-ml7V7JfiN2Xwvcer+XAf2csGO1bPBdRbFCkYBczNZggrBZ9c7G3riSUeJmqEU5uOtXNPMhE3n+R4FA/3YOAWOQ== unfetch@4.1.0: version "4.1.0" @@ -7221,6 +7397,11 @@ url@0.11.0, url@^0.11.0: punycode "1.3.2" querystring "0.2.0" +use-subscription@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/use-subscription/-/use-subscription-1.1.1.tgz#5509363e9bb152c4fb334151d4dceb943beaa7bb" + integrity sha512-gk4fPTYvNhs6Ia7u8/+K7bM7sZ7O7AMfWtS+zPO8luH+zWuiGgGcrW0hL4MRWZSzXo+4ofNorf87wZwBKz2YdQ== + use@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" From ffd4c0032766d83eea4a70aa18fe379f12c1453c Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Thu, 7 Nov 2019 08:51:19 -0800 Subject: [PATCH 82/83] Remove sitemap --- public/sitemap.en.xml | 3 --- 1 file changed, 3 deletions(-) diff --git a/public/sitemap.en.xml b/public/sitemap.en.xml index dc4be81ef..0ae7ffc25 100644 --- a/public/sitemap.en.xml +++ b/public/sitemap.en.xml @@ -55,7 +55,4 @@ https://ycombinator.chibicode.com/ - - https://ycombinator.chibicode.com/emojis-functional-programming - \ No newline at end of file From a0b15f8ea3537f8a263d4355d2a998feb541aa52 Mon Sep 17 00:00:00 2001 From: Shu Uesugi Date: Thu, 7 Nov 2019 09:00:36 -0800 Subject: [PATCH 83/83] Fix multiplication lunchbox --- scripts/lib/initialExpressionContainers.ts | 28 ++++----- scripts/lib/runnerConfigs.ts | 12 ++-- src/components/Runners/{Ochk.tsx => Fvii.tsx} | 6 +- src/components/Runners/fakeIndex.ts | 2 +- src/components/Runners/index.ts | 2 +- src/contents/15.en.tsx | 4 +- src/contents/15.jp.tsx | 4 +- src/lib/runners/{ochk.json => fvii.json} | 63 +++++++------------ 8 files changed, 50 insertions(+), 71 deletions(-) rename src/components/Runners/{Ochk.tsx => Fvii.tsx} (63%) rename src/lib/runners/{ochk.json => fvii.json} (81%) diff --git a/scripts/lib/initialExpressionContainers.ts b/scripts/lib/initialExpressionContainers.ts index 30cbc3b82..de43f0d23 100644 --- a/scripts/lib/initialExpressionContainers.ts +++ b/scripts/lib/initialExpressionContainers.ts @@ -2141,20 +2141,6 @@ export const ibfr = initializeExpressionContainer([ } ]) -export const crxl = initializeExpressionContainer([ - [ - addParams('a', 'b', 'c', 'd'), - { - shorthandNumberAfterConvert: 'number', - shorthandNumber: 3 - } - ], - { - shorthandNumberAfterConvert: 'number', - shorthandNumber: 2 - } -]) - export const bgiy = initializeExpressionContainer({ shorthandNumberAfterConvert: 'number', shorthandNumber: 5 @@ -2199,6 +2185,20 @@ export const rovo = initializeExpressionContainer([ } ]) +export const wetc = initializeExpressionContainer([ + [ + multParams('a', 'b', 'c', 'd'), + { + shorthandNumberAfterConvert: 'number', + shorthandNumber: 3 + } + ], + { + shorthandNumberAfterConvert: 'number', + shorthandNumber: 2 + } +]) + export const glvb = initializeExpressionContainer([ { arg: 'A', diff --git a/scripts/lib/runnerConfigs.ts b/scripts/lib/runnerConfigs.ts index 3b8d25c68..41eed5b1b 100644 --- a/scripts/lib/runnerConfigs.ts +++ b/scripts/lib/runnerConfigs.ts @@ -2655,12 +2655,6 @@ export const mlnt: ExpressionRunnerShorthandConfig = { showPriorities: true } -export const ochk: ExpressionRunnerShorthandConfig = { - runner: 'simple', - initialExpressionContainer: initialExpressionContainers.crxl, - showPriorities: true -} - export const ryqp: ExpressionRunnerShorthandConfig = { runner: 'simple', initialExpressionContainer: initialExpressionContainers.bgiy @@ -2693,6 +2687,12 @@ export const nvdn: ExpressionRunnerShorthandConfig = { showPriorities: true } +export const fvii: ExpressionRunnerShorthandConfig = { + runner: 'simple', + initialExpressionContainer: initialExpressionContainers.wetc, + showPriorities: true +} + export const uhqo: ExpressionRunnerShorthandConfig = { runner: 'simple', initialExpressionContainer: initialExpressionContainers.tjcx diff --git a/src/components/Runners/Ochk.tsx b/src/components/Runners/Fvii.tsx similarity index 63% rename from src/components/Runners/Ochk.tsx rename to src/components/Runners/Fvii.tsx index 0799bb617..ba2ee613d 100644 --- a/src/components/Runners/Ochk.tsx +++ b/src/components/Runners/Fvii.tsx @@ -1,12 +1,12 @@ import React from 'react' import ExpressionRunnerPrecomputed from 'src/components/ExpressionRunnerPrecomputed' -import config from 'src/lib/runners/ochk.json' +import config from 'src/lib/runners/fvii.json' -const Ochk = ({ children }: { children?: React.ReactNode }) => ( +const Fvii = ({ children }: { children?: React.ReactNode }) => ( // @ts-ignore {children} ) -export default Ochk +export default Fvii diff --git a/src/components/Runners/fakeIndex.ts b/src/components/Runners/fakeIndex.ts index 785487a00..21076f11e 100644 --- a/src/components/Runners/fakeIndex.ts +++ b/src/components/Runners/fakeIndex.ts @@ -368,12 +368,12 @@ export { default as Ugvz } from 'src/components/FakeRunner' export { default as Xkcm } from 'src/components/FakeRunner' export { default as Edzu } from 'src/components/FakeRunner' export { default as Mlnt } from 'src/components/FakeRunner' -export { default as Ochk } from 'src/components/FakeRunner' export { default as Ryqp } from 'src/components/FakeRunner' export { default as Vqyl } from 'src/components/FakeRunner' export { default as Yiet } from 'src/components/FakeRunner' export { default as Wzqv } from 'src/components/FakeRunner' export { default as Nvdn } from 'src/components/FakeRunner' +export { default as Fvii } from 'src/components/FakeRunner' export { default as Uhqo } from 'src/components/FakeRunner' export { default as Kzkg } from 'src/components/FakeRunner' export { default as Trwj } from 'src/components/FakeRunner' diff --git a/src/components/Runners/index.ts b/src/components/Runners/index.ts index 5032fa7b5..3bdd43770 100644 --- a/src/components/Runners/index.ts +++ b/src/components/Runners/index.ts @@ -368,12 +368,12 @@ export { default as Ugvz } from 'src/components/Runners/Ugvz' export { default as Xkcm } from 'src/components/Runners/Xkcm' export { default as Edzu } from 'src/components/Runners/Edzu' export { default as Mlnt } from 'src/components/Runners/Mlnt' -export { default as Ochk } from 'src/components/Runners/Ochk' export { default as Ryqp } from 'src/components/Runners/Ryqp' export { default as Vqyl } from 'src/components/Runners/Vqyl' export { default as Yiet } from 'src/components/Runners/Yiet' export { default as Wzqv } from 'src/components/Runners/Wzqv' export { default as Nvdn } from 'src/components/Runners/Nvdn' +export { default as Fvii } from 'src/components/Runners/Fvii' export { default as Uhqo } from 'src/components/Runners/Uhqo' export { default as Kzkg } from 'src/components/Runners/Kzkg' export { default as Trwj } from 'src/components/Runners/Trwj' diff --git a/src/contents/15.en.tsx b/src/contents/15.en.tsx index c04eb3bb1..4f99ace2c 100644 --- a/src/contents/15.en.tsx +++ b/src/contents/15.en.tsx @@ -1207,10 +1207,10 @@ export default () => ( } ]} /> - + A lunchbox that calculates {' '} ✖️ - + ( } ]} /> - + ✖️{' '} を計算できる弁当箱 - +