From c584b1a96e0b3c9302b1f344455982f5d613a1af Mon Sep 17 00:00:00 2001 From: David East Date: Sun, 7 Feb 2021 17:22:27 +0000 Subject: [PATCH 1/8] WIP: basic setup --- site/.eleventy.js | 92 +++++ site/.gitignore | 3 + site/package.json | 33 ++ site/postcss.config.js | 21 ++ site/src/_data/nextprev.json | 1 + site/src/_includes/default.njk | 68 ++++ site/src/_includes/guide.njk | 11 + site/src/_includes/next-prev.njk | 65 ++++ site/src/_includes/side-nav.njk | 45 +++ site/src/assets/GoogleSans-Bold.woff2 | Bin 0 -> 14552 bytes site/src/assets/GoogleSans-Medium.woff2 | Bin 0 -> 14816 bytes site/src/assets/GoogleSans-Regular.woff2 | Bin 0 -> 14608 bytes site/src/assets/Roboto-900.woff2 | Bin 0 -> 15712 bytes site/src/assets/Roboto-Italic.woff2 | Bin 0 -> 17324 bytes site/src/assets/Roboto-Regular.woff2 | Bin 0 -> 15736 bytes site/src/assets/RobotoMono-Regular.woff2 | Bin 0 -> 12312 bytes site/src/assets/corner.svg | 1 + site/src/assets/firebase-logo.svg | 1 + site/src/favicon.ico | Bin 0 -> 5558 bytes site/src/index.md | 47 +++ site/src/js/click-card.js | 17 + site/src/js/menu-button.js | 13 + site/src/js/tab-switcher.js | 25 ++ site/src/shortcodes/buttons/index.js | 33 ++ site/src/shortcodes/disclaimerprod/index.js | 33 ++ site/src/shortcodes/filters/index.js | 101 ++++++ site/src/shortcodes/headings/index.js | 40 +++ site/src/shortcodes/includecode/fetch.js | 33 ++ site/src/shortcodes/includecode/from-local.js | 24 ++ site/src/shortcodes/includecode/index.js | 105 ++++++ site/src/shortcodes/includecode/snippets.js | 73 ++++ site/src/shortcodes/includecode/transform.js | 65 ++++ site/src/shortcodes/index.js | 41 +++ site/src/shortcodes/version/index.js | 30 ++ site/src/styles/prism.css | 187 ++++++++++ site/src/styles/tailwind.config.js | 50 +++ site/src/styles/tailwind.css | 320 ++++++++++++++++++ 37 files changed, 1578 insertions(+) create mode 100644 site/.eleventy.js create mode 100644 site/.gitignore create mode 100644 site/package.json create mode 100644 site/postcss.config.js create mode 100644 site/src/_data/nextprev.json create mode 100644 site/src/_includes/default.njk create mode 100644 site/src/_includes/guide.njk create mode 100644 site/src/_includes/next-prev.njk create mode 100644 site/src/_includes/side-nav.njk create mode 100644 site/src/assets/GoogleSans-Bold.woff2 create mode 100644 site/src/assets/GoogleSans-Medium.woff2 create mode 100644 site/src/assets/GoogleSans-Regular.woff2 create mode 100644 site/src/assets/Roboto-900.woff2 create mode 100644 site/src/assets/Roboto-Italic.woff2 create mode 100644 site/src/assets/Roboto-Regular.woff2 create mode 100644 site/src/assets/RobotoMono-Regular.woff2 create mode 100644 site/src/assets/corner.svg create mode 100644 site/src/assets/firebase-logo.svg create mode 100644 site/src/favicon.ico create mode 100644 site/src/index.md create mode 100644 site/src/js/click-card.js create mode 100644 site/src/js/menu-button.js create mode 100644 site/src/js/tab-switcher.js create mode 100644 site/src/shortcodes/buttons/index.js create mode 100644 site/src/shortcodes/disclaimerprod/index.js create mode 100644 site/src/shortcodes/filters/index.js create mode 100644 site/src/shortcodes/headings/index.js create mode 100644 site/src/shortcodes/includecode/fetch.js create mode 100644 site/src/shortcodes/includecode/from-local.js create mode 100644 site/src/shortcodes/includecode/index.js create mode 100644 site/src/shortcodes/includecode/snippets.js create mode 100644 site/src/shortcodes/includecode/transform.js create mode 100644 site/src/shortcodes/index.js create mode 100644 site/src/shortcodes/version/index.js create mode 100644 site/src/styles/prism.css create mode 100644 site/src/styles/tailwind.config.js create mode 100644 site/src/styles/tailwind.css diff --git a/site/.eleventy.js b/site/.eleventy.js new file mode 100644 index 000000000..2049a3c3b --- /dev/null +++ b/site/.eleventy.js @@ -0,0 +1,92 @@ +/** + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const eleventyNavigationPlugin = require("@11ty/eleventy-navigation"); +const prism = require('markdown-it-prism'); + +module.exports = eleventyConfig => { + eleventyConfig.setUseGitIgnore(false); + eleventyConfig.addPlugin(eleventyNavigationPlugin); + + eleventyConfig.addWatchTarget("./_tmp/style.css"); + eleventyConfig.addPassthroughCopy({ "./src/styles/prism.css": "./prism.css"}); + eleventyConfig.addPassthroughCopy({ "./src/js/**/*.js": "./js"}); + eleventyConfig.addPassthroughCopy({ "./_tmp/style.css": "./style.css" }); + eleventyConfig.setLibrary("md", configureMarkdownIt()); + + registerShortcodes(eleventyConfig); + + return { + dir: { + input: "src", + output: "public" + }, + templateFormats: [ + "md", + "njk", + "html", + "svg", + "woff2", + "ico", + ], + markdownTemplateEngine: "njk", + htmlTemplateEngine: "njk", + dataTemplateEngine: "njk", + }; +}; + +function configureMarkdownIt() { + return require("markdown-it")({ + html: true, + linkify: true, + replaceLink: function rewriteRelativeLinks (link, env) { + // TODO(davideast): Create readable expressions or matches + // for this if statement tree. + if (link.indexOf('./') !== -1) { + link = link.replace('./', '/reference/'); + if (link === '/reference/index') { + link = '/reference'; + } + if (link === '/reference/firestore') { + link = '/reference/firestore_'; + } + } + return link; + } + }).use(require('markdown-it-attrs')) + // https://github.com/markdown-it/markdown-it-container/issues/23 + .use(require('markdown-it-container'), 'dynamic', { + validate: function () { return true; }, + render: function (tokens, idx) { + const token = tokens[idx]; + if (token.nesting === 1) { + return '
'; + } else { + return '
'; + } + }, + }) + .use(require('markdown-it-replace-link')) + .use(prism); +} + +function registerShortcodes(eleventyConfig) { + const { shortcodes } = require('./src/shortcodes'); + shortcodes.forEach(shortcode => { + console.log(`Creating shortcode: ${shortcode.name} as ${shortcode.type}`); + eleventyConfig[shortcode.type](shortcode.name, shortcode.create); + }); +} diff --git a/site/.gitignore b/site/.gitignore new file mode 100644 index 000000000..47d694054 --- /dev/null +++ b/site/.gitignore @@ -0,0 +1,3 @@ +_site +public +_tmp diff --git a/site/package.json b/site/package.json new file mode 100644 index 000000000..9bcc9e443 --- /dev/null +++ b/site/package.json @@ -0,0 +1,33 @@ +{ + "name": "angularfire-guide", + "version": "1.0.0", + "description": "", + "private": true, + "scripts": { + "start": "eleventy --serve & postcss ./src/styles/tailwind.css --o _tmp/style.css --watch", + "quiet": "eleventy --quiet --serve & postcss ./src/styles/tailwind.css --o _tmp/style.css --watch", + "just_a_comment_explaining_below": "The build scripts are read by scripts/build.js and executed in their number order (_0_, _1_, etc...), hence the weird naming system.", + "build:_0_clean": "rm -rf _site", + "build:_1_css": "NODE_ENV=production postcss ./src/styles/tailwind.css --o _site/style.css", + "build:_2_eleventy": "ELEVENTY_PRODUCTION=true eleventy", + "build": "node scripts/build.js" + }, + "keywords": [], + "author": "", + "license": "ISC", + "devDependencies": { + "@11ty/eleventy": "^0.11.1", + "@11ty/eleventy-navigation": "^0.1.6", + "markdown-it": "^12.0.4", + "markdown-it-attrs": "^3.0.3", + "markdown-it-container": "^3.0.0", + "markdown-it-prism": "^2.1.3", + "markdown-it-replace-link": "^1.1.0", + "nunjucks": "^3.2.2", + "postcss-cli": "^8.3.1", + "postcss-import": "^14.0.0", + "shelljs": "^0.8.4", + "tailwindcss": "^2.0.2" + }, + "dependencies": {} +} diff --git a/site/postcss.config.js b/site/postcss.config.js new file mode 100644 index 000000000..164836f2a --- /dev/null +++ b/site/postcss.config.js @@ -0,0 +1,21 @@ +/** + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +module.exports = { + plugins: [ + require(`tailwindcss`)(`./src/styles/tailwind.config.js`), + ], +}; diff --git a/site/src/_data/nextprev.json b/site/src/_data/nextprev.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/site/src/_data/nextprev.json @@ -0,0 +1 @@ +{} diff --git a/site/src/_includes/default.njk b/site/src/_includes/default.njk new file mode 100644 index 000000000..005968a1e --- /dev/null +++ b/site/src/_includes/default.njk @@ -0,0 +1,68 @@ +{% import "side-nav.njk" as nav %} + + + + + + {% block title %}Firebase Modular JavaScript SDK Documentation{% endblock %} + + + {% if description %} + + {% endif%} + + + + + + + + + + +
+ + + +
+
+ {% block content%} + {{ content | safe }} + {% endblock %} +
+
+ + + +
+ + + diff --git a/site/src/_includes/guide.njk b/site/src/_includes/guide.njk new file mode 100644 index 000000000..c90443d47 --- /dev/null +++ b/site/src/_includes/guide.njk @@ -0,0 +1,11 @@ +{% extends "default.njk" %} +{% import "next-prev.njk" as nextprev with context %} + +{% block content %} + +

{{ title }}

+ + {{ content | safe }} + {{ nextprev.contextgrid("guides") }} + +{% endblock %} diff --git a/site/src/_includes/next-prev.njk b/site/src/_includes/next-prev.njk new file mode 100644 index 000000000..240d0bbee --- /dev/null +++ b/site/src/_includes/next-prev.njk @@ -0,0 +1,65 @@ + +{% macro item(direction, title, url) %} + {% set justifyDirection = 'justify-center lg:justify-start xl:justify-start' %} + {% set textDirection = 'text-center lg:text-left xl:text-left' %} + + {% if direction === 'Next' %} + {% set justifyDirection = 'justify-center lg:justify-end xl:justify-end' %} + {% set textDirection = 'text-center lg:text-right xl:text-right' %} + {% endif%} + + +
+
+ {{ direction }} +
+ + {{ title }} + +
+
+{% endmacro %} + +{% macro grid(prevRecord, nextRecord) %} + +
+ + + +
+ +{% endmacro %} + +{% macro contextgrid(tag) %} + {# Get the current page index from eleventyNavigation and then get the next and previous pages #} + + {% if eleventyNavigation.parent %} + {% set children = nextprev[eleventyNavigation.parent].children %} + {% set prevRecord = children | findPreviousEntry(eleventyNavigation) %} + {% set nextRecord = children | findNextEntry(eleventyNavigation) %} + + {{ grid(prevRecord, nextRecord) }} + + {% endif%} + +{% endmacro %} diff --git a/site/src/_includes/side-nav.njk b/site/src/_includes/side-nav.njk new file mode 100644 index 000000000..33d3a65cb --- /dev/null +++ b/site/src/_includes/side-nav.njk @@ -0,0 +1,45 @@ +{# +Type of sectionEntry +[{ + "key": "Mammals", + "url": "/mammals/", + "title": "Mammals", + "children": [{ + "key": "Humans", + "parentKey": "Mammals", + "url": "/humans/", + "title": "Humans" + }, + { + "key": "Dogs", + "parentKey": "Mammals", + "url": "/dogs/", + "title": "Dogs" + }] + }] +#} + +{% macro navsection(sectionEntry, page) %} + +{% endmacro %} diff --git a/site/src/assets/GoogleSans-Bold.woff2 b/site/src/assets/GoogleSans-Bold.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..f69d92101ab0b15347f2168a1bbaac217d32baa7 GIT binary patch literal 14552 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

tq+F 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 G0002yxF+iW literal 0 HcmV?d00001 diff --git a/site/src/assets/Roboto-900.woff2 b/site/src/assets/Roboto-900.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..802499d3fd9da031f14759635a3c7a489e84d072 GIT binary patch literal 15712 zcmV-mJ)gpNPew8T0RR9106ky;5&!@I0F7h-06hBu0RR9100000000000000000000 z0000QWE+|u9D{rYU;u|~2wDk)JP`~Ef!H8{zI_XWasU#71OYYzBm;+F1Rw>1dY&>gT=a!7$A10{d7SLPhj==(GFhe|J^& z%)QUT2b=+lhzLXkaOLu;0e+qTPS)8}t}u1-FfP<_T;g!&a3``(#mU;#Ohm7Wm7G~L z+x}+z6t&y`DKU>RushOe?XC>*?2KjKarX=zcf{J2Y$vC%lK6lP)2y6FD=C^Ms(`C& zA3=_fu>QrhJaAv(e_*GGghG|115__3(Wwc&NdRhj)a$|jtrhmG>K9R0(@amp;9{61 zpiM_8ULDX;iEt4%FAnZ*jXE8_ruqTOfW+E58|$xQewSiX6qk2;8df#|CVbWMH@E+1 z$V*DeNKhUtx?fG5|Nm>Lox5)*z%OB!A0RivZCq7ZxEeG2H}v;+3Otz-{Sxx=WuZf$ zHmizg>#JKKqinsa|DU?P(sv8vhf$4j(L`AZ#?Wj0$tMZL15x@C@M+PkX}ZV2`1Q6_ zaE=h;5Ie5d`S54!T)IB`QMf1HAX%P%Emrq&EX={wV6EB=9}H(I7JIhj?EkH$cDG0h zPy!2?2v=93E7adV2a}o2-QMn9Ub+EhN2-8E5(j`)URAK9S`DZGC4sFl)vk3!!n*on zzy9kWS6enjB=Yq&cqXkxBU1d!C_aU3vUVEtvVEuTEZT9@m0R_n& z0l~y}zkfd%pPSwgjiHcHMnRf2LnfI7F)=}=nhKd_24uB$uy&sy2nHYoAcX)R$S4Q^ zU!dN|tFB4U0K12dsx1e*N7fdUf!*Vb^_5_U1OV?y2R-)TwUxjHR+=;y7{8vQ=a;Na z9_m#sKKRfXiTSO7+^@vrrVxm|$|mf>HKHRuf+D3H7;wnb4Qo*$&Gw+mADD|9Tqv}y(XLLvWgNHP+KfRKV451zbu3lJzos4(FoMN{de zw?0y&O4r{&S~^+uvgH_JnE%Z+-vaGA9CpM}#~gRUNvE84#wC|san&`qb$X;rx947X z>6O>s_~?_*zW54>>?NdVN-FMpv2vRgMA2LVNjGmmUJ`R_Gybh9l9HxhN$U5KC!`<^ zI%Ia9)rSoIPIey|GN~D!nwPLpEhf>CnZr1Oqd11+;!dyJ#Xa1|13VPw-s{98bfFtB z@Di`^8gIng-g$@j_#i&^GoRKYIX%x_^cGA{ta+n>64~3L`+%xH=+!UXh9X_uQ6C-L z`>^+Lk$p^7&&uihDmuW}4$|BRrtUGdn~_A6;>g15_ZTSv350mB#V+=Kjl;h`iITXE z8@P#Eb**to37RdpmP_g*$v_IykSS}Z8QT0$YA#_u76@}kI`Ify=oX(zeZkkxk-1$( zAgMn{o{)kxWMT%)=)@y*p}TuhDkZ&OIb>Ch1zqnMzKs`2y-aw8*LYK(BJB)v%)>$~ zmW|_s3tYzy+{CT=3Q1ih87W9Jx(<<<_8!#YatO?@l$p?pN9aPgcu|O#c!k$^lQ_Yp zZ_xK=IlYY_>L=p*n9(sVeExmhhBM!~nad1F19z*JtNc?(ovAjb2|O=ThNLo8yvI8 zTd&oAXKQzEVORFDcm3d*eMTR9+;-rWO^vPTevEsz;Pb6#y=Posi^yE*pkZ|(CsxX9 zxAIPMbB;fYZZIVd7(l>?lrj0>1UFttzC!Ut>g{c z<*Lo;;eQKxTAZxEcHIIz_eQ3VzRH1xdmwAFCVSYsV9cFud9aKpBVJ7LXTAUy2xKcE zjD)gMB#T5bUo_iMv5gp(>cv96Swh1ciEJTBTee7CkVcE70~0dh7VTzIfaikchA_`i z7HiWM-yMBx^Pug&L;BVhg6%D4d+ko7!*SS&#AHr7gL26=$aS~y-JYC6cRa*lc3SGx zjqCaLq!->GzF{)Y=jqmQl8j`&l8oY3p=MHQ4*8f5G3L+KLKq8UEFvzBFcY76WJwB= zkbtBzJd*-RBaLDsf=Hi`2}TC7kReV*I3_M}wdl8vk4-1WW^9lA>pxbZl8lrjBc-o& z2-*t7(Kt@R#3KPLf^H~CB3x9y^#Mg(PxdQm@)r7&>K!6x;-C|Y%kQJ1A^S>ghRVA} z8&?{0bN}?R^jqSx_>TU4{kybjp_l=Y0f{3LwTM7%ZSp7pCu8xjCsb8{?;~oBc@X@# zk|HC-FpBTK-{Y$C$|36s4HdO8xK!GM04Zf)P4bx33O9#9RvLzst7NrI7*`Yl!rf{# zTJje%r(+5DPsP?Er0Q!mtgklGf!6T=YxDrqvr{Y4%pwJjBB)XhDKr2SEU;`nz(zZZ zJg76W7<`*;ve6cdt+v^2M{3=`?sM-lTAg~k?XlNB`yGHGN<9D&^@*H}0@NF42tbGO zmBjZHK5s39@+ROREloP@nupm41TprN+`0P=##pwS4hk2|#3%q{*u z8hRIUyaGV7SQIV*k@1$=Xp?p)T=c|SEINJYVk%C=ow#=xrnl)G>Ah$>+L3mq-RTfI znpV^G^hPIVXZatN{eQCn07Pg@EwjmH9ZtIBsdpo2Xbmg(q-|)2i3ihBgQNb^-Fox_ zSLL_o?5*zmLpCJ2`oj({_^0N#=NSjCpa#%S<+_Km55p@l_dUgUygt z9z;u18=IAm{!RXHvvwDMkB|ODlU#ShO}E@O*%Wu&b@HJAK5hrh4n0_dfWj z%_l+tfc^b8a2o&-5h2jVBWLN@LCb8Ew>LRtvvyTF<~W}d(Cp+~l;;w(yF52EZn|Zn z+wQyWfrlnDd+g3U0h6cRGVga)j1G7sr@fO0dOG8T}wA<^b_AWtWPx`47~kWPkjv0*t@lPw*jkwdlKs>t-C&6JW61j*_ti zJ2Q>tKrp`cdQ_aIn1iS=a&x2ucRben=URm?uY0Yx#`--}WE zF+ATJb$X4uIl;*g%J=<{k0uEM(YJX*-w%7B*2CI#PJ3ekQr@Sy(0bR}H2CDRCmHM+ z7oDD=TlYvIht2wmd_NSsrKTbKUR!-ZePBTFrB`M0xf{iWoBgdb>YE+?>6J1;^uY<1 z2TUaXD7+*j&Uq<7jVR1$G8$&Jyp zvf0@Rwbve}D%xbC@s~CaoNw9m*te(;%Pw_@PkOC~7N!L-pxj6XBrLIVoN-Eh21u|*LZ^)MC@g-XN%j~%G#*LrjUbj!G4#Q zRwmk${)%i@6YNtr)tPi+s5pY6p4lshKn1iw>dj;wO%`Z_U9Ns8RfFPWsza&8NDA!4 zgP{;kBCc>E5Flfe$X92YpM$bV(N|zNk23aDKCy`2Et7bd@cpXCSvKujs4Uq*&={vQ z0E0Gv#R?B}3hLsP>WTUe!(&(0q?!JTQ-3NnxrxNUnqb47v>j)T2X^dRa@E;zWKS5L z4QHAvg+lNIqK#mQV=gJk#i6R_C;un(*``z*V9kRPhPCIdHtUs|om&f3 zyA_9ZtW10R^yZpO#($`QxRwCn8G+Av^I~AZGe`eD^9hwL2G$A`dR5Dky5!v!$8}YW zj;+jE;?rh^Gy(=o2Uc!!-=v(hzOTQeC$r~m2G)n*E^^h|%#}%$7_<U*rX=G6-_O=qvyQ(Z3^)yFbb&lN2p zG5uXy=TYZ=+`u8*Jt^ac{qgC^+?vIls&V*#JUCuaQ+d+7EgRN~ldV(!(t0@2&F!tW zKJoW;V1!IPT%o3Bf8C@W)4SBcgUIUfw~~v~W3BdV6R}(eXupnHSMwXJG;kz!4y2lZFGkxc9(z_2H7#LDuW2A$Dpup%K<-@H@wG_yR1Oq5J z&U1N>N{d&$&ag;5w3xTe4F;Jvi|#qc$nZ*t>WE`aCKvr7kQ^&r2B{b6FBJ0$B}{}C zP>MGNVn`EY)NGjW2$lE@RJa$ZP?G>tz~U?VJch7Bi{Zg0m~15Z1G`n4ll%~V5|$or z(fl$Zj2W3A-PRX5TDJCh6tJ=gg_$Shcu%?#E{>^oPA`2~u0|2&Oem@`#&z{cUbc}K zI^$_%8Nba=p*qv|-V?1(NY!K;y}CGXF_&peW~m(O(7?VmFiOM-7l5@HbD8pu zR5}NGWeCT_FcHT$IKmUebDMDppjiw`v_5))pvYL*BAk?|&wY8IR87Y?@YNLP}%@m--*T`Ms3Q{$AiY!gTFDE=cX@E*l6#M)4#WLWBw`wCP-QLAr309H6=4`0Z0|0a<8)& zbi8fvF_4uWmBK`zke8J`69Hi*jc*7Gqa_^o-LvT+BsNuMUPH>0 zt{9RjHp?U$$C%lO$ew(L+URfpp$G_Qwkz2#Sq*} z=TJh3fy(prXdOJU;o%OqFVF@k6AefBBEwhu3Bz~ykwzpQdn|kxaF()38UbU?woQhp zqhaexV-LVGGr{BSvJnt&+YMM0TIPb7hgLJRY#4P_8+pOS>?6qpX<)!M~`egGv8+BK^bRDy!*`_X1F4V%~4?)ON-Kx;;bgo+?e9JM!!MnE2nV?k285o}0{U8jPiNT=H~EmUWVwLZ26%r9ccC+$ z(7jcMv;YATZKCJ3+|g?J0$XSE2Kl|FI%d=RnpdNzKAbN{|EL>R5RJ`5SCQt;D7z}>>rvKNKbT^gRXLmMem3_LU@P_YaDPS7Q72H^$cn;HGxDYCPY|v^_`v z=wf0m=#5Y)=HAETvJd~ZZaJ8? zWDS&;Pi~sHh(Dw^PLErWoN)*bG!z@2Jh(^8{%-klff9B#5E6bVy(?)^_3d%dr}D(P zcs#=2-Jay@fes3Eac>JV(KckVF?F%J5b$l~@Ge&Dx$tO?IhbR>s?!@h2TWdGCqm9( z>j*fSp0KwYTa)uSgs}v~6ZkOi7Q=n7VVYe2jfkgU8z-Ms1cn>d#j@+sC(O@GypzMVOz!IS-JHg$AkrF;N2-&U3SU)?LFT zS}2;ir?*p!Lg07#(q;Z**O)2uMZDEU3FU?o!#3GFgwT5aYO@y?dT2cRf@J+L1H$C_ zPUZI1JDNViG51ERxs`aqheO4meg)neWteJ3@}yqLu+Xr>OQ0{TK9vuN>Gg${2<_qp zqZR0VD24XE*j-t}x?kx*0LAc1DBoTR^=_n{3zdm&jd~*Rgd6nPk9_Dxcd#EB0zSVU z4Fil=jH@pus;2~#`jMlu{74|VSI#<;X!V3?Ce}N~4Lf`0n8KQo7@nFQyU6my`)$N( zQEYN3Ydj_hpqR(=klvmvz;eP`hq3m+6u>2$%i=1VpFA>s*!;NG$Q0*$(IsEtJ;2U< z6fA^XbTQLL>LJ|#in${gY_A8$Qim`k{lE!XBAHhoNPJppCfPF~r1nev2TnLP+B+zt zXdAezf5v>)lmj>3JN~Mp;l2Q5Dm&E;pcpqeJDiL=pa2v@kx@O@M|qQ%vUM0;_=)rL z3n~ps!dlw}cxbxH6xFA!Yeib@nBm&M`*hhwwI1j>jlrVW;=fH?ueVg}i;(MTGGV=qds1hi z+&?+4aH9zcT+V0TD&Apm3FHB#PYPb=XBO=O50h_w{KV%?HNOUo&fhD3toe^;Tj0>k zk52XqjHLiC`V&MZHZs*Bo!^abjvD+K_MMRHZZc)Li+);XuGl{%q13#*m%!tMrv(T3 zS%uI3xu6-A=TD;vtJ3QSRdK6nCK@Qg7^&~VuV^%%DY~EMD^K0~>F5BWu#1C=WbXG- z`C}lj=K5b%Id?KCqyTp^B>-n;5bb=KO4WbQ_&h7O^{3x4srW@PH8LhB+mVLyw<9zU zH@h`o7o69yGw&O3$@u_^@8i(|vwWU&UuFNa85kVR7&U3h6H!*qmTm7#k)`)#8lXMo zc*09u!Nk4*KFAf`?^pc6^geR0nSALbD%6V)Z++Y^skq<#vi$hf@dsv;9@_iG_=^w& z-spH4d^<0VR|e4@tM!wAOdx1n)$?dV(0|B6$$TgZ;5bB`tN~mWYsw(=KDYB6m)*g@ z;rb8TNp$ERO!NimrG~Dhzba4uQ+@L9foaH=ZkSVp;2O84h8p4!tVG$Y{CnUtSkJTcT|Nwei5euJsRs7dQmkVt(&u)jjftL6hh98`6sFW7K@x-^It6uN>fhBn zjBnjswjzoGKaX^(Gw=`JJ;c!Ul-vCOtY>F+QbKvj+QLN{5B`K)jebRfTIMg4gKBmT z6{&vAmGA2Ruw0p*HO_%rR;!xU0nYTMWXbdue@4gP@I%m@Zd|K_Ifme)0^`C09KfO$ za8Mlmtd+ORRd1K#liO-4&4juE?OS&j2`Hie=brQP$l||oY=lZF6rH~raD>&A{%gdH zn<`64Gg`m_9KeAk9zl7M!b%rzTebwY+_UB?n8S7B^=(izO(*_+TqjZ2#@1ci=_?i* zBY_Vii?Xn&{;JZGap&bGoNCU+xz09~PkQ7;$@2qZ`&JD+BCzaKEX6<#T%%F@KdhB2*oFE)gT@d4C70KjaSLY*h2Sj)fZY z}_woCXxFtm*0Ia!Y_MdVC2riGo7~*j{YyjJb@t>~6BXNYv2xZvC za9C}d2xT%&A!Z)du&$t5*Y413$j+AHywvvEZkzPPPB-b! z22y|~TW}cEj4E(hz`Kyek&P{@g}sJ-^Y-!K{hi;hmr?cE5EBfMYZJom4#)U6ByHTR zPfSVAFUrdHtX;kp&{R}v6;n`L6E?q46H!!_iz%z{YuK1~ug%RzF$Q7rQT}Vw;UU2i zbgHQ6fVHX6;1B>l5-`Qq&It~>*81%kA)3&%5GRFGV_JizF>@Te?iCuvFQqKCru;)$ z95sL3Ki@gWYo=dvs!h_Z$vzVS4q|k@I~gdKDfX|F+#;$J%(2 zT-`ijPK;%=DafY|or#2}q4I&~ry;%%=4+7+{(5cM65dDPI_(^g(bb-_8g(z1Z+_(*z|D~W{h_>!@TDI?s|-X_#tE@N9R zE!@@GDAZaj7u&fpK|-yh5Y+D#Hf~KjTP@GdTdhu#svYNQd~C4^QE73$LDyogdqI*T zU{>0iJ^VhsDcOwLqD*6V35;9nMZ9uHwx11AE?*E=ki}R{ zM48N~lqNycmZ&PFx*OHilwH%F8fQaDDE7r5P%grRNGCc@Uiq>TNn*#VGa0}*C z{CZsrP&he5zFa)9OF*t^B*nP zWJ|PUYPQeZP`VZ$3x;tL+?!?=^k(O;S~X5C)Hh5ow)V1lxCUbEoc)2}7=>|?pz1^ft2zngRa;x7Pn{wyA#7#w@?ig%PZ#Vyj$i?oTe zdCBwT=dqK!J^qwRM>$Ox9$T1OKKbj^flY;ECG?b_nq+KeW_(G@vM~pqgz_d|vp2H0 zF+rJm`#7ViqF?f+z+j7rkk##x<_4DTe^96nN1$LT+D`V{&#X_9X(pPve)Rr8bR+}s4`V3%e}AtrklaGEjg&yfQGDB~++na3 z59h2%FV93A@*70-Saj*ECEc~-&I{iQ?DblZMX@vrP8?a#@AYt_%(^tTfQ&w4QQGhQ z{s380O!~qsdaZ+R-=JK{8JBC%h zBjOVNhKfUEGaK0J4jzh^iQWP7uYzMo<;oj`dbFTd@;-m{W zq(xB3atQ}wN~jyPe|JPQ{hb0ewE~^|RrHCcVHph`@MgTW{7v-TnUgi)HrMGM1G7AFCkS_nrd3=TRyiR|LxG{jp+*-vfn1-JH%c0aUZf0!+{J1%I_} zpxK$AwiiQq$LRJ##JbTQTg6iJiWPW-+`OO4W&SS9%M1z6Nd@_;_~)dBhvue$yv5vE z-W1*u%mfQ&-VqWWEFGYCkEl0ALfrv3OwMa=u%W`K0b6=TVzsBOj0#_dOqzh180U}n zrR{O;jU6IC(Pu>b5@l8R(Xyo6k_5gq-A02rgM2gQ9u4uDG&d~W|6}=v;brcm0O{EIKJcS=k1!p0C_Yn{orlO_ zv{ZeiePp6I2t*SB|Rq zXYHtf=BB91sH);6qjIJ#9dT#Gifl-B_4M@S${!q;njDvynp}1D(p%f67Sn{7-D@ZR zy?QnJ=ZdX^r*A|ym*Q-E;#P&6!$qCf@D5Z58cP)lsX}V2m_DYfeSPB@|9S(Sb~!Ls zl=tO01usg>67IR@raay@hI3fu2Ihe~`2e(%LwN`fo!&nUhjf34lrH%Z0Lzz*T4Ki1 z!Ar;Dtvzh&y`4*4FB{IdW5vY3;GE`1Oy_UxQonFxQkmnHU@`~1#1_7>K%!NDPSU?+ z29RV`CxgOA#MaFCe+~X0g$^?2?h?!$BgJ<4j^KFa_yo&hcHXniV?b16GhS~q_EvkF zz1`js+F2GHvfvnQmYdanjPNvm!&n`ErrlMuothvE?kv@z5wk|o7$grdYD@#qs}dct zy{O3cnl=G3YicFGJJlT_j^7}*aAs>Ym1j283-(K0UWf}~?T|BXrIMKr$dqzE=82An zqps9R<2Q`n!kHE~6RkPBSJTjJT&V8`Nh(Sd!4)(2K;i5of9WESr3b<=>bo5=t|h5p zjucuJcOmfUF$GA`oVokJG&~?priFY-@54D*Fg-o-X{x9gAW{{_T94wEv95OQ*-+9g zY!PE}(TNL7HxtxLuTC3G+y>Q-m=&K;3h8F#zfdbDK=SId~rMcf{8~rWzFR z`8ZS6l}PqjJPpXBq!!TBC-eA75*`cU$Ydl$LF}J2%2w zy745wRX@G(0Kp4Fhx2aN0`%?q${3x7KbGF<_zrSA|KdDB56EK|Lg?6oBrgEMtYz~V z!(@0Z;Ku6o>E^~#YeF;$pFBM5U(Gg8$It~NK99zX1%RQs*ZmsBy6NicZxWCO;Xu$p zu3q5}!;;hnnS^^J?7O0*kZytyZP-}idPHV{h3(X$`~z;kySLUqH3obUe36gVS_rir z1Jtq_OCc$?d^{S?pVzzA?1f5jDGn)~CVeE@Ln&a3?TXP;qn{gLsN4{)N0MM<0~=CR zXy;|3id0nJPHg~)`b;=^bnc$lLw7J`gMGO7An9iOm4@VnZ1ub5A-6 z*X6-JqTGG?gMxVxdKtCArcAD2oN;FJ&5W#Xg!7>ScBH%h@VpOi3DEF-^*)%|^sFJ3 zMLl{*iGY*~?6;XgJ<+zTK z5An^deD#0@{35Ys0KK#(&C9&H?|SO{$wC{0JtwubY^XLbc~b-u0_x`zZ3^&^!x>;K z*#Y$VP!8h__QoWk7FuZSI|{5LlHsUL#9P9(rufebVPOZ;4-Na?DG=vYQS(G+ZfZvxB&sl5#Q4k0CV0v zuOF$27de?6wM0{HprO~?Ohz82n^$^xo3qQIoyeyQZ*`%@b+iQrN?7hC?MEM`0L(yk ziI+;p5-}!_@-QZofc@0+3BgE+S>MlK;6}0o>ab=e#KG6d?Y>Wb6lo_kz=9>$Lu{G< z$-K#aQ{+0+0l^wd{OQ3w4c*`gDpC>s!$Pc|#@UlV)HwV;@=IP6HNn%4Is`YfdZ4Jh zVJ1*}?t~Dcq4Qs*!N;1ch9fL;itpBXH>PrOEDN!8@{*lGf4oC}+f7);Yku4ft7qS* z70$Z9_22k*wt~m?1OM6IxH^WLRG}kiC&yH6Pp-eEU2wx?yLiz^K5!o>Wd_^IcHNk} zoo;$4)*UXbdyS{r{{s_vob>9kF@zbx0e}P(No|32_=vte^!WA$mJ5^zeGdSb z$WHLn9H?JyHig=+LIhUW0?ZNJ%^h>Za1g*QtVl#kLOjr*W)&n+IF{Xl;aaL;t&V{9 zLjeE@E??3DSP#0IOtD<+yD6nOl)Ba$Z1H4?A6a-UIhr}?CbzjVG_&ddBu=5zo|VL zs#-6P0wW8k(IhH&Hjzw28CB7|P0&7UO)ZFw+W2rS3a03s@)km7& zU+O|~J4J9}3U@I+Q!(A>kHrLlQaKR_n;%U|u4Egj49c8hE?iAV=*y$eCm?FFo^?f} z_+O(gnbCTbqlFy+0PxO?MtV;3CQ_Qb#0J%0IxKTiXKpJ0lm5)&l`j)of9BH0?8WTI zYIOcFKG+R=L0*Tomeb_QDxzl6w)E?x0>sNKNkEX%}0mID^PyxS1eu zSQVe51bOL@(K4+KYrkAA2_=Yg{TI%;LGnyRrkmrex2sLXgNvD4eWRY$206=5TrJ=8 zxY0lQRjfbwU{_Z?N?KRZWR04*vq)xwZxoJ=xjTKK+KG7&ZPKs|#WMz}3QJ;hPN$P! z(23N=b<-g`e4jbGow4Jc?H!HW-_=&V8I-Qm0vlNm6D}W2aG7U&OTa*kXoj`g@OBzW z7bII~O0QbAMakD6TGQoH1nfdc(&&}eKM`Et`XMzOuWkS}V76$8igmfprKr%-*qWOF zfON|pj^m|(QZ5+8AW3B+-sQBa#8?lIZ^MnNd_X1;*1QF6pIWv)Yo&Kgr-^_wZmj4qu=jncgxrPBaTg$M28bXHgz z5*v^I_PxK@&COHITg}G}uBfuAmB-_;#Y7qflJe-!{X+Gcf6<=>uQvtSvAIcJ(zUxO zy0%~Vucm&OVr#zEzCT63&)fFZ{+hNKSj}4f1r6$vmb*V+@^&8Q`E~R1L;qhtwpMvw zKX%XAx-P(b=R7Qy6~G@tm@eZSaB@+E7ygV;b{#NHhU#X!#~XT;Mb(^6n-)hqSO2zs zqaqa&+Ckib*%Z{dxHCVX!o@Cr5L|Rc*V(!FL2%J_wb!U^s_WcsD2R~*K^Sf`aNavZ zGHY~OHCs))WJz&_@bLAjfYQpU5O%hC!hf-7(TPrG*HKoh+xU2HL7KB44uDO|P96hA z<;w^eEY|#DAT=WTG$ENG2d&X~+|qpnbXqDTgl&Km>baz1VZAMu^sf>$)m;XZ>{87r z_?eV26@|PoGyKen!#OlZh3dHIma86g=>3w5@XnH_5!OkRPtR_9?te+ly}>-krQ)5ysuI;^FNue{tb* zdNEx&#-Zb!R4%_3{uz`5K7Y<+n<)uOcS zc(VK?UZ}kgB>iyp=P5FpxzH8;e0+oSJe!|kcDoW4o6y9taR)~|0s!5!rAluM)az3k1&pI z39s+zab_&HRlArWhu!iIcI3&OqxziF@2Gu$f|A%m%zOAGzF*MJj*HD24I{(TW_O5n z?m>NFD{uZ?)Hxd$$%pS(s>qpwEMGOcNFol1cCkm{xh~xxT`L#F|Lc^18hh`wL*K<1 zOOx5?CYLLmx_E)kF1+d2p;e8g<6=4*@%Tall1P+P-EeeuN5KScPO&#~nUy=GiL$TX zqZo=4s>^_tbiJa?0`}@sdq&^SO#|y3%=D-`8?r9$8kw69bCeqCkA!5Z%$Bz=?!!)^ zZJKP4juU5i1ST@Y6-s-l#HzEbLzLxBaha5W)6LMVnLAw3-!7JxYm*tem`*6lfj3fi zt?#i2yL0sqsfYt+g_Feq#$OB$ExISMu{S}y>C=fQbBas<+0V$8je1c(YIn`Q%dd)8 zHeX%yqOvdNEAaRtwe#$Y`XOg?{#4E;D}knitsXBgyKPI-w-pQ7_LDU?Q5nxwhKtJ? z&?t@QPxKpvdYJKA-<3UG&oSGw(e4a=G~_}?Q6T|udJifQ^~Nncf(Ytiy@3+@Qy?!O(xI;&Uohvuor9s^jrY|p( z!i~vw{W)SzR&iNnIIZ2+AQPmw`I_XPmB?7l1G>WUMQbu{s3#h(uXrmXYy^XsK@C5Q zkvxd<2?A{_XLa6Z>qkztyygg;<2}GJ06zZ-1C(}S05NP9)x3etnS~Dm1xjep1>d(Y}$uXu##lb2Z^}>vFD^aM5@uG z;$N`Qo^kQ$5UpsltMP=kYxN_m@|$4Z~%qr$jAwJ zQl6^(e{@1Vwf{aS53Sp899$f9*5+LtNVi`inI1Hy>{`xHd)!F9a*$>=a}bOq4eHNP zw9f3xePQcXP%;N5-IORO;~$fTMUE#aq$Yi6;XS{pTIy0{WFBCj=0a#z=dZ;eyN>@@ z#(eJ5@A(!{m%coGw}M|`@V)*LD?m`Hrj{MG|ny!Ms4O3T3iadQIq)Ss@jAc7RE zDLzG)Lz8mfb9LC|rpxsYc{1slB?Qi&(pz2T${rLn(dAvZ!o)Bn)EU;Jt~-CuOwOifA^b$qyPxOuWeod9FcRb%gC%5mCey$csSi!;3ZE|GW^sxf;m{t z5|i>H5i_>VY|Im>j5- zc6%Ey2Srf}CNg4)n8?VvXk-NOeescdT-g5;`ap^C-?_G1004083;P2ATp#T>e;fb4 z&fB(C2Y?3y06@UvaT^5Sy*HHh$4h38PMf~vborQrHsc?P&sG#UY-=^gT242=$euKj zBZg00H8Sq=%suQXkzaW7$$92RnTELA`(r8-SPhjIz%c+igd*cZ_YZH4VMkq}{A-J* zvQt%HJy&n4S=WE3m&$2IGu2d992C_qkD#56orE7#P2f5meam6S%1Y_8L1m3;UCznV zz_5s&yzv(usAO9A-{lj_X^)&s|E^BGBTjkx_6Phr;(RsNYz6p}!mAIzYG$m9LaRw= z<>(bp2JAtnc1d%u`aG?#>pSN zF4>uW#+99n1Rx{Pjna#%R%)&sCQwK=1TV_S49}_cEbaH= zo^5da4fTEP_niR-_m-W;o_%KE?nv(1sxh@rpXT;hBDlW{Fc|!L<<~JUK@7dx)Aloq zmHsI4O##FJ!-WF@;3`BwwGCh>*i<7nhE`)@jb{@1Gf7la+)Y*-*y~?ZEW;5As#F`L zR*53T>d}G)3KD{rq{;=CE2y8MQXYR5=b(JLwpiDRsz93pwHou@`TS{B$<3(uY4M}$ zjq;Qg1VtL;pjH<7bxKHA`hfrD5D`?a&W^B*^ph^Ou2(HufS?h|KccI3rdR?0WNH-& zC@2XERQgS(PJnbN5@__Jqv7XaMIgdpN^GfoFUjoW^C9rDZHVJUyNB=54oWd_Py8f~ zKiivD3e$;P19HxjU87wZP>l~t3-8f@<8qL#Qq;hr_i3JXiU!=E23I`wz zfg@kZ0w)6oT7#>###kh3K~u#}Rc6YJ zTD!F5p*Bkh^$3fV2zxq;;eDM28!TB>vo(BYKMnhbjSBpCPv$5Vo*ip-^&hKHi~m%= z3$l9#wvGHrPTnDYZh!Y~(JZJGla!PegqCROl2O${Ti`&3BG@R{7$`PaiS`eLhseL4 z{&aQqop~!VqL{$W5w*`@`uyV(^{4+dCa%o|2t!C z7FtwP!h={!U|9-S3Q_5a?$PzTriY8%0QHEbn^p(9^!3UcSoJ+a}FDX6{s%ZdHb9QPR;!^JUHa5q`-C=d5hUC)Qs=Iiw9B7fm{AS<7+&paZIiigK$IeY&JeT>^ps zWvaIS9fAaq7sGx=l64U|DU~ypAC(8{-GfjwS|da9-8oK7D?(!G(v(?WWl*`dq)&-}RMd8;n?~ zzYFo$7iEh+wb9)a{Wm&1+TTDLhyFN$bZ}pYI@AO(` zpTKrQ`%@fb1&4r&hGUa0w%SI4s_isr(xOd=9({(4>}1V`EeB4Vxp3#fi#K2XTD9rW z>9jM>I_JDO7hE)N!6lb1y6KkN?znH&Gta&7);sTg@X;sVeD}jozd$;*3`dV3eQbt= z-6ssSn1n|_y3X2czA`)CJb1y#cnzwgxS5|G6 zUv^5WMtSwYp%Y|+b)oy2Kpa2-G`!c0mX~~qK&3v>4Oqfm+{5zhA_$nM7EdOdWxZhq zSYtQbh*wp|&Q?rqgbsA7m0GO=&+r^C{68@L#IM<@Eb9X+SYtQbP>mI=;u)UfMPbB- z01xWCu@JaGy#wCk13u!@?0C#7!bUr~(8I4n1-e+mUEITRCY3E&4uE5Rm&&uJ>Ug7i zm(+XU13uzY@rZn#=TV<|*HZ|+UNNcf0;^7pO?{H=cW*i7K{o@Xo~c&Ps2j>D8#(P> z%RHh`?5^#tFWzxRzVTRM$@*IU`)h6Cvz!1{LyX|mia&K*Wa-|)Qg2(7kkzkIsm}>TdY#XuB-A=u-@H^8u58w zrv5|w><5(E_h{VeO&E16`|!`X zcYWAzUHa~i867WUo6Pgpi>;9RW@}RVK_F3xuUCVA-*HN3>t^)>AgA}dgY#Hsm%ks^ zS#bS*!L=UmTXz~*zaZS*`H8Zw=bOBYDc8zNiJbY^QctM?hI_qu-?>HRt>>Ui5&dQ^ zcXXM$)r>B$8GrPLw`Q;V^%O=B;Yk3fgqXyz|AK6?4UQ5`WIBwnnX@FudZHv- zs}v`$q`7kgFRMHsem1JGZqcgCRz1H}aoP*2-ulGNH@|qpXtxUyh(N-Sh=Q2S6tjga zTM2C=o(d^cNwuBAGze)@kPhi|Nuft^`V?hACPUH~QGhuKEJ$Q2LS=zu;HI46xPXXj zo>-z6#~?>RHeZtYk)c9}U;2hbv_mAm{6!PHbj1}gB%;a+opAx?;`dnQU52;l4rs|T ziu;q5=7FaOR;)r+y+HDICC)paps$7``_U_+Ay{Ay31Sh2u_!5O70?8wl+ojb|ROTWchcgx)C`!c-A4)hnT9 zErgW>3xZ%la7fT8h%i79OhaHGgK7{*UV!QWMN#qDS9p*#t9#S6E`Oa0X75M96U4nv zHkSon`#8IDXn$vu5`)7WY)fqqH*x3D4tAkqop*~@7IFlK5MYcU_>syrFtEpo=U&d; z3zYsN&nlpPX=HdHFxX>P+^ySR$_1u*0f>w)QsmKC`41) zps=k2fQP~K=>x!F{KN?09+&}&F{2JUf@j=>qb4adg!rR9B}1Yl#~e59gc-9ikRT}l zpuD2h!2|e*t_A?t^&RL7VNX>>Rh9>A;oZ$A>j|?w!oda>e)c;&Noc-CBE_FRky@n}6v zc0qPY*_HB;H+jv+{2)KiA7ztd4{z5s{=dHd-#P#QI$6E?j2d&syhX3AHMQo}Dx=Vygm{p5zWLq=y9lS< z?A^F~mKC_~u_aGDRb<6W5Bds9y!P43tSR-yPjCJ5TbY0QC%u26V%E?1h1&;IUU>95 zCZKAucRsEkdlvyUi+vSPyVy4Yb&qVkNxcON8Z2o^O;)s$W~*64tF^47!v;3cZ4;a5 zv4b7`u)96%v#)*ixz@G%J>wZJm<^=lHh>ol4%@JT7Yq&iTV8N**!rK(J8+1CZh0!C zxg&%jbdv3IsJREBti~KXf|DqrHjFi$!I-{8007`oIz$&d zvZEP?@b~LDTrcKRYFwf3L1i9NYPZiK&3G{29UfN7kwRyY6Q%Y!4{bVk_K^3Kt;iMM zLMmh}WFrDYc(_g8Y~~5A@Klw};l)JqqOV4d_tsP5><;zx)KkvsLwIoUia$^(8+C6_ zl&NR=a|Bbm>7Q(V^laFW^x$Yv8V9r?Li^AuEB6@Zolp~@Lsn__of@f1 zfVI%x({o!PL5Fn<;>02ph7<@TYdlUUw92lCjq0Bu@?rJ^8w7RC{bxKHnn9X|RM1Ew zS)EukOOY&-l}G}z!Xu{+z1D4OX}Uy25t=lzx*UgkqEeYs8wDkSj!oG~SXQMbQy52w zP8ugEW4ci(la7&TqEUwJwVP21*m|<=rS}y^hpZao^5%n={c~dr&boo%!gs@fkE=2OisO2@$*yZO0Eoo z;guJk-TXT>{oFRikf)RZPn`s=1x7n1>!HD+1PK@viV&A1I$`ISk>Z%ZnIrGCWaA}U zV=b*|P7+4ls$wULX_Qti1I`(+Z&J*)b51|@a5>d^NQ?3cp~F@(xlRJTux75%^B#*-ABjo*nYhv@_hNr8L(u!Nl8;}mjPWdUJr%tagIu|4UJuQh8)Pg`45 zcTFqbrtI3<^<2kvF1CzqyCPXxNR~V4q`R@A;-z+Kx@AvTso0OUdk?=&S|m9Gf;Bjk z9Yh(9{=#yx0|xzJ$fF}WEf7&ywx&Rn8Gcy&1P-Ihr8(YYOY>ak+#rH z3?er4*zL9CBojjD;LQ@kOX#&6 zbmXKvt#vF@U0+jt;b^+>xBx3YnNK%(jP!lX}KNifjqJ-r*aIsq1@I!yEj&OLJuX-dG((O zB(x_1O0~3MWxA0yY1nD4z&+I*mmObeewx_cOxON9WkpcB z2@QhTzzBV*PvdlDyNo~27>IBCkZL8C<6MsXH~&t}KL7e!g72qj zVv@J2{*)^a5RalvsghM&bc4564N;i2Hy{@NdZggx#>(1&DCg(v*}yAL@OW8`jnl-~ z;iPFZ>A4ZO0*WjoC%lqXT*G&U8i65)7;R;?lh5)>FKBr6s?6p?|1d+J@3mxKq3$YIN94iX4BM zWAnVF^2CgH=h~*faE!QN zjSRQWHIz{+k@75xRrF3)wX@6Y)?C+R!p+6fYNojwc^8Bb^8ade7n538ugzTj>L8h( zQCl1?yuj%1)HGR}QjkI)Q&0~lB~SZsc2wpJr#f>;2jGc0uy2?#h-xVzAM z-Sfbck2=9d?OMf58|T}`TLG15abL_|+E&mcdBcv_EM1+1O2&k%3e0oCG)_<2yoJ)e z>^9oF($ssRMVFCd8Q!bcF2bu^yLHS17j|8)q3AT_+gLDTZVtdyF9&V#b*IERfalGj zP#=INvI@*oK2uYl_aW$827OWd_KrbHlh7#%A$LaCmzy&xswaHW0b|kTSZD9Oz~N^p z=~JDvcdWyYQj*xY_J5n(>zdkMiIlD94*wRZV7Kn8Z`=1Dvj#br%O?%F+?HRupY9DB z8~)7;{I_16l|y!m%>6&W#-K5cex5RL_byL(^Mi&hj~gZH))=Rc5*xz0g0VQ*P(Y0( zx%p(WVyaV&+X+FmgD-B*a^z0cZ#Xj`GV+!(&8HM3btc0cc(5o=cIjdos@YG>!`m{7 zCl6$yG+2L#nC(xiojSZL2j^(!_r(;3gistwc7)v~p}U|N3=O3?KEP+9>Vw2={4QG6 z-F)w6>KdFiE-4ydkX`o1Rgm^%po1RQqvIlJIkv?xT8<}Z~LLH@0YFOMoSmbEPT1L z-?kWQPGpRXPGqtR7}43)MD&R0q7yRK78d0|iST!FF>~Rjb%=yk?2gE@ebT@zvXOl? z!AF|=?8P&?l2+2v3GlxgQFO5EW@-UZ@D=udTLZm`<$?brlR=(LkaaEA$c$}iy^ z+~Ld9DqOBz2WI7tj$r{*H>N0hDClWgD-@^h-D18+C7Ru%=heW@-BTd^aAoR6`~PBF@1K$&Z3wqXtdXb^YZ(_Tk$*1wP5PmD%R~0SP4MRl{NEov2r@L5 zSI-*MCMXYZ?s1NxWB(IBLTi$x{8v?Ny4oY$G@ANJc!$}LEH}KxU>EMs zX+kCL@Uq-%1vz>mu)>i}5sL7KZ){w(@|mKCTrDV-J|b~WR&Q#bP?ab-Fkt_FRt;@0 zw;~i3pd-EP$_YR#uDJdzwg{U<2) z87pxDFpn}nKPB=e0iK&$7LRh#fp%&h zB_+Qo4^@Byt@^if;w|U(oTl`giUd>C(d&!bZ_o4cuUxWu@aXuhyW$7+xYc`&bKxXB zOJm(&KNS&JM5A!&A%5xrAvL`)9Ok02lLGDZlJv1;WCi0?v!eC+69QfG^GM>e-P_Vq zK1zTC8Me#R0?s2r=}Y)NbmJxC3^77>!Yrw!Tu-+)03JwG_9X0rj?QZBfet1h4R`n? zvxDrptvSFw)N;s3E!pUznwIEqk=9v_T}6hZn6j~C9bYZ4Nn#Y^jMSS;Xcj$OWsFg> z+D{be+G*Jg5Pj*#@y}18QFP@#tI&}em)a7KGU1V4dJZ))tuhv7qaz&zc{xf*M0o(> z!uAGQA|*VkH~_}Lj=BVmggk4zAzLSy0Q<9T9#ZpZwWXgQ6cnOSbm1HEDi$TtW0G8y zu^q20(7EX@V!v7X?S)2SwS0+Im?P?l8VN?3xUmI#OAIUfh*m%ZlS##R{ZT zech71P$(>jV|p9~?7{CBd2j?Bzd|2m@=uJUhX;BHxBS}4==!pFnV~YXvUYUto!M5IlW6PoH2d zevb^?6mX0b%b1gT^?ZK67j-KrJ66xgq$lq!Oh$?w43ImP&xof*#zbf1q(HPaYjNAE z8Sxpu1iO^O{e-VWP82(4s)}W71_5^!eFlW*Gc>hlB5)S>|AvkK3ANz&;E&ZTSD{wi z#ZHaGj*6d#bT9$NxjMpU$ySPn%^4c7nN15xJ`V0|CMv$%aEy}2=r}Ugh|CSKz7S8e zAkkIWqJTvANypnEPWlOjj@*LTip4z3cy3>uc3JYyScM74PQV&$DL4HSsg;mo)y&_* z>^y>9Mr&`Fw@y&XYa4UW4B>x?ElhSLw);Zg-FkQnml>mPVI|QCk}_tKdgqgR1-8t_ z#9w^1o^;2}WGypNIxp2DLHSOUyvF%{4V^|epHk1yP*S-yT$q6l^s)0)W%}=&a(UjV zh|IZ{b6*E5C0#b&Ok#KSNOXA#YdyJbgBwrad;hk%{$J9z6udLVdYf5A9n-AOGciD^ zRUXfbDcPbZnpxDzjN4~p6PM=7ow0S~RA5(glYiqo@M$K&eNu^TU5N|m4*DTY`i>&h zO$&rVe2)w;pSR-YnwJ|*sGq-KL=Zd^@vDAfvb~7kK~&9iHv-Vny7auhs%KW#C3Z!cTlBKHJ!*Ta@dz zFZ~*-!fxcp*Y6c`Av;rD4aXv~2=lE=^(qI55)9`{!UM5mgnvc0{T0lyI&AA0YTKXx zpYp*A@cAYC0;P<1qd{{ujJ5#YazNdMHfAm(E5Eu3Z2-aAH&cc7%~&5cYLhQwuaVR0 zr`JMCu|n)RH+lh|JqyUil@0l@3?3__$8(x4+cs(1$cW_&uIr52iJyVhSQ&VhkUUSw znE|Byo;Eo&lOJNg#J<1~V$U#y*cT+a%~hT8JWAnxxo4)d7pMlil@a`eSxqT?FilB( z$ZRVgt3<8%MV|ORO5r0zL$LAtkvpn*-Y`3vcR}am8Fa+-kc7s!eMC(_9x_@GF@1bi zeu#I7_(B;4Z%dTINgX0?;vMtcHc+@<>5cXS=R3EdHedVAu2AK{@@LArj!Rb zl%IKVoIS_mL|SKq4MB42UlC{%WlrvOKzLcARokxB(8?#54Q-B|1m|r`MI??E3+&O{h zQ5UQ}ydw(jM@gfOcl8GcQ6%aqc3KO2ogV-@lSKRu0!C=j$R*!MtOTAY+w+~?X2R~Q z{qef25*#%^#T(l9Eg9oTWK~)#Mw6S=b~B$PL%zGl#(t zJ2AI%1~sGcXM|GG z!|3D^X$mtY7*m|jvl@!76{3Bpv@v{-Y2e*h$hpSFhP$_S(!oxF?6~2WREp`L5z(4q zR<2louy=%iKh&^e3bp(L{gRUC0RmAgqBScNjYFX>(jvSX+|{gfYzFz4%cl)f&EzGo z3;n)=-wPLlb=|{a1M7NG9-3&CtmOC?7V=OC))eM+4yB4uaj=?*u1M5}lKNfO^c%bI z4QTck^HzxnXR5m6IBJCrSJ}st=lCh}j@Hb|Mr;VBj+26MeC8D3+dQA7&go5VuDE%5 zJL8ZqnufmJ>S7^!v^z7Lw!wWx(8Po#&}eltU#y+>eMVY>QT^rSRTaj}>e(5i{;$5&k;4#7fvg!J%hqvji-crlhuUv)cqtbr zlNVgP*rh#K5bVtn4$HVcl{!z0^+^qc`%!Q=sZoSaozqJb4bc}XtKT<`+ED!!^C$OX z89Zw63UJ+0WM2x;*82R;uQ_EO_DLFZ9cO0GZD;e=qu^kbp3&pp25e#a(Q3*D?9J#T{VG8-@$nG7v{`5@-qWsK5s1@>838(Ry=In~A zCqu7W;#{!0*xqp1hLW3oIVKg&s0^FA7o~)nT}flXT_hLi#%J3Y5YJ9%=|pn&ma`if z+;Zg^?T=2xlZ2X|Q^RloUOj=Dj{@iz8M+7hLQ~ZbWGk9)u7a27v}$KNJ{}*E+B|O` zhaG}X=TOHa@J`$t8U$mGKuuYv$s5w+RvK?BycqEygU?PQ9b#Ygs&3I&b(1^tlS$p50jhNm|O>Q&Iq z^d@wS`hZZQ-i-7ey+$HZ7Y$Z#B)aO2;^a4rqRkBfpO0)Re=;sZ6uU6dxV`c5DaCbn z(WRd$%GtKCb>pXE!cENBk}1&q!VP7)s`?pcQYYn48ozA`5O3KfTBqc~)RJhE6sfd$ z9Mi4Y_=$Z;;<}?Xv$TOIP`6B$c_;l`&)F|TJn6Q%5=HK_?EJWIm@TNVqPBm~6|6R6FU`nq_-#F(JXGUw#wUzz>EwE!vx=L}Knzf(U2gPqVSqYRh z5E*s%$ub`$uB!(|hO64$rqKJ(Emy*9EQ333xocM`rZ}9`i3#+bTdYDUShSCav#G(( z-4T0Pp?VXChA2&fr^J6asCN6KQDuRHtBaR5y~z)NT?yg=hk#)5;_N;t;d1lAC~jc@YQ!&BDF9u@Fz9lLkbl?3W6qaAB(O$CRk)mt(9`xBSDxX#44- zGFKkMW%T7G<>Dm3yBcNZo9zM4uu;o9h-5~!jfxfYaM<)Ef%Bez>}FU{ByEToU3@r2 zB}26eUPmi0s23)Q*@exSs02L%J=n%T6gnDASs5C2D;4VBtGcYhGv*t4IotNuy1dB*JU~iC571m6X;_Q>bR&LC+X8g3F%48 z&c>>faRG#sR+D4}l!uF*%qxN^uqiX9Roz5e&)92c2raY<=MIu2euCF(oA$|zz0eEe zl3liur|PjOd_WiJsN58FPOqPx5L?~{OC4-HmL{3z54;4uh-+K^blSkglZ8^T~aR6d*9I!?)q?t zNJ(&SJ9>)J5@(lzlM$~L?c$H)E0QT!%%TD{&9*-`8i zHBzi~||5=m+N3*RTG0R!Wr%0x? zw5YtSaNr5M^sQAi%gR%Yc+KXp$I3)U;p1hHHWWwoB3XO7>mSwHiyi3F?56ma1X3JA zy|3!N>+$Et%e@ZXT#kuma41CnS`s7-ZJt8 zE%hT!(RMRTRl~ z1Uqs;bxX^Z7xroJWTHaQ_@iYk3m(a~e#k6kr%z`2lcSUJ{INs$+E{}eQ{#D)1eghD z;}rc4E`P%p!I^5;-vUiC@;D`pE~~xB6ql4x6M~iE&OH=6A%t_UO&EwlmAEsngeT4A zT0^kGcI}owV0Tgg%|6U)NZV|U(E#K29~o)Gm_qa@b*5Gt^vcWjbWTWggC2RAo~{Y; zfv$#riYoRNPQE)#6jU6nw&=ZlOpQ%1_T6-y|9HDACLNPbpzh78^nns9k;bssT_(<0 zT$mGV&8-wK7Ac-&apfNiGwuinTPHV&lnWP3u+!vMgmL0QHVL&N6|6`;!+*m=QKTGh zlh`8OB6V<5v~%-XXiHc=s$HxR{0Hmv#@_$&zDaTJP7yI4VtCKEy&}eQ5%yL%-vhes7LdBjl;aB{d_ImF)h|Gs8Uh9MN!h5qH$G$nDenpp%V&Q0qU?Gbxhk%T6n#hlufBElfg7 zShmSjM5QA^Jr+KPa;r4=Wzm{@V$Fa;&BbrBBh^^ava}>W-8a;(8kz_jaOYOj1xMwMSYEcR)~7723MinGrHfZSj|&`?rM_~XZ>$Cem@20Zy2wA z(YwFHdb4+lP2O-zbKSlQm~(~QsHmH(>F=ZOWvt?Dd&%qa!OJ#BaX1`M=;3ohQ?;m` z#yUMqZB|2unve31Qrl?h?9s!=$`W^M@&gw=kA2|aQH|{=GYBifB+qju2q-56E5u7K zu=!TcFK6Y?crHaDLO4HMYJZ2+{%9Ka)PIAg-Y)8H@U<{6POiBvQs}66@V{Mq^NLUc zK6A9A04Bk@TwG8iAce$26E`QKskgB?&-87u{COE#0rd~&w&G+L3Zs%6@X`46BR&72 z`a_gTOQ9>Ik9RKC`#=LnHG+k%e~!DmPlUd;M=x)VH#*laA)N1}kzhlJE47N&L&;b~ ze{L4W%*JX{aDjyUPAe~M6oI1pvr=IqEK50m(%3{>+sJiiu+#3ttDCV(xwY$dZ7Y30 zuOt<9JA?eQJ8gG*MWOwcc%AM`BoYD^8J$;VIz$RNs$v#}! z(AAq@;;pyamBV3jm|`5yg!UQnmYLX`|90MRcl)-Riepe9g_+UcY?Q7mGQb5@X`?j(aFNlSHSiY<4)7J z3p?MqO}5TKS!>e;JZ(#jv^A~3#m=%V*zK^5IN6N=6w7!Lqth5O+7wTXs|j^fO`810 zhkylOB%4Gnn6=2J?b;@{Z*6P*Q&ZPq+v8$X(}Fr$o(%aa%qwP}L zcAurTHRdBx4MMrCS$%4oEVXS-JBPJDM(n*?JUi_Si7`{OUeZjrSJdfI_E3RPAT6@hLC7`XlcfM%=zvCD+3E*#9(bNCk_oR`i+~(P!WAfd* z57ktvb)$)+Ifc8>1b}XRT^F|nN9TDpc2rhSna2{gglpM@;`MgTG-WC$(N*`fN9pY&dx;aKYh_ooO#I{jndw?*O+( zy_p*mz_6u;!m)DWedEtNAKSVQi^b!4mCnrT-KtFv>HYa$ zzZb~>xYfpc+=MqPGXV@A??=z`J{-~$;77C6(ARuESTL3UV9K@fU0qmK48KUqQ@E{6 z;Cg*)_1M_>9s0I9fHofPQCoEsJh*o-77|aN|IPqjs9U9i4W(r365)~arOr>}jmM?I zI*Y}1dQVm9ueMTlbfV$lHj^TFy`A5+<%N?kk*4NrML0bR2*jzpEWibqt70 zu#`t(J5Q1{PQXSC{~AO#%}@CBpCw>H)E2dadNf{bx_AZvv0#&!w%ij#x2R-0tal4k4E(D z)0A){Op-~|j9ZIO?wO$Un%aHIew1tww^4uk}WG&ZpE%s3}e3bYwir~53h#ijG*J?<}ZJ~{_X23QSTj*$PDwJlT=R$&eXyOQ&;(&>ZwmcbX zt!zT=FuYfwmzUIoDH)_;V|B9FMbtT*PCOqbuVjFwf1U3a8s^$emO32WUkmSft}vgnb7(&`efS%arE zU%>Y#%|Y}=^cAyka^0kD$E#`hMjed+CeQgoSDzkO~<@r-&uTwcY7P#!X0>Afd4>RS-#t ze3LZ!h4$|tpAK*mI{cX;$dAqpvKvlrO3_>*Q6w}zy2wa$E~S%z+JXLlS3HJe6gng$u_W&?9n%9;|G=Ss$NG!!e{>U$KX^5RxP zn!Ly~O$koF5$zm51D4j4wwzUQJHH!sJF{wvlvA8()taqf7z=Vi>lCi;peuSw6)jbC zsXaqLzjD4757TQ!Fr8vXz1N}qn*J{euMdQo&&3$95_{!n6gRWmA8QVzK&K66Sh zZcqIR%DlG8aenMu6IQ(y)W>b+kyH)0YUVA{<(wGUn2q&Vp4DJ%e(!lA!B(zQ0_uR^ z3w{~fripG-bJBl;w6_EWWqt81rl93kG22ZS^eS!r{iI~Gi1b01wsQ($x;%FvQ!)dr zl=X3jCT5wUk(#F~C{mP*#LzqKAh>L!^0G4J!KrER8JFS0Y-R_tG;MFjQ>`@XFNo;% zIPc({y~Nq(0;q*7DpVFQXai|@zy?E=P{0I+fZd~{ba$e`6nLIXntSpgA+gT50vDcj z*zUF(e7CG9k8w~HCU07>g9i#Sxgl$yZK0Et+Fdx{B}fgwwEAP2kZai<{@YZOM~3PN zyavUGok}R%yAzxp*W!^EK!H}q%JK(PAY;3TWCy78w4W{?O$ANM%><3!o?&LXw_D3* zj(iFjGBjUyWWE0+Vv6yJ)Q$aMJhidOMwZ`3bL9qO`ZttMe)$fk80wgNt5B$U)uQb&F9F>hVVMSe{`$4Pp>FTSa>g#RACiF<*znW)_9w_m-s`EqBv?P zZs|Mmld}lN0R)OzCpF6O@nV8;BhquBF@U`={ETcx;i_py$hW1KYAOWk*2;{ypkK7j zc9@wVF%rCf@Sl}fGoG{+LS%|1LIm&KDFrYqJ!GTVKyBGZMAK8fNN4-{zQr>aRnL0v zvANd-vo!16HDEs2N|a?~KRA#^gna@Jv)=8zaD#1YT70CQd)m_hK;AxD6`~@15Z5Wf zvo_>l;bEgV7MRRf?n6izv)58$5>d&!i(E(ov)1BZ{2jTLXM+ixZ?iG`ODc_I(auro zsb$zwc?sNJB7Q@xU$-8Z8Y+fttw_G4@?`|CxKLTxz%}p+~C^O z;5aVM(Uo@2FIJ(9Sa*1ql4qAg0V8c<>P(#0=wFQA6V%!h>mAEpYxk(K)XsoBU{TR| zlMRJ?HdNVn2Re{jqFeDvOckC>cvlmkT;Z zswed5rQ%C)m#a~uiM;k?kXN2K2qoB9neAOjhbI{bp%$`;r9 z6{psz#=gGCCAfGpHk}@5gp?`v7m^+~^RHy0FWN%u7BC!Z-?MN@d5%{%MSeojXGfvzdE@D<(ka*;ciSMIZbGT}x>d}Y{PA#pl zH>`0PJhj>dh*)B31^{5GSP?`4G+8p)=`h{udw;+YJpFltzu`3;2U^5E{Je56uo_1? zPH}rpXryeAu*NF@{nNFo<{v3Zmjuw>JX4Ril8WVmvq6sQ?>q@L(R#k~jQV`oK5SqK zbQJQOUEq-Z^tJ4mtk${t979DOMs@+zND&b&d4TCP?(v7N&o1A$1NO0nz32M+dc6PW z;K%jon*EgYC2ybZR}Y6U6>n#rLf7o)rGSb=K1%)JHF@$gxQcBKtF^#b2x}F$uTA!B z_4@~MOcp>)(gD+AB5FD}o6fCN_OcGZOiL36As~719mZ-A*7jWQNbddpmPXeEkJA&A zHf_itRoCS+fjFhMBmJ{+-5&c0`zW@mj@)@l@#$$TY20oz*UMyk+hc(PTw#R4 zZRd5B^zcy{%YOq6-DJ;U)ttlnIp?42$6bH;X~&N4tJUX#`mjnzK<7$IP%`EZxg@~c zx=cEGAGhoG)*rt;^{(S4-P5DWQwhYF?QSH?*KU37z=wGv#Nes?Knxx|nbD*8Cl}jrg}>^; zUi;7B?r|YNOZ=rZFSWi6=ESos~e`) z4HE(U0}*Hfj|9X4cms$0p&KUon%aAcZLH4uzf`vJT@$6(Ck@RoW<$J=>{I$fMADF> zpNXVgsmw+CXvhHKI6q@N(_Q|wQDATLE7rVORh!}& zpLixV(k(5wUe1!tU>a&aTR6`=nR;htl)!k?^dw+%;^^s9-G1+`qE)ta1dz>MIypjm zYQ@PGKAFZWxpcFzmFEYQSsd4yFv~vvh(!Mb`^z5BIshLBU;qFBfZxE#B&NN!8f&e} zTXSt^!BpJP98)!&5xqm7Zus#JKUjaD&*z!o4C9n9z1wt$(w#>pNSY3AT>t>2olA?? zTlhpXDPR4^)_jB^4OLK~jXDIQ9QEi&j(x!1WY@N_6U$~t>&SLwxhx`Np~7x`;}C4& zWHqwW(GuBI-D4ED#9v5~Y_e>F$6p@MY8y<_;gM3jhXy!PY<+ZI2`j z0&@WXe!zS>MB@jnG-^5`E~PwfI^Je=iXfFv-Bkuxi%fCFNtYl}xClvPsoPHN>6c}R z%P~4e=F1yfNb6=Gt}89Fggp|LYmf)raDLZzzZ3i3!&)}#Ul&L1f_wx;YzyXV#> ziiD1p0hOaP?4U1d%^hw|WunX^arCG@J*i6NU~HVg+E6MqJwZ6t`cScgI}@q0MW!ip z_FPyix16~h0@lC#D~l3hT#&bv;tQZ?q6x&7ZQ_Ge5yw8y?;gegq%9q5R(q;!tDkvZ z#~ugjZ0!dS=Y2FcH38J`FayOtfN5{F_CA2epJt&h5g_V+ee~o5WX=VSy5a%KbwBOR zRe(-8bGNoshbjEAPYJO1U#d9AAixPOXUS7QVX(t#DjU4xUNV+5vAiK}`2zg3-C8Fc zg<#T4JA0J)lK;-gWvXM6UUD$FMy+wgSZ6Y0l3&_s_#3$i0jW1bO#^| zf=L@Re--1HRlvppz{t)PJ{w`X9gw6HyK{6P_BfE#t{nXTErH6AbrsVM@Yf?OO1g*A zVxPEl3WmZU5}%To;BZ&?A1z9YWpjkP4)Fosa#nzzf=AGpz?xh$!XDNi-0Wy4WeQJR zGFy2y+2KEWj}VQUdDLddUv~z!jr>VY-XWUX{fg0JL(m>5nNlegJ+jAOz{oV9WfIDU zN|d5f0)n(+AZCx}|J^U}caobo1z=Vcrpq%cK*yRtS{4dO(Hy^bKfh!G5BoYzDNQM# z@Gi01Z}dvL3e_rfz{dlRRC_qB97!XqRM)n?Tko~DUn*h`U|?tf3xJQ{0r&t0!1#V^ zd4wfOA@i;lNS)4Xk&+^*3R6X-^k289UCRmX9pL+|W%2_v3&$*rMzu!8h&`?5)#(b) zk`fk1_WpHRGqPluk*ouvn%hlvKwtkGvTL9uT42F6QqoCD(Hud4)m~3f%68z6Uw{Aq z{pyDW@Yvu87r)pl@T5Jy0t>vLS-0O*z{j`WZ@;)8CW%Ug)Cq;wW-fbPZnOb_0#^V3 zb@qOHw>4YXF^~*;Bg4B!-0_V z0!URl04!4?{a^m>*Im}{h>NoN{(t+m`rq80Mf8G4Jpa%(5(jBv#orF%gJ?2|c-s(( zgh;4c*~B4{2{h1%|D|fS|A8XsM2ePnor}tDU33dxl15iLRVDRBYH@&)2|7`Z3eKsz zkG()F?>vI&6zC8_n`7BrQQK^(v7)$@wGc8%ZvJOxs(C@TB89@xFa%POO#|Yb^Gt2Q$-5H?q2T2G1iuh)@)56? zaBva=0N@3w;Q-B;BoXRi7?!#u>vA41!zNjZrP$=#r7<;@$D6U&OgjgRd%Wo< z`-QI3O?!CH7$19CuPM>qU!nt3qP;B)jbU2S!#~cDQi`L>paZ`dQ#9%F*lT{XVjoKs z(u(3AAs~hjP*}0S5g)6Wir95ECa!2~w28{9rGIpq!Kyyh0>Uz8)Y;n9Gm@L24P zV*-j@Q1wd5uflm{3Wk_EkIl{PPg?c z7)Km3(+o)|t5kA8HE*eB+Xh^O399?fz~X(o2n~^S_8H=mSz+r4q(oR|%n(y7Kdlhh zanr`-EX4kW-*pQUNZ!YU;;ZT;TCaF z4WmX-hx+hdUfahrJjX%!8;tMxF-KMgdCL$+Fo7M4u!ns-!*d)ohBL;=kt`QnP;4ys z4RD0Fc!&3MM8YHo7PV+VlimkOC}S0Cc!Kp}R;KVQ0L#H`lEEP*T(EkhxktcTyu8-=2B?N%{#fsZ$$AQi`STix6=fFw@TvlTo#p}Gt z>T1$AIgHf};{w4qfbo?GbDYnIq~~&+O$5>@j{uC$Qmvnu_(zC@@;gyy?-(___by83 z!^(Y$-HThb{-?yQzmr$E)4R9a=oE->pARDJDvW2sufmZe}C;_HW2vhVJ zQmG10Q^5spaDh8;y9?z3Pzq}&U|5dQ!GB-jP5n+2f95J=^Q!l+?!U9TQ}sBY*tV30;Haq_{wDM_>#w+y498*v*9 zgxeVaz>C;QAOYlSQx1T3kGtT%<^Qma?#z$@2;nAFyhqI7ati~X1u*_C;6LEMs_Os` zdK&-$anhv1!-E4GdAdd`W-Py>LGMGfLI4=jf`kSDyEH9&^cpo|!Al=7Aem;T{)GVm0NCNRXw~bwF|!uE^0CP@ zYsHzi&M_}m_(HzkxaE5eoXG^Pi~|ft#IHuqQCX}0-upN7Z*Y$yzkI@3(xpk3U~eWC*g3*tq;SY+vv0uRr9srUGz3qautw9X|t^W?$f6 zgi%YcNj$MG%Z6>McI?Wr=Y^-g1fo|y*z2P_pL}=dho4A(`R7Cb6*$`w4E9xnj^u!> zLRYb?IVjX%-;!_u`;Y!|%sIlZroz9nHZv6@MZ-iGyYhe@+s#!h0MXT-NX(b8toD z+lzy%8vj-tT+{xCgD#En@7D-)6V)g~fdngjnRAxMlRf#a=C*#trU1ab_9X6J4?p;@ zmJ04Ff|*p@%W=nA8?I#x$Fczh000RfJ_BY;4I${=B8YM4wkKqU@9ho%5@+@o0?2a! zFmXVlZUAs`4gePjmbGI1TzsSBX)6Jr9~=WAurV42IeB&(VgMVxpv~H4{l& z0EqEI2>;m$tMTPXp-Usp?souEd}d&{;G!-mGK8QdabwQ0$5<_oF(G&8sTF0_;I*$W zI!rSrA0?VRv{G!P#I#ZuaC$Ca+bRwjWeh!^H@=0jgN-1tSddm5-~xU~XDkY088<;e zzw3irWGr26rsVR(i#v>zP>WT z`4t8JakwFtqH5dN#i6xqo@1LDio}E*Oe7}7e8b%!2NI0`FFDFbCjRj$!pnQS^+rv8 zWTY|U=jcqx-dpv|2(Cp82q~qDlOTA)R>KG^R0f>LVajxNutq&LBw?{htK`MgF~Qi0 zLQ>0B*#WU&=eIKNG{ec16ZO!x@(w9e>i3A$8h<*V;(Wkc@2tmJS)OIVD%9w`Xm*2B z=|rP-;{>8;)!9iFq#CWZda)R75_IN`s$5XJ%tdaMmM8_{tb>`Nsbtle43*Okr!3lN zqVao`3TLBkv29Qt4nwFB-=b1O2!l>StQ1;fvEDH^Itb@m9hq&E^6KWs$jPJDl~mDS zV^=GcHjSD+WxNo0;UrdApYRG>M689^yTPHbqA)tQ(Wjm%h#$+=PBYx}cQ9-(DCIc+ zFMqS2;!ir%=h2BIz;bky$l(yLWCKF{P(>2>O3ZpYdz^+?8M)Z@-17Ni!VmF2*t8lPH2yui2K)IzH| zf%3&IIGg&yrrZ;bVY(1O1j0wcJSkJA-2ji^ScWO>_sHPuGWYDC)5NTm9*sQ!b$jRC* zriZH1f7INY!EceyANNnve@o}=D6Tx6yR-jGsAKK?5``1G?ww)r5N)R&+Z(&~nz84p zAzZ1Zw7;%l4wqjAw4$R&05X+IAh&UL6hJ0_tF*~wLd;D|+xFomxf$A)uX*&%_#oLe zgT}p$r^7#PQd6hx-I|NO6ghiJ*!CUv_>$qK&pqZyE>hO2l8CP+G|`h|Nn9y%1~H|l zzYvqVXgaq+izO4CUXDT@^q$cXQrTp}u9#o%hHOgiGOhQXDm7B$YJd13naEYVO@Z15 zy8cr{5jXlOCo>si{~>bR5H}%l@m8rju}CG{VLO;h0ih1V%Wy(P&DmsoNnT zZ*9}g7KJ+;g&f=Dq&&G9ZbANR8H5rBS3E>!FJ9szOKFEf-ll|GeQ3@%zo)6Y?t=Ly z^Pvz}nFnenX@5*f_8}D7o$Fh*GE`3_#D$QHig`o`Q-<{pXv0CCrXKHbLJB>rMyXi) z=AQdsImsZ~={HsrR96KkA6LW;LQbZ&`sxN~7X#J5#|;ZI+LSiZP-DbaWL+O@+vFH? z8LCdg9<{iaDy7ZcrWoLt5N^x#c#sP!^{$%*Pq&F{ZNa)OuQq5Xr!Vx>;p)^{Rjw`F z8o1QC0?1IY3$Gyco+ITZu zS`lJiVVUDPa>Epmxn%}Nes;{*?%~G9A@_n=VgOkUMV1?$7;9QDl`EyojmOJ14oFII zpfFjSvf5n15cAXq%XsxMhC$|hbqn&>Y)}(&&o8;I2M)Idr49T%k{L@KLe)zhg*3xu z*+gg%RUVD;z=a;=;&q@M?l!pIAcy6xov=RX95NCcH0iMOyJjZn-Cv&fdDWNlC4~v0 zUt;ow<&ioVP!F_h{CuYW94t<9&iS|dmP`=W zU2bn~9zdi_)&RDrp>t$WqsHrr`QbW1AKi2-t$F=z1CloS*9%i50z&U4!;Vhnq&;fm zqAC7YL*zkc+DLiA<*d_}ZK=*XiP-d5$6g{kg%0ADEE3-5n949 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

Fm*l|0qgnMVVk{u0=EDX%!k_^oa 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�~wcG#NAzP0SuR=_HobN%! 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 literal 0 HcmV?d00001 diff --git a/site/src/assets/corner.svg b/site/src/assets/corner.svg new file mode 100644 index 000000000..ba786e975 --- /dev/null +++ b/site/src/assets/corner.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/src/assets/firebase-logo.svg b/site/src/assets/firebase-logo.svg new file mode 100644 index 000000000..c2313a7a7 --- /dev/null +++ b/site/src/assets/firebase-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/src/favicon.ico b/site/src/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6c4d1e73c0339d216fd767a8d7156c226afdccd9 GIT binary patch literal 5558 zcmd^@OK1~87{_O0i$*I}Q54%leN;n?4@6W1X+gXycx ziVA_WLWJfDu|fz@TKcEFzetE3s0*PET|_mE`#JrHNcgce9plxoF2kz*jN!*e;S%zy zv6g?P!^(|3nV|5iN!>WFXep=;CvNBsk!q}^kUHFQRSleij_b8-iO2U`Yo7T<(L{GyEN+@xuS~oChK{HC_*#tWf|o~Vacs2U8bUqk1{eIA zKy!)^3tH4xSPh850T=u*VnD&V_#X|eg`102&r@4n@Qc775422D$=Ly2!@}Fp&}06; z+s$#lx=2@YUOqmrLGa&l45nWl)%iRZ3!6r!s^M!cHn%a`;I}egYvmaH_^aX8lr(gD z;2+WX9E0m)8NMEe=m@QR?R_r7uhaD&_*IgxwWX=#+}{|mh6Rn@HH2SI?)AVg&F~R} z;`(t@40H_*!-zxL^*aJNp@!Hw(~ za2)2|8l}qo>!BB836K2qDqm|SD!GsygW|>snt6}%X?Wy=zstnu7&QDc&jIwXF7B60 z1J?dEAN=K3K9^@*9Li`Yt{>CcvL7_`;vG0>eGg*o@Akph;4>`8mMO=Z=bhh6T5H61TGZ&?m@#V6TIHH#DTN_GkO#H>zBj zM-1Kvnv!F(Y@}zIEe-5duy3%>Xy-k}&-3rKF!-6{uw}42N*imLFWE8$I|OS+n=8KT zr=%N^x5oLX(Y{@2iz+@kOO~OR1j&oQoqshm2L?_28Bc2nLb|1QR7{xKWQ8q{sJsW)+DyHEZp_`iZpljHbJee$<~ z7xK$g{p|Qo-v$1cdj3v=Pbc~p54fud%yIP_e|xU=s1oz-j}%_OFz8dOlPoM z=y1$ zKd|wy(Qr2sC;Mqe?GIYo<@_voPScrN*B>MOekX9ZL79qh$6C^vw2cS$?V~n)exHx? zxm=tc(8maz?x*sORMr@gXUUybe?x}c{S8)sE*mxnDKm#)!drxDVv;KL}qw + {%- linkbutton "/get-started/quick-start" %} + Get started + {%- endlinkbutton %} + {%- linkbutton "https://github.com/angular/fire", "secondary", true %} + GitHub + {%- endlinkbutton %} + + +## What is AngularFire? + +AngularFire smooths over the rough edges an Angular developer might encounter when implementing the framework-agnostic Firebase JS SDK & aims to provide a more natural developer experience by conforming to Angular conventions. + +### Dependency injection +Provide and Inject Firebase services in your components + +### Zone.js wrappers +Stable zones allow proper functionality of service workers, forms, SSR, and pre-rendering + +### Observable based +Utilize RxJS rather than callbacks for realtime streams + +### NgRx friendly API +Integrate with NgRx using AngularFire's action based APIs. + +### Lazy-loading +AngularFire dynamically imports much of Firebase, reducing time to load your app + +### Deploy schematics +Get your Angular application deployed on Firebase Hosting with a single command + +### Google Analytics +Zero-effort Angular Router awareness in Google Analytics + +### Router Guards +Guard your Angular routes with built-in Firebase Authentication checks diff --git a/site/src/js/click-card.js b/site/src/js/click-card.js new file mode 100644 index 000000000..66a2587ac --- /dev/null +++ b/site/src/js/click-card.js @@ -0,0 +1,17 @@ +customElements.define('eap-click-card', class extends HTMLElement { + connectedCallback() { + let down; + let up; + // Enhance to a pointer only if the JavaScript applies + this.style.cursor = 'pointer'; + // Note: This only works for a single link or the first one. + const firstOrOnlyLink = this.querySelector('a'); + this.onmousedown = () => down = +new Date(); + this.onmouseup = () => { + up = +new Date(); + if ((up - down) < 200) { + firstOrOnlyLink.click(); + } + } + } +}); \ No newline at end of file diff --git a/site/src/js/menu-button.js b/site/src/js/menu-button.js new file mode 100644 index 000000000..47018438f --- /dev/null +++ b/site/src/js/menu-button.js @@ -0,0 +1,13 @@ +customElements.define('eap-menu-button', class extends HTMLElement { + connectedCallback() { + const menuId = this.getAttribute('data-menu-id'); + const menuEl = document.getElementById(menuId); + const button = document.createElement('button'); + button.classList.add('fixed', 'w-16', 'h-16', 'text-white', 'rounded-full', 'shadow-lg', 'bottom-6', 'right-6', 'bg-grey-700', 'focus:ring-grey-600' , 'z-50', 'focus:ring-4', 'md:hidden', 'lg:hidden', 'xl:hidden'); + button.textContent = '🔥'; + this.appendChild(button); + button.addEventListener('click', clickEvent => { + menuEl.classList.toggle('slideIn'); + }); + } +}); diff --git a/site/src/js/tab-switcher.js b/site/src/js/tab-switcher.js new file mode 100644 index 000000000..5c6a03a68 --- /dev/null +++ b/site/src/js/tab-switcher.js @@ -0,0 +1,25 @@ +customElements.define('eap-tab-switcher', class extends HTMLElement {}); +customElements.define('eap-tab-list', class extends HTMLElement { + connectedCallback() { + this.buttonTabs = this.querySelectorAll('button'); + for(let button of this.buttonTabs) { + button.addEventListener('click', clickEvent => { + const activeButton = this.querySelector('button[aria-selected="true"]'); + const activePanelId = activeButton.dataset.panel; + const panelToDisplayId = button.dataset.panel; + const panelToDisplay = document.querySelector(`#${panelToDisplayId}`); + const activePanel = document.querySelector(`#${activePanelId}`); + if(activeButton.id !== button.id) { + button.setAttribute('aria-selected', true); + activeButton.setAttribute('aria-selected', false); + panelToDisplay.classList.add('block'); + panelToDisplay.classList.remove('hidden'); + activePanel.classList.remove('block'); + activePanel.classList.add('hidden'); + } + }); + } + } +}); +customElements.define('eap-tab-panel-list', class extends HTMLElement {}); +customElements.define('eap-tab-panel', class extends HTMLElement { }); \ No newline at end of file diff --git a/site/src/shortcodes/buttons/index.js b/site/src/shortcodes/buttons/index.js new file mode 100644 index 000000000..697fc4e56 --- /dev/null +++ b/site/src/shortcodes/buttons/index.js @@ -0,0 +1,33 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const linkButton = { + name: "linkbutton", + type: "addPairedShortcode", + create (content, href, type='primary', external=false) { + const primaryClass = `link-button inline-block shadow-lg bg-blue text-white text-lg uppercase font-bold font-display tracking-wide rounded-lg px-6 py-4 text-center`; + const secondaryClass = `link-button inline-block shadow-lg bg-blue-200 text-black text-lg uppercase font-bold font-display tracking-wide rounded-lg px-6 py-4 text-center`; + const cssClass = type === 'primary' ? primaryClass : secondaryClass; + const externalAttrs = external ? 'rel="noopener" target="blank"' : ''; + return `${content}`; + } +} + +module.exports = { + shortcodes: [ + linkButton, + ] +}; diff --git a/site/src/shortcodes/disclaimerprod/index.js b/site/src/shortcodes/disclaimerprod/index.js new file mode 100644 index 000000000..7d2b7fbc4 --- /dev/null +++ b/site/src/shortcodes/disclaimerprod/index.js @@ -0,0 +1,33 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Usage: {% disclaimerprod %} +const disclaimerprod = { + name: "disclaimerprod", + type: "addShortcode", + create() { + return `

+

Not ready for production

+

The API of the Modular SDK is not stable and is not production ready yet. We are in the process of collecting feedback to iterate on the API. We may update the API and introduce incompatible changes at any point. Do not use the SDK in your production apps.

+
`; + } +} + +module.exports = { + shortcodes: [ + disclaimerprod + ] +}; diff --git a/site/src/shortcodes/filters/index.js b/site/src/shortcodes/filters/index.js new file mode 100644 index 000000000..ccad093fc --- /dev/null +++ b/site/src/shortcodes/filters/index.js @@ -0,0 +1,101 @@ +const { resolve } = require('path'); + +const findByName = { + name: "findByName", + type: "addNunjucksFilter", + create(list, name) { + return list.find((item) => item.name === name); + } +}; + +const log = { + name: "log", + type: "addNunjucksFilter", + create(object, logName) { + console.log(logName, object); + return object; + } +}; + +const json = { + name: "json", + type: "addNunjucksFilter", + create(object, spacer = 3) { + let cache = []; + const json = JSON.stringify( + object, + (key, value) => { + if (typeof value === "object" && value !== null) { + if (cache.includes(value)) { + return; + } + cache.push(value); + } + return value; + }, + spacer + ); + cache = null; + return json; + } +}; + +const findPreviousEntry = { + name: "findPreviousEntry", + type: "addNunjucksFilter", + create(children, eleventyNavigation) { + const itemIndex = children.findIndex(entry => entry.key === eleventyNavigation.key); + const previousIndex = itemIndex - 1; + return children[previousIndex]; + } +}; + +const findNextEntry = { + name: "findNextEntry", + type: "addNunjucksFilter", + create(children, eleventyNavigation) { + const itemIndex = children.findIndex(entry => entry.key === eleventyNavigation.key); + const nextIndex = itemIndex + 1; + return children[nextIndex]; + } +}; + +/** + * This filter reads the custom navigation in the global _data/ folder + * and merges it with the eleventyNavigation config. Eleventy Navigation + * works great for parent folders but it's less good for child navigation + * when it comes to "next/prev" routing. This allows us to keep the good + * parts of Eleventy Navigation and have a custom child path routing. + * + * Eventually I'd like to customize Eleventy Navigation to do child routing + * because this is extremely inefficient to loop over nav for every page. It + * doesn't effect this build too bad though. + */ +const mergeNavigation = { + name: "mergeNavigation", + type: "addNunjucksFilter", + create(eleventyNavigation) { + const customNavigation = require(resolve(__dirname, '../../_data/nextprev.json')); + const customKeys = Object.keys(customNavigation); + customKeys.forEach(key => { + const eleventyNavMatch = eleventyNavigation.find(item => item.key === key); + const matchKids = eleventyNavMatch.children; + const newKids = customNavigation[key].children.map(child => { + return matchKids.find(c => c.key === child.key); + }); + eleventyNavigation.find(item => item.key === key).children = newKids; + }); + return eleventyNavigation; + } +} + +module.exports = { + shortcodes: [ + findByName, + log, + json, + findPreviousEntry, + findNextEntry, + mergeNavigation, + ], +}; diff --git a/site/src/shortcodes/headings/index.js b/site/src/shortcodes/headings/index.js new file mode 100644 index 000000000..57f1a72e0 --- /dev/null +++ b/site/src/shortcodes/headings/index.js @@ -0,0 +1,40 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Usage: {% headingone %} My title! {% endheadingone %} +const headingOne = { + name: "headingone", + type: "addPairedShortcode", + create (content) { + return `

${ content }

` + } +}; + +const subHeading = { + name: "subheading", + type: "addPairedShortcode", + create (content) { + return `
${content}
`; + } +}; + +module.exports = { + shortcodes: [ + headingOne, + subHeading, + ] +}; + diff --git a/site/src/shortcodes/includecode/fetch.js b/site/src/shortcodes/includecode/fetch.js new file mode 100644 index 000000000..d122d5be2 --- /dev/null +++ b/site/src/shortcodes/includecode/fetch.js @@ -0,0 +1,33 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const fetch = require("node-fetch"); + +function convertToGitHubApiUrl(githubPath) { + const urlPieces = githubPath.split('/'); + const [user, repo] = urlPieces.slice(0, 2); + // TODO(davideast): Don't hardcode main branch + const githubApiUrl = [user, repo, 'master', ...urlPieces.slice(2, urlPieces.length)].join('/'); + return `https://raw.githubusercontent.com/${githubApiUrl}`; +} + +async function fetchCode(githubPath) { + const githubApiUrl = convertToGitHubApiUrl(githubPath); + const response = await fetch(githubApiUrl); + return response.text(); +} + +module.exports = { fetchCode }; diff --git a/site/src/shortcodes/includecode/from-local.js b/site/src/shortcodes/includecode/from-local.js new file mode 100644 index 000000000..9db02271b --- /dev/null +++ b/site/src/shortcodes/includecode/from-local.js @@ -0,0 +1,24 @@ +const { readFile } = require('fs'); +const { resolve } = require('path'); +const { promisify } = require('util'); +const readFileAsync = promisify(readFile); + +function convertGitHubPathToLocal(githubPath) { + return resolve(__dirname, '../../../repo_clones', githubPath); +} + +async function fetchCode(githubPath = '') { + let content = ''; + try { + const localPath = convertGitHubPathToLocal(githubPath); + content = await readFileAsync(localPath, 'utf-8'); + } catch(error) { + console.error(error); + content = 'File not found 😭'; + } + return content; +} + +module.exports = { + fetchCode, +}; diff --git a/site/src/shortcodes/includecode/index.js b/site/src/shortcodes/includecode/index.js new file mode 100644 index 000000000..3d0a6526d --- /dev/null +++ b/site/src/shortcodes/includecode/index.js @@ -0,0 +1,105 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const { fetchCode } = require('./from-local'); +const { processSnippet } = require('./snippets'); +const prism = require('markdown-it-prism'); +const MarkdownIt = require('markdown-it'); +const md = new MarkdownIt({ html: true }); +md.use(prism); + +function embedInCodeticks(code) { + return '```js\n' + code + '\n```'; +} + +// Usage: {% includecode github_path="firebase/snippets-web/snippets/auth-next/anonymous/auth_anon_sign_in.js" %} +const includecode = { + name: "includecode", + type: "addNunjucksAsyncShortcode", + create({ github_path }) { + return fetchCode(github_path) + .then(processSnippet) + .then(embedInCodeticks) + .then(output => md.render(output)); + } +}; + +// Usage: {% codeswitcher eap_github_path="" current_github_path="" %} +const codeswitcher = { + name: "codeswitcher", + type: "addNunjucksAsyncShortcode", + async create({ eap_github_path, current_github_path }) { + + let eapCode = ''; + if(eap_github_path != undefined && eap_github_path !== '') { + eapCode = await fetchCode(eap_github_path); + eapCode = processSnippet(eapCode); + eapCode = embedInCodeticks(eapCode); + eapCode = md.render(eapCode); + eapCode = eapCode.trim(); + } + + let currentCode = ''; + if(current_github_path != undefined && current_github_path !== '') { + currentCode = await fetchCode(current_github_path); + currentCode = processSnippet(currentCode); + currentCode = embedInCodeticks(currentCode); + currentCode = md.render(currentCode); + eapCode = eapCode.trim(); + } + const eapId = Math.random().toString(36).substring(7); + const currentId = Math.random().toString(36).substring(7); + return /*html*/` + + + + + + ${eapCode} + + +`; + } +}; + +// Usage: {% commonexample title="" eap_github_path="" current_github_path="" %} +const commonexample = { + name: "commonexample", + type: "addNunjucksAsyncShortcode", + async create({ title, eap_github_path, current_github_path, github_path }) { + const isEmpty = value => value == undefined || value === ''; + const isSwitcher = (!isEmpty(eap_github_path) || !isEmpty(github_path)) && !isEmpty(current_github_path); + // TODO(davideast): Enable current_github_path as a single option + const pathToUse = !isEmpty(github_path) ? github_path : eap_github_path; + const codebox = isSwitcher ? + await codeswitcher.create({ eap_github_path: pathToUse, current_github_path }) : + await includecode.create({ github_path: pathToUse }); + return md.render(`### ${title} +${codebox}`); + } +}; + +module.exports = { + shortcodes: [ + includecode, + codeswitcher, + commonexample, + ] +}; diff --git a/site/src/shortcodes/includecode/snippets.js b/site/src/shortcodes/includecode/snippets.js new file mode 100644 index 000000000..476ddf334 --- /dev/null +++ b/site/src/shortcodes/includecode/snippets.js @@ -0,0 +1,73 @@ +// Modified from: https://github.com/firebase/snippets-web/blob/master/scripts/separate-snippets.ts + +// Regex for [START] and [END] snippet tags. +const RE_START_SNIPPET = /\[START\s+([A-Za-z_]+)\s*\]/; +const RE_END_SNIPPET = /\[END\s+([A-Za-z_]+)\s*\]/; + +function isBlank(line) { + return line.trim().length === 0; +} + +/** + * Change all [START foo] and [END foo] to be [START foosuffix] and [END foosuffix] + */ +function removeSectionsFromSnippet(lines/* string[]*/) { + const outputLines = []; + for (const line of lines) { + if (!line.match(RE_START_SNIPPET) && !line.match(RE_END_SNIPPET)) { + outputLines.push(line); + } + } + return outputLines; +} + +/** + * Remove all left-padding so that the least indented line is left-aligned. + */ +function adjustIndentation(lines /*: string[]*/) { + const nonBlankLines = lines.filter((l) => !isBlank(l)); + const indentSizes = nonBlankLines.map((l) => l.length - l.trimLeft().length); + const minIndent = Math.min(...indentSizes); + + const outputLines = []; + for (const line of lines) { + if (isBlank(line)) { + outputLines.push(""); + } else { + outputLines.push(line.substr(minIndent)); + } + } + return outputLines; +} + +/** + * If the first line after leading comments is blank, remove it. + */ +function removeFirstLineAfterComments(lines /*: string[]*/) { + const outputLines = [...lines]; + const firstNonComment = outputLines.findIndex( + (l) => l.startsWith("// [START") + ); + return outputLines.slice(firstNonComment, outputLines.length); +} + +/** + * Turns a series of source lines into a standalone snippet file by running + * a series of transformations. + * + * @param cones the code containing the snippet (including START/END comments) + */ +function processSnippet(code /*: string[]*/) /*: string*/ { + const lines = code.split('\n'); + let outputLines = [...lines]; + + // Perform transformations individually, in order + outputLines = removeFirstLineAfterComments(outputLines); + outputLines = removeSectionsFromSnippet(outputLines); + outputLines = adjustIndentation(outputLines); + + const content = [...outputLines].join("\n"); + return content; +} + +module.exports = { processSnippet }; diff --git a/site/src/shortcodes/includecode/transform.js b/site/src/shortcodes/includecode/transform.js new file mode 100644 index 000000000..f90ac78c2 --- /dev/null +++ b/site/src/shortcodes/includecode/transform.js @@ -0,0 +1,65 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const { parse } = require("@babel/parser") +const generate = require('@babel/generator').default; +const prettier = require("prettier"); + +function transform(githubCode) { + const parsedAST = parse(githubCode, { + sourceType: "module", + }); + + const isFirst = index => index === 0; + + parsedAST.program.body.forEach((statement, index) => { + + // The first set of lines usually have comments and we + // always want them removed + if(isFirst(index)) { + // Remove all comments before leading statement + if(statement.leadingComments) { + delete statement.leadingComments; + } + } + + // Find any [START] or [END] + if(statement.leadingComments) { + statement.leadingComments = statement.leadingComments.filter(comment => { + return !comment.value.includes('[START') && !comment.value.includes('[END'); + }); + } + + // Remove any trailing comments because they likely should be + // leading comments. Babel guesses where comments go and you can + // find a comment as both trailing and leading. This will likely + // cause problems in the future, but right now it works with the + // code samples we use. + if(statement.trailingComments) { + statement.trailingComments = []; + } + }); + + const { code } = generate({ + type: "Program", + // passing a new copy of the body to avoid + // any reference problems + body: parsedAST.program.body.slice(), + }); + return prettier.format(code, { parser: "babel" }); +} + +module.exports = { transform }; diff --git a/site/src/shortcodes/index.js b/site/src/shortcodes/index.js new file mode 100644 index 000000000..2d019e878 --- /dev/null +++ b/site/src/shortcodes/index.js @@ -0,0 +1,41 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +const { readdirSync, lstatSync } = require('fs'); +const { resolve } = require('path'); + +/** + * This sets up the shortcodes plugin to dynamically register + * any shortcode in this directory, as long as it is is in + * its own directory, exported in an index.js with an exports + * of an array of shortcodes. + * + * Example: + * / shortcodes + * / includecode + * + index.js + * module.exports = { shortcodes: [...] } + */ + +const shortcodes = readdirSync(__dirname) + .map(relativePath => resolve(__dirname, relativePath)) + .filter(absolutePath => lstatSync(absolutePath).isDirectory()) + .map(path => require(path).shortcodes) + .flat(); + +module.exports = { + shortcodes +}; diff --git a/site/src/shortcodes/version/index.js b/site/src/shortcodes/version/index.js new file mode 100644 index 000000000..977491152 --- /dev/null +++ b/site/src/shortcodes/version/index.js @@ -0,0 +1,30 @@ +/** + * Copyright 2020 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// Usage: {% version %} +const version = { + name: "version", + type: "addShortcode", + create () { + return Date.now().toString(); + } +}; + +module.exports = { + shortcodes: [ + version, + ] +}; diff --git a/site/src/styles/prism.css b/site/src/styles/prism.css new file mode 100644 index 000000000..23874e8ce --- /dev/null +++ b/site/src/styles/prism.css @@ -0,0 +1,187 @@ +/** + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * prism.js custom theme for JavaScript, CSS and HTML + * Based on default theme + */ + + code[class*="language-"] { + padding: 0; +} + +code[class*="language-"], +pre[class*="language-"] { + color: aliceblue; + background: none; + font-size: 14px; + font-family: 'Roboto Mono', monospace; + font-weight: 400; + text-align: left; + white-space: pre; + word-spacing: normal; + word-break: normal; + word-wrap: normal; + line-height: 1.5; + + -moz-tab-size: 4; + -o-tab-size: 4; + tab-size: 4; + + -webkit-hyphens: none; + -moz-hyphens: none; + -ms-hyphens: none; + hyphens: none; +} + +code[class*="language-css"], +pre[class*="language-css"], +code[class*="language-html"], +pre[class*="language-html"] { + color: #d0d2d1 !important; +} + +code[class*="language-html"].token.punctuation, +pre[class*="language-html"].token.punctuation { + color: #4dd0e1 !important; +} + +pre[class*="language-"]::-moz-selection, pre[class*="language-"] ::-moz-selection, +code[class*="language-"]::-moz-selection, code[class*="language-"] ::-moz-selection { + text-shadow: none; + background: hsl(213, 92%, 85%); + opacity: 0.4; +} + +pre[class*="language-"]::selection, pre[class*="language-"] ::selection, +code[class*="language-"]::selection, code[class*="language-"] ::selection { + text-shadow: none; + background: #b3d4fc; + opacity: 0.4; +} + +@media print { + code[class*="language-"], + pre[class*="language-"] { + text-shadow: none; + } +} + +/* Code blocks */ +pre[class*="language-"] { + padding: 1em; + overflow: auto; +} + +:not(pre) > code[class*="language-"], +pre[class*="language-"] { + border-radius: 8px; + background-color: #283142; + margin-bottom: 2rem; + margin-top: 2rem; + /*TODO:(davideast) We have to set the max-width of the codeblock because + it causes the content to break out of the viewport. The "break out" + causes those annoying x axis overflows and scrolling on mobile devices. + Ideally there's a better solution. + */ + max-width:100%; +} + +/* Inline code */ +:not(pre) > code[class*="language-"] { + padding: .1em; + border-radius: .3em; + white-space: normal; +} + +.token.comment, +.token.prolog, +.token.doctype, +.token.cdata { + color: #f06292; +} + +.token.punctuation { + color: aliceblue; +} + +.namespace { + opacity: .7; +} + +.token.function, +.token.property { + color: #4dd0e1; +} + +.token.boolean, +.token.number, +.token.constant, +.token.symbol, +.token.deleted { + color: #9ccc65; +} + +.token.tag, +.token.selector, +.token.string, +.token.char, +.token.builtin, +.token.inserted { + color: #9ccc65; +} + +.token.attr-name, +.token.operator, +.token.entity, +.token.url, +.language-css .token.string, +.style .token.string { + color: #9ccc65; +} + +.token.atrule, +.token.attr-value, +.token.keyword { + color: #4dd0e1; +} + +.token.class-name { + color: #4dd0e1; +} + +.token.regex, +.token.important, +.token.variable { + color: #4dd0e1; +} + +.token.bold { + font-weight: bold; +} +.token.italic { + font-style: italic; +} + +.token.entity { + cursor: help; +} + +eap-tab-panel :not(pre) > code[class*="language-"], +eap-tab-panel pre[class*="language-"] { + padding: 0; + margin: 0; +} diff --git a/site/src/styles/tailwind.config.js b/site/src/styles/tailwind.config.js new file mode 100644 index 000000000..5103d1bb0 --- /dev/null +++ b/site/src/styles/tailwind.config.js @@ -0,0 +1,50 @@ +/** + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +module.exports = { + purge: [ + "src/**/*.njk", + "src/**/*.md", + "src/**/*.js", + ], + darkMode: false, // or 'media' or 'class' + theme: { + fontFamily: { + body: ['Roboto', 'Arial', 'sans-serif'], + display: ['Google Sans', 'Arial', 'sans-serif'], + mono: ['Roboto Mono', 'monospace'], + }, + extend: { + colors: { + 'black': 'hsl(0 0% 0% / 87%)', + 'blue-200': 'hsl(214 82% 50% / 7%)', + 'blue': 'hsl(214 82% 50%)', + 'navy': '#283142', + 'grey': '#DADCE0', + 'grey-200': '#ECEFF1', + 'grey-300': 'hsl(0 0% 0% / 54%)', + 'grey-600': 'hsl(213 5% 39% / 1)', + 'grey-700': 'hsl(213 5% 19% / 1)', + 'yellow': 'hsl(37 100% 94%)', + 'orange': "#FF8F00", + 'green': '#6CFF38', + } + }, + }, + variants: { + extend: {}, + }, + plugins: [], +} \ No newline at end of file diff --git a/site/src/styles/tailwind.css b/site/src/styles/tailwind.css new file mode 100644 index 000000000..e1b384357 --- /dev/null +++ b/site/src/styles/tailwind.css @@ -0,0 +1,320 @@ +/** + * Copyright 2021 Google LLC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + @import "tailwindcss/base"; + @import "tailwindcss/components"; + @import "tailwindcss/utilities"; + + @font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 400; + src: url('/assets/GoogleSans-Regular.woff2') format('woff2'); + } + + @font-face { + font-family: 'Google Sans'; + font-style: normal; + font-weight: 500; + src: url('/assets/GoogleSans-Medium.woff2') format('woff2'); + } + + @font-face { + font-family: 'Google Sans'; + font-style: bold; + font-weight: 900; + src: url('/assets/GoogleSans-Bold.woff2') format('woff2'); + } + + @font-face { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + src: url('/assets/Roboto-Regular.woff2') format('woff2'); + } + + @font-face { + font-family: 'Roboto'; + font-style: italic; + font-weight: 400; + src: url('/assets/Roboto-Italic.woff2') format('woff2'); + } + + @font-face { + font-family: 'Roboto'; + font-style: bold; + font-weight: 900; + src: url('/assets/Roboto-900.woff2') format('woff2'); + } + + @font-face { + font-family: 'Roboto Mono'; + font-style: normal; + font-weight: 400; + src: url('/assets/RobotoMono-Regular.woff2') format('woff2'); + } + + body { + background-color: hsl(255 1% 98%); + background-image: url(/assets/corner.svg); + background-position: top right; + background-repeat: no-repeat; + width: 100vw; + } + + a[aria-current="page"] { + @apply text-blue; + } + + .docs-content main { + @apply grid min-h-screen; + grid-template-columns:[side] auto 1fr [stack]; + grid-template-rows: [side] 1fr; + column-gap: 8vw; + } + + .docs-content main > aside { + min-width: 32ch; + @apply sticky top-0 z-10 h-screen pl-8 pr-4 overflow-y-scroll; + } + + .docs-content main > article { + max-width: 64ch; + @apply min-h-screen pr-8; + } + + h1, h2, h3, h4, h5, h6 { + @apply font-display; + } + + h1 { + @apply text-5xl font-bold font-display; + } + + .docs-content main > article h2 { + @apply mt-12 mb-4 antialiased font-bold leading-snug text-black; + font-size: 24px; + } + + .docs-content main > article h3 { + @apply mt-8 text-xl; + } + + .docs-content main > article h4 { + @apply mt-2 text-lg leading-snug text-grey-600; + } + + .docs-content main > article p { + @apply mb-6 text-lg; + line-height: 2rem; + } + + /** + Don't go further than direct descendants for code styling + otherwise it will mess with the codeboxes + */ + .docs-content main > article p > code { + @apply p-1 bg-gray-200 rounded-md; + } + + .docs-content article p > b { + @apply font-display; + } + + table a, article p > a:not(.link-button) { + @apply underline text-blue; + } + + @media (max-width: 775px) { + + .docs-content main { + column-gap: unset; + } + + .docs-content main > article { + @apply w-screen p-2; + } + + .docs-content main > aside, + .docs-content main > article { + grid-area: side; + } + + .docs-content main > aside { + transition: transform 0.25s cubic-bezier(0.445, 0.05, 0.55, 0.95); + transform: translateX(-200%); + } + + .docs-content main > aside.slideIn { + transform: translateX(0); + } + + .landing-container, .landing-faq { + width: 100vw !important; + padding-left: 2rem; + padding-right: 2rem; + } + + } + + @media (max-width: 420px) { + .landing-container h1 { + @apply text-4xl; + } + body.landing-content { + background-image: none; + } + } + + /* Thanks to https://css-tricks.com/responsive-data-tables/ */ + table { + width: 100%; + border-collapse: collapse; + overflow-x: scroll; + overflow-wrap: break-word; + @apply text-sm; + } + /* Zebra striping */ + tr:nth-of-type(odd) { + @apply bg-gray-100; + } + th { + @apply font-bold tracking-wide uppercase font-display; + } + td, th { + @apply p-2 text-left; + } + + @media + only screen and (max-width: 760px), + (min-device-width: 768px) and (max-device-width: 1024px) { + + /* Stack the table */ + table, thead, tbody, th, td, tr { + display: block; + } + + } + + eap-tab-switcher { + @apply block w-full overflow-x-hidden bg-navy rounded-t-md; + } + + .docs-content article eap-tab-switcher { + @apply mb-6; + } + + eap-tab-list { + @apply flex items-center h-16 bg-white border border-solid border-grey rounded-t-md font-display; + } + + eap-tab-list button { + @apply p-4 text-sm font-medium text-gray-600; + } + + eap-tab-list button[aria-selected="true"] { + @apply text-blue; + } + + eap-tab-panel-list { + @apply block p-4 overflow-x-scroll; + } + + eap-tab-panel { + @apply block; + } + + eap-tab-panel pre code { + @apply bg-navy; + } + + eap-tab-panel { + @apply text-white; + } + + .docs-content h3 + pre[class*="language-"], h3 + eap-tab-switcher { + margin-top: .5rem; + } + + eap-click-card { + @apply block; + } + + .landing-container { + width: 84ch; + margin: 0 auto; + } + + .landing-faq { + width: 64ch; + } + + .code-editor { + display: grid; + } + + .code-editor pre[class="language-js"] { + border-radius: 0; + margin: 0; + padding: 2rem; + } + + .code-editor .terminal { + height: 100%; + padding: 1rem; + } + + .code-editor .terminal div { + opacity: 0; + overflow: hidden; + margin: 1rem; + } + + .code-editor .terminal div:nth-child(2) { + animation: fadeIn 400ms cubic-bezier(0.47, 0, 0.745, 0.715) 2.5s forwards; + } + + .code-editor .terminal div:nth-child(3) { + animation: fadeIn 400ms cubic-bezier(0.47, 0, 0.745, 0.715) 4s forwards; + } + + .code-editor .terminal div:nth-child(4) { + animation: fadeIn 400ms cubic-bezier(0.47, 0, 0.745, 0.715) 5.5s forwards; + } + + .code-editor .terminal div:nth-child(5), #btnShowCode { + animation: fadeIn 400ms cubic-bezier(0.47, 0, 0.745, 0.715) 7.5s forwards; + } + + /* Thanks to https://css-tricks.com/snippets/css/typewriter-effect/ */ + .terminal .typewriter { + overflow: hidden; /* Ensures the content is not revealed until the animation */ + white-space: nowrap; /* Keeps the content on a single line */ + margin: 0 auto; /* Gives that scrolling effect as the typing happens */ + letter-spacing: .1em; /* Adjust as needed */ + animation: typing 3.65s steps(40, end) 1s forwards; + } + + /* The typing effect */ + @keyframes typing { + from { opacity:1; width: 0 } + to { width: 100%; opacity:1; } + } + + @keyframes fadeIn { + from { opacity: 0 } + to { opacity: 1; } + } \ No newline at end of file From c14eece9e08b2d74b78f1816cf97e53ee5a5bc33 Mon Sep 17 00:00:00 2001 From: David East Date: Sun, 7 Feb 2021 18:01:29 +0000 Subject: [PATCH 2/8] wip --- site/src/_data/nextprev.json | 11 +- site/src/_includes/default.njk | 6 +- site/src/_includes/next-prev.njk | 2 +- site/src/get-started/deploying.md | 150 ++++++++++++++++ .../src/get-started/get-started.11tydata.json | 4 + site/src/get-started/index.md | 6 + site/src/get-started/quick-start.md | 166 ++++++++++++++++++ site/src/index.md | 20 ++- site/src/shortcodes/buttons/index.js | 4 +- site/src/shortcodes/disclaimerprod/index.js | 4 +- site/src/shortcodes/filters/index.js | 17 +- site/src/styles/tailwind.css | 6 + 12 files changed, 375 insertions(+), 21 deletions(-) create mode 100644 site/src/get-started/deploying.md create mode 100644 site/src/get-started/get-started.11tydata.json create mode 100644 site/src/get-started/index.md create mode 100644 site/src/get-started/quick-start.md diff --git a/site/src/_data/nextprev.json b/site/src/_data/nextprev.json index 0967ef424..826dce972 100644 --- a/site/src/_data/nextprev.json +++ b/site/src/_data/nextprev.json @@ -1 +1,10 @@ -{} +{ + "Get started": { + "key": "Get Started", + "url": "/get-started", + "children": [ + { "key": "Quick start", "url": "/get-started" }, + { "key": "Deploying", "url": "/get-started/deploying" } + ] + } +} \ No newline at end of file diff --git a/site/src/_includes/default.njk b/site/src/_includes/default.njk index 005968a1e..35bb42c40 100644 --- a/site/src/_includes/default.njk +++ b/site/src/_includes/default.njk @@ -32,10 +32,10 @@
- Modular JavaScript SDK + AngularFire
-
- Early Access Program +
+ @angular/fire
diff --git a/site/src/_includes/next-prev.njk b/site/src/_includes/next-prev.njk index 240d0bbee..703894789 100644 --- a/site/src/_includes/next-prev.njk +++ b/site/src/_includes/next-prev.njk @@ -25,7 +25,7 @@