From 847bd2c2ff6d4fd205b6b9d8be7223a68199c554 Mon Sep 17 00:00:00 2001 From: Yousif Al-Raheem Date: Wed, 17 Nov 2021 17:06:54 +0100 Subject: [PATCH 001/131] use email links instead of text in members list Signed-off-by: Yousif Al-Raheem --- .changeset/khaki-lies-burn.md | 5 +++++ .../Cards/Group/MembersList/MembersListCard.tsx | 10 +++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 .changeset/khaki-lies-burn.md diff --git a/.changeset/khaki-lies-burn.md b/.changeset/khaki-lies-burn.md new file mode 100644 index 0000000000..e89a36a37a --- /dev/null +++ b/.changeset/khaki-lies-burn.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-org': minor +--- + +Use email links in the catalog's members list instead of text to display a member's email diff --git a/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.tsx b/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.tsx index 0642e80a7b..7cc7ed88f5 100644 --- a/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.tsx +++ b/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.tsx @@ -99,7 +99,15 @@ const MemberComponent = ({ member }: { member: UserEntity }) => { {displayName} - {profile?.email} + {profile?.email && ( + + {profile.email} + + )} From e7e55cdce19529a617e58463fcf5bc3d8a2d5171 Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Tue, 26 Oct 2021 14:48:51 -0400 Subject: [PATCH 002/131] Add TokenManager interface and basic implementation Signed-off-by: Nataliya Issayeva --- packages/backend-common/src/index.ts | 1 + .../src/tokens/AuthIdentityTokenManager.ts | 31 +++++++++++++++++++ packages/backend-common/src/tokens/index.ts | 17 ++++++++++ packages/backend-common/src/tokens/types.ts | 20 ++++++++++++ 4 files changed, 69 insertions(+) create mode 100644 packages/backend-common/src/tokens/AuthIdentityTokenManager.ts create mode 100644 packages/backend-common/src/tokens/index.ts create mode 100644 packages/backend-common/src/tokens/types.ts diff --git a/packages/backend-common/src/index.ts b/packages/backend-common/src/index.ts index c214961a2e..e430ddc1a4 100644 --- a/packages/backend-common/src/index.ts +++ b/packages/backend-common/src/index.ts @@ -31,4 +31,5 @@ export * from './paths'; export * from './reading'; export * from './scm'; export * from './service'; +export * from './tokens'; export * from './util'; diff --git a/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts b/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts new file mode 100644 index 0000000000..80b733c449 --- /dev/null +++ b/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts @@ -0,0 +1,31 @@ +/* + * Copyright 2021 The Backstage Authors + * + * 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 + * + * http://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 { TokenManager } from './types'; + +export class AuthIdentityTokenManager implements TokenManager { + private readonly SERVER_TOKEN = 'server-token'; + + async getServerToken(): Promise<{ token: string }> { + return { token: this.SERVER_TOKEN }; + } + + async validateToken(token: string): Promise { + if (token !== this.SERVER_TOKEN) { + throw new Error('Invalid server token'); + } + } +} diff --git a/packages/backend-common/src/tokens/index.ts b/packages/backend-common/src/tokens/index.ts new file mode 100644 index 0000000000..5b7865a919 --- /dev/null +++ b/packages/backend-common/src/tokens/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2021 The Backstage Authors + * + * 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 + * + * http://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. + */ + +export type { TokenManager } from './types'; diff --git a/packages/backend-common/src/tokens/types.ts b/packages/backend-common/src/tokens/types.ts new file mode 100644 index 0000000000..e7d313e660 --- /dev/null +++ b/packages/backend-common/src/tokens/types.ts @@ -0,0 +1,20 @@ +/* + * Copyright 2021 The Backstage Authors + * + * 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 + * + * http://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. + */ + +export interface TokenManager { + getServerToken: () => Promise<{ token: string }>; + validateToken: (token: string) => Promise; +} From f96679d0e6770889d3ee71e4efecdca00fcdbdc6 Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Tue, 26 Oct 2021 15:47:41 -0400 Subject: [PATCH 003/131] Move IdentityClient to backend-common Signed-off-by: Nataliya Issayeva --- packages/backend-common/package.json | 2 ++ .../src/identity/IdentityClient.test.ts | 14 +++++++------- .../src/identity/IdentityClient.ts | 4 ++-- packages/backend-common/src/identity/index.ts | 17 +++++++++++++++++ packages/backend-common/src/index.ts | 1 + plugins/auth-backend/src/identity/index.ts | 2 +- plugins/auth-backend/src/index.ts | 4 ++-- 7 files changed, 32 insertions(+), 12 deletions(-) rename {plugins/auth-backend => packages/backend-common}/src/identity/IdentityClient.test.ts (97%) rename {plugins/auth-backend => packages/backend-common}/src/identity/IdentityClient.ts (97%) create mode 100644 packages/backend-common/src/identity/index.ts diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index 9e0187137d..2dbeac6845 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -34,6 +34,7 @@ "@backstage/config-loader": "^0.8.0", "@backstage/errors": "^0.1.4", "@backstage/integration": "^0.6.9", + "@backstage/plugin-auth-backend": "^0.4.5", "@backstage/types": "^0.1.1", "@google-cloud/storage": "^5.8.0", "@lerna/project": "^4.0.0", @@ -54,6 +55,7 @@ "git-url-parse": "^11.6.0", "helmet": "^4.0.0", "isomorphic-git": "^1.8.0", + "jose": "^1.27.1", "keyv": "^4.0.3", "keyv-memcache": "^1.2.5", "knex": "^0.95.1", diff --git a/plugins/auth-backend/src/identity/IdentityClient.test.ts b/packages/backend-common/src/identity/IdentityClient.test.ts similarity index 97% rename from plugins/auth-backend/src/identity/IdentityClient.test.ts rename to packages/backend-common/src/identity/IdentityClient.test.ts index 5eca6bf8cd..36d737174d 100644 --- a/plugins/auth-backend/src/identity/IdentityClient.test.ts +++ b/packages/backend-common/src/identity/IdentityClient.test.ts @@ -17,14 +17,14 @@ import { JWT, JSONWebKey } from 'jose'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; -import { - getVoidLogger, - PluginEndpointDiscovery, -} from '@backstage/backend-common'; +import { getVoidLogger } from '../logging'; +import { PluginEndpointDiscovery } from '../discovery'; import { IdentityClient } from './IdentityClient'; -import { MemoryKeyStore } from './MemoryKeyStore'; -import { TokenFactory } from './TokenFactory'; -import { KeyStore } from './types'; +import { + KeyStore, + MemoryKeyStore, + TokenFactory, +} from '@backstage/plugin-auth-backend'; const logger = getVoidLogger(); diff --git a/plugins/auth-backend/src/identity/IdentityClient.ts b/packages/backend-common/src/identity/IdentityClient.ts similarity index 97% rename from plugins/auth-backend/src/identity/IdentityClient.ts rename to packages/backend-common/src/identity/IdentityClient.ts index 2af30e4b6a..b3169b02b3 100644 --- a/plugins/auth-backend/src/identity/IdentityClient.ts +++ b/packages/backend-common/src/identity/IdentityClient.ts @@ -16,8 +16,8 @@ import fetch from 'cross-fetch'; import { JWK, JWT, JWKS, JSONWebKey } from 'jose'; -import { BackstageIdentity } from '../providers'; -import { PluginEndpointDiscovery } from '@backstage/backend-common'; +import { BackstageIdentity } from '@backstage/plugin-auth-backend'; +import { PluginEndpointDiscovery } from '../discovery'; const CLOCK_MARGIN_S = 10; diff --git a/packages/backend-common/src/identity/index.ts b/packages/backend-common/src/identity/index.ts new file mode 100644 index 0000000000..67692e0ed5 --- /dev/null +++ b/packages/backend-common/src/identity/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2021 The Backstage Authors + * + * 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 + * + * http://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. + */ + +export { IdentityClient } from './IdentityClient'; diff --git a/packages/backend-common/src/index.ts b/packages/backend-common/src/index.ts index e430ddc1a4..a3c53e6f9f 100644 --- a/packages/backend-common/src/index.ts +++ b/packages/backend-common/src/index.ts @@ -25,6 +25,7 @@ export { loadBackendConfig } from './config'; export * from './database'; export * from './discovery'; export * from './hot'; +export * from './identity'; export * from './logging'; export * from './middleware'; export * from './paths'; diff --git a/plugins/auth-backend/src/identity/index.ts b/plugins/auth-backend/src/identity/index.ts index 73858d7e07..727e47ed6a 100644 --- a/plugins/auth-backend/src/identity/index.ts +++ b/plugins/auth-backend/src/identity/index.ts @@ -15,7 +15,7 @@ */ export { createOidcRouter } from './router'; -export { IdentityClient } from './IdentityClient'; +// export { IdentityClient } from './IdentityClient'; export { TokenFactory } from './TokenFactory'; export { DatabaseKeyStore } from './DatabaseKeyStore'; export { MemoryKeyStore } from './MemoryKeyStore'; diff --git a/plugins/auth-backend/src/index.ts b/plugins/auth-backend/src/index.ts index 432da00142..e348da116d 100644 --- a/plugins/auth-backend/src/index.ts +++ b/plugins/auth-backend/src/index.ts @@ -21,8 +21,8 @@ */ export * from './service/router'; -export { IdentityClient } from './identity'; -export type { TokenIssuer } from './identity'; +export { MemoryKeyStore, TokenFactory } from './identity'; +export type { KeyStore, TokenIssuer } from './identity'; export * from './providers'; // flow package provides 2 functions From 883b9ad29fce8535d7614fd2b3da7f1bb153533d Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Tue, 26 Oct 2021 15:49:48 -0400 Subject: [PATCH 004/131] Use IdentityClient to validate frontend tokens Signed-off-by: Nataliya Issayeva --- .../src/tokens/AuthIdentityTokenManager.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts b/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts index 80b733c449..2c71ba4d10 100644 --- a/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts +++ b/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts @@ -15,9 +15,19 @@ */ import { TokenManager } from './types'; +import { IdentityClient } from '../identity'; +import { PluginEndpointDiscovery } from '../discovery'; export class AuthIdentityTokenManager implements TokenManager { private readonly SERVER_TOKEN = 'server-token'; + private identityClient: IdentityClient; + + constructor(discovery: PluginEndpointDiscovery) { + this.identityClient = new IdentityClient({ + discovery, + issuer: 'auth-identity-token-manager', + }); + } async getServerToken(): Promise<{ token: string }> { return { token: this.SERVER_TOKEN }; @@ -25,7 +35,12 @@ export class AuthIdentityTokenManager implements TokenManager { async validateToken(token: string): Promise { if (token !== this.SERVER_TOKEN) { - throw new Error('Invalid server token'); + try { + await this.identityClient.authenticate(token); + return; + } catch (e) { + throw new Error('Invalid token'); + } } } } From 4f066c3be6a24e4195c97082957c7c7908a66847 Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Tue, 26 Oct 2021 15:50:40 -0400 Subject: [PATCH 005/131] Inject tokenManager into plugin environment Signed-off-by: Nataliya Issayeva --- packages/backend-common/src/tokens/index.ts | 1 + .../templates/default-app/packages/backend/src/index.ts | 4 +++- .../templates/default-app/packages/backend/src/types.ts | 2 ++ 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/backend-common/src/tokens/index.ts b/packages/backend-common/src/tokens/index.ts index 5b7865a919..107d13ac1d 100644 --- a/packages/backend-common/src/tokens/index.ts +++ b/packages/backend-common/src/tokens/index.ts @@ -14,4 +14,5 @@ * limitations under the License. */ +export { AuthIdentityTokenManager } from './AuthIdentityTokenManager'; export type { TokenManager } from './types'; diff --git a/packages/create-app/templates/default-app/packages/backend/src/index.ts b/packages/create-app/templates/default-app/packages/backend/src/index.ts index f2b14b23f9..204fe8ae81 100644 --- a/packages/create-app/templates/default-app/packages/backend/src/index.ts +++ b/packages/create-app/templates/default-app/packages/backend/src/index.ts @@ -17,6 +17,7 @@ import { DatabaseManager, SingleHostDiscovery, UrlReaders, + AuthIdentityTokenManager, } from '@backstage/backend-common'; import { Config } from '@backstage/config'; import app from './plugins/app'; @@ -37,12 +38,13 @@ function makeCreateEnv(config: Config) { const cacheManager = CacheManager.fromConfig(config); const databaseManager = DatabaseManager.fromConfig(config); + const tokenManager = new AuthIdentityTokenManager(discovery); return (plugin: string): PluginEnvironment => { const logger = root.child({ type: 'plugin', plugin }); const database = databaseManager.forPlugin(plugin); const cache = cacheManager.forPlugin(plugin); - return { logger, database, cache, config, reader, discovery }; + return { logger, database, cache, config, reader, discovery, tokenManager }; }; } diff --git a/packages/create-app/templates/default-app/packages/backend/src/types.ts b/packages/create-app/templates/default-app/packages/backend/src/types.ts index 6c78a2a90c..2aac509609 100644 --- a/packages/create-app/templates/default-app/packages/backend/src/types.ts +++ b/packages/create-app/templates/default-app/packages/backend/src/types.ts @@ -1,6 +1,7 @@ import { Logger } from 'winston'; import { Config } from '@backstage/config'; import { + AuthIdentityTokenManager, PluginCacheManager, PluginDatabaseManager, PluginEndpointDiscovery, @@ -14,4 +15,5 @@ export type PluginEnvironment = { config: Config; reader: UrlReader; discovery: PluginEndpointDiscovery; + tokenManager: AuthIdentityTokenManager; }; From 7b4f1ed0b9b82bd965f29509f5a03b05a8e50d78 Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Wed, 27 Oct 2021 16:49:56 -0400 Subject: [PATCH 006/131] Add TODOs Signed-off-by: Nataliya Issayeva --- packages/backend-common/src/identity/IdentityClient.ts | 3 +++ .../backend-common/src/tokens/AuthIdentityTokenManager.ts | 7 +++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/packages/backend-common/src/identity/IdentityClient.ts b/packages/backend-common/src/identity/IdentityClient.ts index b3169b02b3..c69ff1be64 100644 --- a/packages/backend-common/src/identity/IdentityClient.ts +++ b/packages/backend-common/src/identity/IdentityClient.ts @@ -27,6 +27,8 @@ const CLOCK_MARGIN_S = 10; * * @experimental This is not a stable API yet */ + +// TODO: (b2b-auth) integrate IdentityClient into the TokenManager instead export class IdentityClient { private readonly discovery: PluginEndpointDiscovery; private readonly issuer: string; @@ -90,6 +92,7 @@ export class IdentityClient { * Returns the public signing key matching the given jwt token, * or null if no matching key was found */ + // TODO (b2b-auth): switch on type to identify server tokens? private async getKey(rawJwtToken: string): Promise { const { header, payload } = JWT.decode(rawJwtToken, { complete: true, diff --git a/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts b/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts index 2c71ba4d10..c33c4ecd78 100644 --- a/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts +++ b/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts @@ -19,6 +19,7 @@ import { IdentityClient } from '../identity'; import { PluginEndpointDiscovery } from '../discovery'; export class AuthIdentityTokenManager implements TokenManager { + // TODO: (b2b-auth) replace this in favor of actual server token in config likely private readonly SERVER_TOKEN = 'server-token'; private identityClient: IdentityClient; @@ -33,13 +34,15 @@ export class AuthIdentityTokenManager implements TokenManager { return { token: this.SERVER_TOKEN }; } + // TODO: (b2b-auth) authenticate returns a Backstage Identity + // need to figure out what to return after validating a server token async validateToken(token: string): Promise { if (token !== this.SERVER_TOKEN) { try { await this.identityClient.authenticate(token); return; - } catch (e) { - throw new Error('Invalid token'); + } catch (error) { + throw new Error(`Invalid token, ${error}`); } } } From 657a6a0b8e5301e82703b4f31c6ea6db3bafdaf0 Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Wed, 27 Oct 2021 16:59:36 -0400 Subject: [PATCH 007/131] Add code to enable authorization Signed-off-by: Nataliya Issayeva --- packages/app/src/App.tsx | 58 ++++++++++++++++++++++++++ packages/backend/package.json | 2 + packages/backend/src/index.ts | 77 ++++++++++++++++++++++++++++++++++- packages/backend/src/types.ts | 2 + 4 files changed, 138 insertions(+), 1 deletion(-) diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index 401665b62e..64a8163da2 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -86,6 +86,52 @@ import { providers } from './identityProviders'; import * as plugins from './plugins'; import { techDocsPage } from './components/techdocs/TechDocsPage'; +import { discoveryApiRef, useApi } from '@backstage/core-plugin-api'; + +// Parses supplied JWT token and returns the payload +function parseJwt(token: string): { exp: number } { + const base64Url = token.split('.')[1]; + const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); + const jsonPayload = decodeURIComponent( + atob(base64) + .split('') + .map(function (c) { + return `%${`00${c.charCodeAt(0).toString(16)}`.slice(-2)}`; + }) + .join(''), + ); + + return JSON.parse(jsonPayload); +} + +// Returns milliseconds until the supplied JWT token expires +function msUntilExpiry(token: string): number { + const payload = parseJwt(token); + const remaining = + new Date(payload.exp * 1000).getTime() - new Date().getTime(); + return remaining; +} + +// Calls the specified url regularly using an auth token to set a token cookie +// to authorize regular HTTP requests when loading techdocs +async function setTokenCookie(url: string, getIdToken: () => Promise) { + const token = await getIdToken(); + await fetch(url, { + mode: 'cors', + credentials: 'include', + headers: { + Authorization: `Bearer ${token}`, + }, + }); + // Call this function again a few minutes before the token expires + const ms = msUntilExpiry(token) - 4 * 60 * 1000; + setTimeout( + () => { + setTokenCookie(url, getIdToken); + }, + ms > 0 ? ms : 10000, + ); +} const app = createApp({ apis, @@ -96,12 +142,24 @@ const app = createApp({ }, components: { SignInPage: props => { + const discoveryApi = useApi(discoveryApiRef); return ( { + // When logged in, set a token cookie + if (typeof result.getIdToken !== 'undefined') { + setTokenCookie( + await discoveryApi.getBaseUrl('cookie'), + result.getIdToken, + ); + } + // Forward results + props.onResult(result); + }} /> ); }, diff --git a/packages/backend/package.json b/packages/backend/package.json index 4fb692f040..aa2e544386 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -55,11 +55,13 @@ "@gitbeaker/node": "^30.2.0", "@octokit/rest": "^18.5.3", "azure-devops-node-api": "^11.0.1", + "cookie-parser": "^1.4.5", "dockerode": "^3.3.1", "example-app": "^0.2.53", "express": "^4.17.1", "express-promise-router": "^4.1.0", "express-prom-bundle": "^6.3.6", + "jose": "^1.27.1", "knex": "^0.95.1", "pg": "^8.3.0", "pg-connection-string": "^2.3.0", diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index f978e84da9..9bf4f7d9cc 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -33,6 +33,8 @@ import { SingleHostDiscovery, UrlReaders, useHotMemoize, + AuthIdentityTokenManager, + IdentityClient, } from '@backstage/backend-common'; import { Config } from '@backstage/config'; import healthcheck from './plugins/healthcheck'; @@ -55,11 +57,16 @@ import app from './plugins/app'; import badges from './plugins/badges'; import jenkins from './plugins/jenkins'; import { PluginEnvironment } from './types'; +import cookieParser from 'cookie-parser'; +import { Request, Response, NextFunction } from 'express'; +import { JWT } from 'jose'; +import { URL } from 'url'; function makeCreateEnv(config: Config) { const root = getRootLogger(); const reader = UrlReaders.default({ logger: root, config }); const discovery = SingleHostDiscovery.fromConfig(config); + const tokenManager = new AuthIdentityTokenManager(discovery); root.info(`Created UrlReader ${reader}`); @@ -70,10 +77,31 @@ function makeCreateEnv(config: Config) { const logger = root.child({ type: 'plugin', plugin }); const database = databaseManager.forPlugin(plugin); const cache = cacheManager.forPlugin(plugin); - return { logger, cache, database, config, reader, discovery }; + return { logger, cache, database, config, reader, discovery, tokenManager }; }; } +function setTokenCookie( + res: Response, + options: { token: string; secure: boolean; cookieDomain: string }, +) { + try { + const payload = JWT.decode(options.token) as object & { + exp: number; + }; + res.cookie(`token`, options.token, { + expires: new Date(payload?.exp ? payload?.exp * 1000 : 0), + secure: options.secure, + sameSite: 'lax', + domain: options.cookieDomain, + path: '/', + httpOnly: true, + }); + } catch (_err) { + // Ignore + } +} + async function main() { metricsInit(); const logger = getRootLogger(); @@ -112,7 +140,54 @@ async function main() { createEnv('tech-insights'), ); + const discovery = SingleHostDiscovery.fromConfig(config); + const identity = new IdentityClient({ + discovery, + issuer: await discovery.getExternalBaseUrl('auth'), + }); + const baseUrl = config.getString('backend.baseUrl'); + const secure = baseUrl.startsWith('https://'); + const cookieDomain = new URL(baseUrl).hostname; + const authMiddleware = async ( + req: Request, + res: Response, + next: NextFunction, + ) => { + try { + const token = + IdentityClient.getBearerToken(req.headers.authorization) || + req.cookies.token; + req.user = await identity.authenticate(token); + if (!req.headers.authorization) { + // Authorization header may be forwarded by plugin requests + req.headers.authorization = `Bearer ${token}`; + } + if (token !== req.cookies.token) { + setTokenCookie(res, { + token, + secure, + cookieDomain, + }); + } + next(); + } catch (error) { + res.status(401).send(`Unauthorized`); + } + }; + const apiRouter = Router(); + apiRouter.use(cookieParser()); + // The auth route must be publically available as it is used during login + apiRouter.use('/auth', await auth(authEnv)); + // Add a simple endpoint to be used when setting a token cookie + apiRouter.use('/cookie', authMiddleware, (_req, res) => { + res.status(200).send(`Coming right up`); + }); + // Only authenticated requests are allowed to the routes below + apiRouter.use('/catalog', authMiddleware, await catalog(catalogEnv)); + apiRouter.use('/techdocs', authMiddleware, await techdocs(techdocsEnv)); + apiRouter.use('/proxy', authMiddleware, await proxy(proxyEnv)); + apiRouter.use(authMiddleware, notFoundHandler()); apiRouter.use('/catalog', await catalog(catalogEnv)); apiRouter.use('/code-coverage', await codeCoverage(codeCoverageEnv)); apiRouter.use('/rollbar', await rollbar(rollbarEnv)); diff --git a/packages/backend/src/types.ts b/packages/backend/src/types.ts index 8290e569ef..1089497db7 100644 --- a/packages/backend/src/types.ts +++ b/packages/backend/src/types.ts @@ -17,6 +17,7 @@ import { Logger } from 'winston'; import { Config } from '@backstage/config'; import { + AuthIdentityTokenManager, PluginCacheManager, PluginDatabaseManager, PluginEndpointDiscovery, @@ -30,4 +31,5 @@ export type PluginEnvironment = { config: Config; reader: UrlReader; discovery: PluginEndpointDiscovery; + tokenManager: AuthIdentityTokenManager; }; From 2a320c21b4aadd1b7739d76da8d783b62b48f585 Mon Sep 17 00:00:00 2001 From: Joe Porpeglia Date: Thu, 28 Oct 2021 15:51:20 -0400 Subject: [PATCH 008/131] Pass auth token from document collators Co-authored-by: Nataliya Issayeva Co-authored-by: Tim Hansen Signed-off-by: Joe Porpeglia --- packages/backend/src/index.ts | 4 +- packages/backend/src/plugins/search.ts | 7 +++- .../src/search/DefaultCatalogCollator.ts | 20 ++++++++-- .../src/search/DefaultTechDocsCollator.ts | 39 ++++++++++++------- 4 files changed, 50 insertions(+), 20 deletions(-) diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 9bf4f7d9cc..81d9c36d3f 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -157,7 +157,9 @@ async function main() { const token = IdentityClient.getBearerToken(req.headers.authorization) || req.cookies.token; - req.user = await identity.authenticate(token); + + await authEnv.tokenManager.validateToken(token); + if (!req.headers.authorization) { // Authorization header may be forwarded by plugin requests req.headers.authorization = `Bearer ${token}`; diff --git a/packages/backend/src/plugins/search.ts b/packages/backend/src/plugins/search.ts index 4cf9c10021..9a8db0f0f9 100644 --- a/packages/backend/src/plugins/search.ts +++ b/packages/backend/src/plugins/search.ts @@ -59,6 +59,7 @@ export default async function createPlugin({ discovery, config, database, + tokenManager, }: PluginEnvironment) { // Initialize a connection to a search engine. const searchEngine = await createSearchEngine({ config, logger, database }); @@ -68,7 +69,10 @@ export default async function createPlugin({ // particular collator gathers entities from the software catalog. indexBuilder.addCollator({ defaultRefreshIntervalSeconds: 600, - collator: DefaultCatalogCollator.fromConfig(config, { discovery }), + collator: DefaultCatalogCollator.fromConfig(config, { + discovery, + tokenManager, + }), }); indexBuilder.addCollator({ @@ -76,6 +80,7 @@ export default async function createPlugin({ collator: DefaultTechDocsCollator.fromConfig(config, { discovery, logger, + tokenManager, }), }); diff --git a/plugins/catalog-backend/src/search/DefaultCatalogCollator.ts b/plugins/catalog-backend/src/search/DefaultCatalogCollator.ts index a28a7645c4..36ba59ad2e 100644 --- a/plugins/catalog-backend/src/search/DefaultCatalogCollator.ts +++ b/plugins/catalog-backend/src/search/DefaultCatalogCollator.ts @@ -14,7 +14,10 @@ * limitations under the License. */ -import { PluginEndpointDiscovery } from '@backstage/backend-common'; +import { + PluginEndpointDiscovery, + TokenManager, +} from '@backstage/backend-common'; import { Entity } from '@backstage/catalog-model'; import { IndexableDocument, DocumentCollator } from '@backstage/search-common'; import { Config } from '@backstage/config'; @@ -38,11 +41,13 @@ export class DefaultCatalogCollator implements DocumentCollator { protected filter?: CatalogEntitiesRequest['filter']; protected readonly catalogClient: CatalogApi; public readonly type: string = 'software-catalog'; + protected tokenManager: TokenManager; static fromConfig( _config: Config, options: { discovery: PluginEndpointDiscovery; + tokenManager: TokenManager; filter?: CatalogEntitiesRequest['filter']; }, ) { @@ -56,8 +61,10 @@ export class DefaultCatalogCollator implements DocumentCollator { locationTemplate, filter, catalogClient, + tokenManager, }: { discovery: PluginEndpointDiscovery; + tokenManager: TokenManager; locationTemplate?: string; filter?: CatalogEntitiesRequest['filter']; catalogClient?: CatalogApi; @@ -68,6 +75,7 @@ export class DefaultCatalogCollator implements DocumentCollator { this.filter = filter; this.catalogClient = catalogClient || new CatalogClient({ discoveryApi: discovery }); + this.tokenManager = tokenManager; } protected applyArgsToFormat( @@ -82,9 +90,13 @@ export class DefaultCatalogCollator implements DocumentCollator { } async execute() { - const response = await this.catalogClient.getEntities({ - filter: this.filter, - }); + const { token } = await this.tokenManager.getServerToken(); + const response = await this.catalogClient.getEntities( + { + filter: this.filter, + }, + { token }, + ); return response.items.map((entity: Entity): CatalogEntityDocument => { return { title: entity.metadata.title ?? entity.metadata.name, diff --git a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts index 121ef6e46d..094fb8b049 100644 --- a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts +++ b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts @@ -14,7 +14,10 @@ * limitations under the License. */ -import { PluginEndpointDiscovery } from '@backstage/backend-common'; +import { + PluginEndpointDiscovery, + TokenManager, +} from '@backstage/backend-common'; import { Entity, RELATION_OWNED_BY } from '@backstage/catalog-model'; import { DocumentCollator } from '@backstage/search-common'; import fetch from 'cross-fetch'; @@ -34,6 +37,7 @@ interface MkSearchIndexDoc { export type TechDocsCollatorOptions = { discovery: PluginEndpointDiscovery; logger: Logger; + tokenManager: TokenManager; locationTemplate?: string; catalogClient?: CatalogApi; parallelismLimit?: number; @@ -51,6 +55,7 @@ export class DefaultTechDocsCollator implements DocumentCollator { protected locationTemplate: string; private readonly logger: Logger; private readonly catalogClient: CatalogApi; + private readonly tokenManager: TokenManager; private readonly parallelismLimit: number; private readonly legacyPathCasing: boolean; public readonly type: string = 'techdocs'; @@ -63,6 +68,7 @@ export class DefaultTechDocsCollator implements DocumentCollator { locationTemplate, logger, catalogClient, + tokenManager, parallelismLimit = 10, legacyPathCasing = false, }: TechDocsCollatorOptions) { @@ -74,6 +80,7 @@ export class DefaultTechDocsCollator implements DocumentCollator { catalogClient || new CatalogClient({ discoveryApi: discovery }); this.parallelismLimit = parallelismLimit; this.legacyPathCasing = legacyPathCasing; + this.tokenManager = tokenManager; } static fromConfig(config: Config, options: TechDocsCollatorOptions) { @@ -87,19 +94,23 @@ export class DefaultTechDocsCollator implements DocumentCollator { async execute() { const limit = pLimit(this.parallelismLimit); const techDocsBaseUrl = await this.discovery.getBaseUrl('techdocs'); - const entities = await this.catalogClient.getEntities({ - fields: [ - 'kind', - 'namespace', - 'metadata.annotations', - 'metadata.name', - 'metadata.title', - 'metadata.namespace', - 'spec.type', - 'spec.lifecycle', - 'relations', - ], - }); + const { token } = await this.tokenManager.getServerToken(); + const entities = await this.catalogClient.getEntities( + { + fields: [ + 'kind', + 'namespace', + 'metadata.annotations', + 'metadata.name', + 'metadata.title', + 'metadata.namespace', + 'spec.type', + 'spec.lifecycle', + 'relations', + ], + }, + { token }, + ); const docPromises = entities.items .filter(it => it.metadata?.annotations?.['backstage.io/techdocs-ref']) .map((entity: Entity) => From c4bdd0451579531773e24f5b4124b5d038c080d7 Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Fri, 29 Oct 2021 15:37:10 -0400 Subject: [PATCH 009/131] Use and validate JWT for servers Signed-off-by: Nataliya Issayeva --- .../src/tokens/AuthIdentityTokenManager.ts | 34 +++++++++++++------ 1 file changed, 23 insertions(+), 11 deletions(-) diff --git a/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts b/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts index c33c4ecd78..da9c62a231 100644 --- a/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts +++ b/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts @@ -14,36 +14,48 @@ * limitations under the License. */ +import { JWK, JWT } from 'jose'; import { TokenManager } from './types'; import { IdentityClient } from '../identity'; import { PluginEndpointDiscovery } from '../discovery'; export class AuthIdentityTokenManager implements TokenManager { - // TODO: (b2b-auth) replace this in favor of actual server token in config likely - private readonly SERVER_TOKEN = 'server-token'; private identityClient: IdentityClient; + private key: JWK.OctKey; - constructor(discovery: PluginEndpointDiscovery) { + constructor(discovery: PluginEndpointDiscovery, secret: string) { this.identityClient = new IdentityClient({ discovery, issuer: 'auth-identity-token-manager', }); + this.key = JWK.asKey(Buffer.from(secret)) as JWK.OctKey; } async getServerToken(): Promise<{ token: string }> { - return { token: this.SERVER_TOKEN }; + const jwt = JWT.sign({ sub: 'backstage-server' }, this.key); + return { token: jwt }; } // TODO: (b2b-auth) authenticate returns a Backstage Identity // need to figure out what to return after validating a server token async validateToken(token: string): Promise { - if (token !== this.SERVER_TOKEN) { - try { - await this.identityClient.authenticate(token); - return; - } catch (error) { - throw new Error(`Invalid token, ${error}`); - } + let maybeUser; + let maybeServer; + try { + maybeUser = await this.identityClient.authenticate(token); + } catch (error) { + // invalid token } + + try { + maybeServer = JWT.verify(token, this.key); + } catch (error) { + // invalid token + } + + if (!maybeUser && !maybeServer) { + throw new Error(`Invalid token`); + } + return; } } From f3d9de436f5df72b6ef0094e5c635bb4bdb0ecdc Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Fri, 29 Oct 2021 16:21:51 -0400 Subject: [PATCH 010/131] Make tokenManager constructor private and add static create method Signed-off-by: Nataliya Issayeva --- .../src/identity/IdentityClient.ts | 3 ++- .../src/tokens/AuthIdentityTokenManager.ts | 17 ++++++++++++++--- packages/backend/src/index.ts | 5 ++++- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/packages/backend-common/src/identity/IdentityClient.ts b/packages/backend-common/src/identity/IdentityClient.ts index c69ff1be64..c2aa913df3 100644 --- a/packages/backend-common/src/identity/IdentityClient.ts +++ b/packages/backend-common/src/identity/IdentityClient.ts @@ -28,7 +28,8 @@ const CLOCK_MARGIN_S = 10; * @experimental This is not a stable API yet */ -// TODO: (b2b-auth) integrate IdentityClient into the TokenManager instead +// TODO: (b2b-auth) move IdentityClient into tokens +// perhaps also create an interface? export class IdentityClient { private readonly discovery: PluginEndpointDiscovery; private readonly issuer: string; diff --git a/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts b/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts index da9c62a231..72bec24448 100644 --- a/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts +++ b/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts @@ -19,19 +19,30 @@ import { TokenManager } from './types'; import { IdentityClient } from '../identity'; import { PluginEndpointDiscovery } from '../discovery'; +// TODO: (b2b-auth) rename this class export class AuthIdentityTokenManager implements TokenManager { private identityClient: IdentityClient; private key: JWK.OctKey; - constructor(discovery: PluginEndpointDiscovery, secret: string) { - this.identityClient = new IdentityClient({ - discovery, + static create(options: { + discovery: PluginEndpointDiscovery; + secret: string; + }) { + const identityClient = new IdentityClient({ + discovery: options.discovery, issuer: 'auth-identity-token-manager', }); + return new AuthIdentityTokenManager(identityClient, options.secret); + } + + private constructor(identityClient: IdentityClient, secret: string) { + this.identityClient = identityClient; + // TODO: (b2b-auth) how do we get this to be the right JWK type this.key = JWK.asKey(Buffer.from(secret)) as JWK.OctKey; } async getServerToken(): Promise<{ token: string }> { + // TODO: (b2b-auth) figure out how to use HMAC as the alg const jwt = JWT.sign({ sub: 'backstage-server' }, this.key); return { token: jwt }; } diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 81d9c36d3f..35d6365851 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -66,7 +66,10 @@ function makeCreateEnv(config: Config) { const root = getRootLogger(); const reader = UrlReaders.default({ logger: root, config }); const discovery = SingleHostDiscovery.fromConfig(config); - const tokenManager = new AuthIdentityTokenManager(discovery); + const tokenManager = AuthIdentityTokenManager.create({ + discovery, + secret: 'secret-tehe', + }); root.info(`Created UrlReader ${reader}`); From 1b2bd0ec015d9266fe3ff3d5d7aafea8141b2b1b Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Fri, 29 Oct 2021 16:22:27 -0400 Subject: [PATCH 011/131] Add basic tests Signed-off-by: Nataliya Issayeva --- .../tokens/AuthIdentityTokenManager.test.ts | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 packages/backend-common/src/tokens/AuthIdentityTokenManager.test.ts diff --git a/packages/backend-common/src/tokens/AuthIdentityTokenManager.test.ts b/packages/backend-common/src/tokens/AuthIdentityTokenManager.test.ts new file mode 100644 index 0000000000..e8df55cb3b --- /dev/null +++ b/packages/backend-common/src/tokens/AuthIdentityTokenManager.test.ts @@ -0,0 +1,61 @@ +/* + * Copyright 2021 The Backstage Authors + * + * 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 + * + * http://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 { PluginEndpointDiscovery } from '..'; +import { IdentityClient } from '../identity'; +import { AuthIdentityTokenManager } from './AuthIdentityTokenManager'; + +const discovery: PluginEndpointDiscovery = { + async getBaseUrl() { + return 'url'; + }, + async getExternalBaseUrl() { + return 'url'; + }, +}; + +beforeAll(() => { + jest + .spyOn(IdentityClient.prototype, 'authenticate') + .mockImplementation(async (_token?: string) => { + throw new Error('No'); + }); +}); + +describe('AuthIdentityTokenManager', () => { + it('should validate a valid server token', async () => { + const tokenManager = AuthIdentityTokenManager.create({ + discovery, + secret: 'a-secret-key', + }); + const { token } = await tokenManager.getServerToken(); + await expect(tokenManager.validateToken(token)).resolves.toBeUndefined(); + }); + + it('should reject an invalid server token', async () => { + const tokenManager = AuthIdentityTokenManager.create({ + discovery, + secret: 'a-secret-key', + }); + const differentTokenManager = AuthIdentityTokenManager.create({ + discovery, + secret: 'a-different-key', + }); + const { token } = await tokenManager.getServerToken(); + await expect(differentTokenManager.validateToken(token)).rejects.toThrow( + 'Invalid token', + ); + }); +}); From 2533294ec11b32c2e4e1e73929adef796226ed19 Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Fri, 29 Oct 2021 16:43:32 -0400 Subject: [PATCH 012/131] Static create and private constructor not really needed Signed-off-by: Nataliya Issayeva --- .../tokens/AuthIdentityTokenManager.test.ts | 18 +++++++++--------- .../src/tokens/AuthIdentityTokenManager.ts | 14 +++----------- packages/backend/src/index.ts | 5 +---- 3 files changed, 13 insertions(+), 24 deletions(-) diff --git a/packages/backend-common/src/tokens/AuthIdentityTokenManager.test.ts b/packages/backend-common/src/tokens/AuthIdentityTokenManager.test.ts index e8df55cb3b..b52acbe300 100644 --- a/packages/backend-common/src/tokens/AuthIdentityTokenManager.test.ts +++ b/packages/backend-common/src/tokens/AuthIdentityTokenManager.test.ts @@ -36,23 +36,23 @@ beforeAll(() => { describe('AuthIdentityTokenManager', () => { it('should validate a valid server token', async () => { - const tokenManager = AuthIdentityTokenManager.create({ + const tokenManager = new AuthIdentityTokenManager( discovery, - secret: 'a-secret-key', - }); + 'a-secret-key', + ); const { token } = await tokenManager.getServerToken(); await expect(tokenManager.validateToken(token)).resolves.toBeUndefined(); }); it('should reject an invalid server token', async () => { - const tokenManager = AuthIdentityTokenManager.create({ + const tokenManager = new AuthIdentityTokenManager( discovery, - secret: 'a-secret-key', - }); - const differentTokenManager = AuthIdentityTokenManager.create({ + 'a-secret-key', + ); + const differentTokenManager = new AuthIdentityTokenManager( discovery, - secret: 'a-different-key', - }); + 'a-different-key', + ); const { token } = await tokenManager.getServerToken(); await expect(differentTokenManager.validateToken(token)).rejects.toThrow( 'Invalid token', diff --git a/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts b/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts index 72bec24448..42c52b84fa 100644 --- a/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts +++ b/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts @@ -24,19 +24,11 @@ export class AuthIdentityTokenManager implements TokenManager { private identityClient: IdentityClient; private key: JWK.OctKey; - static create(options: { - discovery: PluginEndpointDiscovery; - secret: string; - }) { - const identityClient = new IdentityClient({ - discovery: options.discovery, + constructor(discovery: PluginEndpointDiscovery, secret: string) { + this.identityClient = new IdentityClient({ + discovery: discovery, issuer: 'auth-identity-token-manager', }); - return new AuthIdentityTokenManager(identityClient, options.secret); - } - - private constructor(identityClient: IdentityClient, secret: string) { - this.identityClient = identityClient; // TODO: (b2b-auth) how do we get this to be the right JWK type this.key = JWK.asKey(Buffer.from(secret)) as JWK.OctKey; } diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 35d6365851..ffcd52a1dd 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -66,10 +66,7 @@ function makeCreateEnv(config: Config) { const root = getRootLogger(); const reader = UrlReaders.default({ logger: root, config }); const discovery = SingleHostDiscovery.fromConfig(config); - const tokenManager = AuthIdentityTokenManager.create({ - discovery, - secret: 'secret-tehe', - }); + const tokenManager = new AuthIdentityTokenManager(discovery, 'secret-tehe'); root.info(`Created UrlReader ${reader}`); From 75897957984ca807a6b437c60f4705f4044ff63b Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Mon, 8 Nov 2021 13:55:01 -0500 Subject: [PATCH 013/131] Use correct JWT type and algorithm Signed-off-by: Nataliya Issayeva --- .../backend-common/src/tokens/AuthIdentityTokenManager.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts b/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts index 42c52b84fa..9487d4555b 100644 --- a/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts +++ b/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts @@ -29,13 +29,13 @@ export class AuthIdentityTokenManager implements TokenManager { discovery: discovery, issuer: 'auth-identity-token-manager', }); - // TODO: (b2b-auth) how do we get this to be the right JWK type - this.key = JWK.asKey(Buffer.from(secret)) as JWK.OctKey; + this.key = JWK.asKey({ kty: 'oct', k: secret }); } async getServerToken(): Promise<{ token: string }> { - // TODO: (b2b-auth) figure out how to use HMAC as the alg - const jwt = JWT.sign({ sub: 'backstage-server' }, this.key); + const jwt = JWT.sign({ sub: 'backstage-server' }, this.key, { + algorithm: 'HS256', + }); return { token: jwt }; } From 8ceffe5f98f32f1bbc2f4ca9996309f314613842 Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Mon, 8 Nov 2021 16:11:01 -0500 Subject: [PATCH 014/131] Use backend secret from config Signed-off-by: Nataliya Issayeva --- app-config.yaml | 2 ++ .../backend-common/src/tokens/AuthIdentityTokenManager.ts | 5 ++++- packages/backend/src/index.ts | 2 +- .../templates/default-app/packages/backend/src/index.ts | 2 +- plugins/auth-backend/src/identity/index.ts | 1 - 5 files changed, 8 insertions(+), 4 deletions(-) diff --git a/app-config.yaml b/app-config.yaml index 8aa3bc569c..fdd97cbb8c 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -23,6 +23,8 @@ app: title: '#backstage' backend: + auth: + secret: ${BACKEND_SECRET} baseUrl: http://localhost:7000 listen: port: 7000 diff --git a/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts b/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts index 9487d4555b..7aa97925ae 100644 --- a/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts +++ b/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts @@ -15,6 +15,7 @@ */ import { JWK, JWT } from 'jose'; +import { Config } from '@backstage/config'; import { TokenManager } from './types'; import { IdentityClient } from '../identity'; import { PluginEndpointDiscovery } from '../discovery'; @@ -24,11 +25,13 @@ export class AuthIdentityTokenManager implements TokenManager { private identityClient: IdentityClient; private key: JWK.OctKey; - constructor(discovery: PluginEndpointDiscovery, secret: string) { + constructor(discovery: PluginEndpointDiscovery, config: Config) { this.identityClient = new IdentityClient({ discovery: discovery, issuer: 'auth-identity-token-manager', }); + + const secret = config.getConfig('backend.auth').getString('secret'); this.key = JWK.asKey({ kty: 'oct', k: secret }); } diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index ffcd52a1dd..57417ce9c6 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -66,7 +66,7 @@ function makeCreateEnv(config: Config) { const root = getRootLogger(); const reader = UrlReaders.default({ logger: root, config }); const discovery = SingleHostDiscovery.fromConfig(config); - const tokenManager = new AuthIdentityTokenManager(discovery, 'secret-tehe'); + const tokenManager = new AuthIdentityTokenManager(discovery, config); root.info(`Created UrlReader ${reader}`); diff --git a/packages/create-app/templates/default-app/packages/backend/src/index.ts b/packages/create-app/templates/default-app/packages/backend/src/index.ts index 204fe8ae81..a85f331a7b 100644 --- a/packages/create-app/templates/default-app/packages/backend/src/index.ts +++ b/packages/create-app/templates/default-app/packages/backend/src/index.ts @@ -38,7 +38,7 @@ function makeCreateEnv(config: Config) { const cacheManager = CacheManager.fromConfig(config); const databaseManager = DatabaseManager.fromConfig(config); - const tokenManager = new AuthIdentityTokenManager(discovery); + const tokenManager = new AuthIdentityTokenManager(discovery, config); return (plugin: string): PluginEnvironment => { const logger = root.child({ type: 'plugin', plugin }); diff --git a/plugins/auth-backend/src/identity/index.ts b/plugins/auth-backend/src/identity/index.ts index 727e47ed6a..cb2f369668 100644 --- a/plugins/auth-backend/src/identity/index.ts +++ b/plugins/auth-backend/src/identity/index.ts @@ -15,7 +15,6 @@ */ export { createOidcRouter } from './router'; -// export { IdentityClient } from './IdentityClient'; export { TokenFactory } from './TokenFactory'; export { DatabaseKeyStore } from './DatabaseKeyStore'; export { MemoryKeyStore } from './MemoryKeyStore'; From 8fa1098cd575ea89eab20c413c37077bbf2a6c32 Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Mon, 8 Nov 2021 16:49:46 -0500 Subject: [PATCH 015/131] Handle optionally set backend auth secret Signed-off-by: Nataliya Issayeva --- .../src/tokens/AuthIdentityTokenManager.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts b/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts index 7aa97925ae..f8c3fe061d 100644 --- a/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts +++ b/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts @@ -23,7 +23,7 @@ import { PluginEndpointDiscovery } from '../discovery'; // TODO: (b2b-auth) rename this class export class AuthIdentityTokenManager implements TokenManager { private identityClient: IdentityClient; - private key: JWK.OctKey; + private key?: JWK.OctKey; constructor(discovery: PluginEndpointDiscovery, config: Config) { this.identityClient = new IdentityClient({ @@ -31,11 +31,17 @@ export class AuthIdentityTokenManager implements TokenManager { issuer: 'auth-identity-token-manager', }); - const secret = config.getConfig('backend.auth').getString('secret'); - this.key = JWK.asKey({ kty: 'oct', k: secret }); + const secret = config.getOptionalString('backend.auth.secret'); + if (secret) { + this.key = JWK.asKey({ kty: 'oct', k: secret }); + } } async getServerToken(): Promise<{ token: string }> { + if (!this.key) { + throw new Error('No server token defined in config'); + } + const jwt = JWT.sign({ sub: 'backstage-server' }, this.key, { algorithm: 'HS256', }); @@ -54,6 +60,9 @@ export class AuthIdentityTokenManager implements TokenManager { } try { + if (!this.key) { + throw new Error('No server token defined in config'); + } maybeServer = JWT.verify(token, this.key); } catch (error) { // invalid token From fa6a9b797f00a786fffef6353a68a5abba0c608d Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Mon, 8 Nov 2021 17:09:50 -0500 Subject: [PATCH 016/131] Update AuthIdentityTokenManager tests Signed-off-by: Nataliya Issayeva --- packages/backend-common/package.json | 1 + .../tokens/AuthIdentityTokenManager.test.ts | 27 ++++++++++++------- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index 2dbeac6845..94f1b39672 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -83,6 +83,7 @@ }, "devDependencies": { "@backstage/cli": "^0.9.0", + "@backstage/core-app-api": "^0.1.21", "@backstage/test-utils": "^0.1.22", "@types/archiver": "^5.1.0", "@types/compression": "^1.7.0", diff --git a/packages/backend-common/src/tokens/AuthIdentityTokenManager.test.ts b/packages/backend-common/src/tokens/AuthIdentityTokenManager.test.ts index b52acbe300..c0e952bae5 100644 --- a/packages/backend-common/src/tokens/AuthIdentityTokenManager.test.ts +++ b/packages/backend-common/src/tokens/AuthIdentityTokenManager.test.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { ConfigReader } from '@backstage/core-app-api'; import { PluginEndpointDiscovery } from '..'; import { IdentityClient } from '../identity'; import { AuthIdentityTokenManager } from './AuthIdentityTokenManager'; @@ -25,6 +26,9 @@ const discovery: PluginEndpointDiscovery = { return 'url'; }, }; +const config = new ConfigReader({ + backend: { auth: { secret: 'a-secret-key' } }, +}); beforeAll(() => { jest @@ -35,23 +39,28 @@ beforeAll(() => { }); describe('AuthIdentityTokenManager', () => { - it('should validate a valid server token', async () => { - const tokenManager = new AuthIdentityTokenManager( - discovery, - 'a-secret-key', + it('should throw in getServerToken if there is no secret in the config', async () => { + const emptyConfig = new ConfigReader({}); + const tokenManager = new AuthIdentityTokenManager(discovery, emptyConfig); + await expect(tokenManager.getServerToken()).rejects.toThrow( + 'No server token defined in config', ); + }); + + it('should validate a valid server token', async () => { + const tokenManager = new AuthIdentityTokenManager(discovery, config); const { token } = await tokenManager.getServerToken(); await expect(tokenManager.validateToken(token)).resolves.toBeUndefined(); }); it('should reject an invalid server token', async () => { - const tokenManager = new AuthIdentityTokenManager( - discovery, - 'a-secret-key', - ); + const differentConfig = new ConfigReader({ + backend: { auth: { secret: 'a-different-key' } }, + }); + const tokenManager = new AuthIdentityTokenManager(discovery, config); const differentTokenManager = new AuthIdentityTokenManager( discovery, - 'a-different-key', + differentConfig, ); const { token } = await tokenManager.getServerToken(); await expect(differentTokenManager.validateToken(token)).rejects.toThrow( From b38d77f4f0f9ebc2cda7a43bc1031549d7458cd3 Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Tue, 9 Nov 2021 17:57:03 -0500 Subject: [PATCH 017/131] Change AuthIdentityTokenManager to ServerTokenManager Co-authored-by: Joe Porpeglia Co-authored-by: Tim Hansen Signed-off-by: Nataliya Issayeva --- app-config.yaml | 2 +- .../src/identity/IdentityClient.ts | 3 - .../tokens/AuthIdentityTokenManager.test.ts | 70 ----------------- .../src/tokens/AuthIdentityTokenManager.ts | 76 ------------------- .../src/tokens/ServerTokenManager.test.ts | 49 ++++++++++++ .../src/tokens/ServerTokenManager.ts | 45 +++++++++++ packages/backend-common/src/tokens/index.ts | 2 +- packages/backend-common/src/tokens/types.ts | 2 +- packages/backend/src/index.ts | 9 ++- packages/backend/src/types.ts | 4 +- .../default-app/packages/backend/src/index.ts | 4 +- .../default-app/packages/backend/src/types.ts | 4 +- 12 files changed, 109 insertions(+), 161 deletions(-) delete mode 100644 packages/backend-common/src/tokens/AuthIdentityTokenManager.test.ts delete mode 100644 packages/backend-common/src/tokens/AuthIdentityTokenManager.ts create mode 100644 packages/backend-common/src/tokens/ServerTokenManager.test.ts create mode 100644 packages/backend-common/src/tokens/ServerTokenManager.ts diff --git a/app-config.yaml b/app-config.yaml index fdd97cbb8c..88cd2c4648 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -23,7 +23,7 @@ app: title: '#backstage' backend: - auth: + authorization: secret: ${BACKEND_SECRET} baseUrl: http://localhost:7000 listen: diff --git a/packages/backend-common/src/identity/IdentityClient.ts b/packages/backend-common/src/identity/IdentityClient.ts index c2aa913df3..2921b5705c 100644 --- a/packages/backend-common/src/identity/IdentityClient.ts +++ b/packages/backend-common/src/identity/IdentityClient.ts @@ -28,8 +28,6 @@ const CLOCK_MARGIN_S = 10; * @experimental This is not a stable API yet */ -// TODO: (b2b-auth) move IdentityClient into tokens -// perhaps also create an interface? export class IdentityClient { private readonly discovery: PluginEndpointDiscovery; private readonly issuer: string; @@ -93,7 +91,6 @@ export class IdentityClient { * Returns the public signing key matching the given jwt token, * or null if no matching key was found */ - // TODO (b2b-auth): switch on type to identify server tokens? private async getKey(rawJwtToken: string): Promise { const { header, payload } = JWT.decode(rawJwtToken, { complete: true, diff --git a/packages/backend-common/src/tokens/AuthIdentityTokenManager.test.ts b/packages/backend-common/src/tokens/AuthIdentityTokenManager.test.ts deleted file mode 100644 index c0e952bae5..0000000000 --- a/packages/backend-common/src/tokens/AuthIdentityTokenManager.test.ts +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * 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 - * - * http://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 { ConfigReader } from '@backstage/core-app-api'; -import { PluginEndpointDiscovery } from '..'; -import { IdentityClient } from '../identity'; -import { AuthIdentityTokenManager } from './AuthIdentityTokenManager'; - -const discovery: PluginEndpointDiscovery = { - async getBaseUrl() { - return 'url'; - }, - async getExternalBaseUrl() { - return 'url'; - }, -}; -const config = new ConfigReader({ - backend: { auth: { secret: 'a-secret-key' } }, -}); - -beforeAll(() => { - jest - .spyOn(IdentityClient.prototype, 'authenticate') - .mockImplementation(async (_token?: string) => { - throw new Error('No'); - }); -}); - -describe('AuthIdentityTokenManager', () => { - it('should throw in getServerToken if there is no secret in the config', async () => { - const emptyConfig = new ConfigReader({}); - const tokenManager = new AuthIdentityTokenManager(discovery, emptyConfig); - await expect(tokenManager.getServerToken()).rejects.toThrow( - 'No server token defined in config', - ); - }); - - it('should validate a valid server token', async () => { - const tokenManager = new AuthIdentityTokenManager(discovery, config); - const { token } = await tokenManager.getServerToken(); - await expect(tokenManager.validateToken(token)).resolves.toBeUndefined(); - }); - - it('should reject an invalid server token', async () => { - const differentConfig = new ConfigReader({ - backend: { auth: { secret: 'a-different-key' } }, - }); - const tokenManager = new AuthIdentityTokenManager(discovery, config); - const differentTokenManager = new AuthIdentityTokenManager( - discovery, - differentConfig, - ); - const { token } = await tokenManager.getServerToken(); - await expect(differentTokenManager.validateToken(token)).rejects.toThrow( - 'Invalid token', - ); - }); -}); diff --git a/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts b/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts deleted file mode 100644 index f8c3fe061d..0000000000 --- a/packages/backend-common/src/tokens/AuthIdentityTokenManager.ts +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * 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 - * - * http://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 { JWK, JWT } from 'jose'; -import { Config } from '@backstage/config'; -import { TokenManager } from './types'; -import { IdentityClient } from '../identity'; -import { PluginEndpointDiscovery } from '../discovery'; - -// TODO: (b2b-auth) rename this class -export class AuthIdentityTokenManager implements TokenManager { - private identityClient: IdentityClient; - private key?: JWK.OctKey; - - constructor(discovery: PluginEndpointDiscovery, config: Config) { - this.identityClient = new IdentityClient({ - discovery: discovery, - issuer: 'auth-identity-token-manager', - }); - - const secret = config.getOptionalString('backend.auth.secret'); - if (secret) { - this.key = JWK.asKey({ kty: 'oct', k: secret }); - } - } - - async getServerToken(): Promise<{ token: string }> { - if (!this.key) { - throw new Error('No server token defined in config'); - } - - const jwt = JWT.sign({ sub: 'backstage-server' }, this.key, { - algorithm: 'HS256', - }); - return { token: jwt }; - } - - // TODO: (b2b-auth) authenticate returns a Backstage Identity - // need to figure out what to return after validating a server token - async validateToken(token: string): Promise { - let maybeUser; - let maybeServer; - try { - maybeUser = await this.identityClient.authenticate(token); - } catch (error) { - // invalid token - } - - try { - if (!this.key) { - throw new Error('No server token defined in config'); - } - maybeServer = JWT.verify(token, this.key); - } catch (error) { - // invalid token - } - - if (!maybeUser && !maybeServer) { - throw new Error(`Invalid token`); - } - return; - } -} diff --git a/packages/backend-common/src/tokens/ServerTokenManager.test.ts b/packages/backend-common/src/tokens/ServerTokenManager.test.ts new file mode 100644 index 0000000000..88ef1f27c2 --- /dev/null +++ b/packages/backend-common/src/tokens/ServerTokenManager.test.ts @@ -0,0 +1,49 @@ +/* + * Copyright 2021 The Backstage Authors + * + * 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 + * + * http://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 { ConfigReader } from '@backstage/core-app-api'; +import { ServerTokenManager } from './ServerTokenManager'; + +const emptyConfig = new ConfigReader({}); +const configWithSecret = new ConfigReader({ + backend: { authorization: { secret: 'a-secret-key' } }, +}); + +describe('ServerTokenManager', () => { + describe('getServerToken', () => { + it('should always return a token', async () => { + const tokenManager = new ServerTokenManager(configWithSecret); + expect((await tokenManager.getServerToken()).token).toBeDefined(); + + const emptyTokenManager = new ServerTokenManager(emptyConfig); + expect((await emptyTokenManager.getServerToken()).token).toBeDefined(); + }); + }); + + describe('isServerToken', () => { + it('should return true if token is valid', async () => { + const tokenManager = new ServerTokenManager(configWithSecret); + const { token } = await tokenManager.getServerToken(); + const isServerToken = await tokenManager.isServerToken(token); + expect(isServerToken).toBe(true); + }); + + it('should return false if token is invalid', async () => { + const tokenManager = new ServerTokenManager(configWithSecret); + const isServerToken = await tokenManager.isServerToken('random-string'); + expect(isServerToken).toBe(false); + }); + }); +}); diff --git a/packages/backend-common/src/tokens/ServerTokenManager.ts b/packages/backend-common/src/tokens/ServerTokenManager.ts new file mode 100644 index 0000000000..6737dd4d8b --- /dev/null +++ b/packages/backend-common/src/tokens/ServerTokenManager.ts @@ -0,0 +1,45 @@ +/* + * Copyright 2021 The Backstage Authors + * + * 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 + * + * http://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 { JWK, JWT } from 'jose'; +import { Config } from '@backstage/config'; +import { TokenManager } from './types'; + +export class ServerTokenManager implements TokenManager { + private key: JWK.OctKey; + + constructor(config: Config) { + const secret = + config.getOptionalString('backend.authorization.secret') ?? 'no-secret'; + this.key = JWK.asKey({ kty: 'oct', k: secret }); + } + + async isServerToken(token: string): Promise { + try { + JWT.verify(token, this.key); + return true; + } catch (e) { + return false; + } + } + + async getServerToken(): Promise<{ token: string }> { + const jwt = JWT.sign({ sub: 'backstage-server' }, this.key, { + algorithm: 'HS256', + }); + return { token: jwt }; + } +} diff --git a/packages/backend-common/src/tokens/index.ts b/packages/backend-common/src/tokens/index.ts index 107d13ac1d..43ff12e597 100644 --- a/packages/backend-common/src/tokens/index.ts +++ b/packages/backend-common/src/tokens/index.ts @@ -14,5 +14,5 @@ * limitations under the License. */ -export { AuthIdentityTokenManager } from './AuthIdentityTokenManager'; +export { ServerTokenManager } from './ServerTokenManager'; export type { TokenManager } from './types'; diff --git a/packages/backend-common/src/tokens/types.ts b/packages/backend-common/src/tokens/types.ts index e7d313e660..278695a448 100644 --- a/packages/backend-common/src/tokens/types.ts +++ b/packages/backend-common/src/tokens/types.ts @@ -15,6 +15,6 @@ */ export interface TokenManager { + isServerToken: (token: string) => Promise; getServerToken: () => Promise<{ token: string }>; - validateToken: (token: string) => Promise; } diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 57417ce9c6..171460e026 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -33,7 +33,7 @@ import { SingleHostDiscovery, UrlReaders, useHotMemoize, - AuthIdentityTokenManager, + ServerTokenManager, IdentityClient, } from '@backstage/backend-common'; import { Config } from '@backstage/config'; @@ -66,7 +66,7 @@ function makeCreateEnv(config: Config) { const root = getRootLogger(); const reader = UrlReaders.default({ logger: root, config }); const discovery = SingleHostDiscovery.fromConfig(config); - const tokenManager = new AuthIdentityTokenManager(discovery, config); + const tokenManager = new ServerTokenManager(config); root.info(`Created UrlReader ${reader}`); @@ -158,7 +158,10 @@ async function main() { IdentityClient.getBearerToken(req.headers.authorization) || req.cookies.token; - await authEnv.tokenManager.validateToken(token); + const isServerToken = await authEnv.tokenManager.isServerToken(token); + if (!isServerToken) { + await identity.authenticate(token); + } if (!req.headers.authorization) { // Authorization header may be forwarded by plugin requests diff --git a/packages/backend/src/types.ts b/packages/backend/src/types.ts index 1089497db7..4be9c036b3 100644 --- a/packages/backend/src/types.ts +++ b/packages/backend/src/types.ts @@ -17,10 +17,10 @@ import { Logger } from 'winston'; import { Config } from '@backstage/config'; import { - AuthIdentityTokenManager, PluginCacheManager, PluginDatabaseManager, PluginEndpointDiscovery, + TokenManager, UrlReader, } from '@backstage/backend-common'; @@ -31,5 +31,5 @@ export type PluginEnvironment = { config: Config; reader: UrlReader; discovery: PluginEndpointDiscovery; - tokenManager: AuthIdentityTokenManager; + tokenManager: TokenManager; }; diff --git a/packages/create-app/templates/default-app/packages/backend/src/index.ts b/packages/create-app/templates/default-app/packages/backend/src/index.ts index a85f331a7b..87dc390291 100644 --- a/packages/create-app/templates/default-app/packages/backend/src/index.ts +++ b/packages/create-app/templates/default-app/packages/backend/src/index.ts @@ -17,7 +17,7 @@ import { DatabaseManager, SingleHostDiscovery, UrlReaders, - AuthIdentityTokenManager, + ServerTokenManager, } from '@backstage/backend-common'; import { Config } from '@backstage/config'; import app from './plugins/app'; @@ -38,7 +38,7 @@ function makeCreateEnv(config: Config) { const cacheManager = CacheManager.fromConfig(config); const databaseManager = DatabaseManager.fromConfig(config); - const tokenManager = new AuthIdentityTokenManager(discovery, config); + const tokenManager = new ServerTokenManager(config); return (plugin: string): PluginEnvironment => { const logger = root.child({ type: 'plugin', plugin }); diff --git a/packages/create-app/templates/default-app/packages/backend/src/types.ts b/packages/create-app/templates/default-app/packages/backend/src/types.ts index 2aac509609..b1e2e0a1df 100644 --- a/packages/create-app/templates/default-app/packages/backend/src/types.ts +++ b/packages/create-app/templates/default-app/packages/backend/src/types.ts @@ -1,10 +1,10 @@ import { Logger } from 'winston'; import { Config } from '@backstage/config'; import { - AuthIdentityTokenManager, PluginCacheManager, PluginDatabaseManager, PluginEndpointDiscovery, + TokenManager, UrlReader, } from '@backstage/backend-common'; @@ -15,5 +15,5 @@ export type PluginEnvironment = { config: Config; reader: UrlReader; discovery: PluginEndpointDiscovery; - tokenManager: AuthIdentityTokenManager; + tokenManager: TokenManager; }; From fca908a7d64480645f52999c08da1b22accda802 Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Tue, 9 Nov 2021 18:02:35 -0500 Subject: [PATCH 018/131] Move IdentityClient back to auth-backend Signed-off-by: Nataliya Issayeva --- packages/backend-common/package.json | 1 - packages/backend-common/src/identity/index.ts | 17 ----------------- packages/backend-common/src/index.ts | 1 - .../src/identity/IdentityClient.test.ts | 14 +++++++------- .../src/identity/IdentityClient.ts | 5 ++--- plugins/auth-backend/src/identity/index.ts | 1 + plugins/auth-backend/src/index.ts | 4 ++-- 7 files changed, 12 insertions(+), 31 deletions(-) delete mode 100644 packages/backend-common/src/identity/index.ts rename {packages/backend-common => plugins/auth-backend}/src/identity/IdentityClient.test.ts (97%) rename {packages/backend-common => plugins/auth-backend}/src/identity/IdentityClient.ts (97%) diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index 94f1b39672..444a0a273b 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -34,7 +34,6 @@ "@backstage/config-loader": "^0.8.0", "@backstage/errors": "^0.1.4", "@backstage/integration": "^0.6.9", - "@backstage/plugin-auth-backend": "^0.4.5", "@backstage/types": "^0.1.1", "@google-cloud/storage": "^5.8.0", "@lerna/project": "^4.0.0", diff --git a/packages/backend-common/src/identity/index.ts b/packages/backend-common/src/identity/index.ts deleted file mode 100644 index 67692e0ed5..0000000000 --- a/packages/backend-common/src/identity/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * 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 - * - * http://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. - */ - -export { IdentityClient } from './IdentityClient'; diff --git a/packages/backend-common/src/index.ts b/packages/backend-common/src/index.ts index a3c53e6f9f..e430ddc1a4 100644 --- a/packages/backend-common/src/index.ts +++ b/packages/backend-common/src/index.ts @@ -25,7 +25,6 @@ export { loadBackendConfig } from './config'; export * from './database'; export * from './discovery'; export * from './hot'; -export * from './identity'; export * from './logging'; export * from './middleware'; export * from './paths'; diff --git a/packages/backend-common/src/identity/IdentityClient.test.ts b/plugins/auth-backend/src/identity/IdentityClient.test.ts similarity index 97% rename from packages/backend-common/src/identity/IdentityClient.test.ts rename to plugins/auth-backend/src/identity/IdentityClient.test.ts index 36d737174d..5eca6bf8cd 100644 --- a/packages/backend-common/src/identity/IdentityClient.test.ts +++ b/plugins/auth-backend/src/identity/IdentityClient.test.ts @@ -17,14 +17,14 @@ import { JWT, JSONWebKey } from 'jose'; import { rest } from 'msw'; import { setupServer } from 'msw/node'; -import { getVoidLogger } from '../logging'; -import { PluginEndpointDiscovery } from '../discovery'; -import { IdentityClient } from './IdentityClient'; import { - KeyStore, - MemoryKeyStore, - TokenFactory, -} from '@backstage/plugin-auth-backend'; + getVoidLogger, + PluginEndpointDiscovery, +} from '@backstage/backend-common'; +import { IdentityClient } from './IdentityClient'; +import { MemoryKeyStore } from './MemoryKeyStore'; +import { TokenFactory } from './TokenFactory'; +import { KeyStore } from './types'; const logger = getVoidLogger(); diff --git a/packages/backend-common/src/identity/IdentityClient.ts b/plugins/auth-backend/src/identity/IdentityClient.ts similarity index 97% rename from packages/backend-common/src/identity/IdentityClient.ts rename to plugins/auth-backend/src/identity/IdentityClient.ts index 2921b5705c..2af30e4b6a 100644 --- a/packages/backend-common/src/identity/IdentityClient.ts +++ b/plugins/auth-backend/src/identity/IdentityClient.ts @@ -16,8 +16,8 @@ import fetch from 'cross-fetch'; import { JWK, JWT, JWKS, JSONWebKey } from 'jose'; -import { BackstageIdentity } from '@backstage/plugin-auth-backend'; -import { PluginEndpointDiscovery } from '../discovery'; +import { BackstageIdentity } from '../providers'; +import { PluginEndpointDiscovery } from '@backstage/backend-common'; const CLOCK_MARGIN_S = 10; @@ -27,7 +27,6 @@ const CLOCK_MARGIN_S = 10; * * @experimental This is not a stable API yet */ - export class IdentityClient { private readonly discovery: PluginEndpointDiscovery; private readonly issuer: string; diff --git a/plugins/auth-backend/src/identity/index.ts b/plugins/auth-backend/src/identity/index.ts index cb2f369668..73858d7e07 100644 --- a/plugins/auth-backend/src/identity/index.ts +++ b/plugins/auth-backend/src/identity/index.ts @@ -15,6 +15,7 @@ */ export { createOidcRouter } from './router'; +export { IdentityClient } from './IdentityClient'; export { TokenFactory } from './TokenFactory'; export { DatabaseKeyStore } from './DatabaseKeyStore'; export { MemoryKeyStore } from './MemoryKeyStore'; diff --git a/plugins/auth-backend/src/index.ts b/plugins/auth-backend/src/index.ts index e348da116d..432da00142 100644 --- a/plugins/auth-backend/src/index.ts +++ b/plugins/auth-backend/src/index.ts @@ -21,8 +21,8 @@ */ export * from './service/router'; -export { MemoryKeyStore, TokenFactory } from './identity'; -export type { KeyStore, TokenIssuer } from './identity'; +export { IdentityClient } from './identity'; +export type { TokenIssuer } from './identity'; export * from './providers'; // flow package provides 2 functions From 9cbb3cf908cfe1565afc4f65acf7cfb6815ed8ce Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Wed, 10 Nov 2021 15:14:40 -0500 Subject: [PATCH 019/131] Remove auth middleware Signed-off-by: Nataliya Issayeva --- app-config.yaml | 1 + packages/app/src/App.tsx | 58 -------------------------- packages/backend/package.json | 2 - packages/backend/src/index.ts | 78 ----------------------------------- 4 files changed, 1 insertion(+), 138 deletions(-) diff --git a/app-config.yaml b/app-config.yaml index 88cd2c4648..d18b326c2c 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -23,6 +23,7 @@ app: title: '#backstage' backend: + # Used for enabling authorization, secret is shared by all backend plugins authorization: secret: ${BACKEND_SECRET} baseUrl: http://localhost:7000 diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index 64a8163da2..401665b62e 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -86,52 +86,6 @@ import { providers } from './identityProviders'; import * as plugins from './plugins'; import { techDocsPage } from './components/techdocs/TechDocsPage'; -import { discoveryApiRef, useApi } from '@backstage/core-plugin-api'; - -// Parses supplied JWT token and returns the payload -function parseJwt(token: string): { exp: number } { - const base64Url = token.split('.')[1]; - const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); - const jsonPayload = decodeURIComponent( - atob(base64) - .split('') - .map(function (c) { - return `%${`00${c.charCodeAt(0).toString(16)}`.slice(-2)}`; - }) - .join(''), - ); - - return JSON.parse(jsonPayload); -} - -// Returns milliseconds until the supplied JWT token expires -function msUntilExpiry(token: string): number { - const payload = parseJwt(token); - const remaining = - new Date(payload.exp * 1000).getTime() - new Date().getTime(); - return remaining; -} - -// Calls the specified url regularly using an auth token to set a token cookie -// to authorize regular HTTP requests when loading techdocs -async function setTokenCookie(url: string, getIdToken: () => Promise) { - const token = await getIdToken(); - await fetch(url, { - mode: 'cors', - credentials: 'include', - headers: { - Authorization: `Bearer ${token}`, - }, - }); - // Call this function again a few minutes before the token expires - const ms = msUntilExpiry(token) - 4 * 60 * 1000; - setTimeout( - () => { - setTokenCookie(url, getIdToken); - }, - ms > 0 ? ms : 10000, - ); -} const app = createApp({ apis, @@ -142,24 +96,12 @@ const app = createApp({ }, components: { SignInPage: props => { - const discoveryApi = useApi(discoveryApiRef); return ( { - // When logged in, set a token cookie - if (typeof result.getIdToken !== 'undefined') { - setTokenCookie( - await discoveryApi.getBaseUrl('cookie'), - result.getIdToken, - ); - } - // Forward results - props.onResult(result); - }} /> ); }, diff --git a/packages/backend/package.json b/packages/backend/package.json index aa2e544386..4fb692f040 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -55,13 +55,11 @@ "@gitbeaker/node": "^30.2.0", "@octokit/rest": "^18.5.3", "azure-devops-node-api": "^11.0.1", - "cookie-parser": "^1.4.5", "dockerode": "^3.3.1", "example-app": "^0.2.53", "express": "^4.17.1", "express-promise-router": "^4.1.0", "express-prom-bundle": "^6.3.6", - "jose": "^1.27.1", "knex": "^0.95.1", "pg": "^8.3.0", "pg-connection-string": "^2.3.0", diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 171460e026..63285c83fa 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -34,7 +34,6 @@ import { UrlReaders, useHotMemoize, ServerTokenManager, - IdentityClient, } from '@backstage/backend-common'; import { Config } from '@backstage/config'; import healthcheck from './plugins/healthcheck'; @@ -57,10 +56,6 @@ import app from './plugins/app'; import badges from './plugins/badges'; import jenkins from './plugins/jenkins'; import { PluginEnvironment } from './types'; -import cookieParser from 'cookie-parser'; -import { Request, Response, NextFunction } from 'express'; -import { JWT } from 'jose'; -import { URL } from 'url'; function makeCreateEnv(config: Config) { const root = getRootLogger(); @@ -81,27 +76,6 @@ function makeCreateEnv(config: Config) { }; } -function setTokenCookie( - res: Response, - options: { token: string; secure: boolean; cookieDomain: string }, -) { - try { - const payload = JWT.decode(options.token) as object & { - exp: number; - }; - res.cookie(`token`, options.token, { - expires: new Date(payload?.exp ? payload?.exp * 1000 : 0), - secure: options.secure, - sameSite: 'lax', - domain: options.cookieDomain, - path: '/', - httpOnly: true, - }); - } catch (_err) { - // Ignore - } -} - async function main() { metricsInit(); const logger = getRootLogger(); @@ -140,59 +114,7 @@ async function main() { createEnv('tech-insights'), ); - const discovery = SingleHostDiscovery.fromConfig(config); - const identity = new IdentityClient({ - discovery, - issuer: await discovery.getExternalBaseUrl('auth'), - }); - const baseUrl = config.getString('backend.baseUrl'); - const secure = baseUrl.startsWith('https://'); - const cookieDomain = new URL(baseUrl).hostname; - const authMiddleware = async ( - req: Request, - res: Response, - next: NextFunction, - ) => { - try { - const token = - IdentityClient.getBearerToken(req.headers.authorization) || - req.cookies.token; - - const isServerToken = await authEnv.tokenManager.isServerToken(token); - if (!isServerToken) { - await identity.authenticate(token); - } - - if (!req.headers.authorization) { - // Authorization header may be forwarded by plugin requests - req.headers.authorization = `Bearer ${token}`; - } - if (token !== req.cookies.token) { - setTokenCookie(res, { - token, - secure, - cookieDomain, - }); - } - next(); - } catch (error) { - res.status(401).send(`Unauthorized`); - } - }; - const apiRouter = Router(); - apiRouter.use(cookieParser()); - // The auth route must be publically available as it is used during login - apiRouter.use('/auth', await auth(authEnv)); - // Add a simple endpoint to be used when setting a token cookie - apiRouter.use('/cookie', authMiddleware, (_req, res) => { - res.status(200).send(`Coming right up`); - }); - // Only authenticated requests are allowed to the routes below - apiRouter.use('/catalog', authMiddleware, await catalog(catalogEnv)); - apiRouter.use('/techdocs', authMiddleware, await techdocs(techdocsEnv)); - apiRouter.use('/proxy', authMiddleware, await proxy(proxyEnv)); - apiRouter.use(authMiddleware, notFoundHandler()); apiRouter.use('/catalog', await catalog(catalogEnv)); apiRouter.use('/code-coverage', await codeCoverage(codeCoverageEnv)); apiRouter.use('/rollbar', await rollbar(rollbarEnv)); From 74801b176bae4b34faef9bce97f586a1817239d9 Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Wed, 10 Nov 2021 16:05:52 -0500 Subject: [PATCH 020/131] Update authenticate api request tutorial doc Signed-off-by: Nataliya Issayeva --- .../tutorials/authenticate-api-requests.md | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/contrib/docs/tutorials/authenticate-api-requests.md b/contrib/docs/tutorials/authenticate-api-requests.md index 9f651ddd1a..d25e4a832a 100644 --- a/contrib/docs/tutorials/authenticate-api-requests.md +++ b/contrib/docs/tutorials/authenticate-api-requests.md @@ -6,6 +6,13 @@ API requests from frontend plugins include an authorization header with a Backst **NOTE**: Enabling this means that Backstage will stop working for guests, as no token is issued for them. +Since the middleware always expects a valid token, API requests from backend plugins will need one as well. Backends have no concept of a Backstage identity so instead they use a token generated using a shared key from the `app-config.yaml`. +You can generate a unique key for your app in a terminal, and set the `BACKEND_SECRET` environment variable to the resulting value. + +```bash +node -p 'require("crypto").randomBytes(24).toString("base64")' +``` + As techdocs HTML pages load assets without an Authorization header the code below also sets a token cookie when the user logs in (and when the token is about to expire). ```typescript @@ -60,7 +67,13 @@ async function main() { const token = IdentityClient.getBearerToken(req.headers.authorization) || req.cookies['token']; - req.user = await identity.authenticate(token); + + // Authenticate all requests originating from backends by default + const isServerToken = await authEnv.tokenManager.isServerToken(token); + if (!isServerToken) { + req.user = await identity.authenticate(token); + } + if (!req.headers.authorization) { // Authorization header may be forwarded by plugin requests req.headers.authorization = `Bearer ${token}`; @@ -261,3 +274,9 @@ export const plugin = createPlugin({ ], }); ``` + +In the (probably unlikely) case that you need to authenticate from a backend plugin, the plugin environment contains a `tokenManager` that will provide a server token to use in the request: + +``` +const { token } = await this.tokenManager.getServerToken(); +``` From c35abaadee02f5dfcd7d75bb2069415c7b801c77 Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Wed, 10 Nov 2021 16:12:36 -0500 Subject: [PATCH 021/131] Clean up tests a bit Signed-off-by: Nataliya Issayeva --- .../src/tokens/ServerTokenManager.test.ts | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/packages/backend-common/src/tokens/ServerTokenManager.test.ts b/packages/backend-common/src/tokens/ServerTokenManager.test.ts index 88ef1f27c2..246a3199f5 100644 --- a/packages/backend-common/src/tokens/ServerTokenManager.test.ts +++ b/packages/backend-common/src/tokens/ServerTokenManager.test.ts @@ -23,12 +23,16 @@ const configWithSecret = new ConfigReader({ describe('ServerTokenManager', () => { describe('getServerToken', () => { - it('should always return a token', async () => { + it('should return a token if secret in config exists', async () => { const tokenManager = new ServerTokenManager(configWithSecret); expect((await tokenManager.getServerToken()).token).toBeDefined(); + }); - const emptyTokenManager = new ServerTokenManager(emptyConfig); - expect((await emptyTokenManager.getServerToken()).token).toBeDefined(); + it('should return a token if secret in config does not exist', async () => { + const tokenManagerWithEmptyConfig = new ServerTokenManager(emptyConfig); + expect( + (await tokenManagerWithEmptyConfig.getServerToken()).token, + ).toBeDefined(); }); }); From 83aa387b626b8f40f01743ba5713d6168522adbf Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Fri, 12 Nov 2021 15:41:21 -0500 Subject: [PATCH 022/131] Default to noop tokenManager and no backend secret Signed-off-by: Nataliya Issayeva --- app-config.yaml | 5 ++- .../tutorials/authenticate-api-requests.md | 26 +++++++++-- packages/backend-common/config.d.ts | 9 ++++ .../src/tokens/ServerTokenManager.test.ts | 43 ++++++++++++------ .../src/tokens/ServerTokenManager.ts | 44 +++++++++++++------ packages/backend-common/src/tokens/types.ts | 2 +- packages/backend/src/index.ts | 2 +- .../templates/default-app/app-config.yaml.hbs | 4 ++ .../default-app/packages/backend/src/index.ts | 2 +- 9 files changed, 103 insertions(+), 34 deletions(-) diff --git a/app-config.yaml b/app-config.yaml index d18b326c2c..d89961c9f9 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -24,8 +24,9 @@ app: backend: # Used for enabling authorization, secret is shared by all backend plugins - authorization: - secret: ${BACKEND_SECRET} + # See authenticate-api-requests.md in the contrib docs for information on the format + # authorization: + # secret: ${BACKEND_SECRET} baseUrl: http://localhost:7000 listen: port: 7000 diff --git a/contrib/docs/tutorials/authenticate-api-requests.md b/contrib/docs/tutorials/authenticate-api-requests.md index d25e4a832a..b58c48f988 100644 --- a/contrib/docs/tutorials/authenticate-api-requests.md +++ b/contrib/docs/tutorials/authenticate-api-requests.md @@ -69,8 +69,10 @@ async function main() { req.cookies['token']; // Authenticate all requests originating from backends by default - const isServerToken = await authEnv.tokenManager.isServerToken(token); - if (!isServerToken) { + const isValidServerToken = await authEnv.tokenManager.validateServerToken( + token, + ); + if (!isValidServerToken) { req.user = await identity.authenticate(token); } @@ -275,7 +277,25 @@ export const plugin = createPlugin({ }); ``` -In the (probably unlikely) case that you need to authenticate from a backend plugin, the plugin environment contains a `tokenManager` that will provide a server token to use in the request: +In the (probably unlikely) case that you need to authenticate from a backend plugin, the plugin environment contains a `tokenManager` that will provide a server token to use in the request. It is a noop `tokenManager` by default -- you'll need to instantiate a new one using the secret from your config instead: + +```diff +// packages/backend/src/index.ts + +function makeCreateEnv(config: Config) { + const root = getRootLogger(); + const reader = UrlReaders.default({ logger: root, config }); + const discovery = SingleHostDiscovery.fromConfig(config); + + root.info(`Created UrlReader ${reader}`); + + const cacheManager = CacheManager.fromConfig(config); + const databaseManager = DatabaseManager.fromConfig(config); +- const tokenManager = ServerTokenManager.noop(); ++ const tokenManager = ServerTokenManager.fromConfig(config); +``` + +With this `tokenManager`, you can then generate a server token for requests: ``` const { token } = await this.tokenManager.getServerToken(); diff --git a/packages/backend-common/config.d.ts b/packages/backend-common/config.d.ts index 3690069431..865fbb86db 100644 --- a/packages/backend-common/config.d.ts +++ b/packages/backend-common/config.d.ts @@ -20,6 +20,15 @@ export interface Config { }; backend: { + /** Backend configuration for when request authentication is enabled */ + authorization?: { + /** + * Secret shared by all backends for generating tokens + * Format is base64 24-bit key + */ + secret?: string; + }; + baseUrl: string; // defined in core, but repeated here without doc /** Address that the backend should listen to. */ diff --git a/packages/backend-common/src/tokens/ServerTokenManager.test.ts b/packages/backend-common/src/tokens/ServerTokenManager.test.ts index 246a3199f5..ddbb62bd42 100644 --- a/packages/backend-common/src/tokens/ServerTokenManager.test.ts +++ b/packages/backend-common/src/tokens/ServerTokenManager.test.ts @@ -22,32 +22,49 @@ const configWithSecret = new ConfigReader({ }); describe('ServerTokenManager', () => { + it('should throw if secret in config does not exist', () => { + expect(() => ServerTokenManager.fromConfig(emptyConfig)).toThrowError(); + }); + describe('getServerToken', () => { it('should return a token if secret in config exists', async () => { - const tokenManager = new ServerTokenManager(configWithSecret); + const tokenManager = ServerTokenManager.fromConfig(configWithSecret); expect((await tokenManager.getServerToken()).token).toBeDefined(); }); - it('should return a token if secret in config does not exist', async () => { - const tokenManagerWithEmptyConfig = new ServerTokenManager(emptyConfig); - expect( - (await tokenManagerWithEmptyConfig.getServerToken()).token, - ).toBeDefined(); + it('should return an empty string if using a noop TokenManager', async () => { + const tokenManager = ServerTokenManager.noop(); + expect((await tokenManager.getServerToken()).token).toBe(''); }); }); - describe('isServerToken', () => { + describe('validateServerToken', () => { it('should return true if token is valid', async () => { - const tokenManager = new ServerTokenManager(configWithSecret); + const tokenManager = ServerTokenManager.fromConfig(configWithSecret); const { token } = await tokenManager.getServerToken(); - const isServerToken = await tokenManager.isServerToken(token); - expect(isServerToken).toBe(true); + const isValidServerToken = await tokenManager.validateServerToken(token); + expect(isValidServerToken).toBe(true); }); it('should return false if token is invalid', async () => { - const tokenManager = new ServerTokenManager(configWithSecret); - const isServerToken = await tokenManager.isServerToken('random-string'); - expect(isServerToken).toBe(false); + const tokenManager = ServerTokenManager.fromConfig(configWithSecret); + const isValidServerToken = await tokenManager.validateServerToken( + 'random-string', + ); + expect(isValidServerToken).toBe(false); + }); + + it('should always return true if using noop TokenManager', async () => { + const tokenManager = ServerTokenManager.noop(); + const { token } = await tokenManager.getServerToken(); + const isValidServerToken0 = await tokenManager.validateServerToken(token); + const isValidServerToken1 = await tokenManager.validateServerToken( + 'random-string', + ); + const isValidServerToken2 = await tokenManager.validateServerToken(''); + expect(isValidServerToken0).toBe(true); + expect(isValidServerToken1).toBe(true); + expect(isValidServerToken2).toBe(true); }); }); }); diff --git a/packages/backend-common/src/tokens/ServerTokenManager.ts b/packages/backend-common/src/tokens/ServerTokenManager.ts index 6737dd4d8b..8c757f5ff6 100644 --- a/packages/backend-common/src/tokens/ServerTokenManager.ts +++ b/packages/backend-common/src/tokens/ServerTokenManager.ts @@ -19,15 +19,40 @@ import { Config } from '@backstage/config'; import { TokenManager } from './types'; export class ServerTokenManager implements TokenManager { - private key: JWK.OctKey; + private key: JWK.OctKey | JWK.NoneKey; - constructor(config: Config) { - const secret = - config.getOptionalString('backend.authorization.secret') ?? 'no-secret'; - this.key = JWK.asKey({ kty: 'oct', k: secret }); + static noop() { + return new ServerTokenManager(); } - async isServerToken(token: string): Promise { + static fromConfig(config: Config) { + const secret = config.getOptionalString('backend.authorization.secret'); + if (!secret) { + throw new Error('No backend auth secret set in app-config'); + } + return new ServerTokenManager(secret); + } + + private constructor(secret: string = '') { + this.key = secret ? JWK.asKey({ kty: 'oct', k: secret }) : JWK.None; + } + + async getServerToken(): Promise<{ token: string }> { + if (this.key === JWK.None) { + return { token: '' }; + } + + const jwt = JWT.sign({ sub: 'backstage-server' }, this.key, { + algorithm: 'HS256', + }); + return { token: jwt }; + } + + async validateServerToken(token: string): Promise { + if (this.key === JWK.None) { + return true; + } + try { JWT.verify(token, this.key); return true; @@ -35,11 +60,4 @@ export class ServerTokenManager implements TokenManager { return false; } } - - async getServerToken(): Promise<{ token: string }> { - const jwt = JWT.sign({ sub: 'backstage-server' }, this.key, { - algorithm: 'HS256', - }); - return { token: jwt }; - } } diff --git a/packages/backend-common/src/tokens/types.ts b/packages/backend-common/src/tokens/types.ts index 278695a448..506e1191ec 100644 --- a/packages/backend-common/src/tokens/types.ts +++ b/packages/backend-common/src/tokens/types.ts @@ -15,6 +15,6 @@ */ export interface TokenManager { - isServerToken: (token: string) => Promise; getServerToken: () => Promise<{ token: string }>; + validateServerToken: (token: string) => Promise; } diff --git a/packages/backend/src/index.ts b/packages/backend/src/index.ts index 63285c83fa..4426ed7767 100644 --- a/packages/backend/src/index.ts +++ b/packages/backend/src/index.ts @@ -61,7 +61,7 @@ function makeCreateEnv(config: Config) { const root = getRootLogger(); const reader = UrlReaders.default({ logger: root, config }); const discovery = SingleHostDiscovery.fromConfig(config); - const tokenManager = new ServerTokenManager(config); + const tokenManager = ServerTokenManager.noop(); root.info(`Created UrlReader ${reader}`); diff --git a/packages/create-app/templates/default-app/app-config.yaml.hbs b/packages/create-app/templates/default-app/app-config.yaml.hbs index 9c35c58c33..726d31ea65 100644 --- a/packages/create-app/templates/default-app/app-config.yaml.hbs +++ b/packages/create-app/templates/default-app/app-config.yaml.hbs @@ -6,6 +6,10 @@ organization: name: My Company backend: + # Used for enabling authorization, secret is shared by all backend plugins + # See authenticate-api-requests.md in the contrib docs for information on the format + # authorization: + # secret: ${BACKEND_SECRET} baseUrl: http://localhost:7000 listen: port: 7000 diff --git a/packages/create-app/templates/default-app/packages/backend/src/index.ts b/packages/create-app/templates/default-app/packages/backend/src/index.ts index 87dc390291..3f12122a3f 100644 --- a/packages/create-app/templates/default-app/packages/backend/src/index.ts +++ b/packages/create-app/templates/default-app/packages/backend/src/index.ts @@ -38,7 +38,7 @@ function makeCreateEnv(config: Config) { const cacheManager = CacheManager.fromConfig(config); const databaseManager = DatabaseManager.fromConfig(config); - const tokenManager = new ServerTokenManager(config); + const tokenManager = ServerTokenManager.noop(); return (plugin: string): PluginEnvironment => { const logger = root.child({ type: 'plugin', plugin }); From f04f38dbcd0bf873a97643d7b7e6e1832937d5d4 Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Fri, 12 Nov 2021 16:09:08 -0500 Subject: [PATCH 023/131] Fix collator tests Signed-off-by: Nataliya Issayeva --- .../src/search/DefaultCatalogCollator.test.ts | 17 +++++++++++++++-- .../src/search/DefaultTechDocsCollator.test.ts | 14 ++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/plugins/catalog-backend/src/search/DefaultCatalogCollator.test.ts b/plugins/catalog-backend/src/search/DefaultCatalogCollator.test.ts index 20e141b921..49235584e1 100644 --- a/plugins/catalog-backend/src/search/DefaultCatalogCollator.test.ts +++ b/plugins/catalog-backend/src/search/DefaultCatalogCollator.test.ts @@ -14,7 +14,10 @@ * limitations under the License. */ -import { PluginEndpointDiscovery } from '@backstage/backend-common'; +import { + PluginEndpointDiscovery, + TokenManager, +} from '@backstage/backend-common'; import { Entity } from '@backstage/catalog-model'; import { DefaultCatalogCollator } from './DefaultCatalogCollator'; import { setupServer } from 'msw/node'; @@ -55,6 +58,7 @@ const expectedEntities: Entity[] = [ describe('DefaultCatalogCollator', () => { let mockDiscoveryApi: jest.Mocked; + let mockTokenManager: jest.Mocked; let collator: DefaultCatalogCollator; beforeAll(() => { @@ -62,7 +66,14 @@ describe('DefaultCatalogCollator', () => { getBaseUrl: jest.fn().mockResolvedValue('http://localhost:7000'), getExternalBaseUrl: jest.fn(), }; - collator = new DefaultCatalogCollator({ discovery: mockDiscoveryApi }); + mockTokenManager = { + getServerToken: jest.fn().mockResolvedValue({ token: '' }), + validateServerToken: jest.fn().mockResolvedValue(true), + }; + collator = new DefaultCatalogCollator({ + discovery: mockDiscoveryApi, + tokenManager: mockTokenManager, + }); server.listen(); }); beforeEach(() => { @@ -118,6 +129,7 @@ describe('DefaultCatalogCollator', () => { // Provide an alternate location template. collator = new DefaultCatalogCollator({ discovery: mockDiscoveryApi, + tokenManager: mockTokenManager, locationTemplate: '/software/:name', }); @@ -131,6 +143,7 @@ describe('DefaultCatalogCollator', () => { // Provide an alternate location template. collator = DefaultCatalogCollator.fromConfig(new ConfigReader({}), { discovery: mockDiscoveryApi, + tokenManager: mockTokenManager, filter: { kind: ['Foo', 'Bar'], }, diff --git a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts index 21be228636..e689cd9f61 100644 --- a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts +++ b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts @@ -17,6 +17,7 @@ import { PluginEndpointDiscovery, getVoidLogger, + TokenManager, } from '@backstage/backend-common'; import { Entity } from '@backstage/catalog-model'; import { DefaultTechDocsCollator } from './DefaultTechDocsCollator'; @@ -87,6 +88,7 @@ const expectedEntities: Entity[] = [ describe('DefaultTechDocsCollator with legacyPathCasing configuration', () => { let mockDiscoveryApi: jest.Mocked; + let mockTokenManager: jest.Mocked; let collator: DefaultTechDocsCollator; const worker = setupServer(); @@ -96,6 +98,10 @@ describe('DefaultTechDocsCollator with legacyPathCasing configuration', () => { getBaseUrl: jest.fn().mockResolvedValue('http://test-backend'), getExternalBaseUrl: jest.fn(), }; + mockTokenManager = { + getServerToken: jest.fn().mockResolvedValue({ token: '' }), + validateServerToken: jest.fn().mockResolvedValue(true), + }; const mockConfig = new ConfigReader({ techdocs: { legacyUseCaseSensitiveTripletPaths: true, @@ -103,6 +109,7 @@ describe('DefaultTechDocsCollator with legacyPathCasing configuration', () => { }); collator = DefaultTechDocsCollator.fromConfig(mockConfig, { discovery: mockDiscoveryApi, + tokenManager: mockTokenManager, logger, legacyPathCasing: true, }); @@ -147,6 +154,7 @@ describe('DefaultTechDocsCollator with legacyPathCasing configuration', () => { describe('DefaultTechDocsCollator', () => { let mockDiscoveryApi: jest.Mocked; + let mockTokenManager: jest.Mocked; let collator: DefaultTechDocsCollator; const worker = setupServer(); @@ -156,8 +164,13 @@ describe('DefaultTechDocsCollator', () => { getBaseUrl: jest.fn().mockResolvedValue('http://test-backend'), getExternalBaseUrl: jest.fn(), }; + mockTokenManager = { + getServerToken: jest.fn().mockResolvedValue({ token: '' }), + validateServerToken: jest.fn().mockResolvedValue(true), + }; collator = DefaultTechDocsCollator.fromConfig(new ConfigReader({}), { discovery: mockDiscoveryApi, + tokenManager: mockTokenManager, logger, }); @@ -195,6 +208,7 @@ describe('DefaultTechDocsCollator', () => { // Provide an alternate location template. collator = new DefaultTechDocsCollator({ discovery: mockDiscoveryApi, + tokenManager: mockTokenManager, locationTemplate: '/software/:name', logger, }); From 640ba82ca67b0e41270f5672b8a573ed01f673cf Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Fri, 12 Nov 2021 16:25:12 -0500 Subject: [PATCH 024/131] Update api reports Signed-off-by: Nataliya Issayeva --- packages/backend-common/api-report.md | 28 ++++++++++++++++++++++++++ plugins/catalog-backend/api-report.md | 6 ++++++ plugins/techdocs-backend/api-report.md | 3 +++ 3 files changed, 37 insertions(+) diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md index e3119e78a8..01d16b587c 100644 --- a/packages/backend-common/api-report.md +++ b/packages/backend-common/api-report.md @@ -526,6 +526,22 @@ export type SearchResponseFile = { content(): Promise; }; +// Warning: (ae-missing-release-tag) "ServerTokenManager" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export class ServerTokenManager implements TokenManager { + // (undocumented) + static fromConfig(config: Config): ServerTokenManager; + // (undocumented) + getServerToken(): Promise<{ + token: string; + }>; + // (undocumented) + static noop(): ServerTokenManager; + // (undocumented) + validateServerToken(token: string): Promise; +} + // @public (undocumented) export type ServiceBuilder = { loadConfig(config: Config): ServiceBuilder; @@ -583,6 +599,18 @@ export interface StatusCheckHandlerOptions { statusCheck?: StatusCheck; } +// Warning: (ae-missing-release-tag) "TokenManager" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface TokenManager { + // (undocumented) + getServerToken: () => Promise<{ + token: string; + }>; + // (undocumented) + validateServerToken: (token: string) => Promise; +} + // @public export type UrlReader = { read(url: string): Promise; diff --git a/plugins/catalog-backend/api-report.md b/plugins/catalog-backend/api-report.md index 6660912dda..abea100aae 100644 --- a/plugins/catalog-backend/api-report.md +++ b/plugins/catalog-backend/api-report.md @@ -31,6 +31,7 @@ import { ResourceEntityV1alpha1 } from '@backstage/catalog-model'; import { Router } from 'express'; import { ScmIntegrationRegistry } from '@backstage/integration'; import { ScmIntegrations } from '@backstage/integration'; +import { TokenManager } from '@backstage/backend-common'; import { UrlReader } from '@backstage/backend-common'; import { Validators } from '@backstage/catalog-model'; @@ -736,8 +737,10 @@ export class DefaultCatalogCollator implements DocumentCollator { locationTemplate, filter, catalogClient, + tokenManager, }: { discovery: PluginEndpointDiscovery; + tokenManager: TokenManager; locationTemplate?: string; filter?: CatalogEntitiesRequest['filter']; catalogClient?: CatalogApi; @@ -760,12 +763,15 @@ export class DefaultCatalogCollator implements DocumentCollator { _config: Config, options: { discovery: PluginEndpointDiscovery; + tokenManager: TokenManager; filter?: CatalogEntitiesRequest['filter']; }, ): DefaultCatalogCollator; // (undocumented) protected locationTemplate: string; // (undocumented) + protected tokenManager: TokenManager; + // (undocumented) readonly type: string; } diff --git a/plugins/techdocs-backend/api-report.md b/plugins/techdocs-backend/api-report.md index a6094c2bdd..f9be757e6a 100644 --- a/plugins/techdocs-backend/api-report.md +++ b/plugins/techdocs-backend/api-report.md @@ -14,6 +14,7 @@ import { PluginEndpointDiscovery } from '@backstage/backend-common'; import { PreparerBuilder } from '@backstage/techdocs-common'; import { PublisherBase } from '@backstage/techdocs-common'; import { TechDocsDocument } from '@backstage/techdocs-common'; +import { TokenManager } from '@backstage/backend-common'; // Warning: (ae-forgotten-export) The symbol "RouterOptions" needs to be exported by the entry point index.d.ts // Warning: (ae-missing-release-tag) "createRouter" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) @@ -31,6 +32,7 @@ export class DefaultTechDocsCollator implements DocumentCollator { locationTemplate, logger, catalogClient, + tokenManager, parallelismLimit, legacyPathCasing, }: TechDocsCollatorOptions); @@ -60,6 +62,7 @@ export class DefaultTechDocsCollator implements DocumentCollator { export type TechDocsCollatorOptions = { discovery: PluginEndpointDiscovery; logger: Logger_2; + tokenManager: TokenManager; locationTemplate?: string; catalogClient?: CatalogApi; parallelismLimit?: number; From 8e77f47119f6ccd5dbd5218efd68fc30b69bc6a1 Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Fri, 12 Nov 2021 16:48:09 -0500 Subject: [PATCH 025/131] Add missing tokenManager in default app backend Signed-off-by: Nataliya Issayeva --- .../default-app/packages/backend/src/plugins/search.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/create-app/templates/default-app/packages/backend/src/plugins/search.ts b/packages/create-app/templates/default-app/packages/backend/src/plugins/search.ts index 7fc317d23d..7f5b93dbca 100644 --- a/packages/create-app/templates/default-app/packages/backend/src/plugins/search.ts +++ b/packages/create-app/templates/default-app/packages/backend/src/plugins/search.ts @@ -11,6 +11,7 @@ export default async function createPlugin({ logger, discovery, config, + tokenManager, }: PluginEnvironment) { // Initialize a connection to a search engine. const searchEngine = new LunrSearchEngine({ logger }); @@ -20,7 +21,7 @@ export default async function createPlugin({ // particular collator gathers entities from the software catalog. indexBuilder.addCollator({ defaultRefreshIntervalSeconds: 600, - collator: DefaultCatalogCollator.fromConfig(config, { discovery }), + collator: DefaultCatalogCollator.fromConfig(config, { discovery, tokenManager }), }); // The scheduler controls when documents are gathered from collators and sent From 0f5744a5a2576316edd682fc81322164abfcd0c5 Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Mon, 15 Nov 2021 09:44:44 -0500 Subject: [PATCH 026/131] Mark auth secret as secret Signed-off-by: Nataliya Issayeva --- packages/backend-common/config.d.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/backend-common/config.d.ts b/packages/backend-common/config.d.ts index 865fbb86db..53e0e0b838 100644 --- a/packages/backend-common/config.d.ts +++ b/packages/backend-common/config.d.ts @@ -25,6 +25,7 @@ export interface Config { /** * Secret shared by all backends for generating tokens * Format is base64 24-bit key + * @visibility secret */ secret?: string; }; From c149a56f79888ff725d4694416ae2b1e1da65ce5 Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Mon, 15 Nov 2021 10:03:56 -0500 Subject: [PATCH 027/131] Fix prettier error maybe Signed-off-by: Nataliya Issayeva --- .../default-app/packages/backend/src/plugins/search.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/create-app/templates/default-app/packages/backend/src/plugins/search.ts b/packages/create-app/templates/default-app/packages/backend/src/plugins/search.ts index 7f5b93dbca..4411fbdf33 100644 --- a/packages/create-app/templates/default-app/packages/backend/src/plugins/search.ts +++ b/packages/create-app/templates/default-app/packages/backend/src/plugins/search.ts @@ -21,7 +21,10 @@ export default async function createPlugin({ // particular collator gathers entities from the software catalog. indexBuilder.addCollator({ defaultRefreshIntervalSeconds: 600, - collator: DefaultCatalogCollator.fromConfig(config, { discovery, tokenManager }), + collator: DefaultCatalogCollator.fromConfig(config, { + discovery, + tokenManager, + }), }); // The scheduler controls when documents are gathered from collators and sent From 96bf8661b8b8cae358b8b95802a1768a83b09f6b Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Mon, 15 Nov 2021 11:04:21 -0500 Subject: [PATCH 028/131] Add changeset Signed-off-by: Nataliya Issayeva --- .changeset/odd-flowers-hope.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .changeset/odd-flowers-hope.md diff --git a/.changeset/odd-flowers-hope.md b/.changeset/odd-flowers-hope.md new file mode 100644 index 0000000000..d66b59c5ca --- /dev/null +++ b/.changeset/odd-flowers-hope.md @@ -0,0 +1,9 @@ +--- +'example-backend': patch +'@backstage/backend-common': patch +'@backstage/create-app': patch +'@backstage/plugin-catalog-backend': patch +'@backstage/plugin-techdocs-backend': patch +--- + +Create a TokenManager interface and ServerTokenManager implementation to generate and validate server tokens for authenticated backend-to-backend API requests From 98bad1b7d881e177fabf384308aad78970f6ce3c Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Tue, 16 Nov 2021 10:30:59 -0800 Subject: [PATCH 029/131] Update changeset and docs Signed-off-by: Nataliya Issayeva --- .changeset/odd-flowers-hope.md | 86 ++++++++++++++++++++++++- docs/features/search/getting-started.md | 16 ++++- docs/features/search/how-to-guides.md | 3 +- 3 files changed, 98 insertions(+), 7 deletions(-) diff --git a/.changeset/odd-flowers-hope.md b/.changeset/odd-flowers-hope.md index d66b59c5ca..c76f1b8287 100644 --- a/.changeset/odd-flowers-hope.md +++ b/.changeset/odd-flowers-hope.md @@ -2,8 +2,88 @@ 'example-backend': patch '@backstage/backend-common': patch '@backstage/create-app': patch -'@backstage/plugin-catalog-backend': patch -'@backstage/plugin-techdocs-backend': patch +'@backstage/plugin-catalog-backend': minor +'@backstage/plugin-techdocs-backend': minor --- -Create a TokenManager interface and ServerTokenManager implementation to generate and validate server tokens for authenticated backend-to-backend API requests +Create a TokenManager interface and ServerTokenManager implementation to generate and validate server tokens for authenticated backend-to-backend API requests. + +**BREAKING** `DefaultCatalogCollator` and `DefaultTechDocsCollator` now require a `tokenManager` to be passed in the `options` argument. + +In your backend, update the `PluginEnvironment` to include a `tokenManager`: + +```diff +// packages/backend/src/types.ts + +... +import { + ... ++ TokenManager, +} from '@backstage/backend-common'; + +export type PluginEnvironment = { + ... ++ tokenManager: TokenManager; +}; +``` + +Then, create a `ServerTokenManager`. This can either be a `noop` that requires no secret and validates all requests by default, or one that uses a secret from your `app-config.yaml` to generate and validate tokens. + +```diff +// packages/backend/src/index.ts + +... +import { + ... ++ ServerTokenManager, +} from '@backstage/backend-common'; +... + +function makeCreateEnv(config: Config) { + ... + // CHOOSE ONE + // TokenManager not requiring a secret ++ const tokenManager = ServerTokenManager.noop(); + // OR TokenManager requiring a secret ++ const tokenManager = ServerTokenManager.fromConfig(config); + + ... + return (plugin: string): PluginEnvironment => { + ... +- return { logger, cache, database, config, reader, discovery }; ++ return { logger, cache, database, config, reader, discovery, tokenManager }; + }; +} +``` + +Finally, pull the `tokenManager` from the search plugin environment and pass it to both collators. + +```diff +// packages/backend/src/plugins/search.ts + +... +export default async function createPlugin({ + ... ++ tokenManager, +}: PluginEnvironment) { + ... + indexBuilder.addCollator({ + defaultRefreshIntervalSeconds: 600, + collator: DefaultCatalogCollator.fromConfig(config, { + discovery, ++ tokenManager, + }), + }); + + indexBuilder.addCollator({ + defaultRefreshIntervalSeconds: 600, + collator: DefaultTechDocsCollator.fromConfig(config, { + discovery, + logger, ++ tokenManager, + }), + }); + + ... +} +``` diff --git a/docs/features/search/getting-started.md b/docs/features/search/getting-started.md index 27219e529a..7c3717e22e 100644 --- a/docs/features/search/getting-started.md +++ b/docs/features/search/getting-started.md @@ -154,13 +154,17 @@ import { DefaultCatalogCollator } from '@backstage/plugin-catalog-backend'; export default async function createPlugin({ logger, discovery, + tokenManager, }: PluginEnvironment) { const searchEngine = new LunrSearchEngine({ logger }); const indexBuilder = new IndexBuilder({ logger, searchEngine }); indexBuilder.addCollator({ defaultRefreshIntervalSeconds: 600, - collator: new DefaultCatalogCollator({ discovery }), + collator: new DefaultCatalogCollator({ + discovery, + tokenManager, + }), }); const { scheduler } = await indexBuilder.build(); @@ -285,7 +289,10 @@ const indexBuilder = new IndexBuilder({ logger, searchEngine }); indexBuilder.addCollator({ defaultRefreshIntervalSeconds: 600, - collator: new DefaultCatalogCollator({ discovery }), + collator: new DefaultCatalogCollator({ + discovery, + tokenManager, + }), }); indexBuilder.addCollator({ @@ -303,6 +310,9 @@ its `defaultRefreshIntervalSeconds` value, like this: ```typescript {3} indexBuilder.addCollator({ defaultRefreshIntervalSeconds: 600, - collator: new DefaultCatalogCollator({ discovery }), + collator: new DefaultCatalogCollator({ + discovery, + tokenManager, + }), }); ``` diff --git a/docs/features/search/how-to-guides.md b/docs/features/search/how-to-guides.md index 621d46b51e..4ba44b8ef4 100644 --- a/docs/features/search/how-to-guides.md +++ b/docs/features/search/how-to-guides.md @@ -2,7 +2,7 @@ id: how-to-guides title: Search "HOW TO" guides sidebar_label: "HOW TO" guides -description: Search "HOW TO" guides +description: Search "HOW TO" guides --- ## How to implement your own Search API @@ -74,6 +74,7 @@ indexBuilder.addCollator({ collator: DefaultTechDocsCollator.fromConfig(config, { discovery, logger, + tokenManager, }), }); ``` From 6968b52b9d3614ac564a3a96b22dcc39c89b8fcb Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Wed, 17 Nov 2021 08:52:29 -0800 Subject: [PATCH 030/131] Update changeset Signed-off-by: Nataliya Issayeva --- .changeset/odd-flowers-hope.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/.changeset/odd-flowers-hope.md b/.changeset/odd-flowers-hope.md index c76f1b8287..b07af54680 100644 --- a/.changeset/odd-flowers-hope.md +++ b/.changeset/odd-flowers-hope.md @@ -1,16 +1,15 @@ --- -'example-backend': patch '@backstage/backend-common': patch '@backstage/create-app': patch '@backstage/plugin-catalog-backend': minor '@backstage/plugin-techdocs-backend': minor --- -Create a TokenManager interface and ServerTokenManager implementation to generate and validate server tokens for authenticated backend-to-backend API requests. +Create a TokenManager interface and ServerTokenManager implementation to generate and validate server tokens for authenticated backend-to-backend API requests. Incorporate usage of the tokenManager into the backend created using `create-app`. **BREAKING** `DefaultCatalogCollator` and `DefaultTechDocsCollator` now require a `tokenManager` to be passed in the `options` argument. -In your backend, update the `PluginEnvironment` to include a `tokenManager`: +In existing backends, update the `PluginEnvironment` to include a `tokenManager`: ```diff // packages/backend/src/types.ts From 7f0d927d99fd00b18ce449c1cf329d655a699551 Mon Sep 17 00:00:00 2001 From: Nataliya Issayeva Date: Thu, 18 Nov 2021 08:44:28 -0800 Subject: [PATCH 031/131] Move authing API requests tutorial to main docs Signed-off-by: Nataliya Issayeva --- .../tutorials/authenticate-api-requests.md | 50 +++++++++++++++---- 1 file changed, 40 insertions(+), 10 deletions(-) rename {contrib/docs => docs}/tutorials/authenticate-api-requests.md (80%) diff --git a/contrib/docs/tutorials/authenticate-api-requests.md b/docs/tutorials/authenticate-api-requests.md similarity index 80% rename from contrib/docs/tutorials/authenticate-api-requests.md rename to docs/tutorials/authenticate-api-requests.md index b58c48f988..54952272da 100644 --- a/contrib/docs/tutorials/authenticate-api-requests.md +++ b/docs/tutorials/authenticate-api-requests.md @@ -1,19 +1,45 @@ +--- +id: authenticate-api-requests +title: Authenticating API Requests +description: Guide for authenticating API requests within Backstage +--- + +> This document has been moved over from the community contributed docs +> directory and will continue to evolve as request authentication/authorization +> becomes a first-class citizen of Backstage. The approach described here is now +> fully supported and functional end-to-end, but will eventually be replaced in +> favor of a built-in framework that will broadly support authentication and +> authorization needs within Backstage. + # Authenticate API requests -The Backstage backend APIs are by default available without authentication. To avoid evil-doers from accessing or modifying data, one might use a network protection mechanism such as a firewall or an authenticating reverse proxy. For Backstage instances that are available on the Internet one can instead use the experimental IdentityClient as outlined below. +The Backstage backend APIs are by default available without authentication. To +avoid evil-doers from accessing or modifying data, one might use a network +protection mechanism such as a firewall or an authenticating reverse proxy. For +Backstage instances that are available on the Internet one can instead use the +experimental IdentityClient as outlined below. -API requests from frontend plugins include an authorization header with a Backstage identity token acquired when the user logs in. By adding a middleware that verifies said token to be valid and signed by Backstage, non-authenticated requests can be blocked with a 401 Unauthorized response. +API requests from frontend plugins include an authorization header with a +Backstage identity token acquired when the user logs in. By adding a middleware +that verifies said token to be valid and signed by Backstage, non-authenticated +requests can be blocked with a 401 Unauthorized response. -**NOTE**: Enabling this means that Backstage will stop working for guests, as no token is issued for them. +**NOTE**: Enabling this means that Backstage will stop working for guests, as no +token is issued for them. -Since the middleware always expects a valid token, API requests from backend plugins will need one as well. Backends have no concept of a Backstage identity so instead they use a token generated using a shared key from the `app-config.yaml`. -You can generate a unique key for your app in a terminal, and set the `BACKEND_SECRET` environment variable to the resulting value. +Since the middleware always expects a valid token, API requests from backend +plugins will need one as well. Backends have no concept of a Backstage identity +so instead they use a token generated using a shared key from the +`app-config.yaml`. You can generate a unique key for your app in a terminal, and +set the `BACKEND_SECRET` environment variable to the resulting value. ```bash node -p 'require("crypto").randomBytes(24).toString("base64")' ``` -As techdocs HTML pages load assets without an Authorization header the code below also sets a token cookie when the user logs in (and when the token is about to expire). +As techdocs HTML pages load assets without an Authorization header the code +below also sets a token cookie when the user logs in (and when the token is +about to expire). ```typescript // packages/backend/src/index.ts from a create-app deployment @@ -197,9 +223,10 @@ const app = createApp({ // ... ``` -**NOTE**: Most Backstage frontend plugins come with the support for the `IdentityApi`. -In case you already have a dozen of internal ones, you may need to update those too. -Assuming you follow the common plugin structure, the changes to your front-end may look like: +**NOTE**: Most Backstage frontend plugins come with the support for the +`IdentityApi`. In case you already have a dozen of internal ones, you may need +to update those too. Assuming you follow the common plugin structure, the +changes to your front-end may look like: ```diff // plugins/internal-plugin/src/api.ts @@ -277,7 +304,10 @@ export const plugin = createPlugin({ }); ``` -In the (probably unlikely) case that you need to authenticate from a backend plugin, the plugin environment contains a `tokenManager` that will provide a server token to use in the request. It is a noop `tokenManager` by default -- you'll need to instantiate a new one using the secret from your config instead: +In the (probably unlikely) case that you need to authenticate from a backend +plugin, the plugin environment contains a `tokenManager` that will provide a +server token to use in the request. It is a noop `tokenManager` by default -- +you'll need to instantiate a new one using the secret from your config instead: ```diff // packages/backend/src/index.ts From 361aad1a0ff1192a864683a7b0b501e1ae8b718c Mon Sep 17 00:00:00 2001 From: Andrew Tran Date: Fri, 19 Nov 2021 11:29:11 -0600 Subject: [PATCH 032/131] add cronjobs and jobs to k8s backend Signed-off-by: Andrew Tran --- .../src/service/KubernetesClientProvider.ts | 7 +++++++ .../src/service/KubernetesFanOutHandler.ts | 12 ++++++++++++ .../src/service/KubernetesFetcher.ts | 2 ++ plugins/kubernetes-backend/src/types/types.ts | 2 ++ plugins/kubernetes-common/src/types.ts | 14 ++++++++++++++ 5 files changed, 37 insertions(+) diff --git a/plugins/kubernetes-backend/src/service/KubernetesClientProvider.ts b/plugins/kubernetes-backend/src/service/KubernetesClientProvider.ts index 4b2848508e..5f6825ada9 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesClientProvider.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesClientProvider.ts @@ -16,6 +16,7 @@ import { AppsV1Api, + BatchV1Api, AutoscalingV1Api, CoreV1Api, KubeConfig, @@ -74,6 +75,12 @@ export class KubernetesClientProvider { return kc.makeApiClient(AutoscalingV1Api); } + getBatchClientByClusterDetails(clusterDetails: ClusterDetails) { + const kc = this.getKubeConfig(clusterDetails); + + return kc.makeApiClient(BatchV1Api); + } + getNetworkingBeta1Client(clusterDetails: ClusterDetails) { const kc = this.getKubeConfig(clusterDetails); diff --git a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts index 1f856e90a9..41d75a9835 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFanOutHandler.ts @@ -68,6 +68,18 @@ export const DEFAULT_OBJECTS: ObjectToFetch[] = [ plural: 'horizontalpodautoscalers', objectType: 'horizontalpodautoscalers', }, + { + group: 'batch', + apiVersion: 'v1', + plural: 'jobs', + objectType: 'jobs', + }, + { + group: 'batch', + apiVersion: 'v1', + plural: 'cronjobs', + objectType: 'cronjobs', + }, { group: 'networking.k8s.io', apiVersion: 'v1', diff --git a/plugins/kubernetes-backend/src/service/KubernetesFetcher.ts b/plugins/kubernetes-backend/src/service/KubernetesFetcher.ts index 308b7a10be..e845ebeaeb 100644 --- a/plugins/kubernetes-backend/src/service/KubernetesFetcher.ts +++ b/plugins/kubernetes-backend/src/service/KubernetesFetcher.ts @@ -17,6 +17,7 @@ import { AppsV1Api, AutoscalingV1Api, + BatchV1Api, CoreV1Api, NetworkingV1beta1Api, } from '@kubernetes/client-node'; @@ -41,6 +42,7 @@ export interface Clients { core: CoreV1Api; apps: AppsV1Api; autoscaling: AutoscalingV1Api; + batch: BatchV1Api; networkingBeta1: NetworkingV1beta1Api; } diff --git a/plugins/kubernetes-backend/src/types/types.ts b/plugins/kubernetes-backend/src/types/types.ts index 90485fcaee..b8aa482e47 100644 --- a/plugins/kubernetes-backend/src/types/types.ts +++ b/plugins/kubernetes-backend/src/types/types.ts @@ -67,6 +67,8 @@ export type KubernetesObjectTypes = | 'deployments' | 'replicasets' | 'horizontalpodautoscalers' + | 'jobs' + | 'cronjobs' | 'ingresses' | 'customresources'; diff --git a/plugins/kubernetes-common/src/types.ts b/plugins/kubernetes-common/src/types.ts index add661a5f8..8f4daa111b 100644 --- a/plugins/kubernetes-common/src/types.ts +++ b/plugins/kubernetes-common/src/types.ts @@ -17,8 +17,10 @@ import { ExtensionsV1beta1Ingress, V1ConfigMap, + V1CronJob, V1Deployment, V1HorizontalPodAutoscaler, + V1Job, V1Pod, V1ReplicaSet, V1Service, @@ -83,6 +85,8 @@ export type FetchResponse = | DeploymentFetchResponse | ReplicaSetsFetchResponse | HorizontalPodAutoscalersFetchResponse + | JobsFetchResponse + | CronJobsFetchResponse | IngressesFetchResponse | CustomResourceFetchResponse; @@ -116,6 +120,16 @@ export interface HorizontalPodAutoscalersFetchResponse { resources: Array; } +export interface JobsFetchResponse { + type: 'jobs'; + resources: Array; +} + +export interface CronJobsFetchResponse { + type: 'cronjobs'; + resources: Array; +} + export interface IngressesFetchResponse { type: 'ingresses'; resources: Array; From 37dc8447287eaf04ec6e66f7009b8dee42e689e9 Mon Sep 17 00:00:00 2001 From: Andrew Tran Date: Fri, 19 Nov 2021 17:11:11 -0600 Subject: [PATCH 033/131] add changeset Signed-off-by: Andrew Tran --- .changeset/big-phones-boil.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 .changeset/big-phones-boil.md diff --git a/.changeset/big-phones-boil.md b/.changeset/big-phones-boil.md new file mode 100644 index 0000000000..7d1e63797f --- /dev/null +++ b/.changeset/big-phones-boil.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-kubernetes-backend': patch +'@backstage/plugin-kubernetes-common': patch +--- + +Include cronjobs and jobs as default objects returned by the kubernetes backend and add/update relevant types. From db7227e659a32509306d3b233517116efb3dafa1 Mon Sep 17 00:00:00 2001 From: Yousif Al-Raheem Date: Mon, 22 Nov 2021 11:19:54 +0100 Subject: [PATCH 034/131] use backstage link instead of react router link in memberslistcard Signed-off-by: Yousif Al-Raheem --- .changeset/three-flowers-push.md | 5 +++++ .../Cards/Group/MembersList/MembersListCard.tsx | 13 +++---------- 2 files changed, 8 insertions(+), 10 deletions(-) create mode 100644 .changeset/three-flowers-push.md diff --git a/.changeset/three-flowers-push.md b/.changeset/three-flowers-push.md new file mode 100644 index 0000000000..5457c0fd15 --- /dev/null +++ b/.changeset/three-flowers-push.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-org': minor +--- + +use backstage link instead of react router link in MembersListCard diff --git a/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.tsx b/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.tsx index 7cc7ed88f5..7a15bd2122 100644 --- a/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.tsx +++ b/plugins/org/src/components/Cards/Group/MembersList/MembersListCard.tsx @@ -28,14 +28,13 @@ import { Box, createStyles, Grid, - Link, makeStyles, Theme, Typography, } from '@material-ui/core'; import Pagination from '@material-ui/lab/Pagination'; import React from 'react'; -import { generatePath, Link as RouterLink } from 'react-router-dom'; +import { generatePath } from 'react-router-dom'; import { useAsync } from 'react-use'; import { @@ -43,6 +42,7 @@ import { InfoCard, Progress, ResponseErrorPanel, + Link, } from '@backstage/core-components'; import { useApi } from '@backstage/core-plugin-api'; @@ -90,7 +90,6 @@ const MemberComponent = ({ member }: { member: UserEntity }) => { { {profile?.email && ( - - {profile.email} - + {profile.email} )} From 1caf4c2d726543a12fa7383d52768fbdb81923bd Mon Sep 17 00:00:00 2001 From: Andrew Tran Date: Mon, 22 Nov 2021 08:52:00 -0600 Subject: [PATCH 035/131] update schema.d.ts Signed-off-by: Andrew Tran --- plugins/kubernetes-backend/schema.d.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/kubernetes-backend/schema.d.ts b/plugins/kubernetes-backend/schema.d.ts index 8b96d5ceca..e69ac052f1 100644 --- a/plugins/kubernetes-backend/schema.d.ts +++ b/plugins/kubernetes-backend/schema.d.ts @@ -23,6 +23,8 @@ export interface Config { | 'deployments' | 'replicasets' | 'horizontalpodautoscalers' + | 'jobs' + | 'cronjobs' | 'ingresses' >; serviceLocatorMethod: { From 5f864eceedbded76800c29ad6e7382fe81c3b2b2 Mon Sep 17 00:00:00 2001 From: Andrew Tran Date: Mon, 22 Nov 2021 09:26:19 -0600 Subject: [PATCH 036/131] add example cronjob Signed-off-by: Andrew Tran --- .../dice-roller/dice-roller-manifests.yaml | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/plugins/kubernetes-backend/examples/dice-roller/dice-roller-manifests.yaml b/plugins/kubernetes-backend/examples/dice-roller/dice-roller-manifests.yaml index 68ef489170..c02b30dc28 100644 --- a/plugins/kubernetes-backend/examples/dice-roller/dice-roller-manifests.yaml +++ b/plugins/kubernetes-backend/examples/dice-roller/dice-roller-manifests.yaml @@ -200,6 +200,35 @@ spec: maxReplicas: 15 targetCPUUtilizationPercentage: 50 +--- +apiVersion: batch/v1 +kind: CronJob +metadata: + name: dice-roller-cronjob + labels: + 'backstage.io/kubernetes-id': dice-roller +spec: + schedule: "*/1 * * * *" + jobTemplate: + metadata: + labels: + 'backstage.io/kubernetes-id': dice-roller + spec: + template: + metadata: + labels: + 'backstage.io/kubernetes-id': dice-roller + spec: + containers: + - name: busybox + image: busybox + imagePullPolicy: IfNotPresent + command: + - /bin/sh + - -c + - date; echo Rolling a die! + restartPolicy: OnFailure + --- apiVersion: networking.k8s.io/v1beta1 kind: Ingress From e72e908e3f5a0b1c6a87c0e381a3dce8e9426c14 Mon Sep 17 00:00:00 2001 From: Andrew Tran Date: Mon, 22 Nov 2021 09:32:52 -0600 Subject: [PATCH 037/131] update example readme Signed-off-by: Andrew Tran --- .../examples/dice-roller/README.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/plugins/kubernetes-backend/examples/dice-roller/README.md b/plugins/kubernetes-backend/examples/dice-roller/README.md index 5f541bb61d..d4725e38c0 100644 --- a/plugins/kubernetes-backend/examples/dice-roller/README.md +++ b/plugins/kubernetes-backend/examples/dice-roller/README.md @@ -27,14 +27,15 @@ Add or update `app-config.local.yaml` with the following: ```yaml kubernetes: - serviceLocatorMethod: 'multiTenant' + serviceLocatorMethod: + type: 'multiTenant' clusterLocatorMethods: - - 'config' - clusters: - - url: - name: minikube - serviceAccountToken: - authProvider: 'serviceAccount' + - type: 'config' + clusters: + - url: + name: minikube + serviceAccountToken: + authProvider: 'serviceAccount' ``` ### Getting the service account token From 839e931d34f2b3e64ddeabf28f668fb74f1e1665 Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Mon, 22 Nov 2021 18:44:49 +0000 Subject: [PATCH 038/131] create-app: pass tokenManager when constructing TechDocsCollator Signed-off-by: Mike Lewis --- .../default-app/packages/backend/src/plugins/search.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/create-app/templates/default-app/packages/backend/src/plugins/search.ts b/packages/create-app/templates/default-app/packages/backend/src/plugins/search.ts index f2b35b296a..27a19588c4 100644 --- a/packages/create-app/templates/default-app/packages/backend/src/plugins/search.ts +++ b/packages/create-app/templates/default-app/packages/backend/src/plugins/search.ts @@ -31,7 +31,7 @@ export default async function createPlugin({ // collator gathers entities from techdocs. indexBuilder.addCollator({ defaultRefreshIntervalSeconds: 600, - collator: DefaultTechDocsCollator.fromConfig(config, { discovery, logger }), + collator: DefaultTechDocsCollator.fromConfig(config, { discovery, logger, tokenManager }), }); // The scheduler controls when documents are gathered from collators and sent From 03962638a03b08f8f8943afc0ef0fc73b2691d5e Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Tue, 23 Nov 2021 10:49:40 +0000 Subject: [PATCH 039/131] create-app: fix formatting in search.ts Signed-off-by: Mike Lewis --- .../default-app/packages/backend/src/plugins/search.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/create-app/templates/default-app/packages/backend/src/plugins/search.ts b/packages/create-app/templates/default-app/packages/backend/src/plugins/search.ts index 27a19588c4..f23b0c7bcf 100644 --- a/packages/create-app/templates/default-app/packages/backend/src/plugins/search.ts +++ b/packages/create-app/templates/default-app/packages/backend/src/plugins/search.ts @@ -31,7 +31,11 @@ export default async function createPlugin({ // collator gathers entities from techdocs. indexBuilder.addCollator({ defaultRefreshIntervalSeconds: 600, - collator: DefaultTechDocsCollator.fromConfig(config, { discovery, logger, tokenManager }), + collator: DefaultTechDocsCollator.fromConfig(config, { + discovery, + logger, + tokenManager, + }), }); // The scheduler controls when documents are gathered from collators and sent From fcfac818c88f83fb8a2c5c1b7a8f82937cd7ddb7 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Tue, 23 Nov 2021 12:11:41 +0100 Subject: [PATCH 040/131] package.json: add script for running snyk tests Signed-off-by: Patrik Oldsberg --- package.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/package.json b/package.json index 16ba8461ac..9adbb1c821 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,8 @@ "prettier:check": "prettier --check .", "lerna": "lerna", "storybook": "yarn workspace storybook start", + "snyk:test": "npx snyk test --yarn-workspaces --strict-out-of-sync=false", + "snyk:test:package": "yarn snyk:test --include", "build-storybook": "yarn workspace storybook build-storybook", "techdocs-cli": "node scripts/techdocs-cli.js", "techdocs-cli:dev": "cross-env TECHDOCS_CLI_DEV_MODE=true node scripts/techdocs-cli.js", From ef9dfd34402f8a563c10b595e14fa524f3c66cac Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Tue, 23 Nov 2021 13:54:04 +0000 Subject: [PATCH 041/131] backend-common: leave ConfigReader to throw errors when config is missing in ServerTokenManager Signed-off-by: Mike Lewis --- packages/backend-common/src/tokens/ServerTokenManager.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/backend-common/src/tokens/ServerTokenManager.ts b/packages/backend-common/src/tokens/ServerTokenManager.ts index 8c757f5ff6..fa7e6fac2d 100644 --- a/packages/backend-common/src/tokens/ServerTokenManager.ts +++ b/packages/backend-common/src/tokens/ServerTokenManager.ts @@ -26,10 +26,8 @@ export class ServerTokenManager implements TokenManager { } static fromConfig(config: Config) { - const secret = config.getOptionalString('backend.authorization.secret'); - if (!secret) { - throw new Error('No backend auth secret set in app-config'); - } + const secret = config.getString('backend.authorization.secret'); + return new ServerTokenManager(secret); } From db1befcf3985668b2ec3f5edcd03c575b327cd5a Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Tue, 23 Nov 2021 13:56:07 +0000 Subject: [PATCH 042/131] backend-common: make secret required if authorization config block is provided Signed-off-by: Mike Lewis --- packages/backend-common/config.d.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/backend-common/config.d.ts b/packages/backend-common/config.d.ts index 53e0e0b838..ceb9706ca9 100644 --- a/packages/backend-common/config.d.ts +++ b/packages/backend-common/config.d.ts @@ -27,7 +27,7 @@ export interface Config { * Format is base64 24-bit key * @visibility secret */ - secret?: string; + secret: string; }; baseUrl: string; // defined in core, but repeated here without doc From 42b01ee7250448788aec816e0afd14eaccb0d7ce Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Tue, 23 Nov 2021 13:57:38 +0000 Subject: [PATCH 043/131] backend-common: import ConfigReader from @backstage/config Signed-off-by: Mike Lewis --- packages/backend-common/package.json | 1 - packages/backend-common/src/tokens/ServerTokenManager.test.ts | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index 444a0a273b..ceb0b91594 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -82,7 +82,6 @@ }, "devDependencies": { "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.21", "@backstage/test-utils": "^0.1.22", "@types/archiver": "^5.1.0", "@types/compression": "^1.7.0", diff --git a/packages/backend-common/src/tokens/ServerTokenManager.test.ts b/packages/backend-common/src/tokens/ServerTokenManager.test.ts index ddbb62bd42..6fe920939b 100644 --- a/packages/backend-common/src/tokens/ServerTokenManager.test.ts +++ b/packages/backend-common/src/tokens/ServerTokenManager.test.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { ConfigReader } from '@backstage/core-app-api'; +import { ConfigReader } from '@backstage/config'; import { ServerTokenManager } from './ServerTokenManager'; const emptyConfig = new ConfigReader({}); From 7071dce02d4ba11e6beb88fbd669217e2e2a2b44 Mon Sep 17 00:00:00 2001 From: Adrian Barwicki Date: Fri, 19 Nov 2021 10:06:20 +0100 Subject: [PATCH 044/131] feat: expose catalog lib in `plugin-auth-backend` We are writing a custom OIDC provider plugin and need to use CatalogIdentityClient class in our provider. It is however not exported and we are not able to use it. It is not a problem for providers that are committed to backstage repo as they use the local path, e.g https://github.com/backstage/backstage/blob/master/plugins/auth-backend/src/providers/aws-alb/provider.ts#L31 - but only for the ones that are developed locally. Signed-off-by: Adrian Barwicki --- .changeset/tasty-deers-play.md | 5 +++++ plugins/auth-backend/api-report.md | 21 ++++++++++++++++++++- plugins/auth-backend/src/index.ts | 2 ++ 3 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 .changeset/tasty-deers-play.md diff --git a/.changeset/tasty-deers-play.md b/.changeset/tasty-deers-play.md new file mode 100644 index 0000000000..cf5322b0bd --- /dev/null +++ b/.changeset/tasty-deers-play.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-auth-backend': patch +--- + +Expose catalog lib in plugin-auth-backend, i.e `CatalogIdentityClient` class is exposed now. diff --git a/plugins/auth-backend/api-report.md b/plugins/auth-backend/api-report.md index 35c93e9537..eb7c53bd6b 100644 --- a/plugins/auth-backend/api-report.md +++ b/plugins/auth-backend/api-report.md @@ -175,6 +175,20 @@ export const bitbucketUserIdSignInResolver: SignInResolver // @public (undocumented) export const bitbucketUsernameSignInResolver: SignInResolver; +// Warning: (ae-missing-release-tag) "CatalogIdentityClient" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public +export class CatalogIdentityClient { + constructor(options: { catalogApi: CatalogApi; tokenIssuer: TokenIssuer }); + // Warning: (ae-forgotten-export) The symbol "UserQuery" needs to be exported by the entry point index.d.ts + findUser(query: UserQuery): Promise; + // Warning: (ae-forgotten-export) The symbol "MemberClaimQuery" needs to be exported by the entry point index.d.ts + resolveCatalogMembership({ + entityRefs, + logger, + }: MemberClaimQuery): Promise; +} + // Warning: (ae-missing-release-tag) "createAtlassianProvider" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -271,6 +285,12 @@ export const encodeState: (state: OAuthState) => string; // @public (undocumented) export const ensuresXRequestedWith: (req: express.Request) => boolean; +// Warning: (ae-forgotten-export) The symbol "TokenParams" needs to be exported by the entry point index.d.ts +// Warning: (ae-missing-release-tag) "getEntityClaims" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export function getEntityClaims(entity: UserEntity): TokenParams['claims']; + // Warning: (ae-missing-release-tag) "GithubOAuthResult" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -578,7 +598,6 @@ export type WebMessageResponse = // Warnings were encountered during analysis: // -// src/identity/types.d.ts:25:5 - (ae-forgotten-export) The symbol "TokenParams" needs to be exported by the entry point index.d.ts // src/identity/types.d.ts:31:9 - (ae-forgotten-export) The symbol "AnyJWK" needs to be exported by the entry point index.d.ts // src/providers/atlassian/provider.d.ts:37:5 - (ae-forgotten-export) The symbol "AuthHandler" needs to be exported by the entry point index.d.ts // src/providers/atlassian/provider.d.ts:42:9 - (ae-forgotten-export) The symbol "SignInResolver" needs to be exported by the entry point index.d.ts diff --git a/plugins/auth-backend/src/index.ts b/plugins/auth-backend/src/index.ts index 432da00142..894f8c1e55 100644 --- a/plugins/auth-backend/src/index.ts +++ b/plugins/auth-backend/src/index.ts @@ -31,3 +31,5 @@ export * from './lib/flow'; // OAuth wrapper over a passport or a custom `startegy`. export * from './lib/oauth'; + +export * from './lib/catalog'; From 8cb1c4d17c5b79cdb9e4ce664d300fc4d32fb931 Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Tue, 23 Nov 2021 14:41:33 +0000 Subject: [PATCH 045/131] backend-common: rename config block from authorization to auth Signed-off-by: Mike Lewis --- app-config.yaml | 4 ++-- packages/backend-common/config.d.ts | 2 +- packages/backend-common/src/tokens/ServerTokenManager.test.ts | 2 +- packages/backend-common/src/tokens/ServerTokenManager.ts | 2 +- packages/create-app/templates/default-app/app-config.yaml.hbs | 4 ++-- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app-config.yaml b/app-config.yaml index 032ce0b4e9..08dd2837e4 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -23,9 +23,9 @@ app: title: '#backstage' backend: - # Used for enabling authorization, secret is shared by all backend plugins + # Used for enabling authentication, secret is shared by all backend plugins # See authenticate-api-requests.md in the contrib docs for information on the format - # authorization: + # auth: # secret: ${BACKEND_SECRET} baseUrl: http://localhost:7007 listen: diff --git a/packages/backend-common/config.d.ts b/packages/backend-common/config.d.ts index ceb9706ca9..66b54d1ebb 100644 --- a/packages/backend-common/config.d.ts +++ b/packages/backend-common/config.d.ts @@ -21,7 +21,7 @@ export interface Config { backend: { /** Backend configuration for when request authentication is enabled */ - authorization?: { + auth?: { /** * Secret shared by all backends for generating tokens * Format is base64 24-bit key diff --git a/packages/backend-common/src/tokens/ServerTokenManager.test.ts b/packages/backend-common/src/tokens/ServerTokenManager.test.ts index 6fe920939b..d027833cb1 100644 --- a/packages/backend-common/src/tokens/ServerTokenManager.test.ts +++ b/packages/backend-common/src/tokens/ServerTokenManager.test.ts @@ -18,7 +18,7 @@ import { ServerTokenManager } from './ServerTokenManager'; const emptyConfig = new ConfigReader({}); const configWithSecret = new ConfigReader({ - backend: { authorization: { secret: 'a-secret-key' } }, + backend: { auth: { secret: 'a-secret-key' } }, }); describe('ServerTokenManager', () => { diff --git a/packages/backend-common/src/tokens/ServerTokenManager.ts b/packages/backend-common/src/tokens/ServerTokenManager.ts index fa7e6fac2d..f7fccd30b2 100644 --- a/packages/backend-common/src/tokens/ServerTokenManager.ts +++ b/packages/backend-common/src/tokens/ServerTokenManager.ts @@ -26,7 +26,7 @@ export class ServerTokenManager implements TokenManager { } static fromConfig(config: Config) { - const secret = config.getString('backend.authorization.secret'); + const secret = config.getString('backend.auth.secret'); return new ServerTokenManager(secret); } diff --git a/packages/create-app/templates/default-app/app-config.yaml.hbs b/packages/create-app/templates/default-app/app-config.yaml.hbs index cbe1ef07d4..44bae0ff26 100644 --- a/packages/create-app/templates/default-app/app-config.yaml.hbs +++ b/packages/create-app/templates/default-app/app-config.yaml.hbs @@ -6,9 +6,9 @@ organization: name: My Company backend: - # Used for enabling authorization, secret is shared by all backend plugins + # Used for enabling authentication, secret is shared by all backend plugins # See authenticate-api-requests.md in the contrib docs for information on the format - # authorization: + # auth: # secret: ${BACKEND_SECRET} baseUrl: http://localhost:7007 listen: From f38dff408535dcc010fcc89e02312c343035b04f Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Tue, 23 Nov 2021 14:58:48 +0000 Subject: [PATCH 046/131] backend-common: tests validating interop of multiple token managers Signed-off-by: Mike Lewis --- .../src/tokens/ServerTokenManager.test.ts | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/packages/backend-common/src/tokens/ServerTokenManager.test.ts b/packages/backend-common/src/tokens/ServerTokenManager.test.ts index d027833cb1..6d06c874ea 100644 --- a/packages/backend-common/src/tokens/ServerTokenManager.test.ts +++ b/packages/backend-common/src/tokens/ServerTokenManager.test.ts @@ -54,6 +54,28 @@ describe('ServerTokenManager', () => { expect(isValidServerToken).toBe(false); }); + it('should return true for server tokens created by a different instance using the same secret', async () => { + const tokenManager1 = ServerTokenManager.fromConfig(configWithSecret); + const tokenManager2 = ServerTokenManager.fromConfig(configWithSecret); + + const { token } = await tokenManager1.getServerToken(); + + expect(await tokenManager2.validateServerToken(token)).toBe(true); + }); + + it('should return false for server tokens created by a different instance using a different secret', async () => { + const tokenManager1 = ServerTokenManager.fromConfig( + new ConfigReader({ backend: { auth: { secret: 'a1b2c3' } } }), + ); + const tokenManager2 = ServerTokenManager.fromConfig( + new ConfigReader({ backend: { auth: { secret: 'd4e5f6' } } }), + ); + + const { token } = await tokenManager1.getServerToken(); + + expect(await tokenManager2.validateServerToken(token)).toBe(false); + }); + it('should always return true if using noop TokenManager', async () => { const tokenManager = ServerTokenManager.noop(); const { token } = await tokenManager.getServerToken(); From 8a001f8202f2249a645a7f980b46d653dd075035 Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Tue, 23 Nov 2021 17:16:57 +0000 Subject: [PATCH 047/131] backend-common: TokenManager throws for invalid tokens rather than returning boolean Signed-off-by: Mike Lewis --- docs/tutorials/authenticate-api-requests.md | 5 +- packages/backend-common/api-report.md | 4 +- .../src/tokens/ServerTokenManager.test.ts | 57 +++++++++++-------- .../src/tokens/ServerTokenManager.ts | 9 +-- packages/backend-common/src/tokens/types.ts | 2 +- .../src/search/DefaultCatalogCollator.test.ts | 2 +- .../search/DefaultTechDocsCollator.test.ts | 4 +- 7 files changed, 47 insertions(+), 36 deletions(-) diff --git a/docs/tutorials/authenticate-api-requests.md b/docs/tutorials/authenticate-api-requests.md index 54952272da..ea7ae72a27 100644 --- a/docs/tutorials/authenticate-api-requests.md +++ b/docs/tutorials/authenticate-api-requests.md @@ -95,9 +95,8 @@ async function main() { req.cookies['token']; // Authenticate all requests originating from backends by default - const isValidServerToken = await authEnv.tokenManager.validateServerToken( - token, - ); + const isValidServerToken = + authEnv.tokenManager.validateServerToken(token); if (!isValidServerToken) { req.user = await identity.authenticate(token); } diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md index 01d16b587c..6cd1364285 100644 --- a/packages/backend-common/api-report.md +++ b/packages/backend-common/api-report.md @@ -539,7 +539,7 @@ export class ServerTokenManager implements TokenManager { // (undocumented) static noop(): ServerTokenManager; // (undocumented) - validateServerToken(token: string): Promise; + validateServerToken(token: string): void; } // @public (undocumented) @@ -608,7 +608,7 @@ export interface TokenManager { token: string; }>; // (undocumented) - validateServerToken: (token: string) => Promise; + validateServerToken: (token: string) => void; } // @public diff --git a/packages/backend-common/src/tokens/ServerTokenManager.test.ts b/packages/backend-common/src/tokens/ServerTokenManager.test.ts index 6d06c874ea..82936d8f82 100644 --- a/packages/backend-common/src/tokens/ServerTokenManager.test.ts +++ b/packages/backend-common/src/tokens/ServerTokenManager.test.ts @@ -39,31 +39,29 @@ describe('ServerTokenManager', () => { }); describe('validateServerToken', () => { - it('should return true if token is valid', async () => { + it('should not throw if token is valid', async () => { const tokenManager = ServerTokenManager.fromConfig(configWithSecret); const { token } = await tokenManager.getServerToken(); - const isValidServerToken = await tokenManager.validateServerToken(token); - expect(isValidServerToken).toBe(true); + expect(() => tokenManager.validateServerToken(token)).not.toThrow(); }); - it('should return false if token is invalid', async () => { + it('should throw if token is invalid', () => { const tokenManager = ServerTokenManager.fromConfig(configWithSecret); - const isValidServerToken = await tokenManager.validateServerToken( - 'random-string', - ); - expect(isValidServerToken).toBe(false); + expect(() => + tokenManager.validateServerToken('random-string'), + ).toThrowError(/invalid server token/i); }); - it('should return true for server tokens created by a different instance using the same secret', async () => { + it('should validate server tokens created by a different instance using the same secret', async () => { const tokenManager1 = ServerTokenManager.fromConfig(configWithSecret); const tokenManager2 = ServerTokenManager.fromConfig(configWithSecret); const { token } = await tokenManager1.getServerToken(); - expect(await tokenManager2.validateServerToken(token)).toBe(true); + expect(() => tokenManager2.validateServerToken(token)).not.toThrow(); }); - it('should return false for server tokens created by a different instance using a different secret', async () => { + it('should throw for server tokens created using a different secret', async () => { const tokenManager1 = ServerTokenManager.fromConfig( new ConfigReader({ backend: { auth: { secret: 'a1b2c3' } } }), ); @@ -73,20 +71,33 @@ describe('ServerTokenManager', () => { const { token } = await tokenManager1.getServerToken(); - expect(await tokenManager2.validateServerToken(token)).toBe(false); + expect(() => tokenManager2.validateServerToken(token)).toThrowError( + /invalid server token/i, + ); + }); + }); + + describe('ServerTokenManager.noop', () => { + let noopTokenManager: ServerTokenManager; + + beforeEach(() => { + noopTokenManager = ServerTokenManager.noop(); }); - it('should always return true if using noop TokenManager', async () => { - const tokenManager = ServerTokenManager.noop(); - const { token } = await tokenManager.getServerToken(); - const isValidServerToken0 = await tokenManager.validateServerToken(token); - const isValidServerToken1 = await tokenManager.validateServerToken( - 'random-string', - ); - const isValidServerToken2 = await tokenManager.validateServerToken(''); - expect(isValidServerToken0).toBe(true); - expect(isValidServerToken1).toBe(true); - expect(isValidServerToken2).toBe(true); + it('should accept tokens it generates', async () => { + const { token } = await noopTokenManager.getServerToken(); + + expect(() => noopTokenManager.validateServerToken(token)).not.toThrow(); + }); + + it('should accept arbitrary strings', async () => { + expect(() => + noopTokenManager.validateServerToken('random-string'), + ).not.toThrow(); + }); + + it('should accept empty strings', async () => { + expect(() => noopTokenManager.validateServerToken('')).not.toThrow(); }); }); }); diff --git a/packages/backend-common/src/tokens/ServerTokenManager.ts b/packages/backend-common/src/tokens/ServerTokenManager.ts index f7fccd30b2..6354162d38 100644 --- a/packages/backend-common/src/tokens/ServerTokenManager.ts +++ b/packages/backend-common/src/tokens/ServerTokenManager.ts @@ -16,6 +16,7 @@ import { JWK, JWT } from 'jose'; import { Config } from '@backstage/config'; +import { AuthenticationError } from '@backstage/errors'; import { TokenManager } from './types'; export class ServerTokenManager implements TokenManager { @@ -46,16 +47,16 @@ export class ServerTokenManager implements TokenManager { return { token: jwt }; } - async validateServerToken(token: string): Promise { + validateServerToken(token: string): void { if (this.key === JWK.None) { - return true; + return; } try { JWT.verify(token, this.key); - return true; + return; } catch (e) { - return false; + throw new AuthenticationError('Invalid server token'); } } } diff --git a/packages/backend-common/src/tokens/types.ts b/packages/backend-common/src/tokens/types.ts index 506e1191ec..65f3a749a4 100644 --- a/packages/backend-common/src/tokens/types.ts +++ b/packages/backend-common/src/tokens/types.ts @@ -16,5 +16,5 @@ export interface TokenManager { getServerToken: () => Promise<{ token: string }>; - validateServerToken: (token: string) => Promise; + validateServerToken: (token: string) => void; } diff --git a/plugins/catalog-backend/src/search/DefaultCatalogCollator.test.ts b/plugins/catalog-backend/src/search/DefaultCatalogCollator.test.ts index 9f42c7de83..ba8cb64f02 100644 --- a/plugins/catalog-backend/src/search/DefaultCatalogCollator.test.ts +++ b/plugins/catalog-backend/src/search/DefaultCatalogCollator.test.ts @@ -68,7 +68,7 @@ describe('DefaultCatalogCollator', () => { }; mockTokenManager = { getServerToken: jest.fn().mockResolvedValue({ token: '' }), - validateServerToken: jest.fn().mockResolvedValue(true), + validateServerToken: jest.fn(), }; collator = new DefaultCatalogCollator({ discovery: mockDiscoveryApi, diff --git a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts index e689cd9f61..ad6f5c3520 100644 --- a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts +++ b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts @@ -100,7 +100,7 @@ describe('DefaultTechDocsCollator with legacyPathCasing configuration', () => { }; mockTokenManager = { getServerToken: jest.fn().mockResolvedValue({ token: '' }), - validateServerToken: jest.fn().mockResolvedValue(true), + validateServerToken: jest.fn(), }; const mockConfig = new ConfigReader({ techdocs: { @@ -166,7 +166,7 @@ describe('DefaultTechDocsCollator', () => { }; mockTokenManager = { getServerToken: jest.fn().mockResolvedValue({ token: '' }), - validateServerToken: jest.fn().mockResolvedValue(true), + validateServerToken: jest.fn(), }; collator = DefaultTechDocsCollator.fromConfig(new ConfigReader({}), { discovery: mockDiscoveryApi, From 905dd952acaa5821a5bd016b71fad04fe10c23f3 Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Tue, 23 Nov 2021 17:49:02 +0000 Subject: [PATCH 048/131] chore: split up backend-to-backend auth changeset to reduce changelog noise Signed-off-by: Mike Lewis --- .changeset/dry-pianos-brush.md | 51 +++++++++++++++++++ .changeset/green-toes-search.md | 28 +++++++++++ .changeset/lemon-moons-stare.md | 5 ++ .changeset/odd-flowers-hope.md | 88 --------------------------------- .changeset/young-bikes-argue.md | 27 ++++++++++ 5 files changed, 111 insertions(+), 88 deletions(-) create mode 100644 .changeset/dry-pianos-brush.md create mode 100644 .changeset/green-toes-search.md create mode 100644 .changeset/lemon-moons-stare.md delete mode 100644 .changeset/odd-flowers-hope.md create mode 100644 .changeset/young-bikes-argue.md diff --git a/.changeset/dry-pianos-brush.md b/.changeset/dry-pianos-brush.md new file mode 100644 index 0000000000..c749962a83 --- /dev/null +++ b/.changeset/dry-pianos-brush.md @@ -0,0 +1,51 @@ +--- +'@backstage/create-app': patch +--- + +Incorporate usage of the tokenManager into the backend created using `create-app`. + +In existing backends, update the `PluginEnvironment` to include a `tokenManager`: + +```diff +// packages/backend/src/types.ts + +... +import { + ... ++ TokenManager, +} from '@backstage/backend-common'; + +export type PluginEnvironment = { + ... ++ tokenManager: TokenManager; +}; +``` + +Then, create a `ServerTokenManager`. This can either be a `noop` that requires no secret and validates all requests by default, or one that uses a secret from your `app-config.yaml` to generate and validate tokens. + +```diff +// packages/backend/src/index.ts + +... +import { + ... ++ ServerTokenManager, +} from '@backstage/backend-common'; +... + +function makeCreateEnv(config: Config) { + ... + // CHOOSE ONE + // TokenManager not requiring a secret ++ const tokenManager = ServerTokenManager.noop(); + // OR TokenManager requiring a secret ++ const tokenManager = ServerTokenManager.fromConfig(config); + + ... + return (plugin: string): PluginEnvironment => { + ... +- return { logger, cache, database, config, reader, discovery }; ++ return { logger, cache, database, config, reader, discovery, tokenManager }; + }; +} +``` diff --git a/.changeset/green-toes-search.md b/.changeset/green-toes-search.md new file mode 100644 index 0000000000..2bdba7e31a --- /dev/null +++ b/.changeset/green-toes-search.md @@ -0,0 +1,28 @@ +--- +'@backstage/plugin-techdocs-backend': minor +--- + +**BREAKING** `DefaultTechDocsCollator` has a new required option `tokenManager`. See the create-app changelog for how to create a `tokenManager` and add it to the `PluginEnvironment`. It can then be passed to the collator in `createPlugin`: + +```diff +// packages/backend/src/plugins/search.ts + +... +export default async function createPlugin({ + ... ++ tokenManager, +}: PluginEnvironment) { + ... + + indexBuilder.addCollator({ + defaultRefreshIntervalSeconds: 600, + collator: DefaultTechDocsCollator.fromConfig(config, { + discovery, + logger, ++ tokenManager, + }), + }); + + ... +} +``` diff --git a/.changeset/lemon-moons-stare.md b/.changeset/lemon-moons-stare.md new file mode 100644 index 0000000000..4b7818d403 --- /dev/null +++ b/.changeset/lemon-moons-stare.md @@ -0,0 +1,5 @@ +--- +'@backstage/backend-common': patch +--- + +Create a `TokenManager` interface and `ServerTokenManager` implementation to generate and validate server tokens for authenticated backend-to-backend API requests. diff --git a/.changeset/odd-flowers-hope.md b/.changeset/odd-flowers-hope.md deleted file mode 100644 index b07af54680..0000000000 --- a/.changeset/odd-flowers-hope.md +++ /dev/null @@ -1,88 +0,0 @@ ---- -'@backstage/backend-common': patch -'@backstage/create-app': patch -'@backstage/plugin-catalog-backend': minor -'@backstage/plugin-techdocs-backend': minor ---- - -Create a TokenManager interface and ServerTokenManager implementation to generate and validate server tokens for authenticated backend-to-backend API requests. Incorporate usage of the tokenManager into the backend created using `create-app`. - -**BREAKING** `DefaultCatalogCollator` and `DefaultTechDocsCollator` now require a `tokenManager` to be passed in the `options` argument. - -In existing backends, update the `PluginEnvironment` to include a `tokenManager`: - -```diff -// packages/backend/src/types.ts - -... -import { - ... -+ TokenManager, -} from '@backstage/backend-common'; - -export type PluginEnvironment = { - ... -+ tokenManager: TokenManager; -}; -``` - -Then, create a `ServerTokenManager`. This can either be a `noop` that requires no secret and validates all requests by default, or one that uses a secret from your `app-config.yaml` to generate and validate tokens. - -```diff -// packages/backend/src/index.ts - -... -import { - ... -+ ServerTokenManager, -} from '@backstage/backend-common'; -... - -function makeCreateEnv(config: Config) { - ... - // CHOOSE ONE - // TokenManager not requiring a secret -+ const tokenManager = ServerTokenManager.noop(); - // OR TokenManager requiring a secret -+ const tokenManager = ServerTokenManager.fromConfig(config); - - ... - return (plugin: string): PluginEnvironment => { - ... -- return { logger, cache, database, config, reader, discovery }; -+ return { logger, cache, database, config, reader, discovery, tokenManager }; - }; -} -``` - -Finally, pull the `tokenManager` from the search plugin environment and pass it to both collators. - -```diff -// packages/backend/src/plugins/search.ts - -... -export default async function createPlugin({ - ... -+ tokenManager, -}: PluginEnvironment) { - ... - indexBuilder.addCollator({ - defaultRefreshIntervalSeconds: 600, - collator: DefaultCatalogCollator.fromConfig(config, { - discovery, -+ tokenManager, - }), - }); - - indexBuilder.addCollator({ - defaultRefreshIntervalSeconds: 600, - collator: DefaultTechDocsCollator.fromConfig(config, { - discovery, - logger, -+ tokenManager, - }), - }); - - ... -} -``` diff --git a/.changeset/young-bikes-argue.md b/.changeset/young-bikes-argue.md new file mode 100644 index 0000000000..a9f09cd12b --- /dev/null +++ b/.changeset/young-bikes-argue.md @@ -0,0 +1,27 @@ +--- +'@backstage/plugin-catalog-backend': minor +--- + +**BREAKING** `DefaultCatalogCollator` has a new required option `tokenManager`. See the create-app changelog for how to create a `tokenManager` and add it to the `PluginEnvironment`. It can then be passed to the collator in `createPlugin`: + +```diff +// packages/backend/src/plugins/search.ts + +... +export default async function createPlugin({ + ... ++ tokenManager, +}: PluginEnvironment) { + ... + + indexBuilder.addCollator({ + defaultRefreshIntervalSeconds: 600, + collator: DefaultCatalogCollator.fromConfig(config, { + discovery, ++ tokenManager, + }), + }); + + ... +} +``` From 4b6de2f87272423d5814655df2f248bbf13a597e Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Tue, 23 Nov 2021 18:12:28 +0000 Subject: [PATCH 049/131] backend-common: remove 'Server' from TokenManager method names Signed-off-by: Mike Lewis --- docs/tutorials/authenticate-api-requests.md | 5 ++- packages/backend-common/api-report.md | 8 ++--- .../src/tokens/ServerTokenManager.test.ts | 34 +++++++++---------- .../src/tokens/ServerTokenManager.ts | 4 +-- packages/backend-common/src/tokens/types.ts | 4 +-- .../src/search/DefaultCatalogCollator.test.ts | 4 +-- .../src/search/DefaultCatalogCollator.ts | 2 +- .../search/DefaultTechDocsCollator.test.ts | 8 ++--- .../src/search/DefaultTechDocsCollator.ts | 2 +- 9 files changed, 35 insertions(+), 36 deletions(-) diff --git a/docs/tutorials/authenticate-api-requests.md b/docs/tutorials/authenticate-api-requests.md index ea7ae72a27..33d7d2cb31 100644 --- a/docs/tutorials/authenticate-api-requests.md +++ b/docs/tutorials/authenticate-api-requests.md @@ -95,8 +95,7 @@ async function main() { req.cookies['token']; // Authenticate all requests originating from backends by default - const isValidServerToken = - authEnv.tokenManager.validateServerToken(token); + const isValidServerToken = authEnv.tokenManager.validateToken(token); if (!isValidServerToken) { req.user = await identity.authenticate(token); } @@ -327,5 +326,5 @@ function makeCreateEnv(config: Config) { With this `tokenManager`, you can then generate a server token for requests: ``` -const { token } = await this.tokenManager.getServerToken(); +const { token } = await this.tokenManager.getToken(); ``` diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md index 6cd1364285..4a89f9f8a7 100644 --- a/packages/backend-common/api-report.md +++ b/packages/backend-common/api-report.md @@ -533,13 +533,13 @@ export class ServerTokenManager implements TokenManager { // (undocumented) static fromConfig(config: Config): ServerTokenManager; // (undocumented) - getServerToken(): Promise<{ + getToken(): Promise<{ token: string; }>; // (undocumented) static noop(): ServerTokenManager; // (undocumented) - validateServerToken(token: string): void; + validateToken(token: string): void; } // @public (undocumented) @@ -604,11 +604,11 @@ export interface StatusCheckHandlerOptions { // @public (undocumented) export interface TokenManager { // (undocumented) - getServerToken: () => Promise<{ + getToken: () => Promise<{ token: string; }>; // (undocumented) - validateServerToken: (token: string) => void; + validateToken: (token: string) => void; } // @public diff --git a/packages/backend-common/src/tokens/ServerTokenManager.test.ts b/packages/backend-common/src/tokens/ServerTokenManager.test.ts index 82936d8f82..20e18e9080 100644 --- a/packages/backend-common/src/tokens/ServerTokenManager.test.ts +++ b/packages/backend-common/src/tokens/ServerTokenManager.test.ts @@ -26,39 +26,39 @@ describe('ServerTokenManager', () => { expect(() => ServerTokenManager.fromConfig(emptyConfig)).toThrowError(); }); - describe('getServerToken', () => { + describe('getToken', () => { it('should return a token if secret in config exists', async () => { const tokenManager = ServerTokenManager.fromConfig(configWithSecret); - expect((await tokenManager.getServerToken()).token).toBeDefined(); + expect((await tokenManager.getToken()).token).toBeDefined(); }); it('should return an empty string if using a noop TokenManager', async () => { const tokenManager = ServerTokenManager.noop(); - expect((await tokenManager.getServerToken()).token).toBe(''); + expect((await tokenManager.getToken()).token).toBe(''); }); }); - describe('validateServerToken', () => { + describe('validateToken', () => { it('should not throw if token is valid', async () => { const tokenManager = ServerTokenManager.fromConfig(configWithSecret); - const { token } = await tokenManager.getServerToken(); - expect(() => tokenManager.validateServerToken(token)).not.toThrow(); + const { token } = await tokenManager.getToken(); + expect(() => tokenManager.validateToken(token)).not.toThrow(); }); it('should throw if token is invalid', () => { const tokenManager = ServerTokenManager.fromConfig(configWithSecret); - expect(() => - tokenManager.validateServerToken('random-string'), - ).toThrowError(/invalid server token/i); + expect(() => tokenManager.validateToken('random-string')).toThrowError( + /invalid server token/i, + ); }); it('should validate server tokens created by a different instance using the same secret', async () => { const tokenManager1 = ServerTokenManager.fromConfig(configWithSecret); const tokenManager2 = ServerTokenManager.fromConfig(configWithSecret); - const { token } = await tokenManager1.getServerToken(); + const { token } = await tokenManager1.getToken(); - expect(() => tokenManager2.validateServerToken(token)).not.toThrow(); + expect(() => tokenManager2.validateToken(token)).not.toThrow(); }); it('should throw for server tokens created using a different secret', async () => { @@ -69,9 +69,9 @@ describe('ServerTokenManager', () => { new ConfigReader({ backend: { auth: { secret: 'd4e5f6' } } }), ); - const { token } = await tokenManager1.getServerToken(); + const { token } = await tokenManager1.getToken(); - expect(() => tokenManager2.validateServerToken(token)).toThrowError( + expect(() => tokenManager2.validateToken(token)).toThrowError( /invalid server token/i, ); }); @@ -85,19 +85,19 @@ describe('ServerTokenManager', () => { }); it('should accept tokens it generates', async () => { - const { token } = await noopTokenManager.getServerToken(); + const { token } = await noopTokenManager.getToken(); - expect(() => noopTokenManager.validateServerToken(token)).not.toThrow(); + expect(() => noopTokenManager.validateToken(token)).not.toThrow(); }); it('should accept arbitrary strings', async () => { expect(() => - noopTokenManager.validateServerToken('random-string'), + noopTokenManager.validateToken('random-string'), ).not.toThrow(); }); it('should accept empty strings', async () => { - expect(() => noopTokenManager.validateServerToken('')).not.toThrow(); + expect(() => noopTokenManager.validateToken('')).not.toThrow(); }); }); }); diff --git a/packages/backend-common/src/tokens/ServerTokenManager.ts b/packages/backend-common/src/tokens/ServerTokenManager.ts index 6354162d38..5ce2262c88 100644 --- a/packages/backend-common/src/tokens/ServerTokenManager.ts +++ b/packages/backend-common/src/tokens/ServerTokenManager.ts @@ -36,7 +36,7 @@ export class ServerTokenManager implements TokenManager { this.key = secret ? JWK.asKey({ kty: 'oct', k: secret }) : JWK.None; } - async getServerToken(): Promise<{ token: string }> { + async getToken(): Promise<{ token: string }> { if (this.key === JWK.None) { return { token: '' }; } @@ -47,7 +47,7 @@ export class ServerTokenManager implements TokenManager { return { token: jwt }; } - validateServerToken(token: string): void { + validateToken(token: string): void { if (this.key === JWK.None) { return; } diff --git a/packages/backend-common/src/tokens/types.ts b/packages/backend-common/src/tokens/types.ts index 65f3a749a4..39b650b3a3 100644 --- a/packages/backend-common/src/tokens/types.ts +++ b/packages/backend-common/src/tokens/types.ts @@ -15,6 +15,6 @@ */ export interface TokenManager { - getServerToken: () => Promise<{ token: string }>; - validateServerToken: (token: string) => void; + getToken: () => Promise<{ token: string }>; + validateToken: (token: string) => void; } diff --git a/plugins/catalog-backend/src/search/DefaultCatalogCollator.test.ts b/plugins/catalog-backend/src/search/DefaultCatalogCollator.test.ts index ba8cb64f02..1415341795 100644 --- a/plugins/catalog-backend/src/search/DefaultCatalogCollator.test.ts +++ b/plugins/catalog-backend/src/search/DefaultCatalogCollator.test.ts @@ -67,8 +67,8 @@ describe('DefaultCatalogCollator', () => { getExternalBaseUrl: jest.fn(), }; mockTokenManager = { - getServerToken: jest.fn().mockResolvedValue({ token: '' }), - validateServerToken: jest.fn(), + getToken: jest.fn().mockResolvedValue({ token: '' }), + validateToken: jest.fn(), }; collator = new DefaultCatalogCollator({ discovery: mockDiscoveryApi, diff --git a/plugins/catalog-backend/src/search/DefaultCatalogCollator.ts b/plugins/catalog-backend/src/search/DefaultCatalogCollator.ts index 6bef785ac8..4c6342c6c6 100644 --- a/plugins/catalog-backend/src/search/DefaultCatalogCollator.ts +++ b/plugins/catalog-backend/src/search/DefaultCatalogCollator.ts @@ -108,7 +108,7 @@ export class DefaultCatalogCollator implements DocumentCollator { } async execute() { - const { token } = await this.tokenManager.getServerToken(); + const { token } = await this.tokenManager.getToken(); const response = await this.catalogClient.getEntities( { filter: this.filter, diff --git a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts index ad6f5c3520..416b040d91 100644 --- a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts +++ b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts @@ -99,8 +99,8 @@ describe('DefaultTechDocsCollator with legacyPathCasing configuration', () => { getExternalBaseUrl: jest.fn(), }; mockTokenManager = { - getServerToken: jest.fn().mockResolvedValue({ token: '' }), - validateServerToken: jest.fn(), + getToken: jest.fn().mockResolvedValue({ token: '' }), + validateToken: jest.fn(), }; const mockConfig = new ConfigReader({ techdocs: { @@ -165,8 +165,8 @@ describe('DefaultTechDocsCollator', () => { getExternalBaseUrl: jest.fn(), }; mockTokenManager = { - getServerToken: jest.fn().mockResolvedValue({ token: '' }), - validateServerToken: jest.fn(), + getToken: jest.fn().mockResolvedValue({ token: '' }), + validateToken: jest.fn(), }; collator = DefaultTechDocsCollator.fromConfig(new ConfigReader({}), { discovery: mockDiscoveryApi, diff --git a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts index 094fb8b049..f7da18c38a 100644 --- a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts +++ b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts @@ -94,7 +94,7 @@ export class DefaultTechDocsCollator implements DocumentCollator { async execute() { const limit = pLimit(this.parallelismLimit); const techDocsBaseUrl = await this.discovery.getBaseUrl('techdocs'); - const { token } = await this.tokenManager.getServerToken(); + const { token } = await this.tokenManager.getToken(); const entities = await this.catalogClient.getEntities( { fields: [ From 40ea710c145293f0e049d4c0a893ce6e2f26d49c Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Tue, 23 Nov 2021 18:22:53 +0000 Subject: [PATCH 050/131] backend-common: add api doc comments Signed-off-by: Mike Lewis --- packages/backend-common/api-report.md | 8 ++------ packages/backend-common/src/tokens/ServerTokenManager.ts | 6 ++++++ packages/backend-common/src/tokens/types.ts | 5 +++++ 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md index 4a89f9f8a7..33d41a5929 100644 --- a/packages/backend-common/api-report.md +++ b/packages/backend-common/api-report.md @@ -526,9 +526,7 @@ export type SearchResponseFile = { content(): Promise; }; -// Warning: (ae-missing-release-tag) "ServerTokenManager" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @public export class ServerTokenManager implements TokenManager { // (undocumented) static fromConfig(config: Config): ServerTokenManager; @@ -599,9 +597,7 @@ export interface StatusCheckHandlerOptions { statusCheck?: StatusCheck; } -// Warning: (ae-missing-release-tag) "TokenManager" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @public export interface TokenManager { // (undocumented) getToken: () => Promise<{ diff --git a/packages/backend-common/src/tokens/ServerTokenManager.ts b/packages/backend-common/src/tokens/ServerTokenManager.ts index 5ce2262c88..e4afc2997e 100644 --- a/packages/backend-common/src/tokens/ServerTokenManager.ts +++ b/packages/backend-common/src/tokens/ServerTokenManager.ts @@ -19,6 +19,12 @@ import { Config } from '@backstage/config'; import { AuthenticationError } from '@backstage/errors'; import { TokenManager } from './types'; +/** + * Creates and validates tokens for use during backend-to-backend + * authentication. + * + * @public + */ export class ServerTokenManager implements TokenManager { private key: JWK.OctKey | JWK.NoneKey; diff --git a/packages/backend-common/src/tokens/types.ts b/packages/backend-common/src/tokens/types.ts index 39b650b3a3..ede582de26 100644 --- a/packages/backend-common/src/tokens/types.ts +++ b/packages/backend-common/src/tokens/types.ts @@ -14,6 +14,11 @@ * limitations under the License. */ +/** + * Interface for creating and validating tokens. + * + * @public + */ export interface TokenManager { getToken: () => Promise<{ token: string }>; validateToken: (token: string) => void; From f028746410a472a63f45c9270e997f450bd23893 Mon Sep 17 00:00:00 2001 From: Tim Hansen Date: Wed, 17 Nov 2021 14:58:09 -0700 Subject: [PATCH 051/131] Add permission-backend plugin Signed-off-by: Tim Hansen --- plugins/permission-backend/.eslintrc.js | 3 + plugins/permission-backend/README.md | 6 + plugins/permission-backend/api-report.md | 29 +++ plugins/permission-backend/package.json | 44 +++++ plugins/permission-backend/src/index.ts | 21 +++ plugins/permission-backend/src/run.ts | 33 ++++ .../permission-backend/src/service/index.ts | 17 ++ .../src/service/router.test.ts | 103 ++++++++++ .../permission-backend/src/service/router.ts | 177 ++++++++++++++++++ .../src/service/standaloneServer.ts | 59 ++++++ plugins/permission-backend/src/setupTests.ts | 17 ++ 11 files changed, 509 insertions(+) create mode 100644 plugins/permission-backend/.eslintrc.js create mode 100644 plugins/permission-backend/README.md create mode 100644 plugins/permission-backend/api-report.md create mode 100644 plugins/permission-backend/package.json create mode 100644 plugins/permission-backend/src/index.ts create mode 100644 plugins/permission-backend/src/run.ts create mode 100644 plugins/permission-backend/src/service/index.ts create mode 100644 plugins/permission-backend/src/service/router.test.ts create mode 100644 plugins/permission-backend/src/service/router.ts create mode 100644 plugins/permission-backend/src/service/standaloneServer.ts create mode 100644 plugins/permission-backend/src/setupTests.ts diff --git a/plugins/permission-backend/.eslintrc.js b/plugins/permission-backend/.eslintrc.js new file mode 100644 index 0000000000..16a033dbc6 --- /dev/null +++ b/plugins/permission-backend/.eslintrc.js @@ -0,0 +1,3 @@ +module.exports = { + extends: [require.resolve('@backstage/cli/config/eslint.backend')], +}; diff --git a/plugins/permission-backend/README.md b/plugins/permission-backend/README.md new file mode 100644 index 0000000000..59fe1730ba --- /dev/null +++ b/plugins/permission-backend/README.md @@ -0,0 +1,6 @@ +# @backstage/plugin-permission-backend + +> NOTE: THIS PACKAGE IS EXPERIMENTAL, HERE BE DRAGONS + +Backend for Backstage authorization and permissions. For more information, see +the [authorization PRFC](https://github.com/backstage/backstage/pull/7761). diff --git a/plugins/permission-backend/api-report.md b/plugins/permission-backend/api-report.md new file mode 100644 index 0000000000..5b7801d0ab --- /dev/null +++ b/plugins/permission-backend/api-report.md @@ -0,0 +1,29 @@ +## API Report File for "@backstage/plugin-permission-backend" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts +import { Config } from '@backstage/config'; +import express from 'express'; +import { Logger as Logger_2 } from 'winston'; +import { PermissionPolicy } from '@backstage/plugin-permission-node'; + +// Warning: (ae-missing-release-tag) "createRouter" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export function createRouter(options: RouterOptions): Promise; + +// Warning: (ae-missing-release-tag) "RouterOptions" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface RouterOptions { + // (undocumented) + config: Config; + // (undocumented) + logger: Logger_2; + // (undocumented) + policy: PermissionPolicy; +} + +// (No @packageDocumentation comment for this package) +``` diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json new file mode 100644 index 0000000000..f6aac0b3ab --- /dev/null +++ b/plugins/permission-backend/package.json @@ -0,0 +1,44 @@ +{ + "name": "@backstage/plugin-permission-backend", + "version": "0.1.0", + "main": "src/index.ts", + "types": "src/index.ts", + "license": "Apache-2.0", + "publishConfig": { + "access": "public", + "main": "dist/index.cjs.js", + "types": "dist/index.d.ts" + }, + "scripts": { + "start": "backstage-cli backend:dev", + "build": "backstage-cli backend:build", + "lint": "backstage-cli lint", + "test": "backstage-cli test", + "prepack": "backstage-cli prepack", + "postpack": "backstage-cli postpack", + "clean": "backstage-cli clean" + }, + "dependencies": { + "@backstage/backend-common": "^0.9.9", + "@backstage/config": "^0.1.11", + "@backstage/errors": "^0.1.4", + "@backstage/plugin-auth-backend": "^0.4.7", + "@backstage/plugin-permission-common": "^0.1.0", + "@backstage/plugin-permission-node": "^0.1.0", + "@types/express": "*", + "cross-fetch": "^3.0.6", + "express": "^4.17.1", + "express-promise-router": "^4.1.0", + "winston": "^3.2.1", + "yn": "^4.0.0" + }, + "devDependencies": { + "@backstage/cli": "^0.8.2", + "@types/supertest": "^2.0.8", + "supertest": "^4.0.2", + "msw": "^0.35.0" + }, + "files": [ + "dist" + ] +} diff --git a/plugins/permission-backend/src/index.ts b/plugins/permission-backend/src/index.ts new file mode 100644 index 0000000000..877b9070c3 --- /dev/null +++ b/plugins/permission-backend/src/index.ts @@ -0,0 +1,21 @@ +/* + * Copyright 2021 The Backstage Authors + * + * 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 + * + * http://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. + */ + +/** + * Backend for Backstage authorization and permissions. + * @packageDocumentation + */ +export * from './service'; diff --git a/plugins/permission-backend/src/run.ts b/plugins/permission-backend/src/run.ts new file mode 100644 index 0000000000..addfdfd6d7 --- /dev/null +++ b/plugins/permission-backend/src/run.ts @@ -0,0 +1,33 @@ +/* + * Copyright 2021 The Backstage Authors + * + * 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 + * + * http://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 { getRootLogger } from '@backstage/backend-common'; +import yn from 'yn'; +import { startStandaloneServer } from './service/standaloneServer'; + +const port = process.env.PLUGIN_PORT ? Number(process.env.PLUGIN_PORT) : 7000; +const enableCors = yn(process.env.PLUGIN_CORS, { default: false }); +const logger = getRootLogger(); + +startStandaloneServer({ port, enableCors, logger }).catch(err => { + logger.error(err); + process.exit(1); +}); + +process.on('SIGINT', () => { + logger.info('CTRL+C pressed; exiting.'); + process.exit(0); +}); diff --git a/plugins/permission-backend/src/service/index.ts b/plugins/permission-backend/src/service/index.ts new file mode 100644 index 0000000000..b26567988c --- /dev/null +++ b/plugins/permission-backend/src/service/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2021 The Backstage Authors + * + * 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 + * + * http://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. + */ + +export * from './router'; diff --git a/plugins/permission-backend/src/service/router.test.ts b/plugins/permission-backend/src/service/router.test.ts new file mode 100644 index 0000000000..f0fc889e8b --- /dev/null +++ b/plugins/permission-backend/src/service/router.test.ts @@ -0,0 +1,103 @@ +/* + * Copyright 2021 The Backstage Authors + * + * 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 + * + * http://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 express from 'express'; +import request from 'supertest'; +import { getVoidLogger } from '@backstage/backend-common'; +import { ConfigReader } from '@backstage/config'; +import { IdentityClient } from '@backstage/plugin-auth-backend'; +import { + AuthorizeResult, + Permission, +} from '@backstage/plugin-permission-common'; +import { PermissionPolicy } from '@backstage/plugin-permission-node'; + +import { createRouter } from './router'; + +const identityApi: Partial = { + authenticate: jest.fn().mockImplementation(_ => ({ id: 'test-user' })), +}; + +const policy: PermissionPolicy = { + handle: jest.fn().mockImplementation((_req, identity) => { + if (identity) { + return { result: AuthorizeResult.ALLOW }; + } + return { result: AuthorizeResult.DENY }; + }), +}; + +const permission: Permission = { + name: 'test.permission', + attributes: { action: 'read' }, +}; + +describe('createRouter', () => { + let app: express.Express; + + beforeAll(async () => { + const router = await createRouter({ + logger: getVoidLogger(), + config: new ConfigReader({ + backend: { + baseUrl: 'http://localhost', + listen: { port: 7007 }, + }, + }), + policy, + identity: identityApi as IdentityClient, + }); + app = express().use(router); + }); + + describe('GET /health', () => { + it('returns ok', async () => { + const response = await request(app).get('/health'); + + expect(response.status).toEqual(200); + expect(response.body).toEqual({ status: 'ok' }); + }); + }); + + describe('POST /authorize', () => { + it('calls the permission policy', async () => { + const response = await request(app) + .post('/authorize') + .send([{ id: 123, permission }]); + + expect(response.status).toEqual(200); + expect(policy.handle).toHaveBeenCalledWith({ permission }, undefined); + expect(response.body).toEqual([ + { id: 123, result: AuthorizeResult.DENY }, + ]); + }); + + it('resolves identity from the Authorization header', async () => { + const token = 'token'; + const response = await request(app) + .post('/authorize') + .auth(token, { type: 'bearer' }) + .send([{ id: 123, permission }]); + + expect(response.status).toEqual(200); + expect(identityApi.authenticate).toHaveBeenCalledWith('token'); + expect(policy.handle).toHaveBeenCalledWith( + { permission }, + { id: 'test-user' }, + ); + }); + }); +}); diff --git a/plugins/permission-backend/src/service/router.ts b/plugins/permission-backend/src/service/router.ts new file mode 100644 index 0000000000..2019d13d2a --- /dev/null +++ b/plugins/permission-backend/src/service/router.ts @@ -0,0 +1,177 @@ +/* + * Copyright 2021 The Backstage Authors + * + * 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 + * + * http://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 { + errorHandler, + SingleHostDiscovery, + PluginEndpointDiscovery, +} from '@backstage/backend-common'; +import fetch from 'cross-fetch'; +import express, { Request, Response } from 'express'; +import Router from 'express-promise-router'; +import { Logger } from 'winston'; +import { + BackstageIdentity, + IdentityClient, +} from '@backstage/plugin-auth-backend'; +import { Config } from '@backstage/config'; +import { ConflictError, ResponseError } from '@backstage/errors'; +import { + AuthorizeResult, + AuthorizeResponse, + AuthorizeRequest, + Identified, + PermissionCondition, + PermissionCriteria, +} from '@backstage/plugin-permission-common'; +import { + ApplyConditionsRequest, + PermissionPolicy, +} from '@backstage/plugin-permission-node'; + +export interface RouterOptions { + logger: Logger; + config: Config; + policy: PermissionPolicy; + identity?: IdentityClient; +} + +// TODO(permission-backend): probably move this to a separate client +const applyConditions = async ( + resourceRef: string, + conditions: { + pluginId: string; + resourceType: string; + conditions: PermissionCriteria; + }, + discoveryApi: PluginEndpointDiscovery, + authHeader?: string, +): Promise<{ result: AuthorizeResult.ALLOW | AuthorizeResult.DENY }> => { + const endpoint = `${await discoveryApi.getBaseUrl( + conditions.pluginId, + )}/permissions/apply-conditions`; + + const request: ApplyConditionsRequest = { + resourceRef, + resourceType: conditions.resourceType, + conditions: conditions.conditions, + }; + + const response = await fetch(endpoint, { + method: 'POST', + body: JSON.stringify(request), + headers: { + ...(authHeader ? { authorization: authHeader } : {}), + 'content-type': 'application/json', + }, + }); + + if (!response.ok) { + throw await ResponseError.fromResponse(response); + } + + // TODO(permission-backend): validate response + return await response.json(); +}; + +const handleRequest = async ( + { id, resourceRef, ...request }: Identified, + user: BackstageIdentity | undefined, + policy: PermissionPolicy, + discoveryApi: PluginEndpointDiscovery, + authHeader?: string, +): Promise> => { + const response = await policy.handle(request, user); + + if (response.result === AuthorizeResult.CONDITIONAL) { + // Sanity check that any resource provided matches the one expected by the permission + if (request.permission.resourceType !== response.conditions.resourceType) { + throw new ConflictError( + `Invalid resource conditions returned from permission policy for permission ${request.permission.name}`, + ); + } + + if (resourceRef) { + return { + id, + ...(await applyConditions( + resourceRef, + response.conditions, + discoveryApi, + authHeader, + )), + }; + } + + return { + id, + result: AuthorizeResult.CONDITIONAL, + conditions: response.conditions.conditions, + }; + } + + return { id, ...response }; +}; + +export async function createRouter( + options: RouterOptions, +): Promise { + const { config, policy } = options; + const discovery = SingleHostDiscovery.fromConfig(config); + const identity = + options.identity ?? + new IdentityClient({ + discovery, + issuer: await discovery.getExternalBaseUrl('auth'), + }); + + const router = Router(); + router.use(express.json()); + + router.get('/health', (_, response) => { + response.send({ status: 'ok' }); + }); + + router.post( + '/authorize', + async ( + req: Request[]>, + res: Response[]>, + ) => { + const token = IdentityClient.getBearerToken(req.header('authorization')); + const user = token ? await identity.authenticate(token) : undefined; + + const body: Identified[] = req.body; + + res.json( + await Promise.all( + body.map(request => + handleRequest( + request, + user, + policy, + discovery, + req.header('authorization'), + ), + ), + ), + ); + }, + ); + + router.use(errorHandler()); + return router; +} diff --git a/plugins/permission-backend/src/service/standaloneServer.ts b/plugins/permission-backend/src/service/standaloneServer.ts new file mode 100644 index 0000000000..6218d22d59 --- /dev/null +++ b/plugins/permission-backend/src/service/standaloneServer.ts @@ -0,0 +1,59 @@ +/* + * Copyright 2021 The Backstage Authors + * + * 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 + * + * http://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 { + createServiceBuilder, + loadBackendConfig, +} from '@backstage/backend-common'; +import { Server } from 'http'; +import { Logger } from 'winston'; +import { createRouter } from './router'; +import { AuthorizeResult } from '@backstage/plugin-permission-common'; + +export interface ServerOptions { + port: number; + enableCors: boolean; + logger: Logger; +} + +export async function startStandaloneServer( + options: ServerOptions, +): Promise { + const logger = options.logger.child({ service: 'permission-backend' }); + const config = await loadBackendConfig({ logger, argv: process.argv }); + logger.debug('Starting application server...'); + const router = await createRouter({ + logger, + config, + policy: { + handle: () => Promise.resolve({ result: AuthorizeResult.ALLOW }), + }, + }); + + let service = createServiceBuilder(module) + .setPort(options.port) + .addRouter('/permission', router); + if (options.enableCors) { + service = service.enableCors({ origin: 'http://localhost:3000' }); + } + + return await service.start().catch(err => { + logger.error(err); + process.exit(1); + }); +} + +module.hot?.accept(); diff --git a/plugins/permission-backend/src/setupTests.ts b/plugins/permission-backend/src/setupTests.ts new file mode 100644 index 0000000000..a330613afb --- /dev/null +++ b/plugins/permission-backend/src/setupTests.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2021 The Backstage Authors + * + * 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 + * + * http://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. + */ + +export {}; From 806778d58e2d79d272ccf847a0a3d08cc19daa25 Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Mon, 22 Nov 2021 11:25:48 +0000 Subject: [PATCH 052/131] permission-backend: fixup api-report Signed-off-by: Mike Lewis --- plugins/permission-backend/api-report.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/plugins/permission-backend/api-report.md b/plugins/permission-backend/api-report.md index 5b7801d0ab..66e0dabd3b 100644 --- a/plugins/permission-backend/api-report.md +++ b/plugins/permission-backend/api-report.md @@ -5,6 +5,7 @@ ```ts import { Config } from '@backstage/config'; import express from 'express'; +import { IdentityClient } from '@backstage/plugin-auth-backend'; import { Logger as Logger_2 } from 'winston'; import { PermissionPolicy } from '@backstage/plugin-permission-node'; @@ -20,10 +21,10 @@ export interface RouterOptions { // (undocumented) config: Config; // (undocumented) + identity?: IdentityClient; + // (undocumented) logger: Logger_2; // (undocumented) policy: PermissionPolicy; } - -// (No @packageDocumentation comment for this package) ``` From be1f89d3835b4b072df9a734c34f101a791a7572 Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Mon, 22 Nov 2021 11:22:24 +0000 Subject: [PATCH 053/131] permission-backend: extract AllowAllPermissionPolicy from standaloneServer in permission-backend Signed-off-by: Mike Lewis --- .../service/AllowAllPermissionPolicy.test.ts | 35 +++++++++++++++++++ .../src/service/AllowAllPermissionPolicy.ts | 34 ++++++++++++++++++ .../src/service/standaloneServer.ts | 6 ++-- 3 files changed, 71 insertions(+), 4 deletions(-) create mode 100644 plugins/permission-backend/src/service/AllowAllPermissionPolicy.test.ts create mode 100644 plugins/permission-backend/src/service/AllowAllPermissionPolicy.ts diff --git a/plugins/permission-backend/src/service/AllowAllPermissionPolicy.test.ts b/plugins/permission-backend/src/service/AllowAllPermissionPolicy.test.ts new file mode 100644 index 0000000000..5ebebd04e5 --- /dev/null +++ b/plugins/permission-backend/src/service/AllowAllPermissionPolicy.test.ts @@ -0,0 +1,35 @@ +/* + * Copyright 2021 The Backstage Authors + * + * 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 + * + * http://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 { + AuthorizeResult, + Permission, +} from '@backstage/plugin-permission-common'; +import { AllowAllPermissionPolicy } from './AllowAllPermissionPolicy'; + +describe('AllowAllPermissionPolicy', () => { + const policy = new AllowAllPermissionPolicy(); + + it('returns ALLOW when no identity is passed', async () => { + await expect( + policy.handle({ + permission: { + name: 'any.permission', + } as Permission, + }), + ).resolves.toEqual({ result: AuthorizeResult.ALLOW }); + }); +}); diff --git a/plugins/permission-backend/src/service/AllowAllPermissionPolicy.ts b/plugins/permission-backend/src/service/AllowAllPermissionPolicy.ts new file mode 100644 index 0000000000..bb39d4a334 --- /dev/null +++ b/plugins/permission-backend/src/service/AllowAllPermissionPolicy.ts @@ -0,0 +1,34 @@ +/* + * Copyright 2021 The Backstage Authors + * + * 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 + * + * http://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 { BackstageIdentity } from '@backstage/plugin-auth-backend'; +import { AuthorizeResult } from '@backstage/plugin-permission-common'; +import { + PermissionPolicy, + PolicyAuthorizeRequest, + PolicyResult, +} from '@backstage/plugin-permission-node'; + +export class AllowAllPermissionPolicy implements PermissionPolicy { + async handle( + _request: PolicyAuthorizeRequest, + _user?: BackstageIdentity, + ): Promise { + return { + result: AuthorizeResult.ALLOW, + }; + } +} diff --git a/plugins/permission-backend/src/service/standaloneServer.ts b/plugins/permission-backend/src/service/standaloneServer.ts index 6218d22d59..87c62c6234 100644 --- a/plugins/permission-backend/src/service/standaloneServer.ts +++ b/plugins/permission-backend/src/service/standaloneServer.ts @@ -20,8 +20,8 @@ import { } from '@backstage/backend-common'; import { Server } from 'http'; import { Logger } from 'winston'; +import { AllowAllPermissionPolicy } from './AllowAllPermissionPolicy'; import { createRouter } from './router'; -import { AuthorizeResult } from '@backstage/plugin-permission-common'; export interface ServerOptions { port: number; @@ -38,9 +38,7 @@ export async function startStandaloneServer( const router = await createRouter({ logger, config, - policy: { - handle: () => Promise.resolve({ result: AuthorizeResult.ALLOW }), - }, + policy: new AllowAllPermissionPolicy(), }); let service = createServiceBuilder(module) From 4ca6802b97d3e4dee8582c3eadbb219d3d426fec Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Mon, 22 Nov 2021 11:27:23 +0000 Subject: [PATCH 054/131] permission-backend: bump @backstage/cli Signed-off-by: Mike Lewis --- plugins/permission-backend/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index f6aac0b3ab..6e711ee4b2 100644 --- a/plugins/permission-backend/package.json +++ b/plugins/permission-backend/package.json @@ -33,7 +33,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.8.2", + "@backstage/cli": "^0.9.0", "@types/supertest": "^2.0.8", "supertest": "^4.0.2", "msw": "^0.35.0" From 671bf72ed6690e852538ff302fced84310d256f2 Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Mon, 22 Nov 2021 12:02:49 +0000 Subject: [PATCH 055/131] permission-backend: fix initial test suite Signed-off-by: Mike Lewis --- plugins/permission-backend/api-report.md | 3 -- .../src/service/router.test.ts | 34 ++++++++++++++----- .../permission-backend/src/service/router.ts | 11 +++--- 3 files changed, 30 insertions(+), 18 deletions(-) diff --git a/plugins/permission-backend/api-report.md b/plugins/permission-backend/api-report.md index 66e0dabd3b..1450382881 100644 --- a/plugins/permission-backend/api-report.md +++ b/plugins/permission-backend/api-report.md @@ -5,7 +5,6 @@ ```ts import { Config } from '@backstage/config'; import express from 'express'; -import { IdentityClient } from '@backstage/plugin-auth-backend'; import { Logger as Logger_2 } from 'winston'; import { PermissionPolicy } from '@backstage/plugin-permission-node'; @@ -21,8 +20,6 @@ export interface RouterOptions { // (undocumented) config: Config; // (undocumented) - identity?: IdentityClient; - // (undocumented) logger: Logger_2; // (undocumented) policy: PermissionPolicy; diff --git a/plugins/permission-backend/src/service/router.test.ts b/plugins/permission-backend/src/service/router.test.ts index f0fc889e8b..73b816f752 100644 --- a/plugins/permission-backend/src/service/router.test.ts +++ b/plugins/permission-backend/src/service/router.test.ts @@ -18,7 +18,6 @@ import express from 'express'; import request from 'supertest'; import { getVoidLogger } from '@backstage/backend-common'; import { ConfigReader } from '@backstage/config'; -import { IdentityClient } from '@backstage/plugin-auth-backend'; import { AuthorizeResult, Permission, @@ -27,9 +26,26 @@ import { PermissionPolicy } from '@backstage/plugin-permission-node'; import { createRouter } from './router'; -const identityApi: Partial = { - authenticate: jest.fn().mockImplementation(_ => ({ id: 'test-user' })), -}; +jest.mock('@backstage/plugin-auth-backend', () => { + class MockIdentityClient { + authenticate = jest.fn(token => + Promise.resolve( + token + ? { + id: 'test-user', + token, + } + : undefined, + ), + ); + + static getBearerToken = jest.fn(authHeader => + authHeader ? `` : undefined, + ); + } + + return { IdentityClient: MockIdentityClient }; +}); const policy: PermissionPolicy = { handle: jest.fn().mockImplementation((_req, identity) => { @@ -58,8 +74,8 @@ describe('createRouter', () => { }, }), policy, - identity: identityApi as IdentityClient, }); + app = express().use(router); }); @@ -86,18 +102,20 @@ describe('createRouter', () => { }); it('resolves identity from the Authorization header', async () => { - const token = 'token'; + const token = 'test-token'; const response = await request(app) .post('/authorize') .auth(token, { type: 'bearer' }) .send([{ id: 123, permission }]); expect(response.status).toEqual(200); - expect(identityApi.authenticate).toHaveBeenCalledWith('token'); expect(policy.handle).toHaveBeenCalledWith( { permission }, - { id: 'test-user' }, + { id: 'test-user', token: '' }, ); + expect(response.body).toEqual([ + { id: 123, result: AuthorizeResult.ALLOW }, + ]); }); }); }); diff --git a/plugins/permission-backend/src/service/router.ts b/plugins/permission-backend/src/service/router.ts index 2019d13d2a..e52f3d14ee 100644 --- a/plugins/permission-backend/src/service/router.ts +++ b/plugins/permission-backend/src/service/router.ts @@ -46,7 +46,6 @@ export interface RouterOptions { logger: Logger; config: Config; policy: PermissionPolicy; - identity?: IdentityClient; } // TODO(permission-backend): probably move this to a separate client @@ -131,12 +130,10 @@ export async function createRouter( ): Promise { const { config, policy } = options; const discovery = SingleHostDiscovery.fromConfig(config); - const identity = - options.identity ?? - new IdentityClient({ - discovery, - issuer: await discovery.getExternalBaseUrl('auth'), - }); + const identity = new IdentityClient({ + discovery, + issuer: await discovery.getExternalBaseUrl('auth'), + }); const router = Router(); router.use(express.json()); From e9b6b7bf89a430265a890d351b19d43c67b01bdd Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Mon, 22 Nov 2021 13:19:48 +0000 Subject: [PATCH 056/131] permission-backend: extract client for calling other plugins to apply conditions Also adds response validation Signed-off-by: Mike Lewis --- plugins/permission-backend/package.json | 3 +- .../PermissionIntegrationClient.test.ts | 173 ++++++++++++++++++ .../service/PermissionIntegrationClient.ts | 76 ++++++++ .../permission-backend/src/service/router.ts | 60 +----- 4 files changed, 261 insertions(+), 51 deletions(-) create mode 100644 plugins/permission-backend/src/service/PermissionIntegrationClient.test.ts create mode 100644 plugins/permission-backend/src/service/PermissionIntegrationClient.ts diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index 6e711ee4b2..dae7fdb5af 100644 --- a/plugins/permission-backend/package.json +++ b/plugins/permission-backend/package.json @@ -30,7 +30,8 @@ "express": "^4.17.1", "express-promise-router": "^4.1.0", "winston": "^3.2.1", - "yn": "^4.0.0" + "yn": "^4.0.0", + "zod": "^3.11.6" }, "devDependencies": { "@backstage/cli": "^0.9.0", diff --git a/plugins/permission-backend/src/service/PermissionIntegrationClient.test.ts b/plugins/permission-backend/src/service/PermissionIntegrationClient.test.ts new file mode 100644 index 0000000000..d062bccb33 --- /dev/null +++ b/plugins/permission-backend/src/service/PermissionIntegrationClient.test.ts @@ -0,0 +1,173 @@ +/* + * Copyright 2021 The Backstage Authors + * + * 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 + * + * http://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 { RestContext, rest } from 'msw'; +import { setupServer } from 'msw/node'; +import { PluginEndpointDiscovery } from '@backstage/backend-common'; +import { AuthorizeResult } from '@backstage/plugin-permission-common'; +import { PermissionIntegrationClient } from './PermissionIntegrationClient'; + +const server = setupServer(); + +const mockBaseUrl = 'http://backstage:9191/i-am-a-mock-base'; +const discovery: PluginEndpointDiscovery = { + async getBaseUrl() { + return mockBaseUrl; + }, + async getExternalBaseUrl() { + throw new Error('Not implemented.'); + }, +}; + +const client: PermissionIntegrationClient = new PermissionIntegrationClient({ + discovery, +}); + +const mockConditions = { + not: { + allOf: [ + { rule: 'RULE_1', params: [] }, + { rule: 'RULE_2', params: ['abc'] }, + ], + }, +}; + +describe('PermissionIntegrationClient', () => { + beforeAll(() => server.listen({ onUnhandledRequest: 'error' })); + afterAll(() => server.close()); + afterEach(() => server.resetHandlers()); + + describe('applyConditions', () => { + const mockApplyConditionsHandler = jest.fn( + (_req, res, { json }: RestContext) => { + return res(json({ result: AuthorizeResult.ALLOW })); + }, + ); + + beforeEach(() => { + server.use( + rest.post( + `${mockBaseUrl}/permissions/apply-conditions`, + mockApplyConditionsHandler, + ), + ); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should make a POST request to the correct endpoint', async () => { + await client.applyConditions('testResource1', { + pluginId: 'test-plugin', + resourceType: 'test-resource', + conditions: mockConditions, + }); + + expect(mockApplyConditionsHandler).toHaveBeenCalled(); + }); + + it('should include a request body', async () => { + await client.applyConditions('testResource1', { + pluginId: 'test-plugin', + resourceType: 'test-resource', + conditions: mockConditions, + }); + + expect(mockApplyConditionsHandler).toHaveBeenCalledWith( + expect.objectContaining({ + body: { + resourceRef: 'testResource1', + resourceType: 'test-resource', + conditions: mockConditions, + }, + }), + expect.anything(), + expect.anything(), + ); + }); + + it('should return the response from the fetch request', async () => { + const response = await client.applyConditions('testResource1', { + pluginId: 'test-plugin', + resourceType: 'test-resource', + conditions: mockConditions, + }); + + expect(response).toEqual( + expect.objectContaining({ result: AuthorizeResult.ALLOW }), + ); + }); + + it('should not include authorization headers if no token is supplied', async () => { + await client.applyConditions('testResource1', { + pluginId: 'test-plugin', + resourceType: 'test-resource', + conditions: mockConditions, + }); + + const request = mockApplyConditionsHandler.mock.calls[0][0]; + expect(request.headers.has('authorization')).toEqual(false); + }); + + it('should include correctly-constructed authorization header if token is supplied', async () => { + await client.applyConditions( + 'testResource1', + { + pluginId: 'test-plugin', + resourceType: 'test-resource', + conditions: mockConditions, + }, + 'Bearer fake-token', + ); + + const request = mockApplyConditionsHandler.mock.calls[0][0]; + expect(request.headers.get('authorization')).toEqual('Bearer fake-token'); + }); + + it('should forward response errors', async () => { + mockApplyConditionsHandler.mockImplementationOnce( + (_req, res, { status }: RestContext) => { + return res(status(401)); + }, + ); + + await expect( + client.applyConditions('testResource1', { + pluginId: 'test-plugin', + resourceType: 'test-resource', + conditions: mockConditions, + }), + ).rejects.toThrowError(/request failed with 401/i); + }); + + it('should reject invalid responses', async () => { + mockApplyConditionsHandler.mockImplementationOnce( + (_req, res, { json }: RestContext) => { + return res(json({ outcome: AuthorizeResult.ALLOW })); + }, + ); + + await expect( + client.applyConditions('testResource1', { + pluginId: 'test-plugin', + resourceType: 'test-resource', + conditions: mockConditions, + }), + ).rejects.toThrowError(/invalid input/i); + }); + }); +}); diff --git a/plugins/permission-backend/src/service/PermissionIntegrationClient.ts b/plugins/permission-backend/src/service/PermissionIntegrationClient.ts new file mode 100644 index 0000000000..dd0aad1215 --- /dev/null +++ b/plugins/permission-backend/src/service/PermissionIntegrationClient.ts @@ -0,0 +1,76 @@ +/* + * Copyright 2021 The Backstage Authors + * + * 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 + * + * http://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 fetch from 'cross-fetch'; +import { z } from 'zod'; +import { ResponseError } from '@backstage/errors'; +import { PluginEndpointDiscovery } from '@backstage/backend-common'; +import { + AuthorizeResult, + PermissionCondition, + PermissionCriteria, +} from '@backstage/plugin-permission-common'; +import { + ApplyConditionsRequest, + ApplyConditionsResponse, +} from '@backstage/plugin-permission-node'; + +const responseSchema = z.object({ + result: z.literal(AuthorizeResult.ALLOW).or(z.literal(AuthorizeResult.DENY)), +}); + +export class PermissionIntegrationClient { + private readonly discovery: PluginEndpointDiscovery; + + constructor(options: { discovery: PluginEndpointDiscovery }) { + this.discovery = options.discovery; + } + + async applyConditions( + resourceRef: string, + conditions: { + pluginId: string; + resourceType: string; + conditions: PermissionCriteria; + }, + authHeader?: string, + ): Promise { + const endpoint = `${await this.discovery.getBaseUrl( + conditions.pluginId, + )}/permissions/apply-conditions`; + + const request: ApplyConditionsRequest = { + resourceRef, + resourceType: conditions.resourceType, + conditions: conditions.conditions, + }; + + const response = await fetch(endpoint, { + method: 'POST', + body: JSON.stringify(request), + headers: { + ...(authHeader ? { authorization: authHeader } : {}), + 'content-type': 'application/json', + }, + }); + + if (!response.ok) { + throw await ResponseError.fromResponse(response); + } + + return responseSchema.parse(await response.json()); + } +} diff --git a/plugins/permission-backend/src/service/router.ts b/plugins/permission-backend/src/service/router.ts index e52f3d14ee..9114b8fee2 100644 --- a/plugins/permission-backend/src/service/router.ts +++ b/plugins/permission-backend/src/service/router.ts @@ -19,7 +19,6 @@ import { SingleHostDiscovery, PluginEndpointDiscovery, } from '@backstage/backend-common'; -import fetch from 'cross-fetch'; import express, { Request, Response } from 'express'; import Router from 'express-promise-router'; import { Logger } from 'winston'; @@ -28,19 +27,15 @@ import { IdentityClient, } from '@backstage/plugin-auth-backend'; import { Config } from '@backstage/config'; -import { ConflictError, ResponseError } from '@backstage/errors'; +import { ConflictError } from '@backstage/errors'; import { AuthorizeResult, AuthorizeResponse, AuthorizeRequest, Identified, - PermissionCondition, - PermissionCriteria, } from '@backstage/plugin-permission-common'; -import { - ApplyConditionsRequest, - PermissionPolicy, -} from '@backstage/plugin-permission-node'; +import { PermissionPolicy } from '@backstage/plugin-permission-node'; +import { PermissionIntegrationClient } from './PermissionIntegrationClient'; export interface RouterOptions { logger: Logger; @@ -48,49 +43,11 @@ export interface RouterOptions { policy: PermissionPolicy; } -// TODO(permission-backend): probably move this to a separate client -const applyConditions = async ( - resourceRef: string, - conditions: { - pluginId: string; - resourceType: string; - conditions: PermissionCriteria; - }, - discoveryApi: PluginEndpointDiscovery, - authHeader?: string, -): Promise<{ result: AuthorizeResult.ALLOW | AuthorizeResult.DENY }> => { - const endpoint = `${await discoveryApi.getBaseUrl( - conditions.pluginId, - )}/permissions/apply-conditions`; - - const request: ApplyConditionsRequest = { - resourceRef, - resourceType: conditions.resourceType, - conditions: conditions.conditions, - }; - - const response = await fetch(endpoint, { - method: 'POST', - body: JSON.stringify(request), - headers: { - ...(authHeader ? { authorization: authHeader } : {}), - 'content-type': 'application/json', - }, - }); - - if (!response.ok) { - throw await ResponseError.fromResponse(response); - } - - // TODO(permission-backend): validate response - return await response.json(); -}; - const handleRequest = async ( { id, resourceRef, ...request }: Identified, user: BackstageIdentity | undefined, policy: PermissionPolicy, - discoveryApi: PluginEndpointDiscovery, + permissionIntegrationClient: PermissionIntegrationClient, authHeader?: string, ): Promise> => { const response = await policy.handle(request, user); @@ -106,10 +63,9 @@ const handleRequest = async ( if (resourceRef) { return { id, - ...(await applyConditions( + ...(await permissionIntegrationClient.applyConditions( resourceRef, response.conditions, - discoveryApi, authHeader, )), }; @@ -135,6 +91,10 @@ export async function createRouter( issuer: await discovery.getExternalBaseUrl('auth'), }); + const permissionIntegrationClient = new PermissionIntegrationClient({ + discovery, + }); + const router = Router(); router.use(express.json()); @@ -160,7 +120,7 @@ export async function createRouter( request, user, policy, - discovery, + permissionIntegrationClient, req.header('authorization'), ), ), From 0ce2bc41295ea473e16cc8a66e5940b767f0e5cb Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Mon, 22 Nov 2021 13:23:14 +0000 Subject: [PATCH 057/131] permission-backend: remove manual construction of service discovery We shouldn't be constructing a service discovery implementation inside the router, since it removes the ability to provide a different discovery mechanism. Signed-off-by: Mike Lewis --- plugins/permission-backend/api-report.md | 4 ++-- plugins/permission-backend/src/service/router.test.ts | 11 ++++------- plugins/permission-backend/src/service/router.ts | 8 +++----- .../src/service/standaloneServer.ts | 4 +++- 4 files changed, 12 insertions(+), 15 deletions(-) diff --git a/plugins/permission-backend/api-report.md b/plugins/permission-backend/api-report.md index 1450382881..4fb0928b0b 100644 --- a/plugins/permission-backend/api-report.md +++ b/plugins/permission-backend/api-report.md @@ -3,10 +3,10 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts -import { Config } from '@backstage/config'; import express from 'express'; import { Logger as Logger_2 } from 'winston'; import { PermissionPolicy } from '@backstage/plugin-permission-node'; +import { PluginEndpointDiscovery } from '@backstage/backend-common'; // Warning: (ae-missing-release-tag) "createRouter" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -18,7 +18,7 @@ export function createRouter(options: RouterOptions): Promise; // @public (undocumented) export interface RouterOptions { // (undocumented) - config: Config; + discovery: PluginEndpointDiscovery; // (undocumented) logger: Logger_2; // (undocumented) diff --git a/plugins/permission-backend/src/service/router.test.ts b/plugins/permission-backend/src/service/router.test.ts index 73b816f752..13261125c8 100644 --- a/plugins/permission-backend/src/service/router.test.ts +++ b/plugins/permission-backend/src/service/router.test.ts @@ -17,7 +17,6 @@ import express from 'express'; import request from 'supertest'; import { getVoidLogger } from '@backstage/backend-common'; -import { ConfigReader } from '@backstage/config'; import { AuthorizeResult, Permission, @@ -67,12 +66,10 @@ describe('createRouter', () => { beforeAll(async () => { const router = await createRouter({ logger: getVoidLogger(), - config: new ConfigReader({ - backend: { - baseUrl: 'http://localhost', - listen: { port: 7007 }, - }, - }), + discovery: { + getBaseUrl: jest.fn(), + getExternalBaseUrl: jest.fn(), + }, policy, }); diff --git a/plugins/permission-backend/src/service/router.ts b/plugins/permission-backend/src/service/router.ts index 9114b8fee2..744982e2e3 100644 --- a/plugins/permission-backend/src/service/router.ts +++ b/plugins/permission-backend/src/service/router.ts @@ -16,7 +16,6 @@ import { errorHandler, - SingleHostDiscovery, PluginEndpointDiscovery, } from '@backstage/backend-common'; import express, { Request, Response } from 'express'; @@ -26,7 +25,6 @@ import { BackstageIdentity, IdentityClient, } from '@backstage/plugin-auth-backend'; -import { Config } from '@backstage/config'; import { ConflictError } from '@backstage/errors'; import { AuthorizeResult, @@ -39,7 +37,7 @@ import { PermissionIntegrationClient } from './PermissionIntegrationClient'; export interface RouterOptions { logger: Logger; - config: Config; + discovery: PluginEndpointDiscovery; policy: PermissionPolicy; } @@ -84,8 +82,8 @@ const handleRequest = async ( export async function createRouter( options: RouterOptions, ): Promise { - const { config, policy } = options; - const discovery = SingleHostDiscovery.fromConfig(config); + const { policy, discovery } = options; + const identity = new IdentityClient({ discovery, issuer: await discovery.getExternalBaseUrl('auth'), diff --git a/plugins/permission-backend/src/service/standaloneServer.ts b/plugins/permission-backend/src/service/standaloneServer.ts index 87c62c6234..a2478ac57b 100644 --- a/plugins/permission-backend/src/service/standaloneServer.ts +++ b/plugins/permission-backend/src/service/standaloneServer.ts @@ -17,6 +17,7 @@ import { createServiceBuilder, loadBackendConfig, + SingleHostDiscovery, } from '@backstage/backend-common'; import { Server } from 'http'; import { Logger } from 'winston'; @@ -34,10 +35,11 @@ export async function startStandaloneServer( ): Promise { const logger = options.logger.child({ service: 'permission-backend' }); const config = await loadBackendConfig({ logger, argv: process.argv }); + const discovery = SingleHostDiscovery.fromConfig(config); logger.debug('Starting application server...'); const router = await createRouter({ logger, - config, + discovery, policy: new AllowAllPermissionPolicy(), }); From 6de1e719d4bffad8e56fff03a12bfe5609575e87 Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Mon, 22 Nov 2021 15:13:27 +0000 Subject: [PATCH 058/131] permission-backend: api docs Signed-off-by: Mike Lewis --- plugins/permission-backend/api-report.md | 8 ++------ plugins/permission-backend/src/service/router.ts | 12 ++++++++++++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/plugins/permission-backend/api-report.md b/plugins/permission-backend/api-report.md index 4fb0928b0b..7f82913e18 100644 --- a/plugins/permission-backend/api-report.md +++ b/plugins/permission-backend/api-report.md @@ -8,14 +8,10 @@ import { Logger as Logger_2 } from 'winston'; import { PermissionPolicy } from '@backstage/plugin-permission-node'; import { PluginEndpointDiscovery } from '@backstage/backend-common'; -// Warning: (ae-missing-release-tag) "createRouter" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @public export function createRouter(options: RouterOptions): Promise; -// Warning: (ae-missing-release-tag) "RouterOptions" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// -// @public (undocumented) +// @public export interface RouterOptions { // (undocumented) discovery: PluginEndpointDiscovery; diff --git a/plugins/permission-backend/src/service/router.ts b/plugins/permission-backend/src/service/router.ts index 744982e2e3..9110295f77 100644 --- a/plugins/permission-backend/src/service/router.ts +++ b/plugins/permission-backend/src/service/router.ts @@ -35,6 +35,12 @@ import { import { PermissionPolicy } from '@backstage/plugin-permission-node'; import { PermissionIntegrationClient } from './PermissionIntegrationClient'; +/** + * Options required when constructing a new {@link express#Router} using + * {@link createRouter}. + * + * @public + */ export interface RouterOptions { logger: Logger; discovery: PluginEndpointDiscovery; @@ -79,6 +85,12 @@ const handleRequest = async ( return { id, ...response }; }; +/** + * Creates a new {@link express#Router} which provides the backend API + * for the permission system. + * + * @public + */ export async function createRouter( options: RouterOptions, ): Promise { From cd77cbd48f487374fbfad985ecdd920b65b35e40 Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Mon, 22 Nov 2021 15:20:59 +0000 Subject: [PATCH 059/131] permission-backend: clean up PermissionIntegrationClient applyConditions signature Signed-off-by: Mike Lewis --- .../PermissionIntegrationClient.test.ts | 20 ++++++++++++------- .../service/PermissionIntegrationClient.ts | 15 +++++++++----- .../permission-backend/src/service/router.ts | 6 ++++-- 3 files changed, 27 insertions(+), 14 deletions(-) diff --git a/plugins/permission-backend/src/service/PermissionIntegrationClient.test.ts b/plugins/permission-backend/src/service/PermissionIntegrationClient.test.ts index d062bccb33..325ee7c21c 100644 --- a/plugins/permission-backend/src/service/PermissionIntegrationClient.test.ts +++ b/plugins/permission-backend/src/service/PermissionIntegrationClient.test.ts @@ -71,8 +71,9 @@ describe('PermissionIntegrationClient', () => { }); it('should make a POST request to the correct endpoint', async () => { - await client.applyConditions('testResource1', { + await client.applyConditions({ pluginId: 'test-plugin', + resourceRef: 'testResource1', resourceType: 'test-resource', conditions: mockConditions, }); @@ -81,8 +82,9 @@ describe('PermissionIntegrationClient', () => { }); it('should include a request body', async () => { - await client.applyConditions('testResource1', { + await client.applyConditions({ pluginId: 'test-plugin', + resourceRef: 'testResource1', resourceType: 'test-resource', conditions: mockConditions, }); @@ -101,8 +103,9 @@ describe('PermissionIntegrationClient', () => { }); it('should return the response from the fetch request', async () => { - const response = await client.applyConditions('testResource1', { + const response = await client.applyConditions({ pluginId: 'test-plugin', + resourceRef: 'testResource1', resourceType: 'test-resource', conditions: mockConditions, }); @@ -113,8 +116,9 @@ describe('PermissionIntegrationClient', () => { }); it('should not include authorization headers if no token is supplied', async () => { - await client.applyConditions('testResource1', { + await client.applyConditions({ pluginId: 'test-plugin', + resourceRef: 'testResource1', resourceType: 'test-resource', conditions: mockConditions, }); @@ -125,9 +129,9 @@ describe('PermissionIntegrationClient', () => { it('should include correctly-constructed authorization header if token is supplied', async () => { await client.applyConditions( - 'testResource1', { pluginId: 'test-plugin', + resourceRef: 'testResource1', resourceType: 'test-resource', conditions: mockConditions, }, @@ -146,8 +150,9 @@ describe('PermissionIntegrationClient', () => { ); await expect( - client.applyConditions('testResource1', { + client.applyConditions({ pluginId: 'test-plugin', + resourceRef: 'testResource1', resourceType: 'test-resource', conditions: mockConditions, }), @@ -162,8 +167,9 @@ describe('PermissionIntegrationClient', () => { ); await expect( - client.applyConditions('testResource1', { + client.applyConditions({ pluginId: 'test-plugin', + resourceRef: 'testResource1', resourceType: 'test-resource', conditions: mockConditions, }), diff --git a/plugins/permission-backend/src/service/PermissionIntegrationClient.ts b/plugins/permission-backend/src/service/PermissionIntegrationClient.ts index dd0aad1215..0076edd05f 100644 --- a/plugins/permission-backend/src/service/PermissionIntegrationClient.ts +++ b/plugins/permission-backend/src/service/PermissionIntegrationClient.ts @@ -40,8 +40,13 @@ export class PermissionIntegrationClient { } async applyConditions( - resourceRef: string, - conditions: { + { + pluginId, + resourceRef, + resourceType, + conditions, + }: { + resourceRef: string; pluginId: string; resourceType: string; conditions: PermissionCriteria; @@ -49,13 +54,13 @@ export class PermissionIntegrationClient { authHeader?: string, ): Promise { const endpoint = `${await this.discovery.getBaseUrl( - conditions.pluginId, + pluginId, )}/permissions/apply-conditions`; const request: ApplyConditionsRequest = { resourceRef, - resourceType: conditions.resourceType, - conditions: conditions.conditions, + resourceType, + conditions, }; const response = await fetch(endpoint, { diff --git a/plugins/permission-backend/src/service/router.ts b/plugins/permission-backend/src/service/router.ts index 9110295f77..e5a12c5987 100644 --- a/plugins/permission-backend/src/service/router.ts +++ b/plugins/permission-backend/src/service/router.ts @@ -68,8 +68,10 @@ const handleRequest = async ( return { id, ...(await permissionIntegrationClient.applyConditions( - resourceRef, - response.conditions, + { + resourceRef, + ...response.conditions, + }, authHeader, )), }; From 7f4a77a884a70ece7862015c073819580e1d584b Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Mon, 22 Nov 2021 15:35:46 +0000 Subject: [PATCH 060/131] permission-backend: add todo Signed-off-by: Mike Lewis --- plugins/permission-backend/src/service/router.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/plugins/permission-backend/src/service/router.ts b/plugins/permission-backend/src/service/router.ts index e5a12c5987..05b28f2ea1 100644 --- a/plugins/permission-backend/src/service/router.ts +++ b/plugins/permission-backend/src/service/router.ts @@ -80,6 +80,9 @@ const handleRequest = async ( return { id, result: AuthorizeResult.CONDITIONAL, + // TODO(mtlewis): this .conditions.conditions situation is a bit awkward. I think it's + // worth exploring a bit of reorganization of the ConditionalPolicyResult type so that + // the naming of property chains like this makes a bit more sense. conditions: response.conditions.conditions, }; } From 2335e0a01f6fce9aaff9733c8bf9ef86124f24f0 Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Mon, 22 Nov 2021 15:38:36 +0000 Subject: [PATCH 061/131] permission-backend: update default port for standalone server Signed-off-by: Mike Lewis --- plugins/permission-backend/src/run.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/permission-backend/src/run.ts b/plugins/permission-backend/src/run.ts index addfdfd6d7..53d4e4334a 100644 --- a/plugins/permission-backend/src/run.ts +++ b/plugins/permission-backend/src/run.ts @@ -18,7 +18,7 @@ import { getRootLogger } from '@backstage/backend-common'; import yn from 'yn'; import { startStandaloneServer } from './service/standaloneServer'; -const port = process.env.PLUGIN_PORT ? Number(process.env.PLUGIN_PORT) : 7000; +const port = process.env.PLUGIN_PORT ? Number(process.env.PLUGIN_PORT) : 7007; const enableCors = yn(process.env.PLUGIN_CORS, { default: false }); const logger = getRootLogger(); From dbd89112a581053599927864ae3fd1d04db18b5c Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Mon, 22 Nov 2021 17:36:21 +0000 Subject: [PATCH 062/131] permission-backend: add permission-node integration tests Signed-off-by: Mike Lewis --- .../PermissionIntegrationClient.test.ts | 175 ++++++++++++++---- 1 file changed, 144 insertions(+), 31 deletions(-) diff --git a/plugins/permission-backend/src/service/PermissionIntegrationClient.test.ts b/plugins/permission-backend/src/service/PermissionIntegrationClient.test.ts index 325ee7c21c..8e3e85b5af 100644 --- a/plugins/permission-backend/src/service/PermissionIntegrationClient.test.ts +++ b/plugins/permission-backend/src/service/PermissionIntegrationClient.test.ts @@ -14,50 +14,54 @@ * limitations under the License. */ +import { AddressInfo } from 'net'; +import { Server } from 'http'; +import express, { Router } from 'express'; import { RestContext, rest } from 'msw'; -import { setupServer } from 'msw/node'; +import { setupServer, SetupServerApi } from 'msw/node'; import { PluginEndpointDiscovery } from '@backstage/backend-common'; import { AuthorizeResult } from '@backstage/plugin-permission-common'; +import { createPermissionIntegrationRouter } from '@backstage/plugin-permission-node'; import { PermissionIntegrationClient } from './PermissionIntegrationClient'; -const server = setupServer(); - -const mockBaseUrl = 'http://backstage:9191/i-am-a-mock-base'; -const discovery: PluginEndpointDiscovery = { - async getBaseUrl() { - return mockBaseUrl; - }, - async getExternalBaseUrl() { - throw new Error('Not implemented.'); - }, -}; - -const client: PermissionIntegrationClient = new PermissionIntegrationClient({ - discovery, -}); - -const mockConditions = { - not: { - allOf: [ - { rule: 'RULE_1', params: [] }, - { rule: 'RULE_2', params: ['abc'] }, - ], - }, -}; - describe('PermissionIntegrationClient', () => { - beforeAll(() => server.listen({ onUnhandledRequest: 'error' })); - afterAll(() => server.close()); - afterEach(() => server.resetHandlers()); - describe('applyConditions', () => { + let server: SetupServerApi; + + const mockConditions = { + not: { + allOf: [ + { rule: 'RULE_1', params: [] }, + { rule: 'RULE_2', params: ['abc'] }, + ], + }, + }; + const mockApplyConditionsHandler = jest.fn( (_req, res, { json }: RestContext) => { return res(json({ result: AuthorizeResult.ALLOW })); }, ); - beforeEach(() => { + const mockBaseUrl = 'http://backstage:9191/i-am-a-mock-base'; + const discovery: PluginEndpointDiscovery = { + async getBaseUrl() { + return mockBaseUrl; + }, + async getExternalBaseUrl() { + throw new Error('Not implemented.'); + }, + }; + + const client: PermissionIntegrationClient = new PermissionIntegrationClient( + { + discovery, + }, + ); + + beforeAll(() => { + server = setupServer(); + server.listen({ onUnhandledRequest: 'error' }); server.use( rest.post( `${mockBaseUrl}/permissions/apply-conditions`, @@ -66,6 +70,8 @@ describe('PermissionIntegrationClient', () => { ); }); + afterAll(() => server.close()); + afterEach(() => { jest.clearAllMocks(); }); @@ -176,4 +182,111 @@ describe('PermissionIntegrationClient', () => { ).rejects.toThrowError(/invalid input/i); }); }); + + describe('integration with @backstage/plugin-permission-node', () => { + let server: Server; + let client: PermissionIntegrationClient; + + beforeAll(async () => { + const router = Router(); + + router.use( + createPermissionIntegrationRouter({ + resourceType: 'test-resource', + getResource: async resourceRef => ({ id: resourceRef }), + rules: [ + { + name: 'RULE_1', + description: 'Test rule 1', + apply: (_resource: any, input: 'yes' | 'no') => input === 'yes', + toQuery: () => { + throw new Error('Not implemented'); + }, + }, + { + name: 'RULE_2', + description: 'Test rule 2', + apply: (_resource: any, input: 'yes' | 'no') => input === 'yes', + toQuery: () => { + throw new Error('Not implemented'); + }, + }, + ], + }), + ); + + const app = express(); + + app.use('/test-plugin', router); + + await new Promise(resolve => { + server = app.listen(resolve); + }); + + const discovery: PluginEndpointDiscovery = { + async getBaseUrl(pluginId: string) { + const listenPort = (server.address()! as AddressInfo).port; + + return `http://0.0.0.0:${listenPort}/${pluginId}`; + }, + async getExternalBaseUrl() { + throw new Error('Not implemented.'); + }, + }; + + client = new PermissionIntegrationClient({ + discovery, + }); + }); + + afterAll( + async () => + new Promise((resolve, reject) => + server.close(err => (err ? reject(err) : resolve())), + ), + ); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('works for simple conditions', async () => { + await expect( + client.applyConditions({ + pluginId: 'test-plugin', + resourceRef: 'testResource1', + resourceType: 'test-resource', + conditions: { rule: 'RULE_1', params: ['no'] }, + }), + ).resolves.toEqual({ result: AuthorizeResult.DENY }); + }); + + it('works for complex criteria', async () => { + await expect( + client.applyConditions({ + pluginId: 'test-plugin', + resourceRef: 'testResource1', + resourceType: 'test-resource', + conditions: { + allOf: [ + { + allOf: [ + { rule: 'RULE_1', params: ['yes'] }, + { not: { rule: 'RULE_2', params: ['no'] } }, + ], + }, + { + not: { + allOf: [ + { rule: 'RULE_1', params: ['no'] }, + { rule: 'RULE_2', params: ['yes'] }, + ], + }, + }, + ], + }, + }), + ).resolves.toEqual({ result: AuthorizeResult.ALLOW }); + }); + }); }); From f5c32111291dc3fa8941a6ac4e00297f95e2cd12 Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Tue, 23 Nov 2021 13:51:16 +0000 Subject: [PATCH 063/131] permission-backend: 500 when policy returns incorrect resourceType Signed-off-by: Mike Lewis --- plugins/permission-backend/src/service/router.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugins/permission-backend/src/service/router.ts b/plugins/permission-backend/src/service/router.ts index 05b28f2ea1..13f6f7d3d4 100644 --- a/plugins/permission-backend/src/service/router.ts +++ b/plugins/permission-backend/src/service/router.ts @@ -25,7 +25,6 @@ import { BackstageIdentity, IdentityClient, } from '@backstage/plugin-auth-backend'; -import { ConflictError } from '@backstage/errors'; import { AuthorizeResult, AuthorizeResponse, @@ -59,7 +58,7 @@ const handleRequest = async ( if (response.result === AuthorizeResult.CONDITIONAL) { // Sanity check that any resource provided matches the one expected by the permission if (request.permission.resourceType !== response.conditions.resourceType) { - throw new ConflictError( + throw new Error( `Invalid resource conditions returned from permission policy for permission ${request.permission.name}`, ); } From dfd3b25c34383c123c1f02a8fa188300d836afdd Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Wed, 24 Nov 2021 14:32:31 +0000 Subject: [PATCH 064/131] permission-backend: set version to 0.0.0 before initial release Signed-off-by: Mike Lewis --- plugins/permission-backend/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index dae7fdb5af..01255c00c6 100644 --- a/plugins/permission-backend/package.json +++ b/plugins/permission-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-backend", - "version": "0.1.0", + "version": "0.0.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", From 8f835847061941a6aeff4ef8bf2bafb79170e371 Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Wed, 24 Nov 2021 14:35:10 +0000 Subject: [PATCH 065/131] permission-backend: remove standaloneServer, run.ts and AllowAllPermissionPolicy The run.ts / standaloneServer.ts stuff is a hangover and expected to be removed or heavily adjusted in the future, and since it's intended to run from the command line, there's no neat way to pass in a permission policy. As such it's not going to be useful in its current form, so we're removing it for now. Signed-off-by: Mike Lewis --- plugins/permission-backend/src/run.ts | 33 ----------- .../service/AllowAllPermissionPolicy.test.ts | 35 ----------- .../src/service/AllowAllPermissionPolicy.ts | 34 ----------- .../src/service/standaloneServer.ts | 59 ------------------- 4 files changed, 161 deletions(-) delete mode 100644 plugins/permission-backend/src/run.ts delete mode 100644 plugins/permission-backend/src/service/AllowAllPermissionPolicy.test.ts delete mode 100644 plugins/permission-backend/src/service/AllowAllPermissionPolicy.ts delete mode 100644 plugins/permission-backend/src/service/standaloneServer.ts diff --git a/plugins/permission-backend/src/run.ts b/plugins/permission-backend/src/run.ts deleted file mode 100644 index 53d4e4334a..0000000000 --- a/plugins/permission-backend/src/run.ts +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * 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 - * - * http://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 { getRootLogger } from '@backstage/backend-common'; -import yn from 'yn'; -import { startStandaloneServer } from './service/standaloneServer'; - -const port = process.env.PLUGIN_PORT ? Number(process.env.PLUGIN_PORT) : 7007; -const enableCors = yn(process.env.PLUGIN_CORS, { default: false }); -const logger = getRootLogger(); - -startStandaloneServer({ port, enableCors, logger }).catch(err => { - logger.error(err); - process.exit(1); -}); - -process.on('SIGINT', () => { - logger.info('CTRL+C pressed; exiting.'); - process.exit(0); -}); diff --git a/plugins/permission-backend/src/service/AllowAllPermissionPolicy.test.ts b/plugins/permission-backend/src/service/AllowAllPermissionPolicy.test.ts deleted file mode 100644 index 5ebebd04e5..0000000000 --- a/plugins/permission-backend/src/service/AllowAllPermissionPolicy.test.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * 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 - * - * http://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 { - AuthorizeResult, - Permission, -} from '@backstage/plugin-permission-common'; -import { AllowAllPermissionPolicy } from './AllowAllPermissionPolicy'; - -describe('AllowAllPermissionPolicy', () => { - const policy = new AllowAllPermissionPolicy(); - - it('returns ALLOW when no identity is passed', async () => { - await expect( - policy.handle({ - permission: { - name: 'any.permission', - } as Permission, - }), - ).resolves.toEqual({ result: AuthorizeResult.ALLOW }); - }); -}); diff --git a/plugins/permission-backend/src/service/AllowAllPermissionPolicy.ts b/plugins/permission-backend/src/service/AllowAllPermissionPolicy.ts deleted file mode 100644 index bb39d4a334..0000000000 --- a/plugins/permission-backend/src/service/AllowAllPermissionPolicy.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * 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 - * - * http://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 { BackstageIdentity } from '@backstage/plugin-auth-backend'; -import { AuthorizeResult } from '@backstage/plugin-permission-common'; -import { - PermissionPolicy, - PolicyAuthorizeRequest, - PolicyResult, -} from '@backstage/plugin-permission-node'; - -export class AllowAllPermissionPolicy implements PermissionPolicy { - async handle( - _request: PolicyAuthorizeRequest, - _user?: BackstageIdentity, - ): Promise { - return { - result: AuthorizeResult.ALLOW, - }; - } -} diff --git a/plugins/permission-backend/src/service/standaloneServer.ts b/plugins/permission-backend/src/service/standaloneServer.ts deleted file mode 100644 index a2478ac57b..0000000000 --- a/plugins/permission-backend/src/service/standaloneServer.ts +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright 2021 The Backstage Authors - * - * 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 - * - * http://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 { - createServiceBuilder, - loadBackendConfig, - SingleHostDiscovery, -} from '@backstage/backend-common'; -import { Server } from 'http'; -import { Logger } from 'winston'; -import { AllowAllPermissionPolicy } from './AllowAllPermissionPolicy'; -import { createRouter } from './router'; - -export interface ServerOptions { - port: number; - enableCors: boolean; - logger: Logger; -} - -export async function startStandaloneServer( - options: ServerOptions, -): Promise { - const logger = options.logger.child({ service: 'permission-backend' }); - const config = await loadBackendConfig({ logger, argv: process.argv }); - const discovery = SingleHostDiscovery.fromConfig(config); - logger.debug('Starting application server...'); - const router = await createRouter({ - logger, - discovery, - policy: new AllowAllPermissionPolicy(), - }); - - let service = createServiceBuilder(module) - .setPort(options.port) - .addRouter('/permission', router); - if (options.enableCors) { - service = service.enableCors({ origin: 'http://localhost:3000' }); - } - - return await service.start().catch(err => { - logger.error(err); - process.exit(1); - }); -} - -module.hot?.accept(); From b5e43875d5afe3e7feb21a1d1ae1556a975386bc Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Wed, 24 Nov 2021 14:47:51 +0000 Subject: [PATCH 066/131] permission-backend: enumerate exports in service index Signed-off-by: Mike Lewis --- plugins/permission-backend/src/service/index.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/permission-backend/src/service/index.ts b/plugins/permission-backend/src/service/index.ts index b26567988c..3ce8cdbcc4 100644 --- a/plugins/permission-backend/src/service/index.ts +++ b/plugins/permission-backend/src/service/index.ts @@ -14,4 +14,5 @@ * limitations under the License. */ -export * from './router'; +export { createRouter } from './router'; +export type { RouterOptions } from './router'; From 1ff5d10a6251aeb21d163494cae0b5e958054f6a Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Wed, 24 Nov 2021 14:53:20 +0000 Subject: [PATCH 067/131] permission-backend: update dependency on permission-node to 0.0.0 to match unreleased version Signed-off-by: Mike Lewis --- plugins/permission-backend/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index 01255c00c6..c4c9aa11ad 100644 --- a/plugins/permission-backend/package.json +++ b/plugins/permission-backend/package.json @@ -24,7 +24,7 @@ "@backstage/errors": "^0.1.4", "@backstage/plugin-auth-backend": "^0.4.7", "@backstage/plugin-permission-common": "^0.1.0", - "@backstage/plugin-permission-node": "^0.1.0", + "@backstage/plugin-permission-node": "^0.0.0", "@types/express": "*", "cross-fetch": "^3.0.6", "express": "^4.17.1", From 12b0eebfb565990390ca41a864ca288c0b6e5570 Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Wed, 24 Nov 2021 15:18:50 +0000 Subject: [PATCH 068/131] permission-backend: pass in identity client Signed-off-by: Mike Lewis --- plugins/permission-backend/api-report.md | 3 ++ .../src/service/router.test.ts | 36 ++++++++----------- .../permission-backend/src/service/router.ts | 8 ++--- 3 files changed, 19 insertions(+), 28 deletions(-) diff --git a/plugins/permission-backend/api-report.md b/plugins/permission-backend/api-report.md index 7f82913e18..4857c8b044 100644 --- a/plugins/permission-backend/api-report.md +++ b/plugins/permission-backend/api-report.md @@ -4,6 +4,7 @@ ```ts import express from 'express'; +import { IdentityClient } from '@backstage/plugin-auth-backend'; import { Logger as Logger_2 } from 'winston'; import { PermissionPolicy } from '@backstage/plugin-permission-node'; import { PluginEndpointDiscovery } from '@backstage/backend-common'; @@ -16,6 +17,8 @@ export interface RouterOptions { // (undocumented) discovery: PluginEndpointDiscovery; // (undocumented) + identity: IdentityClient; + // (undocumented) logger: Logger_2; // (undocumented) policy: PermissionPolicy; diff --git a/plugins/permission-backend/src/service/router.test.ts b/plugins/permission-backend/src/service/router.test.ts index 13261125c8..29b5245006 100644 --- a/plugins/permission-backend/src/service/router.test.ts +++ b/plugins/permission-backend/src/service/router.test.ts @@ -17,6 +17,7 @@ import express from 'express'; import request from 'supertest'; import { getVoidLogger } from '@backstage/backend-common'; +import { IdentityClient } from '@backstage/plugin-auth-backend'; import { AuthorizeResult, Permission, @@ -25,27 +26,6 @@ import { PermissionPolicy } from '@backstage/plugin-permission-node'; import { createRouter } from './router'; -jest.mock('@backstage/plugin-auth-backend', () => { - class MockIdentityClient { - authenticate = jest.fn(token => - Promise.resolve( - token - ? { - id: 'test-user', - token, - } - : undefined, - ), - ); - - static getBearerToken = jest.fn(authHeader => - authHeader ? `` : undefined, - ); - } - - return { IdentityClient: MockIdentityClient }; -}); - const policy: PermissionPolicy = { handle: jest.fn().mockImplementation((_req, identity) => { if (identity) { @@ -70,6 +50,18 @@ describe('createRouter', () => { getBaseUrl: jest.fn(), getExternalBaseUrl: jest.fn(), }, + identity: { + authenticate: jest.fn(token => { + if (!token) { + throw new Error('No token supplied!'); + } + + return Promise.resolve({ + id: 'test-user', + token, + }); + }), + } as unknown as IdentityClient, policy, }); @@ -108,7 +100,7 @@ describe('createRouter', () => { expect(response.status).toEqual(200); expect(policy.handle).toHaveBeenCalledWith( { permission }, - { id: 'test-user', token: '' }, + { id: 'test-user', token: 'test-token' }, ); expect(response.body).toEqual([ { id: 123, result: AuthorizeResult.ALLOW }, diff --git a/plugins/permission-backend/src/service/router.ts b/plugins/permission-backend/src/service/router.ts index 13f6f7d3d4..0fd72297c5 100644 --- a/plugins/permission-backend/src/service/router.ts +++ b/plugins/permission-backend/src/service/router.ts @@ -44,6 +44,7 @@ export interface RouterOptions { logger: Logger; discovery: PluginEndpointDiscovery; policy: PermissionPolicy; + identity: IdentityClient; } const handleRequest = async ( @@ -98,12 +99,7 @@ const handleRequest = async ( export async function createRouter( options: RouterOptions, ): Promise { - const { policy, discovery } = options; - - const identity = new IdentityClient({ - discovery, - issuer: await discovery.getExternalBaseUrl('auth'), - }); + const { policy, discovery, identity } = options; const permissionIntegrationClient = new PermissionIntegrationClient({ discovery, From da9ecc18e462c4f46161c01f6939a58ca59edbff Mon Sep 17 00:00:00 2001 From: Andrew Tran Date: Wed, 24 Nov 2021 09:24:07 -0600 Subject: [PATCH 069/131] prettier yaml Signed-off-by: Andrew Tran --- .../dice-roller/dice-roller-manifests.yaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/plugins/kubernetes-backend/examples/dice-roller/dice-roller-manifests.yaml b/plugins/kubernetes-backend/examples/dice-roller/dice-roller-manifests.yaml index c02b30dc28..fb71037129 100644 --- a/plugins/kubernetes-backend/examples/dice-roller/dice-roller-manifests.yaml +++ b/plugins/kubernetes-backend/examples/dice-roller/dice-roller-manifests.yaml @@ -208,7 +208,7 @@ metadata: labels: 'backstage.io/kubernetes-id': dice-roller spec: - schedule: "*/1 * * * *" + schedule: '*/1 * * * *' jobTemplate: metadata: labels: @@ -220,13 +220,13 @@ spec: 'backstage.io/kubernetes-id': dice-roller spec: containers: - - name: busybox - image: busybox - imagePullPolicy: IfNotPresent - command: - - /bin/sh - - -c - - date; echo Rolling a die! + - name: busybox + image: busybox + imagePullPolicy: IfNotPresent + command: + - /bin/sh + - -c + - date; echo Rolling a die! restartPolicy: OnFailure --- From fafb482d730751ba07806ec8830c46bb2e872444 Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Wed, 24 Nov 2021 15:27:42 +0000 Subject: [PATCH 070/131] permission-backend: add request validation Signed-off-by: Mike Lewis --- .../permission-backend/src/service/router.ts | 30 ++++++++++++++++--- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/plugins/permission-backend/src/service/router.ts b/plugins/permission-backend/src/service/router.ts index 0fd72297c5..8caba23b50 100644 --- a/plugins/permission-backend/src/service/router.ts +++ b/plugins/permission-backend/src/service/router.ts @@ -14,13 +14,14 @@ * limitations under the License. */ +import { z } from 'zod'; +import express, { Request, Response } from 'express'; +import Router from 'express-promise-router'; +import { Logger } from 'winston'; import { errorHandler, PluginEndpointDiscovery, } from '@backstage/backend-common'; -import express, { Request, Response } from 'express'; -import Router from 'express-promise-router'; -import { Logger } from 'winston'; import { BackstageIdentity, IdentityClient, @@ -34,6 +35,27 @@ import { import { PermissionPolicy } from '@backstage/plugin-permission-node'; import { PermissionIntegrationClient } from './PermissionIntegrationClient'; +const requestSchema: z.ZodSchema[]> = z.array( + z.object({ + id: z.string(), + resourceRef: z.string().optional(), + permission: z.object({ + name: z.string(), + resourceType: z.string().optional(), + attributes: z.object({ + action: z + .union([ + z.literal('create'), + z.literal('read'), + z.literal('update'), + z.literal('delete'), + ]) + .optional(), + }), + }), + }), +); + /** * Options required when constructing a new {@link express#Router} using * {@link createRouter}. @@ -121,7 +143,7 @@ export async function createRouter( const token = IdentityClient.getBearerToken(req.header('authorization')); const user = token ? await identity.authenticate(token) : undefined; - const body: Identified[] = req.body; + const body = requestSchema.parse(req.body); res.json( await Promise.all( From c5d1baa1af3d72c9bad55e1b42d5c899e7c4ceb5 Mon Sep 17 00:00:00 2001 From: Andrew Tran Date: Wed, 24 Nov 2021 09:41:43 -0600 Subject: [PATCH 071/131] update changeset Signed-off-by: Andrew Tran --- .changeset/big-phones-boil.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.changeset/big-phones-boil.md b/.changeset/big-phones-boil.md index 7d1e63797f..a7eff4099d 100644 --- a/.changeset/big-phones-boil.md +++ b/.changeset/big-phones-boil.md @@ -1,6 +1,6 @@ --- -'@backstage/plugin-kubernetes-backend': patch -'@backstage/plugin-kubernetes-common': patch +'@backstage/plugin-kubernetes-backend': minor +'@backstage/plugin-kubernetes-common': minor --- -Include cronjobs and jobs as default objects returned by the kubernetes backend and add/update relevant types. +Include CronJobs and Jobs as default objects returned by the kubernetes backend and add/update relevant types. From 1731dad0dbc251ef8b8b1b85f23b2567f226a98c Mon Sep 17 00:00:00 2001 From: Andrew Tran Date: Wed, 24 Nov 2021 09:54:36 -0600 Subject: [PATCH 072/131] update api reports and changeset Signed-off-by: Andrew Tran --- .changeset/big-phones-boil.md | 4 ++-- plugins/kubernetes-backend/api-report.md | 2 ++ plugins/kubernetes-common/api-report.md | 24 ++++++++++++++++++++++++ 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/.changeset/big-phones-boil.md b/.changeset/big-phones-boil.md index a7eff4099d..0ee19f5100 100644 --- a/.changeset/big-phones-boil.md +++ b/.changeset/big-phones-boil.md @@ -1,6 +1,6 @@ --- -'@backstage/plugin-kubernetes-backend': minor -'@backstage/plugin-kubernetes-common': minor +'@backstage/plugin-kubernetes-backend': patch +'@backstage/plugin-kubernetes-common': patch --- Include CronJobs and Jobs as default objects returned by the kubernetes backend and add/update relevant types. diff --git a/plugins/kubernetes-backend/api-report.md b/plugins/kubernetes-backend/api-report.md index f34815f328..e1236e61c5 100644 --- a/plugins/kubernetes-backend/api-report.md +++ b/plugins/kubernetes-backend/api-report.md @@ -202,6 +202,8 @@ export type KubernetesObjectTypes = | 'deployments' | 'replicasets' | 'horizontalpodautoscalers' + | 'jobs' + | 'cronjobs' | 'ingresses' | 'customresources'; diff --git a/plugins/kubernetes-common/api-report.md b/plugins/kubernetes-common/api-report.md index 9f9669275f..7db05a7513 100644 --- a/plugins/kubernetes-common/api-report.md +++ b/plugins/kubernetes-common/api-report.md @@ -6,8 +6,10 @@ import { Entity } from '@backstage/catalog-model'; import { ExtensionsV1beta1Ingress } from '@kubernetes/client-node'; import { V1ConfigMap } from '@kubernetes/client-node'; +import { V1CronJob } from '@kubernetes/client-node'; import { V1Deployment } from '@kubernetes/client-node'; import { V1HorizontalPodAutoscaler } from '@kubernetes/client-node'; +import { V1Job } from '@kubernetes/client-node'; import { V1Pod } from '@kubernetes/client-node'; import { V1ReplicaSet } from '@kubernetes/client-node'; import { V1Service } from '@kubernetes/client-node'; @@ -48,6 +50,16 @@ export interface ConfigMapFetchResponse { type: 'configmaps'; } +// Warning: (ae-missing-release-tag) "CronJobsFetchResponse" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface CronJobsFetchResponse { + // (undocumented) + resources: Array; + // (undocumented) + type: 'cronjobs'; +} + // Warning: (ae-missing-release-tag) "CustomResourceFetchResponse" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) @@ -78,6 +90,8 @@ export type FetchResponse = | DeploymentFetchResponse | ReplicaSetsFetchResponse | HorizontalPodAutoscalersFetchResponse + | JobsFetchResponse + | CronJobsFetchResponse | IngressesFetchResponse | CustomResourceFetchResponse; @@ -101,6 +115,16 @@ export interface IngressesFetchResponse { type: 'ingresses'; } +// Warning: (ae-missing-release-tag) "JobsFetchResponse" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export interface JobsFetchResponse { + // (undocumented) + resources: Array; + // (undocumented) + type: 'jobs'; +} + // Warning: (ae-missing-release-tag) "KubernetesErrorTypes" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // // @public (undocumented) From 2bacc8be347311f2ffe231b42e349a8ccf8410cb Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Wed, 24 Nov 2021 16:46:19 +0000 Subject: [PATCH 073/131] permission-backend: expand router test suite Signed-off-by: Mike Lewis --- .../src/service/router.test.ts | 222 ++++++++++++++++-- 1 file changed, 205 insertions(+), 17 deletions(-) diff --git a/plugins/permission-backend/src/service/router.test.ts b/plugins/permission-backend/src/service/router.test.ts index 29b5245006..78e7121da6 100644 --- a/plugins/permission-backend/src/service/router.test.ts +++ b/plugins/permission-backend/src/service/router.test.ts @@ -18,15 +18,22 @@ import express from 'express'; import request from 'supertest'; import { getVoidLogger } from '@backstage/backend-common'; import { IdentityClient } from '@backstage/plugin-auth-backend'; -import { - AuthorizeResult, - Permission, -} from '@backstage/plugin-permission-common'; -import { PermissionPolicy } from '@backstage/plugin-permission-node'; +import { AuthorizeResult } from '@backstage/plugin-permission-common'; +import { ApplyConditionsResponse } from '@backstage/plugin-permission-node'; +import { PermissionIntegrationClient } from './PermissionIntegrationClient'; import { createRouter } from './router'; -const policy: PermissionPolicy = { +const mockApplyConditions: jest.MockedFunction< + InstanceType['applyConditions'] +> = jest.fn(); +jest.mock('./PermissionIntegrationClient', () => ({ + PermissionIntegrationClient: jest.fn(() => ({ + applyConditions: mockApplyConditions, + })), +})); + +const policy = { handle: jest.fn().mockImplementation((_req, identity) => { if (identity) { return { result: AuthorizeResult.ALLOW }; @@ -35,11 +42,6 @@ const policy: PermissionPolicy = { }), }; -const permission: Permission = { - name: 'test.permission', - attributes: { action: 'read' }, -}; - describe('createRouter', () => { let app: express.Express; @@ -81,12 +83,47 @@ describe('createRouter', () => { it('calls the permission policy', async () => { const response = await request(app) .post('/authorize') - .send([{ id: 123, permission }]); + .send([ + { + id: '123', + permission: { + name: 'test.permission1', + attributes: {}, + }, + }, + { + id: '234', + permission: { + name: 'test.permission2', + attributes: {}, + }, + }, + ]); expect(response.status).toEqual(200); - expect(policy.handle).toHaveBeenCalledWith({ permission }, undefined); + + expect(policy.handle).toHaveBeenCalledWith( + { + permission: { + name: 'test.permission1', + attributes: {}, + }, + }, + undefined, + ); + expect(policy.handle).toHaveBeenCalledWith( + { + permission: { + name: 'test.permission2', + attributes: {}, + }, + }, + undefined, + ); + expect(response.body).toEqual([ - { id: 123, result: AuthorizeResult.DENY }, + { id: '123', result: AuthorizeResult.DENY }, + { id: '234', result: AuthorizeResult.DENY }, ]); }); @@ -95,16 +132,167 @@ describe('createRouter', () => { const response = await request(app) .post('/authorize') .auth(token, { type: 'bearer' }) - .send([{ id: 123, permission }]); + .send([ + { + id: '123', + permission: { + name: 'test.permission', + attributes: {}, + }, + }, + ]); expect(response.status).toEqual(200); expect(policy.handle).toHaveBeenCalledWith( - { permission }, + { + permission: { + name: 'test.permission', + attributes: {}, + }, + }, { id: 'test-user', token: 'test-token' }, ); expect(response.body).toEqual([ - { id: 123, result: AuthorizeResult.ALLOW }, + { id: '123', result: AuthorizeResult.ALLOW }, ]); }); + + describe('conditional policy result', () => { + beforeEach(() => { + policy.handle.mockReturnValueOnce({ + result: AuthorizeResult.CONDITIONAL, + conditions: { + pluginId: 'test-plugin', + resourceType: 'test-resource-1', + conditions: { + anyOf: [{ rule: 'test-rule', params: ['abc'] }], + }, + }, + }); + }); + + it('returns conditions if no resourceRef is supplied', async () => { + const response = await request(app) + .post('/authorize') + .send([ + { + id: '123', + permission: { + name: 'test.permission', + resourceType: 'test-resource-1', + attributes: {}, + }, + }, + ]); + + expect(response.status).toEqual(200); + expect(response.body).toEqual([ + { + id: '123', + result: AuthorizeResult.CONDITIONAL, + conditions: { anyOf: [{ rule: 'test-rule', params: ['abc'] }] }, + }, + ]); + }); + + it.each([ + AuthorizeResult.ALLOW, + AuthorizeResult.DENY, + ])( + 'applies conditions and returns %s if resourceRef is supplied', + async result => { + mockApplyConditions.mockResolvedValueOnce({ + result, + }); + + const response = await request(app) + .post('/authorize') + .auth('test-token', { type: 'bearer' }) + .send([ + { + id: '123', + resourceRef: 'test/resource', + permission: { + name: 'test.permission', + resourceType: 'test-resource-1', + attributes: {}, + }, + }, + ]); + + expect(mockApplyConditions).toHaveBeenCalledWith( + { + pluginId: 'test-plugin', + resourceType: 'test-resource-1', + resourceRef: 'test/resource', + conditions: { anyOf: [{ rule: 'test-rule', params: ['abc'] }] }, + }, + 'Bearer test-token', + ); + + expect(response.status).toEqual(200); + expect(response.body).toEqual([ + { + id: '123', + result, + }, + ]); + }, + ); + }); + + it.each([ + undefined, + '', + {}, + [{ permission: { name: 'test.permission', attributes: {} } }], + [{ id: '123' }], + [{ id: '123', permission: { name: 'test.permission' } }], + [{ id: '123', permission: { attributes: { invalid: 'attribute' } } }], + ])('returns a 500 error for invalid request %#', async requestBody => { + const response = await request(app).post('/authorize').send(requestBody); + + expect(response.status).toEqual(500); + expect(response.body).toEqual( + expect.objectContaining({ + error: expect.objectContaining({ + message: expect.stringMatching(/invalid/i), + }), + }), + ); + }); + + it('returns a 500 error if the policy returns a different resourceType', async () => { + policy.handle.mockReturnValueOnce({ + result: AuthorizeResult.CONDITIONAL, + conditions: { + pluginId: 'test-plugin', + resourceType: 'test-resource-2', + conditions: {}, + }, + }); + + const response = await request(app) + .post('/authorize') + .send([ + { + id: '123', + permission: { + name: 'test.permission', + resourceType: 'test-resource-1', + attributes: {}, + }, + }, + ]); + + expect(response.status).toEqual(500); + expect(response.body).toEqual( + expect.objectContaining({ + error: expect.objectContaining({ + message: expect.stringMatching(/invalid resource conditions/i), + }), + }), + ); + }); }); }); From 547bf85a622176a9a5aa9979ac616dde9968ae67 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 19 Nov 2021 15:54:57 +0100 Subject: [PATCH 074/131] scaffolder-backend: add build script for bundling nunjucks Co-authored-by: Johan Haals Signed-off-by: Patrik Oldsberg --- plugins/scaffolder-backend/package.json | 7 +- .../scripts/build-nunjucks.js | 67 +++++++++++ yarn.lock | 108 ++++++++++++++++++ 3 files changed, 180 insertions(+), 2 deletions(-) create mode 100755 plugins/scaffolder-backend/scripts/build-nunjucks.js diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index 36ac76c95f..7b7407e410 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -27,7 +27,8 @@ "test": "backstage-cli test", "prepack": "backstage-cli prepack", "postpack": "backstage-cli postpack", - "clean": "backstage-cli clean" + "clean": "backstage-cli clean", + "build:assets": "node scripts/build-nunjucks.js" }, "dependencies": { "@backstage/backend-common": "^0.9.10", @@ -79,6 +80,7 @@ "@types/mock-fs": "^4.13.0", "@types/nunjucks": "^3.1.4", "@types/supertest": "^2.0.8", + "esbuild": "^0.13.14", "jest-when": "^3.1.0", "mock-fs": "^5.1.0", "msw": "^0.35.0", @@ -88,7 +90,8 @@ "files": [ "dist", "migrations", - "config.d.ts" + "config.d.ts", + "assets" ], "configSchema": "config.d.ts" } diff --git a/plugins/scaffolder-backend/scripts/build-nunjucks.js b/plugins/scaffolder-backend/scripts/build-nunjucks.js new file mode 100755 index 0000000000..d20cfa8d80 --- /dev/null +++ b/plugins/scaffolder-backend/scripts/build-nunjucks.js @@ -0,0 +1,67 @@ +#!/usr/bin/env node +/* + * Copyright 2021 The Backstage Authors + * + * 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 + * + * http://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. + */ + +/* eslint-disable no-restricted-syntax */ +/* eslint-disable import/no-extraneous-dependencies */ + +const path = require('path'); + +const NUNJUCKS_LICENSE = `/** + * Copyright (c) 2012-2015, James Long + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +`; + +require('esbuild') + .build({ + entryPoints: [require.resolve('nunjucks')], + bundle: true, + format: 'cjs', + platform: 'node', + target: 'node14', + banner: NUNJUCKS_LICENSE, + external: ['fsevents'], + outfile: path.resolve(__dirname, '../assets/nunjucks.js.txt'), + }) + .catch(err => { + console.log(err.stack); + process.exit(1); + }); diff --git a/yarn.lock b/yarn.lock index 1e4d402072..e20a75a023 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13699,6 +13699,114 @@ es6-weak-map@^2.0.3: es6-iterator "^2.0.3" es6-symbol "^3.1.1" +esbuild-android-arm64@0.13.14: + version "0.13.14" + resolved "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.13.14.tgz#c85083ece26be3d67e6c720e088968a98409e023" + integrity sha512-Q+Xhfp827r+ma8/DJgpMRUbDZfefsk13oePFEXEIJ4gxFbNv5+vyiYXYuKm43/+++EJXpnaYmEnu4hAKbAWYbA== + +esbuild-darwin-64@0.13.14: + version "0.13.14" + resolved "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.13.14.tgz#8e4e237ad847cc54a1d3a5caee26a746b9f0b81f" + integrity sha512-YmOhRns6QBNSjpVdTahi/yZ8dscx9ai7a6OY6z5ACgOuQuaQ2Qk2qgJ0/siZ6LgD0gJFMV8UINFV5oky5TFNQQ== + +esbuild-darwin-arm64@0.13.14: + version "0.13.14" + resolved "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.13.14.tgz#b3b5ebd40b2cb06ee0f6fb342dd4bdcca54ad273" + integrity sha512-Lp00VTli2jqZghSa68fx3fEFCPsO1hK59RMo1PRap5RUjhf55OmaZTZYnCDI0FVlCtt+gBwX5qwFt4lc6tI1xg== + +esbuild-freebsd-64@0.13.14: + version "0.13.14" + resolved "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.13.14.tgz#175ecb2fa8141428cf70ea2d5f4c27534bad53e0" + integrity sha512-BKosI3jtvTfnmsCW37B1TyxMUjkRWKqopR0CE9AF2ratdpkxdR24Vpe3gLKNyWiZ7BE96/SO5/YfhbPUzY8wKw== + +esbuild-freebsd-arm64@0.13.14: + version "0.13.14" + resolved "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.13.14.tgz#a7d64e41d1fa581f8db7775e5200f18e67d70c4d" + integrity sha512-yd2uh0yf+fWv5114+SYTl4/1oDWtr4nN5Op+PGxAkMqHfYfLjFKpcxwCo/QOS/0NWqPVE8O41IYZlFhbEN2B8Q== + +esbuild-linux-32@0.13.14: + version "0.13.14" + resolved "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.13.14.tgz#14bdd4f6b6cfd35c65c835894651ba335c2117da" + integrity sha512-a8rOnS1oWSfkkYWXoD2yXNV4BdbDKA7PNVQ1klqkY9SoSApL7io66w5H44mTLsfyw7G6Z2vLlaLI2nz9MMAowA== + +esbuild-linux-64@0.13.14: + version "0.13.14" + resolved "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.13.14.tgz#7fd56851b2982fdd0cd8447ee9858c2c5711708a" + integrity sha512-yPZSoMs9W2MC3Dw+6kflKt5FfQm6Dicex9dGIr1OlHRsn3Hm7yGMUTctlkW53KknnZdOdcdd5upxvbxqymczVQ== + +esbuild-linux-arm64@0.13.14: + version "0.13.14" + resolved "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.13.14.tgz#a55634d70679ba509adeafd68eebb9fd1ec5af6c" + integrity sha512-Lvo391ln9PzC334e+jJ2S0Rt0cxP47eoH5gFyv/E8HhOnEJTvm7A+RRnMjjHnejELacTTfYgFGQYPjLsi/jObQ== + +esbuild-linux-arm@0.13.14: + version "0.13.14" + resolved "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.13.14.tgz#bb96a99677e608b31ff61f37564326d38e846ca2" + integrity sha512-8chZE4pkKRvJ/M/iwsNQ1KqsRg2RyU5eT/x2flNt/f8F2TVrDreR7I0HEeCR50wLla3B1C3wTIOzQBmjuc6uWg== + +esbuild-linux-mips64le@0.13.14: + version "0.13.14" + resolved "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.13.14.tgz#6a55362a8fd1e593dea2ecc41877beed8b8184b9" + integrity sha512-MZhgxbmrWbpY3TOE029O6l5tokG9+Yoj2hW7vdit/d/VnmneqeGrSHADuDL6qXM8L5jaCiaivb4VhsyVCpdAbQ== + +esbuild-linux-ppc64le@0.13.14: + version "0.13.14" + resolved "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.13.14.tgz#9e0048587ece0a7f184ab147f20d077098045e7f" + integrity sha512-un7KMwS7fX1Un6BjfSZxTT8L5cV/8Uf4SAhM7WYy2XF8o8TI+uRxxD03svZnRNIPsN2J5cl6qV4n7Iwz+yhhVw== + +esbuild-netbsd-64@0.13.14: + version "0.13.14" + resolved "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.13.14.tgz#dcab16a4bbcfa16e2e8535dadc5f64fdc891c63b" + integrity sha512-5ekKx/YbOmmlTeNxBjh38Uh5TGn5C4uyqN17i67k18pS3J+U2hTVD7rCxcFcRS1AjNWumkVL3jWqYXadFwMS0Q== + +esbuild-openbsd-64@0.13.14: + version "0.13.14" + resolved "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.13.14.tgz#3c7453b155ebb68dc34d5aec3bd6505337bdda08" + integrity sha512-9bzvwewHjct2Cv5XcVoE1yW5YTW12Sk838EYfA46abgnhxGoFSD1mFcaztp5HHC43AsF+hQxbSFG/RilONARUA== + +esbuild-sunos-64@0.13.14: + version "0.13.14" + resolved "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.13.14.tgz#85addf5fef6b5db154a955d4f2e88953359d75ce" + integrity sha512-mjMrZB76M6FmoiTvj/RGWilrioR7gVwtFBRVugr9qLarXMIU1W/pQx+ieEOtflrW61xo8w1fcxyHsVVGRvoQ0w== + +esbuild-windows-32@0.13.14: + version "0.13.14" + resolved "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.13.14.tgz#f77f98f30a5c636c44db2428ecdf9bcbbaedb1a7" + integrity sha512-GZa6mrx2rgfbH/5uHg0Rdw50TuOKbdoKCpEBitzmG5tsXBdce+cOL+iFO5joZc6fDVCLW3Y6tjxmSXRk/v20Hg== + +esbuild-windows-64@0.13.14: + version "0.13.14" + resolved "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.13.14.tgz#bc778674c40d65150d12385e0f23eb3a0badbd0d" + integrity sha512-Lsgqah24bT7ClHjLp/Pj3A9wxjhIAJyWQcrOV4jqXAFikmrp2CspA8IkJgw7HFjx6QrJuhpcKVbCAe/xw0i2yw== + +esbuild-windows-arm64@0.13.14: + version "0.13.14" + resolved "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.13.14.tgz#91a8dad35ab2c4dd27cd83860742955b25a354d7" + integrity sha512-KP8FHVlWGhM7nzYtURsGnskXb/cBCPTfj0gOKfjKq2tHtYnhDZywsUG57nk7TKhhK0fL11LcejHG3LRW9RF/9A== + +esbuild@^0.13.14: + version "0.13.14" + resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.13.14.tgz#98a3f7f42809abdc2b57c84565d0f713382dc1a5" + integrity sha512-xu4D+1ji9x53ocuomcY+KOrwAnWzhBu/wTEjpdgZ8I1c8i5vboYIeigMdzgY1UowYBKa2vZgVgUB32bu7gkxeg== + optionalDependencies: + esbuild-android-arm64 "0.13.14" + esbuild-darwin-64 "0.13.14" + esbuild-darwin-arm64 "0.13.14" + esbuild-freebsd-64 "0.13.14" + esbuild-freebsd-arm64 "0.13.14" + esbuild-linux-32 "0.13.14" + esbuild-linux-64 "0.13.14" + esbuild-linux-arm "0.13.14" + esbuild-linux-arm64 "0.13.14" + esbuild-linux-mips64le "0.13.14" + esbuild-linux-ppc64le "0.13.14" + esbuild-netbsd-64 "0.13.14" + esbuild-openbsd-64 "0.13.14" + esbuild-sunos-64 "0.13.14" + esbuild-windows-32 "0.13.14" + esbuild-windows-64 "0.13.14" + esbuild-windows-arm64 "0.13.14" + esbuild@^0.8.56: version "0.8.57" resolved "https://registry.npmjs.org/esbuild/-/esbuild-0.8.57.tgz#a42d02bc2b57c70bcd0ef897fe244766bb6dd926" From d6da7d706d737f78576eeb345a9029dc9edba6da Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 19 Nov 2021 15:55:24 +0100 Subject: [PATCH 075/131] scaffolder-backend: generate nunjucks bundle Co-authored-by: Johan Haals Signed-off-by: Patrik Oldsberg --- .../scaffolder-backend/assets/nunjucks.js.txt | 10385 ++++++++++++++++ 1 file changed, 10385 insertions(+) create mode 100644 plugins/scaffolder-backend/assets/nunjucks.js.txt diff --git a/plugins/scaffolder-backend/assets/nunjucks.js.txt b/plugins/scaffolder-backend/assets/nunjucks.js.txt new file mode 100644 index 0000000000..b78d1d98ac --- /dev/null +++ b/plugins/scaffolder-backend/assets/nunjucks.js.txt @@ -0,0 +1,10385 @@ + +/** + * Copyright (c) 2012-2015, James Long + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +var __commonJS = (callback, module2) => () => { + if (!module2) { + module2 = {exports: {}}; + callback(module2.exports, module2); + } + return module2.exports; +}; + +// ../../node_modules/nunjucks/src/lib.js +var require_lib = __commonJS((exports2, module2) => { + "use strict"; + var ArrayProto = Array.prototype; + var ObjProto = Object.prototype; + var escapeMap = { + "&": "&", + '"': """, + "'": "'", + "<": "<", + ">": ">" + }; + var escapeRegex = /[&"'<>]/g; + var _exports = module2.exports = {}; + function hasOwnProp(obj, k) { + return ObjProto.hasOwnProperty.call(obj, k); + } + _exports.hasOwnProp = hasOwnProp; + function lookupEscape(ch) { + return escapeMap[ch]; + } + function _prettifyError(path, withInternals, err) { + if (!err.Update) { + err = new _exports.TemplateError(err); + } + err.Update(path); + if (!withInternals) { + var old = err; + err = new Error(old.message); + err.name = old.name; + } + return err; + } + _exports._prettifyError = _prettifyError; + function TemplateError(message, lineno, colno) { + var err; + var cause; + if (message instanceof Error) { + cause = message; + message = cause.name + ": " + cause.message; + } + if (Object.setPrototypeOf) { + err = new Error(message); + Object.setPrototypeOf(err, TemplateError.prototype); + } else { + err = this; + Object.defineProperty(err, "message", { + enumerable: false, + writable: true, + value: message + }); + } + Object.defineProperty(err, "name", { + value: "Template render error" + }); + if (Error.captureStackTrace) { + Error.captureStackTrace(err, this.constructor); + } + var getStack; + if (cause) { + var stackDescriptor = Object.getOwnPropertyDescriptor(cause, "stack"); + getStack = stackDescriptor && (stackDescriptor.get || function() { + return stackDescriptor.value; + }); + if (!getStack) { + getStack = function getStack2() { + return cause.stack; + }; + } + } else { + var stack = new Error(message).stack; + getStack = function getStack2() { + return stack; + }; + } + Object.defineProperty(err, "stack", { + get: function get() { + return getStack.call(err); + } + }); + Object.defineProperty(err, "cause", { + value: cause + }); + err.lineno = lineno; + err.colno = colno; + err.firstUpdate = true; + err.Update = function Update(path) { + var msg = "(" + (path || "unknown path") + ")"; + if (this.firstUpdate) { + if (this.lineno && this.colno) { + msg += " [Line " + this.lineno + ", Column " + this.colno + "]"; + } else if (this.lineno) { + msg += " [Line " + this.lineno + "]"; + } + } + msg += "\n "; + if (this.firstUpdate) { + msg += " "; + } + this.message = msg + (this.message || ""); + this.firstUpdate = false; + return this; + }; + return err; + } + if (Object.setPrototypeOf) { + Object.setPrototypeOf(TemplateError.prototype, Error.prototype); + } else { + TemplateError.prototype = Object.create(Error.prototype, { + constructor: { + value: TemplateError + } + }); + } + _exports.TemplateError = TemplateError; + function escape(val) { + return val.replace(escapeRegex, lookupEscape); + } + _exports.escape = escape; + function isFunction(obj) { + return ObjProto.toString.call(obj) === "[object Function]"; + } + _exports.isFunction = isFunction; + function isArray(obj) { + return ObjProto.toString.call(obj) === "[object Array]"; + } + _exports.isArray = isArray; + function isString(obj) { + return ObjProto.toString.call(obj) === "[object String]"; + } + _exports.isString = isString; + function isObject(obj) { + return ObjProto.toString.call(obj) === "[object Object]"; + } + _exports.isObject = isObject; + function _prepareAttributeParts(attr) { + if (!attr) { + return []; + } + if (typeof attr === "string") { + return attr.split("."); + } + return [attr]; + } + function getAttrGetter(attribute) { + var parts = _prepareAttributeParts(attribute); + return function attrGetter(item) { + var _item = item; + for (var i = 0; i < parts.length; i++) { + var part = parts[i]; + if (hasOwnProp(_item, part)) { + _item = _item[part]; + } else { + return void 0; + } + } + return _item; + }; + } + _exports.getAttrGetter = getAttrGetter; + function groupBy(obj, val, throwOnUndefined) { + var result = {}; + var iterator = isFunction(val) ? val : getAttrGetter(val); + for (var i = 0; i < obj.length; i++) { + var value = obj[i]; + var key = iterator(value, i); + if (key === void 0 && throwOnUndefined === true) { + throw new TypeError('groupby: attribute "' + val + '" resolved to undefined'); + } + (result[key] || (result[key] = [])).push(value); + } + return result; + } + _exports.groupBy = groupBy; + function toArray(obj) { + return Array.prototype.slice.call(obj); + } + _exports.toArray = toArray; + function without(array) { + var result = []; + if (!array) { + return result; + } + var length = array.length; + var contains = toArray(arguments).slice(1); + var index = -1; + while (++index < length) { + if (indexOf(contains, array[index]) === -1) { + result.push(array[index]); + } + } + return result; + } + _exports.without = without; + function repeat(char_, n) { + var str = ""; + for (var i = 0; i < n; i++) { + str += char_; + } + return str; + } + _exports.repeat = repeat; + function each(obj, func, context) { + if (obj == null) { + return; + } + if (ArrayProto.forEach && obj.forEach === ArrayProto.forEach) { + obj.forEach(func, context); + } else if (obj.length === +obj.length) { + for (var i = 0, l = obj.length; i < l; i++) { + func.call(context, obj[i], i, obj); + } + } + } + _exports.each = each; + function map(obj, func) { + var results = []; + if (obj == null) { + return results; + } + if (ArrayProto.map && obj.map === ArrayProto.map) { + return obj.map(func); + } + for (var i = 0; i < obj.length; i++) { + results[results.length] = func(obj[i], i); + } + if (obj.length === +obj.length) { + results.length = obj.length; + } + return results; + } + _exports.map = map; + function asyncIter(arr, iter, cb) { + var i = -1; + function next() { + i++; + if (i < arr.length) { + iter(arr[i], i, next, cb); + } else { + cb(); + } + } + next(); + } + _exports.asyncIter = asyncIter; + function asyncFor(obj, iter, cb) { + var keys = keys_(obj || {}); + var len = keys.length; + var i = -1; + function next() { + i++; + var k = keys[i]; + if (i < len) { + iter(k, obj[k], i, len, next); + } else { + cb(); + } + } + next(); + } + _exports.asyncFor = asyncFor; + function indexOf(arr, searchElement, fromIndex) { + return Array.prototype.indexOf.call(arr || [], searchElement, fromIndex); + } + _exports.indexOf = indexOf; + function keys_(obj) { + var arr = []; + for (var k in obj) { + if (hasOwnProp(obj, k)) { + arr.push(k); + } + } + return arr; + } + _exports.keys = keys_; + function _entries(obj) { + return keys_(obj).map(function(k) { + return [k, obj[k]]; + }); + } + _exports._entries = _entries; + function _values(obj) { + return keys_(obj).map(function(k) { + return obj[k]; + }); + } + _exports._values = _values; + function extend(obj1, obj2) { + obj1 = obj1 || {}; + keys_(obj2).forEach(function(k) { + obj1[k] = obj2[k]; + }); + return obj1; + } + _exports._assign = _exports.extend = extend; + function inOperator(key, val) { + if (isArray(val) || isString(val)) { + return val.indexOf(key) !== -1; + } else if (isObject(val)) { + return key in val; + } + throw new Error('Cannot use "in" operator to search for "' + key + '" in unexpected types.'); + } + _exports.inOperator = inOperator; +}); + +// ../../node_modules/asap/raw.js +var require_raw = __commonJS((exports2, module2) => { + "use strict"; + var domain; + var hasSetImmediate = typeof setImmediate === "function"; + module2.exports = rawAsap; + function rawAsap(task) { + if (!queue.length) { + requestFlush(); + flushing = true; + } + queue[queue.length] = task; + } + var queue = []; + var flushing = false; + var index = 0; + var capacity = 1024; + function flush() { + while (index < queue.length) { + var currentIndex = index; + index = index + 1; + queue[currentIndex].call(); + if (index > capacity) { + for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) { + queue[scan] = queue[scan + index]; + } + queue.length -= index; + index = 0; + } + } + queue.length = 0; + index = 0; + flushing = false; + } + rawAsap.requestFlush = requestFlush; + function requestFlush() { + var parentDomain = process.domain; + if (parentDomain) { + if (!domain) { + domain = require("domain"); + } + domain.active = process.domain = null; + } + if (flushing && hasSetImmediate) { + setImmediate(flush); + } else { + process.nextTick(flush); + } + if (parentDomain) { + domain.active = process.domain = parentDomain; + } + } +}); + +// ../../node_modules/asap/asap.js +var require_asap = __commonJS((exports2, module2) => { + "use strict"; + var rawAsap = require_raw(); + var freeTasks = []; + module2.exports = asap; + function asap(task) { + var rawTask; + if (freeTasks.length) { + rawTask = freeTasks.pop(); + } else { + rawTask = new RawTask(); + } + rawTask.task = task; + rawTask.domain = process.domain; + rawAsap(rawTask); + } + function RawTask() { + this.task = null; + this.domain = null; + } + RawTask.prototype.call = function() { + if (this.domain) { + this.domain.enter(); + } + var threw = true; + try { + this.task.call(); + threw = false; + if (this.domain) { + this.domain.exit(); + } + } finally { + if (threw) { + rawAsap.requestFlush(); + } + this.task = null; + this.domain = null; + freeTasks.push(this); + } + }; +}); + +// ../../node_modules/a-sync-waterfall/index.js +var require_a_sync_waterfall = __commonJS((exports2, module2) => { + (function(globals) { + "use strict"; + var executeSync = function() { + var args = Array.prototype.slice.call(arguments); + if (typeof args[0] === "function") { + args[0].apply(null, args.splice(1)); + } + }; + var executeAsync = function(fn) { + if (typeof setImmediate === "function") { + setImmediate(fn); + } else if (typeof process !== "undefined" && process.nextTick) { + process.nextTick(fn); + } else { + setTimeout(fn, 0); + } + }; + var makeIterator = function(tasks) { + var makeCallback = function(index) { + var fn = function() { + if (tasks.length) { + tasks[index].apply(null, arguments); + } + return fn.next(); + }; + fn.next = function() { + return index < tasks.length - 1 ? makeCallback(index + 1) : null; + }; + return fn; + }; + return makeCallback(0); + }; + var _isArray = Array.isArray || function(maybeArray) { + return Object.prototype.toString.call(maybeArray) === "[object Array]"; + }; + var waterfall = function(tasks, callback, forceAsync) { + var nextTick = forceAsync ? executeAsync : executeSync; + callback = callback || function() { + }; + if (!_isArray(tasks)) { + var err = new Error("First argument to waterfall must be an array of functions"); + return callback(err); + } + if (!tasks.length) { + return callback(); + } + var wrapIterator = function(iterator) { + return function(err2) { + if (err2) { + callback.apply(null, arguments); + callback = function() { + }; + } else { + var args = Array.prototype.slice.call(arguments, 1); + var next = iterator.next(); + if (next) { + args.push(wrapIterator(next)); + } else { + args.push(callback); + } + nextTick(function() { + iterator.apply(null, args); + }); + } + }; + }; + wrapIterator(makeIterator(tasks))(); + }; + if (typeof define !== "undefined" && define.amd) { + define([], function() { + return waterfall; + }); + } else if (typeof module2 !== "undefined" && module2.exports) { + module2.exports = waterfall; + } else { + globals.waterfall = waterfall; + } + })(exports2); +}); + +// ../../node_modules/nunjucks/src/lexer.js +var require_lexer = __commonJS((exports2, module2) => { + "use strict"; + var lib2 = require_lib(); + var whitespaceChars = " \n \r\xA0"; + var delimChars = "()[]{}%*-+~/#,:|.<>=!"; + var intChars = "0123456789"; + var BLOCK_START = "{%"; + var BLOCK_END = "%}"; + var VARIABLE_START = "{{"; + var VARIABLE_END = "}}"; + var COMMENT_START = "{#"; + var COMMENT_END = "#}"; + var TOKEN_STRING = "string"; + var TOKEN_WHITESPACE = "whitespace"; + var TOKEN_DATA = "data"; + var TOKEN_BLOCK_START = "block-start"; + var TOKEN_BLOCK_END = "block-end"; + var TOKEN_VARIABLE_START = "variable-start"; + var TOKEN_VARIABLE_END = "variable-end"; + var TOKEN_COMMENT = "comment"; + var TOKEN_LEFT_PAREN = "left-paren"; + var TOKEN_RIGHT_PAREN = "right-paren"; + var TOKEN_LEFT_BRACKET = "left-bracket"; + var TOKEN_RIGHT_BRACKET = "right-bracket"; + var TOKEN_LEFT_CURLY = "left-curly"; + var TOKEN_RIGHT_CURLY = "right-curly"; + var TOKEN_OPERATOR = "operator"; + var TOKEN_COMMA = "comma"; + var TOKEN_COLON = "colon"; + var TOKEN_TILDE = "tilde"; + var TOKEN_PIPE = "pipe"; + var TOKEN_INT = "int"; + var TOKEN_FLOAT = "float"; + var TOKEN_BOOLEAN = "boolean"; + var TOKEN_NONE = "none"; + var TOKEN_SYMBOL = "symbol"; + var TOKEN_SPECIAL = "special"; + var TOKEN_REGEX = "regex"; + function token(type, value, lineno, colno) { + return { + type, + value, + lineno, + colno + }; + } + var Tokenizer = /* @__PURE__ */ function() { + function Tokenizer2(str, opts) { + this.str = str; + this.index = 0; + this.len = str.length; + this.lineno = 0; + this.colno = 0; + this.in_code = false; + opts = opts || {}; + var tags = opts.tags || {}; + this.tags = { + BLOCK_START: tags.blockStart || BLOCK_START, + BLOCK_END: tags.blockEnd || BLOCK_END, + VARIABLE_START: tags.variableStart || VARIABLE_START, + VARIABLE_END: tags.variableEnd || VARIABLE_END, + COMMENT_START: tags.commentStart || COMMENT_START, + COMMENT_END: tags.commentEnd || COMMENT_END + }; + this.trimBlocks = !!opts.trimBlocks; + this.lstripBlocks = !!opts.lstripBlocks; + } + var _proto = Tokenizer2.prototype; + _proto.nextToken = function nextToken() { + var lineno = this.lineno; + var colno = this.colno; + var tok; + if (this.in_code) { + var cur = this.current(); + if (this.isFinished()) { + return null; + } else if (cur === '"' || cur === "'") { + return token(TOKEN_STRING, this._parseString(cur), lineno, colno); + } else if (tok = this._extract(whitespaceChars)) { + return token(TOKEN_WHITESPACE, tok, lineno, colno); + } else if ((tok = this._extractString(this.tags.BLOCK_END)) || (tok = this._extractString("-" + this.tags.BLOCK_END))) { + this.in_code = false; + if (this.trimBlocks) { + cur = this.current(); + if (cur === "\n") { + this.forward(); + } else if (cur === "\r") { + this.forward(); + cur = this.current(); + if (cur === "\n") { + this.forward(); + } else { + this.back(); + } + } + } + return token(TOKEN_BLOCK_END, tok, lineno, colno); + } else if ((tok = this._extractString(this.tags.VARIABLE_END)) || (tok = this._extractString("-" + this.tags.VARIABLE_END))) { + this.in_code = false; + return token(TOKEN_VARIABLE_END, tok, lineno, colno); + } else if (cur === "r" && this.str.charAt(this.index + 1) === "/") { + this.forwardN(2); + var regexBody = ""; + while (!this.isFinished()) { + if (this.current() === "/" && this.previous() !== "\\") { + this.forward(); + break; + } else { + regexBody += this.current(); + this.forward(); + } + } + var POSSIBLE_FLAGS = ["g", "i", "m", "y"]; + var regexFlags = ""; + while (!this.isFinished()) { + var isCurrentAFlag = POSSIBLE_FLAGS.indexOf(this.current()) !== -1; + if (isCurrentAFlag) { + regexFlags += this.current(); + this.forward(); + } else { + break; + } + } + return token(TOKEN_REGEX, { + body: regexBody, + flags: regexFlags + }, lineno, colno); + } else if (delimChars.indexOf(cur) !== -1) { + this.forward(); + var complexOps = ["==", "===", "!=", "!==", "<=", ">=", "//", "**"]; + var curComplex = cur + this.current(); + var type; + if (lib2.indexOf(complexOps, curComplex) !== -1) { + this.forward(); + cur = curComplex; + if (lib2.indexOf(complexOps, curComplex + this.current()) !== -1) { + cur = curComplex + this.current(); + this.forward(); + } + } + switch (cur) { + case "(": + type = TOKEN_LEFT_PAREN; + break; + case ")": + type = TOKEN_RIGHT_PAREN; + break; + case "[": + type = TOKEN_LEFT_BRACKET; + break; + case "]": + type = TOKEN_RIGHT_BRACKET; + break; + case "{": + type = TOKEN_LEFT_CURLY; + break; + case "}": + type = TOKEN_RIGHT_CURLY; + break; + case ",": + type = TOKEN_COMMA; + break; + case ":": + type = TOKEN_COLON; + break; + case "~": + type = TOKEN_TILDE; + break; + case "|": + type = TOKEN_PIPE; + break; + default: + type = TOKEN_OPERATOR; + } + return token(type, cur, lineno, colno); + } else { + tok = this._extractUntil(whitespaceChars + delimChars); + if (tok.match(/^[-+]?[0-9]+$/)) { + if (this.current() === ".") { + this.forward(); + var dec = this._extract(intChars); + return token(TOKEN_FLOAT, tok + "." + dec, lineno, colno); + } else { + return token(TOKEN_INT, tok, lineno, colno); + } + } else if (tok.match(/^(true|false)$/)) { + return token(TOKEN_BOOLEAN, tok, lineno, colno); + } else if (tok === "none") { + return token(TOKEN_NONE, tok, lineno, colno); + } else if (tok === "null") { + return token(TOKEN_NONE, tok, lineno, colno); + } else if (tok) { + return token(TOKEN_SYMBOL, tok, lineno, colno); + } else { + throw new Error("Unexpected value while parsing: " + tok); + } + } + } else { + var beginChars = this.tags.BLOCK_START.charAt(0) + this.tags.VARIABLE_START.charAt(0) + this.tags.COMMENT_START.charAt(0) + this.tags.COMMENT_END.charAt(0); + if (this.isFinished()) { + return null; + } else if ((tok = this._extractString(this.tags.BLOCK_START + "-")) || (tok = this._extractString(this.tags.BLOCK_START))) { + this.in_code = true; + return token(TOKEN_BLOCK_START, tok, lineno, colno); + } else if ((tok = this._extractString(this.tags.VARIABLE_START + "-")) || (tok = this._extractString(this.tags.VARIABLE_START))) { + this.in_code = true; + return token(TOKEN_VARIABLE_START, tok, lineno, colno); + } else { + tok = ""; + var data; + var inComment = false; + if (this._matches(this.tags.COMMENT_START)) { + inComment = true; + tok = this._extractString(this.tags.COMMENT_START); + } + while ((data = this._extractUntil(beginChars)) !== null) { + tok += data; + if ((this._matches(this.tags.BLOCK_START) || this._matches(this.tags.VARIABLE_START) || this._matches(this.tags.COMMENT_START)) && !inComment) { + if (this.lstripBlocks && this._matches(this.tags.BLOCK_START) && this.colno > 0 && this.colno <= tok.length) { + var lastLine = tok.slice(-this.colno); + if (/^\s+$/.test(lastLine)) { + tok = tok.slice(0, -this.colno); + if (!tok.length) { + return this.nextToken(); + } + } + } + break; + } else if (this._matches(this.tags.COMMENT_END)) { + if (!inComment) { + throw new Error("unexpected end of comment"); + } + tok += this._extractString(this.tags.COMMENT_END); + break; + } else { + tok += this.current(); + this.forward(); + } + } + if (data === null && inComment) { + throw new Error("expected end of comment, got end of file"); + } + return token(inComment ? TOKEN_COMMENT : TOKEN_DATA, tok, lineno, colno); + } + } + }; + _proto._parseString = function _parseString(delimiter) { + this.forward(); + var str = ""; + while (!this.isFinished() && this.current() !== delimiter) { + var cur = this.current(); + if (cur === "\\") { + this.forward(); + switch (this.current()) { + case "n": + str += "\n"; + break; + case "t": + str += " "; + break; + case "r": + str += "\r"; + break; + default: + str += this.current(); + } + this.forward(); + } else { + str += cur; + this.forward(); + } + } + this.forward(); + return str; + }; + _proto._matches = function _matches(str) { + if (this.index + str.length > this.len) { + return null; + } + var m = this.str.slice(this.index, this.index + str.length); + return m === str; + }; + _proto._extractString = function _extractString(str) { + if (this._matches(str)) { + this.forwardN(str.length); + return str; + } + return null; + }; + _proto._extractUntil = function _extractUntil(charString) { + return this._extractMatching(true, charString || ""); + }; + _proto._extract = function _extract(charString) { + return this._extractMatching(false, charString); + }; + _proto._extractMatching = function _extractMatching(breakOnMatch, charString) { + if (this.isFinished()) { + return null; + } + var first = charString.indexOf(this.current()); + if (breakOnMatch && first === -1 || !breakOnMatch && first !== -1) { + var t = this.current(); + this.forward(); + var idx = charString.indexOf(this.current()); + while ((breakOnMatch && idx === -1 || !breakOnMatch && idx !== -1) && !this.isFinished()) { + t += this.current(); + this.forward(); + idx = charString.indexOf(this.current()); + } + return t; + } + return ""; + }; + _proto._extractRegex = function _extractRegex(regex) { + var matches = this.currentStr().match(regex); + if (!matches) { + return null; + } + this.forwardN(matches[0].length); + return matches; + }; + _proto.isFinished = function isFinished() { + return this.index >= this.len; + }; + _proto.forwardN = function forwardN(n) { + for (var i = 0; i < n; i++) { + this.forward(); + } + }; + _proto.forward = function forward() { + this.index++; + if (this.previous() === "\n") { + this.lineno++; + this.colno = 0; + } else { + this.colno++; + } + }; + _proto.backN = function backN(n) { + for (var i = 0; i < n; i++) { + this.back(); + } + }; + _proto.back = function back() { + this.index--; + if (this.current() === "\n") { + this.lineno--; + var idx = this.src.lastIndexOf("\n", this.index - 1); + if (idx === -1) { + this.colno = this.index; + } else { + this.colno = this.index - idx; + } + } else { + this.colno--; + } + }; + _proto.current = function current() { + if (!this.isFinished()) { + return this.str.charAt(this.index); + } + return ""; + }; + _proto.currentStr = function currentStr() { + if (!this.isFinished()) { + return this.str.substr(this.index); + } + return ""; + }; + _proto.previous = function previous() { + return this.str.charAt(this.index - 1); + }; + return Tokenizer2; + }(); + module2.exports = { + lex: function lex(src, opts) { + return new Tokenizer(src, opts); + }, + TOKEN_STRING, + TOKEN_WHITESPACE, + TOKEN_DATA, + TOKEN_BLOCK_START, + TOKEN_BLOCK_END, + TOKEN_VARIABLE_START, + TOKEN_VARIABLE_END, + TOKEN_COMMENT, + TOKEN_LEFT_PAREN, + TOKEN_RIGHT_PAREN, + TOKEN_LEFT_BRACKET, + TOKEN_RIGHT_BRACKET, + TOKEN_LEFT_CURLY, + TOKEN_RIGHT_CURLY, + TOKEN_OPERATOR, + TOKEN_COMMA, + TOKEN_COLON, + TOKEN_TILDE, + TOKEN_PIPE, + TOKEN_INT, + TOKEN_FLOAT, + TOKEN_BOOLEAN, + TOKEN_NONE, + TOKEN_SYMBOL, + TOKEN_SPECIAL, + TOKEN_REGEX + }; +}); + +// ../../node_modules/nunjucks/src/object.js +var require_object = __commonJS((exports2, module2) => { + "use strict"; + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) + descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) + _defineProperties(Constructor.prototype, protoProps); + if (staticProps) + _defineProperties(Constructor, staticProps); + return Constructor; + } + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + _setPrototypeOf(subClass, superClass); + } + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o2, p2) { + o2.__proto__ = p2; + return o2; + }; + return _setPrototypeOf(o, p); + } + var EventEmitter = require("events"); + var lib2 = require_lib(); + function parentWrap(parent, prop) { + if (typeof parent !== "function" || typeof prop !== "function") { + return prop; + } + return function wrap() { + var tmp = this.parent; + this.parent = parent; + var res = prop.apply(this, arguments); + this.parent = tmp; + return res; + }; + } + function extendClass(cls, name, props) { + props = props || {}; + lib2.keys(props).forEach(function(k) { + props[k] = parentWrap(cls.prototype[k], props[k]); + }); + var subclass = /* @__PURE__ */ function(_cls) { + _inheritsLoose(subclass2, _cls); + function subclass2() { + return _cls.apply(this, arguments) || this; + } + _createClass(subclass2, [{ + key: "typename", + get: function get() { + return name; + } + }]); + return subclass2; + }(cls); + lib2._assign(subclass.prototype, props); + return subclass; + } + var Obj = /* @__PURE__ */ function() { + function Obj2() { + this.init.apply(this, arguments); + } + var _proto = Obj2.prototype; + _proto.init = function init() { + }; + Obj2.extend = function extend(name, props) { + if (typeof name === "object") { + props = name; + name = "anonymous"; + } + return extendClass(this, name, props); + }; + _createClass(Obj2, [{ + key: "typename", + get: function get() { + return this.constructor.name; + } + }]); + return Obj2; + }(); + var EmitterObj = /* @__PURE__ */ function(_EventEmitter) { + _inheritsLoose(EmitterObj2, _EventEmitter); + function EmitterObj2() { + var _this2; + var _this; + _this = _EventEmitter.call(this) || this; + (_this2 = _this).init.apply(_this2, arguments); + return _this; + } + var _proto2 = EmitterObj2.prototype; + _proto2.init = function init() { + }; + EmitterObj2.extend = function extend(name, props) { + if (typeof name === "object") { + props = name; + name = "anonymous"; + } + return extendClass(this, name, props); + }; + _createClass(EmitterObj2, [{ + key: "typename", + get: function get() { + return this.constructor.name; + } + }]); + return EmitterObj2; + }(EventEmitter); + module2.exports = { + Obj, + EmitterObj + }; +}); + +// ../../node_modules/nunjucks/src/nodes.js +var require_nodes = __commonJS((exports2, module2) => { + "use strict"; + function _defineProperties(target, props) { + for (var i = 0; i < props.length; i++) { + var descriptor = props[i]; + descriptor.enumerable = descriptor.enumerable || false; + descriptor.configurable = true; + if ("value" in descriptor) + descriptor.writable = true; + Object.defineProperty(target, descriptor.key, descriptor); + } + } + function _createClass(Constructor, protoProps, staticProps) { + if (protoProps) + _defineProperties(Constructor.prototype, protoProps); + if (staticProps) + _defineProperties(Constructor, staticProps); + return Constructor; + } + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + _setPrototypeOf(subClass, superClass); + } + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o2, p2) { + o2.__proto__ = p2; + return o2; + }; + return _setPrototypeOf(o, p); + } + var _require2 = require_object(); + var Obj = _require2.Obj; + function traverseAndCheck(obj, type, results) { + if (obj instanceof type) { + results.push(obj); + } + if (obj instanceof Node) { + obj.findAll(type, results); + } + } + var Node = /* @__PURE__ */ function(_Obj) { + _inheritsLoose(Node2, _Obj); + function Node2() { + return _Obj.apply(this, arguments) || this; + } + var _proto = Node2.prototype; + _proto.init = function init(lineno, colno) { + var _arguments = arguments, _this = this; + for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) { + args[_key - 2] = arguments[_key]; + } + this.lineno = lineno; + this.colno = colno; + this.fields.forEach(function(field, i) { + var val = _arguments[i + 2]; + if (val === void 0) { + val = null; + } + _this[field] = val; + }); + }; + _proto.findAll = function findAll(type, results) { + var _this2 = this; + results = results || []; + if (this instanceof NodeList) { + this.children.forEach(function(child) { + return traverseAndCheck(child, type, results); + }); + } else { + this.fields.forEach(function(field) { + return traverseAndCheck(_this2[field], type, results); + }); + } + return results; + }; + _proto.iterFields = function iterFields(func) { + var _this3 = this; + this.fields.forEach(function(field) { + func(_this3[field], field); + }); + }; + return Node2; + }(Obj); + var Value = /* @__PURE__ */ function(_Node) { + _inheritsLoose(Value2, _Node); + function Value2() { + return _Node.apply(this, arguments) || this; + } + _createClass(Value2, [{ + key: "typename", + get: function get() { + return "Value"; + } + }, { + key: "fields", + get: function get() { + return ["value"]; + } + }]); + return Value2; + }(Node); + var NodeList = /* @__PURE__ */ function(_Node2) { + _inheritsLoose(NodeList2, _Node2); + function NodeList2() { + return _Node2.apply(this, arguments) || this; + } + var _proto2 = NodeList2.prototype; + _proto2.init = function init(lineno, colno, nodes2) { + _Node2.prototype.init.call(this, lineno, colno, nodes2 || []); + }; + _proto2.addChild = function addChild(node) { + this.children.push(node); + }; + _createClass(NodeList2, [{ + key: "typename", + get: function get() { + return "NodeList"; + } + }, { + key: "fields", + get: function get() { + return ["children"]; + } + }]); + return NodeList2; + }(Node); + var Root = NodeList.extend("Root"); + var Literal = Value.extend("Literal"); + var Symbol2 = Value.extend("Symbol"); + var Group = NodeList.extend("Group"); + var ArrayNode = NodeList.extend("Array"); + var Pair = Node.extend("Pair", { + fields: ["key", "value"] + }); + var Dict = NodeList.extend("Dict"); + var LookupVal = Node.extend("LookupVal", { + fields: ["target", "val"] + }); + var If = Node.extend("If", { + fields: ["cond", "body", "else_"] + }); + var IfAsync = If.extend("IfAsync"); + var InlineIf = Node.extend("InlineIf", { + fields: ["cond", "body", "else_"] + }); + var For = Node.extend("For", { + fields: ["arr", "name", "body", "else_"] + }); + var AsyncEach = For.extend("AsyncEach"); + var AsyncAll = For.extend("AsyncAll"); + var Macro = Node.extend("Macro", { + fields: ["name", "args", "body"] + }); + var Caller = Macro.extend("Caller"); + var Import = Node.extend("Import", { + fields: ["template", "target", "withContext"] + }); + var FromImport = /* @__PURE__ */ function(_Node3) { + _inheritsLoose(FromImport2, _Node3); + function FromImport2() { + return _Node3.apply(this, arguments) || this; + } + var _proto3 = FromImport2.prototype; + _proto3.init = function init(lineno, colno, template, names, withContext) { + _Node3.prototype.init.call(this, lineno, colno, template, names || new NodeList(), withContext); + }; + _createClass(FromImport2, [{ + key: "typename", + get: function get() { + return "FromImport"; + } + }, { + key: "fields", + get: function get() { + return ["template", "names", "withContext"]; + } + }]); + return FromImport2; + }(Node); + var FunCall = Node.extend("FunCall", { + fields: ["name", "args"] + }); + var Filter = FunCall.extend("Filter"); + var FilterAsync = Filter.extend("FilterAsync", { + fields: ["name", "args", "symbol"] + }); + var KeywordArgs = Dict.extend("KeywordArgs"); + var Block = Node.extend("Block", { + fields: ["name", "body"] + }); + var Super = Node.extend("Super", { + fields: ["blockName", "symbol"] + }); + var TemplateRef = Node.extend("TemplateRef", { + fields: ["template"] + }); + var Extends = TemplateRef.extend("Extends"); + var Include = Node.extend("Include", { + fields: ["template", "ignoreMissing"] + }); + var Set2 = Node.extend("Set", { + fields: ["targets", "value"] + }); + var Switch = Node.extend("Switch", { + fields: ["expr", "cases", "default"] + }); + var Case = Node.extend("Case", { + fields: ["cond", "body"] + }); + var Output = NodeList.extend("Output"); + var Capture = Node.extend("Capture", { + fields: ["body"] + }); + var TemplateData = Literal.extend("TemplateData"); + var UnaryOp = Node.extend("UnaryOp", { + fields: ["target"] + }); + var BinOp = Node.extend("BinOp", { + fields: ["left", "right"] + }); + var In = BinOp.extend("In"); + var Is = BinOp.extend("Is"); + var Or = BinOp.extend("Or"); + var And = BinOp.extend("And"); + var Not = UnaryOp.extend("Not"); + var Add = BinOp.extend("Add"); + var Concat = BinOp.extend("Concat"); + var Sub = BinOp.extend("Sub"); + var Mul = BinOp.extend("Mul"); + var Div = BinOp.extend("Div"); + var FloorDiv = BinOp.extend("FloorDiv"); + var Mod = BinOp.extend("Mod"); + var Pow = BinOp.extend("Pow"); + var Neg = UnaryOp.extend("Neg"); + var Pos = UnaryOp.extend("Pos"); + var Compare = Node.extend("Compare", { + fields: ["expr", "ops"] + }); + var CompareOperand = Node.extend("CompareOperand", { + fields: ["expr", "type"] + }); + var CallExtension = Node.extend("CallExtension", { + init: function init(ext, prop, args, contentArgs) { + this.parent(); + this.extName = ext.__name || ext; + this.prop = prop; + this.args = args || new NodeList(); + this.contentArgs = contentArgs || []; + this.autoescape = ext.autoescape; + }, + fields: ["extName", "prop", "args", "contentArgs"] + }); + var CallExtensionAsync = CallExtension.extend("CallExtensionAsync"); + function print(str, indent, inline) { + var lines = str.split("\n"); + lines.forEach(function(line, i) { + if (line && (inline && i > 0 || !inline)) { + process.stdout.write(" ".repeat(indent)); + } + var nl = i === lines.length - 1 ? "" : "\n"; + process.stdout.write("" + line + nl); + }); + } + function printNodes(node, indent) { + indent = indent || 0; + print(node.typename + ": ", indent); + if (node instanceof NodeList) { + print("\n"); + node.children.forEach(function(n) { + printNodes(n, indent + 2); + }); + } else if (node instanceof CallExtension) { + print(node.extName + "." + node.prop + "\n"); + if (node.args) { + printNodes(node.args, indent + 2); + } + if (node.contentArgs) { + node.contentArgs.forEach(function(n) { + printNodes(n, indent + 2); + }); + } + } else { + var nodes2 = []; + var props = null; + node.iterFields(function(val, fieldName) { + if (val instanceof Node) { + nodes2.push([fieldName, val]); + } else { + props = props || {}; + props[fieldName] = val; + } + }); + if (props) { + print(JSON.stringify(props, null, 2) + "\n", null, true); + } else { + print("\n"); + } + nodes2.forEach(function(_ref) { + var fieldName = _ref[0], n = _ref[1]; + print("[" + fieldName + "] =>", indent + 2); + printNodes(n, indent + 4); + }); + } + } + module2.exports = { + Node, + Root, + NodeList, + Value, + Literal, + Symbol: Symbol2, + Group, + Array: ArrayNode, + Pair, + Dict, + Output, + Capture, + TemplateData, + If, + IfAsync, + InlineIf, + For, + AsyncEach, + AsyncAll, + Macro, + Caller, + Import, + FromImport, + FunCall, + Filter, + FilterAsync, + KeywordArgs, + Block, + Super, + Extends, + Include, + Set: Set2, + Switch, + Case, + LookupVal, + BinOp, + In, + Is, + Or, + And, + Not, + Add, + Concat, + Sub, + Mul, + Div, + FloorDiv, + Mod, + Pow, + Neg, + Pos, + Compare, + CompareOperand, + CallExtension, + CallExtensionAsync, + printNodes + }; +}); + +// ../../node_modules/nunjucks/src/parser.js +var require_parser = __commonJS((exports2, module2) => { + "use strict"; + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + _setPrototypeOf(subClass, superClass); + } + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o2, p2) { + o2.__proto__ = p2; + return o2; + }; + return _setPrototypeOf(o, p); + } + var lexer2 = require_lexer(); + var nodes2 = require_nodes(); + var Obj = require_object().Obj; + var lib2 = require_lib(); + var Parser = /* @__PURE__ */ function(_Obj) { + _inheritsLoose(Parser2, _Obj); + function Parser2() { + return _Obj.apply(this, arguments) || this; + } + var _proto = Parser2.prototype; + _proto.init = function init(tokens) { + this.tokens = tokens; + this.peeked = null; + this.breakOnBlocks = null; + this.dropLeadingWhitespace = false; + this.extensions = []; + }; + _proto.nextToken = function nextToken(withWhitespace) { + var tok; + if (this.peeked) { + if (!withWhitespace && this.peeked.type === lexer2.TOKEN_WHITESPACE) { + this.peeked = null; + } else { + tok = this.peeked; + this.peeked = null; + return tok; + } + } + tok = this.tokens.nextToken(); + if (!withWhitespace) { + while (tok && tok.type === lexer2.TOKEN_WHITESPACE) { + tok = this.tokens.nextToken(); + } + } + return tok; + }; + _proto.peekToken = function peekToken() { + this.peeked = this.peeked || this.nextToken(); + return this.peeked; + }; + _proto.pushToken = function pushToken(tok) { + if (this.peeked) { + throw new Error("pushToken: can only push one token on between reads"); + } + this.peeked = tok; + }; + _proto.error = function error(msg, lineno, colno) { + if (lineno === void 0 || colno === void 0) { + var tok = this.peekToken() || {}; + lineno = tok.lineno; + colno = tok.colno; + } + if (lineno !== void 0) { + lineno += 1; + } + if (colno !== void 0) { + colno += 1; + } + return new lib2.TemplateError(msg, lineno, colno); + }; + _proto.fail = function fail(msg, lineno, colno) { + throw this.error(msg, lineno, colno); + }; + _proto.skip = function skip(type) { + var tok = this.nextToken(); + if (!tok || tok.type !== type) { + this.pushToken(tok); + return false; + } + return true; + }; + _proto.expect = function expect(type) { + var tok = this.nextToken(); + if (tok.type !== type) { + this.fail("expected " + type + ", got " + tok.type, tok.lineno, tok.colno); + } + return tok; + }; + _proto.skipValue = function skipValue(type, val) { + var tok = this.nextToken(); + if (!tok || tok.type !== type || tok.value !== val) { + this.pushToken(tok); + return false; + } + return true; + }; + _proto.skipSymbol = function skipSymbol(val) { + return this.skipValue(lexer2.TOKEN_SYMBOL, val); + }; + _proto.advanceAfterBlockEnd = function advanceAfterBlockEnd(name) { + var tok; + if (!name) { + tok = this.peekToken(); + if (!tok) { + this.fail("unexpected end of file"); + } + if (tok.type !== lexer2.TOKEN_SYMBOL) { + this.fail("advanceAfterBlockEnd: expected symbol token or explicit name to be passed"); + } + name = this.nextToken().value; + } + tok = this.nextToken(); + if (tok && tok.type === lexer2.TOKEN_BLOCK_END) { + if (tok.value.charAt(0) === "-") { + this.dropLeadingWhitespace = true; + } + } else { + this.fail("expected block end in " + name + " statement"); + } + return tok; + }; + _proto.advanceAfterVariableEnd = function advanceAfterVariableEnd() { + var tok = this.nextToken(); + if (tok && tok.type === lexer2.TOKEN_VARIABLE_END) { + this.dropLeadingWhitespace = tok.value.charAt(tok.value.length - this.tokens.tags.VARIABLE_END.length - 1) === "-"; + } else { + this.pushToken(tok); + this.fail("expected variable end"); + } + }; + _proto.parseFor = function parseFor() { + var forTok = this.peekToken(); + var node; + var endBlock; + if (this.skipSymbol("for")) { + node = new nodes2.For(forTok.lineno, forTok.colno); + endBlock = "endfor"; + } else if (this.skipSymbol("asyncEach")) { + node = new nodes2.AsyncEach(forTok.lineno, forTok.colno); + endBlock = "endeach"; + } else if (this.skipSymbol("asyncAll")) { + node = new nodes2.AsyncAll(forTok.lineno, forTok.colno); + endBlock = "endall"; + } else { + this.fail("parseFor: expected for{Async}", forTok.lineno, forTok.colno); + } + node.name = this.parsePrimary(); + if (!(node.name instanceof nodes2.Symbol)) { + this.fail("parseFor: variable name expected for loop"); + } + var type = this.peekToken().type; + if (type === lexer2.TOKEN_COMMA) { + var key = node.name; + node.name = new nodes2.Array(key.lineno, key.colno); + node.name.addChild(key); + while (this.skip(lexer2.TOKEN_COMMA)) { + var prim = this.parsePrimary(); + node.name.addChild(prim); + } + } + if (!this.skipSymbol("in")) { + this.fail('parseFor: expected "in" keyword for loop', forTok.lineno, forTok.colno); + } + node.arr = this.parseExpression(); + this.advanceAfterBlockEnd(forTok.value); + node.body = this.parseUntilBlocks(endBlock, "else"); + if (this.skipSymbol("else")) { + this.advanceAfterBlockEnd("else"); + node.else_ = this.parseUntilBlocks(endBlock); + } + this.advanceAfterBlockEnd(); + return node; + }; + _proto.parseMacro = function parseMacro() { + var macroTok = this.peekToken(); + if (!this.skipSymbol("macro")) { + this.fail("expected macro"); + } + var name = this.parsePrimary(true); + var args = this.parseSignature(); + var node = new nodes2.Macro(macroTok.lineno, macroTok.colno, name, args); + this.advanceAfterBlockEnd(macroTok.value); + node.body = this.parseUntilBlocks("endmacro"); + this.advanceAfterBlockEnd(); + return node; + }; + _proto.parseCall = function parseCall() { + var callTok = this.peekToken(); + if (!this.skipSymbol("call")) { + this.fail("expected call"); + } + var callerArgs = this.parseSignature(true) || new nodes2.NodeList(); + var macroCall = this.parsePrimary(); + this.advanceAfterBlockEnd(callTok.value); + var body = this.parseUntilBlocks("endcall"); + this.advanceAfterBlockEnd(); + var callerName = new nodes2.Symbol(callTok.lineno, callTok.colno, "caller"); + var callerNode = new nodes2.Caller(callTok.lineno, callTok.colno, callerName, callerArgs, body); + var args = macroCall.args.children; + if (!(args[args.length - 1] instanceof nodes2.KeywordArgs)) { + args.push(new nodes2.KeywordArgs()); + } + var kwargs = args[args.length - 1]; + kwargs.addChild(new nodes2.Pair(callTok.lineno, callTok.colno, callerName, callerNode)); + return new nodes2.Output(callTok.lineno, callTok.colno, [macroCall]); + }; + _proto.parseWithContext = function parseWithContext() { + var tok = this.peekToken(); + var withContext = null; + if (this.skipSymbol("with")) { + withContext = true; + } else if (this.skipSymbol("without")) { + withContext = false; + } + if (withContext !== null) { + if (!this.skipSymbol("context")) { + this.fail("parseFrom: expected context after with/without", tok.lineno, tok.colno); + } + } + return withContext; + }; + _proto.parseImport = function parseImport() { + var importTok = this.peekToken(); + if (!this.skipSymbol("import")) { + this.fail("parseImport: expected import", importTok.lineno, importTok.colno); + } + var template = this.parseExpression(); + if (!this.skipSymbol("as")) { + this.fail('parseImport: expected "as" keyword', importTok.lineno, importTok.colno); + } + var target = this.parseExpression(); + var withContext = this.parseWithContext(); + var node = new nodes2.Import(importTok.lineno, importTok.colno, template, target, withContext); + this.advanceAfterBlockEnd(importTok.value); + return node; + }; + _proto.parseFrom = function parseFrom() { + var fromTok = this.peekToken(); + if (!this.skipSymbol("from")) { + this.fail("parseFrom: expected from"); + } + var template = this.parseExpression(); + if (!this.skipSymbol("import")) { + this.fail("parseFrom: expected import", fromTok.lineno, fromTok.colno); + } + var names = new nodes2.NodeList(); + var withContext; + while (1) { + var nextTok = this.peekToken(); + if (nextTok.type === lexer2.TOKEN_BLOCK_END) { + if (!names.children.length) { + this.fail("parseFrom: Expected at least one import name", fromTok.lineno, fromTok.colno); + } + if (nextTok.value.charAt(0) === "-") { + this.dropLeadingWhitespace = true; + } + this.nextToken(); + break; + } + if (names.children.length > 0 && !this.skip(lexer2.TOKEN_COMMA)) { + this.fail("parseFrom: expected comma", fromTok.lineno, fromTok.colno); + } + var name = this.parsePrimary(); + if (name.value.charAt(0) === "_") { + this.fail("parseFrom: names starting with an underscore cannot be imported", name.lineno, name.colno); + } + if (this.skipSymbol("as")) { + var alias = this.parsePrimary(); + names.addChild(new nodes2.Pair(name.lineno, name.colno, name, alias)); + } else { + names.addChild(name); + } + withContext = this.parseWithContext(); + } + return new nodes2.FromImport(fromTok.lineno, fromTok.colno, template, names, withContext); + }; + _proto.parseBlock = function parseBlock() { + var tag = this.peekToken(); + if (!this.skipSymbol("block")) { + this.fail("parseBlock: expected block", tag.lineno, tag.colno); + } + var node = new nodes2.Block(tag.lineno, tag.colno); + node.name = this.parsePrimary(); + if (!(node.name instanceof nodes2.Symbol)) { + this.fail("parseBlock: variable name expected", tag.lineno, tag.colno); + } + this.advanceAfterBlockEnd(tag.value); + node.body = this.parseUntilBlocks("endblock"); + this.skipSymbol("endblock"); + this.skipSymbol(node.name.value); + var tok = this.peekToken(); + if (!tok) { + this.fail("parseBlock: expected endblock, got end of file"); + } + this.advanceAfterBlockEnd(tok.value); + return node; + }; + _proto.parseExtends = function parseExtends() { + var tagName = "extends"; + var tag = this.peekToken(); + if (!this.skipSymbol(tagName)) { + this.fail("parseTemplateRef: expected " + tagName); + } + var node = new nodes2.Extends(tag.lineno, tag.colno); + node.template = this.parseExpression(); + this.advanceAfterBlockEnd(tag.value); + return node; + }; + _proto.parseInclude = function parseInclude() { + var tagName = "include"; + var tag = this.peekToken(); + if (!this.skipSymbol(tagName)) { + this.fail("parseInclude: expected " + tagName); + } + var node = new nodes2.Include(tag.lineno, tag.colno); + node.template = this.parseExpression(); + if (this.skipSymbol("ignore") && this.skipSymbol("missing")) { + node.ignoreMissing = true; + } + this.advanceAfterBlockEnd(tag.value); + return node; + }; + _proto.parseIf = function parseIf() { + var tag = this.peekToken(); + var node; + if (this.skipSymbol("if") || this.skipSymbol("elif") || this.skipSymbol("elseif")) { + node = new nodes2.If(tag.lineno, tag.colno); + } else if (this.skipSymbol("ifAsync")) { + node = new nodes2.IfAsync(tag.lineno, tag.colno); + } else { + this.fail("parseIf: expected if, elif, or elseif", tag.lineno, tag.colno); + } + node.cond = this.parseExpression(); + this.advanceAfterBlockEnd(tag.value); + node.body = this.parseUntilBlocks("elif", "elseif", "else", "endif"); + var tok = this.peekToken(); + switch (tok && tok.value) { + case "elseif": + case "elif": + node.else_ = this.parseIf(); + break; + case "else": + this.advanceAfterBlockEnd(); + node.else_ = this.parseUntilBlocks("endif"); + this.advanceAfterBlockEnd(); + break; + case "endif": + node.else_ = null; + this.advanceAfterBlockEnd(); + break; + default: + this.fail("parseIf: expected elif, else, or endif, got end of file"); + } + return node; + }; + _proto.parseSet = function parseSet() { + var tag = this.peekToken(); + if (!this.skipSymbol("set")) { + this.fail("parseSet: expected set", tag.lineno, tag.colno); + } + var node = new nodes2.Set(tag.lineno, tag.colno, []); + var target; + while (target = this.parsePrimary()) { + node.targets.push(target); + if (!this.skip(lexer2.TOKEN_COMMA)) { + break; + } + } + if (!this.skipValue(lexer2.TOKEN_OPERATOR, "=")) { + if (!this.skip(lexer2.TOKEN_BLOCK_END)) { + this.fail("parseSet: expected = or block end in set tag", tag.lineno, tag.colno); + } else { + node.body = new nodes2.Capture(tag.lineno, tag.colno, this.parseUntilBlocks("endset")); + node.value = null; + this.advanceAfterBlockEnd(); + } + } else { + node.value = this.parseExpression(); + this.advanceAfterBlockEnd(tag.value); + } + return node; + }; + _proto.parseSwitch = function parseSwitch() { + var switchStart = "switch"; + var switchEnd = "endswitch"; + var caseStart = "case"; + var caseDefault = "default"; + var tag = this.peekToken(); + if (!this.skipSymbol(switchStart) && !this.skipSymbol(caseStart) && !this.skipSymbol(caseDefault)) { + this.fail('parseSwitch: expected "switch," "case" or "default"', tag.lineno, tag.colno); + } + var expr = this.parseExpression(); + this.advanceAfterBlockEnd(switchStart); + this.parseUntilBlocks(caseStart, caseDefault, switchEnd); + var tok = this.peekToken(); + var cases = []; + var defaultCase; + do { + this.skipSymbol(caseStart); + var cond = this.parseExpression(); + this.advanceAfterBlockEnd(switchStart); + var body = this.parseUntilBlocks(caseStart, caseDefault, switchEnd); + cases.push(new nodes2.Case(tok.line, tok.col, cond, body)); + tok = this.peekToken(); + } while (tok && tok.value === caseStart); + switch (tok.value) { + case caseDefault: + this.advanceAfterBlockEnd(); + defaultCase = this.parseUntilBlocks(switchEnd); + this.advanceAfterBlockEnd(); + break; + case switchEnd: + this.advanceAfterBlockEnd(); + break; + default: + this.fail('parseSwitch: expected "case," "default" or "endswitch," got EOF.'); + } + return new nodes2.Switch(tag.lineno, tag.colno, expr, cases, defaultCase); + }; + _proto.parseStatement = function parseStatement() { + var tok = this.peekToken(); + var node; + if (tok.type !== lexer2.TOKEN_SYMBOL) { + this.fail("tag name expected", tok.lineno, tok.colno); + } + if (this.breakOnBlocks && lib2.indexOf(this.breakOnBlocks, tok.value) !== -1) { + return null; + } + switch (tok.value) { + case "raw": + return this.parseRaw(); + case "verbatim": + return this.parseRaw("verbatim"); + case "if": + case "ifAsync": + return this.parseIf(); + case "for": + case "asyncEach": + case "asyncAll": + return this.parseFor(); + case "block": + return this.parseBlock(); + case "extends": + return this.parseExtends(); + case "include": + return this.parseInclude(); + case "set": + return this.parseSet(); + case "macro": + return this.parseMacro(); + case "call": + return this.parseCall(); + case "import": + return this.parseImport(); + case "from": + return this.parseFrom(); + case "filter": + return this.parseFilterStatement(); + case "switch": + return this.parseSwitch(); + default: + if (this.extensions.length) { + for (var i = 0; i < this.extensions.length; i++) { + var ext = this.extensions[i]; + if (lib2.indexOf(ext.tags || [], tok.value) !== -1) { + return ext.parse(this, nodes2, lexer2); + } + } + } + this.fail("unknown block tag: " + tok.value, tok.lineno, tok.colno); + } + return node; + }; + _proto.parseRaw = function parseRaw(tagName) { + tagName = tagName || "raw"; + var endTagName = "end" + tagName; + var rawBlockRegex = new RegExp("([\\s\\S]*?){%\\s*(" + tagName + "|" + endTagName + ")\\s*(?=%})%}"); + var rawLevel = 1; + var str = ""; + var matches = null; + var begun = this.advanceAfterBlockEnd(); + while ((matches = this.tokens._extractRegex(rawBlockRegex)) && rawLevel > 0) { + var all = matches[0]; + var pre = matches[1]; + var blockName = matches[2]; + if (blockName === tagName) { + rawLevel += 1; + } else if (blockName === endTagName) { + rawLevel -= 1; + } + if (rawLevel === 0) { + str += pre; + this.tokens.backN(all.length - pre.length); + } else { + str += all; + } + } + return new nodes2.Output(begun.lineno, begun.colno, [new nodes2.TemplateData(begun.lineno, begun.colno, str)]); + }; + _proto.parsePostfix = function parsePostfix(node) { + var lookup; + var tok = this.peekToken(); + while (tok) { + if (tok.type === lexer2.TOKEN_LEFT_PAREN) { + node = new nodes2.FunCall(tok.lineno, tok.colno, node, this.parseSignature()); + } else if (tok.type === lexer2.TOKEN_LEFT_BRACKET) { + lookup = this.parseAggregate(); + if (lookup.children.length > 1) { + this.fail("invalid index"); + } + node = new nodes2.LookupVal(tok.lineno, tok.colno, node, lookup.children[0]); + } else if (tok.type === lexer2.TOKEN_OPERATOR && tok.value === ".") { + this.nextToken(); + var val = this.nextToken(); + if (val.type !== lexer2.TOKEN_SYMBOL) { + this.fail("expected name as lookup value, got " + val.value, val.lineno, val.colno); + } + lookup = new nodes2.Literal(val.lineno, val.colno, val.value); + node = new nodes2.LookupVal(tok.lineno, tok.colno, node, lookup); + } else { + break; + } + tok = this.peekToken(); + } + return node; + }; + _proto.parseExpression = function parseExpression() { + var node = this.parseInlineIf(); + return node; + }; + _proto.parseInlineIf = function parseInlineIf() { + var node = this.parseOr(); + if (this.skipSymbol("if")) { + var condNode = this.parseOr(); + var bodyNode = node; + node = new nodes2.InlineIf(node.lineno, node.colno); + node.body = bodyNode; + node.cond = condNode; + if (this.skipSymbol("else")) { + node.else_ = this.parseOr(); + } else { + node.else_ = null; + } + } + return node; + }; + _proto.parseOr = function parseOr() { + var node = this.parseAnd(); + while (this.skipSymbol("or")) { + var node2 = this.parseAnd(); + node = new nodes2.Or(node.lineno, node.colno, node, node2); + } + return node; + }; + _proto.parseAnd = function parseAnd() { + var node = this.parseNot(); + while (this.skipSymbol("and")) { + var node2 = this.parseNot(); + node = new nodes2.And(node.lineno, node.colno, node, node2); + } + return node; + }; + _proto.parseNot = function parseNot() { + var tok = this.peekToken(); + if (this.skipSymbol("not")) { + return new nodes2.Not(tok.lineno, tok.colno, this.parseNot()); + } + return this.parseIn(); + }; + _proto.parseIn = function parseIn() { + var node = this.parseIs(); + while (1) { + var tok = this.nextToken(); + if (!tok) { + break; + } + var invert = tok.type === lexer2.TOKEN_SYMBOL && tok.value === "not"; + if (!invert) { + this.pushToken(tok); + } + if (this.skipSymbol("in")) { + var node2 = this.parseIs(); + node = new nodes2.In(node.lineno, node.colno, node, node2); + if (invert) { + node = new nodes2.Not(node.lineno, node.colno, node); + } + } else { + if (invert) { + this.pushToken(tok); + } + break; + } + } + return node; + }; + _proto.parseIs = function parseIs() { + var node = this.parseCompare(); + if (this.skipSymbol("is")) { + var not = this.skipSymbol("not"); + var node2 = this.parseCompare(); + node = new nodes2.Is(node.lineno, node.colno, node, node2); + if (not) { + node = new nodes2.Not(node.lineno, node.colno, node); + } + } + return node; + }; + _proto.parseCompare = function parseCompare() { + var compareOps = ["==", "===", "!=", "!==", "<", ">", "<=", ">="]; + var expr = this.parseConcat(); + var ops = []; + while (1) { + var tok = this.nextToken(); + if (!tok) { + break; + } else if (compareOps.indexOf(tok.value) !== -1) { + ops.push(new nodes2.CompareOperand(tok.lineno, tok.colno, this.parseConcat(), tok.value)); + } else { + this.pushToken(tok); + break; + } + } + if (ops.length) { + return new nodes2.Compare(ops[0].lineno, ops[0].colno, expr, ops); + } else { + return expr; + } + }; + _proto.parseConcat = function parseConcat() { + var node = this.parseAdd(); + while (this.skipValue(lexer2.TOKEN_TILDE, "~")) { + var node2 = this.parseAdd(); + node = new nodes2.Concat(node.lineno, node.colno, node, node2); + } + return node; + }; + _proto.parseAdd = function parseAdd() { + var node = this.parseSub(); + while (this.skipValue(lexer2.TOKEN_OPERATOR, "+")) { + var node2 = this.parseSub(); + node = new nodes2.Add(node.lineno, node.colno, node, node2); + } + return node; + }; + _proto.parseSub = function parseSub() { + var node = this.parseMul(); + while (this.skipValue(lexer2.TOKEN_OPERATOR, "-")) { + var node2 = this.parseMul(); + node = new nodes2.Sub(node.lineno, node.colno, node, node2); + } + return node; + }; + _proto.parseMul = function parseMul() { + var node = this.parseDiv(); + while (this.skipValue(lexer2.TOKEN_OPERATOR, "*")) { + var node2 = this.parseDiv(); + node = new nodes2.Mul(node.lineno, node.colno, node, node2); + } + return node; + }; + _proto.parseDiv = function parseDiv() { + var node = this.parseFloorDiv(); + while (this.skipValue(lexer2.TOKEN_OPERATOR, "/")) { + var node2 = this.parseFloorDiv(); + node = new nodes2.Div(node.lineno, node.colno, node, node2); + } + return node; + }; + _proto.parseFloorDiv = function parseFloorDiv() { + var node = this.parseMod(); + while (this.skipValue(lexer2.TOKEN_OPERATOR, "//")) { + var node2 = this.parseMod(); + node = new nodes2.FloorDiv(node.lineno, node.colno, node, node2); + } + return node; + }; + _proto.parseMod = function parseMod() { + var node = this.parsePow(); + while (this.skipValue(lexer2.TOKEN_OPERATOR, "%")) { + var node2 = this.parsePow(); + node = new nodes2.Mod(node.lineno, node.colno, node, node2); + } + return node; + }; + _proto.parsePow = function parsePow() { + var node = this.parseUnary(); + while (this.skipValue(lexer2.TOKEN_OPERATOR, "**")) { + var node2 = this.parseUnary(); + node = new nodes2.Pow(node.lineno, node.colno, node, node2); + } + return node; + }; + _proto.parseUnary = function parseUnary(noFilters) { + var tok = this.peekToken(); + var node; + if (this.skipValue(lexer2.TOKEN_OPERATOR, "-")) { + node = new nodes2.Neg(tok.lineno, tok.colno, this.parseUnary(true)); + } else if (this.skipValue(lexer2.TOKEN_OPERATOR, "+")) { + node = new nodes2.Pos(tok.lineno, tok.colno, this.parseUnary(true)); + } else { + node = this.parsePrimary(); + } + if (!noFilters) { + node = this.parseFilter(node); + } + return node; + }; + _proto.parsePrimary = function parsePrimary(noPostfix) { + var tok = this.nextToken(); + var val; + var node = null; + if (!tok) { + this.fail("expected expression, got end of file"); + } else if (tok.type === lexer2.TOKEN_STRING) { + val = tok.value; + } else if (tok.type === lexer2.TOKEN_INT) { + val = parseInt(tok.value, 10); + } else if (tok.type === lexer2.TOKEN_FLOAT) { + val = parseFloat(tok.value); + } else if (tok.type === lexer2.TOKEN_BOOLEAN) { + if (tok.value === "true") { + val = true; + } else if (tok.value === "false") { + val = false; + } else { + this.fail("invalid boolean: " + tok.value, tok.lineno, tok.colno); + } + } else if (tok.type === lexer2.TOKEN_NONE) { + val = null; + } else if (tok.type === lexer2.TOKEN_REGEX) { + val = new RegExp(tok.value.body, tok.value.flags); + } + if (val !== void 0) { + node = new nodes2.Literal(tok.lineno, tok.colno, val); + } else if (tok.type === lexer2.TOKEN_SYMBOL) { + node = new nodes2.Symbol(tok.lineno, tok.colno, tok.value); + } else { + this.pushToken(tok); + node = this.parseAggregate(); + } + if (!noPostfix) { + node = this.parsePostfix(node); + } + if (node) { + return node; + } else { + throw this.error("unexpected token: " + tok.value, tok.lineno, tok.colno); + } + }; + _proto.parseFilterName = function parseFilterName() { + var tok = this.expect(lexer2.TOKEN_SYMBOL); + var name = tok.value; + while (this.skipValue(lexer2.TOKEN_OPERATOR, ".")) { + name += "." + this.expect(lexer2.TOKEN_SYMBOL).value; + } + return new nodes2.Symbol(tok.lineno, tok.colno, name); + }; + _proto.parseFilterArgs = function parseFilterArgs(node) { + if (this.peekToken().type === lexer2.TOKEN_LEFT_PAREN) { + var call = this.parsePostfix(node); + return call.args.children; + } + return []; + }; + _proto.parseFilter = function parseFilter(node) { + while (this.skip(lexer2.TOKEN_PIPE)) { + var name = this.parseFilterName(); + node = new nodes2.Filter(name.lineno, name.colno, name, new nodes2.NodeList(name.lineno, name.colno, [node].concat(this.parseFilterArgs(node)))); + } + return node; + }; + _proto.parseFilterStatement = function parseFilterStatement() { + var filterTok = this.peekToken(); + if (!this.skipSymbol("filter")) { + this.fail("parseFilterStatement: expected filter"); + } + var name = this.parseFilterName(); + var args = this.parseFilterArgs(name); + this.advanceAfterBlockEnd(filterTok.value); + var body = new nodes2.Capture(name.lineno, name.colno, this.parseUntilBlocks("endfilter")); + this.advanceAfterBlockEnd(); + var node = new nodes2.Filter(name.lineno, name.colno, name, new nodes2.NodeList(name.lineno, name.colno, [body].concat(args))); + return new nodes2.Output(name.lineno, name.colno, [node]); + }; + _proto.parseAggregate = function parseAggregate() { + var tok = this.nextToken(); + var node; + switch (tok.type) { + case lexer2.TOKEN_LEFT_PAREN: + node = new nodes2.Group(tok.lineno, tok.colno); + break; + case lexer2.TOKEN_LEFT_BRACKET: + node = new nodes2.Array(tok.lineno, tok.colno); + break; + case lexer2.TOKEN_LEFT_CURLY: + node = new nodes2.Dict(tok.lineno, tok.colno); + break; + default: + return null; + } + while (1) { + var type = this.peekToken().type; + if (type === lexer2.TOKEN_RIGHT_PAREN || type === lexer2.TOKEN_RIGHT_BRACKET || type === lexer2.TOKEN_RIGHT_CURLY) { + this.nextToken(); + break; + } + if (node.children.length > 0) { + if (!this.skip(lexer2.TOKEN_COMMA)) { + this.fail("parseAggregate: expected comma after expression", tok.lineno, tok.colno); + } + } + if (node instanceof nodes2.Dict) { + var key = this.parsePrimary(); + if (!this.skip(lexer2.TOKEN_COLON)) { + this.fail("parseAggregate: expected colon after dict key", tok.lineno, tok.colno); + } + var value = this.parseExpression(); + node.addChild(new nodes2.Pair(key.lineno, key.colno, key, value)); + } else { + var expr = this.parseExpression(); + node.addChild(expr); + } + } + return node; + }; + _proto.parseSignature = function parseSignature(tolerant, noParens) { + var tok = this.peekToken(); + if (!noParens && tok.type !== lexer2.TOKEN_LEFT_PAREN) { + if (tolerant) { + return null; + } else { + this.fail("expected arguments", tok.lineno, tok.colno); + } + } + if (tok.type === lexer2.TOKEN_LEFT_PAREN) { + tok = this.nextToken(); + } + var args = new nodes2.NodeList(tok.lineno, tok.colno); + var kwargs = new nodes2.KeywordArgs(tok.lineno, tok.colno); + var checkComma = false; + while (1) { + tok = this.peekToken(); + if (!noParens && tok.type === lexer2.TOKEN_RIGHT_PAREN) { + this.nextToken(); + break; + } else if (noParens && tok.type === lexer2.TOKEN_BLOCK_END) { + break; + } + if (checkComma && !this.skip(lexer2.TOKEN_COMMA)) { + this.fail("parseSignature: expected comma after expression", tok.lineno, tok.colno); + } else { + var arg = this.parseExpression(); + if (this.skipValue(lexer2.TOKEN_OPERATOR, "=")) { + kwargs.addChild(new nodes2.Pair(arg.lineno, arg.colno, arg, this.parseExpression())); + } else { + args.addChild(arg); + } + } + checkComma = true; + } + if (kwargs.children.length) { + args.addChild(kwargs); + } + return args; + }; + _proto.parseUntilBlocks = function parseUntilBlocks() { + var prev = this.breakOnBlocks; + for (var _len = arguments.length, blockNames = new Array(_len), _key = 0; _key < _len; _key++) { + blockNames[_key] = arguments[_key]; + } + this.breakOnBlocks = blockNames; + var ret = this.parse(); + this.breakOnBlocks = prev; + return ret; + }; + _proto.parseNodes = function parseNodes() { + var tok; + var buf = []; + while (tok = this.nextToken()) { + if (tok.type === lexer2.TOKEN_DATA) { + var data = tok.value; + var nextToken = this.peekToken(); + var nextVal = nextToken && nextToken.value; + if (this.dropLeadingWhitespace) { + data = data.replace(/^\s*/, ""); + this.dropLeadingWhitespace = false; + } + if (nextToken && (nextToken.type === lexer2.TOKEN_BLOCK_START && nextVal.charAt(nextVal.length - 1) === "-" || nextToken.type === lexer2.TOKEN_VARIABLE_START && nextVal.charAt(this.tokens.tags.VARIABLE_START.length) === "-" || nextToken.type === lexer2.TOKEN_COMMENT && nextVal.charAt(this.tokens.tags.COMMENT_START.length) === "-")) { + data = data.replace(/\s*$/, ""); + } + buf.push(new nodes2.Output(tok.lineno, tok.colno, [new nodes2.TemplateData(tok.lineno, tok.colno, data)])); + } else if (tok.type === lexer2.TOKEN_BLOCK_START) { + this.dropLeadingWhitespace = false; + var n = this.parseStatement(); + if (!n) { + break; + } + buf.push(n); + } else if (tok.type === lexer2.TOKEN_VARIABLE_START) { + var e2 = this.parseExpression(); + this.dropLeadingWhitespace = false; + this.advanceAfterVariableEnd(); + buf.push(new nodes2.Output(tok.lineno, tok.colno, [e2])); + } else if (tok.type === lexer2.TOKEN_COMMENT) { + this.dropLeadingWhitespace = tok.value.charAt(tok.value.length - this.tokens.tags.COMMENT_END.length - 1) === "-"; + } else { + this.fail("Unexpected token at top-level: " + tok.type, tok.lineno, tok.colno); + } + } + return buf; + }; + _proto.parse = function parse() { + return new nodes2.NodeList(0, 0, this.parseNodes()); + }; + _proto.parseAsRoot = function parseAsRoot() { + return new nodes2.Root(0, 0, this.parseNodes()); + }; + return Parser2; + }(Obj); + module2.exports = { + parse: function parse(src, extensions, opts) { + var p = new Parser(lexer2.lex(src, opts)); + if (extensions !== void 0) { + p.extensions = extensions; + } + return p.parseAsRoot(); + }, + Parser + }; +}); + +// ../../node_modules/nunjucks/src/transformer.js +var require_transformer = __commonJS((exports2, module2) => { + "use strict"; + var nodes2 = require_nodes(); + var lib2 = require_lib(); + var sym = 0; + function gensym() { + return "hole_" + sym++; + } + function mapCOW(arr, func) { + var res = null; + for (var i = 0; i < arr.length; i++) { + var item = func(arr[i]); + if (item !== arr[i]) { + if (!res) { + res = arr.slice(); + } + res[i] = item; + } + } + return res || arr; + } + function walk(ast, func, depthFirst) { + if (!(ast instanceof nodes2.Node)) { + return ast; + } + if (!depthFirst) { + var astT = func(ast); + if (astT && astT !== ast) { + return astT; + } + } + if (ast instanceof nodes2.NodeList) { + var children = mapCOW(ast.children, function(node) { + return walk(node, func, depthFirst); + }); + if (children !== ast.children) { + ast = new nodes2[ast.typename](ast.lineno, ast.colno, children); + } + } else if (ast instanceof nodes2.CallExtension) { + var args = walk(ast.args, func, depthFirst); + var contentArgs = mapCOW(ast.contentArgs, function(node) { + return walk(node, func, depthFirst); + }); + if (args !== ast.args || contentArgs !== ast.contentArgs) { + ast = new nodes2[ast.typename](ast.extName, ast.prop, args, contentArgs); + } + } else { + var props = ast.fields.map(function(field) { + return ast[field]; + }); + var propsT = mapCOW(props, function(prop) { + return walk(prop, func, depthFirst); + }); + if (propsT !== props) { + ast = new nodes2[ast.typename](ast.lineno, ast.colno); + propsT.forEach(function(prop, i) { + ast[ast.fields[i]] = prop; + }); + } + } + return depthFirst ? func(ast) || ast : ast; + } + function depthWalk(ast, func) { + return walk(ast, func, true); + } + function _liftFilters(node, asyncFilters, prop) { + var children = []; + var walked = depthWalk(prop ? node[prop] : node, function(descNode) { + var symbol; + if (descNode instanceof nodes2.Block) { + return descNode; + } else if (descNode instanceof nodes2.Filter && lib2.indexOf(asyncFilters, descNode.name.value) !== -1 || descNode instanceof nodes2.CallExtensionAsync) { + symbol = new nodes2.Symbol(descNode.lineno, descNode.colno, gensym()); + children.push(new nodes2.FilterAsync(descNode.lineno, descNode.colno, descNode.name, descNode.args, symbol)); + } + return symbol; + }); + if (prop) { + node[prop] = walked; + } else { + node = walked; + } + if (children.length) { + children.push(node); + return new nodes2.NodeList(node.lineno, node.colno, children); + } else { + return node; + } + } + function liftFilters(ast, asyncFilters) { + return depthWalk(ast, function(node) { + if (node instanceof nodes2.Output) { + return _liftFilters(node, asyncFilters); + } else if (node instanceof nodes2.Set) { + return _liftFilters(node, asyncFilters, "value"); + } else if (node instanceof nodes2.For) { + return _liftFilters(node, asyncFilters, "arr"); + } else if (node instanceof nodes2.If) { + return _liftFilters(node, asyncFilters, "cond"); + } else if (node instanceof nodes2.CallExtension) { + return _liftFilters(node, asyncFilters, "args"); + } else { + return void 0; + } + }); + } + function liftSuper(ast) { + return walk(ast, function(blockNode) { + if (!(blockNode instanceof nodes2.Block)) { + return; + } + var hasSuper = false; + var symbol = gensym(); + blockNode.body = walk(blockNode.body, function(node) { + if (node instanceof nodes2.FunCall && node.name.value === "super") { + hasSuper = true; + return new nodes2.Symbol(node.lineno, node.colno, symbol); + } + }); + if (hasSuper) { + blockNode.body.children.unshift(new nodes2.Super(0, 0, blockNode.name, new nodes2.Symbol(0, 0, symbol))); + } + }); + } + function convertStatements(ast) { + return depthWalk(ast, function(node) { + if (!(node instanceof nodes2.If) && !(node instanceof nodes2.For)) { + return void 0; + } + var async = false; + walk(node, function(child) { + if (child instanceof nodes2.FilterAsync || child instanceof nodes2.IfAsync || child instanceof nodes2.AsyncEach || child instanceof nodes2.AsyncAll || child instanceof nodes2.CallExtensionAsync) { + async = true; + return child; + } + return void 0; + }); + if (async) { + if (node instanceof nodes2.If) { + return new nodes2.IfAsync(node.lineno, node.colno, node.cond, node.body, node.else_); + } else if (node instanceof nodes2.For && !(node instanceof nodes2.AsyncAll)) { + return new nodes2.AsyncEach(node.lineno, node.colno, node.arr, node.name, node.body, node.else_); + } + } + return void 0; + }); + } + function cps(ast, asyncFilters) { + return convertStatements(liftSuper(liftFilters(ast, asyncFilters))); + } + function transform(ast, asyncFilters) { + return cps(ast, asyncFilters || []); + } + module2.exports = { + transform + }; +}); + +// ../../node_modules/nunjucks/src/runtime.js +var require_runtime = __commonJS((exports2, module2) => { + "use strict"; + var lib2 = require_lib(); + var arrayFrom = Array.from; + var supportsIterators = typeof Symbol === "function" && Symbol.iterator && typeof arrayFrom === "function"; + var Frame = /* @__PURE__ */ function() { + function Frame2(parent, isolateWrites) { + this.variables = Object.create(null); + this.parent = parent; + this.topLevel = false; + this.isolateWrites = isolateWrites; + } + var _proto = Frame2.prototype; + _proto.set = function set(name, val, resolveUp) { + var parts = name.split("."); + var obj = this.variables; + var frame = this; + if (resolveUp) { + if (frame = this.resolve(parts[0], true)) { + frame.set(name, val); + return; + } + } + for (var i = 0; i < parts.length - 1; i++) { + var id = parts[i]; + if (!obj[id]) { + obj[id] = {}; + } + obj = obj[id]; + } + obj[parts[parts.length - 1]] = val; + }; + _proto.get = function get(name) { + var val = this.variables[name]; + if (val !== void 0) { + return val; + } + return null; + }; + _proto.lookup = function lookup(name) { + var p = this.parent; + var val = this.variables[name]; + if (val !== void 0) { + return val; + } + return p && p.lookup(name); + }; + _proto.resolve = function resolve(name, forWrite) { + var p = forWrite && this.isolateWrites ? void 0 : this.parent; + var val = this.variables[name]; + if (val !== void 0) { + return this; + } + return p && p.resolve(name); + }; + _proto.push = function push(isolateWrites) { + return new Frame2(this, isolateWrites); + }; + _proto.pop = function pop() { + return this.parent; + }; + return Frame2; + }(); + function makeMacro(argNames, kwargNames, func) { + return function macro() { + for (var _len = arguments.length, macroArgs = new Array(_len), _key = 0; _key < _len; _key++) { + macroArgs[_key] = arguments[_key]; + } + var argCount = numArgs(macroArgs); + var args; + var kwargs = getKeywordArgs(macroArgs); + if (argCount > argNames.length) { + args = macroArgs.slice(0, argNames.length); + macroArgs.slice(args.length, argCount).forEach(function(val, i2) { + if (i2 < kwargNames.length) { + kwargs[kwargNames[i2]] = val; + } + }); + args.push(kwargs); + } else if (argCount < argNames.length) { + args = macroArgs.slice(0, argCount); + for (var i = argCount; i < argNames.length; i++) { + var arg = argNames[i]; + args.push(kwargs[arg]); + delete kwargs[arg]; + } + args.push(kwargs); + } else { + args = macroArgs; + } + return func.apply(this, args); + }; + } + function makeKeywordArgs(obj) { + obj.__keywords = true; + return obj; + } + function isKeywordArgs(obj) { + return obj && Object.prototype.hasOwnProperty.call(obj, "__keywords"); + } + function getKeywordArgs(args) { + var len = args.length; + if (len) { + var lastArg = args[len - 1]; + if (isKeywordArgs(lastArg)) { + return lastArg; + } + } + return {}; + } + function numArgs(args) { + var len = args.length; + if (len === 0) { + return 0; + } + var lastArg = args[len - 1]; + if (isKeywordArgs(lastArg)) { + return len - 1; + } else { + return len; + } + } + function SafeString(val) { + if (typeof val !== "string") { + return val; + } + this.val = val; + this.length = val.length; + } + SafeString.prototype = Object.create(String.prototype, { + length: { + writable: true, + configurable: true, + value: 0 + } + }); + SafeString.prototype.valueOf = function valueOf() { + return this.val; + }; + SafeString.prototype.toString = function toString() { + return this.val; + }; + function copySafeness(dest, target) { + if (dest instanceof SafeString) { + return new SafeString(target); + } + return target.toString(); + } + function markSafe(val) { + var type = typeof val; + if (type === "string") { + return new SafeString(val); + } else if (type !== "function") { + return val; + } else { + return function wrapSafe(args) { + var ret = val.apply(this, arguments); + if (typeof ret === "string") { + return new SafeString(ret); + } + return ret; + }; + } + } + function suppressValue(val, autoescape) { + val = val !== void 0 && val !== null ? val : ""; + if (autoescape && !(val instanceof SafeString)) { + val = lib2.escape(val.toString()); + } + return val; + } + function ensureDefined(val, lineno, colno) { + if (val === null || val === void 0) { + throw new lib2.TemplateError("attempted to output null or undefined value", lineno + 1, colno + 1); + } + return val; + } + function memberLookup(obj, val) { + if (obj === void 0 || obj === null) { + return void 0; + } + if (typeof obj[val] === "function") { + return function() { + for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { + args[_key2] = arguments[_key2]; + } + return obj[val].apply(obj, args); + }; + } + return obj[val]; + } + function callWrap(obj, name, context, args) { + if (!obj) { + throw new Error("Unable to call `" + name + "`, which is undefined or falsey"); + } else if (typeof obj !== "function") { + throw new Error("Unable to call `" + name + "`, which is not a function"); + } + return obj.apply(context, args); + } + function contextOrFrameLookup(context, frame, name) { + var val = frame.lookup(name); + return val !== void 0 ? val : context.lookup(name); + } + function handleError(error, lineno, colno) { + if (error.lineno) { + return error; + } else { + return new lib2.TemplateError(error, lineno, colno); + } + } + function asyncEach(arr, dimen, iter, cb) { + if (lib2.isArray(arr)) { + var len = arr.length; + lib2.asyncIter(arr, function iterCallback(item, i, next) { + switch (dimen) { + case 1: + iter(item, i, len, next); + break; + case 2: + iter(item[0], item[1], i, len, next); + break; + case 3: + iter(item[0], item[1], item[2], i, len, next); + break; + default: + item.push(i, len, next); + iter.apply(this, item); + } + }, cb); + } else { + lib2.asyncFor(arr, function iterCallback(key, val, i, len2, next) { + iter(key, val, i, len2, next); + }, cb); + } + } + function asyncAll(arr, dimen, func, cb) { + var finished = 0; + var len; + var outputArr; + function done(i2, output) { + finished++; + outputArr[i2] = output; + if (finished === len) { + cb(null, outputArr.join("")); + } + } + if (lib2.isArray(arr)) { + len = arr.length; + outputArr = new Array(len); + if (len === 0) { + cb(null, ""); + } else { + for (var i = 0; i < arr.length; i++) { + var item = arr[i]; + switch (dimen) { + case 1: + func(item, i, len, done); + break; + case 2: + func(item[0], item[1], i, len, done); + break; + case 3: + func(item[0], item[1], item[2], i, len, done); + break; + default: + item.push(i, len, done); + func.apply(this, item); + } + } + } + } else { + var keys = lib2.keys(arr || {}); + len = keys.length; + outputArr = new Array(len); + if (len === 0) { + cb(null, ""); + } else { + for (var _i = 0; _i < keys.length; _i++) { + var k = keys[_i]; + func(k, arr[k], _i, len, done); + } + } + } + } + function fromIterator(arr) { + if (typeof arr !== "object" || arr === null || lib2.isArray(arr)) { + return arr; + } else if (supportsIterators && Symbol.iterator in arr) { + return arrayFrom(arr); + } else { + return arr; + } + } + module2.exports = { + Frame, + makeMacro, + makeKeywordArgs, + numArgs, + suppressValue, + ensureDefined, + memberLookup, + contextOrFrameLookup, + callWrap, + handleError, + isArray: lib2.isArray, + keys: lib2.keys, + SafeString, + copySafeness, + markSafe, + asyncEach, + asyncAll, + inOperator: lib2.inOperator, + fromIterator + }; +}); + +// ../../node_modules/nunjucks/src/compiler.js +var require_compiler = __commonJS((exports2, module2) => { + "use strict"; + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + _setPrototypeOf(subClass, superClass); + } + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o2, p2) { + o2.__proto__ = p2; + return o2; + }; + return _setPrototypeOf(o, p); + } + var parser2 = require_parser(); + var transformer = require_transformer(); + var nodes2 = require_nodes(); + var _require2 = require_lib(); + var TemplateError = _require2.TemplateError; + var _require22 = require_runtime(); + var Frame = _require22.Frame; + var _require3 = require_object(); + var Obj = _require3.Obj; + var compareOps = { + "==": "==", + "===": "===", + "!=": "!=", + "!==": "!==", + "<": "<", + ">": ">", + "<=": "<=", + ">=": ">=" + }; + var Compiler = /* @__PURE__ */ function(_Obj) { + _inheritsLoose(Compiler2, _Obj); + function Compiler2() { + return _Obj.apply(this, arguments) || this; + } + var _proto = Compiler2.prototype; + _proto.init = function init(templateName, throwOnUndefined) { + this.templateName = templateName; + this.codebuf = []; + this.lastId = 0; + this.buffer = null; + this.bufferStack = []; + this._scopeClosers = ""; + this.inBlock = false; + this.throwOnUndefined = throwOnUndefined; + }; + _proto.fail = function fail(msg, lineno, colno) { + if (lineno !== void 0) { + lineno += 1; + } + if (colno !== void 0) { + colno += 1; + } + throw new TemplateError(msg, lineno, colno); + }; + _proto._pushBuffer = function _pushBuffer() { + var id = this._tmpid(); + this.bufferStack.push(this.buffer); + this.buffer = id; + this._emit("var " + this.buffer + ' = "";'); + return id; + }; + _proto._popBuffer = function _popBuffer() { + this.buffer = this.bufferStack.pop(); + }; + _proto._emit = function _emit(code) { + this.codebuf.push(code); + }; + _proto._emitLine = function _emitLine(code) { + this._emit(code + "\n"); + }; + _proto._emitLines = function _emitLines() { + var _this = this; + for (var _len = arguments.length, lines = new Array(_len), _key = 0; _key < _len; _key++) { + lines[_key] = arguments[_key]; + } + lines.forEach(function(line) { + return _this._emitLine(line); + }); + }; + _proto._emitFuncBegin = function _emitFuncBegin(node, name) { + this.buffer = "output"; + this._scopeClosers = ""; + this._emitLine("function " + name + "(env, context, frame, runtime, cb) {"); + this._emitLine("var lineno = " + node.lineno + ";"); + this._emitLine("var colno = " + node.colno + ";"); + this._emitLine("var " + this.buffer + ' = "";'); + this._emitLine("try {"); + }; + _proto._emitFuncEnd = function _emitFuncEnd(noReturn) { + if (!noReturn) { + this._emitLine("cb(null, " + this.buffer + ");"); + } + this._closeScopeLevels(); + this._emitLine("} catch (e) {"); + this._emitLine(" cb(runtime.handleError(e, lineno, colno));"); + this._emitLine("}"); + this._emitLine("}"); + this.buffer = null; + }; + _proto._addScopeLevel = function _addScopeLevel() { + this._scopeClosers += "})"; + }; + _proto._closeScopeLevels = function _closeScopeLevels() { + this._emitLine(this._scopeClosers + ";"); + this._scopeClosers = ""; + }; + _proto._withScopedSyntax = function _withScopedSyntax(func) { + var _scopeClosers = this._scopeClosers; + this._scopeClosers = ""; + func.call(this); + this._closeScopeLevels(); + this._scopeClosers = _scopeClosers; + }; + _proto._makeCallback = function _makeCallback(res) { + var err = this._tmpid(); + return "function(" + err + (res ? "," + res : "") + ") {\nif(" + err + ") { cb(" + err + "); return; }"; + }; + _proto._tmpid = function _tmpid() { + this.lastId++; + return "t_" + this.lastId; + }; + _proto._templateName = function _templateName() { + return this.templateName == null ? "undefined" : JSON.stringify(this.templateName); + }; + _proto._compileChildren = function _compileChildren(node, frame) { + var _this2 = this; + node.children.forEach(function(child) { + _this2.compile(child, frame); + }); + }; + _proto._compileAggregate = function _compileAggregate(node, frame, startChar, endChar) { + var _this3 = this; + if (startChar) { + this._emit(startChar); + } + node.children.forEach(function(child, i) { + if (i > 0) { + _this3._emit(","); + } + _this3.compile(child, frame); + }); + if (endChar) { + this._emit(endChar); + } + }; + _proto._compileExpression = function _compileExpression(node, frame) { + this.assertType(node, nodes2.Literal, nodes2.Symbol, nodes2.Group, nodes2.Array, nodes2.Dict, nodes2.FunCall, nodes2.Caller, nodes2.Filter, nodes2.LookupVal, nodes2.Compare, nodes2.InlineIf, nodes2.In, nodes2.Is, nodes2.And, nodes2.Or, nodes2.Not, nodes2.Add, nodes2.Concat, nodes2.Sub, nodes2.Mul, nodes2.Div, nodes2.FloorDiv, nodes2.Mod, nodes2.Pow, nodes2.Neg, nodes2.Pos, nodes2.Compare, nodes2.NodeList); + this.compile(node, frame); + }; + _proto.assertType = function assertType(node) { + for (var _len2 = arguments.length, types = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) { + types[_key2 - 1] = arguments[_key2]; + } + if (!types.some(function(t) { + return node instanceof t; + })) { + this.fail("assertType: invalid type: " + node.typename, node.lineno, node.colno); + } + }; + _proto.compileCallExtension = function compileCallExtension(node, frame, async) { + var _this4 = this; + var args = node.args; + var contentArgs = node.contentArgs; + var autoescape = typeof node.autoescape === "boolean" ? node.autoescape : true; + if (!async) { + this._emit(this.buffer + " += runtime.suppressValue("); + } + this._emit('env.getExtension("' + node.extName + '")["' + node.prop + '"]('); + this._emit("context"); + if (args || contentArgs) { + this._emit(","); + } + if (args) { + if (!(args instanceof nodes2.NodeList)) { + this.fail("compileCallExtension: arguments must be a NodeList, use `parser.parseSignature`"); + } + args.children.forEach(function(arg, i) { + _this4._compileExpression(arg, frame); + if (i !== args.children.length - 1 || contentArgs.length) { + _this4._emit(","); + } + }); + } + if (contentArgs.length) { + contentArgs.forEach(function(arg, i) { + if (i > 0) { + _this4._emit(","); + } + if (arg) { + _this4._emitLine("function(cb) {"); + _this4._emitLine("if(!cb) { cb = function(err) { if(err) { throw err; }}}"); + var id = _this4._pushBuffer(); + _this4._withScopedSyntax(function() { + _this4.compile(arg, frame); + _this4._emitLine("cb(null, " + id + ");"); + }); + _this4._popBuffer(); + _this4._emitLine("return " + id + ";"); + _this4._emitLine("}"); + } else { + _this4._emit("null"); + } + }); + } + if (async) { + var res = this._tmpid(); + this._emitLine(", " + this._makeCallback(res)); + this._emitLine(this.buffer + " += runtime.suppressValue(" + res + ", " + autoescape + " && env.opts.autoescape);"); + this._addScopeLevel(); + } else { + this._emit(")"); + this._emit(", " + autoescape + " && env.opts.autoescape);\n"); + } + }; + _proto.compileCallExtensionAsync = function compileCallExtensionAsync(node, frame) { + this.compileCallExtension(node, frame, true); + }; + _proto.compileNodeList = function compileNodeList(node, frame) { + this._compileChildren(node, frame); + }; + _proto.compileLiteral = function compileLiteral(node) { + if (typeof node.value === "string") { + var val = node.value.replace(/\\/g, "\\\\"); + val = val.replace(/"/g, '\\"'); + val = val.replace(/\n/g, "\\n"); + val = val.replace(/\r/g, "\\r"); + val = val.replace(/\t/g, "\\t"); + val = val.replace(/\u2028/g, "\\u2028"); + this._emit('"' + val + '"'); + } else if (node.value === null) { + this._emit("null"); + } else { + this._emit(node.value.toString()); + } + }; + _proto.compileSymbol = function compileSymbol(node, frame) { + var name = node.value; + var v = frame.lookup(name); + if (v) { + this._emit(v); + } else { + this._emit('runtime.contextOrFrameLookup(context, frame, "' + name + '")'); + } + }; + _proto.compileGroup = function compileGroup(node, frame) { + this._compileAggregate(node, frame, "(", ")"); + }; + _proto.compileArray = function compileArray(node, frame) { + this._compileAggregate(node, frame, "[", "]"); + }; + _proto.compileDict = function compileDict(node, frame) { + this._compileAggregate(node, frame, "{", "}"); + }; + _proto.compilePair = function compilePair(node, frame) { + var key = node.key; + var val = node.value; + if (key instanceof nodes2.Symbol) { + key = new nodes2.Literal(key.lineno, key.colno, key.value); + } else if (!(key instanceof nodes2.Literal && typeof key.value === "string")) { + this.fail("compilePair: Dict keys must be strings or names", key.lineno, key.colno); + } + this.compile(key, frame); + this._emit(": "); + this._compileExpression(val, frame); + }; + _proto.compileInlineIf = function compileInlineIf(node, frame) { + this._emit("("); + this.compile(node.cond, frame); + this._emit("?"); + this.compile(node.body, frame); + this._emit(":"); + if (node.else_ !== null) { + this.compile(node.else_, frame); + } else { + this._emit('""'); + } + this._emit(")"); + }; + _proto.compileIn = function compileIn(node, frame) { + this._emit("runtime.inOperator("); + this.compile(node.left, frame); + this._emit(","); + this.compile(node.right, frame); + this._emit(")"); + }; + _proto.compileIs = function compileIs(node, frame) { + var right = node.right.name ? node.right.name.value : node.right.value; + this._emit('env.getTest("' + right + '").call(context, '); + this.compile(node.left, frame); + if (node.right.args) { + this._emit(","); + this.compile(node.right.args, frame); + } + this._emit(") === true"); + }; + _proto._binOpEmitter = function _binOpEmitter(node, frame, str) { + this.compile(node.left, frame); + this._emit(str); + this.compile(node.right, frame); + }; + _proto.compileOr = function compileOr(node, frame) { + return this._binOpEmitter(node, frame, " || "); + }; + _proto.compileAnd = function compileAnd(node, frame) { + return this._binOpEmitter(node, frame, " && "); + }; + _proto.compileAdd = function compileAdd(node, frame) { + return this._binOpEmitter(node, frame, " + "); + }; + _proto.compileConcat = function compileConcat(node, frame) { + return this._binOpEmitter(node, frame, ' + "" + '); + }; + _proto.compileSub = function compileSub(node, frame) { + return this._binOpEmitter(node, frame, " - "); + }; + _proto.compileMul = function compileMul(node, frame) { + return this._binOpEmitter(node, frame, " * "); + }; + _proto.compileDiv = function compileDiv(node, frame) { + return this._binOpEmitter(node, frame, " / "); + }; + _proto.compileMod = function compileMod(node, frame) { + return this._binOpEmitter(node, frame, " % "); + }; + _proto.compileNot = function compileNot(node, frame) { + this._emit("!"); + this.compile(node.target, frame); + }; + _proto.compileFloorDiv = function compileFloorDiv(node, frame) { + this._emit("Math.floor("); + this.compile(node.left, frame); + this._emit(" / "); + this.compile(node.right, frame); + this._emit(")"); + }; + _proto.compilePow = function compilePow(node, frame) { + this._emit("Math.pow("); + this.compile(node.left, frame); + this._emit(", "); + this.compile(node.right, frame); + this._emit(")"); + }; + _proto.compileNeg = function compileNeg(node, frame) { + this._emit("-"); + this.compile(node.target, frame); + }; + _proto.compilePos = function compilePos(node, frame) { + this._emit("+"); + this.compile(node.target, frame); + }; + _proto.compileCompare = function compileCompare(node, frame) { + var _this5 = this; + this.compile(node.expr, frame); + node.ops.forEach(function(op) { + _this5._emit(" " + compareOps[op.type] + " "); + _this5.compile(op.expr, frame); + }); + }; + _proto.compileLookupVal = function compileLookupVal(node, frame) { + this._emit("runtime.memberLookup(("); + this._compileExpression(node.target, frame); + this._emit("),"); + this._compileExpression(node.val, frame); + this._emit(")"); + }; + _proto._getNodeName = function _getNodeName(node) { + switch (node.typename) { + case "Symbol": + return node.value; + case "FunCall": + return "the return value of (" + this._getNodeName(node.name) + ")"; + case "LookupVal": + return this._getNodeName(node.target) + '["' + this._getNodeName(node.val) + '"]'; + case "Literal": + return node.value.toString(); + default: + return "--expression--"; + } + }; + _proto.compileFunCall = function compileFunCall(node, frame) { + this._emit("(lineno = " + node.lineno + ", colno = " + node.colno + ", "); + this._emit("runtime.callWrap("); + this._compileExpression(node.name, frame); + this._emit(', "' + this._getNodeName(node.name).replace(/"/g, '\\"') + '", context, '); + this._compileAggregate(node.args, frame, "[", "])"); + this._emit(")"); + }; + _proto.compileFilter = function compileFilter(node, frame) { + var name = node.name; + this.assertType(name, nodes2.Symbol); + this._emit('env.getFilter("' + name.value + '").call(context, '); + this._compileAggregate(node.args, frame); + this._emit(")"); + }; + _proto.compileFilterAsync = function compileFilterAsync(node, frame) { + var name = node.name; + var symbol = node.symbol.value; + this.assertType(name, nodes2.Symbol); + frame.set(symbol, symbol); + this._emit('env.getFilter("' + name.value + '").call(context, '); + this._compileAggregate(node.args, frame); + this._emitLine(", " + this._makeCallback(symbol)); + this._addScopeLevel(); + }; + _proto.compileKeywordArgs = function compileKeywordArgs(node, frame) { + this._emit("runtime.makeKeywordArgs("); + this.compileDict(node, frame); + this._emit(")"); + }; + _proto.compileSet = function compileSet(node, frame) { + var _this6 = this; + var ids = []; + node.targets.forEach(function(target) { + var name = target.value; + var id = frame.lookup(name); + if (id === null || id === void 0) { + id = _this6._tmpid(); + _this6._emitLine("var " + id + ";"); + } + ids.push(id); + }); + if (node.value) { + this._emit(ids.join(" = ") + " = "); + this._compileExpression(node.value, frame); + this._emitLine(";"); + } else { + this._emit(ids.join(" = ") + " = "); + this.compile(node.body, frame); + this._emitLine(";"); + } + node.targets.forEach(function(target, i) { + var id = ids[i]; + var name = target.value; + _this6._emitLine('frame.set("' + name + '", ' + id + ", true);"); + _this6._emitLine("if(frame.topLevel) {"); + _this6._emitLine('context.setVariable("' + name + '", ' + id + ");"); + _this6._emitLine("}"); + if (name.charAt(0) !== "_") { + _this6._emitLine("if(frame.topLevel) {"); + _this6._emitLine('context.addExport("' + name + '", ' + id + ");"); + _this6._emitLine("}"); + } + }); + }; + _proto.compileSwitch = function compileSwitch(node, frame) { + var _this7 = this; + this._emit("switch ("); + this.compile(node.expr, frame); + this._emit(") {"); + node.cases.forEach(function(c, i) { + _this7._emit("case "); + _this7.compile(c.cond, frame); + _this7._emit(": "); + _this7.compile(c.body, frame); + if (c.body.children.length) { + _this7._emitLine("break;"); + } + }); + if (node.default) { + this._emit("default:"); + this.compile(node.default, frame); + } + this._emit("}"); + }; + _proto.compileIf = function compileIf(node, frame, async) { + var _this8 = this; + this._emit("if("); + this._compileExpression(node.cond, frame); + this._emitLine(") {"); + this._withScopedSyntax(function() { + _this8.compile(node.body, frame); + if (async) { + _this8._emit("cb()"); + } + }); + if (node.else_) { + this._emitLine("}\nelse {"); + this._withScopedSyntax(function() { + _this8.compile(node.else_, frame); + if (async) { + _this8._emit("cb()"); + } + }); + } else if (async) { + this._emitLine("}\nelse {"); + this._emit("cb()"); + } + this._emitLine("}"); + }; + _proto.compileIfAsync = function compileIfAsync(node, frame) { + this._emit("(function(cb) {"); + this.compileIf(node, frame, true); + this._emit("})(" + this._makeCallback()); + this._addScopeLevel(); + }; + _proto._emitLoopBindings = function _emitLoopBindings(node, arr, i, len) { + var _this9 = this; + var bindings = [{ + name: "index", + val: i + " + 1" + }, { + name: "index0", + val: i + }, { + name: "revindex", + val: len + " - " + i + }, { + name: "revindex0", + val: len + " - " + i + " - 1" + }, { + name: "first", + val: i + " === 0" + }, { + name: "last", + val: i + " === " + len + " - 1" + }, { + name: "length", + val: len + }]; + bindings.forEach(function(b) { + _this9._emitLine('frame.set("loop.' + b.name + '", ' + b.val + ");"); + }); + }; + _proto.compileFor = function compileFor(node, frame) { + var _this10 = this; + var i = this._tmpid(); + var len = this._tmpid(); + var arr = this._tmpid(); + frame = frame.push(); + this._emitLine("frame = frame.push();"); + this._emit("var " + arr + " = "); + this._compileExpression(node.arr, frame); + this._emitLine(";"); + this._emit("if(" + arr + ") {"); + this._emitLine(arr + " = runtime.fromIterator(" + arr + ");"); + if (node.name instanceof nodes2.Array) { + this._emitLine("var " + i + ";"); + this._emitLine("if(runtime.isArray(" + arr + ")) {"); + this._emitLine("var " + len + " = " + arr + ".length;"); + this._emitLine("for(" + i + "=0; " + i + " < " + arr + ".length; " + i + "++) {"); + node.name.children.forEach(function(child, u) { + var tid = _this10._tmpid(); + _this10._emitLine("var " + tid + " = " + arr + "[" + i + "][" + u + "];"); + _this10._emitLine('frame.set("' + child + '", ' + arr + "[" + i + "][" + u + "]);"); + frame.set(node.name.children[u].value, tid); + }); + this._emitLoopBindings(node, arr, i, len); + this._withScopedSyntax(function() { + _this10.compile(node.body, frame); + }); + this._emitLine("}"); + this._emitLine("} else {"); + var _node$name$children = node.name.children, key = _node$name$children[0], val = _node$name$children[1]; + var k = this._tmpid(); + var v = this._tmpid(); + frame.set(key.value, k); + frame.set(val.value, v); + this._emitLine(i + " = -1;"); + this._emitLine("var " + len + " = runtime.keys(" + arr + ").length;"); + this._emitLine("for(var " + k + " in " + arr + ") {"); + this._emitLine(i + "++;"); + this._emitLine("var " + v + " = " + arr + "[" + k + "];"); + this._emitLine('frame.set("' + key.value + '", ' + k + ");"); + this._emitLine('frame.set("' + val.value + '", ' + v + ");"); + this._emitLoopBindings(node, arr, i, len); + this._withScopedSyntax(function() { + _this10.compile(node.body, frame); + }); + this._emitLine("}"); + this._emitLine("}"); + } else { + var _v = this._tmpid(); + frame.set(node.name.value, _v); + this._emitLine("var " + len + " = " + arr + ".length;"); + this._emitLine("for(var " + i + "=0; " + i + " < " + arr + ".length; " + i + "++) {"); + this._emitLine("var " + _v + " = " + arr + "[" + i + "];"); + this._emitLine('frame.set("' + node.name.value + '", ' + _v + ");"); + this._emitLoopBindings(node, arr, i, len); + this._withScopedSyntax(function() { + _this10.compile(node.body, frame); + }); + this._emitLine("}"); + } + this._emitLine("}"); + if (node.else_) { + this._emitLine("if (!" + len + ") {"); + this.compile(node.else_, frame); + this._emitLine("}"); + } + this._emitLine("frame = frame.pop();"); + }; + _proto._compileAsyncLoop = function _compileAsyncLoop(node, frame, parallel) { + var _this11 = this; + var i = this._tmpid(); + var len = this._tmpid(); + var arr = this._tmpid(); + var asyncMethod = parallel ? "asyncAll" : "asyncEach"; + frame = frame.push(); + this._emitLine("frame = frame.push();"); + this._emit("var " + arr + " = runtime.fromIterator("); + this._compileExpression(node.arr, frame); + this._emitLine(");"); + if (node.name instanceof nodes2.Array) { + var arrayLen = node.name.children.length; + this._emit("runtime." + asyncMethod + "(" + arr + ", " + arrayLen + ", function("); + node.name.children.forEach(function(name) { + _this11._emit(name.value + ","); + }); + this._emit(i + "," + len + ",next) {"); + node.name.children.forEach(function(name) { + var id2 = name.value; + frame.set(id2, id2); + _this11._emitLine('frame.set("' + id2 + '", ' + id2 + ");"); + }); + } else { + var id = node.name.value; + this._emitLine("runtime." + asyncMethod + "(" + arr + ", 1, function(" + id + ", " + i + ", " + len + ",next) {"); + this._emitLine('frame.set("' + id + '", ' + id + ");"); + frame.set(id, id); + } + this._emitLoopBindings(node, arr, i, len); + this._withScopedSyntax(function() { + var buf; + if (parallel) { + buf = _this11._pushBuffer(); + } + _this11.compile(node.body, frame); + _this11._emitLine("next(" + i + (buf ? "," + buf : "") + ");"); + if (parallel) { + _this11._popBuffer(); + } + }); + var output = this._tmpid(); + this._emitLine("}, " + this._makeCallback(output)); + this._addScopeLevel(); + if (parallel) { + this._emitLine(this.buffer + " += " + output + ";"); + } + if (node.else_) { + this._emitLine("if (!" + arr + ".length) {"); + this.compile(node.else_, frame); + this._emitLine("}"); + } + this._emitLine("frame = frame.pop();"); + }; + _proto.compileAsyncEach = function compileAsyncEach(node, frame) { + this._compileAsyncLoop(node, frame); + }; + _proto.compileAsyncAll = function compileAsyncAll(node, frame) { + this._compileAsyncLoop(node, frame, true); + }; + _proto._compileMacro = function _compileMacro(node, frame) { + var _this12 = this; + var args = []; + var kwargs = null; + var funcId = "macro_" + this._tmpid(); + var keepFrame = frame !== void 0; + node.args.children.forEach(function(arg, i) { + if (i === node.args.children.length - 1 && arg instanceof nodes2.Dict) { + kwargs = arg; + } else { + _this12.assertType(arg, nodes2.Symbol); + args.push(arg); + } + }); + var realNames = [].concat(args.map(function(n) { + return "l_" + n.value; + }), ["kwargs"]); + var argNames = args.map(function(n) { + return '"' + n.value + '"'; + }); + var kwargNames = (kwargs && kwargs.children || []).map(function(n) { + return '"' + n.key.value + '"'; + }); + var currFrame; + if (keepFrame) { + currFrame = frame.push(true); + } else { + currFrame = new Frame(); + } + this._emitLines("var " + funcId + " = runtime.makeMacro(", "[" + argNames.join(", ") + "], ", "[" + kwargNames.join(", ") + "], ", "function (" + realNames.join(", ") + ") {", "var callerFrame = frame;", "frame = " + (keepFrame ? "frame.push(true);" : "new runtime.Frame();"), "kwargs = kwargs || {};", 'if (Object.prototype.hasOwnProperty.call(kwargs, "caller")) {', 'frame.set("caller", kwargs.caller); }'); + args.forEach(function(arg) { + _this12._emitLine('frame.set("' + arg.value + '", l_' + arg.value + ");"); + currFrame.set(arg.value, "l_" + arg.value); + }); + if (kwargs) { + kwargs.children.forEach(function(pair) { + var name = pair.key.value; + _this12._emit('frame.set("' + name + '", '); + _this12._emit('Object.prototype.hasOwnProperty.call(kwargs, "' + name + '")'); + _this12._emit(' ? kwargs["' + name + '"] : '); + _this12._compileExpression(pair.value, currFrame); + _this12._emit(");"); + }); + } + var bufferId = this._pushBuffer(); + this._withScopedSyntax(function() { + _this12.compile(node.body, currFrame); + }); + this._emitLine("frame = " + (keepFrame ? "frame.pop();" : "callerFrame;")); + this._emitLine("return new runtime.SafeString(" + bufferId + ");"); + this._emitLine("});"); + this._popBuffer(); + return funcId; + }; + _proto.compileMacro = function compileMacro(node, frame) { + var funcId = this._compileMacro(node); + var name = node.name.value; + frame.set(name, funcId); + if (frame.parent) { + this._emitLine('frame.set("' + name + '", ' + funcId + ");"); + } else { + if (node.name.value.charAt(0) !== "_") { + this._emitLine('context.addExport("' + name + '");'); + } + this._emitLine('context.setVariable("' + name + '", ' + funcId + ");"); + } + }; + _proto.compileCaller = function compileCaller(node, frame) { + this._emit("(function (){"); + var funcId = this._compileMacro(node, frame); + this._emit("return " + funcId + ";})()"); + }; + _proto._compileGetTemplate = function _compileGetTemplate(node, frame, eagerCompile, ignoreMissing) { + var parentTemplateId = this._tmpid(); + var parentName = this._templateName(); + var cb = this._makeCallback(parentTemplateId); + var eagerCompileArg = eagerCompile ? "true" : "false"; + var ignoreMissingArg = ignoreMissing ? "true" : "false"; + this._emit("env.getTemplate("); + this._compileExpression(node.template, frame); + this._emitLine(", " + eagerCompileArg + ", " + parentName + ", " + ignoreMissingArg + ", " + cb); + return parentTemplateId; + }; + _proto.compileImport = function compileImport(node, frame) { + var target = node.target.value; + var id = this._compileGetTemplate(node, frame, false, false); + this._addScopeLevel(); + this._emitLine(id + ".getExported(" + (node.withContext ? "context.getVariables(), frame, " : "") + this._makeCallback(id)); + this._addScopeLevel(); + frame.set(target, id); + if (frame.parent) { + this._emitLine('frame.set("' + target + '", ' + id + ");"); + } else { + this._emitLine('context.setVariable("' + target + '", ' + id + ");"); + } + }; + _proto.compileFromImport = function compileFromImport(node, frame) { + var _this13 = this; + var importedId = this._compileGetTemplate(node, frame, false, false); + this._addScopeLevel(); + this._emitLine(importedId + ".getExported(" + (node.withContext ? "context.getVariables(), frame, " : "") + this._makeCallback(importedId)); + this._addScopeLevel(); + node.names.children.forEach(function(nameNode) { + var name; + var alias; + var id = _this13._tmpid(); + if (nameNode instanceof nodes2.Pair) { + name = nameNode.key.value; + alias = nameNode.value.value; + } else { + name = nameNode.value; + alias = name; + } + _this13._emitLine("if(Object.prototype.hasOwnProperty.call(" + importedId + ', "' + name + '")) {'); + _this13._emitLine("var " + id + " = " + importedId + "." + name + ";"); + _this13._emitLine("} else {"); + _this13._emitLine(`cb(new Error("cannot import '` + name + `'")); return;`); + _this13._emitLine("}"); + frame.set(alias, id); + if (frame.parent) { + _this13._emitLine('frame.set("' + alias + '", ' + id + ");"); + } else { + _this13._emitLine('context.setVariable("' + alias + '", ' + id + ");"); + } + }); + }; + _proto.compileBlock = function compileBlock(node) { + var id = this._tmpid(); + if (!this.inBlock) { + this._emit('(parentTemplate ? function(e, c, f, r, cb) { cb(""); } : '); + } + this._emit('context.getBlock("' + node.name.value + '")'); + if (!this.inBlock) { + this._emit(")"); + } + this._emitLine("(env, context, frame, runtime, " + this._makeCallback(id)); + this._emitLine(this.buffer + " += " + id + ";"); + this._addScopeLevel(); + }; + _proto.compileSuper = function compileSuper(node, frame) { + var name = node.blockName.value; + var id = node.symbol.value; + var cb = this._makeCallback(id); + this._emitLine('context.getSuper(env, "' + name + '", b_' + name + ", frame, runtime, " + cb); + this._emitLine(id + " = runtime.markSafe(" + id + ");"); + this._addScopeLevel(); + frame.set(id, id); + }; + _proto.compileExtends = function compileExtends(node, frame) { + var k = this._tmpid(); + var parentTemplateId = this._compileGetTemplate(node, frame, true, false); + this._emitLine("parentTemplate = " + parentTemplateId); + this._emitLine("for(var " + k + " in parentTemplate.blocks) {"); + this._emitLine("context.addBlock(" + k + ", parentTemplate.blocks[" + k + "]);"); + this._emitLine("}"); + this._addScopeLevel(); + }; + _proto.compileInclude = function compileInclude(node, frame) { + this._emitLine("var tasks = [];"); + this._emitLine("tasks.push("); + this._emitLine("function(callback) {"); + var id = this._compileGetTemplate(node, frame, false, node.ignoreMissing); + this._emitLine("callback(null," + id + ");});"); + this._emitLine("});"); + var id2 = this._tmpid(); + this._emitLine("tasks.push("); + this._emitLine("function(template, callback){"); + this._emitLine("template.render(context.getVariables(), frame, " + this._makeCallback(id2)); + this._emitLine("callback(null," + id2 + ");});"); + this._emitLine("});"); + this._emitLine("tasks.push("); + this._emitLine("function(result, callback){"); + this._emitLine(this.buffer + " += result;"); + this._emitLine("callback(null);"); + this._emitLine("});"); + this._emitLine("env.waterfall(tasks, function(){"); + this._addScopeLevel(); + }; + _proto.compileTemplateData = function compileTemplateData(node, frame) { + this.compileLiteral(node, frame); + }; + _proto.compileCapture = function compileCapture(node, frame) { + var _this14 = this; + var buffer = this.buffer; + this.buffer = "output"; + this._emitLine("(function() {"); + this._emitLine('var output = "";'); + this._withScopedSyntax(function() { + _this14.compile(node.body, frame); + }); + this._emitLine("return output;"); + this._emitLine("})()"); + this.buffer = buffer; + }; + _proto.compileOutput = function compileOutput(node, frame) { + var _this15 = this; + var children = node.children; + children.forEach(function(child) { + if (child instanceof nodes2.TemplateData) { + if (child.value) { + _this15._emit(_this15.buffer + " += "); + _this15.compileLiteral(child, frame); + _this15._emitLine(";"); + } + } else { + _this15._emit(_this15.buffer + " += runtime.suppressValue("); + if (_this15.throwOnUndefined) { + _this15._emit("runtime.ensureDefined("); + } + _this15.compile(child, frame); + if (_this15.throwOnUndefined) { + _this15._emit("," + node.lineno + "," + node.colno + ")"); + } + _this15._emit(", env.opts.autoescape);\n"); + } + }); + }; + _proto.compileRoot = function compileRoot(node, frame) { + var _this16 = this; + if (frame) { + this.fail("compileRoot: root node can't have frame"); + } + frame = new Frame(); + this._emitFuncBegin(node, "root"); + this._emitLine("var parentTemplate = null;"); + this._compileChildren(node, frame); + this._emitLine("if(parentTemplate) {"); + this._emitLine("parentTemplate.rootRenderFunc(env, context, frame, runtime, cb);"); + this._emitLine("} else {"); + this._emitLine("cb(null, " + this.buffer + ");"); + this._emitLine("}"); + this._emitFuncEnd(true); + this.inBlock = true; + var blockNames = []; + var blocks = node.findAll(nodes2.Block); + blocks.forEach(function(block, i) { + var name = block.name.value; + if (blockNames.indexOf(name) !== -1) { + throw new Error('Block "' + name + '" defined more than once.'); + } + blockNames.push(name); + _this16._emitFuncBegin(block, "b_" + name); + var tmpFrame = new Frame(); + _this16._emitLine("var frame = frame.push(true);"); + _this16.compile(block.body, tmpFrame); + _this16._emitFuncEnd(); + }); + this._emitLine("return {"); + blocks.forEach(function(block, i) { + var blockName = "b_" + block.name.value; + _this16._emitLine(blockName + ": " + blockName + ","); + }); + this._emitLine("root: root\n};"); + }; + _proto.compile = function compile2(node, frame) { + var _compile = this["compile" + node.typename]; + if (_compile) { + _compile.call(this, node, frame); + } else { + this.fail("compile: Cannot compile node: " + node.typename, node.lineno, node.colno); + } + }; + _proto.getCode = function getCode() { + return this.codebuf.join(""); + }; + return Compiler2; + }(Obj); + module2.exports = { + compile: function compile2(src, asyncFilters, extensions, name, opts) { + if (opts === void 0) { + opts = {}; + } + var c = new Compiler(name, opts.throwOnUndefined); + var preprocessors = (extensions || []).map(function(ext) { + return ext.preprocess; + }).filter(function(f) { + return !!f; + }); + var processedSrc = preprocessors.reduce(function(s, processor) { + return processor(s); + }, src); + c.compile(transformer.transform(parser2.parse(processedSrc, extensions, opts), asyncFilters, name)); + return c.getCode(); + }, + Compiler + }; +}); + +// ../../node_modules/nunjucks/src/filters.js +var require_filters = __commonJS((exports2, module2) => { + "use strict"; + var lib2 = require_lib(); + var r = require_runtime(); + var _exports = module2.exports = {}; + function normalize(value, defaultValue) { + if (value === null || value === void 0 || value === false) { + return defaultValue; + } + return value; + } + _exports.abs = Math.abs; + function isNaN2(num) { + return num !== num; + } + function batch(arr, linecount, fillWith) { + var i; + var res = []; + var tmp = []; + for (i = 0; i < arr.length; i++) { + if (i % linecount === 0 && tmp.length) { + res.push(tmp); + tmp = []; + } + tmp.push(arr[i]); + } + if (tmp.length) { + if (fillWith) { + for (i = tmp.length; i < linecount; i++) { + tmp.push(fillWith); + } + } + res.push(tmp); + } + return res; + } + _exports.batch = batch; + function capitalize(str) { + str = normalize(str, ""); + var ret = str.toLowerCase(); + return r.copySafeness(str, ret.charAt(0).toUpperCase() + ret.slice(1)); + } + _exports.capitalize = capitalize; + function center(str, width) { + str = normalize(str, ""); + width = width || 80; + if (str.length >= width) { + return str; + } + var spaces = width - str.length; + var pre = lib2.repeat(" ", spaces / 2 - spaces % 2); + var post = lib2.repeat(" ", spaces / 2); + return r.copySafeness(str, pre + str + post); + } + _exports.center = center; + function default_(val, def, bool) { + if (bool) { + return val || def; + } else { + return val !== void 0 ? val : def; + } + } + _exports["default"] = default_; + function dictsort(val, caseSensitive, by) { + if (!lib2.isObject(val)) { + throw new lib2.TemplateError("dictsort filter: val must be an object"); + } + var array = []; + for (var k in val) { + array.push([k, val[k]]); + } + var si; + if (by === void 0 || by === "key") { + si = 0; + } else if (by === "value") { + si = 1; + } else { + throw new lib2.TemplateError("dictsort filter: You can only sort by either key or value"); + } + array.sort(function(t1, t2) { + var a = t1[si]; + var b = t2[si]; + if (!caseSensitive) { + if (lib2.isString(a)) { + a = a.toUpperCase(); + } + if (lib2.isString(b)) { + b = b.toUpperCase(); + } + } + return a > b ? 1 : a === b ? 0 : -1; + }); + return array; + } + _exports.dictsort = dictsort; + function dump(obj, spaces) { + return JSON.stringify(obj, null, spaces); + } + _exports.dump = dump; + function escape(str) { + if (str instanceof r.SafeString) { + return str; + } + str = str === null || str === void 0 ? "" : str; + return r.markSafe(lib2.escape(str.toString())); + } + _exports.escape = escape; + function safe(str) { + if (str instanceof r.SafeString) { + return str; + } + str = str === null || str === void 0 ? "" : str; + return r.markSafe(str.toString()); + } + _exports.safe = safe; + function first(arr) { + return arr[0]; + } + _exports.first = first; + function forceescape(str) { + str = str === null || str === void 0 ? "" : str; + return r.markSafe(lib2.escape(str.toString())); + } + _exports.forceescape = forceescape; + function groupby(arr, attr) { + return lib2.groupBy(arr, attr, this.env.opts.throwOnUndefined); + } + _exports.groupby = groupby; + function indent(str, width, indentfirst) { + str = normalize(str, ""); + if (str === "") { + return ""; + } + width = width || 4; + var lines = str.split("\n"); + var sp = lib2.repeat(" ", width); + var res = lines.map(function(l, i) { + return i === 0 && !indentfirst ? l : "" + sp + l; + }).join("\n"); + return r.copySafeness(str, res); + } + _exports.indent = indent; + function join(arr, del, attr) { + del = del || ""; + if (attr) { + arr = lib2.map(arr, function(v) { + return v[attr]; + }); + } + return arr.join(del); + } + _exports.join = join; + function last(arr) { + return arr[arr.length - 1]; + } + _exports.last = last; + function lengthFilter(val) { + var value = normalize(val, ""); + if (value !== void 0) { + if (typeof Map === "function" && value instanceof Map || typeof Set === "function" && value instanceof Set) { + return value.size; + } + if (lib2.isObject(value) && !(value instanceof r.SafeString)) { + return lib2.keys(value).length; + } + return value.length; + } + return 0; + } + _exports.length = lengthFilter; + function list(val) { + if (lib2.isString(val)) { + return val.split(""); + } else if (lib2.isObject(val)) { + return lib2._entries(val || {}).map(function(_ref) { + var key = _ref[0], value = _ref[1]; + return { + key, + value + }; + }); + } else if (lib2.isArray(val)) { + return val; + } else { + throw new lib2.TemplateError("list filter: type not iterable"); + } + } + _exports.list = list; + function lower(str) { + str = normalize(str, ""); + return str.toLowerCase(); + } + _exports.lower = lower; + function nl2br(str) { + if (str === null || str === void 0) { + return ""; + } + return r.copySafeness(str, str.replace(/\r\n|\n/g, "
\n")); + } + _exports.nl2br = nl2br; + function random(arr) { + return arr[Math.floor(Math.random() * arr.length)]; + } + _exports.random = random; + function getSelectOrReject(expectedTestResult) { + function filter(arr, testName, secondArg) { + if (testName === void 0) { + testName = "truthy"; + } + var context = this; + var test = context.env.getTest(testName); + return lib2.toArray(arr).filter(function examineTestResult(item) { + return test.call(context, item, secondArg) === expectedTestResult; + }); + } + return filter; + } + _exports.reject = getSelectOrReject(false); + function rejectattr(arr, attr) { + return arr.filter(function(item) { + return !item[attr]; + }); + } + _exports.rejectattr = rejectattr; + _exports.select = getSelectOrReject(true); + function selectattr(arr, attr) { + return arr.filter(function(item) { + return !!item[attr]; + }); + } + _exports.selectattr = selectattr; + function replace(str, old, new_, maxCount) { + var originalStr = str; + if (old instanceof RegExp) { + return str.replace(old, new_); + } + if (typeof maxCount === "undefined") { + maxCount = -1; + } + var res = ""; + if (typeof old === "number") { + old = "" + old; + } else if (typeof old !== "string") { + return str; + } + if (typeof str === "number") { + str = "" + str; + } + if (typeof str !== "string" && !(str instanceof r.SafeString)) { + return str; + } + if (old === "") { + res = new_ + str.split("").join(new_) + new_; + return r.copySafeness(str, res); + } + var nextIndex = str.indexOf(old); + if (maxCount === 0 || nextIndex === -1) { + return str; + } + var pos = 0; + var count = 0; + while (nextIndex > -1 && (maxCount === -1 || count < maxCount)) { + res += str.substring(pos, nextIndex) + new_; + pos = nextIndex + old.length; + count++; + nextIndex = str.indexOf(old, pos); + } + if (pos < str.length) { + res += str.substring(pos); + } + return r.copySafeness(originalStr, res); + } + _exports.replace = replace; + function reverse(val) { + var arr; + if (lib2.isString(val)) { + arr = list(val); + } else { + arr = lib2.map(val, function(v) { + return v; + }); + } + arr.reverse(); + if (lib2.isString(val)) { + return r.copySafeness(val, arr.join("")); + } + return arr; + } + _exports.reverse = reverse; + function round(val, precision, method) { + precision = precision || 0; + var factor = Math.pow(10, precision); + var rounder; + if (method === "ceil") { + rounder = Math.ceil; + } else if (method === "floor") { + rounder = Math.floor; + } else { + rounder = Math.round; + } + return rounder(val * factor) / factor; + } + _exports.round = round; + function slice(arr, slices, fillWith) { + var sliceLength = Math.floor(arr.length / slices); + var extra = arr.length % slices; + var res = []; + var offset = 0; + for (var i = 0; i < slices; i++) { + var start = offset + i * sliceLength; + if (i < extra) { + offset++; + } + var end = offset + (i + 1) * sliceLength; + var currSlice = arr.slice(start, end); + if (fillWith && i >= extra) { + currSlice.push(fillWith); + } + res.push(currSlice); + } + return res; + } + _exports.slice = slice; + function sum(arr, attr, start) { + if (start === void 0) { + start = 0; + } + if (attr) { + arr = lib2.map(arr, function(v) { + return v[attr]; + }); + } + return start + arr.reduce(function(a, b) { + return a + b; + }, 0); + } + _exports.sum = sum; + _exports.sort = r.makeMacro(["value", "reverse", "case_sensitive", "attribute"], [], function sortFilter(arr, reversed, caseSens, attr) { + var _this = this; + var array = lib2.map(arr, function(v) { + return v; + }); + var getAttribute = lib2.getAttrGetter(attr); + array.sort(function(a, b) { + var x = attr ? getAttribute(a) : a; + var y = attr ? getAttribute(b) : b; + if (_this.env.opts.throwOnUndefined && attr && (x === void 0 || y === void 0)) { + throw new TypeError('sort: attribute "' + attr + '" resolved to undefined'); + } + if (!caseSens && lib2.isString(x) && lib2.isString(y)) { + x = x.toLowerCase(); + y = y.toLowerCase(); + } + if (x < y) { + return reversed ? 1 : -1; + } else if (x > y) { + return reversed ? -1 : 1; + } else { + return 0; + } + }); + return array; + }); + function string(obj) { + return r.copySafeness(obj, obj); + } + _exports.string = string; + function striptags(input, preserveLinebreaks) { + input = normalize(input, ""); + var tags = /<\/?([a-z][a-z0-9]*)\b[^>]*>|/gi; + var trimmedInput = trim(input.replace(tags, "")); + var res = ""; + if (preserveLinebreaks) { + res = trimmedInput.replace(/^ +| +$/gm, "").replace(/ +/g, " ").replace(/(\r\n)/g, "\n").replace(/\n\n\n+/g, "\n\n"); + } else { + res = trimmedInput.replace(/\s+/gi, " "); + } + return r.copySafeness(input, res); + } + _exports.striptags = striptags; + function title(str) { + str = normalize(str, ""); + var words = str.split(" ").map(function(word) { + return capitalize(word); + }); + return r.copySafeness(str, words.join(" ")); + } + _exports.title = title; + function trim(str) { + return r.copySafeness(str, str.replace(/^\s*|\s*$/g, "")); + } + _exports.trim = trim; + function truncate(input, length, killwords, end) { + var orig = input; + input = normalize(input, ""); + length = length || 255; + if (input.length <= length) { + return input; + } + if (killwords) { + input = input.substring(0, length); + } else { + var idx = input.lastIndexOf(" ", length); + if (idx === -1) { + idx = length; + } + input = input.substring(0, idx); + } + input += end !== void 0 && end !== null ? end : "..."; + return r.copySafeness(orig, input); + } + _exports.truncate = truncate; + function upper(str) { + str = normalize(str, ""); + return str.toUpperCase(); + } + _exports.upper = upper; + function urlencode(obj) { + var enc = encodeURIComponent; + if (lib2.isString(obj)) { + return enc(obj); + } else { + var keyvals = lib2.isArray(obj) ? obj : lib2._entries(obj); + return keyvals.map(function(_ref2) { + var k = _ref2[0], v = _ref2[1]; + return enc(k) + "=" + enc(v); + }).join("&"); + } + } + _exports.urlencode = urlencode; + var puncRe = /^(?:\(|<|<)?(.*?)(?:\.|,|\)|\n|>)?$/; + var emailRe = /^[\w.!#$%&'*+\-\/=?\^`{|}~]+@[a-z\d\-]+(\.[a-z\d\-]+)+$/i; + var httpHttpsRe = /^https?:\/\/.*$/; + var wwwRe = /^www\./; + var tldRe = /\.(?:org|net|com)(?:\:|\/|$)/; + function urlize(str, length, nofollow) { + if (isNaN2(length)) { + length = Infinity; + } + var noFollowAttr = nofollow === true ? ' rel="nofollow"' : ""; + var words = str.split(/(\s+)/).filter(function(word) { + return word && word.length; + }).map(function(word) { + var matches = word.match(puncRe); + var possibleUrl = matches ? matches[1] : word; + var shortUrl = possibleUrl.substr(0, length); + if (httpHttpsRe.test(possibleUrl)) { + return '" + shortUrl + ""; + } + if (wwwRe.test(possibleUrl)) { + return '" + shortUrl + ""; + } + if (emailRe.test(possibleUrl)) { + return '' + possibleUrl + ""; + } + if (tldRe.test(possibleUrl)) { + return '" + shortUrl + ""; + } + return word; + }); + return words.join(""); + } + _exports.urlize = urlize; + function wordcount(str) { + str = normalize(str, ""); + var words = str ? str.match(/\w+/g) : null; + return words ? words.length : null; + } + _exports.wordcount = wordcount; + function float(val, def) { + var res = parseFloat(val); + return isNaN2(res) ? def : res; + } + _exports.float = float; + var intFilter = r.makeMacro(["value", "default", "base"], [], function doInt(value, defaultValue, base) { + if (base === void 0) { + base = 10; + } + var res = parseInt(value, base); + return isNaN2(res) ? defaultValue : res; + }); + _exports.int = intFilter; + _exports.d = _exports.default; + _exports.e = _exports.escape; +}); + +// ../../node_modules/nunjucks/src/loader.js +var require_loader = __commonJS((exports2, module2) => { + "use strict"; + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + _setPrototypeOf(subClass, superClass); + } + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o2, p2) { + o2.__proto__ = p2; + return o2; + }; + return _setPrototypeOf(o, p); + } + var path = require("path"); + var _require2 = require_object(); + var EmitterObj = _require2.EmitterObj; + module2.exports = /* @__PURE__ */ function(_EmitterObj) { + _inheritsLoose(Loader2, _EmitterObj); + function Loader2() { + return _EmitterObj.apply(this, arguments) || this; + } + var _proto = Loader2.prototype; + _proto.resolve = function resolve(from, to) { + return path.resolve(path.dirname(from), to); + }; + _proto.isRelative = function isRelative(filename) { + return filename.indexOf("./") === 0 || filename.indexOf("../") === 0; + }; + return Loader2; + }(EmitterObj); +}); + +// ../../node_modules/nunjucks/src/precompiled-loader.js +var require_precompiled_loader = __commonJS((exports2, module2) => { + "use strict"; + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + _setPrototypeOf(subClass, superClass); + } + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o2, p2) { + o2.__proto__ = p2; + return o2; + }; + return _setPrototypeOf(o, p); + } + var Loader2 = require_loader(); + var PrecompiledLoader = /* @__PURE__ */ function(_Loader) { + _inheritsLoose(PrecompiledLoader2, _Loader); + function PrecompiledLoader2(compiledTemplates) { + var _this; + _this = _Loader.call(this) || this; + _this.precompiled = compiledTemplates || {}; + return _this; + } + var _proto = PrecompiledLoader2.prototype; + _proto.getSource = function getSource(name) { + if (this.precompiled[name]) { + return { + src: { + type: "code", + obj: this.precompiled[name] + }, + path: name + }; + } + return null; + }; + return PrecompiledLoader2; + }(Loader2); + module2.exports = { + PrecompiledLoader + }; +}); + +// ../../node_modules/picomatch/lib/constants.js +var require_constants = __commonJS((exports2, module2) => { + "use strict"; + var path = require("path"); + var WIN_SLASH = "\\\\/"; + var WIN_NO_SLASH = `[^${WIN_SLASH}]`; + var DOT_LITERAL = "\\."; + var PLUS_LITERAL = "\\+"; + var QMARK_LITERAL = "\\?"; + var SLASH_LITERAL = "\\/"; + var ONE_CHAR = "(?=.)"; + var QMARK = "[^/]"; + var END_ANCHOR = `(?:${SLASH_LITERAL}|$)`; + var START_ANCHOR = `(?:^|${SLASH_LITERAL})`; + var DOTS_SLASH = `${DOT_LITERAL}{1,2}${END_ANCHOR}`; + var NO_DOT = `(?!${DOT_LITERAL})`; + var NO_DOTS = `(?!${START_ANCHOR}${DOTS_SLASH})`; + var NO_DOT_SLASH = `(?!${DOT_LITERAL}{0,1}${END_ANCHOR})`; + var NO_DOTS_SLASH = `(?!${DOTS_SLASH})`; + var QMARK_NO_DOT = `[^.${SLASH_LITERAL}]`; + var STAR = `${QMARK}*?`; + var POSIX_CHARS = { + DOT_LITERAL, + PLUS_LITERAL, + QMARK_LITERAL, + SLASH_LITERAL, + ONE_CHAR, + QMARK, + END_ANCHOR, + DOTS_SLASH, + NO_DOT, + NO_DOTS, + NO_DOT_SLASH, + NO_DOTS_SLASH, + QMARK_NO_DOT, + STAR, + START_ANCHOR + }; + var WINDOWS_CHARS = { + ...POSIX_CHARS, + SLASH_LITERAL: `[${WIN_SLASH}]`, + QMARK: WIN_NO_SLASH, + STAR: `${WIN_NO_SLASH}*?`, + DOTS_SLASH: `${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$)`, + NO_DOT: `(?!${DOT_LITERAL})`, + NO_DOTS: `(?!(?:^|[${WIN_SLASH}])${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, + NO_DOT_SLASH: `(?!${DOT_LITERAL}{0,1}(?:[${WIN_SLASH}]|$))`, + NO_DOTS_SLASH: `(?!${DOT_LITERAL}{1,2}(?:[${WIN_SLASH}]|$))`, + QMARK_NO_DOT: `[^.${WIN_SLASH}]`, + START_ANCHOR: `(?:^|[${WIN_SLASH}])`, + END_ANCHOR: `(?:[${WIN_SLASH}]|$)` + }; + var POSIX_REGEX_SOURCE = { + alnum: "a-zA-Z0-9", + alpha: "a-zA-Z", + ascii: "\\x00-\\x7F", + blank: " \\t", + cntrl: "\\x00-\\x1F\\x7F", + digit: "0-9", + graph: "\\x21-\\x7E", + lower: "a-z", + print: "\\x20-\\x7E ", + punct: "\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~", + space: " \\t\\r\\n\\v\\f", + upper: "A-Z", + word: "A-Za-z0-9_", + xdigit: "A-Fa-f0-9" + }; + module2.exports = { + MAX_LENGTH: 1024 * 64, + POSIX_REGEX_SOURCE, + REGEX_BACKSLASH: /\\(?![*+?^${}(|)[\]])/g, + REGEX_NON_SPECIAL_CHARS: /^[^@![\].,$*+?^{}()|\\/]+/, + REGEX_SPECIAL_CHARS: /[-*+?.^${}(|)[\]]/, + REGEX_SPECIAL_CHARS_BACKREF: /(\\?)((\W)(\3*))/g, + REGEX_SPECIAL_CHARS_GLOBAL: /([-*+?.^${}(|)[\]])/g, + REGEX_REMOVE_BACKSLASH: /(?:\[.*?[^\\]\]|\\(?=.))/g, + REPLACEMENTS: { + "***": "*", + "**/**": "**", + "**/**/**": "**" + }, + CHAR_0: 48, + CHAR_9: 57, + CHAR_UPPERCASE_A: 65, + CHAR_LOWERCASE_A: 97, + CHAR_UPPERCASE_Z: 90, + CHAR_LOWERCASE_Z: 122, + CHAR_LEFT_PARENTHESES: 40, + CHAR_RIGHT_PARENTHESES: 41, + CHAR_ASTERISK: 42, + CHAR_AMPERSAND: 38, + CHAR_AT: 64, + CHAR_BACKWARD_SLASH: 92, + CHAR_CARRIAGE_RETURN: 13, + CHAR_CIRCUMFLEX_ACCENT: 94, + CHAR_COLON: 58, + CHAR_COMMA: 44, + CHAR_DOT: 46, + CHAR_DOUBLE_QUOTE: 34, + CHAR_EQUAL: 61, + CHAR_EXCLAMATION_MARK: 33, + CHAR_FORM_FEED: 12, + CHAR_FORWARD_SLASH: 47, + CHAR_GRAVE_ACCENT: 96, + CHAR_HASH: 35, + CHAR_HYPHEN_MINUS: 45, + CHAR_LEFT_ANGLE_BRACKET: 60, + CHAR_LEFT_CURLY_BRACE: 123, + CHAR_LEFT_SQUARE_BRACKET: 91, + CHAR_LINE_FEED: 10, + CHAR_NO_BREAK_SPACE: 160, + CHAR_PERCENT: 37, + CHAR_PLUS: 43, + CHAR_QUESTION_MARK: 63, + CHAR_RIGHT_ANGLE_BRACKET: 62, + CHAR_RIGHT_CURLY_BRACE: 125, + CHAR_RIGHT_SQUARE_BRACKET: 93, + CHAR_SEMICOLON: 59, + CHAR_SINGLE_QUOTE: 39, + CHAR_SPACE: 32, + CHAR_TAB: 9, + CHAR_UNDERSCORE: 95, + CHAR_VERTICAL_LINE: 124, + CHAR_ZERO_WIDTH_NOBREAK_SPACE: 65279, + SEP: path.sep, + extglobChars(chars) { + return { + "!": {type: "negate", open: "(?:(?!(?:", close: `))${chars.STAR})`}, + "?": {type: "qmark", open: "(?:", close: ")?"}, + "+": {type: "plus", open: "(?:", close: ")+"}, + "*": {type: "star", open: "(?:", close: ")*"}, + "@": {type: "at", open: "(?:", close: ")"} + }; + }, + globChars(win32) { + return win32 === true ? WINDOWS_CHARS : POSIX_CHARS; + } + }; +}); + +// ../../node_modules/picomatch/lib/utils.js +var require_utils = __commonJS((exports2) => { + "use strict"; + var path = require("path"); + var win32 = process.platform === "win32"; + var { + REGEX_BACKSLASH, + REGEX_REMOVE_BACKSLASH, + REGEX_SPECIAL_CHARS, + REGEX_SPECIAL_CHARS_GLOBAL + } = require_constants(); + exports2.isObject = (val) => val !== null && typeof val === "object" && !Array.isArray(val); + exports2.hasRegexChars = (str) => REGEX_SPECIAL_CHARS.test(str); + exports2.isRegexChar = (str) => str.length === 1 && exports2.hasRegexChars(str); + exports2.escapeRegex = (str) => str.replace(REGEX_SPECIAL_CHARS_GLOBAL, "\\$1"); + exports2.toPosixSlashes = (str) => str.replace(REGEX_BACKSLASH, "/"); + exports2.removeBackslashes = (str) => { + return str.replace(REGEX_REMOVE_BACKSLASH, (match) => { + return match === "\\" ? "" : match; + }); + }; + exports2.supportsLookbehinds = () => { + const segs = process.version.slice(1).split(".").map(Number); + if (segs.length === 3 && segs[0] >= 9 || segs[0] === 8 && segs[1] >= 10) { + return true; + } + return false; + }; + exports2.isWindows = (options) => { + if (options && typeof options.windows === "boolean") { + return options.windows; + } + return win32 === true || path.sep === "\\"; + }; + exports2.escapeLast = (input, char, lastIdx) => { + const idx = input.lastIndexOf(char, lastIdx); + if (idx === -1) + return input; + if (input[idx - 1] === "\\") + return exports2.escapeLast(input, char, idx - 1); + return `${input.slice(0, idx)}\\${input.slice(idx)}`; + }; + exports2.removePrefix = (input, state = {}) => { + let output = input; + if (output.startsWith("./")) { + output = output.slice(2); + state.prefix = "./"; + } + return output; + }; + exports2.wrapOutput = (input, state = {}, options = {}) => { + const prepend = options.contains ? "" : "^"; + const append = options.contains ? "" : "$"; + let output = `${prepend}(?:${input})${append}`; + if (state.negated === true) { + output = `(?:^(?!${output}).*$)`; + } + return output; + }; +}); + +// ../../node_modules/picomatch/lib/scan.js +var require_scan = __commonJS((exports2, module2) => { + "use strict"; + var utils = require_utils(); + var { + CHAR_ASTERISK, + CHAR_AT, + CHAR_BACKWARD_SLASH, + CHAR_COMMA, + CHAR_DOT, + CHAR_EXCLAMATION_MARK, + CHAR_FORWARD_SLASH, + CHAR_LEFT_CURLY_BRACE, + CHAR_LEFT_PARENTHESES, + CHAR_LEFT_SQUARE_BRACKET, + CHAR_PLUS, + CHAR_QUESTION_MARK, + CHAR_RIGHT_CURLY_BRACE, + CHAR_RIGHT_PARENTHESES, + CHAR_RIGHT_SQUARE_BRACKET + } = require_constants(); + var isPathSeparator = (code) => { + return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH; + }; + var depth = (token) => { + if (token.isPrefix !== true) { + token.depth = token.isGlobstar ? Infinity : 1; + } + }; + var scan = (input, options) => { + const opts = options || {}; + const length = input.length - 1; + const scanToEnd = opts.parts === true || opts.scanToEnd === true; + const slashes = []; + const tokens = []; + const parts = []; + let str = input; + let index = -1; + let start = 0; + let lastIndex = 0; + let isBrace = false; + let isBracket = false; + let isGlob = false; + let isExtglob = false; + let isGlobstar = false; + let braceEscaped = false; + let backslashes = false; + let negated = false; + let negatedExtglob = false; + let finished = false; + let braces = 0; + let prev; + let code; + let token = {value: "", depth: 0, isGlob: false}; + const eos = () => index >= length; + const peek = () => str.charCodeAt(index + 1); + const advance = () => { + prev = code; + return str.charCodeAt(++index); + }; + while (index < length) { + code = advance(); + let next; + if (code === CHAR_BACKWARD_SLASH) { + backslashes = token.backslashes = true; + code = advance(); + if (code === CHAR_LEFT_CURLY_BRACE) { + braceEscaped = true; + } + continue; + } + if (braceEscaped === true || code === CHAR_LEFT_CURLY_BRACE) { + braces++; + while (eos() !== true && (code = advance())) { + if (code === CHAR_BACKWARD_SLASH) { + backslashes = token.backslashes = true; + advance(); + continue; + } + if (code === CHAR_LEFT_CURLY_BRACE) { + braces++; + continue; + } + if (braceEscaped !== true && code === CHAR_DOT && (code = advance()) === CHAR_DOT) { + isBrace = token.isBrace = true; + isGlob = token.isGlob = true; + finished = true; + if (scanToEnd === true) { + continue; + } + break; + } + if (braceEscaped !== true && code === CHAR_COMMA) { + isBrace = token.isBrace = true; + isGlob = token.isGlob = true; + finished = true; + if (scanToEnd === true) { + continue; + } + break; + } + if (code === CHAR_RIGHT_CURLY_BRACE) { + braces--; + if (braces === 0) { + braceEscaped = false; + isBrace = token.isBrace = true; + finished = true; + break; + } + } + } + if (scanToEnd === true) { + continue; + } + break; + } + if (code === CHAR_FORWARD_SLASH) { + slashes.push(index); + tokens.push(token); + token = {value: "", depth: 0, isGlob: false}; + if (finished === true) + continue; + if (prev === CHAR_DOT && index === start + 1) { + start += 2; + continue; + } + lastIndex = index + 1; + continue; + } + if (opts.noext !== true) { + const isExtglobChar = code === CHAR_PLUS || code === CHAR_AT || code === CHAR_ASTERISK || code === CHAR_QUESTION_MARK || code === CHAR_EXCLAMATION_MARK; + if (isExtglobChar === true && peek() === CHAR_LEFT_PARENTHESES) { + isGlob = token.isGlob = true; + isExtglob = token.isExtglob = true; + finished = true; + if (code === CHAR_EXCLAMATION_MARK && index === start) { + negatedExtglob = true; + } + if (scanToEnd === true) { + while (eos() !== true && (code = advance())) { + if (code === CHAR_BACKWARD_SLASH) { + backslashes = token.backslashes = true; + code = advance(); + continue; + } + if (code === CHAR_RIGHT_PARENTHESES) { + isGlob = token.isGlob = true; + finished = true; + break; + } + } + continue; + } + break; + } + } + if (code === CHAR_ASTERISK) { + if (prev === CHAR_ASTERISK) + isGlobstar = token.isGlobstar = true; + isGlob = token.isGlob = true; + finished = true; + if (scanToEnd === true) { + continue; + } + break; + } + if (code === CHAR_QUESTION_MARK) { + isGlob = token.isGlob = true; + finished = true; + if (scanToEnd === true) { + continue; + } + break; + } + if (code === CHAR_LEFT_SQUARE_BRACKET) { + while (eos() !== true && (next = advance())) { + if (next === CHAR_BACKWARD_SLASH) { + backslashes = token.backslashes = true; + advance(); + continue; + } + if (next === CHAR_RIGHT_SQUARE_BRACKET) { + isBracket = token.isBracket = true; + isGlob = token.isGlob = true; + finished = true; + break; + } + } + if (scanToEnd === true) { + continue; + } + break; + } + if (opts.nonegate !== true && code === CHAR_EXCLAMATION_MARK && index === start) { + negated = token.negated = true; + start++; + continue; + } + if (opts.noparen !== true && code === CHAR_LEFT_PARENTHESES) { + isGlob = token.isGlob = true; + if (scanToEnd === true) { + while (eos() !== true && (code = advance())) { + if (code === CHAR_LEFT_PARENTHESES) { + backslashes = token.backslashes = true; + code = advance(); + continue; + } + if (code === CHAR_RIGHT_PARENTHESES) { + finished = true; + break; + } + } + continue; + } + break; + } + if (isGlob === true) { + finished = true; + if (scanToEnd === true) { + continue; + } + break; + } + } + if (opts.noext === true) { + isExtglob = false; + isGlob = false; + } + let base = str; + let prefix = ""; + let glob = ""; + if (start > 0) { + prefix = str.slice(0, start); + str = str.slice(start); + lastIndex -= start; + } + if (base && isGlob === true && lastIndex > 0) { + base = str.slice(0, lastIndex); + glob = str.slice(lastIndex); + } else if (isGlob === true) { + base = ""; + glob = str; + } else { + base = str; + } + if (base && base !== "" && base !== "/" && base !== str) { + if (isPathSeparator(base.charCodeAt(base.length - 1))) { + base = base.slice(0, -1); + } + } + if (opts.unescape === true) { + if (glob) + glob = utils.removeBackslashes(glob); + if (base && backslashes === true) { + base = utils.removeBackslashes(base); + } + } + const state = { + prefix, + input, + start, + base, + glob, + isBrace, + isBracket, + isGlob, + isExtglob, + isGlobstar, + negated, + negatedExtglob + }; + if (opts.tokens === true) { + state.maxDepth = 0; + if (!isPathSeparator(code)) { + tokens.push(token); + } + state.tokens = tokens; + } + if (opts.parts === true || opts.tokens === true) { + let prevIndex; + for (let idx = 0; idx < slashes.length; idx++) { + const n = prevIndex ? prevIndex + 1 : start; + const i = slashes[idx]; + const value = input.slice(n, i); + if (opts.tokens) { + if (idx === 0 && start !== 0) { + tokens[idx].isPrefix = true; + tokens[idx].value = prefix; + } else { + tokens[idx].value = value; + } + depth(tokens[idx]); + state.maxDepth += tokens[idx].depth; + } + if (idx !== 0 || value !== "") { + parts.push(value); + } + prevIndex = i; + } + if (prevIndex && prevIndex + 1 < input.length) { + const value = input.slice(prevIndex + 1); + parts.push(value); + if (opts.tokens) { + tokens[tokens.length - 1].value = value; + depth(tokens[tokens.length - 1]); + state.maxDepth += tokens[tokens.length - 1].depth; + } + } + state.slashes = slashes; + state.parts = parts; + } + return state; + }; + module2.exports = scan; +}); + +// ../../node_modules/picomatch/lib/parse.js +var require_parse = __commonJS((exports2, module2) => { + "use strict"; + var constants = require_constants(); + var utils = require_utils(); + var { + MAX_LENGTH, + POSIX_REGEX_SOURCE, + REGEX_NON_SPECIAL_CHARS, + REGEX_SPECIAL_CHARS_BACKREF, + REPLACEMENTS + } = constants; + var expandRange = (args, options) => { + if (typeof options.expandRange === "function") { + return options.expandRange(...args, options); + } + args.sort(); + const value = `[${args.join("-")}]`; + try { + new RegExp(value); + } catch (ex) { + return args.map((v) => utils.escapeRegex(v)).join(".."); + } + return value; + }; + var syntaxError = (type, char) => { + return `Missing ${type}: "${char}" - use "\\\\${char}" to match literal characters`; + }; + var parse = (input, options) => { + if (typeof input !== "string") { + throw new TypeError("Expected a string"); + } + input = REPLACEMENTS[input] || input; + const opts = {...options}; + const max = typeof opts.maxLength === "number" ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; + let len = input.length; + if (len > max) { + throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); + } + const bos = {type: "bos", value: "", output: opts.prepend || ""}; + const tokens = [bos]; + const capture = opts.capture ? "" : "?:"; + const win32 = utils.isWindows(options); + const PLATFORM_CHARS = constants.globChars(win32); + const EXTGLOB_CHARS = constants.extglobChars(PLATFORM_CHARS); + const { + DOT_LITERAL, + PLUS_LITERAL, + SLASH_LITERAL, + ONE_CHAR, + DOTS_SLASH, + NO_DOT, + NO_DOT_SLASH, + NO_DOTS_SLASH, + QMARK, + QMARK_NO_DOT, + STAR, + START_ANCHOR + } = PLATFORM_CHARS; + const globstar = (opts2) => { + return `(${capture}(?:(?!${START_ANCHOR}${opts2.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; + }; + const nodot = opts.dot ? "" : NO_DOT; + const qmarkNoDot = opts.dot ? QMARK : QMARK_NO_DOT; + let star = opts.bash === true ? globstar(opts) : STAR; + if (opts.capture) { + star = `(${star})`; + } + if (typeof opts.noext === "boolean") { + opts.noextglob = opts.noext; + } + const state = { + input, + index: -1, + start: 0, + dot: opts.dot === true, + consumed: "", + output: "", + prefix: "", + backtrack: false, + negated: false, + brackets: 0, + braces: 0, + parens: 0, + quotes: 0, + globstar: false, + tokens + }; + input = utils.removePrefix(input, state); + len = input.length; + const extglobs = []; + const braces = []; + const stack = []; + let prev = bos; + let value; + const eos = () => state.index === len - 1; + const peek = state.peek = (n = 1) => input[state.index + n]; + const advance = state.advance = () => input[++state.index] || ""; + const remaining = () => input.slice(state.index + 1); + const consume = (value2 = "", num = 0) => { + state.consumed += value2; + state.index += num; + }; + const append = (token) => { + state.output += token.output != null ? token.output : token.value; + consume(token.value); + }; + const negate = () => { + let count = 1; + while (peek() === "!" && (peek(2) !== "(" || peek(3) === "?")) { + advance(); + state.start++; + count++; + } + if (count % 2 === 0) { + return false; + } + state.negated = true; + state.start++; + return true; + }; + const increment = (type) => { + state[type]++; + stack.push(type); + }; + const decrement = (type) => { + state[type]--; + stack.pop(); + }; + const push = (tok) => { + if (prev.type === "globstar") { + const isBrace = state.braces > 0 && (tok.type === "comma" || tok.type === "brace"); + const isExtglob = tok.extglob === true || extglobs.length && (tok.type === "pipe" || tok.type === "paren"); + if (tok.type !== "slash" && tok.type !== "paren" && !isBrace && !isExtglob) { + state.output = state.output.slice(0, -prev.output.length); + prev.type = "star"; + prev.value = "*"; + prev.output = star; + state.output += prev.output; + } + } + if (extglobs.length && tok.type !== "paren") { + extglobs[extglobs.length - 1].inner += tok.value; + } + if (tok.value || tok.output) + append(tok); + if (prev && prev.type === "text" && tok.type === "text") { + prev.value += tok.value; + prev.output = (prev.output || "") + tok.value; + return; + } + tok.prev = prev; + tokens.push(tok); + prev = tok; + }; + const extglobOpen = (type, value2) => { + const token = {...EXTGLOB_CHARS[value2], conditions: 1, inner: ""}; + token.prev = prev; + token.parens = state.parens; + token.output = state.output; + const output = (opts.capture ? "(" : "") + token.open; + increment("parens"); + push({type, value: value2, output: state.output ? "" : ONE_CHAR}); + push({type: "paren", extglob: true, value: advance(), output}); + extglobs.push(token); + }; + const extglobClose = (token) => { + let output = token.close + (opts.capture ? ")" : ""); + let rest; + if (token.type === "negate") { + let extglobStar = star; + if (token.inner && token.inner.length > 1 && token.inner.includes("/")) { + extglobStar = globstar(opts); + } + if (extglobStar !== star || eos() || /^\)+$/.test(remaining())) { + output = token.close = `)$))${extglobStar}`; + } + if (token.inner.includes("*") && (rest = remaining()) && /^\.[^\\/.]+$/.test(rest)) { + output = token.close = `)${rest})${extglobStar})`; + } + if (token.prev.type === "bos") { + state.negatedExtglob = true; + } + } + push({type: "paren", extglob: true, value, output}); + decrement("parens"); + }; + if (opts.fastpaths !== false && !/(^[*!]|[/()[\]{}"])/.test(input)) { + let backslashes = false; + let output = input.replace(REGEX_SPECIAL_CHARS_BACKREF, (m, esc, chars, first, rest, index) => { + if (first === "\\") { + backslashes = true; + return m; + } + if (first === "?") { + if (esc) { + return esc + first + (rest ? QMARK.repeat(rest.length) : ""); + } + if (index === 0) { + return qmarkNoDot + (rest ? QMARK.repeat(rest.length) : ""); + } + return QMARK.repeat(chars.length); + } + if (first === ".") { + return DOT_LITERAL.repeat(chars.length); + } + if (first === "*") { + if (esc) { + return esc + first + (rest ? star : ""); + } + return star; + } + return esc ? m : `\\${m}`; + }); + if (backslashes === true) { + if (opts.unescape === true) { + output = output.replace(/\\/g, ""); + } else { + output = output.replace(/\\+/g, (m) => { + return m.length % 2 === 0 ? "\\\\" : m ? "\\" : ""; + }); + } + } + if (output === input && opts.contains === true) { + state.output = input; + return state; + } + state.output = utils.wrapOutput(output, state, options); + return state; + } + while (!eos()) { + value = advance(); + if (value === "\0") { + continue; + } + if (value === "\\") { + const next = peek(); + if (next === "/" && opts.bash !== true) { + continue; + } + if (next === "." || next === ";") { + continue; + } + if (!next) { + value += "\\"; + push({type: "text", value}); + continue; + } + const match = /^\\+/.exec(remaining()); + let slashes = 0; + if (match && match[0].length > 2) { + slashes = match[0].length; + state.index += slashes; + if (slashes % 2 !== 0) { + value += "\\"; + } + } + if (opts.unescape === true) { + value = advance(); + } else { + value += advance(); + } + if (state.brackets === 0) { + push({type: "text", value}); + continue; + } + } + if (state.brackets > 0 && (value !== "]" || prev.value === "[" || prev.value === "[^")) { + if (opts.posix !== false && value === ":") { + const inner = prev.value.slice(1); + if (inner.includes("[")) { + prev.posix = true; + if (inner.includes(":")) { + const idx = prev.value.lastIndexOf("["); + const pre = prev.value.slice(0, idx); + const rest2 = prev.value.slice(idx + 2); + const posix = POSIX_REGEX_SOURCE[rest2]; + if (posix) { + prev.value = pre + posix; + state.backtrack = true; + advance(); + if (!bos.output && tokens.indexOf(prev) === 1) { + bos.output = ONE_CHAR; + } + continue; + } + } + } + } + if (value === "[" && peek() !== ":" || value === "-" && peek() === "]") { + value = `\\${value}`; + } + if (value === "]" && (prev.value === "[" || prev.value === "[^")) { + value = `\\${value}`; + } + if (opts.posix === true && value === "!" && prev.value === "[") { + value = "^"; + } + prev.value += value; + append({value}); + continue; + } + if (state.quotes === 1 && value !== '"') { + value = utils.escapeRegex(value); + prev.value += value; + append({value}); + continue; + } + if (value === '"') { + state.quotes = state.quotes === 1 ? 0 : 1; + if (opts.keepQuotes === true) { + push({type: "text", value}); + } + continue; + } + if (value === "(") { + increment("parens"); + push({type: "paren", value}); + continue; + } + if (value === ")") { + if (state.parens === 0 && opts.strictBrackets === true) { + throw new SyntaxError(syntaxError("opening", "(")); + } + const extglob = extglobs[extglobs.length - 1]; + if (extglob && state.parens === extglob.parens + 1) { + extglobClose(extglobs.pop()); + continue; + } + push({type: "paren", value, output: state.parens ? ")" : "\\)"}); + decrement("parens"); + continue; + } + if (value === "[") { + if (opts.nobracket === true || !remaining().includes("]")) { + if (opts.nobracket !== true && opts.strictBrackets === true) { + throw new SyntaxError(syntaxError("closing", "]")); + } + value = `\\${value}`; + } else { + increment("brackets"); + } + push({type: "bracket", value}); + continue; + } + if (value === "]") { + if (opts.nobracket === true || prev && prev.type === "bracket" && prev.value.length === 1) { + push({type: "text", value, output: `\\${value}`}); + continue; + } + if (state.brackets === 0) { + if (opts.strictBrackets === true) { + throw new SyntaxError(syntaxError("opening", "[")); + } + push({type: "text", value, output: `\\${value}`}); + continue; + } + decrement("brackets"); + const prevValue = prev.value.slice(1); + if (prev.posix !== true && prevValue[0] === "^" && !prevValue.includes("/")) { + value = `/${value}`; + } + prev.value += value; + append({value}); + if (opts.literalBrackets === false || utils.hasRegexChars(prevValue)) { + continue; + } + const escaped = utils.escapeRegex(prev.value); + state.output = state.output.slice(0, -prev.value.length); + if (opts.literalBrackets === true) { + state.output += escaped; + prev.value = escaped; + continue; + } + prev.value = `(${capture}${escaped}|${prev.value})`; + state.output += prev.value; + continue; + } + if (value === "{" && opts.nobrace !== true) { + increment("braces"); + const open = { + type: "brace", + value, + output: "(", + outputIndex: state.output.length, + tokensIndex: state.tokens.length + }; + braces.push(open); + push(open); + continue; + } + if (value === "}") { + const brace = braces[braces.length - 1]; + if (opts.nobrace === true || !brace) { + push({type: "text", value, output: value}); + continue; + } + let output = ")"; + if (brace.dots === true) { + const arr = tokens.slice(); + const range = []; + for (let i = arr.length - 1; i >= 0; i--) { + tokens.pop(); + if (arr[i].type === "brace") { + break; + } + if (arr[i].type !== "dots") { + range.unshift(arr[i].value); + } + } + output = expandRange(range, opts); + state.backtrack = true; + } + if (brace.comma !== true && brace.dots !== true) { + const out = state.output.slice(0, brace.outputIndex); + const toks = state.tokens.slice(brace.tokensIndex); + brace.value = brace.output = "\\{"; + value = output = "\\}"; + state.output = out; + for (const t of toks) { + state.output += t.output || t.value; + } + } + push({type: "brace", value, output}); + decrement("braces"); + braces.pop(); + continue; + } + if (value === "|") { + if (extglobs.length > 0) { + extglobs[extglobs.length - 1].conditions++; + } + push({type: "text", value}); + continue; + } + if (value === ",") { + let output = value; + const brace = braces[braces.length - 1]; + if (brace && stack[stack.length - 1] === "braces") { + brace.comma = true; + output = "|"; + } + push({type: "comma", value, output}); + continue; + } + if (value === "/") { + if (prev.type === "dot" && state.index === state.start + 1) { + state.start = state.index + 1; + state.consumed = ""; + state.output = ""; + tokens.pop(); + prev = bos; + continue; + } + push({type: "slash", value, output: SLASH_LITERAL}); + continue; + } + if (value === ".") { + if (state.braces > 0 && prev.type === "dot") { + if (prev.value === ".") + prev.output = DOT_LITERAL; + const brace = braces[braces.length - 1]; + prev.type = "dots"; + prev.output += value; + prev.value += value; + brace.dots = true; + continue; + } + if (state.braces + state.parens === 0 && prev.type !== "bos" && prev.type !== "slash") { + push({type: "text", value, output: DOT_LITERAL}); + continue; + } + push({type: "dot", value, output: DOT_LITERAL}); + continue; + } + if (value === "?") { + const isGroup = prev && prev.value === "("; + if (!isGroup && opts.noextglob !== true && peek() === "(" && peek(2) !== "?") { + extglobOpen("qmark", value); + continue; + } + if (prev && prev.type === "paren") { + const next = peek(); + let output = value; + if (next === "<" && !utils.supportsLookbehinds()) { + throw new Error("Node.js v10 or higher is required for regex lookbehinds"); + } + if (prev.value === "(" && !/[!=<:]/.test(next) || next === "<" && !/<([!=]|\w+>)/.test(remaining())) { + output = `\\${value}`; + } + push({type: "text", value, output}); + continue; + } + if (opts.dot !== true && (prev.type === "slash" || prev.type === "bos")) { + push({type: "qmark", value, output: QMARK_NO_DOT}); + continue; + } + push({type: "qmark", value, output: QMARK}); + continue; + } + if (value === "!") { + if (opts.noextglob !== true && peek() === "(") { + if (peek(2) !== "?" || !/[!=<:]/.test(peek(3))) { + extglobOpen("negate", value); + continue; + } + } + if (opts.nonegate !== true && state.index === 0) { + negate(); + continue; + } + } + if (value === "+") { + if (opts.noextglob !== true && peek() === "(" && peek(2) !== "?") { + extglobOpen("plus", value); + continue; + } + if (prev && prev.value === "(" || opts.regex === false) { + push({type: "plus", value, output: PLUS_LITERAL}); + continue; + } + if (prev && (prev.type === "bracket" || prev.type === "paren" || prev.type === "brace") || state.parens > 0) { + push({type: "plus", value}); + continue; + } + push({type: "plus", value: PLUS_LITERAL}); + continue; + } + if (value === "@") { + if (opts.noextglob !== true && peek() === "(" && peek(2) !== "?") { + push({type: "at", extglob: true, value, output: ""}); + continue; + } + push({type: "text", value}); + continue; + } + if (value !== "*") { + if (value === "$" || value === "^") { + value = `\\${value}`; + } + const match = REGEX_NON_SPECIAL_CHARS.exec(remaining()); + if (match) { + value += match[0]; + state.index += match[0].length; + } + push({type: "text", value}); + continue; + } + if (prev && (prev.type === "globstar" || prev.star === true)) { + prev.type = "star"; + prev.star = true; + prev.value += value; + prev.output = star; + state.backtrack = true; + state.globstar = true; + consume(value); + continue; + } + let rest = remaining(); + if (opts.noextglob !== true && /^\([^?]/.test(rest)) { + extglobOpen("star", value); + continue; + } + if (prev.type === "star") { + if (opts.noglobstar === true) { + consume(value); + continue; + } + const prior = prev.prev; + const before = prior.prev; + const isStart = prior.type === "slash" || prior.type === "bos"; + const afterStar = before && (before.type === "star" || before.type === "globstar"); + if (opts.bash === true && (!isStart || rest[0] && rest[0] !== "/")) { + push({type: "star", value, output: ""}); + continue; + } + const isBrace = state.braces > 0 && (prior.type === "comma" || prior.type === "brace"); + const isExtglob = extglobs.length && (prior.type === "pipe" || prior.type === "paren"); + if (!isStart && prior.type !== "paren" && !isBrace && !isExtglob) { + push({type: "star", value, output: ""}); + continue; + } + while (rest.slice(0, 3) === "/**") { + const after = input[state.index + 4]; + if (after && after !== "/") { + break; + } + rest = rest.slice(3); + consume("/**", 3); + } + if (prior.type === "bos" && eos()) { + prev.type = "globstar"; + prev.value += value; + prev.output = globstar(opts); + state.output = prev.output; + state.globstar = true; + consume(value); + continue; + } + if (prior.type === "slash" && prior.prev.type !== "bos" && !afterStar && eos()) { + state.output = state.output.slice(0, -(prior.output + prev.output).length); + prior.output = `(?:${prior.output}`; + prev.type = "globstar"; + prev.output = globstar(opts) + (opts.strictSlashes ? ")" : "|$)"); + prev.value += value; + state.globstar = true; + state.output += prior.output + prev.output; + consume(value); + continue; + } + if (prior.type === "slash" && prior.prev.type !== "bos" && rest[0] === "/") { + const end = rest[1] !== void 0 ? "|$" : ""; + state.output = state.output.slice(0, -(prior.output + prev.output).length); + prior.output = `(?:${prior.output}`; + prev.type = "globstar"; + prev.output = `${globstar(opts)}${SLASH_LITERAL}|${SLASH_LITERAL}${end})`; + prev.value += value; + state.output += prior.output + prev.output; + state.globstar = true; + consume(value + advance()); + push({type: "slash", value: "/", output: ""}); + continue; + } + if (prior.type === "bos" && rest[0] === "/") { + prev.type = "globstar"; + prev.value += value; + prev.output = `(?:^|${SLASH_LITERAL}|${globstar(opts)}${SLASH_LITERAL})`; + state.output = prev.output; + state.globstar = true; + consume(value + advance()); + push({type: "slash", value: "/", output: ""}); + continue; + } + state.output = state.output.slice(0, -prev.output.length); + prev.type = "globstar"; + prev.output = globstar(opts); + prev.value += value; + state.output += prev.output; + state.globstar = true; + consume(value); + continue; + } + const token = {type: "star", value, output: star}; + if (opts.bash === true) { + token.output = ".*?"; + if (prev.type === "bos" || prev.type === "slash") { + token.output = nodot + token.output; + } + push(token); + continue; + } + if (prev && (prev.type === "bracket" || prev.type === "paren") && opts.regex === true) { + token.output = value; + push(token); + continue; + } + if (state.index === state.start || prev.type === "slash" || prev.type === "dot") { + if (prev.type === "dot") { + state.output += NO_DOT_SLASH; + prev.output += NO_DOT_SLASH; + } else if (opts.dot === true) { + state.output += NO_DOTS_SLASH; + prev.output += NO_DOTS_SLASH; + } else { + state.output += nodot; + prev.output += nodot; + } + if (peek() !== "*") { + state.output += ONE_CHAR; + prev.output += ONE_CHAR; + } + } + push(token); + } + while (state.brackets > 0) { + if (opts.strictBrackets === true) + throw new SyntaxError(syntaxError("closing", "]")); + state.output = utils.escapeLast(state.output, "["); + decrement("brackets"); + } + while (state.parens > 0) { + if (opts.strictBrackets === true) + throw new SyntaxError(syntaxError("closing", ")")); + state.output = utils.escapeLast(state.output, "("); + decrement("parens"); + } + while (state.braces > 0) { + if (opts.strictBrackets === true) + throw new SyntaxError(syntaxError("closing", "}")); + state.output = utils.escapeLast(state.output, "{"); + decrement("braces"); + } + if (opts.strictSlashes !== true && (prev.type === "star" || prev.type === "bracket")) { + push({type: "maybe_slash", value: "", output: `${SLASH_LITERAL}?`}); + } + if (state.backtrack === true) { + state.output = ""; + for (const token of state.tokens) { + state.output += token.output != null ? token.output : token.value; + if (token.suffix) { + state.output += token.suffix; + } + } + } + return state; + }; + parse.fastpaths = (input, options) => { + const opts = {...options}; + const max = typeof opts.maxLength === "number" ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; + const len = input.length; + if (len > max) { + throw new SyntaxError(`Input length: ${len}, exceeds maximum allowed length: ${max}`); + } + input = REPLACEMENTS[input] || input; + const win32 = utils.isWindows(options); + const { + DOT_LITERAL, + SLASH_LITERAL, + ONE_CHAR, + DOTS_SLASH, + NO_DOT, + NO_DOTS, + NO_DOTS_SLASH, + STAR, + START_ANCHOR + } = constants.globChars(win32); + const nodot = opts.dot ? NO_DOTS : NO_DOT; + const slashDot = opts.dot ? NO_DOTS_SLASH : NO_DOT; + const capture = opts.capture ? "" : "?:"; + const state = {negated: false, prefix: ""}; + let star = opts.bash === true ? ".*?" : STAR; + if (opts.capture) { + star = `(${star})`; + } + const globstar = (opts2) => { + if (opts2.noglobstar === true) + return star; + return `(${capture}(?:(?!${START_ANCHOR}${opts2.dot ? DOTS_SLASH : DOT_LITERAL}).)*?)`; + }; + const create = (str) => { + switch (str) { + case "*": + return `${nodot}${ONE_CHAR}${star}`; + case ".*": + return `${DOT_LITERAL}${ONE_CHAR}${star}`; + case "*.*": + return `${nodot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; + case "*/*": + return `${nodot}${star}${SLASH_LITERAL}${ONE_CHAR}${slashDot}${star}`; + case "**": + return nodot + globstar(opts); + case "**/*": + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${ONE_CHAR}${star}`; + case "**/*.*": + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${slashDot}${star}${DOT_LITERAL}${ONE_CHAR}${star}`; + case "**/.*": + return `(?:${nodot}${globstar(opts)}${SLASH_LITERAL})?${DOT_LITERAL}${ONE_CHAR}${star}`; + default: { + const match = /^(.*?)\.(\w+)$/.exec(str); + if (!match) + return; + const source2 = create(match[1]); + if (!source2) + return; + return source2 + DOT_LITERAL + match[2]; + } + } + }; + const output = utils.removePrefix(input, state); + let source = create(output); + if (source && opts.strictSlashes !== true) { + source += `${SLASH_LITERAL}?`; + } + return source; + }; + module2.exports = parse; +}); + +// ../../node_modules/picomatch/lib/picomatch.js +var require_picomatch = __commonJS((exports2, module2) => { + "use strict"; + var path = require("path"); + var scan = require_scan(); + var parse = require_parse(); + var utils = require_utils(); + var constants = require_constants(); + var isObject = (val) => val && typeof val === "object" && !Array.isArray(val); + var picomatch = (glob, options, returnState = false) => { + if (Array.isArray(glob)) { + const fns = glob.map((input) => picomatch(input, options, returnState)); + const arrayMatcher = (str) => { + for (const isMatch of fns) { + const state2 = isMatch(str); + if (state2) + return state2; + } + return false; + }; + return arrayMatcher; + } + const isState = isObject(glob) && glob.tokens && glob.input; + if (glob === "" || typeof glob !== "string" && !isState) { + throw new TypeError("Expected pattern to be a non-empty string"); + } + const opts = options || {}; + const posix = utils.isWindows(options); + const regex = isState ? picomatch.compileRe(glob, options) : picomatch.makeRe(glob, options, false, true); + const state = regex.state; + delete regex.state; + let isIgnored = () => false; + if (opts.ignore) { + const ignoreOpts = {...options, ignore: null, onMatch: null, onResult: null}; + isIgnored = picomatch(opts.ignore, ignoreOpts, returnState); + } + const matcher = (input, returnObject = false) => { + const {isMatch, match, output} = picomatch.test(input, regex, options, {glob, posix}); + const result = {glob, state, regex, posix, input, output, match, isMatch}; + if (typeof opts.onResult === "function") { + opts.onResult(result); + } + if (isMatch === false) { + result.isMatch = false; + return returnObject ? result : false; + } + if (isIgnored(input)) { + if (typeof opts.onIgnore === "function") { + opts.onIgnore(result); + } + result.isMatch = false; + return returnObject ? result : false; + } + if (typeof opts.onMatch === "function") { + opts.onMatch(result); + } + return returnObject ? result : true; + }; + if (returnState) { + matcher.state = state; + } + return matcher; + }; + picomatch.test = (input, regex, options, {glob, posix} = {}) => { + if (typeof input !== "string") { + throw new TypeError("Expected input to be a string"); + } + if (input === "") { + return {isMatch: false, output: ""}; + } + const opts = options || {}; + const format = opts.format || (posix ? utils.toPosixSlashes : null); + let match = input === glob; + let output = match && format ? format(input) : input; + if (match === false) { + output = format ? format(input) : input; + match = output === glob; + } + if (match === false || opts.capture === true) { + if (opts.matchBase === true || opts.basename === true) { + match = picomatch.matchBase(input, regex, options, posix); + } else { + match = regex.exec(output); + } + } + return {isMatch: Boolean(match), match, output}; + }; + picomatch.matchBase = (input, glob, options, posix = utils.isWindows(options)) => { + const regex = glob instanceof RegExp ? glob : picomatch.makeRe(glob, options); + return regex.test(path.basename(input)); + }; + picomatch.isMatch = (str, patterns, options) => picomatch(patterns, options)(str); + picomatch.parse = (pattern, options) => { + if (Array.isArray(pattern)) + return pattern.map((p) => picomatch.parse(p, options)); + return parse(pattern, {...options, fastpaths: false}); + }; + picomatch.scan = (input, options) => scan(input, options); + picomatch.compileRe = (state, options, returnOutput = false, returnState = false) => { + if (returnOutput === true) { + return state.output; + } + const opts = options || {}; + const prepend = opts.contains ? "" : "^"; + const append = opts.contains ? "" : "$"; + let source = `${prepend}(?:${state.output})${append}`; + if (state && state.negated === true) { + source = `^(?!${source}).*$`; + } + const regex = picomatch.toRegex(source, options); + if (returnState === true) { + regex.state = state; + } + return regex; + }; + picomatch.makeRe = (input, options = {}, returnOutput = false, returnState = false) => { + if (!input || typeof input !== "string") { + throw new TypeError("Expected a non-empty string"); + } + let parsed = {negated: false, fastpaths: true}; + if (options.fastpaths !== false && (input[0] === "." || input[0] === "*")) { + parsed.output = parse.fastpaths(input, options); + } + if (!parsed.output) { + parsed = parse(input, options); + } + return picomatch.compileRe(parsed, options, returnOutput, returnState); + }; + picomatch.toRegex = (source, options) => { + try { + const opts = options || {}; + return new RegExp(source, opts.flags || (opts.nocase ? "i" : "")); + } catch (err) { + if (options && options.debug === true) + throw err; + return /$^/; + } + }; + picomatch.constants = constants; + module2.exports = picomatch; +}); + +// ../../node_modules/picomatch/index.js +var require_picomatch2 = __commonJS((exports2, module2) => { + "use strict"; + module2.exports = require_picomatch(); +}); + +// ../../node_modules/readdirp/index.js +var require_readdirp = __commonJS((exports2, module2) => { + "use strict"; + var fs = require("fs"); + var {Readable} = require("stream"); + var sysPath = require("path"); + var {promisify} = require("util"); + var picomatch = require_picomatch2(); + var readdir = promisify(fs.readdir); + var stat = promisify(fs.stat); + var lstat = promisify(fs.lstat); + var realpath = promisify(fs.realpath); + var BANG = "!"; + var RECURSIVE_ERROR_CODE = "READDIRP_RECURSIVE_ERROR"; + var NORMAL_FLOW_ERRORS = new Set(["ENOENT", "EPERM", "EACCES", "ELOOP", RECURSIVE_ERROR_CODE]); + var FILE_TYPE = "files"; + var DIR_TYPE = "directories"; + var FILE_DIR_TYPE = "files_directories"; + var EVERYTHING_TYPE = "all"; + var ALL_TYPES = [FILE_TYPE, DIR_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE]; + var isNormalFlowError = (error) => NORMAL_FLOW_ERRORS.has(error.code); + var [maj, min] = process.versions.node.split(".").slice(0, 2).map((n) => Number.parseInt(n, 10)); + var wantBigintFsStats = process.platform === "win32" && (maj > 10 || maj === 10 && min >= 5); + var normalizeFilter = (filter) => { + if (filter === void 0) + return; + if (typeof filter === "function") + return filter; + if (typeof filter === "string") { + const glob = picomatch(filter.trim()); + return (entry) => glob(entry.basename); + } + if (Array.isArray(filter)) { + const positive = []; + const negative = []; + for (const item of filter) { + const trimmed = item.trim(); + if (trimmed.charAt(0) === BANG) { + negative.push(picomatch(trimmed.slice(1))); + } else { + positive.push(picomatch(trimmed)); + } + } + if (negative.length > 0) { + if (positive.length > 0) { + return (entry) => positive.some((f) => f(entry.basename)) && !negative.some((f) => f(entry.basename)); + } + return (entry) => !negative.some((f) => f(entry.basename)); + } + return (entry) => positive.some((f) => f(entry.basename)); + } + }; + var ReaddirpStream = class extends Readable { + static get defaultOptions() { + return { + root: ".", + fileFilter: (path) => true, + directoryFilter: (path) => true, + type: FILE_TYPE, + lstat: false, + depth: 2147483648, + alwaysStat: false + }; + } + constructor(options = {}) { + super({ + objectMode: true, + autoDestroy: true, + highWaterMark: options.highWaterMark || 4096 + }); + const opts = {...ReaddirpStream.defaultOptions, ...options}; + const {root, type} = opts; + this._fileFilter = normalizeFilter(opts.fileFilter); + this._directoryFilter = normalizeFilter(opts.directoryFilter); + const statMethod = opts.lstat ? lstat : stat; + if (wantBigintFsStats) { + this._stat = (path) => statMethod(path, {bigint: true}); + } else { + this._stat = statMethod; + } + this._maxDepth = opts.depth; + this._wantsDir = [DIR_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE].includes(type); + this._wantsFile = [FILE_TYPE, FILE_DIR_TYPE, EVERYTHING_TYPE].includes(type); + this._wantsEverything = type === EVERYTHING_TYPE; + this._root = sysPath.resolve(root); + this._isDirent = "Dirent" in fs && !opts.alwaysStat; + this._statsProp = this._isDirent ? "dirent" : "stats"; + this._rdOptions = {encoding: "utf8", withFileTypes: this._isDirent}; + this.parents = [this._exploreDir(root, 1)]; + this.reading = false; + this.parent = void 0; + } + async _read(batch) { + if (this.reading) + return; + this.reading = true; + try { + while (!this.destroyed && batch > 0) { + const {path, depth, files = []} = this.parent || {}; + if (files.length > 0) { + const slice = files.splice(0, batch).map((dirent) => this._formatEntry(dirent, path)); + for (const entry of await Promise.all(slice)) { + if (this.destroyed) + return; + const entryType = await this._getEntryType(entry); + if (entryType === "directory" && this._directoryFilter(entry)) { + if (depth <= this._maxDepth) { + this.parents.push(this._exploreDir(entry.fullPath, depth + 1)); + } + if (this._wantsDir) { + this.push(entry); + batch--; + } + } else if ((entryType === "file" || this._includeAsFile(entry)) && this._fileFilter(entry)) { + if (this._wantsFile) { + this.push(entry); + batch--; + } + } + } + } else { + const parent = this.parents.pop(); + if (!parent) { + this.push(null); + break; + } + this.parent = await parent; + if (this.destroyed) + return; + } + } + } catch (error) { + this.destroy(error); + } finally { + this.reading = false; + } + } + async _exploreDir(path, depth) { + let files; + try { + files = await readdir(path, this._rdOptions); + } catch (error) { + this._onError(error); + } + return {files, depth, path}; + } + async _formatEntry(dirent, path) { + let entry; + try { + const basename = this._isDirent ? dirent.name : dirent; + const fullPath = sysPath.resolve(sysPath.join(path, basename)); + entry = {path: sysPath.relative(this._root, fullPath), fullPath, basename}; + entry[this._statsProp] = this._isDirent ? dirent : await this._stat(fullPath); + } catch (err) { + this._onError(err); + } + return entry; + } + _onError(err) { + if (isNormalFlowError(err) && !this.destroyed) { + this.emit("warn", err); + } else { + this.destroy(err); + } + } + async _getEntryType(entry) { + const stats = entry && entry[this._statsProp]; + if (!stats) { + return; + } + if (stats.isFile()) { + return "file"; + } + if (stats.isDirectory()) { + return "directory"; + } + if (stats && stats.isSymbolicLink()) { + const full = entry.fullPath; + try { + const entryRealPath = await realpath(full); + const entryRealPathStats = await lstat(entryRealPath); + if (entryRealPathStats.isFile()) { + return "file"; + } + if (entryRealPathStats.isDirectory()) { + const len = entryRealPath.length; + if (full.startsWith(entryRealPath) && full.substr(len, 1) === sysPath.sep) { + const recursiveError = new Error(`Circular symlink detected: "${full}" points to "${entryRealPath}"`); + recursiveError.code = RECURSIVE_ERROR_CODE; + return this._onError(recursiveError); + } + return "directory"; + } + } catch (error) { + this._onError(error); + } + } + } + _includeAsFile(entry) { + const stats = entry && entry[this._statsProp]; + return stats && this._wantsEverything && !stats.isDirectory(); + } + }; + var readdirp = (root, options = {}) => { + let type = options.entryType || options.type; + if (type === "both") + type = FILE_DIR_TYPE; + if (type) + options.type = type; + if (!root) { + throw new Error("readdirp: root argument is required. Usage: readdirp(root, options)"); + } else if (typeof root !== "string") { + throw new TypeError("readdirp: root argument must be a string. Usage: readdirp(root, options)"); + } else if (type && !ALL_TYPES.includes(type)) { + throw new Error(`readdirp: Invalid type passed. Use one of ${ALL_TYPES.join(", ")}`); + } + options.root = root; + return new ReaddirpStream(options); + }; + var readdirpPromise = (root, options = {}) => { + return new Promise((resolve, reject) => { + const files = []; + readdirp(root, options).on("data", (entry) => files.push(entry)).on("end", () => resolve(files)).on("error", (error) => reject(error)); + }); + }; + readdirp.promise = readdirpPromise; + readdirp.ReaddirpStream = ReaddirpStream; + readdirp.default = readdirp; + module2.exports = readdirp; +}); + +// ../../node_modules/normalize-path/index.js +var require_normalize_path = __commonJS((exports2, module2) => { + /*! + * normalize-path + * + * Copyright (c) 2014-2018, Jon Schlinkert. + * Released under the MIT License. + */ + module2.exports = function(path, stripTrailing) { + if (typeof path !== "string") { + throw new TypeError("expected path to be a string"); + } + if (path === "\\" || path === "/") + return "/"; + var len = path.length; + if (len <= 1) + return path; + var prefix = ""; + if (len > 4 && path[3] === "\\") { + var ch = path[2]; + if ((ch === "?" || ch === ".") && path.slice(0, 2) === "\\\\") { + path = path.slice(2); + prefix = "//"; + } + } + var segs = path.split(/[/\\]+/); + if (stripTrailing !== false && segs[segs.length - 1] === "") { + segs.pop(); + } + return prefix + segs.join("/"); + }; +}); + +// ../../node_modules/anymatch/index.js +var require_anymatch = __commonJS((exports2, module2) => { + "use strict"; + Object.defineProperty(exports2, "__esModule", {value: true}); + var picomatch = require_picomatch2(); + var normalizePath = require_normalize_path(); + var BANG = "!"; + var DEFAULT_OPTIONS = {returnIndex: false}; + var arrify = (item) => Array.isArray(item) ? item : [item]; + var createPattern = (matcher, options) => { + if (typeof matcher === "function") { + return matcher; + } + if (typeof matcher === "string") { + const glob = picomatch(matcher, options); + return (string) => matcher === string || glob(string); + } + if (matcher instanceof RegExp) { + return (string) => matcher.test(string); + } + return (string) => false; + }; + var matchPatterns = (patterns, negPatterns, args, returnIndex) => { + const isList = Array.isArray(args); + const _path = isList ? args[0] : args; + if (!isList && typeof _path !== "string") { + throw new TypeError("anymatch: second argument must be a string: got " + Object.prototype.toString.call(_path)); + } + const path = normalizePath(_path); + for (let index = 0; index < negPatterns.length; index++) { + const nglob = negPatterns[index]; + if (nglob(path)) { + return returnIndex ? -1 : false; + } + } + const applied = isList && [path].concat(args.slice(1)); + for (let index = 0; index < patterns.length; index++) { + const pattern = patterns[index]; + if (isList ? pattern(...applied) : pattern(path)) { + return returnIndex ? index : true; + } + } + return returnIndex ? -1 : false; + }; + var anymatch = (matchers, testString, options = DEFAULT_OPTIONS) => { + if (matchers == null) { + throw new TypeError("anymatch: specify first argument"); + } + const opts = typeof options === "boolean" ? {returnIndex: options} : options; + const returnIndex = opts.returnIndex || false; + const mtchers = arrify(matchers); + const negatedGlobs = mtchers.filter((item) => typeof item === "string" && item.charAt(0) === BANG).map((item) => item.slice(1)).map((item) => picomatch(item, opts)); + const patterns = mtchers.filter((item) => typeof item !== "string" || typeof item === "string" && item.charAt(0) !== BANG).map((matcher) => createPattern(matcher, opts)); + if (testString == null) { + return (testString2, ri = false) => { + const returnIndex2 = typeof ri === "boolean" ? ri : false; + return matchPatterns(patterns, negatedGlobs, testString2, returnIndex2); + }; + } + return matchPatterns(patterns, negatedGlobs, testString, returnIndex); + }; + anymatch.default = anymatch; + module2.exports = anymatch; +}); + +// ../../node_modules/is-extglob/index.js +var require_is_extglob = __commonJS((exports2, module2) => { + /*! + * is-extglob + * + * Copyright (c) 2014-2016, Jon Schlinkert. + * Licensed under the MIT License. + */ + module2.exports = function isExtglob(str) { + if (typeof str !== "string" || str === "") { + return false; + } + var match; + while (match = /(\\).|([@?!+*]\(.*\))/g.exec(str)) { + if (match[2]) + return true; + str = str.slice(match.index + match[0].length); + } + return false; + }; +}); + +// ../../node_modules/is-glob/index.js +var require_is_glob = __commonJS((exports2, module2) => { + /*! + * is-glob + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ + var isExtglob = require_is_extglob(); + var chars = {"{": "}", "(": ")", "[": "]"}; + var strictRegex = /\\(.)|(^!|\*|[\].+)]\?|\[[^\\\]]+\]|\{[^\\}]+\}|\(\?[:!=][^\\)]+\)|\([^|]+\|[^\\)]+\))/; + var relaxedRegex = /\\(.)|(^!|[*?{}()[\]]|\(\?)/; + module2.exports = function isGlob(str, options) { + if (typeof str !== "string" || str === "") { + return false; + } + if (isExtglob(str)) { + return true; + } + var regex = strictRegex; + var match; + if (options && options.strict === false) { + regex = relaxedRegex; + } + while (match = regex.exec(str)) { + if (match[2]) + return true; + var idx = match.index + match[0].length; + var open = match[1]; + var close = open ? chars[open] : null; + if (open && close) { + var n = str.indexOf(close, idx); + if (n !== -1) { + idx = n + 1; + } + } + str = str.slice(idx); + } + return false; + }; +}); + +// ../../node_modules/glob-parent/index.js +var require_glob_parent = __commonJS((exports2, module2) => { + "use strict"; + var isGlob = require_is_glob(); + var pathPosixDirname = require("path").posix.dirname; + var isWin32 = require("os").platform() === "win32"; + var slash = "/"; + var backslash = /\\/g; + var enclosure = /[\{\[].*[\}\]]$/; + var globby = /(^|[^\\])([\{\[]|\([^\)]+$)/; + var escaped = /\\([\!\*\?\|\[\]\(\)\{\}])/g; + module2.exports = function globParent(str, opts) { + var options = Object.assign({flipBackslashes: true}, opts); + if (options.flipBackslashes && isWin32 && str.indexOf(slash) < 0) { + str = str.replace(backslash, slash); + } + if (enclosure.test(str)) { + str += slash; + } + str += "a"; + do { + str = pathPosixDirname(str); + } while (isGlob(str) || globby.test(str)); + return str.replace(escaped, "$1"); + }; +}); + +// ../../node_modules/chokidar/node_modules/braces/lib/utils.js +var require_utils2 = __commonJS((exports2) => { + "use strict"; + exports2.isInteger = (num) => { + if (typeof num === "number") { + return Number.isInteger(num); + } + if (typeof num === "string" && num.trim() !== "") { + return Number.isInteger(Number(num)); + } + return false; + }; + exports2.find = (node, type) => node.nodes.find((node2) => node2.type === type); + exports2.exceedsLimit = (min, max, step = 1, limit) => { + if (limit === false) + return false; + if (!exports2.isInteger(min) || !exports2.isInteger(max)) + return false; + return (Number(max) - Number(min)) / Number(step) >= limit; + }; + exports2.escapeNode = (block, n = 0, type) => { + let node = block.nodes[n]; + if (!node) + return; + if (type && node.type === type || node.type === "open" || node.type === "close") { + if (node.escaped !== true) { + node.value = "\\" + node.value; + node.escaped = true; + } + } + }; + exports2.encloseBrace = (node) => { + if (node.type !== "brace") + return false; + if (node.commas >> 0 + node.ranges >> 0 === 0) { + node.invalid = true; + return true; + } + return false; + }; + exports2.isInvalidBrace = (block) => { + if (block.type !== "brace") + return false; + if (block.invalid === true || block.dollar) + return true; + if (block.commas >> 0 + block.ranges >> 0 === 0) { + block.invalid = true; + return true; + } + if (block.open !== true || block.close !== true) { + block.invalid = true; + return true; + } + return false; + }; + exports2.isOpenOrClose = (node) => { + if (node.type === "open" || node.type === "close") { + return true; + } + return node.open === true || node.close === true; + }; + exports2.reduce = (nodes2) => nodes2.reduce((acc, node) => { + if (node.type === "text") + acc.push(node.value); + if (node.type === "range") + node.type = "text"; + return acc; + }, []); + exports2.flatten = (...args) => { + const result = []; + const flat = (arr) => { + for (let i = 0; i < arr.length; i++) { + let ele = arr[i]; + Array.isArray(ele) ? flat(ele, result) : ele !== void 0 && result.push(ele); + } + return result; + }; + flat(args); + return result; + }; +}); + +// ../../node_modules/chokidar/node_modules/braces/lib/stringify.js +var require_stringify = __commonJS((exports2, module2) => { + "use strict"; + var utils = require_utils2(); + module2.exports = (ast, options = {}) => { + let stringify = (node, parent = {}) => { + let invalidBlock = options.escapeInvalid && utils.isInvalidBrace(parent); + let invalidNode = node.invalid === true && options.escapeInvalid === true; + let output = ""; + if (node.value) { + if ((invalidBlock || invalidNode) && utils.isOpenOrClose(node)) { + return "\\" + node.value; + } + return node.value; + } + if (node.value) { + return node.value; + } + if (node.nodes) { + for (let child of node.nodes) { + output += stringify(child); + } + } + return output; + }; + return stringify(ast); + }; +}); + +// ../../node_modules/chokidar/node_modules/is-number/index.js +var require_is_number = __commonJS((exports2, module2) => { + /*! + * is-number + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Released under the MIT License. + */ + "use strict"; + module2.exports = function(num) { + if (typeof num === "number") { + return num - num === 0; + } + if (typeof num === "string" && num.trim() !== "") { + return Number.isFinite ? Number.isFinite(+num) : isFinite(+num); + } + return false; + }; +}); + +// ../../node_modules/chokidar/node_modules/to-regex-range/index.js +var require_to_regex_range = __commonJS((exports2, module2) => { + /*! + * to-regex-range + * + * Copyright (c) 2015-present, Jon Schlinkert. + * Released under the MIT License. + */ + "use strict"; + var isNumber = require_is_number(); + var toRegexRange = (min, max, options) => { + if (isNumber(min) === false) { + throw new TypeError("toRegexRange: expected the first argument to be a number"); + } + if (max === void 0 || min === max) { + return String(min); + } + if (isNumber(max) === false) { + throw new TypeError("toRegexRange: expected the second argument to be a number."); + } + let opts = {relaxZeros: true, ...options}; + if (typeof opts.strictZeros === "boolean") { + opts.relaxZeros = opts.strictZeros === false; + } + let relax = String(opts.relaxZeros); + let shorthand = String(opts.shorthand); + let capture = String(opts.capture); + let wrap = String(opts.wrap); + let cacheKey = min + ":" + max + "=" + relax + shorthand + capture + wrap; + if (toRegexRange.cache.hasOwnProperty(cacheKey)) { + return toRegexRange.cache[cacheKey].result; + } + let a = Math.min(min, max); + let b = Math.max(min, max); + if (Math.abs(a - b) === 1) { + let result = min + "|" + max; + if (opts.capture) { + return `(${result})`; + } + if (opts.wrap === false) { + return result; + } + return `(?:${result})`; + } + let isPadded = hasPadding(min) || hasPadding(max); + let state = {min, max, a, b}; + let positives = []; + let negatives = []; + if (isPadded) { + state.isPadded = isPadded; + state.maxLen = String(state.max).length; + } + if (a < 0) { + let newMin = b < 0 ? Math.abs(b) : 1; + negatives = splitToPatterns(newMin, Math.abs(a), state, opts); + a = state.a = 0; + } + if (b >= 0) { + positives = splitToPatterns(a, b, state, opts); + } + state.negatives = negatives; + state.positives = positives; + state.result = collatePatterns(negatives, positives, opts); + if (opts.capture === true) { + state.result = `(${state.result})`; + } else if (opts.wrap !== false && positives.length + negatives.length > 1) { + state.result = `(?:${state.result})`; + } + toRegexRange.cache[cacheKey] = state; + return state.result; + }; + function collatePatterns(neg, pos, options) { + let onlyNegative = filterPatterns(neg, pos, "-", false, options) || []; + let onlyPositive = filterPatterns(pos, neg, "", false, options) || []; + let intersected = filterPatterns(neg, pos, "-?", true, options) || []; + let subpatterns = onlyNegative.concat(intersected).concat(onlyPositive); + return subpatterns.join("|"); + } + function splitToRanges(min, max) { + let nines = 1; + let zeros = 1; + let stop = countNines(min, nines); + let stops = new Set([max]); + while (min <= stop && stop <= max) { + stops.add(stop); + nines += 1; + stop = countNines(min, nines); + } + stop = countZeros(max + 1, zeros) - 1; + while (min < stop && stop <= max) { + stops.add(stop); + zeros += 1; + stop = countZeros(max + 1, zeros) - 1; + } + stops = [...stops]; + stops.sort(compare); + return stops; + } + function rangeToPattern(start, stop, options) { + if (start === stop) { + return {pattern: start, count: [], digits: 0}; + } + let zipped = zip(start, stop); + let digits = zipped.length; + let pattern = ""; + let count = 0; + for (let i = 0; i < digits; i++) { + let [startDigit, stopDigit] = zipped[i]; + if (startDigit === stopDigit) { + pattern += startDigit; + } else if (startDigit !== "0" || stopDigit !== "9") { + pattern += toCharacterClass(startDigit, stopDigit, options); + } else { + count++; + } + } + if (count) { + pattern += options.shorthand === true ? "\\d" : "[0-9]"; + } + return {pattern, count: [count], digits}; + } + function splitToPatterns(min, max, tok, options) { + let ranges = splitToRanges(min, max); + let tokens = []; + let start = min; + let prev; + for (let i = 0; i < ranges.length; i++) { + let max2 = ranges[i]; + let obj = rangeToPattern(String(start), String(max2), options); + let zeros = ""; + if (!tok.isPadded && prev && prev.pattern === obj.pattern) { + if (prev.count.length > 1) { + prev.count.pop(); + } + prev.count.push(obj.count[0]); + prev.string = prev.pattern + toQuantifier(prev.count); + start = max2 + 1; + continue; + } + if (tok.isPadded) { + zeros = padZeros(max2, tok, options); + } + obj.string = zeros + obj.pattern + toQuantifier(obj.count); + tokens.push(obj); + start = max2 + 1; + prev = obj; + } + return tokens; + } + function filterPatterns(arr, comparison, prefix, intersection, options) { + let result = []; + for (let ele of arr) { + let {string} = ele; + if (!intersection && !contains(comparison, "string", string)) { + result.push(prefix + string); + } + if (intersection && contains(comparison, "string", string)) { + result.push(prefix + string); + } + } + return result; + } + function zip(a, b) { + let arr = []; + for (let i = 0; i < a.length; i++) + arr.push([a[i], b[i]]); + return arr; + } + function compare(a, b) { + return a > b ? 1 : b > a ? -1 : 0; + } + function contains(arr, key, val) { + return arr.some((ele) => ele[key] === val); + } + function countNines(min, len) { + return Number(String(min).slice(0, -len) + "9".repeat(len)); + } + function countZeros(integer, zeros) { + return integer - integer % Math.pow(10, zeros); + } + function toQuantifier(digits) { + let [start = 0, stop = ""] = digits; + if (stop || start > 1) { + return `{${start + (stop ? "," + stop : "")}}`; + } + return ""; + } + function toCharacterClass(a, b, options) { + return `[${a}${b - a === 1 ? "" : "-"}${b}]`; + } + function hasPadding(str) { + return /^-?(0+)\d/.test(str); + } + function padZeros(value, tok, options) { + if (!tok.isPadded) { + return value; + } + let diff = Math.abs(tok.maxLen - String(value).length); + let relax = options.relaxZeros !== false; + switch (diff) { + case 0: + return ""; + case 1: + return relax ? "0?" : "0"; + case 2: + return relax ? "0{0,2}" : "00"; + default: { + return relax ? `0{0,${diff}}` : `0{${diff}}`; + } + } + } + toRegexRange.cache = {}; + toRegexRange.clearCache = () => toRegexRange.cache = {}; + module2.exports = toRegexRange; +}); + +// ../../node_modules/chokidar/node_modules/fill-range/index.js +var require_fill_range = __commonJS((exports2, module2) => { + /*! + * fill-range + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Licensed under the MIT License. + */ + "use strict"; + var util = require("util"); + var toRegexRange = require_to_regex_range(); + var isObject = (val) => val !== null && typeof val === "object" && !Array.isArray(val); + var transform = (toNumber) => { + return (value) => toNumber === true ? Number(value) : String(value); + }; + var isValidValue = (value) => { + return typeof value === "number" || typeof value === "string" && value !== ""; + }; + var isNumber = (num) => Number.isInteger(+num); + var zeros = (input) => { + let value = `${input}`; + let index = -1; + if (value[0] === "-") + value = value.slice(1); + if (value === "0") + return false; + while (value[++index] === "0") + ; + return index > 0; + }; + var stringify = (start, end, options) => { + if (typeof start === "string" || typeof end === "string") { + return true; + } + return options.stringify === true; + }; + var pad = (input, maxLength, toNumber) => { + if (maxLength > 0) { + let dash = input[0] === "-" ? "-" : ""; + if (dash) + input = input.slice(1); + input = dash + input.padStart(dash ? maxLength - 1 : maxLength, "0"); + } + if (toNumber === false) { + return String(input); + } + return input; + }; + var toMaxLen = (input, maxLength) => { + let negative = input[0] === "-" ? "-" : ""; + if (negative) { + input = input.slice(1); + maxLength--; + } + while (input.length < maxLength) + input = "0" + input; + return negative ? "-" + input : input; + }; + var toSequence = (parts, options) => { + parts.negatives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0); + parts.positives.sort((a, b) => a < b ? -1 : a > b ? 1 : 0); + let prefix = options.capture ? "" : "?:"; + let positives = ""; + let negatives = ""; + let result; + if (parts.positives.length) { + positives = parts.positives.join("|"); + } + if (parts.negatives.length) { + negatives = `-(${prefix}${parts.negatives.join("|")})`; + } + if (positives && negatives) { + result = `${positives}|${negatives}`; + } else { + result = positives || negatives; + } + if (options.wrap) { + return `(${prefix}${result})`; + } + return result; + }; + var toRange = (a, b, isNumbers, options) => { + if (isNumbers) { + return toRegexRange(a, b, {wrap: false, ...options}); + } + let start = String.fromCharCode(a); + if (a === b) + return start; + let stop = String.fromCharCode(b); + return `[${start}-${stop}]`; + }; + var toRegex = (start, end, options) => { + if (Array.isArray(start)) { + let wrap = options.wrap === true; + let prefix = options.capture ? "" : "?:"; + return wrap ? `(${prefix}${start.join("|")})` : start.join("|"); + } + return toRegexRange(start, end, options); + }; + var rangeError = (...args) => { + return new RangeError("Invalid range arguments: " + util.inspect(...args)); + }; + var invalidRange = (start, end, options) => { + if (options.strictRanges === true) + throw rangeError([start, end]); + return []; + }; + var invalidStep = (step, options) => { + if (options.strictRanges === true) { + throw new TypeError(`Expected step "${step}" to be a number`); + } + return []; + }; + var fillNumbers = (start, end, step = 1, options = {}) => { + let a = Number(start); + let b = Number(end); + if (!Number.isInteger(a) || !Number.isInteger(b)) { + if (options.strictRanges === true) + throw rangeError([start, end]); + return []; + } + if (a === 0) + a = 0; + if (b === 0) + b = 0; + let descending = a > b; + let startString = String(start); + let endString = String(end); + let stepString = String(step); + step = Math.max(Math.abs(step), 1); + let padded = zeros(startString) || zeros(endString) || zeros(stepString); + let maxLen = padded ? Math.max(startString.length, endString.length, stepString.length) : 0; + let toNumber = padded === false && stringify(start, end, options) === false; + let format = options.transform || transform(toNumber); + if (options.toRegex && step === 1) { + return toRange(toMaxLen(start, maxLen), toMaxLen(end, maxLen), true, options); + } + let parts = {negatives: [], positives: []}; + let push = (num) => parts[num < 0 ? "negatives" : "positives"].push(Math.abs(num)); + let range = []; + let index = 0; + while (descending ? a >= b : a <= b) { + if (options.toRegex === true && step > 1) { + push(a); + } else { + range.push(pad(format(a, index), maxLen, toNumber)); + } + a = descending ? a - step : a + step; + index++; + } + if (options.toRegex === true) { + return step > 1 ? toSequence(parts, options) : toRegex(range, null, {wrap: false, ...options}); + } + return range; + }; + var fillLetters = (start, end, step = 1, options = {}) => { + if (!isNumber(start) && start.length > 1 || !isNumber(end) && end.length > 1) { + return invalidRange(start, end, options); + } + let format = options.transform || ((val) => String.fromCharCode(val)); + let a = `${start}`.charCodeAt(0); + let b = `${end}`.charCodeAt(0); + let descending = a > b; + let min = Math.min(a, b); + let max = Math.max(a, b); + if (options.toRegex && step === 1) { + return toRange(min, max, false, options); + } + let range = []; + let index = 0; + while (descending ? a >= b : a <= b) { + range.push(format(a, index)); + a = descending ? a - step : a + step; + index++; + } + if (options.toRegex === true) { + return toRegex(range, null, {wrap: false, options}); + } + return range; + }; + var fill = (start, end, step, options = {}) => { + if (end == null && isValidValue(start)) { + return [start]; + } + if (!isValidValue(start) || !isValidValue(end)) { + return invalidRange(start, end, options); + } + if (typeof step === "function") { + return fill(start, end, 1, {transform: step}); + } + if (isObject(step)) { + return fill(start, end, 0, step); + } + let opts = {...options}; + if (opts.capture === true) + opts.wrap = true; + step = step || opts.step || 1; + if (!isNumber(step)) { + if (step != null && !isObject(step)) + return invalidStep(step, opts); + return fill(start, end, 1, step); + } + if (isNumber(start) && isNumber(end)) { + return fillNumbers(start, end, step, opts); + } + return fillLetters(start, end, Math.max(Math.abs(step), 1), opts); + }; + module2.exports = fill; +}); + +// ../../node_modules/chokidar/node_modules/braces/lib/compile.js +var require_compile = __commonJS((exports2, module2) => { + "use strict"; + var fill = require_fill_range(); + var utils = require_utils2(); + var compile2 = (ast, options = {}) => { + let walk = (node, parent = {}) => { + let invalidBlock = utils.isInvalidBrace(parent); + let invalidNode = node.invalid === true && options.escapeInvalid === true; + let invalid = invalidBlock === true || invalidNode === true; + let prefix = options.escapeInvalid === true ? "\\" : ""; + let output = ""; + if (node.isOpen === true) { + return prefix + node.value; + } + if (node.isClose === true) { + return prefix + node.value; + } + if (node.type === "open") { + return invalid ? prefix + node.value : "("; + } + if (node.type === "close") { + return invalid ? prefix + node.value : ")"; + } + if (node.type === "comma") { + return node.prev.type === "comma" ? "" : invalid ? node.value : "|"; + } + if (node.value) { + return node.value; + } + if (node.nodes && node.ranges > 0) { + let args = utils.reduce(node.nodes); + let range = fill(...args, {...options, wrap: false, toRegex: true}); + if (range.length !== 0) { + return args.length > 1 && range.length > 1 ? `(${range})` : range; + } + } + if (node.nodes) { + for (let child of node.nodes) { + output += walk(child, node); + } + } + return output; + }; + return walk(ast); + }; + module2.exports = compile2; +}); + +// ../../node_modules/chokidar/node_modules/braces/lib/expand.js +var require_expand = __commonJS((exports2, module2) => { + "use strict"; + var fill = require_fill_range(); + var stringify = require_stringify(); + var utils = require_utils2(); + var append = (queue = "", stash = "", enclose = false) => { + let result = []; + queue = [].concat(queue); + stash = [].concat(stash); + if (!stash.length) + return queue; + if (!queue.length) { + return enclose ? utils.flatten(stash).map((ele) => `{${ele}}`) : stash; + } + for (let item of queue) { + if (Array.isArray(item)) { + for (let value of item) { + result.push(append(value, stash, enclose)); + } + } else { + for (let ele of stash) { + if (enclose === true && typeof ele === "string") + ele = `{${ele}}`; + result.push(Array.isArray(ele) ? append(item, ele, enclose) : item + ele); + } + } + } + return utils.flatten(result); + }; + var expand = (ast, options = {}) => { + let rangeLimit = options.rangeLimit === void 0 ? 1e3 : options.rangeLimit; + let walk = (node, parent = {}) => { + node.queue = []; + let p = parent; + let q = parent.queue; + while (p.type !== "brace" && p.type !== "root" && p.parent) { + p = p.parent; + q = p.queue; + } + if (node.invalid || node.dollar) { + q.push(append(q.pop(), stringify(node, options))); + return; + } + if (node.type === "brace" && node.invalid !== true && node.nodes.length === 2) { + q.push(append(q.pop(), ["{}"])); + return; + } + if (node.nodes && node.ranges > 0) { + let args = utils.reduce(node.nodes); + if (utils.exceedsLimit(...args, options.step, rangeLimit)) { + throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit."); + } + let range = fill(...args, options); + if (range.length === 0) { + range = stringify(node, options); + } + q.push(append(q.pop(), range)); + node.nodes = []; + return; + } + let enclose = utils.encloseBrace(node); + let queue = node.queue; + let block = node; + while (block.type !== "brace" && block.type !== "root" && block.parent) { + block = block.parent; + queue = block.queue; + } + for (let i = 0; i < node.nodes.length; i++) { + let child = node.nodes[i]; + if (child.type === "comma" && node.type === "brace") { + if (i === 1) + queue.push(""); + queue.push(""); + continue; + } + if (child.type === "close") { + q.push(append(q.pop(), queue, enclose)); + continue; + } + if (child.value && child.type !== "open") { + queue.push(append(queue.pop(), child.value)); + continue; + } + if (child.nodes) { + walk(child, node); + } + } + return queue; + }; + return utils.flatten(walk(ast)); + }; + module2.exports = expand; +}); + +// ../../node_modules/chokidar/node_modules/braces/lib/constants.js +var require_constants2 = __commonJS((exports2, module2) => { + "use strict"; + module2.exports = { + MAX_LENGTH: 1024 * 64, + CHAR_0: "0", + CHAR_9: "9", + CHAR_UPPERCASE_A: "A", + CHAR_LOWERCASE_A: "a", + CHAR_UPPERCASE_Z: "Z", + CHAR_LOWERCASE_Z: "z", + CHAR_LEFT_PARENTHESES: "(", + CHAR_RIGHT_PARENTHESES: ")", + CHAR_ASTERISK: "*", + CHAR_AMPERSAND: "&", + CHAR_AT: "@", + CHAR_BACKSLASH: "\\", + CHAR_BACKTICK: "`", + CHAR_CARRIAGE_RETURN: "\r", + CHAR_CIRCUMFLEX_ACCENT: "^", + CHAR_COLON: ":", + CHAR_COMMA: ",", + CHAR_DOLLAR: "$", + CHAR_DOT: ".", + CHAR_DOUBLE_QUOTE: '"', + CHAR_EQUAL: "=", + CHAR_EXCLAMATION_MARK: "!", + CHAR_FORM_FEED: "\f", + CHAR_FORWARD_SLASH: "/", + CHAR_HASH: "#", + CHAR_HYPHEN_MINUS: "-", + CHAR_LEFT_ANGLE_BRACKET: "<", + CHAR_LEFT_CURLY_BRACE: "{", + CHAR_LEFT_SQUARE_BRACKET: "[", + CHAR_LINE_FEED: "\n", + CHAR_NO_BREAK_SPACE: "\xA0", + CHAR_PERCENT: "%", + CHAR_PLUS: "+", + CHAR_QUESTION_MARK: "?", + CHAR_RIGHT_ANGLE_BRACKET: ">", + CHAR_RIGHT_CURLY_BRACE: "}", + CHAR_RIGHT_SQUARE_BRACKET: "]", + CHAR_SEMICOLON: ";", + CHAR_SINGLE_QUOTE: "'", + CHAR_SPACE: " ", + CHAR_TAB: " ", + CHAR_UNDERSCORE: "_", + CHAR_VERTICAL_LINE: "|", + CHAR_ZERO_WIDTH_NOBREAK_SPACE: "\uFEFF" + }; +}); + +// ../../node_modules/chokidar/node_modules/braces/lib/parse.js +var require_parse2 = __commonJS((exports2, module2) => { + "use strict"; + var stringify = require_stringify(); + var { + MAX_LENGTH, + CHAR_BACKSLASH, + CHAR_BACKTICK, + CHAR_COMMA, + CHAR_DOT, + CHAR_LEFT_PARENTHESES, + CHAR_RIGHT_PARENTHESES, + CHAR_LEFT_CURLY_BRACE, + CHAR_RIGHT_CURLY_BRACE, + CHAR_LEFT_SQUARE_BRACKET, + CHAR_RIGHT_SQUARE_BRACKET, + CHAR_DOUBLE_QUOTE, + CHAR_SINGLE_QUOTE, + CHAR_NO_BREAK_SPACE, + CHAR_ZERO_WIDTH_NOBREAK_SPACE + } = require_constants2(); + var parse = (input, options = {}) => { + if (typeof input !== "string") { + throw new TypeError("Expected a string"); + } + let opts = options || {}; + let max = typeof opts.maxLength === "number" ? Math.min(MAX_LENGTH, opts.maxLength) : MAX_LENGTH; + if (input.length > max) { + throw new SyntaxError(`Input length (${input.length}), exceeds max characters (${max})`); + } + let ast = {type: "root", input, nodes: []}; + let stack = [ast]; + let block = ast; + let prev = ast; + let brackets = 0; + let length = input.length; + let index = 0; + let depth = 0; + let value; + let memo = {}; + const advance = () => input[index++]; + const push = (node) => { + if (node.type === "text" && prev.type === "dot") { + prev.type = "text"; + } + if (prev && prev.type === "text" && node.type === "text") { + prev.value += node.value; + return; + } + block.nodes.push(node); + node.parent = block; + node.prev = prev; + prev = node; + return node; + }; + push({type: "bos"}); + while (index < length) { + block = stack[stack.length - 1]; + value = advance(); + if (value === CHAR_ZERO_WIDTH_NOBREAK_SPACE || value === CHAR_NO_BREAK_SPACE) { + continue; + } + if (value === CHAR_BACKSLASH) { + push({type: "text", value: (options.keepEscaping ? value : "") + advance()}); + continue; + } + if (value === CHAR_RIGHT_SQUARE_BRACKET) { + push({type: "text", value: "\\" + value}); + continue; + } + if (value === CHAR_LEFT_SQUARE_BRACKET) { + brackets++; + let closed = true; + let next; + while (index < length && (next = advance())) { + value += next; + if (next === CHAR_LEFT_SQUARE_BRACKET) { + brackets++; + continue; + } + if (next === CHAR_BACKSLASH) { + value += advance(); + continue; + } + if (next === CHAR_RIGHT_SQUARE_BRACKET) { + brackets--; + if (brackets === 0) { + break; + } + } + } + push({type: "text", value}); + continue; + } + if (value === CHAR_LEFT_PARENTHESES) { + block = push({type: "paren", nodes: []}); + stack.push(block); + push({type: "text", value}); + continue; + } + if (value === CHAR_RIGHT_PARENTHESES) { + if (block.type !== "paren") { + push({type: "text", value}); + continue; + } + block = stack.pop(); + push({type: "text", value}); + block = stack[stack.length - 1]; + continue; + } + if (value === CHAR_DOUBLE_QUOTE || value === CHAR_SINGLE_QUOTE || value === CHAR_BACKTICK) { + let open = value; + let next; + if (options.keepQuotes !== true) { + value = ""; + } + while (index < length && (next = advance())) { + if (next === CHAR_BACKSLASH) { + value += next + advance(); + continue; + } + if (next === open) { + if (options.keepQuotes === true) + value += next; + break; + } + value += next; + } + push({type: "text", value}); + continue; + } + if (value === CHAR_LEFT_CURLY_BRACE) { + depth++; + let dollar = prev.value && prev.value.slice(-1) === "$" || block.dollar === true; + let brace = { + type: "brace", + open: true, + close: false, + dollar, + depth, + commas: 0, + ranges: 0, + nodes: [] + }; + block = push(brace); + stack.push(block); + push({type: "open", value}); + continue; + } + if (value === CHAR_RIGHT_CURLY_BRACE) { + if (block.type !== "brace") { + push({type: "text", value}); + continue; + } + let type = "close"; + block = stack.pop(); + block.close = true; + push({type, value}); + depth--; + block = stack[stack.length - 1]; + continue; + } + if (value === CHAR_COMMA && depth > 0) { + if (block.ranges > 0) { + block.ranges = 0; + let open = block.nodes.shift(); + block.nodes = [open, {type: "text", value: stringify(block)}]; + } + push({type: "comma", value}); + block.commas++; + continue; + } + if (value === CHAR_DOT && depth > 0 && block.commas === 0) { + let siblings = block.nodes; + if (depth === 0 || siblings.length === 0) { + push({type: "text", value}); + continue; + } + if (prev.type === "dot") { + block.range = []; + prev.value += value; + prev.type = "range"; + if (block.nodes.length !== 3 && block.nodes.length !== 5) { + block.invalid = true; + block.ranges = 0; + prev.type = "text"; + continue; + } + block.ranges++; + block.args = []; + continue; + } + if (prev.type === "range") { + siblings.pop(); + let before = siblings[siblings.length - 1]; + before.value += prev.value + value; + prev = before; + block.ranges--; + continue; + } + push({type: "dot", value}); + continue; + } + push({type: "text", value}); + } + do { + block = stack.pop(); + if (block.type !== "root") { + block.nodes.forEach((node) => { + if (!node.nodes) { + if (node.type === "open") + node.isOpen = true; + if (node.type === "close") + node.isClose = true; + if (!node.nodes) + node.type = "text"; + node.invalid = true; + } + }); + let parent = stack[stack.length - 1]; + let index2 = parent.nodes.indexOf(block); + parent.nodes.splice(index2, 1, ...block.nodes); + } + } while (stack.length > 0); + push({type: "eos"}); + return ast; + }; + module2.exports = parse; +}); + +// ../../node_modules/chokidar/node_modules/braces/index.js +var require_braces = __commonJS((exports2, module2) => { + "use strict"; + var stringify = require_stringify(); + var compile2 = require_compile(); + var expand = require_expand(); + var parse = require_parse2(); + var braces = (input, options = {}) => { + let output = []; + if (Array.isArray(input)) { + for (let pattern of input) { + let result = braces.create(pattern, options); + if (Array.isArray(result)) { + output.push(...result); + } else { + output.push(result); + } + } + } else { + output = [].concat(braces.create(input, options)); + } + if (options && options.expand === true && options.nodupes === true) { + output = [...new Set(output)]; + } + return output; + }; + braces.parse = (input, options = {}) => parse(input, options); + braces.stringify = (input, options = {}) => { + if (typeof input === "string") { + return stringify(braces.parse(input, options), options); + } + return stringify(input, options); + }; + braces.compile = (input, options = {}) => { + if (typeof input === "string") { + input = braces.parse(input, options); + } + return compile2(input, options); + }; + braces.expand = (input, options = {}) => { + if (typeof input === "string") { + input = braces.parse(input, options); + } + let result = expand(input, options); + if (options.noempty === true) { + result = result.filter(Boolean); + } + if (options.nodupes === true) { + result = [...new Set(result)]; + } + return result; + }; + braces.create = (input, options = {}) => { + if (input === "" || input.length < 3) { + return [input]; + } + return options.expand !== true ? braces.compile(input, options) : braces.expand(input, options); + }; + module2.exports = braces; +}); + +// ../../node_modules/binary-extensions/binary-extensions.json +var require_binary_extensions = __commonJS((exports2, module2) => { + module2.exports = [ + "3dm", + "3ds", + "3g2", + "3gp", + "7z", + "a", + "aac", + "adp", + "ai", + "aif", + "aiff", + "alz", + "ape", + "apk", + "ar", + "arj", + "asf", + "au", + "avi", + "bak", + "baml", + "bh", + "bin", + "bk", + "bmp", + "btif", + "bz2", + "bzip2", + "cab", + "caf", + "cgm", + "class", + "cmx", + "cpio", + "cr2", + "cur", + "dat", + "dcm", + "deb", + "dex", + "djvu", + "dll", + "dmg", + "dng", + "doc", + "docm", + "docx", + "dot", + "dotm", + "dra", + "DS_Store", + "dsk", + "dts", + "dtshd", + "dvb", + "dwg", + "dxf", + "ecelp4800", + "ecelp7470", + "ecelp9600", + "egg", + "eol", + "eot", + "epub", + "exe", + "f4v", + "fbs", + "fh", + "fla", + "flac", + "fli", + "flv", + "fpx", + "fst", + "fvt", + "g3", + "gh", + "gif", + "graffle", + "gz", + "gzip", + "h261", + "h263", + "h264", + "icns", + "ico", + "ief", + "img", + "ipa", + "iso", + "jar", + "jpeg", + "jpg", + "jpgv", + "jpm", + "jxr", + "key", + "ktx", + "lha", + "lib", + "lvp", + "lz", + "lzh", + "lzma", + "lzo", + "m3u", + "m4a", + "m4v", + "mar", + "mdi", + "mht", + "mid", + "midi", + "mj2", + "mka", + "mkv", + "mmr", + "mng", + "mobi", + "mov", + "movie", + "mp3", + "mp4", + "mp4a", + "mpeg", + "mpg", + "mpga", + "mxu", + "nef", + "npx", + "numbers", + "nupkg", + "o", + "oga", + "ogg", + "ogv", + "otf", + "pages", + "pbm", + "pcx", + "pdb", + "pdf", + "pea", + "pgm", + "pic", + "png", + "pnm", + "pot", + "potm", + "potx", + "ppa", + "ppam", + "ppm", + "pps", + "ppsm", + "ppsx", + "ppt", + "pptm", + "pptx", + "psd", + "pya", + "pyc", + "pyo", + "pyv", + "qt", + "rar", + "ras", + "raw", + "resources", + "rgb", + "rip", + "rlc", + "rmf", + "rmvb", + "rtf", + "rz", + "s3m", + "s7z", + "scpt", + "sgi", + "shar", + "sil", + "sketch", + "slk", + "smv", + "snk", + "so", + "stl", + "suo", + "sub", + "swf", + "tar", + "tbz", + "tbz2", + "tga", + "tgz", + "thmx", + "tif", + "tiff", + "tlz", + "ttc", + "ttf", + "txz", + "udf", + "uvh", + "uvi", + "uvm", + "uvp", + "uvs", + "uvu", + "viv", + "vob", + "war", + "wav", + "wax", + "wbmp", + "wdp", + "weba", + "webm", + "webp", + "whl", + "wim", + "wm", + "wma", + "wmv", + "wmx", + "woff", + "woff2", + "wrm", + "wvx", + "xbm", + "xif", + "xla", + "xlam", + "xls", + "xlsb", + "xlsm", + "xlsx", + "xlt", + "xltm", + "xltx", + "xm", + "xmind", + "xpi", + "xpm", + "xwd", + "xz", + "z", + "zip", + "zipx" + ]; +}); + +// ../../node_modules/binary-extensions/index.js +var require_binary_extensions2 = __commonJS((exports2, module2) => { + module2.exports = require_binary_extensions(); +}); + +// ../../node_modules/is-binary-path/index.js +var require_is_binary_path = __commonJS((exports2, module2) => { + "use strict"; + var path = require("path"); + var binaryExtensions = require_binary_extensions2(); + var extensions = new Set(binaryExtensions); + module2.exports = (filePath) => extensions.has(path.extname(filePath).slice(1).toLowerCase()); +}); + +// ../../node_modules/chokidar/lib/constants.js +var require_constants3 = __commonJS((exports2) => { + "use strict"; + var {sep} = require("path"); + var {platform} = process; + var os = require("os"); + exports2.EV_ALL = "all"; + exports2.EV_READY = "ready"; + exports2.EV_ADD = "add"; + exports2.EV_CHANGE = "change"; + exports2.EV_ADD_DIR = "addDir"; + exports2.EV_UNLINK = "unlink"; + exports2.EV_UNLINK_DIR = "unlinkDir"; + exports2.EV_RAW = "raw"; + exports2.EV_ERROR = "error"; + exports2.STR_DATA = "data"; + exports2.STR_END = "end"; + exports2.STR_CLOSE = "close"; + exports2.FSEVENT_CREATED = "created"; + exports2.FSEVENT_MODIFIED = "modified"; + exports2.FSEVENT_DELETED = "deleted"; + exports2.FSEVENT_MOVED = "moved"; + exports2.FSEVENT_CLONED = "cloned"; + exports2.FSEVENT_UNKNOWN = "unknown"; + exports2.FSEVENT_TYPE_FILE = "file"; + exports2.FSEVENT_TYPE_DIRECTORY = "directory"; + exports2.FSEVENT_TYPE_SYMLINK = "symlink"; + exports2.KEY_LISTENERS = "listeners"; + exports2.KEY_ERR = "errHandlers"; + exports2.KEY_RAW = "rawEmitters"; + exports2.HANDLER_KEYS = [exports2.KEY_LISTENERS, exports2.KEY_ERR, exports2.KEY_RAW]; + exports2.DOT_SLASH = `.${sep}`; + exports2.BACK_SLASH_RE = /\\/g; + exports2.DOUBLE_SLASH_RE = /\/\//; + exports2.SLASH_OR_BACK_SLASH_RE = /[/\\]/; + exports2.DOT_RE = /\..*\.(sw[px])$|~$|\.subl.*\.tmp/; + exports2.REPLACER_RE = /^\.[/\\]/; + exports2.SLASH = "/"; + exports2.SLASH_SLASH = "//"; + exports2.BRACE_START = "{"; + exports2.BANG = "!"; + exports2.ONE_DOT = "."; + exports2.TWO_DOTS = ".."; + exports2.STAR = "*"; + exports2.GLOBSTAR = "**"; + exports2.ROOT_GLOBSTAR = "/**/*"; + exports2.SLASH_GLOBSTAR = "/**"; + exports2.DIR_SUFFIX = "Dir"; + exports2.ANYMATCH_OPTS = {dot: true}; + exports2.STRING_TYPE = "string"; + exports2.FUNCTION_TYPE = "function"; + exports2.EMPTY_STR = ""; + exports2.EMPTY_FN = () => { + }; + exports2.IDENTITY_FN = (val) => val; + exports2.isWindows = platform === "win32"; + exports2.isMacos = platform === "darwin"; + exports2.isLinux = platform === "linux"; + exports2.isIBMi = os.type() === "OS400"; +}); + +// ../../node_modules/chokidar/lib/nodefs-handler.js +var require_nodefs_handler = __commonJS((exports2, module2) => { + "use strict"; + var fs = require("fs"); + var sysPath = require("path"); + var {promisify} = require("util"); + var isBinaryPath = require_is_binary_path(); + var { + isWindows, + isLinux, + EMPTY_FN, + EMPTY_STR, + KEY_LISTENERS, + KEY_ERR, + KEY_RAW, + HANDLER_KEYS, + EV_CHANGE, + EV_ADD, + EV_ADD_DIR, + EV_ERROR, + STR_DATA, + STR_END, + BRACE_START, + STAR + } = require_constants3(); + var THROTTLE_MODE_WATCH = "watch"; + var open = promisify(fs.open); + var stat = promisify(fs.stat); + var lstat = promisify(fs.lstat); + var close = promisify(fs.close); + var fsrealpath = promisify(fs.realpath); + var statMethods = {lstat, stat}; + var foreach = (val, fn) => { + if (val instanceof Set) { + val.forEach(fn); + } else { + fn(val); + } + }; + var addAndConvert = (main, prop, item) => { + let container = main[prop]; + if (!(container instanceof Set)) { + main[prop] = container = new Set([container]); + } + container.add(item); + }; + var clearItem = (cont) => (key) => { + const set = cont[key]; + if (set instanceof Set) { + set.clear(); + } else { + delete cont[key]; + } + }; + var delFromSet = (main, prop, item) => { + const container = main[prop]; + if (container instanceof Set) { + container.delete(item); + } else if (container === item) { + delete main[prop]; + } + }; + var isEmptySet = (val) => val instanceof Set ? val.size === 0 : !val; + var FsWatchInstances = new Map(); + function createFsWatchInstance(path, options, listener, errHandler, emitRaw) { + const handleEvent = (rawEvent, evPath) => { + listener(path); + emitRaw(rawEvent, evPath, {watchedPath: path}); + if (evPath && path !== evPath) { + fsWatchBroadcast(sysPath.resolve(path, evPath), KEY_LISTENERS, sysPath.join(path, evPath)); + } + }; + try { + return fs.watch(path, options, handleEvent); + } catch (error) { + errHandler(error); + } + } + var fsWatchBroadcast = (fullPath, type, val1, val2, val3) => { + const cont = FsWatchInstances.get(fullPath); + if (!cont) + return; + foreach(cont[type], (listener) => { + listener(val1, val2, val3); + }); + }; + var setFsWatchListener = (path, fullPath, options, handlers) => { + const {listener, errHandler, rawEmitter} = handlers; + let cont = FsWatchInstances.get(fullPath); + let watcher; + if (!options.persistent) { + watcher = createFsWatchInstance(path, options, listener, errHandler, rawEmitter); + return watcher.close.bind(watcher); + } + if (cont) { + addAndConvert(cont, KEY_LISTENERS, listener); + addAndConvert(cont, KEY_ERR, errHandler); + addAndConvert(cont, KEY_RAW, rawEmitter); + } else { + watcher = createFsWatchInstance(path, options, fsWatchBroadcast.bind(null, fullPath, KEY_LISTENERS), errHandler, fsWatchBroadcast.bind(null, fullPath, KEY_RAW)); + if (!watcher) + return; + watcher.on(EV_ERROR, async (error) => { + const broadcastErr = fsWatchBroadcast.bind(null, fullPath, KEY_ERR); + cont.watcherUnusable = true; + if (isWindows && error.code === "EPERM") { + try { + const fd = await open(path, "r"); + await close(fd); + broadcastErr(error); + } catch (err) { + } + } else { + broadcastErr(error); + } + }); + cont = { + listeners: listener, + errHandlers: errHandler, + rawEmitters: rawEmitter, + watcher + }; + FsWatchInstances.set(fullPath, cont); + } + return () => { + delFromSet(cont, KEY_LISTENERS, listener); + delFromSet(cont, KEY_ERR, errHandler); + delFromSet(cont, KEY_RAW, rawEmitter); + if (isEmptySet(cont.listeners)) { + cont.watcher.close(); + FsWatchInstances.delete(fullPath); + HANDLER_KEYS.forEach(clearItem(cont)); + cont.watcher = void 0; + Object.freeze(cont); + } + }; + }; + var FsWatchFileInstances = new Map(); + var setFsWatchFileListener = (path, fullPath, options, handlers) => { + const {listener, rawEmitter} = handlers; + let cont = FsWatchFileInstances.get(fullPath); + let listeners = new Set(); + let rawEmitters = new Set(); + const copts = cont && cont.options; + if (copts && (copts.persistent < options.persistent || copts.interval > options.interval)) { + listeners = cont.listeners; + rawEmitters = cont.rawEmitters; + fs.unwatchFile(fullPath); + cont = void 0; + } + if (cont) { + addAndConvert(cont, KEY_LISTENERS, listener); + addAndConvert(cont, KEY_RAW, rawEmitter); + } else { + cont = { + listeners: listener, + rawEmitters: rawEmitter, + options, + watcher: fs.watchFile(fullPath, options, (curr, prev) => { + foreach(cont.rawEmitters, (rawEmitter2) => { + rawEmitter2(EV_CHANGE, fullPath, {curr, prev}); + }); + const currmtime = curr.mtimeMs; + if (curr.size !== prev.size || currmtime > prev.mtimeMs || currmtime === 0) { + foreach(cont.listeners, (listener2) => listener2(path, curr)); + } + }) + }; + FsWatchFileInstances.set(fullPath, cont); + } + return () => { + delFromSet(cont, KEY_LISTENERS, listener); + delFromSet(cont, KEY_RAW, rawEmitter); + if (isEmptySet(cont.listeners)) { + FsWatchFileInstances.delete(fullPath); + fs.unwatchFile(fullPath); + cont.options = cont.watcher = void 0; + Object.freeze(cont); + } + }; + }; + var NodeFsHandler = class { + constructor(fsW) { + this.fsw = fsW; + this._boundHandleError = (error) => fsW._handleError(error); + } + _watchWithNodeFs(path, listener) { + const opts = this.fsw.options; + const directory = sysPath.dirname(path); + const basename = sysPath.basename(path); + const parent = this.fsw._getWatchedDir(directory); + parent.add(basename); + const absolutePath = sysPath.resolve(path); + const options = {persistent: opts.persistent}; + if (!listener) + listener = EMPTY_FN; + let closer; + if (opts.usePolling) { + options.interval = opts.enableBinaryInterval && isBinaryPath(basename) ? opts.binaryInterval : opts.interval; + closer = setFsWatchFileListener(path, absolutePath, options, { + listener, + rawEmitter: this.fsw._emitRaw + }); + } else { + closer = setFsWatchListener(path, absolutePath, options, { + listener, + errHandler: this._boundHandleError, + rawEmitter: this.fsw._emitRaw + }); + } + return closer; + } + _handleFile(file, stats, initialAdd) { + if (this.fsw.closed) { + return; + } + const dirname = sysPath.dirname(file); + const basename = sysPath.basename(file); + const parent = this.fsw._getWatchedDir(dirname); + let prevStats = stats; + if (parent.has(basename)) + return; + const listener = async (path, newStats) => { + if (!this.fsw._throttle(THROTTLE_MODE_WATCH, file, 5)) + return; + if (!newStats || newStats.mtimeMs === 0) { + try { + const newStats2 = await stat(file); + if (this.fsw.closed) + return; + const at = newStats2.atimeMs; + const mt = newStats2.mtimeMs; + if (!at || at <= mt || mt !== prevStats.mtimeMs) { + this.fsw._emit(EV_CHANGE, file, newStats2); + } + if (isLinux && prevStats.ino !== newStats2.ino) { + this.fsw._closeFile(path); + prevStats = newStats2; + this.fsw._addPathCloser(path, this._watchWithNodeFs(file, listener)); + } else { + prevStats = newStats2; + } + } catch (error) { + this.fsw._remove(dirname, basename); + } + } else if (parent.has(basename)) { + const at = newStats.atimeMs; + const mt = newStats.mtimeMs; + if (!at || at <= mt || mt !== prevStats.mtimeMs) { + this.fsw._emit(EV_CHANGE, file, newStats); + } + prevStats = newStats; + } + }; + const closer = this._watchWithNodeFs(file, listener); + if (!(initialAdd && this.fsw.options.ignoreInitial) && this.fsw._isntIgnored(file)) { + if (!this.fsw._throttle(EV_ADD, file, 0)) + return; + this.fsw._emit(EV_ADD, file, stats); + } + return closer; + } + async _handleSymlink(entry, directory, path, item) { + if (this.fsw.closed) { + return; + } + const full = entry.fullPath; + const dir = this.fsw._getWatchedDir(directory); + if (!this.fsw.options.followSymlinks) { + this.fsw._incrReadyCount(); + const linkPath = await fsrealpath(path); + if (this.fsw.closed) + return; + if (dir.has(item)) { + if (this.fsw._symlinkPaths.get(full) !== linkPath) { + this.fsw._symlinkPaths.set(full, linkPath); + this.fsw._emit(EV_CHANGE, path, entry.stats); + } + } else { + dir.add(item); + this.fsw._symlinkPaths.set(full, linkPath); + this.fsw._emit(EV_ADD, path, entry.stats); + } + this.fsw._emitReady(); + return true; + } + if (this.fsw._symlinkPaths.has(full)) { + return true; + } + this.fsw._symlinkPaths.set(full, true); + } + _handleRead(directory, initialAdd, wh, target, dir, depth, throttler) { + directory = sysPath.join(directory, EMPTY_STR); + if (!wh.hasGlob) { + throttler = this.fsw._throttle("readdir", directory, 1e3); + if (!throttler) + return; + } + const previous = this.fsw._getWatchedDir(wh.path); + const current = new Set(); + let stream = this.fsw._readdirp(directory, { + fileFilter: (entry) => wh.filterPath(entry), + directoryFilter: (entry) => wh.filterDir(entry), + depth: 0 + }).on(STR_DATA, async (entry) => { + if (this.fsw.closed) { + stream = void 0; + return; + } + const item = entry.path; + let path = sysPath.join(directory, item); + current.add(item); + if (entry.stats.isSymbolicLink() && await this._handleSymlink(entry, directory, path, item)) { + return; + } + if (this.fsw.closed) { + stream = void 0; + return; + } + if (item === target || !target && !previous.has(item)) { + this.fsw._incrReadyCount(); + path = sysPath.join(dir, sysPath.relative(dir, path)); + this._addToNodeFs(path, initialAdd, wh, depth + 1); + } + }).on(EV_ERROR, this._boundHandleError); + return new Promise((resolve) => stream.once(STR_END, () => { + if (this.fsw.closed) { + stream = void 0; + return; + } + const wasThrottled = throttler ? throttler.clear() : false; + resolve(); + previous.getChildren().filter((item) => { + return item !== directory && !current.has(item) && (!wh.hasGlob || wh.filterPath({ + fullPath: sysPath.resolve(directory, item) + })); + }).forEach((item) => { + this.fsw._remove(directory, item); + }); + stream = void 0; + if (wasThrottled) + this._handleRead(directory, false, wh, target, dir, depth, throttler); + })); + } + async _handleDir(dir, stats, initialAdd, depth, target, wh, realpath) { + const parentDir = this.fsw._getWatchedDir(sysPath.dirname(dir)); + const tracked = parentDir.has(sysPath.basename(dir)); + if (!(initialAdd && this.fsw.options.ignoreInitial) && !target && !tracked) { + if (!wh.hasGlob || wh.globFilter(dir)) + this.fsw._emit(EV_ADD_DIR, dir, stats); + } + parentDir.add(sysPath.basename(dir)); + this.fsw._getWatchedDir(dir); + let throttler; + let closer; + const oDepth = this.fsw.options.depth; + if ((oDepth == null || depth <= oDepth) && !this.fsw._symlinkPaths.has(realpath)) { + if (!target) { + await this._handleRead(dir, initialAdd, wh, target, dir, depth, throttler); + if (this.fsw.closed) + return; + } + closer = this._watchWithNodeFs(dir, (dirPath, stats2) => { + if (stats2 && stats2.mtimeMs === 0) + return; + this._handleRead(dirPath, false, wh, target, dir, depth, throttler); + }); + } + return closer; + } + async _addToNodeFs(path, initialAdd, priorWh, depth, target) { + const ready = this.fsw._emitReady; + if (this.fsw._isIgnored(path) || this.fsw.closed) { + ready(); + return false; + } + const wh = this.fsw._getWatchHelpers(path, depth); + if (!wh.hasGlob && priorWh) { + wh.hasGlob = priorWh.hasGlob; + wh.globFilter = priorWh.globFilter; + wh.filterPath = (entry) => priorWh.filterPath(entry); + wh.filterDir = (entry) => priorWh.filterDir(entry); + } + try { + const stats = await statMethods[wh.statMethod](wh.watchPath); + if (this.fsw.closed) + return; + if (this.fsw._isIgnored(wh.watchPath, stats)) { + ready(); + return false; + } + const follow = this.fsw.options.followSymlinks && !path.includes(STAR) && !path.includes(BRACE_START); + let closer; + if (stats.isDirectory()) { + const absPath = sysPath.resolve(path); + const targetPath = follow ? await fsrealpath(path) : path; + if (this.fsw.closed) + return; + closer = await this._handleDir(wh.watchPath, stats, initialAdd, depth, target, wh, targetPath); + if (this.fsw.closed) + return; + if (absPath !== targetPath && targetPath !== void 0) { + this.fsw._symlinkPaths.set(absPath, targetPath); + } + } else if (stats.isSymbolicLink()) { + const targetPath = follow ? await fsrealpath(path) : path; + if (this.fsw.closed) + return; + const parent = sysPath.dirname(wh.watchPath); + this.fsw._getWatchedDir(parent).add(wh.watchPath); + this.fsw._emit(EV_ADD, wh.watchPath, stats); + closer = await this._handleDir(parent, stats, initialAdd, depth, path, wh, targetPath); + if (this.fsw.closed) + return; + if (targetPath !== void 0) { + this.fsw._symlinkPaths.set(sysPath.resolve(path), targetPath); + } + } else { + closer = this._handleFile(wh.watchPath, stats, initialAdd); + } + ready(); + this.fsw._addPathCloser(path, closer); + return false; + } catch (error) { + if (this.fsw._handleError(error)) { + ready(); + return path; + } + } + } + }; + module2.exports = NodeFsHandler; +}); + +// ../../node_modules/chokidar/lib/fsevents-handler.js +var require_fsevents_handler = __commonJS((exports2, module2) => { + "use strict"; + var fs = require("fs"); + var sysPath = require("path"); + var {promisify} = require("util"); + var fsevents; + try { + fsevents = require("fsevents"); + } catch (error) { + if (process.env.CHOKIDAR_PRINT_FSEVENTS_REQUIRE_ERROR) + console.error(error); + } + if (fsevents) { + const mtch = process.version.match(/v(\d+)\.(\d+)/); + if (mtch && mtch[1] && mtch[2]) { + const maj = Number.parseInt(mtch[1], 10); + const min = Number.parseInt(mtch[2], 10); + if (maj === 8 && min < 16) { + fsevents = void 0; + } + } + } + var { + EV_ADD, + EV_CHANGE, + EV_ADD_DIR, + EV_UNLINK, + EV_ERROR, + STR_DATA, + STR_END, + FSEVENT_CREATED, + FSEVENT_MODIFIED, + FSEVENT_DELETED, + FSEVENT_MOVED, + FSEVENT_UNKNOWN, + FSEVENT_TYPE_FILE, + FSEVENT_TYPE_DIRECTORY, + FSEVENT_TYPE_SYMLINK, + ROOT_GLOBSTAR, + DIR_SUFFIX, + DOT_SLASH, + FUNCTION_TYPE, + EMPTY_FN, + IDENTITY_FN + } = require_constants3(); + var Depth = (value) => isNaN(value) ? {} : {depth: value}; + var stat = promisify(fs.stat); + var lstat = promisify(fs.lstat); + var realpath = promisify(fs.realpath); + var statMethods = {stat, lstat}; + var FSEventsWatchers = new Map(); + var consolidateThreshhold = 10; + var wrongEventFlags = new Set([ + 69888, + 70400, + 71424, + 72704, + 73472, + 131328, + 131840, + 262912 + ]); + var createFSEventsInstance = (path, callback) => { + const stop = fsevents.watch(path, callback); + return {stop}; + }; + function setFSEventsListener(path, realPath, listener, rawEmitter) { + let watchPath = sysPath.extname(realPath) ? sysPath.dirname(realPath) : realPath; + const parentPath = sysPath.dirname(watchPath); + let cont = FSEventsWatchers.get(watchPath); + if (couldConsolidate(parentPath)) { + watchPath = parentPath; + } + const resolvedPath = sysPath.resolve(path); + const hasSymlink = resolvedPath !== realPath; + const filteredListener = (fullPath, flags, info) => { + if (hasSymlink) + fullPath = fullPath.replace(realPath, resolvedPath); + if (fullPath === resolvedPath || !fullPath.indexOf(resolvedPath + sysPath.sep)) + listener(fullPath, flags, info); + }; + let watchedParent = false; + for (const watchedPath of FSEventsWatchers.keys()) { + if (realPath.indexOf(sysPath.resolve(watchedPath) + sysPath.sep) === 0) { + watchPath = watchedPath; + cont = FSEventsWatchers.get(watchPath); + watchedParent = true; + break; + } + } + if (cont || watchedParent) { + cont.listeners.add(filteredListener); + } else { + cont = { + listeners: new Set([filteredListener]), + rawEmitter, + watcher: createFSEventsInstance(watchPath, (fullPath, flags) => { + if (!cont.listeners.size) + return; + const info = fsevents.getInfo(fullPath, flags); + cont.listeners.forEach((list) => { + list(fullPath, flags, info); + }); + cont.rawEmitter(info.event, fullPath, info); + }) + }; + FSEventsWatchers.set(watchPath, cont); + } + return () => { + const lst = cont.listeners; + lst.delete(filteredListener); + if (!lst.size) { + FSEventsWatchers.delete(watchPath); + if (cont.watcher) + return cont.watcher.stop().then(() => { + cont.rawEmitter = cont.watcher = void 0; + Object.freeze(cont); + }); + } + }; + } + var couldConsolidate = (path) => { + let count = 0; + for (const watchPath of FSEventsWatchers.keys()) { + if (watchPath.indexOf(path) === 0) { + count++; + if (count >= consolidateThreshhold) { + return true; + } + } + } + return false; + }; + var canUse = () => fsevents && FSEventsWatchers.size < 128; + var calcDepth = (path, root) => { + let i = 0; + while (!path.indexOf(root) && (path = sysPath.dirname(path)) !== root) + i++; + return i; + }; + var sameTypes = (info, stats) => info.type === FSEVENT_TYPE_DIRECTORY && stats.isDirectory() || info.type === FSEVENT_TYPE_SYMLINK && stats.isSymbolicLink() || info.type === FSEVENT_TYPE_FILE && stats.isFile(); + var FsEventsHandler = class { + constructor(fsw) { + this.fsw = fsw; + } + checkIgnored(path, stats) { + const ipaths = this.fsw._ignoredPaths; + if (this.fsw._isIgnored(path, stats)) { + ipaths.add(path); + if (stats && stats.isDirectory()) { + ipaths.add(path + ROOT_GLOBSTAR); + } + return true; + } + ipaths.delete(path); + ipaths.delete(path + ROOT_GLOBSTAR); + } + addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts) { + const event = watchedDir.has(item) ? EV_CHANGE : EV_ADD; + this.handleEvent(event, path, fullPath, realPath, parent, watchedDir, item, info, opts); + } + async checkExists(path, fullPath, realPath, parent, watchedDir, item, info, opts) { + try { + const stats = await stat(path); + if (this.fsw.closed) + return; + if (sameTypes(info, stats)) { + this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts); + } else { + this.handleEvent(EV_UNLINK, path, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } catch (error) { + if (error.code === "EACCES") { + this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts); + } else { + this.handleEvent(EV_UNLINK, path, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } + } + handleEvent(event, path, fullPath, realPath, parent, watchedDir, item, info, opts) { + if (this.fsw.closed || this.checkIgnored(path)) + return; + if (event === EV_UNLINK) { + const isDirectory = info.type === FSEVENT_TYPE_DIRECTORY; + if (isDirectory || watchedDir.has(item)) { + this.fsw._remove(parent, item, isDirectory); + } + } else { + if (event === EV_ADD) { + if (info.type === FSEVENT_TYPE_DIRECTORY) + this.fsw._getWatchedDir(path); + if (info.type === FSEVENT_TYPE_SYMLINK && opts.followSymlinks) { + const curDepth = opts.depth === void 0 ? void 0 : calcDepth(fullPath, realPath) + 1; + return this._addToFsEvents(path, false, true, curDepth); + } + this.fsw._getWatchedDir(parent).add(item); + } + const eventName = info.type === FSEVENT_TYPE_DIRECTORY ? event + DIR_SUFFIX : event; + this.fsw._emit(eventName, path); + if (eventName === EV_ADD_DIR) + this._addToFsEvents(path, false, true); + } + } + _watchWithFsEvents(watchPath, realPath, transform, globFilter) { + if (this.fsw.closed || this.fsw._isIgnored(watchPath)) + return; + const opts = this.fsw.options; + const watchCallback = async (fullPath, flags, info) => { + if (this.fsw.closed) + return; + if (opts.depth !== void 0 && calcDepth(fullPath, realPath) > opts.depth) + return; + const path = transform(sysPath.join(watchPath, sysPath.relative(watchPath, fullPath))); + if (globFilter && !globFilter(path)) + return; + const parent = sysPath.dirname(path); + const item = sysPath.basename(path); + const watchedDir = this.fsw._getWatchedDir(info.type === FSEVENT_TYPE_DIRECTORY ? path : parent); + if (wrongEventFlags.has(flags) || info.event === FSEVENT_UNKNOWN) { + if (typeof opts.ignored === FUNCTION_TYPE) { + let stats; + try { + stats = await stat(path); + } catch (error) { + } + if (this.fsw.closed) + return; + if (this.checkIgnored(path, stats)) + return; + if (sameTypes(info, stats)) { + this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts); + } else { + this.handleEvent(EV_UNLINK, path, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } else { + this.checkExists(path, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } else { + switch (info.event) { + case FSEVENT_CREATED: + case FSEVENT_MODIFIED: + return this.addOrChange(path, fullPath, realPath, parent, watchedDir, item, info, opts); + case FSEVENT_DELETED: + case FSEVENT_MOVED: + return this.checkExists(path, fullPath, realPath, parent, watchedDir, item, info, opts); + } + } + }; + const closer = setFSEventsListener(watchPath, realPath, watchCallback, this.fsw._emitRaw); + this.fsw._emitReady(); + return closer; + } + async _handleFsEventsSymlink(linkPath, fullPath, transform, curDepth) { + if (this.fsw.closed || this.fsw._symlinkPaths.has(fullPath)) + return; + this.fsw._symlinkPaths.set(fullPath, true); + this.fsw._incrReadyCount(); + try { + const linkTarget = await realpath(linkPath); + if (this.fsw.closed) + return; + if (this.fsw._isIgnored(linkTarget)) { + return this.fsw._emitReady(); + } + this.fsw._incrReadyCount(); + this._addToFsEvents(linkTarget || linkPath, (path) => { + let aliasedPath = linkPath; + if (linkTarget && linkTarget !== DOT_SLASH) { + aliasedPath = path.replace(linkTarget, linkPath); + } else if (path !== DOT_SLASH) { + aliasedPath = sysPath.join(linkPath, path); + } + return transform(aliasedPath); + }, false, curDepth); + } catch (error) { + if (this.fsw._handleError(error)) { + return this.fsw._emitReady(); + } + } + } + emitAdd(newPath, stats, processPath, opts, forceAdd) { + const pp = processPath(newPath); + const isDir = stats.isDirectory(); + const dirObj = this.fsw._getWatchedDir(sysPath.dirname(pp)); + const base = sysPath.basename(pp); + if (isDir) + this.fsw._getWatchedDir(pp); + if (dirObj.has(base)) + return; + dirObj.add(base); + if (!opts.ignoreInitial || forceAdd === true) { + this.fsw._emit(isDir ? EV_ADD_DIR : EV_ADD, pp, stats); + } + } + initWatch(realPath, path, wh, processPath) { + if (this.fsw.closed) + return; + const closer = this._watchWithFsEvents(wh.watchPath, sysPath.resolve(realPath || wh.watchPath), processPath, wh.globFilter); + this.fsw._addPathCloser(path, closer); + } + async _addToFsEvents(path, transform, forceAdd, priorDepth) { + if (this.fsw.closed) { + return; + } + const opts = this.fsw.options; + const processPath = typeof transform === FUNCTION_TYPE ? transform : IDENTITY_FN; + const wh = this.fsw._getWatchHelpers(path); + try { + const stats = await statMethods[wh.statMethod](wh.watchPath); + if (this.fsw.closed) + return; + if (this.fsw._isIgnored(wh.watchPath, stats)) { + throw null; + } + if (stats.isDirectory()) { + if (!wh.globFilter) + this.emitAdd(processPath(path), stats, processPath, opts, forceAdd); + if (priorDepth && priorDepth > opts.depth) + return; + this.fsw._readdirp(wh.watchPath, { + fileFilter: (entry) => wh.filterPath(entry), + directoryFilter: (entry) => wh.filterDir(entry), + ...Depth(opts.depth - (priorDepth || 0)) + }).on(STR_DATA, (entry) => { + if (this.fsw.closed) { + return; + } + if (entry.stats.isDirectory() && !wh.filterPath(entry)) + return; + const joinedPath = sysPath.join(wh.watchPath, entry.path); + const {fullPath} = entry; + if (wh.followSymlinks && entry.stats.isSymbolicLink()) { + const curDepth = opts.depth === void 0 ? void 0 : calcDepth(joinedPath, sysPath.resolve(wh.watchPath)) + 1; + this._handleFsEventsSymlink(joinedPath, fullPath, processPath, curDepth); + } else { + this.emitAdd(joinedPath, entry.stats, processPath, opts, forceAdd); + } + }).on(EV_ERROR, EMPTY_FN).on(STR_END, () => { + this.fsw._emitReady(); + }); + } else { + this.emitAdd(wh.watchPath, stats, processPath, opts, forceAdd); + this.fsw._emitReady(); + } + } catch (error) { + if (!error || this.fsw._handleError(error)) { + this.fsw._emitReady(); + this.fsw._emitReady(); + } + } + if (opts.persistent && forceAdd !== true) { + if (typeof transform === FUNCTION_TYPE) { + this.initWatch(void 0, path, wh, processPath); + } else { + let realPath; + try { + realPath = await realpath(wh.watchPath); + } catch (e2) { + } + this.initWatch(realPath, path, wh, processPath); + } + } + } + }; + module2.exports = FsEventsHandler; + module2.exports.canUse = canUse; +}); + +// ../../node_modules/chokidar/index.js +var require_chokidar = __commonJS((exports2) => { + "use strict"; + var {EventEmitter} = require("events"); + var fs = require("fs"); + var sysPath = require("path"); + var {promisify} = require("util"); + var readdirp = require_readdirp(); + var anymatch = require_anymatch().default; + var globParent = require_glob_parent(); + var isGlob = require_is_glob(); + var braces = require_braces(); + var normalizePath = require_normalize_path(); + var NodeFsHandler = require_nodefs_handler(); + var FsEventsHandler = require_fsevents_handler(); + var { + EV_ALL, + EV_READY, + EV_ADD, + EV_CHANGE, + EV_UNLINK, + EV_ADD_DIR, + EV_UNLINK_DIR, + EV_RAW, + EV_ERROR, + STR_CLOSE, + STR_END, + BACK_SLASH_RE, + DOUBLE_SLASH_RE, + SLASH_OR_BACK_SLASH_RE, + DOT_RE, + REPLACER_RE, + SLASH, + SLASH_SLASH, + BRACE_START, + BANG, + ONE_DOT, + TWO_DOTS, + GLOBSTAR, + SLASH_GLOBSTAR, + ANYMATCH_OPTS, + STRING_TYPE, + FUNCTION_TYPE, + EMPTY_STR, + EMPTY_FN, + isWindows, + isMacos, + isIBMi + } = require_constants3(); + var stat = promisify(fs.stat); + var readdir = promisify(fs.readdir); + var arrify = (value = []) => Array.isArray(value) ? value : [value]; + var flatten = (list, result = []) => { + list.forEach((item) => { + if (Array.isArray(item)) { + flatten(item, result); + } else { + result.push(item); + } + }); + return result; + }; + var unifyPaths = (paths_) => { + const paths = flatten(arrify(paths_)); + if (!paths.every((p) => typeof p === STRING_TYPE)) { + throw new TypeError(`Non-string provided as watch path: ${paths}`); + } + return paths.map(normalizePathToUnix); + }; + var toUnix = (string) => { + let str = string.replace(BACK_SLASH_RE, SLASH); + let prepend = false; + if (str.startsWith(SLASH_SLASH)) { + prepend = true; + } + while (str.match(DOUBLE_SLASH_RE)) { + str = str.replace(DOUBLE_SLASH_RE, SLASH); + } + if (prepend) { + str = SLASH + str; + } + return str; + }; + var normalizePathToUnix = (path) => toUnix(sysPath.normalize(toUnix(path))); + var normalizeIgnored = (cwd = EMPTY_STR) => (path) => { + if (typeof path !== STRING_TYPE) + return path; + return normalizePathToUnix(sysPath.isAbsolute(path) ? path : sysPath.join(cwd, path)); + }; + var getAbsolutePath = (path, cwd) => { + if (sysPath.isAbsolute(path)) { + return path; + } + if (path.startsWith(BANG)) { + return BANG + sysPath.join(cwd, path.slice(1)); + } + return sysPath.join(cwd, path); + }; + var undef = (opts, key) => opts[key] === void 0; + var DirEntry = class { + constructor(dir, removeWatcher) { + this.path = dir; + this._removeWatcher = removeWatcher; + this.items = new Set(); + } + add(item) { + const {items} = this; + if (!items) + return; + if (item !== ONE_DOT && item !== TWO_DOTS) + items.add(item); + } + async remove(item) { + const {items} = this; + if (!items) + return; + items.delete(item); + if (items.size > 0) + return; + const dir = this.path; + try { + await readdir(dir); + } catch (err) { + if (this._removeWatcher) { + this._removeWatcher(sysPath.dirname(dir), sysPath.basename(dir)); + } + } + } + has(item) { + const {items} = this; + if (!items) + return; + return items.has(item); + } + getChildren() { + const {items} = this; + if (!items) + return; + return [...items.values()]; + } + dispose() { + this.items.clear(); + delete this.path; + delete this._removeWatcher; + delete this.items; + Object.freeze(this); + } + }; + var STAT_METHOD_F = "stat"; + var STAT_METHOD_L = "lstat"; + var WatchHelper = class { + constructor(path, watchPath, follow, fsw) { + this.fsw = fsw; + this.path = path = path.replace(REPLACER_RE, EMPTY_STR); + this.watchPath = watchPath; + this.fullWatchPath = sysPath.resolve(watchPath); + this.hasGlob = watchPath !== path; + if (path === EMPTY_STR) + this.hasGlob = false; + this.globSymlink = this.hasGlob && follow ? void 0 : false; + this.globFilter = this.hasGlob ? anymatch(path, void 0, ANYMATCH_OPTS) : false; + this.dirParts = this.getDirParts(path); + this.dirParts.forEach((parts) => { + if (parts.length > 1) + parts.pop(); + }); + this.followSymlinks = follow; + this.statMethod = follow ? STAT_METHOD_F : STAT_METHOD_L; + } + checkGlobSymlink(entry) { + if (this.globSymlink === void 0) { + this.globSymlink = entry.fullParentDir === this.fullWatchPath ? false : {realPath: entry.fullParentDir, linkPath: this.fullWatchPath}; + } + if (this.globSymlink) { + return entry.fullPath.replace(this.globSymlink.realPath, this.globSymlink.linkPath); + } + return entry.fullPath; + } + entryPath(entry) { + return sysPath.join(this.watchPath, sysPath.relative(this.watchPath, this.checkGlobSymlink(entry))); + } + filterPath(entry) { + const {stats} = entry; + if (stats && stats.isSymbolicLink()) + return this.filterDir(entry); + const resolvedPath = this.entryPath(entry); + const matchesGlob = this.hasGlob && typeof this.globFilter === FUNCTION_TYPE ? this.globFilter(resolvedPath) : true; + return matchesGlob && this.fsw._isntIgnored(resolvedPath, stats) && this.fsw._hasReadPermissions(stats); + } + getDirParts(path) { + if (!this.hasGlob) + return []; + const parts = []; + const expandedPath = path.includes(BRACE_START) ? braces.expand(path) : [path]; + expandedPath.forEach((path2) => { + parts.push(sysPath.relative(this.watchPath, path2).split(SLASH_OR_BACK_SLASH_RE)); + }); + return parts; + } + filterDir(entry) { + if (this.hasGlob) { + const entryParts = this.getDirParts(this.checkGlobSymlink(entry)); + let globstar = false; + this.unmatchedGlob = !this.dirParts.some((parts) => { + return parts.every((part, i) => { + if (part === GLOBSTAR) + globstar = true; + return globstar || !entryParts[0][i] || anymatch(part, entryParts[0][i], ANYMATCH_OPTS); + }); + }); + } + return !this.unmatchedGlob && this.fsw._isntIgnored(this.entryPath(entry), entry.stats); + } + }; + var FSWatcher = class extends EventEmitter { + constructor(_opts) { + super(); + const opts = {}; + if (_opts) + Object.assign(opts, _opts); + this._watched = new Map(); + this._closers = new Map(); + this._ignoredPaths = new Set(); + this._throttled = new Map(); + this._symlinkPaths = new Map(); + this._streams = new Set(); + this.closed = false; + if (undef(opts, "persistent")) + opts.persistent = true; + if (undef(opts, "ignoreInitial")) + opts.ignoreInitial = false; + if (undef(opts, "ignorePermissionErrors")) + opts.ignorePermissionErrors = false; + if (undef(opts, "interval")) + opts.interval = 100; + if (undef(opts, "binaryInterval")) + opts.binaryInterval = 300; + if (undef(opts, "disableGlobbing")) + opts.disableGlobbing = false; + opts.enableBinaryInterval = opts.binaryInterval !== opts.interval; + if (undef(opts, "useFsEvents")) + opts.useFsEvents = !opts.usePolling; + const canUseFsEvents = FsEventsHandler.canUse(); + if (!canUseFsEvents) + opts.useFsEvents = false; + if (undef(opts, "usePolling") && !opts.useFsEvents) { + opts.usePolling = isMacos; + } + if (isIBMi) { + opts.usePolling = true; + } + const envPoll = process.env.CHOKIDAR_USEPOLLING; + if (envPoll !== void 0) { + const envLower = envPoll.toLowerCase(); + if (envLower === "false" || envLower === "0") { + opts.usePolling = false; + } else if (envLower === "true" || envLower === "1") { + opts.usePolling = true; + } else { + opts.usePolling = !!envLower; + } + } + const envInterval = process.env.CHOKIDAR_INTERVAL; + if (envInterval) { + opts.interval = Number.parseInt(envInterval, 10); + } + if (undef(opts, "atomic")) + opts.atomic = !opts.usePolling && !opts.useFsEvents; + if (opts.atomic) + this._pendingUnlinks = new Map(); + if (undef(opts, "followSymlinks")) + opts.followSymlinks = true; + if (undef(opts, "awaitWriteFinish")) + opts.awaitWriteFinish = false; + if (opts.awaitWriteFinish === true) + opts.awaitWriteFinish = {}; + const awf = opts.awaitWriteFinish; + if (awf) { + if (!awf.stabilityThreshold) + awf.stabilityThreshold = 2e3; + if (!awf.pollInterval) + awf.pollInterval = 100; + this._pendingWrites = new Map(); + } + if (opts.ignored) + opts.ignored = arrify(opts.ignored); + let readyCalls = 0; + this._emitReady = () => { + readyCalls++; + if (readyCalls >= this._readyCount) { + this._emitReady = EMPTY_FN; + this._readyEmitted = true; + process.nextTick(() => this.emit(EV_READY)); + } + }; + this._emitRaw = (...args) => this.emit(EV_RAW, ...args); + this._readyEmitted = false; + this.options = opts; + if (opts.useFsEvents) { + this._fsEventsHandler = new FsEventsHandler(this); + } else { + this._nodeFsHandler = new NodeFsHandler(this); + } + Object.freeze(opts); + } + add(paths_, _origAdd, _internal) { + const {cwd, disableGlobbing} = this.options; + this.closed = false; + let paths = unifyPaths(paths_); + if (cwd) { + paths = paths.map((path) => { + const absPath = getAbsolutePath(path, cwd); + if (disableGlobbing || !isGlob(path)) { + return absPath; + } + return normalizePath(absPath); + }); + } + paths = paths.filter((path) => { + if (path.startsWith(BANG)) { + this._ignoredPaths.add(path.slice(1)); + return false; + } + this._ignoredPaths.delete(path); + this._ignoredPaths.delete(path + SLASH_GLOBSTAR); + this._userIgnored = void 0; + return true; + }); + if (this.options.useFsEvents && this._fsEventsHandler) { + if (!this._readyCount) + this._readyCount = paths.length; + if (this.options.persistent) + this._readyCount *= 2; + paths.forEach((path) => this._fsEventsHandler._addToFsEvents(path)); + } else { + if (!this._readyCount) + this._readyCount = 0; + this._readyCount += paths.length; + Promise.all(paths.map(async (path) => { + const res = await this._nodeFsHandler._addToNodeFs(path, !_internal, 0, 0, _origAdd); + if (res) + this._emitReady(); + return res; + })).then((results) => { + if (this.closed) + return; + results.filter((item) => item).forEach((item) => { + this.add(sysPath.dirname(item), sysPath.basename(_origAdd || item)); + }); + }); + } + return this; + } + unwatch(paths_) { + if (this.closed) + return this; + const paths = unifyPaths(paths_); + const {cwd} = this.options; + paths.forEach((path) => { + if (!sysPath.isAbsolute(path) && !this._closers.has(path)) { + if (cwd) + path = sysPath.join(cwd, path); + path = sysPath.resolve(path); + } + this._closePath(path); + this._ignoredPaths.add(path); + if (this._watched.has(path)) { + this._ignoredPaths.add(path + SLASH_GLOBSTAR); + } + this._userIgnored = void 0; + }); + return this; + } + close() { + if (this.closed) + return this._closePromise; + this.closed = true; + this.removeAllListeners(); + const closers = []; + this._closers.forEach((closerList) => closerList.forEach((closer) => { + const promise = closer(); + if (promise instanceof Promise) + closers.push(promise); + })); + this._streams.forEach((stream) => stream.destroy()); + this._userIgnored = void 0; + this._readyCount = 0; + this._readyEmitted = false; + this._watched.forEach((dirent) => dirent.dispose()); + ["closers", "watched", "streams", "symlinkPaths", "throttled"].forEach((key) => { + this[`_${key}`].clear(); + }); + this._closePromise = closers.length ? Promise.all(closers).then(() => void 0) : Promise.resolve(); + return this._closePromise; + } + getWatched() { + const watchList = {}; + this._watched.forEach((entry, dir) => { + const key = this.options.cwd ? sysPath.relative(this.options.cwd, dir) : dir; + watchList[key || ONE_DOT] = entry.getChildren().sort(); + }); + return watchList; + } + emitWithAll(event, args) { + this.emit(...args); + if (event !== EV_ERROR) + this.emit(EV_ALL, ...args); + } + async _emit(event, path, val1, val2, val3) { + if (this.closed) + return; + const opts = this.options; + if (isWindows) + path = sysPath.normalize(path); + if (opts.cwd) + path = sysPath.relative(opts.cwd, path); + const args = [event, path]; + if (val3 !== void 0) + args.push(val1, val2, val3); + else if (val2 !== void 0) + args.push(val1, val2); + else if (val1 !== void 0) + args.push(val1); + const awf = opts.awaitWriteFinish; + let pw; + if (awf && (pw = this._pendingWrites.get(path))) { + pw.lastChange = new Date(); + return this; + } + if (opts.atomic) { + if (event === EV_UNLINK) { + this._pendingUnlinks.set(path, args); + setTimeout(() => { + this._pendingUnlinks.forEach((entry, path2) => { + this.emit(...entry); + this.emit(EV_ALL, ...entry); + this._pendingUnlinks.delete(path2); + }); + }, typeof opts.atomic === "number" ? opts.atomic : 100); + return this; + } + if (event === EV_ADD && this._pendingUnlinks.has(path)) { + event = args[0] = EV_CHANGE; + this._pendingUnlinks.delete(path); + } + } + if (awf && (event === EV_ADD || event === EV_CHANGE) && this._readyEmitted) { + const awfEmit = (err, stats) => { + if (err) { + event = args[0] = EV_ERROR; + args[1] = err; + this.emitWithAll(event, args); + } else if (stats) { + if (args.length > 2) { + args[2] = stats; + } else { + args.push(stats); + } + this.emitWithAll(event, args); + } + }; + this._awaitWriteFinish(path, awf.stabilityThreshold, event, awfEmit); + return this; + } + if (event === EV_CHANGE) { + const isThrottled = !this._throttle(EV_CHANGE, path, 50); + if (isThrottled) + return this; + } + if (opts.alwaysStat && val1 === void 0 && (event === EV_ADD || event === EV_ADD_DIR || event === EV_CHANGE)) { + const fullPath = opts.cwd ? sysPath.join(opts.cwd, path) : path; + let stats; + try { + stats = await stat(fullPath); + } catch (err) { + } + if (!stats || this.closed) + return; + args.push(stats); + } + this.emitWithAll(event, args); + return this; + } + _handleError(error) { + const code = error && error.code; + if (error && code !== "ENOENT" && code !== "ENOTDIR" && (!this.options.ignorePermissionErrors || code !== "EPERM" && code !== "EACCES")) { + this.emit(EV_ERROR, error); + } + return error || this.closed; + } + _throttle(actionType, path, timeout) { + if (!this._throttled.has(actionType)) { + this._throttled.set(actionType, new Map()); + } + const action = this._throttled.get(actionType); + const actionPath = action.get(path); + if (actionPath) { + actionPath.count++; + return false; + } + let timeoutObject; + const clear = () => { + const item = action.get(path); + const count = item ? item.count : 0; + action.delete(path); + clearTimeout(timeoutObject); + if (item) + clearTimeout(item.timeoutObject); + return count; + }; + timeoutObject = setTimeout(clear, timeout); + const thr = {timeoutObject, clear, count: 0}; + action.set(path, thr); + return thr; + } + _incrReadyCount() { + return this._readyCount++; + } + _awaitWriteFinish(path, threshold, event, awfEmit) { + let timeoutHandler; + let fullPath = path; + if (this.options.cwd && !sysPath.isAbsolute(path)) { + fullPath = sysPath.join(this.options.cwd, path); + } + const now = new Date(); + const awaitWriteFinish = (prevStat) => { + fs.stat(fullPath, (err, curStat) => { + if (err || !this._pendingWrites.has(path)) { + if (err && err.code !== "ENOENT") + awfEmit(err); + return; + } + const now2 = Number(new Date()); + if (prevStat && curStat.size !== prevStat.size) { + this._pendingWrites.get(path).lastChange = now2; + } + const pw = this._pendingWrites.get(path); + const df = now2 - pw.lastChange; + if (df >= threshold) { + this._pendingWrites.delete(path); + awfEmit(void 0, curStat); + } else { + timeoutHandler = setTimeout(awaitWriteFinish, this.options.awaitWriteFinish.pollInterval, curStat); + } + }); + }; + if (!this._pendingWrites.has(path)) { + this._pendingWrites.set(path, { + lastChange: now, + cancelWait: () => { + this._pendingWrites.delete(path); + clearTimeout(timeoutHandler); + return event; + } + }); + timeoutHandler = setTimeout(awaitWriteFinish, this.options.awaitWriteFinish.pollInterval); + } + } + _getGlobIgnored() { + return [...this._ignoredPaths.values()]; + } + _isIgnored(path, stats) { + if (this.options.atomic && DOT_RE.test(path)) + return true; + if (!this._userIgnored) { + const {cwd} = this.options; + const ign = this.options.ignored; + const ignored = ign && ign.map(normalizeIgnored(cwd)); + const paths = arrify(ignored).filter((path2) => typeof path2 === STRING_TYPE && !isGlob(path2)).map((path2) => path2 + SLASH_GLOBSTAR); + const list = this._getGlobIgnored().map(normalizeIgnored(cwd)).concat(ignored, paths); + this._userIgnored = anymatch(list, void 0, ANYMATCH_OPTS); + } + return this._userIgnored([path, stats]); + } + _isntIgnored(path, stat2) { + return !this._isIgnored(path, stat2); + } + _getWatchHelpers(path, depth) { + const watchPath = depth || this.options.disableGlobbing || !isGlob(path) ? path : globParent(path); + const follow = this.options.followSymlinks; + return new WatchHelper(path, watchPath, follow, this); + } + _getWatchedDir(directory) { + if (!this._boundRemove) + this._boundRemove = this._remove.bind(this); + const dir = sysPath.resolve(directory); + if (!this._watched.has(dir)) + this._watched.set(dir, new DirEntry(dir, this._boundRemove)); + return this._watched.get(dir); + } + _hasReadPermissions(stats) { + if (this.options.ignorePermissionErrors) + return true; + const md = stats && Number.parseInt(stats.mode, 10); + const st = md & 511; + const it = Number.parseInt(st.toString(8)[0], 10); + return Boolean(4 & it); + } + _remove(directory, item, isDirectory) { + const path = sysPath.join(directory, item); + const fullPath = sysPath.resolve(path); + isDirectory = isDirectory != null ? isDirectory : this._watched.has(path) || this._watched.has(fullPath); + if (!this._throttle("remove", path, 100)) + return; + if (!isDirectory && !this.options.useFsEvents && this._watched.size === 1) { + this.add(directory, item, true); + } + const wp = this._getWatchedDir(path); + const nestedDirectoryChildren = wp.getChildren(); + nestedDirectoryChildren.forEach((nested) => this._remove(path, nested)); + const parent = this._getWatchedDir(directory); + const wasTracked = parent.has(item); + parent.remove(item); + if (this._symlinkPaths.has(fullPath)) { + this._symlinkPaths.delete(fullPath); + } + let relPath = path; + if (this.options.cwd) + relPath = sysPath.relative(this.options.cwd, path); + if (this.options.awaitWriteFinish && this._pendingWrites.has(relPath)) { + const event = this._pendingWrites.get(relPath).cancelWait(); + if (event === EV_ADD) + return; + } + this._watched.delete(path); + this._watched.delete(fullPath); + const eventName = isDirectory ? EV_UNLINK_DIR : EV_UNLINK; + if (wasTracked && !this._isIgnored(path)) + this._emit(eventName, path); + if (!this.options.useFsEvents) { + this._closePath(path); + } + } + _closePath(path) { + this._closeFile(path); + const dir = sysPath.dirname(path); + this._getWatchedDir(dir).remove(sysPath.basename(path)); + } + _closeFile(path) { + const closers = this._closers.get(path); + if (!closers) + return; + closers.forEach((closer) => closer()); + this._closers.delete(path); + } + _addPathCloser(path, closer) { + if (!closer) + return; + let list = this._closers.get(path); + if (!list) { + list = []; + this._closers.set(path, list); + } + list.push(closer); + } + _readdirp(root, opts) { + if (this.closed) + return; + const options = {type: EV_ALL, alwaysStat: true, lstat: true, ...opts}; + let stream = readdirp(root, options); + this._streams.add(stream); + stream.once(STR_CLOSE, () => { + stream = void 0; + }); + stream.once(STR_END, () => { + if (stream) { + this._streams.delete(stream); + stream = void 0; + } + }); + return stream; + } + }; + exports2.FSWatcher = FSWatcher; + var watch = (paths, options) => { + const watcher = new FSWatcher(options); + watcher.add(paths); + return watcher; + }; + exports2.watch = watch; +}); + +// ../../node_modules/nunjucks/src/node-loaders.js +var require_node_loaders = __commonJS((exports2, module2) => { + "use strict"; + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + _setPrototypeOf(subClass, superClass); + } + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o2, p2) { + o2.__proto__ = p2; + return o2; + }; + return _setPrototypeOf(o, p); + } + var fs = require("fs"); + var path = require("path"); + var Loader2 = require_loader(); + var _require2 = require_precompiled_loader(); + var PrecompiledLoader = _require2.PrecompiledLoader; + var chokidar; + var FileSystemLoader = /* @__PURE__ */ function(_Loader) { + _inheritsLoose(FileSystemLoader2, _Loader); + function FileSystemLoader2(searchPaths, opts) { + var _this; + _this = _Loader.call(this) || this; + if (typeof opts === "boolean") { + console.log("[nunjucks] Warning: you passed a boolean as the second argument to FileSystemLoader, but it now takes an options object. See http://mozilla.github.io/nunjucks/api.html#filesystemloader"); + } + opts = opts || {}; + _this.pathsToNames = {}; + _this.noCache = !!opts.noCache; + if (searchPaths) { + searchPaths = Array.isArray(searchPaths) ? searchPaths : [searchPaths]; + _this.searchPaths = searchPaths.map(path.normalize); + } else { + _this.searchPaths = ["."]; + } + if (opts.watch) { + try { + chokidar = require_chokidar(); + } catch (e2) { + throw new Error("watch requires chokidar to be installed"); + } + var paths = _this.searchPaths.filter(fs.existsSync); + var watcher = chokidar.watch(paths); + watcher.on("all", function(event, fullname) { + fullname = path.resolve(fullname); + if (event === "change" && fullname in _this.pathsToNames) { + _this.emit("update", _this.pathsToNames[fullname], fullname); + } + }); + watcher.on("error", function(error) { + console.log("Watcher error: " + error); + }); + } + return _this; + } + var _proto = FileSystemLoader2.prototype; + _proto.getSource = function getSource(name) { + var fullpath = null; + var paths = this.searchPaths; + for (var i = 0; i < paths.length; i++) { + var basePath = path.resolve(paths[i]); + var p = path.resolve(paths[i], name); + if (p.indexOf(basePath) === 0 && fs.existsSync(p)) { + fullpath = p; + break; + } + } + if (!fullpath) { + return null; + } + this.pathsToNames[fullpath] = name; + var source = { + src: fs.readFileSync(fullpath, "utf-8"), + path: fullpath, + noCache: this.noCache + }; + this.emit("load", name, source); + return source; + }; + return FileSystemLoader2; + }(Loader2); + var NodeResolveLoader = /* @__PURE__ */ function(_Loader2) { + _inheritsLoose(NodeResolveLoader2, _Loader2); + function NodeResolveLoader2(opts) { + var _this2; + _this2 = _Loader2.call(this) || this; + opts = opts || {}; + _this2.pathsToNames = {}; + _this2.noCache = !!opts.noCache; + if (opts.watch) { + try { + chokidar = require_chokidar(); + } catch (e2) { + throw new Error("watch requires chokidar to be installed"); + } + _this2.watcher = chokidar.watch(); + _this2.watcher.on("change", function(fullname) { + _this2.emit("update", _this2.pathsToNames[fullname], fullname); + }); + _this2.watcher.on("error", function(error) { + console.log("Watcher error: " + error); + }); + _this2.on("load", function(name, source) { + _this2.watcher.add(source.path); + }); + } + return _this2; + } + var _proto2 = NodeResolveLoader2.prototype; + _proto2.getSource = function getSource(name) { + if (/^\.?\.?(\/|\\)/.test(name)) { + return null; + } + if (/^[A-Z]:/.test(name)) { + return null; + } + var fullpath; + try { + fullpath = require.resolve(name); + } catch (e2) { + return null; + } + this.pathsToNames[fullpath] = name; + var source = { + src: fs.readFileSync(fullpath, "utf-8"), + path: fullpath, + noCache: this.noCache + }; + this.emit("load", name, source); + return source; + }; + return NodeResolveLoader2; + }(Loader2); + module2.exports = { + FileSystemLoader, + PrecompiledLoader, + NodeResolveLoader + }; +}); + +// ../../node_modules/nunjucks/src/loaders.js +var require_loaders = __commonJS((exports2, module2) => { + "use strict"; + module2.exports = require_node_loaders(); +}); + +// ../../node_modules/nunjucks/src/tests.js +var require_tests = __commonJS((exports2) => { + "use strict"; + var SafeString = require_runtime().SafeString; + function callable(value) { + return typeof value === "function"; + } + exports2.callable = callable; + function defined(value) { + return value !== void 0; + } + exports2.defined = defined; + function divisibleby(one, two) { + return one % two === 0; + } + exports2.divisibleby = divisibleby; + function escaped(value) { + return value instanceof SafeString; + } + exports2.escaped = escaped; + function equalto(one, two) { + return one === two; + } + exports2.equalto = equalto; + exports2.eq = exports2.equalto; + exports2.sameas = exports2.equalto; + function even(value) { + return value % 2 === 0; + } + exports2.even = even; + function falsy(value) { + return !value; + } + exports2.falsy = falsy; + function ge(one, two) { + return one >= two; + } + exports2.ge = ge; + function greaterthan(one, two) { + return one > two; + } + exports2.greaterthan = greaterthan; + exports2.gt = exports2.greaterthan; + function le(one, two) { + return one <= two; + } + exports2.le = le; + function lessthan(one, two) { + return one < two; + } + exports2.lessthan = lessthan; + exports2.lt = exports2.lessthan; + function lower(value) { + return value.toLowerCase() === value; + } + exports2.lower = lower; + function ne(one, two) { + return one !== two; + } + exports2.ne = ne; + function nullTest(value) { + return value === null; + } + exports2.null = nullTest; + function number(value) { + return typeof value === "number"; + } + exports2.number = number; + function odd(value) { + return value % 2 === 1; + } + exports2.odd = odd; + function string(value) { + return typeof value === "string"; + } + exports2.string = string; + function truthy(value) { + return !!value; + } + exports2.truthy = truthy; + function undefinedTest(value) { + return value === void 0; + } + exports2.undefined = undefinedTest; + function upper(value) { + return value.toUpperCase() === value; + } + exports2.upper = upper; + function iterable(value) { + if (typeof Symbol !== "undefined") { + return !!value[Symbol.iterator]; + } else { + return Array.isArray(value) || typeof value === "string"; + } + } + exports2.iterable = iterable; + function mapping(value) { + var bool = value !== null && value !== void 0 && typeof value === "object" && !Array.isArray(value); + if (Set) { + return bool && !(value instanceof Set); + } else { + return bool; + } + } + exports2.mapping = mapping; +}); + +// ../../node_modules/nunjucks/src/globals.js +var require_globals = __commonJS((exports2, module2) => { + "use strict"; + function _cycler(items) { + var index = -1; + return { + current: null, + reset: function reset2() { + index = -1; + this.current = null; + }, + next: function next() { + index++; + if (index >= items.length) { + index = 0; + } + this.current = items[index]; + return this.current; + } + }; + } + function _joiner(sep) { + sep = sep || ","; + var first = true; + return function() { + var val = first ? "" : sep; + first = false; + return val; + }; + } + function globals() { + return { + range: function range(start, stop, step) { + if (typeof stop === "undefined") { + stop = start; + start = 0; + step = 1; + } else if (!step) { + step = 1; + } + var arr = []; + if (step > 0) { + for (var i = start; i < stop; i += step) { + arr.push(i); + } + } else { + for (var _i = start; _i > stop; _i += step) { + arr.push(_i); + } + } + return arr; + }, + cycler: function cycler() { + return _cycler(Array.prototype.slice.call(arguments)); + }, + joiner: function joiner(sep) { + return _joiner(sep); + } + }; + } + module2.exports = globals; +}); + +// ../../node_modules/nunjucks/src/express-app.js +var require_express_app = __commonJS((exports2, module2) => { + "use strict"; + var path = require("path"); + module2.exports = function express(env, app) { + function NunjucksView(name, opts) { + this.name = name; + this.path = name; + this.defaultEngine = opts.defaultEngine; + this.ext = path.extname(name); + if (!this.ext && !this.defaultEngine) { + throw new Error("No default engine was specified and no extension was provided."); + } + if (!this.ext) { + this.name += this.ext = (this.defaultEngine[0] !== "." ? "." : "") + this.defaultEngine; + } + } + NunjucksView.prototype.render = function render2(opts, cb) { + env.render(this.name, opts, cb); + }; + app.set("view", NunjucksView); + app.set("nunjucksEnv", env); + return env; + }; +}); + +// ../../node_modules/nunjucks/src/environment.js +var require_environment = __commonJS((exports2, module2) => { + "use strict"; + function _inheritsLoose(subClass, superClass) { + subClass.prototype = Object.create(superClass.prototype); + subClass.prototype.constructor = subClass; + _setPrototypeOf(subClass, superClass); + } + function _setPrototypeOf(o, p) { + _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf2(o2, p2) { + o2.__proto__ = p2; + return o2; + }; + return _setPrototypeOf(o, p); + } + var asap = require_asap(); + var _waterfall = require_a_sync_waterfall(); + var lib2 = require_lib(); + var compiler2 = require_compiler(); + var filters = require_filters(); + var _require2 = require_loaders(); + var FileSystemLoader = _require2.FileSystemLoader; + var WebLoader = _require2.WebLoader; + var PrecompiledLoader = _require2.PrecompiledLoader; + var tests = require_tests(); + var globals = require_globals(); + var _require22 = require_object(); + var Obj = _require22.Obj; + var EmitterObj = _require22.EmitterObj; + var globalRuntime = require_runtime(); + var handleError = globalRuntime.handleError; + var Frame = globalRuntime.Frame; + var expressApp = require_express_app(); + function callbackAsap(cb, err, res) { + asap(function() { + cb(err, res); + }); + } + var noopTmplSrc = { + type: "code", + obj: { + root: function root(env, context, frame, runtime2, cb) { + try { + cb(null, ""); + } catch (e2) { + cb(handleError(e2, null, null)); + } + } + } + }; + var Environment2 = /* @__PURE__ */ function(_EmitterObj) { + _inheritsLoose(Environment3, _EmitterObj); + function Environment3() { + return _EmitterObj.apply(this, arguments) || this; + } + var _proto = Environment3.prototype; + _proto.init = function init(loaders2, opts) { + var _this = this; + opts = this.opts = opts || {}; + this.opts.dev = !!opts.dev; + this.opts.autoescape = opts.autoescape != null ? opts.autoescape : true; + this.opts.throwOnUndefined = !!opts.throwOnUndefined; + this.opts.trimBlocks = !!opts.trimBlocks; + this.opts.lstripBlocks = !!opts.lstripBlocks; + this.loaders = []; + if (!loaders2) { + if (FileSystemLoader) { + this.loaders = [new FileSystemLoader("views")]; + } else if (WebLoader) { + this.loaders = [new WebLoader("/views")]; + } + } else { + this.loaders = lib2.isArray(loaders2) ? loaders2 : [loaders2]; + } + if (typeof window !== "undefined" && window.nunjucksPrecompiled) { + this.loaders.unshift(new PrecompiledLoader(window.nunjucksPrecompiled)); + } + this._initLoaders(); + this.globals = globals(); + this.filters = {}; + this.tests = {}; + this.asyncFilters = []; + this.extensions = {}; + this.extensionsList = []; + lib2._entries(filters).forEach(function(_ref) { + var name = _ref[0], filter = _ref[1]; + return _this.addFilter(name, filter); + }); + lib2._entries(tests).forEach(function(_ref2) { + var name = _ref2[0], test = _ref2[1]; + return _this.addTest(name, test); + }); + }; + _proto._initLoaders = function _initLoaders() { + var _this2 = this; + this.loaders.forEach(function(loader) { + loader.cache = {}; + if (typeof loader.on === "function") { + loader.on("update", function(name, fullname) { + loader.cache[name] = null; + _this2.emit("update", name, fullname, loader); + }); + loader.on("load", function(name, source) { + _this2.emit("load", name, source, loader); + }); + } + }); + }; + _proto.invalidateCache = function invalidateCache() { + this.loaders.forEach(function(loader) { + loader.cache = {}; + }); + }; + _proto.addExtension = function addExtension(name, extension) { + extension.__name = name; + this.extensions[name] = extension; + this.extensionsList.push(extension); + return this; + }; + _proto.removeExtension = function removeExtension(name) { + var extension = this.getExtension(name); + if (!extension) { + return; + } + this.extensionsList = lib2.without(this.extensionsList, extension); + delete this.extensions[name]; + }; + _proto.getExtension = function getExtension(name) { + return this.extensions[name]; + }; + _proto.hasExtension = function hasExtension(name) { + return !!this.extensions[name]; + }; + _proto.addGlobal = function addGlobal(name, value) { + this.globals[name] = value; + return this; + }; + _proto.getGlobal = function getGlobal(name) { + if (typeof this.globals[name] === "undefined") { + throw new Error("global not found: " + name); + } + return this.globals[name]; + }; + _proto.addFilter = function addFilter(name, func, async) { + var wrapped = func; + if (async) { + this.asyncFilters.push(name); + } + this.filters[name] = wrapped; + return this; + }; + _proto.getFilter = function getFilter(name) { + if (!this.filters[name]) { + throw new Error("filter not found: " + name); + } + return this.filters[name]; + }; + _proto.addTest = function addTest(name, func) { + this.tests[name] = func; + return this; + }; + _proto.getTest = function getTest(name) { + if (!this.tests[name]) { + throw new Error("test not found: " + name); + } + return this.tests[name]; + }; + _proto.resolveTemplate = function resolveTemplate(loader, parentName, filename) { + var isRelative = loader.isRelative && parentName ? loader.isRelative(filename) : false; + return isRelative && loader.resolve ? loader.resolve(parentName, filename) : filename; + }; + _proto.getTemplate = function getTemplate(name, eagerCompile, parentName, ignoreMissing, cb) { + var _this3 = this; + var that = this; + var tmpl = null; + if (name && name.raw) { + name = name.raw; + } + if (lib2.isFunction(parentName)) { + cb = parentName; + parentName = null; + eagerCompile = eagerCompile || false; + } + if (lib2.isFunction(eagerCompile)) { + cb = eagerCompile; + eagerCompile = false; + } + if (name instanceof Template2) { + tmpl = name; + } else if (typeof name !== "string") { + throw new Error("template names must be a string: " + name); + } else { + for (var i = 0; i < this.loaders.length; i++) { + var loader = this.loaders[i]; + tmpl = loader.cache[this.resolveTemplate(loader, parentName, name)]; + if (tmpl) { + break; + } + } + } + if (tmpl) { + if (eagerCompile) { + tmpl.compile(); + } + if (cb) { + cb(null, tmpl); + return void 0; + } else { + return tmpl; + } + } + var syncResult; + var createTemplate = function createTemplate2(err, info) { + if (!info && !err && !ignoreMissing) { + err = new Error("template not found: " + name); + } + if (err) { + if (cb) { + cb(err); + return; + } else { + throw err; + } + } + var newTmpl; + if (!info) { + newTmpl = new Template2(noopTmplSrc, _this3, "", eagerCompile); + } else { + newTmpl = new Template2(info.src, _this3, info.path, eagerCompile); + if (!info.noCache) { + info.loader.cache[name] = newTmpl; + } + } + if (cb) { + cb(null, newTmpl); + } else { + syncResult = newTmpl; + } + }; + lib2.asyncIter(this.loaders, function(loader2, i2, next, done) { + function handle(err, src) { + if (err) { + done(err); + } else if (src) { + src.loader = loader2; + done(null, src); + } else { + next(); + } + } + name = that.resolveTemplate(loader2, parentName, name); + if (loader2.async) { + loader2.getSource(name, handle); + } else { + handle(null, loader2.getSource(name)); + } + }, createTemplate); + return syncResult; + }; + _proto.express = function express(app) { + return expressApp(this, app); + }; + _proto.render = function render2(name, ctx, cb) { + if (lib2.isFunction(ctx)) { + cb = ctx; + ctx = null; + } + var syncResult = null; + this.getTemplate(name, function(err, tmpl) { + if (err && cb) { + callbackAsap(cb, err); + } else if (err) { + throw err; + } else { + syncResult = tmpl.render(ctx, cb); + } + }); + return syncResult; + }; + _proto.renderString = function renderString2(src, ctx, opts, cb) { + if (lib2.isFunction(opts)) { + cb = opts; + opts = {}; + } + opts = opts || {}; + var tmpl = new Template2(src, this, opts.path); + return tmpl.render(ctx, cb); + }; + _proto.waterfall = function waterfall(tasks, callback, forceAsync) { + return _waterfall(tasks, callback, forceAsync); + }; + return Environment3; + }(EmitterObj); + var Context = /* @__PURE__ */ function(_Obj) { + _inheritsLoose(Context2, _Obj); + function Context2() { + return _Obj.apply(this, arguments) || this; + } + var _proto2 = Context2.prototype; + _proto2.init = function init(ctx, blocks, env) { + var _this4 = this; + this.env = env || new Environment2(); + this.ctx = lib2.extend({}, ctx); + this.blocks = {}; + this.exported = []; + lib2.keys(blocks).forEach(function(name) { + _this4.addBlock(name, blocks[name]); + }); + }; + _proto2.lookup = function lookup(name) { + if (name in this.env.globals && !(name in this.ctx)) { + return this.env.globals[name]; + } else { + return this.ctx[name]; + } + }; + _proto2.setVariable = function setVariable(name, val) { + this.ctx[name] = val; + }; + _proto2.getVariables = function getVariables() { + return this.ctx; + }; + _proto2.addBlock = function addBlock(name, block) { + this.blocks[name] = this.blocks[name] || []; + this.blocks[name].push(block); + return this; + }; + _proto2.getBlock = function getBlock(name) { + if (!this.blocks[name]) { + throw new Error('unknown block "' + name + '"'); + } + return this.blocks[name][0]; + }; + _proto2.getSuper = function getSuper(env, name, block, frame, runtime2, cb) { + var idx = lib2.indexOf(this.blocks[name] || [], block); + var blk = this.blocks[name][idx + 1]; + var context = this; + if (idx === -1 || !blk) { + throw new Error('no super block available for "' + name + '"'); + } + blk(env, context, frame, runtime2, cb); + }; + _proto2.addExport = function addExport(name) { + this.exported.push(name); + }; + _proto2.getExported = function getExported() { + var _this5 = this; + var exported = {}; + this.exported.forEach(function(name) { + exported[name] = _this5.ctx[name]; + }); + return exported; + }; + return Context2; + }(Obj); + var Template2 = /* @__PURE__ */ function(_Obj2) { + _inheritsLoose(Template3, _Obj2); + function Template3() { + return _Obj2.apply(this, arguments) || this; + } + var _proto3 = Template3.prototype; + _proto3.init = function init(src, env, path, eagerCompile) { + this.env = env || new Environment2(); + if (lib2.isObject(src)) { + switch (src.type) { + case "code": + this.tmplProps = src.obj; + break; + case "string": + this.tmplStr = src.obj; + break; + default: + throw new Error("Unexpected template object type " + src.type + "; expected 'code', or 'string'"); + } + } else if (lib2.isString(src)) { + this.tmplStr = src; + } else { + throw new Error("src must be a string or an object describing the source"); + } + this.path = path; + if (eagerCompile) { + try { + this._compile(); + } catch (err) { + throw lib2._prettifyError(this.path, this.env.opts.dev, err); + } + } else { + this.compiled = false; + } + }; + _proto3.render = function render2(ctx, parentFrame, cb) { + var _this6 = this; + if (typeof ctx === "function") { + cb = ctx; + ctx = {}; + } else if (typeof parentFrame === "function") { + cb = parentFrame; + parentFrame = null; + } + var forceAsync = !parentFrame; + try { + this.compile(); + } catch (e2) { + var err = lib2._prettifyError(this.path, this.env.opts.dev, e2); + if (cb) { + return callbackAsap(cb, err); + } else { + throw err; + } + } + var context = new Context(ctx || {}, this.blocks, this.env); + var frame = parentFrame ? parentFrame.push(true) : new Frame(); + frame.topLevel = true; + var syncResult = null; + var didError = false; + this.rootRenderFunc(this.env, context, frame, globalRuntime, function(err2, res) { + if (didError && cb && typeof res !== "undefined") { + return; + } + if (err2) { + err2 = lib2._prettifyError(_this6.path, _this6.env.opts.dev, err2); + didError = true; + } + if (cb) { + if (forceAsync) { + callbackAsap(cb, err2, res); + } else { + cb(err2, res); + } + } else { + if (err2) { + throw err2; + } + syncResult = res; + } + }); + return syncResult; + }; + _proto3.getExported = function getExported(ctx, parentFrame, cb) { + if (typeof ctx === "function") { + cb = ctx; + ctx = {}; + } + if (typeof parentFrame === "function") { + cb = parentFrame; + parentFrame = null; + } + try { + this.compile(); + } catch (e2) { + if (cb) { + return cb(e2); + } else { + throw e2; + } + } + var frame = parentFrame ? parentFrame.push() : new Frame(); + frame.topLevel = true; + var context = new Context(ctx || {}, this.blocks, this.env); + this.rootRenderFunc(this.env, context, frame, globalRuntime, function(err) { + if (err) { + cb(err, null); + } else { + cb(null, context.getExported()); + } + }); + }; + _proto3.compile = function compile2() { + if (!this.compiled) { + this._compile(); + } + }; + _proto3._compile = function _compile() { + var props; + if (this.tmplProps) { + props = this.tmplProps; + } else { + var source = compiler2.compile(this.tmplStr, this.env.asyncFilters, this.env.extensionsList, this.path, this.env.opts); + var func = new Function(source); + props = func(); + } + this.blocks = this._getBlocks(props); + this.rootRenderFunc = props.root; + this.compiled = true; + }; + _proto3._getBlocks = function _getBlocks(props) { + var blocks = {}; + lib2.keys(props).forEach(function(k) { + if (k.slice(0, 2) === "b_") { + blocks[k.slice(2)] = props[k]; + } + }); + return blocks; + }; + return Template3; + }(Obj); + module2.exports = { + Environment: Environment2, + Template: Template2 + }; +}); + +// ../../node_modules/nunjucks/src/precompile-global.js +var require_precompile_global = __commonJS((exports2, module2) => { + "use strict"; + function precompileGlobal(templates, opts) { + var out = ""; + opts = opts || {}; + for (var i = 0; i < templates.length; i++) { + var name = JSON.stringify(templates[i].name); + var template = templates[i].template; + out += "(function() {(window.nunjucksPrecompiled = window.nunjucksPrecompiled || {})[" + name + "] = (function() {\n" + template + "\n})();\n"; + if (opts.asFunction) { + out += "return function(ctx, cb) { return nunjucks.render(" + name + ", ctx, cb); }\n"; + } + out += "})();\n"; + } + return out; + } + module2.exports = precompileGlobal; +}); + +// ../../node_modules/nunjucks/src/precompile.js +var require_precompile = __commonJS((exports2, module2) => { + "use strict"; + var fs = require("fs"); + var path = require("path"); + var _require2 = require_lib(); + var _prettifyError = _require2._prettifyError; + var compiler2 = require_compiler(); + var _require22 = require_environment(); + var Environment2 = _require22.Environment; + var precompileGlobal = require_precompile_global(); + function match(filename, patterns) { + if (!Array.isArray(patterns)) { + return false; + } + return patterns.some(function(pattern) { + return filename.match(pattern); + }); + } + function precompileString(str, opts) { + opts = opts || {}; + opts.isString = true; + var env = opts.env || new Environment2([]); + var wrapper = opts.wrapper || precompileGlobal; + if (!opts.name) { + throw new Error('the "name" option is required when compiling a string'); + } + return wrapper([_precompile(str, opts.name, env)], opts); + } + function precompile2(input, opts) { + opts = opts || {}; + var env = opts.env || new Environment2([]); + var wrapper = opts.wrapper || precompileGlobal; + if (opts.isString) { + return precompileString(input, opts); + } + var pathStats = fs.existsSync(input) && fs.statSync(input); + var precompiled = []; + var templates = []; + function addTemplates(dir) { + fs.readdirSync(dir).forEach(function(file) { + var filepath = path.join(dir, file); + var subpath = filepath.substr(path.join(input, "/").length); + var stat = fs.statSync(filepath); + if (stat && stat.isDirectory()) { + subpath += "/"; + if (!match(subpath, opts.exclude)) { + addTemplates(filepath); + } + } else if (match(subpath, opts.include)) { + templates.push(filepath); + } + }); + } + if (pathStats.isFile()) { + precompiled.push(_precompile(fs.readFileSync(input, "utf-8"), opts.name || input, env)); + } else if (pathStats.isDirectory()) { + addTemplates(input); + for (var i = 0; i < templates.length; i++) { + var name = templates[i].replace(path.join(input, "/"), ""); + try { + precompiled.push(_precompile(fs.readFileSync(templates[i], "utf-8"), name, env)); + } catch (e2) { + if (opts.force) { + console.error(e2); + } else { + throw e2; + } + } + } + } + return wrapper(precompiled, opts); + } + function _precompile(str, name, env) { + env = env || new Environment2([]); + var asyncFilters = env.asyncFilters; + var extensions = env.extensionsList; + var template; + name = name.replace(/\\/g, "/"); + try { + template = compiler2.compile(str, asyncFilters, extensions, name, env.opts); + } catch (err) { + throw _prettifyError(name, false, err); + } + return { + name, + template + }; + } + module2.exports = { + precompile: precompile2, + precompileString + }; +}); + +// ../../node_modules/nunjucks/src/jinja-compat.js +var require_jinja_compat = __commonJS((exports2, module2) => { + "use strict"; + function installCompat() { + "use strict"; + var runtime2 = this.runtime; + var lib2 = this.lib; + var Compiler = this.compiler.Compiler; + var Parser = this.parser.Parser; + var nodes2 = this.nodes; + var lexer2 = this.lexer; + var orig_contextOrFrameLookup = runtime2.contextOrFrameLookup; + var orig_memberLookup = runtime2.memberLookup; + var orig_Compiler_assertType; + var orig_Parser_parseAggregate; + if (Compiler) { + orig_Compiler_assertType = Compiler.prototype.assertType; + } + if (Parser) { + orig_Parser_parseAggregate = Parser.prototype.parseAggregate; + } + function uninstall() { + runtime2.contextOrFrameLookup = orig_contextOrFrameLookup; + runtime2.memberLookup = orig_memberLookup; + if (Compiler) { + Compiler.prototype.assertType = orig_Compiler_assertType; + } + if (Parser) { + Parser.prototype.parseAggregate = orig_Parser_parseAggregate; + } + } + runtime2.contextOrFrameLookup = function contextOrFrameLookup(context, frame, key) { + var val = orig_contextOrFrameLookup.apply(this, arguments); + if (val !== void 0) { + return val; + } + switch (key) { + case "True": + return true; + case "False": + return false; + case "None": + return null; + default: + return void 0; + } + }; + function getTokensState(tokens) { + return { + index: tokens.index, + lineno: tokens.lineno, + colno: tokens.colno + }; + } + if (process.env.BUILD_TYPE !== "SLIM" && nodes2 && Compiler && Parser) { + var Slice = nodes2.Node.extend("Slice", { + fields: ["start", "stop", "step"], + init: function init(lineno, colno, start, stop, step) { + start = start || new nodes2.Literal(lineno, colno, null); + stop = stop || new nodes2.Literal(lineno, colno, null); + step = step || new nodes2.Literal(lineno, colno, 1); + this.parent(lineno, colno, start, stop, step); + } + }); + Compiler.prototype.assertType = function assertType(node) { + if (node instanceof Slice) { + return; + } + orig_Compiler_assertType.apply(this, arguments); + }; + Compiler.prototype.compileSlice = function compileSlice(node, frame) { + this._emit("("); + this._compileExpression(node.start, frame); + this._emit("),("); + this._compileExpression(node.stop, frame); + this._emit("),("); + this._compileExpression(node.step, frame); + this._emit(")"); + }; + Parser.prototype.parseAggregate = function parseAggregate() { + var _this = this; + var origState = getTokensState(this.tokens); + origState.colno--; + origState.index--; + try { + return orig_Parser_parseAggregate.apply(this); + } catch (e2) { + var errState = getTokensState(this.tokens); + var rethrow = function rethrow2() { + lib2._assign(_this.tokens, errState); + return e2; + }; + lib2._assign(this.tokens, origState); + this.peeked = false; + var tok = this.peekToken(); + if (tok.type !== lexer2.TOKEN_LEFT_BRACKET) { + throw rethrow(); + } else { + this.nextToken(); + } + var node = new Slice(tok.lineno, tok.colno); + var isSlice = false; + for (var i = 0; i <= node.fields.length; i++) { + if (this.skip(lexer2.TOKEN_RIGHT_BRACKET)) { + break; + } + if (i === node.fields.length) { + if (isSlice) { + this.fail("parseSlice: too many slice components", tok.lineno, tok.colno); + } else { + break; + } + } + if (this.skip(lexer2.TOKEN_COLON)) { + isSlice = true; + } else { + var field = node.fields[i]; + node[field] = this.parseExpression(); + isSlice = this.skip(lexer2.TOKEN_COLON) || isSlice; + } + } + if (!isSlice) { + throw rethrow(); + } + return new nodes2.Array(tok.lineno, tok.colno, [node]); + } + }; + } + function sliceLookup(obj, start, stop, step) { + obj = obj || []; + if (start === null) { + start = step < 0 ? obj.length - 1 : 0; + } + if (stop === null) { + stop = step < 0 ? -1 : obj.length; + } else if (stop < 0) { + stop += obj.length; + } + if (start < 0) { + start += obj.length; + } + var results = []; + for (var i = start; ; i += step) { + if (i < 0 || i > obj.length) { + break; + } + if (step > 0 && i >= stop) { + break; + } + if (step < 0 && i <= stop) { + break; + } + results.push(runtime2.memberLookup(obj, i)); + } + return results; + } + function hasOwnProp(obj, key) { + return Object.prototype.hasOwnProperty.call(obj, key); + } + var ARRAY_MEMBERS = { + pop: function pop(index) { + if (index === void 0) { + return this.pop(); + } + if (index >= this.length || index < 0) { + throw new Error("KeyError"); + } + return this.splice(index, 1); + }, + append: function append(element) { + return this.push(element); + }, + remove: function remove(element) { + for (var i = 0; i < this.length; i++) { + if (this[i] === element) { + return this.splice(i, 1); + } + } + throw new Error("ValueError"); + }, + count: function count(element) { + var count2 = 0; + for (var i = 0; i < this.length; i++) { + if (this[i] === element) { + count2++; + } + } + return count2; + }, + index: function index(element) { + var i; + if ((i = this.indexOf(element)) === -1) { + throw new Error("ValueError"); + } + return i; + }, + find: function find(element) { + return this.indexOf(element); + }, + insert: function insert(index, elem) { + return this.splice(index, 0, elem); + } + }; + var OBJECT_MEMBERS = { + items: function items() { + return lib2._entries(this); + }, + values: function values() { + return lib2._values(this); + }, + keys: function keys() { + return lib2.keys(this); + }, + get: function get(key, def) { + var output = this[key]; + if (output === void 0) { + output = def; + } + return output; + }, + has_key: function has_key(key) { + return hasOwnProp(this, key); + }, + pop: function pop(key, def) { + var output = this[key]; + if (output === void 0 && def !== void 0) { + output = def; + } else if (output === void 0) { + throw new Error("KeyError"); + } else { + delete this[key]; + } + return output; + }, + popitem: function popitem() { + var keys = lib2.keys(this); + if (!keys.length) { + throw new Error("KeyError"); + } + var k = keys[0]; + var val = this[k]; + delete this[k]; + return [k, val]; + }, + setdefault: function setdefault(key, def) { + if (def === void 0) { + def = null; + } + if (!(key in this)) { + this[key] = def; + } + return this[key]; + }, + update: function update(kwargs) { + lib2._assign(this, kwargs); + return null; + } + }; + OBJECT_MEMBERS.iteritems = OBJECT_MEMBERS.items; + OBJECT_MEMBERS.itervalues = OBJECT_MEMBERS.values; + OBJECT_MEMBERS.iterkeys = OBJECT_MEMBERS.keys; + runtime2.memberLookup = function memberLookup(obj, val, autoescape) { + if (arguments.length === 4) { + return sliceLookup.apply(this, arguments); + } + obj = obj || {}; + if (lib2.isArray(obj) && hasOwnProp(ARRAY_MEMBERS, val)) { + return ARRAY_MEMBERS[val].bind(obj); + } + if (lib2.isObject(obj) && hasOwnProp(OBJECT_MEMBERS, val)) { + return OBJECT_MEMBERS[val].bind(obj); + } + return orig_memberLookup.apply(this, arguments); + }; + return uninstall; + } + module2.exports = installCompat; +}); + +// ../../node_modules/nunjucks/index.js +"use strict"; +var lib = require_lib(); +var _require = require_environment(); +var Environment = _require.Environment; +var Template = _require.Template; +var Loader = require_loader(); +var loaders = require_loaders(); +var precompile = require_precompile(); +var compiler = require_compiler(); +var parser = require_parser(); +var lexer = require_lexer(); +var runtime = require_runtime(); +var nodes = require_nodes(); +var installJinjaCompat = require_jinja_compat(); +var e; +function configure(templatesPath, opts) { + opts = opts || {}; + if (lib.isObject(templatesPath)) { + opts = templatesPath; + templatesPath = null; + } + var TemplateLoader; + if (loaders.FileSystemLoader) { + TemplateLoader = new loaders.FileSystemLoader(templatesPath, { + watch: opts.watch, + noCache: opts.noCache + }); + } else if (loaders.WebLoader) { + TemplateLoader = new loaders.WebLoader(templatesPath, { + useCache: opts.web && opts.web.useCache, + async: opts.web && opts.web.async + }); + } + e = new Environment(TemplateLoader, opts); + if (opts && opts.express) { + e.express(opts.express); + } + return e; +} +module.exports = { + Environment, + Template, + Loader, + FileSystemLoader: loaders.FileSystemLoader, + NodeResolveLoader: loaders.NodeResolveLoader, + PrecompiledLoader: loaders.PrecompiledLoader, + WebLoader: loaders.WebLoader, + compiler, + parser, + lexer, + runtime, + lib, + nodes, + installJinjaCompat, + configure, + reset: function reset() { + e = void 0; + }, + compile: function compile(src, env, path, eagerCompile) { + if (!e) { + configure(); + } + return new Template(src, env, path, eagerCompile); + }, + render: function render(name, ctx, cb) { + if (!e) { + configure(); + } + return e.render(name, ctx, cb); + }, + renderString: function renderString(src, ctx, cb) { + if (!e) { + configure(); + } + return e.renderString(src, ctx, cb); + }, + precompile: precompile ? precompile.precompile : void 0, + precompileString: precompile ? precompile.precompileString : void 0 +}; From 21b54689c6d54d1f560ef76ff499780782c00cec Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 19 Nov 2021 17:50:25 +0100 Subject: [PATCH 076/131] scaffolder-backend: add initial SecureTemplater implementation Co-authored-by: Johan Haals Signed-off-by: Patrik Oldsberg --- plugins/scaffolder-backend/package.json | 3 +- .../src/lib/templating/SecureTemplater.ts | 71 +++++++++++++++++++ yarn.lock | 5 ++ 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index 7b7407e410..d4582cfa25 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -69,7 +69,8 @@ "octokit-plugin-create-pull-request": "^3.10.0", "uuid": "^8.2.0", "winston": "^3.2.1", - "yaml": "^1.10.0" + "yaml": "^1.10.0", + "vm2": "^3.9.5" }, "devDependencies": { "@backstage/cli": "^0.9.0", diff --git a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts new file mode 100644 index 0000000000..c6fa98de4e --- /dev/null +++ b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts @@ -0,0 +1,71 @@ +/* + * Copyright 2021 The Backstage Authors + * + * 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 + * + * http://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 { VM } from 'vm2'; +import { resolvePackagePath } from '@backstage/backend-common'; +import fs from 'fs-extra'; + +const mkScript = (nunjucksSource: string) => ` +const render = (() => { + const module = {}; + const require = (pkg) => { if (pkg === 'events') { return function (){}; }}; + + ${nunjucksSource} + + const env = module.exports.configure({ + autoescape: false, + tags: { + variableStart: '\${{', + variableEnd: '}}', + }, + }); + + return function render(str, values) { + return env.renderString(str, JSON.parse(values)); + } +})(); +`; + +export class SecureTemplater { + #vm?: VM; + + async render(template: string, values: unknown) { + const vm = await this.getVm(); + vm.setGlobal('templateStr', template); + vm.setGlobal('templateValues', JSON.stringify(values)); + const result = vm.run(`render(templateStr, templateValues)`); + return result; + } + + private async getVm() { + if (!this.#vm) { + this.#vm = new VM({ + timeout: 1000, + }); + + const nunjucksSource = await fs.readFile( + resolvePackagePath( + '@backstage/plugin-scaffolder-backend', + 'assets/nunjucks.js.txt', + ), + 'utf-8', + ); + + this.#vm.run(mkScript(nunjucksSource)); + } + return this.#vm; + } +} diff --git a/yarn.lock b/yarn.lock index e20a75a023..b41442f8bc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -28707,6 +28707,11 @@ vm-browserify@^1.0.1: resolved "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0" integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ== +vm2@^3.9.5: + version "3.9.5" + resolved "https://registry.npmjs.org/vm2/-/vm2-3.9.5.tgz#5288044860b4bbace443101fcd3bddb2a0aa2496" + integrity sha512-LuCAHZN75H9tdrAiLFf030oW7nJV5xwNMuk1ymOZwopmuK3d2H4L1Kv4+GFHgarKiLfXXLFU+7LDABHnwOkWng== + vscode-languageserver-types@^3.15.1: version "3.15.1" resolved "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.15.1.tgz#17be71d78d2f6236d414f0001ce1ef4d23e6b6de" From 0bb4be63d6db9f132fb23ec47a2ac1b804e782ba Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 19 Nov 2021 18:06:40 +0100 Subject: [PATCH 077/131] scaffolder-backend: added some basic tests for SecureTemplater Signed-off-by: Patrik Oldsberg --- .../lib/templating/SecureTemplater.test.ts | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts diff --git a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts new file mode 100644 index 0000000000..320550251e --- /dev/null +++ b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts @@ -0,0 +1,44 @@ +/* + * Copyright 2021 The Backstage Authors + * + * 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 + * + * http://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 { SecureTemplater } from './SecureTemplater'; + +describe('SecureTemplater', () => { + it('should render some templates', async () => { + const templater = new SecureTemplater(); + await expect( + templater.render('${{ test }}', { test: 'my-value' }), + ).resolves.toBe('my-value'); + + await expect( + templater.render('${{ test | dump }}', { test: 'my-value' }), + ).resolves.toBe('"my-value"'); + + await expect( + templater.render('${{ test | replace("my-", "our-") }}', { + test: 'my-value', + }), + ).resolves.toBe('our-value'); + + await expect( + templater.render('${{ invalid...syntax }}', { + test: 'my-value', + }), + ).rejects.toThrow( + '(unknown path) [Line 1, Column 13]\n expected name as lookup value, got .', + ); + }); +}); From 6facaab24c6d5ecde37a8a3192d0a41bb8dd0895 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 19 Nov 2021 18:23:04 +0100 Subject: [PATCH 078/131] scaffolder-backend: jsonify + repoUrl helpers for SecureTemplater + error wrapping Signed-off-by: Patrik Oldsberg --- .../lib/templating/SecureTemplater.test.ts | 54 +++++++++++++++++++ .../src/lib/templating/SecureTemplater.ts | 51 ++++++++++++++++-- 2 files changed, 101 insertions(+), 4 deletions(-) diff --git a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts index 320550251e..8052522e6c 100644 --- a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts +++ b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts @@ -41,4 +41,58 @@ describe('SecureTemplater', () => { '(unknown path) [Line 1, Column 13]\n expected name as lookup value, got .', ); }); + + it('should make jsonify available when requested', async () => { + const templaterWith = new SecureTemplater({ jsonify: true }); + const templaterWithout = new SecureTemplater(); + + await expect(templaterWith.render('${{ 1 | jsonify }}', {})).resolves.toBe( + '1', + ); + await expect( + templaterWithout.render('${{ 1 | jsonify }}', {}), + ).rejects.toThrow('(unknown path)\n Error: filter not found: jsonify'); + }); + + it('should make parseRepoUrl available when requested', async () => { + const parseRepoUrl = jest.fn(() => ({ + repo: 'my-repo', + owner: 'my-owner', + host: 'my-host.com', + })); + const templaterWith = new SecureTemplater({ + parseRepoUrl, + }); + const templaterWithout = new SecureTemplater(); + + const ctx = { + repoUrl: 'https://my-host.com/my-owner/my-repo', + }; + + await expect( + templaterWith.render('${{ repoUrl | parseRepoUrl | dump }}', ctx), + ).resolves.toBe( + JSON.stringify({ + repo: 'my-repo', + owner: 'my-owner', + host: 'my-host.com', + }), + ); + await expect( + templaterWith.render('${{ repoUrl | projectSlug }}', ctx), + ).resolves.toBe('my-owner/my-repo'); + await expect( + templaterWithout.render('${{ repoUrl | parseRepoUrl | dump }}', ctx), + ).rejects.toThrow( + '(unknown path)\n Error: filter not found: parseRepoUrl', + ); + await expect( + templaterWithout.render('${{ repoUrl | projectSlug }}', ctx), + ).rejects.toThrow('(unknown path)\n Error: filter not found: projectSlug'); + + expect(parseRepoUrl.mock.calls).toEqual([ + ['https://my-host.com/my-owner/my-repo'], + ['https://my-host.com/my-owner/my-repo'], + ]); + }); }); diff --git a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts index c6fa98de4e..4b4a7f6f75 100644 --- a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts +++ b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts @@ -17,6 +17,7 @@ import { VM } from 'vm2'; import { resolvePackagePath } from '@backstage/backend-common'; import fs from 'fs-extra'; +import { RepoSpec } from '../../scaffolder/actions/builtin/publish/util'; const mkScript = (nunjucksSource: string) => ` const render = (() => { @@ -33,15 +34,47 @@ const render = (() => { }, }); + if (typeof jsonify !== 'undefined' && jsonify) { + env.addFilter('jsonify', env.getFilter('dump')); + } + + if (typeof parseRepoUrl !== 'undefined') { + env.addFilter('parseRepoUrl', repoUrl => { + return JSON.parse(parseRepoUrl(repoUrl)) + }); + env.addFilter('projectSlug', repoUrl => { + const { owner, repo } = JSON.parse(parseRepoUrl(repoUrl)); + return owner + '/' + repo; + }); + } + return function render(str, values) { - return env.renderString(str, JSON.parse(values)); + try { + return env.renderString(str, JSON.parse(values)); + } catch (error) { + // Make sure errors don't leak anything + throw new Error(String(error.message)); + } } })(); `; +export interface SecureTemplaterOptions { + jsonify?: true; + parseRepoUrl?(repoUrl: string): RepoSpec; +} + export class SecureTemplater { #vm?: VM; + #jsonify?: true; + #parseRepoUrl?: (repoUrl: string) => RepoSpec; + + constructor(options?: SecureTemplaterOptions) { + this.#jsonify = options?.jsonify; + this.#parseRepoUrl = options?.parseRepoUrl; + } + async render(template: string, values: unknown) { const vm = await this.getVm(); vm.setGlobal('templateStr', template); @@ -52,9 +85,19 @@ export class SecureTemplater { private async getVm() { if (!this.#vm) { - this.#vm = new VM({ - timeout: 1000, - }); + let sandbox = undefined; + if (this.#jsonify) { + sandbox = { jsonify: true }; + } + if (this.#parseRepoUrl) { + const parseRepoUrl = this.#parseRepoUrl; + sandbox = { + ...sandbox, + parseRepoUrl: (url: string) => JSON.stringify(parseRepoUrl(url)), + }; + } + + this.#vm = new VM({ timeout: 1000, sandbox }); const nunjucksSource = await fs.readFile( resolvePackagePath( From 0e016783b6b55198eabec706d1864147f882db83 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 19 Nov 2021 18:30:46 +0100 Subject: [PATCH 079/131] scaffolder-backend: make SecureTemplater render sync Signed-off-by: Patrik Oldsberg --- .../lib/templating/SecureTemplater.test.ts | 57 +++++++++---------- .../src/lib/templating/SecureTemplater.ts | 14 +++-- 2 files changed, 36 insertions(+), 35 deletions(-) diff --git a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts index 8052522e6c..6d7fe9798d 100644 --- a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts +++ b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts @@ -19,39 +19,40 @@ import { SecureTemplater } from './SecureTemplater'; describe('SecureTemplater', () => { it('should render some templates', async () => { const templater = new SecureTemplater(); - await expect( - templater.render('${{ test }}', { test: 'my-value' }), - ).resolves.toBe('my-value'); + await templater.initializeIfNeeded(); + expect(templater.render('${{ test }}', { test: 'my-value' })).toBe( + 'my-value', + ); - await expect( - templater.render('${{ test | dump }}', { test: 'my-value' }), - ).resolves.toBe('"my-value"'); + expect(templater.render('${{ test | dump }}', { test: 'my-value' })).toBe( + '"my-value"', + ); - await expect( + expect( templater.render('${{ test | replace("my-", "our-") }}', { test: 'my-value', }), - ).resolves.toBe('our-value'); + ).toBe('our-value'); - await expect( + expect(() => templater.render('${{ invalid...syntax }}', { test: 'my-value', }), - ).rejects.toThrow( + ).toThrow( '(unknown path) [Line 1, Column 13]\n expected name as lookup value, got .', ); }); it('should make jsonify available when requested', async () => { const templaterWith = new SecureTemplater({ jsonify: true }); + await templaterWith.initializeIfNeeded(); const templaterWithout = new SecureTemplater(); + await templaterWithout.initializeIfNeeded(); - await expect(templaterWith.render('${{ 1 | jsonify }}', {})).resolves.toBe( - '1', + expect(templaterWith.render('${{ 1 | jsonify }}', {})).toBe('1'); + expect(() => templaterWithout.render('${{ 1 | jsonify }}', {})).toThrow( + '(unknown path)\n Error: filter not found: jsonify', ); - await expect( - templaterWithout.render('${{ 1 | jsonify }}', {}), - ).rejects.toThrow('(unknown path)\n Error: filter not found: jsonify'); }); it('should make parseRepoUrl available when requested', async () => { @@ -60,35 +61,33 @@ describe('SecureTemplater', () => { owner: 'my-owner', host: 'my-host.com', })); - const templaterWith = new SecureTemplater({ - parseRepoUrl, - }); + const templaterWith = new SecureTemplater({ parseRepoUrl }); + await templaterWith.initializeIfNeeded(); const templaterWithout = new SecureTemplater(); + await templaterWithout.initializeIfNeeded(); const ctx = { repoUrl: 'https://my-host.com/my-owner/my-repo', }; - await expect( + expect( templaterWith.render('${{ repoUrl | parseRepoUrl | dump }}', ctx), - ).resolves.toBe( + ).toBe( JSON.stringify({ repo: 'my-repo', owner: 'my-owner', host: 'my-host.com', }), ); - await expect( - templaterWith.render('${{ repoUrl | projectSlug }}', ctx), - ).resolves.toBe('my-owner/my-repo'); - await expect( - templaterWithout.render('${{ repoUrl | parseRepoUrl | dump }}', ctx), - ).rejects.toThrow( - '(unknown path)\n Error: filter not found: parseRepoUrl', + expect(templaterWith.render('${{ repoUrl | projectSlug }}', ctx)).toBe( + 'my-owner/my-repo', ); - await expect( + expect(() => + templaterWithout.render('${{ repoUrl | parseRepoUrl | dump }}', ctx), + ).toThrow('(unknown path)\n Error: filter not found: parseRepoUrl'); + expect(() => templaterWithout.render('${{ repoUrl | projectSlug }}', ctx), - ).rejects.toThrow('(unknown path)\n Error: filter not found: projectSlug'); + ).toThrow('(unknown path)\n Error: filter not found: projectSlug'); expect(parseRepoUrl.mock.calls).toEqual([ ['https://my-host.com/my-owner/my-repo'], diff --git a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts index 4b4a7f6f75..53c7cd2f61 100644 --- a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts +++ b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts @@ -75,15 +75,17 @@ export class SecureTemplater { this.#parseRepoUrl = options?.parseRepoUrl; } - async render(template: string, values: unknown) { - const vm = await this.getVm(); - vm.setGlobal('templateStr', template); - vm.setGlobal('templateValues', JSON.stringify(values)); - const result = vm.run(`render(templateStr, templateValues)`); + render(template: string, values: unknown): string { + if (!this.#vm) { + throw new Error('SecureTemplater has not been initialized'); + } + this.#vm.setGlobal('templateStr', template); + this.#vm.setGlobal('templateValues', JSON.stringify(values)); + const result = this.#vm.run(`render(templateStr, templateValues)`); return result; } - private async getVm() { + async initializeIfNeeded() { if (!this.#vm) { let sandbox = undefined; if (this.#jsonify) { From 7b5430fc82f921b4e5cec5895ae3c0d284ce2357 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 19 Nov 2021 18:32:49 +0100 Subject: [PATCH 080/131] scaffolder-backend: switch nunjucks runner to use secure templater Signed-off-by: Patrik Oldsberg --- .../tasks/NunjucksWorkflowRunner.ts | 54 +++++++++---------- 1 file changed, 26 insertions(+), 28 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index 5b42eef459..5ed55d9630 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -13,6 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { ScmIntegrations } from '@backstage/integration'; import { TaskContext, @@ -23,7 +24,6 @@ import { WorkflowRunner, } from './types'; import * as winston from 'winston'; -import nunjucks from 'nunjucks'; import fs from 'fs-extra'; import path from 'path'; import { JsonObject, JsonValue } from '@backstage/types'; @@ -33,6 +33,7 @@ import { isTruthy } from './helper'; import { validate as validateJsonSchema } from 'jsonschema'; import { parseRepoUrl } from '../actions/builtin/publish/util'; import { TemplateActionRegistry } from '../actions'; +import { SecureTemplater } from '../../lib/templating/SecureTemplater'; type NunjucksWorkflowRunnerOptions = { workingDirectory: string; @@ -84,36 +85,35 @@ const createStepLogger = ({ }; export class NunjucksWorkflowRunner implements WorkflowRunner { - private readonly nunjucks: nunjucks.Environment; - - private readonly nunjucksOptions: nunjucks.ConfigureOptions = { - autoescape: false, - tags: { - variableStart: '${{', - variableEnd: '}}', - }, - }; + private readonly templater: SecureTemplater; constructor(private readonly options: NunjucksWorkflowRunnerOptions) { - this.nunjucks = nunjucks.configure(this.nunjucksOptions); + const { integrations } = options; - // TODO(blam): let's work out how we can deprecate these. - // We shouldn't really need to be exposing these now we can deal with - // objects in the params block. - // Maybe we can expose a new RepoUrlPicker with secrets for V3 that provides an object already. - this.nunjucks.addFilter('parseRepoUrl', repoUrl => { - return parseRepoUrl(repoUrl, this.options.integrations); - }); - - this.nunjucks.addFilter('projectSlug', repoUrl => { - const { owner, repo } = parseRepoUrl(repoUrl, this.options.integrations); - return `${owner}/${repo}`; + this.templater = new SecureTemplater({ + // TODO(blam): let's work out how we can deprecate this. + // We shouldn't really need to be exposing these now we can deal with + // objects in the params block. + // Maybe we can expose a new RepoUrlPicker with secrets for V3 that provides an object already. + parseRepoUrl(url: string) { + return parseRepoUrl(url, integrations); + }, }); } private isSingleTemplateString(input: string) { const { parser, nodes } = require('nunjucks'); - const parsed = parser.parse(input, {}, this.nunjucksOptions); + const parsed = parser.parse( + input, + {}, + { + autoescape: false, + tags: { + variableStart: '${{', + variableEnd: '}}', + }, + }, + ); return ( parsed.children.length === 1 && @@ -134,10 +134,7 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { ); // Run the templating - const templated = this.nunjucks.renderString( - wrappedDumped, - context, - ); + const templated = this.templater.render(wrappedDumped, context); // If there's an empty string returned, then it's undefined if (templated === '') { @@ -154,7 +151,7 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { } // Fallback to default behaviour - const templated = this.nunjucks.renderString(value, context); + const templated = this.templater.render(value, context); if (templated === '') { return undefined; @@ -184,6 +181,7 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { await task.emitLog( `Starting up task with ${task.spec.steps.length} steps`, ); + await this.templater.initializeIfNeeded(); const context: TemplateContext = { parameters: task.spec.parameters, From 07daffed47d49ea290bee3bfd8f2d70af76865fd Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 19 Nov 2021 18:53:34 +0100 Subject: [PATCH 081/131] scaffolder-backend: switch jsonify flag for cookiecutter compat render option Signed-off-by: Patrik Oldsberg --- .../lib/templating/SecureTemplater.test.ts | 33 ++++++++--- .../src/lib/templating/SecureTemplater.ts | 58 ++++++++++++++----- 2 files changed, 68 insertions(+), 23 deletions(-) diff --git a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts index 6d7fe9798d..b149d2cfe3 100644 --- a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts +++ b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts @@ -43,16 +43,35 @@ describe('SecureTemplater', () => { ); }); - it('should make jsonify available when requested', async () => { - const templaterWith = new SecureTemplater({ jsonify: true }); - await templaterWith.initializeIfNeeded(); - const templaterWithout = new SecureTemplater(); - await templaterWithout.initializeIfNeeded(); + it('should make cookiecutter compatibility available when requested', async () => { + const templater = new SecureTemplater(); + await templater.initializeIfNeeded(); - expect(templaterWith.render('${{ 1 | jsonify }}', {})).toBe('1'); - expect(() => templaterWithout.render('${{ 1 | jsonify }}', {})).toThrow( + // Same two tests repeated to make sure switching back and forth works + expect( + templater.render('${{ 1 | jsonify }}', {}, { cookiecutterCompat: true }), + ).toBe('1'); + expect( + templater.render('${{ 1 | jsonify }}', {}, { cookiecutterCompat: true }), + ).toBe('1'); + expect(() => templater.render('${{ 1 | jsonify }}', {})).toThrow( '(unknown path)\n Error: filter not found: jsonify', ); + expect( + templater.render('${{ 1 | jsonify }}', {}, { cookiecutterCompat: true }), + ).toBe('1'); + expect(() => templater.render('${{ 1 | jsonify }}', {})).toThrow( + '(unknown path)\n Error: filter not found: jsonify', + ); + expect(() => templater.render('${{ 1 | jsonify }}', {})).toThrow( + '(unknown path)\n Error: filter not found: jsonify', + ); + expect(() => templater.render('${{ 1 | jsonify }}', {})).toThrow( + '(unknown path)\n Error: filter not found: jsonify', + ); + expect( + templater.render('${{ 1 | jsonify }}', {}, { cookiecutterCompat: true }), + ).toBe('1'); }); it('should make parseRepoUrl available when requested', async () => { diff --git a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts index 53c7cd2f61..2f22b3439e 100644 --- a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts +++ b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts @@ -20,8 +20,9 @@ import fs from 'fs-extra'; import { RepoSpec } from '../../scaffolder/actions/builtin/publish/util'; const mkScript = (nunjucksSource: string) => ` -const render = (() => { +const { render, renderCompat } = (() => { const module = {}; + const process = { env: {} }; const require = (pkg) => { if (pkg === 'events') { return function (){}; }}; ${nunjucksSource} @@ -34,10 +35,6 @@ const render = (() => { }, }); - if (typeof jsonify !== 'undefined' && jsonify) { - env.addFilter('jsonify', env.getFilter('dump')); - } - if (typeof parseRepoUrl !== 'undefined') { env.addFilter('parseRepoUrl', repoUrl => { return JSON.parse(parseRepoUrl(repoUrl)) @@ -48,53 +45,82 @@ const render = (() => { }); } - return function render(str, values) { + let uninstallCompat = undefined; + + function render(str, values) { try { + if (uninstallCompat) { + uninstallCompat(); + uninstallCompat = undefined; + delete env.filters.jsonify; + } return env.renderString(str, JSON.parse(values)); } catch (error) { // Make sure errors don't leak anything throw new Error(String(error.message)); } } + + function renderCompat(str, values) { + try { + if (!uninstallCompat) { + uninstallCompat = module.exports.installJinjaCompat(); + env.filters.jsonify = env.filters.dump; + } + return env.renderString(str, JSON.parse(values)); + } catch (error) { + // Make sure errors don't leak anything + throw new Error(String(error.message)); + } + } + + return { render, renderCompat }; })(); `; +export interface SecureTemplaterRenderOptions { + /* Enables jinja compatibility and the "jsonify" filter */ + cookiecutterCompat?: boolean; +} + export interface SecureTemplaterOptions { - jsonify?: true; parseRepoUrl?(repoUrl: string): RepoSpec; } export class SecureTemplater { #vm?: VM; - #jsonify?: true; #parseRepoUrl?: (repoUrl: string) => RepoSpec; constructor(options?: SecureTemplaterOptions) { - this.#jsonify = options?.jsonify; this.#parseRepoUrl = options?.parseRepoUrl; } - render(template: string, values: unknown): string { + render( + template: string, + values: unknown, + options?: SecureTemplaterRenderOptions, + ): string { if (!this.#vm) { throw new Error('SecureTemplater has not been initialized'); } this.#vm.setGlobal('templateStr', template); this.#vm.setGlobal('templateValues', JSON.stringify(values)); - const result = this.#vm.run(`render(templateStr, templateValues)`); - return result; + + if (options?.cookiecutterCompat) { + return this.#vm.run(`renderCompat(templateStr, templateValues)`); + } + + return this.#vm.run(`render(templateStr, templateValues)`); } async initializeIfNeeded() { if (!this.#vm) { let sandbox = undefined; - if (this.#jsonify) { - sandbox = { jsonify: true }; - } + if (this.#parseRepoUrl) { const parseRepoUrl = this.#parseRepoUrl; sandbox = { - ...sandbox, parseRepoUrl: (url: string) => JSON.stringify(parseRepoUrl(url)), }; } From 7e8d5d953d77b06a63088bbd82cd7d3b6cf25098 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 19 Nov 2021 18:54:33 +0100 Subject: [PATCH 082/131] scaffolder-backend: switch template action to use SecureTemplater Signed-off-by: Patrik Oldsberg --- .../actions/builtin/fetch/template.ts | 57 ++++--------------- 1 file changed, 11 insertions(+), 46 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts index 47bfcccfdf..9e1a3f29db 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts @@ -21,22 +21,9 @@ import { ScmIntegrations } from '@backstage/integration'; import { fetchContents } from './helpers'; import { createTemplateAction } from '../../createTemplateAction'; import globby from 'globby'; -import nunjucks from 'nunjucks'; import fs from 'fs-extra'; import { isBinaryFile } from 'isbinaryfile'; - -/* - * Maximise compatibility with Jinja (and therefore cookiecutter) - * using nunjucks jinja compat mode. Since this method mutates - * the global nunjucks instance, we can't enable this per-template, - * or only for templates with cookiecutter compat enabled, so the - * next best option is to explicitly enable it globally and allow - * folks to rely on jinja compatibility behaviour in fetch:template - * templates if they wish. - * - * cf. https://mozilla.github.io/nunjucks/api.html#installjinjacompat - */ -nunjucks.installJinjaCompat(); +import { SecureTemplater } from '../../../../lib/templating/SecureTemplater'; type CookieCompatInput = { copyWithoutRender?: string[]; @@ -60,6 +47,8 @@ export function createFetchTemplateAction(options: { }) { const { reader, integrations } = options; + const templater = new SecureTemplater(); + return createTemplateAction({ id: 'fetch:template', description: @@ -113,6 +102,8 @@ export function createFetchTemplateAction(options: { async handler(ctx) { ctx.logger.info('Fetching template content from remote URL'); + await templater.initializeIfNeeded(); + const workDir = await ctx.createTemporaryDirectory(); const templateDir = resolvePath(workDir, 'template'); @@ -179,36 +170,6 @@ export function createFetchTemplateAction(options: { ).flat(), ); - // Create a templater - const templater = nunjucks.configure({ - ...(ctx.input.cookiecutterCompat - ? {} - : { - tags: { - // TODO(mtlewis/orkohunter): Document Why we are changing the literals? Not here, but on scaffolder docs. ADR? - variableStart: '${{', - variableEnd: '}}', - }, - }), - // We don't want this builtin auto-escaping, since uses HTML escape sequences - // like `"` - the correct way to escape strings in our case depends on - // the file type. - autoescape: false, - }); - - if (ctx.input.cookiecutterCompat) { - // The "jsonify" filter built into cookiecutter is common - // in fetch:cookiecutter templates, so when compat mode - // is enabled we alias the "dump" filter from nunjucks as - // jsonify. Dump accepts an optional `spaces` parameter - // which enables indented output, but when this parameter - // is not supplied it works identically to jsonify. - // - // cf. https://cookiecutter.readthedocs.io/en/latest/advanced/template_extensions.html?highlight=jsonify#jsonify-extension - // cf. https://mozilla.github.io/nunjucks/templating.html#dump - templater.addFilter('jsonify', templater.getFilter('dump')); - } - // Cookiecutter prefixes all parameters in templates with // `cookiecutter.`. To replicate this, we wrap our parameters // in an object with a `cookiecutter` property when compat @@ -238,7 +199,9 @@ export function createFetchTemplateAction(options: { renderFilename = renderContents = !nonTemplatedEntries.has(location); } if (renderFilename) { - localOutputPath = templater.renderString(localOutputPath, context); + localOutputPath = templater.render(localOutputPath, context, { + cookiecutterCompat: ctx.input.cookiecutterCompat, + }); } const outputPath = resolvePath(outputDir, localOutputPath); // variables have been expanded to make an empty file name @@ -275,7 +238,9 @@ export function createFetchTemplateAction(options: { await fs.outputFile( outputPath, renderContents - ? templater.renderString(inputFileContents, context) + ? templater.render(inputFileContents, context, { + cookiecutterCompat: ctx.input.cookiecutterCompat, + }) : inputFileContents, { mode: statsObj.mode }, ); From a096e4c4d78bab2d392af5b768eb4f87b9f4401c Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Fri, 19 Nov 2021 19:03:30 +0100 Subject: [PATCH 083/131] changesets: add changeset for secure templating Signed-off-by: Patrik Oldsberg --- .changeset/light-rabbits-matter.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/light-rabbits-matter.md diff --git a/.changeset/light-rabbits-matter.md b/.changeset/light-rabbits-matter.md new file mode 100644 index 0000000000..a528e4d1c5 --- /dev/null +++ b/.changeset/light-rabbits-matter.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +--- + +Switched to executing scaffolder templating in a secure context for any template based on nunjucks, as it is not secure by default (https://mozilla.github.io/nunjucks/api.html#user-defined-templates-warning). From 621e1a11be24b66d366b3533094563cee9c62f9f Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 24 Nov 2021 01:53:25 +0100 Subject: [PATCH 084/131] scaffolder-backend: fix SecureTemplater cookiecutter compat using wrong syntax Signed-off-by: Patrik Oldsberg --- .../src/lib/templating/SecureTemplater.test.ts | 8 ++++---- .../src/lib/templating/SecureTemplater.ts | 13 ++++++++++--- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts index b149d2cfe3..899f57e295 100644 --- a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts +++ b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts @@ -49,16 +49,16 @@ describe('SecureTemplater', () => { // Same two tests repeated to make sure switching back and forth works expect( - templater.render('${{ 1 | jsonify }}', {}, { cookiecutterCompat: true }), + templater.render('{{ 1 | jsonify }}', {}, { cookiecutterCompat: true }), ).toBe('1'); expect( - templater.render('${{ 1 | jsonify }}', {}, { cookiecutterCompat: true }), + templater.render('{{ 1 | jsonify }}', {}, { cookiecutterCompat: true }), ).toBe('1'); expect(() => templater.render('${{ 1 | jsonify }}', {})).toThrow( '(unknown path)\n Error: filter not found: jsonify', ); expect( - templater.render('${{ 1 | jsonify }}', {}, { cookiecutterCompat: true }), + templater.render('{{ 1 | jsonify }}', {}, { cookiecutterCompat: true }), ).toBe('1'); expect(() => templater.render('${{ 1 | jsonify }}', {})).toThrow( '(unknown path)\n Error: filter not found: jsonify', @@ -70,7 +70,7 @@ describe('SecureTemplater', () => { '(unknown path)\n Error: filter not found: jsonify', ); expect( - templater.render('${{ 1 | jsonify }}', {}, { cookiecutterCompat: true }), + templater.render('{{ 1 | jsonify }}', {}, { cookiecutterCompat: true }), ).toBe('1'); }); diff --git a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts index 2f22b3439e..c4f14cfe3f 100644 --- a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts +++ b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts @@ -35,6 +35,15 @@ const { render, renderCompat } = (() => { }, }); + const compatEnv = module.exports.configure({ + autoescape: false, + tags: { + variableStart: '{{', + variableEnd: '}}', + }, + }); + compatEnv.addFilter('jsonify', compatEnv.getFilter('dump')); + if (typeof parseRepoUrl !== 'undefined') { env.addFilter('parseRepoUrl', repoUrl => { return JSON.parse(parseRepoUrl(repoUrl)) @@ -52,7 +61,6 @@ const { render, renderCompat } = (() => { if (uninstallCompat) { uninstallCompat(); uninstallCompat = undefined; - delete env.filters.jsonify; } return env.renderString(str, JSON.parse(values)); } catch (error) { @@ -65,9 +73,8 @@ const { render, renderCompat } = (() => { try { if (!uninstallCompat) { uninstallCompat = module.exports.installJinjaCompat(); - env.filters.jsonify = env.filters.dump; } - return env.renderString(str, JSON.parse(values)); + return compatEnv.renderString(str, JSON.parse(values)); } catch (error) { // Make sure errors don't leak anything throw new Error(String(error.message)); From dd62ca4bcd132031fa05cff38e6842ed10b9999e Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 24 Nov 2021 18:53:35 +0100 Subject: [PATCH 085/131] scaffolder-backend: fixes for mock-fs interfering with nunjucks loading Signed-off-by: Patrik Oldsberg --- .../actions/builtin/fetch/template.test.ts | 20 ++++++++++++++++++- .../tasks/NunjucksWorkflowRunner.test.ts | 14 ++++++++++++- .../tasks/NunjucksWorkflowRunner.ts | 13 +++++++++++- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts index 755b435149..cf1662307c 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.test.ts @@ -33,6 +33,17 @@ jest.mock('./helpers', () => ({ fetchContents: jest.fn(), })); +const realFiles = Object.fromEntries( + [ + require.resolve('vm2/lib/fixasync'), + resolvePackagePath( + '@backstage/plugin-scaffolder-backend', + 'assets', + 'nunjucks.js.txt', + ), + ].map(k => [k, mockFs.load(k)]), +); + const aBinaryFile = fs.readFileSync( resolvePackagePath( '@backstage/plugin-scaffolder-backend', @@ -76,7 +87,9 @@ describe('fetch:template', () => { }); beforeEach(() => { - mockFs(); + mockFs({ + ...realFiles, + }); action = createFetchTemplateAction({ reader: Symbol('UrlReader') as unknown as UrlReader, @@ -150,6 +163,7 @@ describe('fetch:template', () => { mockFetchContents.mockImplementation(({ outputPath }) => { mockFs({ + ...realFiles, [outputPath]: { 'an-executable.sh': mockFs.file({ content: '#!/usr/bin/env bash', @@ -259,6 +273,7 @@ describe('fetch:template', () => { mockFetchContents.mockImplementation(({ outputPath }) => { mockFs({ + ...realFiles, [outputPath]: { processed: { 'templated-content-${{ values.name }}.txt': @@ -312,6 +327,7 @@ describe('fetch:template', () => { mockFetchContents.mockImplementation(({ outputPath }) => { mockFs({ + ...realFiles, [outputPath]: { '{{ cookiecutter.name }}.txt': 'static content', subdir: { @@ -366,6 +382,7 @@ describe('fetch:template', () => { mockFetchContents.mockImplementation(({ outputPath }) => { mockFs({ + ...realFiles, [outputPath]: { 'empty-dir-${{ values.count }}': {}, 'static.txt': 'static content', @@ -447,6 +464,7 @@ describe('fetch:template', () => { mockFetchContents.mockImplementation(({ outputPath }) => { mockFs({ + ...realFiles, [outputPath]: { '${{ values.name }}.njk': '${{ values.name }}: ${{ values.count }}', '${{ values.name }}.txt.jinja2': diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts index b2e2e85a6c..b933990953 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.test.ts @@ -17,13 +17,24 @@ import mockFs from 'mock-fs'; import * as winston from 'winston'; -import { getVoidLogger } from '@backstage/backend-common'; +import { getVoidLogger, resolvePackagePath } from '@backstage/backend-common'; import { NunjucksWorkflowRunner } from './NunjucksWorkflowRunner'; import { TemplateActionRegistry } from '../actions'; import { ScmIntegrations } from '@backstage/integration'; import { ConfigReader } from '@backstage/config'; import { TaskContext, TaskSpec } from './types'; +const realFiles = Object.fromEntries( + [ + require.resolve('vm2/lib/fixasync'), + resolvePackagePath( + '@backstage/plugin-scaffolder-backend', + 'assets', + 'nunjucks.js.txt', + ), + ].map(k => [k, mockFs.load(k)]), +); + describe('DefaultWorkflowRunner', () => { const logger = getVoidLogger(); let actionRegistry = new TemplateActionRegistry(); @@ -50,6 +61,7 @@ describe('DefaultWorkflowRunner', () => { winston.format.simple(); // put logform the require cache before mocking fs mockFs({ '/tmp': mockFs.directory(), + ...realFiles, }); jest.resetAllMocks(); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index 5ed55d9630..37d302e8b2 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -26,6 +26,7 @@ import { import * as winston from 'winston'; import fs from 'fs-extra'; import path from 'path'; +import nunjucks from 'nunjucks'; import { JsonObject, JsonValue } from '@backstage/types'; import { InputError } from '@backstage/errors'; import { PassThrough } from 'stream'; @@ -102,7 +103,17 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { } private isSingleTemplateString(input: string) { - const { parser, nodes } = require('nunjucks'); + const { parser, nodes } = nunjucks as unknown as { + parser: { + parse( + template: string, + ctx: object, + options: nunjucks.ConfigureOptions, + ): { children: { children?: unknown[] }[] }; + }; + nodes: { TemplateData: Function }; + }; + const parsed = parser.parse( input, {}, From f9352ab606367cd9efc6ff048915c70ed3013b7f Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 24 Nov 2021 19:56:44 +0100 Subject: [PATCH 086/131] scaffolder-backend: removed all usaged and prevent new usage of path.resolve Signed-off-by: Patrik Oldsberg --- .changeset/serious-pens-tease.md | 5 +++ plugins/scaffolder-backend/.eslintrc.js | 33 +++++++++++++++++++ .../actions/builtin/catalog/write.ts | 4 +-- .../scaffolder/actions/builtin/debug/log.ts | 4 +-- .../actions/builtin/fetch/helpers.ts | 2 +- .../actions/builtin/fetch/template.ts | 8 ++--- .../builtin/publish/githubPullRequest.ts | 3 +- 7 files changed, 48 insertions(+), 11 deletions(-) create mode 100644 .changeset/serious-pens-tease.md diff --git a/.changeset/serious-pens-tease.md b/.changeset/serious-pens-tease.md new file mode 100644 index 0000000000..7759ba3bc0 --- /dev/null +++ b/.changeset/serious-pens-tease.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-scaffolder-backend': patch +--- + +Removed all usages of `path.resolve` in order to ensure that template paths are resolved in a safe way. diff --git a/plugins/scaffolder-backend/.eslintrc.js b/plugins/scaffolder-backend/.eslintrc.js index 19c9ad7395..2632b5e089 100644 --- a/plugins/scaffolder-backend/.eslintrc.js +++ b/plugins/scaffolder-backend/.eslintrc.js @@ -1,8 +1,41 @@ +const parent = require('@backstage/cli/config/eslint.backend'); + module.exports = { extends: [require.resolve('@backstage/cli/config/eslint.backend')], ignorePatterns: ['sample-templates/'], rules: { 'no-console': 0, // Permitted in console programs 'new-cap': ['error', { capIsNew: false }], // Because Express constructs things e.g. like 'const r = express.Router()' + // Usage of path.resolve is extra sensitive in the scaffolder, so forbid it in non-test code + 'no-restricted-imports': [ + 'error', + { + ...parent.rules['no-restricted-imports'][1], + paths: [ + { + name: 'path', + importNames: ['resolve'], + message: + 'Do not use path.resolve, use `resolveSafeChildPath` from `@backstage/backend-common` instead as it prevents security issues', + }, + ], + }, + ], + 'no-restricted-syntax': parent.rules['no-restricted-syntax'].concat([ + { + message: + 'Do not use path.resolve, use `resolveSafeChildPath` from `@backstage/backend-common` instead as it prevents security issues', + selector: + 'MemberExpression[object.name="path"][property.name="resolve"]', + }, + ]), }, + overrides: [ + { + files: ['*.test.*', 'src/setupTests.*', 'dev/**'], + rules: { + 'no-restricted-imports': parent.rules['no-restricted-imports'], + }, + }, + ], }; diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts index 45481b47e6..b813244020 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/catalog/write.ts @@ -15,10 +15,10 @@ */ import fs from 'fs-extra'; -import { resolve as resolvePath } from 'path'; import { createTemplateAction } from '../../createTemplateAction'; import * as yaml from 'yaml'; import { Entity } from '@backstage/catalog-model'; +import { resolveSafeChildPath } from '@backstage/backend-common'; export function createCatalogWriteAction() { return createTemplateAction<{ name?: string; entity: Entity }>({ @@ -42,7 +42,7 @@ export function createCatalogWriteAction() { const { entity } = ctx.input; await fs.writeFile( - resolvePath(ctx.workspacePath, 'catalog-info.yaml'), + resolveSafeChildPath(ctx.workspacePath, 'catalog-info.yaml'), yaml.stringify(entity), ); }, diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.ts index 9bf9b7fb90..36ea842a66 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/debug/log.ts @@ -15,7 +15,7 @@ */ import { readdir, stat } from 'fs-extra'; -import { relative, resolve } from 'path'; +import { relative, join } from 'path'; import { createTemplateAction } from '../../createTemplateAction'; /** @@ -68,7 +68,7 @@ export async function recursiveReadDir(dir: string): Promise { const subdirs = await readdir(dir); const files = await Promise.all( subdirs.map(async subdir => { - const res = resolve(dir, subdir); + const res = join(dir, subdir); return (await stat(res)).isDirectory() ? recursiveReadDir(res) : [res]; }), ); diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/helpers.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/helpers.ts index 3946110d42..b56bab0d53 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/helpers.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/helpers.ts @@ -19,7 +19,7 @@ import { JsonValue } from '@backstage/types'; import { InputError } from '@backstage/errors'; import { ScmIntegrations } from '@backstage/integration'; import fs from 'fs-extra'; -import * as path from 'path'; +import path from 'path'; export async function fetchContents({ reader, diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts index 47bfcccfdf..54a2c25cf3 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { resolve as resolvePath, extname } from 'path'; +import { extname } from 'path'; import { resolveSafeChildPath, UrlReader } from '@backstage/backend-common'; import { InputError } from '@backstage/errors'; import { ScmIntegrations } from '@backstage/integration'; @@ -114,7 +114,7 @@ export function createFetchTemplateAction(options: { ctx.logger.info('Fetching template content from remote URL'); const workDir = await ctx.createTemporaryDirectory(); - const templateDir = resolvePath(workDir, 'template'); + const templateDir = resolveSafeChildPath(workDir, 'template'); const targetPath = ctx.input.targetPath ?? './'; const outputDir = resolveSafeChildPath(ctx.workspacePath, targetPath); @@ -240,7 +240,7 @@ export function createFetchTemplateAction(options: { if (renderFilename) { localOutputPath = templater.renderString(localOutputPath, context); } - const outputPath = resolvePath(outputDir, localOutputPath); + const outputPath = resolveSafeChildPath(outputDir, localOutputPath); // variables have been expanded to make an empty file name // this is due to a conditional like if values.my_condition then file-name.txt else empty string so skip if (outputDir === outputPath) { @@ -259,7 +259,7 @@ export function createFetchTemplateAction(options: { ); await fs.ensureDir(outputPath); } else { - const inputFilePath = resolvePath(templateDir, location); + const inputFilePath = resolveSafeChildPath(templateDir, location); if (await isBinaryFile(inputFilePath)) { ctx.logger.info( diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.ts index 0cceb47d71..3a9dd01686 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/githubPullRequest.ts @@ -15,7 +15,6 @@ */ import fs from 'fs-extra'; -import path from 'path'; import { parseRepoUrl, isExecutable } from './util'; import { @@ -197,7 +196,7 @@ export const createPublishGithubPullRequestAction = ({ const fileContents = await Promise.all( localFilePaths.map(filePath => { - const absPath = path.resolve(fileRoot, filePath); + const absPath = resolveSafeChildPath(fileRoot, filePath); const base64EncodedContent = fs .readFileSync(absPath) .toString('base64'); From 4f268b8ef17fda03fadf49c3d61e6445f84ce035 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 24 Nov 2021 20:37:03 +0100 Subject: [PATCH 087/131] scaffolder-backend: use a const reference to helpers in the SecureTemplater Signed-off-by: Patrik Oldsberg --- .../lib/templating/SecureTemplater.test.ts | 29 +++++++++++++++++++ .../src/lib/templating/SecureTemplater.ts | 9 ++++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts index 899f57e295..b83c9eea4f 100644 --- a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts +++ b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts @@ -113,4 +113,33 @@ describe('SecureTemplater', () => { ['https://my-host.com/my-owner/my-repo'], ]); }); + + it('should not allow helpers to be rewritten', async () => { + const templater = new SecureTemplater({ + parseRepoUrl: () => ({ + repo: 'my-repo', + owner: 'my-owner', + host: 'my-host.com', + }), + }); + await templater.initializeIfNeeded(); + + const ctx = { + repoUrl: 'https://my-host.com/my-owner/my-repo', + }; + expect( + templater.render( + '${{ ({}).constructor.constructor("parseRepoUrl = () => JSON.stringify(`inject`)")() }}', + ctx, + ), + ).toBe(''); + + expect(templater.render('${{ repoUrl | parseRepoUrl | dump }}', ctx)).toBe( + JSON.stringify({ + repo: 'my-repo', + owner: 'my-owner', + host: 'my-host.com', + }), + ); + }); }); diff --git a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts index c4f14cfe3f..eba1c3838d 100644 --- a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts +++ b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts @@ -45,11 +45,13 @@ const { render, renderCompat } = (() => { compatEnv.addFilter('jsonify', compatEnv.getFilter('dump')); if (typeof parseRepoUrl !== 'undefined') { + const safeHelperRef = parseRepoUrl; + env.addFilter('parseRepoUrl', repoUrl => { - return JSON.parse(parseRepoUrl(repoUrl)) + return JSON.parse(safeHelperRef(repoUrl)) }); env.addFilter('projectSlug', repoUrl => { - const { owner, repo } = JSON.parse(parseRepoUrl(repoUrl)); + const { owner, repo } = JSON.parse(safeHelperRef(repoUrl)); return owner + '/' + repo; }); } @@ -132,6 +134,9 @@ export class SecureTemplater { }; } + // Note that helpers in the sandbox can be rewritten with a script injection. + // In order to mitigate that each helper must be assigned to a constant variable + // inside the closure that houses the nunjucks implementation. this.#vm = new VM({ timeout: 1000, sandbox }); const nunjucksSource = await fs.readFile( From e7cc6bf28f94947e4e64acf0ad57856dd1a1283c Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 24 Nov 2021 20:59:52 +0100 Subject: [PATCH 088/131] scaffolder-backend: refactor SecureTemplater to use separate sandboxes Signed-off-by: Patrik Oldsberg --- .../lib/templating/SecureTemplater.test.ts | 88 ++++++++++--------- .../src/lib/templating/SecureTemplater.ts | 87 ++++++++---------- .../actions/builtin/fetch/template.ts | 16 ++-- .../tasks/NunjucksWorkflowRunner.ts | 56 +++++++----- 4 files changed, 122 insertions(+), 125 deletions(-) diff --git a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts index b83c9eea4f..1ec3f050d1 100644 --- a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts +++ b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts @@ -18,24 +18,21 @@ import { SecureTemplater } from './SecureTemplater'; describe('SecureTemplater', () => { it('should render some templates', async () => { - const templater = new SecureTemplater(); - await templater.initializeIfNeeded(); - expect(templater.render('${{ test }}', { test: 'my-value' })).toBe( - 'my-value', - ); + const render = await SecureTemplater.loadRenderer(); + expect(render('${{ test }}', { test: 'my-value' })).toBe('my-value'); - expect(templater.render('${{ test | dump }}', { test: 'my-value' })).toBe( + expect(render('${{ test | dump }}', { test: 'my-value' })).toBe( '"my-value"', ); expect( - templater.render('${{ test | replace("my-", "our-") }}', { + render('${{ test | replace("my-", "our-") }}', { test: 'my-value', }), ).toBe('our-value'); expect(() => - templater.render('${{ invalid...syntax }}', { + render('${{ invalid...syntax }}', { test: 'my-value', }), ).toThrow( @@ -44,34 +41,28 @@ describe('SecureTemplater', () => { }); it('should make cookiecutter compatibility available when requested', async () => { - const templater = new SecureTemplater(); - await templater.initializeIfNeeded(); + const renderWith = await SecureTemplater.loadRenderer({ + cookiecutterCompat: true, + }); + const renderWithout = await SecureTemplater.loadRenderer(); // Same two tests repeated to make sure switching back and forth works - expect( - templater.render('{{ 1 | jsonify }}', {}, { cookiecutterCompat: true }), - ).toBe('1'); - expect( - templater.render('{{ 1 | jsonify }}', {}, { cookiecutterCompat: true }), - ).toBe('1'); - expect(() => templater.render('${{ 1 | jsonify }}', {})).toThrow( + expect(renderWith('{{ 1 | jsonify }}', {})).toBe('1'); + expect(renderWith('{{ 1 | jsonify }}', {})).toBe('1'); + expect(() => renderWithout('${{ 1 | jsonify }}', {})).toThrow( '(unknown path)\n Error: filter not found: jsonify', ); - expect( - templater.render('{{ 1 | jsonify }}', {}, { cookiecutterCompat: true }), - ).toBe('1'); - expect(() => templater.render('${{ 1 | jsonify }}', {})).toThrow( + expect(renderWith('{{ 1 | jsonify }}', {})).toBe('1'); + expect(() => renderWithout('${{ 1 | jsonify }}', {})).toThrow( '(unknown path)\n Error: filter not found: jsonify', ); - expect(() => templater.render('${{ 1 | jsonify }}', {})).toThrow( + expect(() => renderWithout('${{ 1 | jsonify }}', {})).toThrow( '(unknown path)\n Error: filter not found: jsonify', ); - expect(() => templater.render('${{ 1 | jsonify }}', {})).toThrow( + expect(() => renderWithout('${{ 1 | jsonify }}', {})).toThrow( '(unknown path)\n Error: filter not found: jsonify', ); - expect( - templater.render('{{ 1 | jsonify }}', {}, { cookiecutterCompat: true }), - ).toBe('1'); + expect(renderWith('{{ 1 | jsonify }}', {})).toBe('1'); }); it('should make parseRepoUrl available when requested', async () => { @@ -80,33 +71,29 @@ describe('SecureTemplater', () => { owner: 'my-owner', host: 'my-host.com', })); - const templaterWith = new SecureTemplater({ parseRepoUrl }); - await templaterWith.initializeIfNeeded(); - const templaterWithout = new SecureTemplater(); - await templaterWithout.initializeIfNeeded(); + const renderWith = await SecureTemplater.loadRenderer({ parseRepoUrl }); + const renderWithout = await SecureTemplater.loadRenderer(); const ctx = { repoUrl: 'https://my-host.com/my-owner/my-repo', }; - expect( - templaterWith.render('${{ repoUrl | parseRepoUrl | dump }}', ctx), - ).toBe( + expect(renderWith('${{ repoUrl | parseRepoUrl | dump }}', ctx)).toBe( JSON.stringify({ repo: 'my-repo', owner: 'my-owner', host: 'my-host.com', }), ); - expect(templaterWith.render('${{ repoUrl | projectSlug }}', ctx)).toBe( + expect(renderWith('${{ repoUrl | projectSlug }}', ctx)).toBe( 'my-owner/my-repo', ); expect(() => - templaterWithout.render('${{ repoUrl | parseRepoUrl | dump }}', ctx), + renderWithout('${{ repoUrl | parseRepoUrl | dump }}', ctx), ).toThrow('(unknown path)\n Error: filter not found: parseRepoUrl'); - expect(() => - templaterWithout.render('${{ repoUrl | projectSlug }}', ctx), - ).toThrow('(unknown path)\n Error: filter not found: projectSlug'); + expect(() => renderWithout('${{ repoUrl | projectSlug }}', ctx)).toThrow( + '(unknown path)\n Error: filter not found: projectSlug', + ); expect(parseRepoUrl.mock.calls).toEqual([ ['https://my-host.com/my-owner/my-repo'], @@ -115,26 +102,25 @@ describe('SecureTemplater', () => { }); it('should not allow helpers to be rewritten', async () => { - const templater = new SecureTemplater({ + const render = await SecureTemplater.loadRenderer({ parseRepoUrl: () => ({ repo: 'my-repo', owner: 'my-owner', host: 'my-host.com', }), }); - await templater.initializeIfNeeded(); const ctx = { repoUrl: 'https://my-host.com/my-owner/my-repo', }; expect( - templater.render( + render( '${{ ({}).constructor.constructor("parseRepoUrl = () => JSON.stringify(`inject`)")() }}', ctx, ), ).toBe(''); - expect(templater.render('${{ repoUrl | parseRepoUrl | dump }}', ctx)).toBe( + expect(render('${{ repoUrl | parseRepoUrl | dump }}', ctx)).toBe( JSON.stringify({ repo: 'my-repo', owner: 'my-owner', @@ -142,4 +128,22 @@ describe('SecureTemplater', () => { }), ); }); + + it('allows pollution during a single template execution', async () => { + const render = await SecureTemplater.loadRenderer(); + + const ctx = { + x: 'foo', + }; + expect(render('${{ x }}', ctx)).toBe('foo'); + expect( + render( + '${{ ({}).constructor.constructor("Array.prototype.forEach = () => {}")() }}', + ctx, + ), + ).toBe(''); + expect(() => render('${{ x }}', ctx)).toThrow( + `TypeError: Cannot read property 'length' of undefined`, + ); + }); }); diff --git a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts index eba1c3838d..bee1f310c9 100644 --- a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts +++ b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts @@ -87,68 +87,55 @@ const { render, renderCompat } = (() => { })(); `; -export interface SecureTemplaterRenderOptions { +export interface SecureTemplaterOptions { + /* Optional implementation of the parseRepoUrl filter */ + parseRepoUrl?(repoUrl: string): RepoSpec; + /* Enables jinja compatibility and the "jsonify" filter */ cookiecutterCompat?: boolean; } -export interface SecureTemplaterOptions { - parseRepoUrl?(repoUrl: string): RepoSpec; -} +export type SecureTemplateRenderer = ( + template: string, + values: unknown, +) => string; export class SecureTemplater { - #vm?: VM; + static async loadRenderer(options: SecureTemplaterOptions = {}) { + const { parseRepoUrl, cookiecutterCompat } = options; + let sandbox = undefined; - #parseRepoUrl?: (repoUrl: string) => RepoSpec; - - constructor(options?: SecureTemplaterOptions) { - this.#parseRepoUrl = options?.parseRepoUrl; - } - - render( - template: string, - values: unknown, - options?: SecureTemplaterRenderOptions, - ): string { - if (!this.#vm) { - throw new Error('SecureTemplater has not been initialized'); - } - this.#vm.setGlobal('templateStr', template); - this.#vm.setGlobal('templateValues', JSON.stringify(values)); - - if (options?.cookiecutterCompat) { - return this.#vm.run(`renderCompat(templateStr, templateValues)`); + if (parseRepoUrl) { + sandbox = { + parseRepoUrl: (url: string) => JSON.stringify(parseRepoUrl(url)), + }; } - return this.#vm.run(`render(templateStr, templateValues)`); - } + const vm = new VM({ timeout: 1000, sandbox }); - async initializeIfNeeded() { - if (!this.#vm) { - let sandbox = undefined; + const nunjucksSource = await fs.readFile( + resolvePackagePath( + '@backstage/plugin-scaffolder-backend', + 'assets/nunjucks.js.txt', + ), + 'utf-8', + ); - if (this.#parseRepoUrl) { - const parseRepoUrl = this.#parseRepoUrl; - sandbox = { - parseRepoUrl: (url: string) => JSON.stringify(parseRepoUrl(url)), - }; + vm.run(mkScript(nunjucksSource)); + + const render: SecureTemplateRenderer = (template, values) => { + if (!vm) { + throw new Error('SecureTemplater has not been initialized'); + } + vm.setGlobal('templateStr', template); + vm.setGlobal('templateValues', JSON.stringify(values)); + + if (cookiecutterCompat) { + return vm.run(`renderCompat(templateStr, templateValues)`); } - // Note that helpers in the sandbox can be rewritten with a script injection. - // In order to mitigate that each helper must be assigned to a constant variable - // inside the closure that houses the nunjucks implementation. - this.#vm = new VM({ timeout: 1000, sandbox }); - - const nunjucksSource = await fs.readFile( - resolvePackagePath( - '@backstage/plugin-scaffolder-backend', - 'assets/nunjucks.js.txt', - ), - 'utf-8', - ); - - this.#vm.run(mkScript(nunjucksSource)); - } - return this.#vm; + return vm.run(`render(templateStr, templateValues)`); + }; + return render; } } diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts index 9e1a3f29db..8dae7b7418 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/fetch/template.ts @@ -47,8 +47,6 @@ export function createFetchTemplateAction(options: { }) { const { reader, integrations } = options; - const templater = new SecureTemplater(); - return createTemplateAction({ id: 'fetch:template', description: @@ -102,8 +100,6 @@ export function createFetchTemplateAction(options: { async handler(ctx) { ctx.logger.info('Fetching template content from remote URL'); - await templater.initializeIfNeeded(); - const workDir = await ctx.createTemporaryDirectory(); const templateDir = resolvePath(workDir, 'template'); @@ -184,6 +180,10 @@ export function createFetchTemplateAction(options: { ctx.input.values, ); + const renderTemplate = await SecureTemplater.loadRenderer({ + cookiecutterCompat: ctx.input.cookiecutterCompat, + }); + for (const location of allEntriesInTemplate) { let renderFilename: boolean; let renderContents: boolean; @@ -199,9 +199,7 @@ export function createFetchTemplateAction(options: { renderFilename = renderContents = !nonTemplatedEntries.has(location); } if (renderFilename) { - localOutputPath = templater.render(localOutputPath, context, { - cookiecutterCompat: ctx.input.cookiecutterCompat, - }); + localOutputPath = renderTemplate(localOutputPath, context); } const outputPath = resolvePath(outputDir, localOutputPath); // variables have been expanded to make an empty file name @@ -238,9 +236,7 @@ export function createFetchTemplateAction(options: { await fs.outputFile( outputPath, renderContents - ? templater.render(inputFileContents, context, { - cookiecutterCompat: ctx.input.cookiecutterCompat, - }) + ? renderTemplate(inputFileContents, context) : inputFileContents, { mode: statsObj.mode }, ); diff --git a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts index 37d302e8b2..a3e30c65fe 100644 --- a/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts +++ b/plugins/scaffolder-backend/src/scaffolder/tasks/NunjucksWorkflowRunner.ts @@ -34,7 +34,10 @@ import { isTruthy } from './helper'; import { validate as validateJsonSchema } from 'jsonschema'; import { parseRepoUrl } from '../actions/builtin/publish/util'; import { TemplateActionRegistry } from '../actions'; -import { SecureTemplater } from '../../lib/templating/SecureTemplater'; +import { + SecureTemplater, + SecureTemplateRenderer, +} from '../../lib/templating/SecureTemplater'; type NunjucksWorkflowRunnerOptions = { workingDirectory: string; @@ -86,21 +89,7 @@ const createStepLogger = ({ }; export class NunjucksWorkflowRunner implements WorkflowRunner { - private readonly templater: SecureTemplater; - - constructor(private readonly options: NunjucksWorkflowRunnerOptions) { - const { integrations } = options; - - this.templater = new SecureTemplater({ - // TODO(blam): let's work out how we can deprecate this. - // We shouldn't really need to be exposing these now we can deal with - // objects in the params block. - // Maybe we can expose a new RepoUrlPicker with secrets for V3 that provides an object already. - parseRepoUrl(url: string) { - return parseRepoUrl(url, integrations); - }, - }); - } + constructor(private readonly options: NunjucksWorkflowRunnerOptions) {} private isSingleTemplateString(input: string) { const { parser, nodes } = nunjucks as unknown as { @@ -132,7 +121,11 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { ); } - private render(input: T, context: TemplateContext): T { + private render( + input: T, + context: TemplateContext, + renderTemplate: SecureTemplateRenderer, + ): T { return JSON.parse(JSON.stringify(input), (_key, value) => { try { if (typeof value === 'string') { @@ -145,7 +138,7 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { ); // Run the templating - const templated = this.templater.render(wrappedDumped, context); + const templated = renderTemplate(wrappedDumped, context); // If there's an empty string returned, then it's undefined if (templated === '') { @@ -162,7 +155,7 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { } // Fallback to default behaviour - const templated = this.templater.render(value, context); + const templated = renderTemplate(value, context); if (templated === '') { return undefined; @@ -187,12 +180,23 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { this.options.workingDirectory, await task.getWorkspaceName(), ); + + const { integrations } = this.options; + const renderTemplate = await SecureTemplater.loadRenderer({ + // TODO(blam): let's work out how we can deprecate this. + // We shouldn't really need to be exposing these now we can deal with + // objects in the params block. + // Maybe we can expose a new RepoUrlPicker with secrets for V3 that provides an object already. + parseRepoUrl(url: string) { + return parseRepoUrl(url, integrations); + }, + }); + try { await fs.ensureDir(workspacePath); await task.emitLog( `Starting up task with ${task.spec.steps.length} steps`, ); - await this.templater.initializeIfNeeded(); const context: TemplateContext = { parameters: task.spec.parameters, @@ -202,7 +206,11 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { for (const step of task.spec.steps) { try { if (step.if) { - const ifResult = await this.render(step.if, context); + const ifResult = await this.render( + step.if, + context, + renderTemplate, + ); if (!isTruthy(ifResult)) { await task.emitLog( `Skipping step ${step.id} because it's if condition was false`, @@ -220,7 +228,9 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { const action = this.options.actionRegistry.get(step.action); const { taskLogger, streamLogger } = createStepLogger({ task, step }); - const input = (step.input && this.render(step.input, context)) ?? {}; + const input = + (step.input && this.render(step.input, context, renderTemplate)) ?? + {}; if (action.schema?.input) { const validateResult = validateJsonSchema( @@ -283,7 +293,7 @@ export class NunjucksWorkflowRunner implements WorkflowRunner { } } - const output = this.render(task.spec.output, context); + const output = this.render(task.spec.output, context, renderTemplate); return { output }; } finally { From f514044f8d7f0cfcaaf9f1e8b092fff14bf9ef79 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 24 Nov 2021 21:04:12 +0100 Subject: [PATCH 089/131] scaffolder-backend: clarify purpose of nunjucks build script Signed-off-by: Patrik Oldsberg --- plugins/scaffolder-backend/scripts/build-nunjucks.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/scaffolder-backend/scripts/build-nunjucks.js b/plugins/scaffolder-backend/scripts/build-nunjucks.js index d20cfa8d80..1434755adb 100755 --- a/plugins/scaffolder-backend/scripts/build-nunjucks.js +++ b/plugins/scaffolder-backend/scripts/build-nunjucks.js @@ -50,6 +50,8 @@ const NUNJUCKS_LICENSE = `/** */ `; +// This script is used to bundle nunjucks into a single script that is +// loaded into a sandbox for executing templates. require('esbuild') .build({ entryPoints: [require.resolve('nunjucks')], From f00498f57eaf55fa62aba0f9c43ecc51e6c816f0 Mon Sep 17 00:00:00 2001 From: Gauthier Date: Thu, 25 Nov 2021 10:18:27 +0800 Subject: [PATCH 090/131] doc: acl requirements for kafka-backend Signed-off-by: Gauthier Roebroeck --- plugins/kafka-backend/README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/kafka-backend/README.md b/plugins/kafka-backend/README.md index d18a232fa4..637a5773e0 100644 --- a/plugins/kafka-backend/README.md +++ b/plugins/kafka-backend/README.md @@ -49,3 +49,7 @@ kafka: username: my-username password: my-password ``` + +### ACLs + +If you are using ACLs on Kafka, you will need to have the `DESCRIBE` ACL on both consumer groups and topics. From 2f4a686411a0287065038821b67889a6d01e3f98 Mon Sep 17 00:00:00 2001 From: Yousif Al-Raheem Date: Thu, 25 Nov 2021 10:04:45 +0100 Subject: [PATCH 091/131] changed minor to patch release Signed-off-by: Yousif Al-Raheem --- .../{khaki-lies-burn.md => eleven-starfishes-exist.md} | 2 +- .changeset/three-flowers-push.md | 5 ----- 2 files changed, 1 insertion(+), 6 deletions(-) rename .changeset/{khaki-lies-burn.md => eleven-starfishes-exist.md} (76%) delete mode 100644 .changeset/three-flowers-push.md diff --git a/.changeset/khaki-lies-burn.md b/.changeset/eleven-starfishes-exist.md similarity index 76% rename from .changeset/khaki-lies-burn.md rename to .changeset/eleven-starfishes-exist.md index e89a36a37a..a3139e1d3f 100644 --- a/.changeset/khaki-lies-burn.md +++ b/.changeset/eleven-starfishes-exist.md @@ -1,5 +1,5 @@ --- -'@backstage/plugin-org': minor +'@backstage/plugin-org': patch --- Use email links in the catalog's members list instead of text to display a member's email diff --git a/.changeset/three-flowers-push.md b/.changeset/three-flowers-push.md deleted file mode 100644 index 5457c0fd15..0000000000 --- a/.changeset/three-flowers-push.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-org': minor ---- - -use backstage link instead of react router link in MembersListCard From 7a8312f126855bf2f779d6819024265662c84bd4 Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Thu, 25 Nov 2021 09:31:45 +0000 Subject: [PATCH 092/131] permission-backend: add changeset Signed-off-by: Mike Lewis --- .changeset/olive-pumpkins-burn.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/olive-pumpkins-burn.md diff --git a/.changeset/olive-pumpkins-burn.md b/.changeset/olive-pumpkins-burn.md new file mode 100644 index 0000000000..3cd9c46267 --- /dev/null +++ b/.changeset/olive-pumpkins-burn.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-permission-backend': minor +--- + +New package containing the backend for authorization and permissions. For more information, see the [authorization PRFC](https://github.com/backstage/backstage/pull/7761). From 3f320fb922183bf16f59fbb0acc88bee4dcb1689 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 24 Nov 2021 22:20:30 +0100 Subject: [PATCH 093/131] scaffolder-backend: more reliable error matching in SecureTemplater tests Signed-off-by: Patrik Oldsberg --- .../lib/templating/SecureTemplater.test.ts | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts index 1ec3f050d1..134b877efe 100644 --- a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts +++ b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.test.ts @@ -35,9 +35,7 @@ describe('SecureTemplater', () => { render('${{ invalid...syntax }}', { test: 'my-value', }), - ).toThrow( - '(unknown path) [Line 1, Column 13]\n expected name as lookup value, got .', - ); + ).toThrow(/expected name as lookup value, got ./); }); it('should make cookiecutter compatibility available when requested', async () => { @@ -50,17 +48,17 @@ describe('SecureTemplater', () => { expect(renderWith('{{ 1 | jsonify }}', {})).toBe('1'); expect(renderWith('{{ 1 | jsonify }}', {})).toBe('1'); expect(() => renderWithout('${{ 1 | jsonify }}', {})).toThrow( - '(unknown path)\n Error: filter not found: jsonify', + /Error: filter not found: jsonify/, ); expect(renderWith('{{ 1 | jsonify }}', {})).toBe('1'); expect(() => renderWithout('${{ 1 | jsonify }}', {})).toThrow( - '(unknown path)\n Error: filter not found: jsonify', + /Error: filter not found: jsonify/, ); expect(() => renderWithout('${{ 1 | jsonify }}', {})).toThrow( - '(unknown path)\n Error: filter not found: jsonify', + /Error: filter not found: jsonify/, ); expect(() => renderWithout('${{ 1 | jsonify }}', {})).toThrow( - '(unknown path)\n Error: filter not found: jsonify', + /Error: filter not found: jsonify/, ); expect(renderWith('{{ 1 | jsonify }}', {})).toBe('1'); }); @@ -90,9 +88,9 @@ describe('SecureTemplater', () => { ); expect(() => renderWithout('${{ repoUrl | parseRepoUrl | dump }}', ctx), - ).toThrow('(unknown path)\n Error: filter not found: parseRepoUrl'); + ).toThrow(/Error: filter not found: parseRepoUrl/); expect(() => renderWithout('${{ repoUrl | projectSlug }}', ctx)).toThrow( - '(unknown path)\n Error: filter not found: projectSlug', + /Error: filter not found: projectSlug/, ); expect(parseRepoUrl.mock.calls).toEqual([ @@ -142,8 +140,6 @@ describe('SecureTemplater', () => { ctx, ), ).toBe(''); - expect(() => render('${{ x }}', ctx)).toThrow( - `TypeError: Cannot read property 'length' of undefined`, - ); + expect(() => render('${{ x }}', ctx)).toThrow(); }); }); From 331cedd06fa37a688387c7ef678d9d6b560d69a7 Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Thu, 25 Nov 2021 10:46:05 +0100 Subject: [PATCH 094/131] fix build script Signed-off-by: Johan Haals --- plugins/scaffolder-backend/scripts/build-nunjucks.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/scaffolder-backend/scripts/build-nunjucks.js b/plugins/scaffolder-backend/scripts/build-nunjucks.js index 1434755adb..b195f96159 100755 --- a/plugins/scaffolder-backend/scripts/build-nunjucks.js +++ b/plugins/scaffolder-backend/scripts/build-nunjucks.js @@ -59,7 +59,7 @@ require('esbuild') format: 'cjs', platform: 'node', target: 'node14', - banner: NUNJUCKS_LICENSE, + banner: { js: NUNJUCKS_LICENSE }, external: ['fsevents'], outfile: path.resolve(__dirname, '../assets/nunjucks.js.txt'), }) From 07842fe7caaaef08c5ad65db8595f3f07aa759da Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Thu, 25 Nov 2021 10:49:03 +0100 Subject: [PATCH 095/131] chore: remove timeout Signed-off-by: Johan Haals --- .../scaffolder-backend/src/lib/templating/SecureTemplater.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts index bee1f310c9..54c9166020 100644 --- a/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts +++ b/plugins/scaffolder-backend/src/lib/templating/SecureTemplater.ts @@ -111,7 +111,7 @@ export class SecureTemplater { }; } - const vm = new VM({ timeout: 1000, sandbox }); + const vm = new VM({ sandbox }); const nunjucksSource = await fs.readFile( resolvePackagePath( From 2e5a67b77d63cda79a2c1bfd929061d13d8144ad Mon Sep 17 00:00:00 2001 From: Mike Lewis Date: Thu, 25 Nov 2021 09:50:24 +0000 Subject: [PATCH 096/131] permission-backend: replace cross-fetch with node-fetch Signed-off-by: Mike Lewis --- plugins/permission-backend/package.json | 3 +-- .../src/service/PermissionIntegrationClient.test.ts | 2 +- .../src/service/PermissionIntegrationClient.ts | 7 ++++--- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index c4c9aa11ad..f30c73f8eb 100644 --- a/plugins/permission-backend/package.json +++ b/plugins/permission-backend/package.json @@ -21,14 +21,13 @@ "dependencies": { "@backstage/backend-common": "^0.9.9", "@backstage/config": "^0.1.11", - "@backstage/errors": "^0.1.4", "@backstage/plugin-auth-backend": "^0.4.7", "@backstage/plugin-permission-common": "^0.1.0", "@backstage/plugin-permission-node": "^0.0.0", "@types/express": "*", - "cross-fetch": "^3.0.6", "express": "^4.17.1", "express-promise-router": "^4.1.0", + "node-fetch": "^2.6.1", "winston": "^3.2.1", "yn": "^4.0.0", "zod": "^3.11.6" diff --git a/plugins/permission-backend/src/service/PermissionIntegrationClient.test.ts b/plugins/permission-backend/src/service/PermissionIntegrationClient.test.ts index 8e3e85b5af..6a35488117 100644 --- a/plugins/permission-backend/src/service/PermissionIntegrationClient.test.ts +++ b/plugins/permission-backend/src/service/PermissionIntegrationClient.test.ts @@ -162,7 +162,7 @@ describe('PermissionIntegrationClient', () => { resourceType: 'test-resource', conditions: mockConditions, }), - ).rejects.toThrowError(/request failed with 401/i); + ).rejects.toThrowError(/401/i); }); it('should reject invalid responses', async () => { diff --git a/plugins/permission-backend/src/service/PermissionIntegrationClient.ts b/plugins/permission-backend/src/service/PermissionIntegrationClient.ts index 0076edd05f..0d6017cfd3 100644 --- a/plugins/permission-backend/src/service/PermissionIntegrationClient.ts +++ b/plugins/permission-backend/src/service/PermissionIntegrationClient.ts @@ -14,9 +14,8 @@ * limitations under the License. */ -import fetch from 'cross-fetch'; +import fetch from 'node-fetch'; import { z } from 'zod'; -import { ResponseError } from '@backstage/errors'; import { PluginEndpointDiscovery } from '@backstage/backend-common'; import { AuthorizeResult, @@ -73,7 +72,9 @@ export class PermissionIntegrationClient { }); if (!response.ok) { - throw await ResponseError.fromResponse(response); + throw new Error( + `Unexpected response from plugin upstream when applying conditions. Expected 200 but got ${response.status} - ${response.statusText}`, + ); } return responseSchema.parse(await response.json()); From 452b86916a13f5649a7e9694b982e49ab6e20963 Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Thu, 25 Nov 2021 11:04:35 +0100 Subject: [PATCH 097/131] link in changeset Signed-off-by: Johan Haals --- .changeset/light-rabbits-matter.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/light-rabbits-matter.md b/.changeset/light-rabbits-matter.md index a528e4d1c5..c75ac7cb21 100644 --- a/.changeset/light-rabbits-matter.md +++ b/.changeset/light-rabbits-matter.md @@ -2,4 +2,4 @@ '@backstage/plugin-scaffolder-backend': patch --- -Switched to executing scaffolder templating in a secure context for any template based on nunjucks, as it is not secure by default (https://mozilla.github.io/nunjucks/api.html#user-defined-templates-warning). +Switched to executing scaffolder templating in a secure context for any template based on nunjucks, as it is [not secure by default](https://mozilla.github.io/nunjucks/api.html#user-defined-templates-warning). From e7230ef814681300ef73009e677cf51b074d62da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 17 Nov 2021 15:09:20 +0100 Subject: [PATCH 098/131] bump react-dev-utils MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/olive-rats-destroy.md | 6 +++ packages/cli/package.json | 2 +- packages/techdocs-cli/package.json | 2 +- yarn.lock | 85 +++++++++++++++++++++++++++--- 4 files changed, 85 insertions(+), 10 deletions(-) create mode 100644 .changeset/olive-rats-destroy.md diff --git a/.changeset/olive-rats-destroy.md b/.changeset/olive-rats-destroy.md new file mode 100644 index 0000000000..5908fc0f10 --- /dev/null +++ b/.changeset/olive-rats-destroy.md @@ -0,0 +1,6 @@ +--- +'@backstage/cli': patch +'@techdocs/cli': patch +--- + +Bump react-dev-utils to v12 diff --git a/packages/cli/package.json b/packages/cli/package.json index 1eed5a742c..1a4e536233 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -90,7 +90,7 @@ "postcss": "^8.1.0", "process": "^0.11.10", "react": "^16.0.0", - "react-dev-utils": "^11.0.4", + "react-dev-utils": "^12.0.0-next.47", "react-hot-loader": "^4.12.21", "recursive-readdir": "^2.2.2", "replace-in-file": "^6.0.0", diff --git a/packages/techdocs-cli/package.json b/packages/techdocs-cli/package.json index 70ca0a9668..05759e39d1 100644 --- a/packages/techdocs-cli/package.json +++ b/packages/techdocs-cli/package.json @@ -65,7 +65,7 @@ "dockerode": "^3.3.1", "fs-extra": "^9.0.1", "http-proxy": "^1.18.1", - "react-dev-utils": "^11.0.4", + "react-dev-utils": "^12.0.0-next.47", "serve-handler": "^6.1.3", "winston": "^3.2.1" } diff --git a/yarn.lock b/yarn.lock index 1e4d402072..d9e57735fc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8832,7 +8832,7 @@ add-stream@^1.0.0: resolved "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" integrity sha1-anmQQ3ynNtXhKI25K9MmbV9csqo= -address@1.1.2, address@^1.0.1: +address@1.1.2, address@^1.0.1, address@^1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6" integrity sha512-aT6camzM4xEA54YVJYSqxz1kv4IHnQZRtThJJHhUMRExaU5spC7jX5ugSwTaTgJliIgs4VhZOk7htClvQ/LmRA== @@ -10399,7 +10399,7 @@ browserslist@4.14.2: escalade "^3.0.2" node-releases "^1.1.61" -browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.0, browserslist@^4.16.6: +browserslist@^4.0.0, browserslist@^4.12.0, browserslist@^4.14.5, browserslist@^4.16.0, browserslist@^4.16.5, browserslist@^4.16.6: version "4.18.1" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.18.1.tgz#60d3920f25b6860eb917c6c7b185576f4d8b017f" integrity sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ== @@ -12976,7 +12976,7 @@ detect-node@^2.0.4: resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== -detect-port-alt@1.1.6: +detect-port-alt@1.1.6, detect-port-alt@^1.1.6: version "1.1.6" resolved "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz#24707deabe932d4a3cf621302027c2b266568275" integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== @@ -14651,6 +14651,11 @@ filesize@6.1.0: resolved "https://registry.npmjs.org/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00" integrity sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg== +filesize@^6.1.0: + version "6.4.0" + resolved "https://registry.npmjs.org/filesize/-/filesize-6.4.0.tgz#914f50471dd66fdca3cefe628bd0cde4ef769bcd" + integrity sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ== + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -14885,6 +14890,25 @@ fork-ts-checker-webpack-plugin@^6.0.4: semver "^7.3.2" tapable "^1.0.0" +fork-ts-checker-webpack-plugin@^6.0.5: + version "6.4.2" + resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.4.2.tgz#6d307fb4072ce4abe4d56a89c8ef060066f33d81" + integrity sha512-EqtzzRdx2mldr0KEydSN9jaNrf419gMpwkloumG6K/S7jtJc9Fl7wMJ+y+o7DLLGMMU/kouYr06agTD/YkxzIQ== + dependencies: + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + chokidar "^3.4.2" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + glob "^7.1.6" + memfs "^3.1.2" + minimatch "^3.0.4" + schema-utils "2.7.0" + semver "^7.3.2" + tapable "^1.0.0" + form-data-encoder@^1.4.3: version "1.6.0" resolved "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-1.6.0.tgz#9dd1f479836c1b1b47201667c68f8daafa800943" @@ -15463,7 +15487,7 @@ global-dirs@^3.0.0: dependencies: ini "2.0.0" -global-modules@2.0.0: +global-modules@2.0.0, global-modules@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== @@ -15907,7 +15931,7 @@ gud@^1.0.0: resolved "https://registry.npmjs.org/gud/-/gud-1.0.0.tgz#a489581b17e6a70beca9abe3ae57de7a499852c0" integrity sha512-zGEOVKFM5sVPPrYs7J5/hYEw2Pof8KCyOwyhG8sAF26mCAeUFAcYPu1mwB7hhpIP29zOIBaDqwuHdLp0jvZXjw== -gzip-size@5.1.1: +gzip-size@5.1.1, gzip-size@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-5.1.1.tgz#cb9bee692f87c0612b232840a873904e4c135274" integrity sha512-FNHi6mmoHvs1mxZAds4PpdCS6QG8B4C1krxJsMutgxl5t3+GlRTzzI3NEkifXx2pVsOvJdOGSmIgDhQ55FwdPA== @@ -16582,6 +16606,11 @@ immer@^9.0.1: resolved "https://registry.npmjs.org/immer/-/immer-9.0.6.tgz#7a96bf2674d06c8143e327cbf73539388ddf1a73" integrity sha512-G95ivKpy+EvVAnAab4fVa4YGYn24J1SpEktnJX7JJ45Bd7xqME/SCplFzYFmTbrkwZbQ4xJK1xMTUYBkN6pWsQ== +immer@^9.0.6: + version "9.0.7" + resolved "https://registry.npmjs.org/immer/-/immer-9.0.7.tgz#b6156bd7db55db7abc73fd2fdadf4e579a701075" + integrity sha512-KGllzpbamZDvOIxnmJ0jI840g7Oikx58lBPWV0hUh7dtAyZpFqqrBZdKka5GlTwMTZ1Tjc/bKKW4VSFAt6BqMA== + immutable@>=3.8.2, immutable@^3.8.2, immutable@^3.x.x: version "3.8.2" resolved "https://registry.npmjs.org/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" @@ -17363,7 +17392,7 @@ is-resolvable@^1.1.0: resolved "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg== -is-root@2.1.0: +is-root@2.1.0, is-root@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz#809e18129cf1129644302a4f8544035d51984a9c" integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== @@ -22713,7 +22742,7 @@ pkg-dir@^5.0.0: dependencies: find-up "^5.0.0" -pkg-up@3.1.0: +pkg-up@3.1.0, pkg-up@^3.1.0: version "3.1.0" resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5" integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== @@ -23791,7 +23820,7 @@ react-debounce-input@=3.2.4: lodash.debounce "^4" prop-types "^15.7.2" -react-dev-utils@^11.0.3, react-dev-utils@^11.0.4: +react-dev-utils@^11.0.3: version "11.0.4" resolved "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-11.0.4.tgz#a7ccb60257a1ca2e0efe7a83e38e6700d17aa37a" integrity sha512-dx0LvIGHcOPtKbeiSUM4jqpBl3TcY7CDjZdfOIcKeznE7BWr9dg0iPG90G5yfVQ+p/rGNMXdbfStvzQZEVEi4A== @@ -23821,6 +23850,36 @@ react-dev-utils@^11.0.3, react-dev-utils@^11.0.4: strip-ansi "6.0.0" text-table "0.2.0" +react-dev-utils@^12.0.0-next.47: + version "12.0.0-next.47" + resolved "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.0-next.47.tgz#e55c31a05eb30cfd69ca516e8b87d61724e880fb" + integrity sha512-PsE71vP15TZMmp/RZKOJC4fYD5Pvt0+wCoyG3QHclto0d4FyIJI78xGRICOOThZFROqgXYlZP6ddmeybm+jO4w== + dependencies: + "@babel/code-frame" "^7.10.4" + address "^1.1.2" + browserslist "^4.16.5" + chalk "^2.4.2" + cross-spawn "^7.0.3" + detect-port-alt "^1.1.6" + escape-string-regexp "^2.0.0" + filesize "^6.1.0" + find-up "^4.1.0" + fork-ts-checker-webpack-plugin "^6.0.5" + global-modules "^2.0.0" + globby "^11.0.1" + gzip-size "^5.1.1" + immer "^9.0.6" + is-root "^2.1.0" + loader-utils "^2.0.0" + open "^7.0.2" + pkg-up "^3.1.0" + prompts "^2.4.0" + react-error-overlay "7.0.0-next.54+1465357b" + recursive-readdir "^2.2.2" + shell-quote "^1.7.2" + strip-ansi "^6.0.0" + text-table "^0.2.0" + react-docgen-typescript@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/react-docgen-typescript/-/react-docgen-typescript-2.1.0.tgz#20db64a7fd62e63a8a9469fb4abd90600878cbb2" @@ -23870,6 +23929,11 @@ react-error-boundary@^3.1.0: dependencies: "@babel/runtime" "^7.12.5" +react-error-overlay@7.0.0-next.54+1465357b: + version "7.0.0-next.54" + resolved "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-7.0.0-next.54.tgz#c1eb5ab86aee15e9552e6d97897b08f2bd06d140" + integrity sha512-b96CiTnZahXPDNH9MKplvt5+jD+BkxDw7q5R3jnkUXze/ux1pLv32BBZmlj0OfCUeMqyz4sAmF+0ccJGVMlpXw== + react-error-overlay@^6.0.9: version "6.0.9" resolved "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.9.tgz#3c743010c9359608c375ecd6bc76f35d93995b0a" @@ -25685,6 +25749,11 @@ shell-quote@1.7.2: resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz#67a7d02c76c9da24f99d20808fcaded0e0e04be2" integrity sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg== +shell-quote@^1.7.2: + version "1.7.3" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.3.tgz#aa40edac170445b9a431e17bb62c0b881b9c4123" + integrity sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw== + shelljs@^0.8.3, shelljs@^0.8.4: version "0.8.4" resolved "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz#de7684feeb767f8716b326078a8a00875890e3c2" From dcaeaac1747c4fa1ff78cc458aed768d0aca35f4 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 24 Nov 2021 15:20:47 +0100 Subject: [PATCH 099/131] create-app: add pack scripts that excludes peer depdencies during publish Signed-off-by: Patrik Oldsberg --- .changeset/chilly-sloths-sniff.md | 5 ++++ packages/create-app/package.json | 2 ++ packages/create-app/scripts/postpack.js | 37 +++++++++++++++++++++++++ packages/create-app/scripts/prepack.js | 36 ++++++++++++++++++++++++ 4 files changed, 80 insertions(+) create mode 100644 .changeset/chilly-sloths-sniff.md create mode 100644 packages/create-app/scripts/postpack.js create mode 100644 packages/create-app/scripts/prepack.js diff --git a/.changeset/chilly-sloths-sniff.md b/.changeset/chilly-sloths-sniff.md new file mode 100644 index 0000000000..b23fb9c7cd --- /dev/null +++ b/.changeset/chilly-sloths-sniff.md @@ -0,0 +1,5 @@ +--- +'@backstage/create-app': patch +--- + +Cleaned out the `peerDependencies` in the published version of the package, making it much quicker to run `npx @backstage/create-app` as it no longer needs to install a long list of unnecessary. diff --git a/packages/create-app/package.json b/packages/create-app/package.json index d5ee616ff5..32d72b5ffb 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -25,6 +25,8 @@ "lint": "backstage-cli lint", "test": "backstage-cli test", "clean": "backstage-cli clean", + "prepack": "node scripts/prepack.js", + "postpack": "node scripts/postpack.js", "start": "nodemon --" }, "dependencies": { diff --git a/packages/create-app/scripts/postpack.js b/packages/create-app/scripts/postpack.js new file mode 100644 index 0000000000..f13db11e76 --- /dev/null +++ b/packages/create-app/scripts/postpack.js @@ -0,0 +1,37 @@ +#!/usr/bin/env node +/* + * Copyright 2021 The Backstage Authors + * + * 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 + * + * http://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. + */ + +/* eslint-disable no-restricted-syntax */ + +const fs = require('fs-extra'); +const path = require('path'); + +async function main() { + const pkgPath = path.resolve(__dirname, '../package.json'); + const pkgBackupPath = path.resolve(__dirname, '../package.json-prepack'); + + try { + await fs.move(pkgBackupPath, pkgPath, { overwrite: true }); + } catch (err) { + console.error(`Failed to restore package.json during postpack, ${err}`); + } +} + +main().catch(err => { + console.error(err.stack); + process.exit(1); +}); diff --git a/packages/create-app/scripts/prepack.js b/packages/create-app/scripts/prepack.js new file mode 100644 index 0000000000..2caf865280 --- /dev/null +++ b/packages/create-app/scripts/prepack.js @@ -0,0 +1,36 @@ +#!/usr/bin/env node +/* + * Copyright 2021 The Backstage Authors + * + * 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 + * + * http://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. + */ + +/* eslint-disable no-restricted-syntax */ + +const fs = require('fs-extra'); +const path = require('path'); + +async function main() { + const pkgPath = path.resolve(__dirname, '../package.json'); + const pkgBackupPath = path.resolve(__dirname, '../package.json-prepack'); + + const pkg = await fs.readJson(pkgPath); + await fs.writeJson(pkgBackupPath, pkg, { encoding: 'utf8', spaces: 2 }); + delete pkg.peerDependencies; + await fs.writeJson(pkgPath, pkg, { encoding: 'utf8', spaces: 2 }); +} + +main().catch(err => { + console.error(err.stack); + process.exit(1); +}); From 4149d74c108fc8625f4d18a197fe40ddbd412985 Mon Sep 17 00:00:00 2001 From: blam Date: Thu, 25 Nov 2021 12:05:53 +0100 Subject: [PATCH 100/131] chore: fix a small issue witih the badge url resolution Signed-off-by: blam --- .changeset/late-coins-eat.md | 5 +++++ plugins/badges/src/api/BadgesClient.ts | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/late-coins-eat.md diff --git a/.changeset/late-coins-eat.md b/.changeset/late-coins-eat.md new file mode 100644 index 0000000000..c23fbc7931 --- /dev/null +++ b/.changeset/late-coins-eat.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-badges': patch +--- + +Fix the path that the Badges client uses towards the `plugin-badges-backend` diff --git a/plugins/badges/src/api/BadgesClient.ts b/plugins/badges/src/api/BadgesClient.ts index 432a485a6b..8ad5d313e4 100644 --- a/plugins/badges/src/api/BadgesClient.ts +++ b/plugins/badges/src/api/BadgesClient.ts @@ -52,7 +52,7 @@ export class BadgesClient implements BadgesApi { private async getEntityBadgeSpecsUrl(entity: Entity): Promise { const routeParams = this.getEntityRouteParams(entity); - const path = generatePath(`:kind/:namespace/:name`, routeParams); + const path = generatePath(`:namespace/:kind/:name`, routeParams); return `${await this.discoveryApi.getBaseUrl( 'badges', )}/entity/${path}/badge-specs`; From 4f81bfd356794ed08b858292990fd9e239ca8b93 Mon Sep 17 00:00:00 2001 From: Gauthier Roebroeck Date: Thu, 25 Nov 2021 19:22:38 +0800 Subject: [PATCH 101/131] disable snyk workflow on forks Signed-off-by: Gauthier Roebroeck --- .changeset/neat-suits-retire.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/neat-suits-retire.md diff --git a/.changeset/neat-suits-retire.md b/.changeset/neat-suits-retire.md new file mode 100644 index 0000000000..f9c98e0d84 --- /dev/null +++ b/.changeset/neat-suits-retire.md @@ -0,0 +1,5 @@ +--- +'@backstage/plugin-kafka-backend': patch +--- + +Add ACL requirements for kafka-backend plugin From b055a6addc020ec86e547a32afb5b1f177436643 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 24 Nov 2021 19:01:46 +0100 Subject: [PATCH 102/131] Align on usage of `cross-fetch` vs `node-fetch` in frontend vs backend packages MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/fresh-pumas-collect.md | 18 +++++++++++++ packages/config-loader/package.json | 4 +-- plugins/auth-backend/package.json | 2 +- .../src/identity/IdentityClient.ts | 2 +- .../src/providers/aws-alb/provider.test.ts | 2 +- .../src/providers/aws-alb/provider.ts | 2 +- plugins/badges-backend/package.json | 1 - plugins/bitrise/package.json | 1 - .../package.json | 2 +- .../src/microsoftGraph/client.ts | 2 +- plugins/code-coverage-backend/package.json | 1 - plugins/fossa/package.json | 1 - plugins/jenkins-backend/package.json | 1 - .../package.json | 1 - plugins/scaffolder-backend/package.json | 2 +- .../actions/builtin/publish/bitbucket.ts | 2 +- plugins/sonarqube/package.json | 1 - plugins/tech-insights-backend/package.json | 1 - plugins/techdocs-backend/package.json | 2 +- .../src/search/DefaultTechDocsCollator.ts | 2 +- .../techdocs-backend/src/service/router.ts | 2 +- plugins/todo-backend/package.json | 1 - yarn.lock | 25 ------------------- 23 files changed, 31 insertions(+), 47 deletions(-) create mode 100644 .changeset/fresh-pumas-collect.md diff --git a/.changeset/fresh-pumas-collect.md b/.changeset/fresh-pumas-collect.md new file mode 100644 index 0000000000..8ac43f2bb6 --- /dev/null +++ b/.changeset/fresh-pumas-collect.md @@ -0,0 +1,18 @@ +--- +'@backstage/config-loader': patch +'@backstage/plugin-auth-backend': patch +'@backstage/plugin-badges-backend': patch +'@backstage/plugin-bitrise': patch +'@backstage/plugin-catalog-backend-module-msgraph': patch +'@backstage/plugin-code-coverage-backend': patch +'@backstage/plugin-fossa': patch +'@backstage/plugin-jenkins-backend': patch +'@backstage/plugin-scaffolder-backend': patch +'@backstage/plugin-scaffolder-backend-module-cookiecutter': patch +'@backstage/plugin-sonarqube': patch +'@backstage/plugin-tech-insights-backend': patch +'@backstage/plugin-techdocs-backend': patch +'@backstage/plugin-todo-backend': patch +--- + +Align on usage of `cross-fetch` vs `node-fetch` in frontend vs backend packages, and remove some unnecessary imports of either one of them diff --git a/packages/config-loader/package.json b/packages/config-loader/package.json index b4c0350def..c275a1f045 100644 --- a/packages/config-loader/package.json +++ b/packages/config-loader/package.json @@ -41,10 +41,10 @@ "json-schema": "^0.4.0", "json-schema-merge-allof": "^0.8.1", "json-schema-traverse": "^1.0.0", + "node-fetch": "^2.6.1", "typescript-json-schema": "^0.51.0", "yaml": "^1.9.2", - "yup": "^0.32.9", - "node-fetch": "2.6.5" + "yup": "^0.32.9" }, "devDependencies": { "@types/jest": "^26.0.7", diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index 3a9e8102eb..bac31be3c7 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -42,7 +42,6 @@ "compression": "^1.7.4", "cookie-parser": "^1.4.5", "cors": "^2.8.5", - "cross-fetch": "^3.0.6", "express": "^4.17.1", "express-promise-router": "^4.1.0", "express-session": "^1.17.1", @@ -56,6 +55,7 @@ "luxon": "^2.0.2", "minimatch": "^3.0.3", "morgan": "^1.10.0", + "node-fetch": "^2.6.1", "node-cache": "^5.1.2", "openid-client": "^4.2.1", "passport": "^0.4.1", diff --git a/plugins/auth-backend/src/identity/IdentityClient.ts b/plugins/auth-backend/src/identity/IdentityClient.ts index 2af30e4b6a..d60829bf59 100644 --- a/plugins/auth-backend/src/identity/IdentityClient.ts +++ b/plugins/auth-backend/src/identity/IdentityClient.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import fetch from 'cross-fetch'; +import fetch from 'node-fetch'; import { JWK, JWT, JWKS, JSONWebKey } from 'jose'; import { BackstageIdentity } from '../providers'; import { PluginEndpointDiscovery } from '@backstage/backend-common'; diff --git a/plugins/auth-backend/src/providers/aws-alb/provider.test.ts b/plugins/auth-backend/src/providers/aws-alb/provider.test.ts index 2f5ffa1833..3f72004d48 100644 --- a/plugins/auth-backend/src/providers/aws-alb/provider.test.ts +++ b/plugins/auth-backend/src/providers/aws-alb/provider.test.ts @@ -50,7 +50,7 @@ const mockClaims = { }; jest.mock('jose'); -jest.mock('cross-fetch', () => ({ +jest.mock('node-fetch', () => ({ __esModule: true, default: async () => { return { diff --git a/plugins/auth-backend/src/providers/aws-alb/provider.ts b/plugins/auth-backend/src/providers/aws-alb/provider.ts index ac5db5e69f..b0b9070d50 100644 --- a/plugins/auth-backend/src/providers/aws-alb/provider.ts +++ b/plugins/auth-backend/src/providers/aws-alb/provider.ts @@ -21,7 +21,7 @@ import { SignInResolver, } from '../types'; import express from 'express'; -import fetch from 'cross-fetch'; +import fetch from 'node-fetch'; import * as crypto from 'crypto'; import { KeyObject } from 'crypto'; import { Logger } from 'winston'; diff --git a/plugins/badges-backend/package.json b/plugins/badges-backend/package.json index 2186c8d52e..cf1f8bd97b 100644 --- a/plugins/badges-backend/package.json +++ b/plugins/badges-backend/package.json @@ -39,7 +39,6 @@ "@types/express": "^4.17.6", "badge-maker": "^3.3.0", "cors": "^2.8.5", - "cross-fetch": "^3.0.6", "express": "^4.17.1", "express-promise-router": "^4.1.0", "winston": "^3.2.1", diff --git a/plugins/bitrise/package.json b/plugins/bitrise/package.json index 92cd9693e1..4c5eb5e500 100644 --- a/plugins/bitrise/package.json +++ b/plugins/bitrise/package.json @@ -49,7 +49,6 @@ "@types/jest": "^26.0.7", "@types/node": "^14.14.32", "@types/recharts": "^1.8.15", - "cross-fetch": "^3.0.6", "msw": "^0.35.0" }, "files": [ diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index 222f56b022..901722c3cd 100644 --- a/plugins/catalog-backend-module-msgraph/package.json +++ b/plugins/catalog-backend-module-msgraph/package.json @@ -34,8 +34,8 @@ "@backstage/config": "^0.1.10", "@backstage/plugin-catalog-backend": "^0.17.4", "@microsoft/microsoft-graph-types": "^2.6.0", - "cross-fetch": "^3.0.6", "lodash": "^4.17.21", + "node-fetch": "^2.6.1", "p-limit": "^3.0.2", "winston": "^3.2.1", "qs": "^6.9.4" diff --git a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/client.ts b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/client.ts index 83b4371c0d..63f256afbd 100644 --- a/plugins/catalog-backend-module-msgraph/src/microsoftGraph/client.ts +++ b/plugins/catalog-backend-module-msgraph/src/microsoftGraph/client.ts @@ -16,7 +16,7 @@ import * as msal from '@azure/msal-node'; import * as MicrosoftGraph from '@microsoft/microsoft-graph-types'; -import fetch from 'cross-fetch'; +import fetch, { Response } from 'node-fetch'; import qs from 'qs'; import { MicrosoftGraphProviderConfig } from './config'; diff --git a/plugins/code-coverage-backend/package.json b/plugins/code-coverage-backend/package.json index 90320d0e41..a9a2e0abab 100644 --- a/plugins/code-coverage-backend/package.json +++ b/plugins/code-coverage-backend/package.json @@ -27,7 +27,6 @@ "@backstage/errors": "^0.1.3", "@backstage/integration": "^0.6.8", "@types/express": "^4.17.6", - "cross-fetch": "^3.0.6", "express": "^4.17.1", "express-promise-router": "^4.1.0", "express-xml-bodyparser": "^0.3.0", diff --git a/plugins/fossa/package.json b/plugins/fossa/package.json index cc0b486d60..4b39e54b51 100644 --- a/plugins/fossa/package.json +++ b/plugins/fossa/package.json @@ -58,7 +58,6 @@ "@testing-library/user-event": "^13.1.8", "@types/jest": "^26.0.7", "@types/node": "^14.14.32", - "cross-fetch": "^3.0.6", "msw": "^0.35.0" }, "files": [ diff --git a/plugins/jenkins-backend/package.json b/plugins/jenkins-backend/package.json index ac9efb3ffd..78512604ef 100644 --- a/plugins/jenkins-backend/package.json +++ b/plugins/jenkins-backend/package.json @@ -27,7 +27,6 @@ "@backstage/catalog-model": "^0.9.7", "@backstage/config": "^0.1.10", "@types/express": "^4.17.6", - "cross-fetch": "^3.0.6", "express": "^4.17.1", "express-promise-router": "^4.1.0", "jenkins": "^0.28.1", diff --git a/plugins/scaffolder-backend-module-cookiecutter/package.json b/plugins/scaffolder-backend-module-cookiecutter/package.json index 90258d3c28..95dab84e88 100644 --- a/plugins/scaffolder-backend-module-cookiecutter/package.json +++ b/plugins/scaffolder-backend-module-cookiecutter/package.json @@ -29,7 +29,6 @@ "command-exists": "^1.2.9", "fs-extra": "10.0.0", "winston": "^3.2.1", - "cross-fetch": "^3.0.6", "yn": "^4.0.0" }, "devDependencies": { diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index d4582cfa25..2aff055f4a 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -50,7 +50,6 @@ "command-exists": "^1.2.9", "compression": "^1.7.4", "cors": "^2.8.5", - "cross-fetch": "^3.0.6", "express": "^4.17.1", "express-promise-router": "^4.1.0", "fs-extra": "10.0.0", @@ -65,6 +64,7 @@ "lodash": "^4.17.21", "luxon": "^2.0.2", "morgan": "^1.10.0", + "node-fetch": "^2.6.1", "nunjucks": "^3.2.3", "octokit-plugin-create-pull-request": "^3.10.0", "uuid": "^8.2.0", diff --git a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucket.ts b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucket.ts index daa6bc249b..fbfe87b076 100644 --- a/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucket.ts +++ b/plugins/scaffolder-backend/src/scaffolder/actions/builtin/publish/bitbucket.ts @@ -19,7 +19,7 @@ import { BitbucketIntegrationConfig, ScmIntegrationRegistry, } from '@backstage/integration'; -import fetch from 'cross-fetch'; +import fetch, { Response, RequestInit } from 'node-fetch'; import { initRepoAndPush } from '../helpers'; import { createTemplateAction } from '../../createTemplateAction'; import { getRepoSourceDirectory, parseRepoUrl } from './util'; diff --git a/plugins/sonarqube/package.json b/plugins/sonarqube/package.json index f92c21ad7e..c0a587d9b1 100644 --- a/plugins/sonarqube/package.json +++ b/plugins/sonarqube/package.json @@ -58,7 +58,6 @@ "@testing-library/user-event": "^13.1.8", "@types/jest": "^26.0.7", "@types/node": "^14.14.32", - "cross-fetch": "^3.0.6", "msw": "^0.35.0" }, "files": [ diff --git a/plugins/tech-insights-backend/package.json b/plugins/tech-insights-backend/package.json index 5bc616db71..1206174805 100644 --- a/plugins/tech-insights-backend/package.json +++ b/plugins/tech-insights-backend/package.json @@ -39,7 +39,6 @@ "@backstage/plugin-tech-insights-common": "^0.1.0", "@backstage/plugin-tech-insights-node": "^0.1.0", "@types/express": "^4.17.6", - "cross-fetch": "^3.0.6", "express": "^4.17.1", "express-promise-router": "^4.1.0", "knex": "^0.95.1", diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index 332884c694..c6b99b3367 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -40,13 +40,13 @@ "@backstage/search-common": "^0.2.1", "@backstage/techdocs-common": "^0.10.7", "@types/express": "^4.17.6", - "cross-fetch": "^3.0.6", "dockerode": "^3.3.1", "express": "^4.17.1", "express-promise-router": "^4.1.0", "fs-extra": "9.1.0", "knex": "^0.95.1", "lodash": "^4.17.21", + "node-fetch": "^2.6.1", "p-limit": "^3.1.0", "winston": "^3.2.1" }, diff --git a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts index 121ef6e46d..df968bb8d3 100644 --- a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts +++ b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.ts @@ -17,7 +17,7 @@ import { PluginEndpointDiscovery } from '@backstage/backend-common'; import { Entity, RELATION_OWNED_BY } from '@backstage/catalog-model'; import { DocumentCollator } from '@backstage/search-common'; -import fetch from 'cross-fetch'; +import fetch from 'node-fetch'; import unescape from 'lodash/unescape'; import { Logger } from 'winston'; import pLimit from 'p-limit'; diff --git a/plugins/techdocs-backend/src/service/router.ts b/plugins/techdocs-backend/src/service/router.ts index e560a895b6..d53a2faed4 100644 --- a/plugins/techdocs-backend/src/service/router.ts +++ b/plugins/techdocs-backend/src/service/router.ts @@ -24,7 +24,7 @@ import { PreparerBuilder, PublisherBase, } from '@backstage/techdocs-common'; -import fetch from 'cross-fetch'; +import fetch from 'node-fetch'; import express, { Response } from 'express'; import Router from 'express-promise-router'; import { Knex } from 'knex'; diff --git a/plugins/todo-backend/package.json b/plugins/todo-backend/package.json index be1dc658f1..abda1076ae 100644 --- a/plugins/todo-backend/package.json +++ b/plugins/todo-backend/package.json @@ -32,7 +32,6 @@ "@backstage/errors": "^0.1.3", "@backstage/integration": "^0.6.7", "@types/express": "^4.17.6", - "cross-fetch": "^3.0.6", "express": "^4.17.1", "express-promise-router": "^4.1.0", "leasot": "^12.0.0", diff --git a/yarn.lock b/yarn.lock index b41442f8bc..419f4e76d0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21187,13 +21187,6 @@ node-fetch@2.6.1, node-fetch@^2.3.0, node-fetch@^2.6.0, node-fetch@^2.6.1: resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== -node-fetch@2.6.5: - version "2.6.5" - resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.5.tgz#42735537d7f080a7e5f78b6c549b7146be1742fd" - integrity sha512-mmlIVHJEu5rnIxgEgez6b9GgWXbkZj5YZ7fx+2r94a2E+Uirsp6HsPTPlomfdHtpt/B0cdKviwkoaM6pyvUOpQ== - dependencies: - whatwg-url "^5.0.0" - node-forge@^0.10.0: version "0.10.0" resolved "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz#32dea2afb3e9926f02ee5ce8794902691a676bf3" @@ -27570,11 +27563,6 @@ tr46@^2.0.2: dependencies: punycode "^2.1.1" -tr46@~0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" - integrity sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o= - "traverse@>=0.3.0 <0.4": version "0.3.9" resolved "https://registry.npmjs.org/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" @@ -28816,11 +28804,6 @@ web-streams-polyfill@4.0.0-beta.1: resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-4.0.0-beta.1.tgz#3b19b9817374b7cee06d374ba7eeb3aeb80e8c95" integrity sha512-3ux37gEX670UUphBF9AMCq8XM6iQ8Ac6A+DSRRjDoRBm1ufCkaCDdNVbaqq60PsEkdNlLKrGtv/YBP4EJXqNtQ== -webidl-conversions@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" - integrity sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE= - webidl-conversions@^5.0.0: version "5.0.0" resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz#ae59c8a00b121543a2acc65c0434f57b0fc11aff" @@ -29036,14 +29019,6 @@ whatwg-mimetype@^2.3.0: resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz#3d4b1e0312d2079879f826aff18dbeeca5960fbf" integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== -whatwg-url@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" - integrity sha1-lmRU6HZUYuN2RNNib2dCzotwll0= - dependencies: - tr46 "~0.0.3" - webidl-conversions "^3.0.0" - whatwg-url@^8.0.0, whatwg-url@^8.4.0: version "8.4.0" resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.4.0.tgz#50fb9615b05469591d2b2bd6dfaed2942ed72837" From 47619da24cd120d7fcfb9a8713eee452f609dcb8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Wed, 24 Nov 2021 19:24:33 +0100 Subject: [PATCH 103/131] give the same treatment to catalog-backend too MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- .changeset/clever-singers-search.md | 5 +++++ .changeset/fresh-pumas-collect.md | 1 + packages/integration/api-report.md | 18 ++++++++++++------ packages/integration/src/azure/core.ts | 4 ++-- packages/integration/src/bitbucket/core.ts | 4 ++-- packages/integration/src/github/core.ts | 4 ++-- packages/integration/src/gitlab/core.ts | 6 +++--- .../api-report.md | 5 +++-- plugins/catalog-backend/package.json | 2 +- .../src/ingestion/processors/azure/azure.ts | 2 +- .../ingestion/processors/bitbucket/client.ts | 2 +- .../src/ingestion/processors/gitlab/client.ts | 2 +- 12 files changed, 34 insertions(+), 21 deletions(-) create mode 100644 .changeset/clever-singers-search.md diff --git a/.changeset/clever-singers-search.md b/.changeset/clever-singers-search.md new file mode 100644 index 0000000000..0750cea8a8 --- /dev/null +++ b/.changeset/clever-singers-search.md @@ -0,0 +1,5 @@ +--- +'@backstage/integration': patch +--- + +Narrow the types returned by the request option functions, to only the specifics that they actually do return. The reason for this change is that a full `RequestInit` is unfortunate to return because it's different between `cross-fetch` and `node-fetch`. diff --git a/.changeset/fresh-pumas-collect.md b/.changeset/fresh-pumas-collect.md index 8ac43f2bb6..15d36472ed 100644 --- a/.changeset/fresh-pumas-collect.md +++ b/.changeset/fresh-pumas-collect.md @@ -3,6 +3,7 @@ '@backstage/plugin-auth-backend': patch '@backstage/plugin-badges-backend': patch '@backstage/plugin-bitrise': patch +'@backstage/plugin-catalog-backend': patch '@backstage/plugin-catalog-backend-module-msgraph': patch '@backstage/plugin-code-coverage-backend': patch '@backstage/plugin-fossa': patch diff --git a/packages/integration/api-report.md b/packages/integration/api-report.md index 4c2258779a..fcaa39b285 100644 --- a/packages/integration/api-report.md +++ b/packages/integration/api-report.md @@ -112,7 +112,9 @@ export function getAzureFileFetchUrl(url: string): string; export function getAzureRequestOptions( config: AzureIntegrationConfig, additionalHeaders?: Record, -): RequestInit; +): { + headers: Record; +}; // @public export function getBitbucketDefaultBranch( @@ -135,7 +137,9 @@ export function getBitbucketFileFetchUrl( // @public export function getBitbucketRequestOptions( config: BitbucketIntegrationConfig, -): RequestInit; +): { + headers: Record; +}; // @public export function getGitHubFileFetchUrl( @@ -148,7 +152,9 @@ export function getGitHubFileFetchUrl( export function getGitHubRequestOptions( config: GitHubIntegrationConfig, credentials: GithubCredentials, -): RequestInit; +): { + headers: Record; +}; // @public export function getGitLabFileFetchUrl( @@ -157,9 +163,9 @@ export function getGitLabFileFetchUrl( ): Promise; // @public -export function getGitLabRequestOptions( - config: GitLabIntegrationConfig, -): RequestInit; +export function getGitLabRequestOptions(config: GitLabIntegrationConfig): { + headers: Record; +}; // @public export type GithubAppConfig = { diff --git a/packages/integration/src/azure/core.ts b/packages/integration/src/azure/core.ts index 7461954267..1d5c4c3c89 100644 --- a/packages/integration/src/azure/core.ts +++ b/packages/integration/src/azure/core.ts @@ -64,8 +64,8 @@ export function getAzureCommitsUrl(url: string): string { export function getAzureRequestOptions( config: AzureIntegrationConfig, additionalHeaders?: Record, -): RequestInit { - const headers: HeadersInit = additionalHeaders +): { headers: Record } { + const headers: Record = additionalHeaders ? { ...additionalHeaders } : {}; diff --git a/packages/integration/src/bitbucket/core.ts b/packages/integration/src/bitbucket/core.ts index afcb9fcfdb..da10152bf8 100644 --- a/packages/integration/src/bitbucket/core.ts +++ b/packages/integration/src/bitbucket/core.ts @@ -158,8 +158,8 @@ export function getBitbucketFileFetchUrl( */ export function getBitbucketRequestOptions( config: BitbucketIntegrationConfig, -): RequestInit { - const headers: HeadersInit = {}; +): { headers: Record } { + const headers: Record = {}; if (config.token) { headers.Authorization = `Bearer ${config.token}`; diff --git a/packages/integration/src/github/core.ts b/packages/integration/src/github/core.ts index 2c5e739a26..76e54fd544 100644 --- a/packages/integration/src/github/core.ts +++ b/packages/integration/src/github/core.ts @@ -73,8 +73,8 @@ export function getGitHubFileFetchUrl( export function getGitHubRequestOptions( config: GitHubIntegrationConfig, credentials: GithubCredentials, -): RequestInit { - const headers: HeadersInit = {}; +): { headers: Record } { + const headers: Record = {}; if (chooseEndpoint(config, credentials) === 'api') { headers.Accept = 'application/vnd.github.v3.raw'; diff --git a/packages/integration/src/gitlab/core.ts b/packages/integration/src/gitlab/core.ts index e6f4dbc910..c5b0713340 100644 --- a/packages/integration/src/gitlab/core.ts +++ b/packages/integration/src/gitlab/core.ts @@ -54,9 +54,9 @@ export async function getGitLabFileFetchUrl( * @param config - The relevant provider config * @public */ -export function getGitLabRequestOptions( - config: GitLabIntegrationConfig, -): RequestInit { +export function getGitLabRequestOptions(config: GitLabIntegrationConfig): { + headers: Record; +} { const { token = '' } = config; return { headers: { diff --git a/plugins/catalog-backend-module-msgraph/api-report.md b/plugins/catalog-backend-module-msgraph/api-report.md index 1357659739..e1a837d0c1 100644 --- a/plugins/catalog-backend-module-msgraph/api-report.md +++ b/plugins/catalog-backend-module-msgraph/api-report.md @@ -13,6 +13,7 @@ import { LocationSpec } from '@backstage/catalog-model'; import { Logger as Logger_2 } from 'winston'; import * as MicrosoftGraph from '@microsoft/microsoft-graph-types'; import * as msal from '@azure/msal-node'; +import { Response as Response_2 } from 'node-fetch'; import { UserEntity } from '@backstage/catalog-model'; // Warning: (ae-missing-release-tag) "defaultGroupTransformer" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) @@ -88,11 +89,11 @@ export class MicrosoftGraphClient { // Warning: (ae-unresolved-link) The @link reference could not be resolved: The package "@backstage/plugin-catalog-backend-module-msgraph" does not have an export "ODataQuery" getUsers(query?: ODataQuery): AsyncIterable; // Warning: (ae-unresolved-link) The @link reference could not be resolved: The package "@backstage/plugin-catalog-backend-module-msgraph" does not have an export "ODataQuery" - requestApi(path: string, query?: ODataQuery): Promise; + requestApi(path: string, query?: ODataQuery): Promise; // Warning: (ae-forgotten-export) The symbol "ODataQuery" needs to be exported by the entry point index.d.ts // Warning: (ae-unresolved-link) The @link reference could not be resolved: The package "@backstage/plugin-catalog-backend-module-msgraph" does not have an export "ODataQuery" requestCollection(path: string, query?: ODataQuery): AsyncIterable; - requestRaw(url: string): Promise; + requestRaw(url: string): Promise; } // Warning: (ae-missing-release-tag) "MicrosoftGraphOrgEntityProvider" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index a9a35d5858..d32091e7c8 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -43,7 +43,6 @@ "aws-sdk": "^2.840.0", "codeowners-utils": "^1.0.2", "core-js": "^3.6.5", - "cross-fetch": "^3.0.6", "express": "^4.17.1", "express-promise-router": "^4.1.0", "fast-json-stable-stringify": "^2.1.0", @@ -53,6 +52,7 @@ "knex": "^0.95.1", "lodash": "^4.17.21", "luxon": "^2.0.2", + "node-fetch": "^2.6.1", "p-limit": "^3.0.2", "prom-client": "^13.2.0", "uuid": "^8.0.0", diff --git a/plugins/catalog-backend/src/ingestion/processors/azure/azure.ts b/plugins/catalog-backend/src/ingestion/processors/azure/azure.ts index 0c7b17483a..316c9b0b8c 100644 --- a/plugins/catalog-backend/src/ingestion/processors/azure/azure.ts +++ b/plugins/catalog-backend/src/ingestion/processors/azure/azure.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import fetch from 'cross-fetch'; +import fetch from 'node-fetch'; import { AzureIntegrationConfig, getAzureRequestOptions, diff --git a/plugins/catalog-backend/src/ingestion/processors/bitbucket/client.ts b/plugins/catalog-backend/src/ingestion/processors/bitbucket/client.ts index b578799229..0c132bb61b 100644 --- a/plugins/catalog-backend/src/ingestion/processors/bitbucket/client.ts +++ b/plugins/catalog-backend/src/ingestion/processors/bitbucket/client.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import fetch from 'cross-fetch'; +import fetch from 'node-fetch'; import { BitbucketIntegrationConfig, diff --git a/plugins/catalog-backend/src/ingestion/processors/gitlab/client.ts b/plugins/catalog-backend/src/ingestion/processors/gitlab/client.ts index 8781e071f7..d1765521a3 100644 --- a/plugins/catalog-backend/src/ingestion/processors/gitlab/client.ts +++ b/plugins/catalog-backend/src/ingestion/processors/gitlab/client.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import fetch from 'cross-fetch'; +import fetch from 'node-fetch'; import { getGitLabRequestOptions, GitLabIntegrationConfig, From 37e373d649addfbdf354253722bcb15efd8b326a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fredrik=20Adel=C3=B6w?= Date: Thu, 25 Nov 2021 11:34:56 +0100 Subject: [PATCH 104/131] types too MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Fredrik Adelöw --- plugins/catalog-backend-module-msgraph/package.json | 1 + yarn.lock | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index 901722c3cd..78c0a68ed9 100644 --- a/plugins/catalog-backend-module-msgraph/package.json +++ b/plugins/catalog-backend-module-msgraph/package.json @@ -34,6 +34,7 @@ "@backstage/config": "^0.1.10", "@backstage/plugin-catalog-backend": "^0.17.4", "@microsoft/microsoft-graph-types": "^2.6.0", + "@types/node-fetch": "^2.5.12", "lodash": "^4.17.21", "node-fetch": "^2.6.1", "p-limit": "^3.0.2", diff --git a/yarn.lock b/yarn.lock index 419f4e76d0..6b1d8b3aa0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7617,6 +7617,14 @@ "@types/node" "*" form-data "^3.0.0" +"@types/node-fetch@^2.5.12": + version "2.5.12" + resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.5.12.tgz#8a6f779b1d4e60b7a57fb6fd48d84fb545b9cc66" + integrity sha512-MKgC4dlq4kKNa/mYrwpKfzQMB5X3ee5U6fSprkKpToBqBmX4nFZL9cW5jl6sWn+xpRJ7ypWh2yyqqr8UUCstSw== + dependencies: + "@types/node" "*" + form-data "^3.0.0" + "@types/node@*", "@types/node@>= 8", "@types/node@>=12.12.47", "@types/node@>=13.7.0", "@types/node@^14.0.10", "@types/node@^14.14.31", "@types/node@^14.14.32": version "14.17.8" resolved "https://registry.npmjs.org/@types/node/-/node-14.17.8.tgz#813b73ab7d82ac06ddfd2458b13c88459a3b319f" From ef34f5de7b838a6da4d3a63a73937d064e7dc0b9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 25 Nov 2021 12:40:52 +0000 Subject: [PATCH 105/131] Version Packages --- .changeset/afraid-chairs-warn.md | 6 -- .changeset/big-phones-boil.md | 6 -- .changeset/chilly-sloths-sniff.md | 5 -- .changeset/curly-points-hide.md | 6 -- .changeset/early-dragons-wave.md | 5 -- .changeset/eleven-starfishes-exist.md | 5 -- .changeset/eleven-suns-type.md | 5 -- .changeset/forty-teachers-argue.md | 5 -- .changeset/giant-bees-applaud.md | 5 -- .changeset/green-bags-hug.md | 5 -- .changeset/heavy-tools-hang.md | 5 -- .changeset/large-mugs-repair.md | 5 -- .changeset/large-pears-agree.md | 5 -- .changeset/late-coins-eat.md | 5 -- .changeset/light-rabbits-matter.md | 5 -- .changeset/many-waves-visit.md | 5 -- .changeset/neat-suits-retire.md | 5 -- .changeset/olive-pumpkins-burn.md | 5 -- .changeset/pretty-trains-appear.md | 34 -------- .changeset/purple-grapes-attack.md | 5 -- .changeset/serious-pens-tease.md | 5 -- .changeset/sharp-carrots-press.md | 6 -- .changeset/shiny-insects-remember.md | 5 -- .changeset/slow-olives-confess.md | 7 -- .changeset/smart-fans-complain.md | 42 ---------- .changeset/smooth-vans-boil.md | 5 -- .changeset/strong-seahorses-scream.md | 5 -- .changeset/thirty-fireants-occur.md | 5 -- .changeset/thirty-tigers-refuse.md | 6 -- .changeset/weak-berries-sing.md | 5 -- .changeset/wet-seas-deliver.md | 63 --------------- .changeset/yellow-apes-brush.md | 5 -- .changeset/yellow-pandas-draw.md | 5 -- .changeset/young-hats-shop.md | 5 -- .changeset/young-sheep-impress.md | 5 -- packages/backend-common/CHANGELOG.md | 21 +++++ packages/backend-common/package.json | 8 +- packages/backend/CHANGELOG.md | 22 +++++ packages/backend/package.json | 36 ++++----- packages/cli/CHANGELOG.md | 24 ++++++ packages/cli/package.json | 14 ++-- packages/codemods/CHANGELOG.md | 9 +++ packages/codemods/package.json | 2 +- packages/core-app-api/CHANGELOG.md | 81 +++++++++++++++++++ packages/core-app-api/package.json | 10 +-- packages/core-components/CHANGELOG.md | 9 +++ packages/core-components/package.json | 12 +-- packages/core-plugin-api/CHANGELOG.md | 8 ++ packages/core-plugin-api/package.json | 8 +- packages/create-app/CHANGELOG.md | 22 +++++ packages/create-app/package.json | 2 +- packages/errors/CHANGELOG.md | 7 ++ packages/errors/package.json | 4 +- packages/techdocs-common/CHANGELOG.md | 22 +++++ packages/techdocs-common/package.json | 8 +- packages/test-utils/CHANGELOG.md | 67 +++++++++++++++ packages/test-utils/package.json | 8 +- plugins/allure/package.json | 10 +-- plugins/analytics-module-ga/package.json | 10 +-- plugins/api-docs/CHANGELOG.md | 9 +++ plugins/api-docs/package.json | 12 +-- plugins/auth-backend/CHANGELOG.md | 24 ++++++ plugins/auth-backend/package.json | 10 +-- plugins/azure-devops-backend/CHANGELOG.md | 21 +++++ plugins/azure-devops-backend/package.json | 6 +- plugins/azure-devops/package.json | 10 +-- plugins/badges-backend/CHANGELOG.md | 22 +++++ plugins/badges-backend/package.json | 8 +- plugins/badges/CHANGELOG.md | 10 +++ plugins/badges/package.json | 14 ++-- plugins/bazaar-backend/CHANGELOG.md | 21 +++++ plugins/bazaar-backend/package.json | 6 +- plugins/bazaar/package.json | 8 +- plugins/bitrise/package.json | 10 +-- .../catalog-backend-module-ldap/CHANGELOG.md | 8 ++ .../catalog-backend-module-ldap/package.json | 8 +- .../CHANGELOG.md | 7 ++ .../package.json | 10 +-- plugins/catalog-backend/CHANGELOG.md | 67 +++++++++++++++ plugins/catalog-backend/package.json | 10 +-- plugins/catalog-graph/package.json | 10 +-- plugins/catalog-import/package.json | 10 +-- plugins/catalog/package.json | 10 +-- plugins/circleci/package.json | 10 +-- plugins/cloudbuild/package.json | 10 +-- plugins/code-coverage-backend/CHANGELOG.md | 22 +++++ plugins/code-coverage-backend/package.json | 8 +- plugins/code-coverage/package.json | 10 +-- plugins/config-schema/CHANGELOG.md | 10 +++ plugins/config-schema/package.json | 14 ++-- plugins/cost-insights/CHANGELOG.md | 9 +++ plugins/cost-insights/package.json | 12 +-- plugins/explore/package.json | 10 +-- plugins/firehydrant/package.json | 10 +-- plugins/fossa/package.json | 10 +-- plugins/gcp-projects/package.json | 10 +-- plugins/git-release-manager/package.json | 10 +-- plugins/github-actions/CHANGELOG.md | 22 +++++ plugins/github-actions/package.json | 12 +-- plugins/github-deployments/package.json | 10 +-- plugins/gitops-profiles/package.json | 10 +-- plugins/graphiql/CHANGELOG.md | 9 +++ plugins/graphiql/package.json | 12 +-- plugins/home/package.json | 10 +-- plugins/ilert/package.json | 10 +-- plugins/jenkins-backend/CHANGELOG.md | 21 +++++ plugins/jenkins-backend/package.json | 6 +- plugins/jenkins/CHANGELOG.md | 9 +++ plugins/jenkins/package.json | 12 +-- plugins/kafka-backend/CHANGELOG.md | 9 +++ plugins/kafka-backend/package.json | 8 +- plugins/kafka/package.json | 10 +-- plugins/kubernetes-backend/CHANGELOG.md | 10 +++ plugins/kubernetes-backend/package.json | 10 +-- plugins/kubernetes-common/CHANGELOG.md | 6 ++ plugins/kubernetes-common/package.json | 4 +- plugins/kubernetes/CHANGELOG.md | 10 +++ plugins/kubernetes/package.json | 14 ++-- plugins/lighthouse/package.json | 10 +-- plugins/newrelic/package.json | 10 +-- plugins/org/CHANGELOG.md | 9 +++ plugins/org/package.json | 12 +-- plugins/pagerduty/package.json | 10 +-- plugins/permission-backend/CHANGELOG.md | 15 ++++ plugins/permission-backend/package.json | 12 +-- plugins/permission-common/CHANGELOG.md | 12 +++ plugins/permission-common/package.json | 6 +- plugins/permission-node/CHANGELOG.md | 13 +++ plugins/permission-node/package.json | 8 +- plugins/proxy-backend/CHANGELOG.md | 21 +++++ plugins/proxy-backend/package.json | 6 +- plugins/rollbar-backend/CHANGELOG.md | 21 +++++ plugins/rollbar-backend/package.json | 6 +- plugins/rollbar/package.json | 10 +-- plugins/scaffolder-backend/CHANGELOG.md | 13 +++ plugins/scaffolder-backend/package.json | 12 +-- plugins/scaffolder/CHANGELOG.md | 11 +++ plugins/scaffolder/package.json | 14 ++-- plugins/search-backend/CHANGELOG.md | 21 +++++ plugins/search-backend/package.json | 6 +- plugins/search/package.json | 10 +-- plugins/sentry/package.json | 10 +-- plugins/shortcuts/package.json | 10 +-- plugins/sonarqube/package.json | 10 +-- plugins/splunk-on-call/package.json | 10 +-- .../CHANGELOG.md | 10 +++ .../package.json | 8 +- plugins/tech-insights-backend/CHANGELOG.md | 9 +++ plugins/tech-insights-backend/package.json | 8 +- plugins/tech-radar/package.json | 10 +-- plugins/techdocs-backend/CHANGELOG.md | 23 ++++++ plugins/techdocs-backend/package.json | 12 +-- plugins/techdocs/CHANGELOG.md | 23 ++++++ plugins/techdocs/package.json | 14 ++-- plugins/todo/package.json | 10 +-- plugins/user-settings/package.json | 10 +-- plugins/xcmetrics/package.json | 10 +-- 157 files changed, 1204 insertions(+), 691 deletions(-) delete mode 100644 .changeset/afraid-chairs-warn.md delete mode 100644 .changeset/big-phones-boil.md delete mode 100644 .changeset/chilly-sloths-sniff.md delete mode 100644 .changeset/curly-points-hide.md delete mode 100644 .changeset/early-dragons-wave.md delete mode 100644 .changeset/eleven-starfishes-exist.md delete mode 100644 .changeset/eleven-suns-type.md delete mode 100644 .changeset/forty-teachers-argue.md delete mode 100644 .changeset/giant-bees-applaud.md delete mode 100644 .changeset/green-bags-hug.md delete mode 100644 .changeset/heavy-tools-hang.md delete mode 100644 .changeset/large-mugs-repair.md delete mode 100644 .changeset/large-pears-agree.md delete mode 100644 .changeset/late-coins-eat.md delete mode 100644 .changeset/light-rabbits-matter.md delete mode 100644 .changeset/many-waves-visit.md delete mode 100644 .changeset/neat-suits-retire.md delete mode 100644 .changeset/olive-pumpkins-burn.md delete mode 100644 .changeset/pretty-trains-appear.md delete mode 100644 .changeset/purple-grapes-attack.md delete mode 100644 .changeset/serious-pens-tease.md delete mode 100644 .changeset/sharp-carrots-press.md delete mode 100644 .changeset/shiny-insects-remember.md delete mode 100644 .changeset/slow-olives-confess.md delete mode 100644 .changeset/smart-fans-complain.md delete mode 100644 .changeset/smooth-vans-boil.md delete mode 100644 .changeset/strong-seahorses-scream.md delete mode 100644 .changeset/thirty-fireants-occur.md delete mode 100644 .changeset/thirty-tigers-refuse.md delete mode 100644 .changeset/weak-berries-sing.md delete mode 100644 .changeset/wet-seas-deliver.md delete mode 100644 .changeset/yellow-apes-brush.md delete mode 100644 .changeset/yellow-pandas-draw.md delete mode 100644 .changeset/young-hats-shop.md delete mode 100644 .changeset/young-sheep-impress.md create mode 100644 plugins/permission-backend/CHANGELOG.md create mode 100644 plugins/permission-common/CHANGELOG.md create mode 100644 plugins/permission-node/CHANGELOG.md create mode 100644 plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md diff --git a/.changeset/afraid-chairs-warn.md b/.changeset/afraid-chairs-warn.md deleted file mode 100644 index 1ae2a7513e..0000000000 --- a/.changeset/afraid-chairs-warn.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/errors': patch ---- - -Deprecate `parseErrorResponse` in favour of `parseErrorResponseBody`. Deprecate `data` field inside `ErrorResponse` in favour of `body`. -Rename the error name for unknown errors from `unknown` to `error`. diff --git a/.changeset/big-phones-boil.md b/.changeset/big-phones-boil.md deleted file mode 100644 index 0ee19f5100..0000000000 --- a/.changeset/big-phones-boil.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-kubernetes-backend': patch -'@backstage/plugin-kubernetes-common': patch ---- - -Include CronJobs and Jobs as default objects returned by the kubernetes backend and add/update relevant types. diff --git a/.changeset/chilly-sloths-sniff.md b/.changeset/chilly-sloths-sniff.md deleted file mode 100644 index b23fb9c7cd..0000000000 --- a/.changeset/chilly-sloths-sniff.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/create-app': patch ---- - -Cleaned out the `peerDependencies` in the published version of the package, making it much quicker to run `npx @backstage/create-app` as it no longer needs to install a long list of unnecessary. diff --git a/.changeset/curly-points-hide.md b/.changeset/curly-points-hide.md deleted file mode 100644 index ba513e5915..0000000000 --- a/.changeset/curly-points-hide.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-tech-insights-backend': patch -'@backstage/plugin-tech-insights-backend-module-jsonfc': patch ---- - -Update README docs to use correct function/parameter names diff --git a/.changeset/early-dragons-wave.md b/.changeset/early-dragons-wave.md deleted file mode 100644 index 641f36a9f3..0000000000 --- a/.changeset/early-dragons-wave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder': patch ---- - -Bump `react-jsonschema-form` diff --git a/.changeset/eleven-starfishes-exist.md b/.changeset/eleven-starfishes-exist.md deleted file mode 100644 index a3139e1d3f..0000000000 --- a/.changeset/eleven-starfishes-exist.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-org': patch ---- - -Use email links in the catalog's members list instead of text to display a member's email diff --git a/.changeset/eleven-suns-type.md b/.changeset/eleven-suns-type.md deleted file mode 100644 index b16f26c968..0000000000 --- a/.changeset/eleven-suns-type.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-jenkins': patch ---- - -Fix Jenkins project table pagination. diff --git a/.changeset/forty-teachers-argue.md b/.changeset/forty-teachers-argue.md deleted file mode 100644 index 2e32719037..0000000000 --- a/.changeset/forty-teachers-argue.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-auth-backend': patch ---- - -Switched to using the standardized JSON error responses for all provider endpoints. diff --git a/.changeset/giant-bees-applaud.md b/.changeset/giant-bees-applaud.md deleted file mode 100644 index c4591dbc64..0000000000 --- a/.changeset/giant-bees-applaud.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Switch the default test coverage provider from the jest default one to `'v8'`, which provides much better coverage information when using the default Backstage test setup. This is considered a bug fix as the current coverage information is often very inaccurate. diff --git a/.changeset/green-bags-hug.md b/.changeset/green-bags-hug.md deleted file mode 100644 index 9d250062f7..0000000000 --- a/.changeset/green-bags-hug.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-kubernetes': patch ---- - -Implement support for formatting OpenShift dashboard url links diff --git a/.changeset/heavy-tools-hang.md b/.changeset/heavy-tools-hang.md deleted file mode 100644 index 0c47202e46..0000000000 --- a/.changeset/heavy-tools-hang.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-permission-node': minor ---- - -New package containing common permission and authorization utilities for backend plugins. For more information, see the [authorization PRFC](https://github.com/backstage/backstage/pull/7761). diff --git a/.changeset/large-mugs-repair.md b/.changeset/large-mugs-repair.md deleted file mode 100644 index 5043fb80e1..0000000000 --- a/.changeset/large-mugs-repair.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Disable ES transforms in tests transformed by the `jestSucraseTransform.js`. This is not considered a breaking change since all code is already transpiled this way in the development setup. diff --git a/.changeset/large-pears-agree.md b/.changeset/large-pears-agree.md deleted file mode 100644 index 60f755eff0..0000000000 --- a/.changeset/large-pears-agree.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/create-app': patch ---- - -DefaultTechDocsCollator is now included in the search backend, and the Search Page updated with the SearchType component that includes the techdocs type diff --git a/.changeset/late-coins-eat.md b/.changeset/late-coins-eat.md deleted file mode 100644 index c23fbc7931..0000000000 --- a/.changeset/late-coins-eat.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-badges': patch ---- - -Fix the path that the Badges client uses towards the `plugin-badges-backend` diff --git a/.changeset/light-rabbits-matter.md b/.changeset/light-rabbits-matter.md deleted file mode 100644 index c75ac7cb21..0000000000 --- a/.changeset/light-rabbits-matter.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': patch ---- - -Switched to executing scaffolder templating in a secure context for any template based on nunjucks, as it is [not secure by default](https://mozilla.github.io/nunjucks/api.html#user-defined-templates-warning). diff --git a/.changeset/many-waves-visit.md b/.changeset/many-waves-visit.md deleted file mode 100644 index 4f4711f371..0000000000 --- a/.changeset/many-waves-visit.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Providing an empty values array in an EntityFilter will now return no matches. diff --git a/.changeset/neat-suits-retire.md b/.changeset/neat-suits-retire.md deleted file mode 100644 index f9c98e0d84..0000000000 --- a/.changeset/neat-suits-retire.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-kafka-backend': patch ---- - -Add ACL requirements for kafka-backend plugin diff --git a/.changeset/olive-pumpkins-burn.md b/.changeset/olive-pumpkins-burn.md deleted file mode 100644 index 3cd9c46267..0000000000 --- a/.changeset/olive-pumpkins-burn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-permission-backend': minor ---- - -New package containing the backend for authorization and permissions. For more information, see the [authorization PRFC](https://github.com/backstage/backstage/pull/7761). diff --git a/.changeset/pretty-trains-appear.md b/.changeset/pretty-trains-appear.md deleted file mode 100644 index 9a7b313524..0000000000 --- a/.changeset/pretty-trains-appear.md +++ /dev/null @@ -1,34 +0,0 @@ ---- -'@backstage/backend-common': patch -'@backstage/cli': patch -'@backstage/core-app-api': patch -'@backstage/create-app': patch -'@backstage/techdocs-common': patch -'@backstage/plugin-auth-backend': patch -'@backstage/plugin-azure-devops-backend': patch -'@backstage/plugin-badges-backend': patch -'@backstage/plugin-bazaar-backend': patch -'@backstage/plugin-catalog-backend': patch -'@backstage/plugin-code-coverage-backend': patch -'@backstage/plugin-github-actions': patch -'@backstage/plugin-jenkins-backend': patch -'@backstage/plugin-proxy-backend': patch -'@backstage/plugin-rollbar-backend': patch -'@backstage/plugin-search-backend': patch -'@backstage/plugin-techdocs': patch -'@backstage/plugin-techdocs-backend': patch ---- - -Change default port of backend from 7000 to 7007. - -This is due to the AirPlay Receiver process occupying port 7000 and preventing local Backstage instances on MacOS to start. - -You can change the port back to 7000 or any other value by providing an `app-config.yaml` with the following values: - -``` -backend: - listen: 0.0.0.0:7123 - baseUrl: http://localhost:7123 -``` - -More information can be found here: https://backstage.io/docs/conf/writing diff --git a/.changeset/purple-grapes-attack.md b/.changeset/purple-grapes-attack.md deleted file mode 100644 index a2a99690e9..0000000000 --- a/.changeset/purple-grapes-attack.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-permission-common': minor ---- - -Accept configApi rather than enabled flag in PermissionClient constructor. diff --git a/.changeset/serious-pens-tease.md b/.changeset/serious-pens-tease.md deleted file mode 100644 index 7759ba3bc0..0000000000 --- a/.changeset/serious-pens-tease.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': patch ---- - -Removed all usages of `path.resolve` in order to ensure that template paths are resolved in a safe way. diff --git a/.changeset/sharp-carrots-press.md b/.changeset/sharp-carrots-press.md deleted file mode 100644 index a7c31d6759..0000000000 --- a/.changeset/sharp-carrots-press.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/plugin-config-schema': patch -'@backstage/plugin-scaffolder': patch ---- - -Fixed a missing `await` when throwing server side errors diff --git a/.changeset/shiny-insects-remember.md b/.changeset/shiny-insects-remember.md deleted file mode 100644 index a26882b65d..0000000000 --- a/.changeset/shiny-insects-remember.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-scaffolder-backend': patch ---- - -Fix bug where there was error log lines written when failing to `JSON.parse` things that were not `JSON` values. diff --git a/.changeset/slow-olives-confess.md b/.changeset/slow-olives-confess.md deleted file mode 100644 index 68b2539157..0000000000 --- a/.changeset/slow-olives-confess.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -'@backstage/core-plugin-api': patch ---- - -Deprecated `register` option of `createPlugin` and the `outputs` methods of the plugin instance. - -Introduces the `featureFlags` property to define your feature flags instead. diff --git a/.changeset/smart-fans-complain.md b/.changeset/smart-fans-complain.md deleted file mode 100644 index db404f110d..0000000000 --- a/.changeset/smart-fans-complain.md +++ /dev/null @@ -1,42 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': minor ---- - -**BREAKING** EntitiesSearchFilter fields have changed. - -EntitiesSearchFilter now has only two fields: `key` and `value`. The `matchValueIn` and `matchValueExists` fields are no longer are supported. Previous filters written using the `matchValueIn` and `matchValueExists` fields can be rewritten as follows: - -Filtering by existence of key only: - -```diff - filter: { - { - key: 'abc', -- matchValueExists: true, - }, - } -``` - -Filtering by key and values: - -```diff - filter: { - { - key: 'abc', -- matchValueExists: true, -- matchValueIn: ['xyz'], -+ values: ['xyz'], - }, - } -``` - -Negation of filters can now be achieved through a `not` object: - -``` -filter: { - not: { - key: 'abc', - values: ['xyz'], - }, -} -``` diff --git a/.changeset/smooth-vans-boil.md b/.changeset/smooth-vans-boil.md deleted file mode 100644 index 39b2ea386f..0000000000 --- a/.changeset/smooth-vans-boil.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Index User entities by displayName to be able to search by full name. Added displayName (if present) to the 'text' field in the indexed document. diff --git a/.changeset/strong-seahorses-scream.md b/.changeset/strong-seahorses-scream.md deleted file mode 100644 index bbd1d44378..0000000000 --- a/.changeset/strong-seahorses-scream.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Added Azure DevOps discovery processor diff --git a/.changeset/thirty-fireants-occur.md b/.changeset/thirty-fireants-occur.md deleted file mode 100644 index dc9348ac6e..0000000000 --- a/.changeset/thirty-fireants-occur.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-catalog-backend': patch ---- - -Detect a duplicate entities when adding locations through dry run diff --git a/.changeset/thirty-tigers-refuse.md b/.changeset/thirty-tigers-refuse.md deleted file mode 100644 index 0797d36747..0000000000 --- a/.changeset/thirty-tigers-refuse.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@backstage/create-app': patch -'@backstage/plugin-scaffolder-backend': patch ---- - -Bump gitbeaker to the latest version diff --git a/.changeset/weak-berries-sing.md b/.changeset/weak-berries-sing.md deleted file mode 100644 index 1b0cb8d719..0000000000 --- a/.changeset/weak-berries-sing.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/cli': patch ---- - -Update the default routes to use id instead of title diff --git a/.changeset/wet-seas-deliver.md b/.changeset/wet-seas-deliver.md deleted file mode 100644 index da5679eb8e..0000000000 --- a/.changeset/wet-seas-deliver.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -'@backstage/core-app-api': patch -'@backstage/test-utils': patch ---- - -The `ApiRegistry` from `@backstage/core-app-api` class has been deprecated and will be removed in a future release. To replace it, we have introduced two new helpers that are exported from `@backstage/test-utils`, namely `TestApiProvider` and `TestApiRegistry`. - -These two new helpers are more tailored for writing tests and development setups, as they allow for partial implementations of each of the APIs. - -When migrating existing code it is typically best to prefer usage of `TestApiProvider` when possible, so for example the following code: - -```tsx -render( - - {...} - -) -``` - -Would be migrated to this: - -```tsx -render( - - {...} - -) -``` - -In cases where the `ApiProvider` is used in a more standalone way, for example to reuse a set of APIs across multiple tests, the `TestApiRegistry` can be used instead. Note that the `TestApiRegistry` only has a single static factory method, `.from()`, and it is slightly different from the existing `.from()` method on `ApiRegistry` in that it doesn't require the API pairs to be wrapped in an outer array. - -Usage that looks like this: - -```ts -const apis = ApiRegistry.with( - identityApiRef, - mockIdentityApi as unknown as IdentityApi, -).with(configApiRef, new ConfigReader({})); -``` - -OR like this: - -```ts -const apis = ApiRegistry.from([ - [identityApiRef, mockIdentityApi as unknown as IdentityApi], - [configApiRef, new ConfigReader({})], -]); -``` - -Would be migrated to this: - -```ts -const apis = TestApiRegistry.from( - [identityApiRef, mockIdentityApi], - [configApiRef, new ConfigReader({})], -); -``` - -If your app is still using the `ApiRegistry` to construct the `apis` for `createApp`, we recommend that you move over to use the new method of supplying API factories instead, using `createApiFactory`. diff --git a/.changeset/yellow-apes-brush.md b/.changeset/yellow-apes-brush.md deleted file mode 100644 index 06b33e97d1..0000000000 --- a/.changeset/yellow-apes-brush.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-api-docs': patch ---- - -Adjusted some styles in the OpenAPI definition, for elements which were barely readable in dark mode. diff --git a/.changeset/yellow-pandas-draw.md b/.changeset/yellow-pandas-draw.md deleted file mode 100644 index 6d4f8116b3..0000000000 --- a/.changeset/yellow-pandas-draw.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/core-components': patch ---- - -Pin sidebar by default for easier navigation diff --git a/.changeset/young-hats-shop.md b/.changeset/young-hats-shop.md deleted file mode 100644 index 4db46cf9d9..0000000000 --- a/.changeset/young-hats-shop.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-cost-insights': patch ---- - -Supply featureFlags using featureFlag config option. diff --git a/.changeset/young-sheep-impress.md b/.changeset/young-sheep-impress.md deleted file mode 100644 index b69447d4d4..0000000000 --- a/.changeset/young-sheep-impress.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@backstage/plugin-graphiql': patch ---- - -Letting GraphiQL use headers diff --git a/packages/backend-common/CHANGELOG.md b/packages/backend-common/CHANGELOG.md index 3ab36cc679..869bf46019 100644 --- a/packages/backend-common/CHANGELOG.md +++ b/packages/backend-common/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/backend-common +## 0.9.11 + +### Patch Changes + +- bab752e2b3: Change default port of backend from 7000 to 7007. + + This is due to the AirPlay Receiver process occupying port 7000 and preventing local Backstage instances on MacOS to start. + + You can change the port back to 7000 or any other value by providing an `app-config.yaml` with the following values: + + ``` + backend: + listen: 0.0.0.0:7123 + baseUrl: http://localhost:7123 + ``` + + More information can be found here: https://backstage.io/docs/conf/writing + +- Updated dependencies + - @backstage/errors@0.1.5 + ## 0.9.10 ### Patch Changes diff --git a/packages/backend-common/package.json b/packages/backend-common/package.json index 9e0187137d..95af7c823d 100644 --- a/packages/backend-common/package.json +++ b/packages/backend-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/backend-common", "description": "Common functionality library for Backstage backends", - "version": "0.9.10", + "version": "0.9.11", "main": "src/index.ts", "types": "src/index.ts", "private": false, @@ -32,7 +32,7 @@ "@backstage/cli-common": "^0.1.6", "@backstage/config": "^0.1.11", "@backstage/config-loader": "^0.8.0", - "@backstage/errors": "^0.1.4", + "@backstage/errors": "^0.1.5", "@backstage/integration": "^0.6.9", "@backstage/types": "^0.1.1", "@google-cloud/storage": "^5.8.0", @@ -80,8 +80,8 @@ } }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/test-utils": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/test-utils": "^0.1.23", "@types/archiver": "^5.1.0", "@types/compression": "^1.7.0", "@types/concat-stream": "^1.6.0", diff --git a/packages/backend/CHANGELOG.md b/packages/backend/CHANGELOG.md index 7cf7d9ddaa..20e0d7885b 100644 --- a/packages/backend/CHANGELOG.md +++ b/packages/backend/CHANGELOG.md @@ -1,5 +1,27 @@ # example-backend +## 0.2.54 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-kubernetes-backend@0.3.19 + - @backstage/plugin-tech-insights-backend@0.1.2 + - @backstage/plugin-tech-insights-backend-module-jsonfc@0.1.1 + - @backstage/plugin-auth-backend@0.4.9 + - @backstage/plugin-scaffolder-backend@0.15.14 + - @backstage/plugin-catalog-backend@0.18.0 + - @backstage/plugin-kafka-backend@0.2.12 + - @backstage/backend-common@0.9.11 + - @backstage/plugin-azure-devops-backend@0.2.2 + - @backstage/plugin-badges-backend@0.1.12 + - @backstage/plugin-code-coverage-backend@0.1.15 + - @backstage/plugin-jenkins-backend@0.1.8 + - @backstage/plugin-proxy-backend@0.2.14 + - @backstage/plugin-rollbar-backend@0.1.16 + - @backstage/plugin-search-backend@0.2.7 + - @backstage/plugin-techdocs-backend@0.10.9 + ## 0.2.52 ### Patch Changes diff --git a/packages/backend/package.json b/packages/backend/package.json index 1cef99c6a0..bf18728b9f 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -1,6 +1,6 @@ { "name": "example-backend", - "version": "0.2.52", + "version": "0.2.54", "main": "dist/index.cjs.js", "types": "src/index.ts", "license": "Apache-2.0", @@ -24,33 +24,33 @@ "migrate:create": "knex migrate:make -x ts" }, "dependencies": { - "@backstage/backend-common": "^0.9.10", + "@backstage/backend-common": "^0.9.11", "@backstage/catalog-client": "^0.5.2", "@backstage/catalog-model": "^0.9.7", "@backstage/config": "^0.1.10", "@backstage/integration": "^0.6.8", "@backstage/plugin-app-backend": "^0.3.19", - "@backstage/plugin-auth-backend": "^0.4.8", - "@backstage/plugin-azure-devops-backend": "^0.2.1", - "@backstage/plugin-badges-backend": "^0.1.11", - "@backstage/plugin-catalog-backend": "^0.17.4", - "@backstage/plugin-code-coverage-backend": "^0.1.14", + "@backstage/plugin-auth-backend": "^0.4.9", + "@backstage/plugin-azure-devops-backend": "^0.2.2", + "@backstage/plugin-badges-backend": "^0.1.12", + "@backstage/plugin-catalog-backend": "^0.18.0", + "@backstage/plugin-code-coverage-backend": "^0.1.15", "@backstage/plugin-graphql-backend": "^0.1.9", - "@backstage/plugin-jenkins-backend": "^0.1.7", - "@backstage/plugin-kubernetes-backend": "^0.3.18", - "@backstage/plugin-kafka-backend": "^0.2.11", - "@backstage/plugin-proxy-backend": "^0.2.13", - "@backstage/plugin-rollbar-backend": "^0.1.15", - "@backstage/plugin-scaffolder-backend": "^0.15.13", + "@backstage/plugin-jenkins-backend": "^0.1.8", + "@backstage/plugin-kubernetes-backend": "^0.3.19", + "@backstage/plugin-kafka-backend": "^0.2.12", + "@backstage/plugin-proxy-backend": "^0.2.14", + "@backstage/plugin-rollbar-backend": "^0.1.16", + "@backstage/plugin-scaffolder-backend": "^0.15.14", "@backstage/plugin-scaffolder-backend-module-rails": "^0.1.7", - "@backstage/plugin-search-backend": "^0.2.6", + "@backstage/plugin-search-backend": "^0.2.7", "@backstage/plugin-search-backend-node": "^0.4.2", "@backstage/plugin-search-backend-module-elasticsearch": "^0.0.5", "@backstage/plugin-search-backend-module-pg": "^0.2.1", - "@backstage/plugin-techdocs-backend": "^0.10.8", - "@backstage/plugin-tech-insights-backend": "^0.1.1", + "@backstage/plugin-techdocs-backend": "^0.10.9", + "@backstage/plugin-tech-insights-backend": "^0.1.2", "@backstage/plugin-tech-insights-node": "^0.1.0", - "@backstage/plugin-tech-insights-backend-module-jsonfc": "^0.1.0", + "@backstage/plugin-tech-insights-backend-module-jsonfc": "^0.1.1", "@backstage/plugin-todo-backend": "^0.1.13", "@gitbeaker/node": "^34.6.0", "@octokit/rest": "^18.5.3", @@ -68,7 +68,7 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/cli": "^0.9.0", + "@backstage/cli": "^0.9.1", "@types/dockerode": "^3.3.0", "@types/express": "^4.17.6", "@types/express-serve-static-core": "^4.17.5" diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 407c4fcbf2..ed8525a2cc 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/cli +## 0.9.1 + +### Patch Changes + +- dde216acf4: Switch the default test coverage provider from the jest default one to `'v8'`, which provides much better coverage information when using the default Backstage test setup. This is considered a bug fix as the current coverage information is often very inaccurate. +- 719cc87d2f: Disable ES transforms in tests transformed by the `jestSucraseTransform.js`. This is not considered a breaking change since all code is already transpiled this way in the development setup. +- bab752e2b3: Change default port of backend from 7000 to 7007. + + This is due to the AirPlay Receiver process occupying port 7000 and preventing local Backstage instances on MacOS to start. + + You can change the port back to 7000 or any other value by providing an `app-config.yaml` with the following values: + + ``` + backend: + listen: 0.0.0.0:7123 + baseUrl: http://localhost:7123 + ``` + + More information can be found here: https://backstage.io/docs/conf/writing + +- ee055cf6db: Update the default routes to use id instead of title +- Updated dependencies + - @backstage/errors@0.1.5 + ## 0.9.0 ### Minor Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 1eed5a742c..90ed1103fc 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/cli", "description": "CLI for developing Backstage plugins and apps", - "version": "0.9.0", + "version": "0.9.1", "private": false, "publishConfig": { "access": "public" @@ -31,7 +31,7 @@ "@backstage/cli-common": "^0.1.6", "@backstage/config": "^0.1.11", "@backstage/config-loader": "^0.8.0", - "@backstage/errors": "^0.1.4", + "@backstage/errors": "^0.1.5", "@backstage/types": "^0.1.1", "@hot-loader/react-dom": "^16.13.0", "@lerna/package-graph": "^4.0.0", @@ -117,13 +117,13 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/backend-common": "^0.9.10", + "@backstage/backend-common": "^0.9.11", "@backstage/config": "^0.1.11", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", - "@backstage/core-app-api": "^0.1.21", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@backstage/theme": "^0.2.13", "@types/diff": "^5.0.0", "@types/express": "^4.17.6", diff --git a/packages/codemods/CHANGELOG.md b/packages/codemods/CHANGELOG.md index bf0711ad6f..8c484fe2ac 100644 --- a/packages/codemods/CHANGELOG.md +++ b/packages/codemods/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/codemods +## 0.1.23 + +### Patch Changes + +- Updated dependencies + - @backstage/core-app-api@0.1.23 + - @backstage/core-plugin-api@0.2.1 + - @backstage/core-components@0.7.5 + ## 0.1.22 ### Patch Changes diff --git a/packages/codemods/package.json b/packages/codemods/package.json index bfb8d4d4b3..e95367a5ac 100644 --- a/packages/codemods/package.json +++ b/packages/codemods/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/codemods", "description": "A collection of codemods for Backstage projects", - "version": "0.1.22", + "version": "0.1.23", "private": false, "publishConfig": { "access": "public", diff --git a/packages/core-app-api/CHANGELOG.md b/packages/core-app-api/CHANGELOG.md index b1d590a7bd..ad71ad6fe2 100644 --- a/packages/core-app-api/CHANGELOG.md +++ b/packages/core-app-api/CHANGELOG.md @@ -1,5 +1,86 @@ # @backstage/core-app-api +## 0.1.23 + +### Patch Changes + +- bab752e2b3: Change default port of backend from 7000 to 7007. + + This is due to the AirPlay Receiver process occupying port 7000 and preventing local Backstage instances on MacOS to start. + + You can change the port back to 7000 or any other value by providing an `app-config.yaml` with the following values: + + ``` + backend: + listen: 0.0.0.0:7123 + baseUrl: http://localhost:7123 + ``` + + More information can be found here: https://backstage.io/docs/conf/writing + +- 000190de69: The `ApiRegistry` from `@backstage/core-app-api` class has been deprecated and will be removed in a future release. To replace it, we have introduced two new helpers that are exported from `@backstage/test-utils`, namely `TestApiProvider` and `TestApiRegistry`. + + These two new helpers are more tailored for writing tests and development setups, as they allow for partial implementations of each of the APIs. + + When migrating existing code it is typically best to prefer usage of `TestApiProvider` when possible, so for example the following code: + + ```tsx + render( + + {...} + + ) + ``` + + Would be migrated to this: + + ```tsx + render( + + {...} + + ) + ``` + + In cases where the `ApiProvider` is used in a more standalone way, for example to reuse a set of APIs across multiple tests, the `TestApiRegistry` can be used instead. Note that the `TestApiRegistry` only has a single static factory method, `.from()`, and it is slightly different from the existing `.from()` method on `ApiRegistry` in that it doesn't require the API pairs to be wrapped in an outer array. + + Usage that looks like this: + + ```ts + const apis = ApiRegistry.with( + identityApiRef, + mockIdentityApi as unknown as IdentityApi, + ).with(configApiRef, new ConfigReader({})); + ``` + + OR like this: + + ```ts + const apis = ApiRegistry.from([ + [identityApiRef, mockIdentityApi as unknown as IdentityApi], + [configApiRef, new ConfigReader({})], + ]); + ``` + + Would be migrated to this: + + ```ts + const apis = TestApiRegistry.from( + [identityApiRef, mockIdentityApi], + [configApiRef, new ConfigReader({})], + ); + ``` + + If your app is still using the `ApiRegistry` to construct the `apis` for `createApp`, we recommend that you move over to use the new method of supplying API factories instead, using `createApiFactory`. + +- Updated dependencies + - @backstage/core-plugin-api@0.2.1 + - @backstage/core-components@0.7.5 + ## 0.1.22 ### Patch Changes diff --git a/packages/core-app-api/package.json b/packages/core-app-api/package.json index 96c021b1ee..6777088b68 100644 --- a/packages/core-app-api/package.json +++ b/packages/core-app-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core-app-api", "description": "Core app API used by Backstage apps", - "version": "0.1.22", + "version": "0.1.23", "private": false, "publishConfig": { "access": "public", @@ -30,9 +30,9 @@ }, "dependencies": { "@backstage/app-defaults": "^0.1.1", - "@backstage/core-components": "^0.7.4", + "@backstage/core-components": "^0.7.5", "@backstage/config": "^0.1.11", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/theme": "^0.2.13", "@backstage/types": "^0.1.1", "@backstage/version-bridge": "^0.1.0", @@ -47,8 +47,8 @@ "zen-observable": "^0.8.15" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/test-utils": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/react-hooks": "^7.0.2", diff --git a/packages/core-components/CHANGELOG.md b/packages/core-components/CHANGELOG.md index c62ba9e90d..b4898fa82b 100644 --- a/packages/core-components/CHANGELOG.md +++ b/packages/core-components/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/core-components +## 0.7.5 + +### Patch Changes + +- 157530187a: Pin sidebar by default for easier navigation +- Updated dependencies + - @backstage/errors@0.1.5 + - @backstage/core-plugin-api@0.2.1 + ## 0.7.4 ### Patch Changes diff --git a/packages/core-components/package.json b/packages/core-components/package.json index afa9af0341..896295038c 100644 --- a/packages/core-components/package.json +++ b/packages/core-components/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core-components", "description": "Core components used by Backstage plugins and apps", - "version": "0.7.4", + "version": "0.7.5", "private": false, "publishConfig": { "access": "public", @@ -30,8 +30,8 @@ }, "dependencies": { "@backstage/config": "^0.1.11", - "@backstage/core-plugin-api": "^0.2.0", - "@backstage/errors": "^0.1.4", + "@backstage/core-plugin-api": "^0.2.1", + "@backstage/errors": "^0.1.5", "@backstage/theme": "^0.2.13", "@material-table/core": "^3.1.0", "@material-ui/core": "^4.12.2", @@ -67,9 +67,9 @@ "zen-observable": "^0.8.15" }, "devDependencies": { - "@backstage/core-app-api": "^0.1.21", - "@backstage/cli": "^0.9.0", - "@backstage/test-utils": "^0.1.22", + "@backstage/core-app-api": "^0.1.23", + "@backstage/cli": "^0.9.1", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/react-hooks": "^7.0.2", diff --git a/packages/core-plugin-api/CHANGELOG.md b/packages/core-plugin-api/CHANGELOG.md index a8d35e5a14..0022c99c68 100644 --- a/packages/core-plugin-api/CHANGELOG.md +++ b/packages/core-plugin-api/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/core-plugin-api +## 0.2.1 + +### Patch Changes + +- 950b36393c: Deprecated `register` option of `createPlugin` and the `outputs` methods of the plugin instance. + + Introduces the `featureFlags` property to define your feature flags instead. + ## 0.2.0 ### Minor Changes diff --git a/packages/core-plugin-api/package.json b/packages/core-plugin-api/package.json index e5b4572dff..b6567dcb89 100644 --- a/packages/core-plugin-api/package.json +++ b/packages/core-plugin-api/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/core-plugin-api", "description": "Core API used by Backstage plugins", - "version": "0.2.0", + "version": "0.2.1", "private": false, "publishConfig": { "access": "public", @@ -43,9 +43,9 @@ "zen-observable": "^0.8.15" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.21", - "@backstage/test-utils": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/react-hooks": "^7.0.2", diff --git a/packages/create-app/CHANGELOG.md b/packages/create-app/CHANGELOG.md index af1fd58ead..97a5ef9588 100644 --- a/packages/create-app/CHANGELOG.md +++ b/packages/create-app/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/create-app +## 0.4.5 + +### Patch Changes + +- dcaeaac174: Cleaned out the `peerDependencies` in the published version of the package, making it much quicker to run `npx @backstage/create-app` as it no longer needs to install a long list of unnecessary. +- a5a5d7e1f1: DefaultTechDocsCollator is now included in the search backend, and the Search Page updated with the SearchType component that includes the techdocs type +- bab752e2b3: Change default port of backend from 7000 to 7007. + + This is due to the AirPlay Receiver process occupying port 7000 and preventing local Backstage instances on MacOS to start. + + You can change the port back to 7000 or any other value by providing an `app-config.yaml` with the following values: + + ``` + backend: + listen: 0.0.0.0:7123 + baseUrl: http://localhost:7123 + ``` + + More information can be found here: https://backstage.io/docs/conf/writing + +- 42ebbc18c0: Bump gitbeaker to the latest version + ## 0.4.4 ### Patch Changes diff --git a/packages/create-app/package.json b/packages/create-app/package.json index 32d72b5ffb..49f6e87376 100644 --- a/packages/create-app/package.json +++ b/packages/create-app/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/create-app", "description": "A CLI that helps you create your own Backstage app", - "version": "0.4.4", + "version": "0.4.5", "private": false, "publishConfig": { "access": "public" diff --git a/packages/errors/CHANGELOG.md b/packages/errors/CHANGELOG.md index 9ea2f47cbb..02b28cdf1d 100644 --- a/packages/errors/CHANGELOG.md +++ b/packages/errors/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/errors +## 0.1.5 + +### Patch Changes + +- 4d09c60256: Deprecate `parseErrorResponse` in favour of `parseErrorResponseBody`. Deprecate `data` field inside `ErrorResponse` in favour of `body`. + Rename the error name for unknown errors from `unknown` to `error`. + ## 0.1.4 ### Patch Changes diff --git a/packages/errors/package.json b/packages/errors/package.json index 38fe6c634e..f49451a6a8 100644 --- a/packages/errors/package.json +++ b/packages/errors/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/errors", "description": "Common utilities for error handling within Backstage", - "version": "0.1.4", + "version": "0.1.5", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -35,7 +35,7 @@ "serialize-error": "^8.0.1" }, "devDependencies": { - "@backstage/cli": "^0.9.0", + "@backstage/cli": "^0.9.1", "@types/jest": "^26.0.7" }, "files": [ diff --git a/packages/techdocs-common/CHANGELOG.md b/packages/techdocs-common/CHANGELOG.md index 0207ea409d..386c584196 100644 --- a/packages/techdocs-common/CHANGELOG.md +++ b/packages/techdocs-common/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/techdocs-common +## 0.10.8 + +### Patch Changes + +- bab752e2b3: Change default port of backend from 7000 to 7007. + + This is due to the AirPlay Receiver process occupying port 7000 and preventing local Backstage instances on MacOS to start. + + You can change the port back to 7000 or any other value by providing an `app-config.yaml` with the following values: + + ``` + backend: + listen: 0.0.0.0:7123 + baseUrl: http://localhost:7123 + ``` + + More information can be found here: https://backstage.io/docs/conf/writing + +- Updated dependencies + - @backstage/errors@0.1.5 + - @backstage/backend-common@0.9.11 + ## 0.10.7 ### Patch Changes diff --git a/packages/techdocs-common/package.json b/packages/techdocs-common/package.json index b13b94a1a7..3f0d0edf5b 100644 --- a/packages/techdocs-common/package.json +++ b/packages/techdocs-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/techdocs-common", "description": "Common functionalities for TechDocs, to be shared between techdocs-backend plugin and techdocs-cli", - "version": "0.10.7", + "version": "0.10.8", "main": "src/index.ts", "types": "src/index.ts", "private": false, @@ -38,10 +38,10 @@ "dependencies": { "@azure/identity": "^1.5.0", "@azure/storage-blob": "^12.5.0", - "@backstage/backend-common": "^0.9.10", + "@backstage/backend-common": "^0.9.11", "@backstage/catalog-model": "^0.9.7", "@backstage/config": "^0.1.11", - "@backstage/errors": "^0.1.4", + "@backstage/errors": "^0.1.5", "@backstage/search-common": "^0.2.1", "@backstage/integration": "^0.6.9", "@google-cloud/storage": "^5.6.0", @@ -60,7 +60,7 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/cli": "^0.9.0", + "@backstage/cli": "^0.9.1", "@types/fs-extra": "^9.0.5", "@types/js-yaml": "^4.0.0", "@types/mime-types": "^2.1.0", diff --git a/packages/test-utils/CHANGELOG.md b/packages/test-utils/CHANGELOG.md index 3460e6c714..fd8ce852db 100644 --- a/packages/test-utils/CHANGELOG.md +++ b/packages/test-utils/CHANGELOG.md @@ -1,5 +1,72 @@ # @backstage/test-utils +## 0.1.23 + +### Patch Changes + +- 000190de69: The `ApiRegistry` from `@backstage/core-app-api` class has been deprecated and will be removed in a future release. To replace it, we have introduced two new helpers that are exported from `@backstage/test-utils`, namely `TestApiProvider` and `TestApiRegistry`. + + These two new helpers are more tailored for writing tests and development setups, as they allow for partial implementations of each of the APIs. + + When migrating existing code it is typically best to prefer usage of `TestApiProvider` when possible, so for example the following code: + + ```tsx + render( + + {...} + + ) + ``` + + Would be migrated to this: + + ```tsx + render( + + {...} + + ) + ``` + + In cases where the `ApiProvider` is used in a more standalone way, for example to reuse a set of APIs across multiple tests, the `TestApiRegistry` can be used instead. Note that the `TestApiRegistry` only has a single static factory method, `.from()`, and it is slightly different from the existing `.from()` method on `ApiRegistry` in that it doesn't require the API pairs to be wrapped in an outer array. + + Usage that looks like this: + + ```ts + const apis = ApiRegistry.with( + identityApiRef, + mockIdentityApi as unknown as IdentityApi, + ).with(configApiRef, new ConfigReader({})); + ``` + + OR like this: + + ```ts + const apis = ApiRegistry.from([ + [identityApiRef, mockIdentityApi as unknown as IdentityApi], + [configApiRef, new ConfigReader({})], + ]); + ``` + + Would be migrated to this: + + ```ts + const apis = TestApiRegistry.from( + [identityApiRef, mockIdentityApi], + [configApiRef, new ConfigReader({})], + ); + ``` + + If your app is still using the `ApiRegistry` to construct the `apis` for `createApp`, we recommend that you move over to use the new method of supplying API factories instead, using `createApiFactory`. + +- Updated dependencies + - @backstage/core-app-api@0.1.23 + - @backstage/core-plugin-api@0.2.1 + ## 0.1.22 ### Patch Changes diff --git a/packages/test-utils/package.json b/packages/test-utils/package.json index 79667c236a..7e684adbfc 100644 --- a/packages/test-utils/package.json +++ b/packages/test-utils/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/test-utils", "description": "Utilities to test Backstage plugins and apps.", - "version": "0.1.22", + "version": "0.1.23", "private": false, "publishConfig": { "access": "public", @@ -29,8 +29,8 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/core-app-api": "^0.1.21", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-app-api": "^0.1.23", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/theme": "^0.2.13", "@backstage/types": "^0.1.1", "@material-ui/core": "^4.12.2", @@ -46,7 +46,7 @@ "zen-observable": "^0.8.15" }, "devDependencies": { - "@backstage/cli": "^0.9.0", + "@backstage/cli": "^0.9.1", "@types/jest": "^26.0.7", "@types/node": "^14.14.32" }, diff --git a/plugins/allure/package.json b/plugins/allure/package.json index 9efe6132e8..33fc4db9d9 100644 --- a/plugins/allure/package.json +++ b/plugins/allure/package.json @@ -23,8 +23,8 @@ }, "dependencies": { "@backstage/catalog-model": "^0.9.7", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/plugin-catalog-react": "^0.6.4", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", @@ -36,10 +36,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/analytics-module-ga/package.json b/plugins/analytics-module-ga/package.json index e0a32960c5..ffd6dd364c 100644 --- a/plugins/analytics-module-ga/package.json +++ b/plugins/analytics-module-ga/package.json @@ -22,8 +22,8 @@ }, "dependencies": { "@backstage/config": "^0.1.5", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -34,10 +34,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/api-docs/CHANGELOG.md b/plugins/api-docs/CHANGELOG.md index 0b0bd4890c..c880dc983c 100644 --- a/plugins/api-docs/CHANGELOG.md +++ b/plugins/api-docs/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-api-docs +## 0.6.15 + +### Patch Changes + +- c982fc12cb: Adjusted some styles in the OpenAPI definition, for elements which were barely readable in dark mode. +- Updated dependencies + - @backstage/core-plugin-api@0.2.1 + - @backstage/core-components@0.7.5 + ## 0.6.14 ### Patch Changes diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index a4aa15c419..9f8b5fbf84 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-api-docs", "description": "A Backstage plugin that helps represent API entities in the frontend", - "version": "0.6.14", + "version": "0.6.15", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -32,8 +32,8 @@ "dependencies": { "@asyncapi/react-component": "^0.23.0", "@backstage/catalog-model": "^0.9.7", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/plugin-catalog": "^0.7.3", "@backstage/plugin-catalog-react": "^0.6.4", "@backstage/theme": "^0.2.13", @@ -53,10 +53,10 @@ "swagger-ui-react": "^4.0.0-rc.3" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/auth-backend/CHANGELOG.md b/plugins/auth-backend/CHANGELOG.md index 5dc0cdb861..38eaf268e6 100644 --- a/plugins/auth-backend/CHANGELOG.md +++ b/plugins/auth-backend/CHANGELOG.md @@ -1,5 +1,29 @@ # @backstage/plugin-auth-backend +## 0.4.9 + +### Patch Changes + +- 9312572360: Switched to using the standardized JSON error responses for all provider endpoints. +- bab752e2b3: Change default port of backend from 7000 to 7007. + + This is due to the AirPlay Receiver process occupying port 7000 and preventing local Backstage instances on MacOS to start. + + You can change the port back to 7000 or any other value by providing an `app-config.yaml` with the following values: + + ``` + backend: + listen: 0.0.0.0:7123 + baseUrl: http://localhost:7123 + ``` + + More information can be found here: https://backstage.io/docs/conf/writing + +- Updated dependencies + - @backstage/errors@0.1.5 + - @backstage/backend-common@0.9.11 + - @backstage/test-utils@0.1.23 + ## 0.4.8 ### Patch Changes diff --git a/plugins/auth-backend/package.json b/plugins/auth-backend/package.json index 3a9e8102eb..2695f0180c 100644 --- a/plugins/auth-backend/package.json +++ b/plugins/auth-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-auth-backend", "description": "A Backstage backend plugin that handles authentication", - "version": "0.4.8", + "version": "0.4.9", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -30,12 +30,12 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/backend-common": "^0.9.10", + "@backstage/backend-common": "^0.9.11", "@backstage/catalog-client": "^0.5.2", "@backstage/catalog-model": "^0.9.7", "@backstage/config": "^0.1.11", - "@backstage/errors": "^0.1.4", - "@backstage/test-utils": "^0.1.22", + "@backstage/errors": "^0.1.5", + "@backstage/test-utils": "^0.1.23", "@google-cloud/firestore": "^4.15.1", "@types/express": "^4.17.6", "@types/passport": "^1.0.3", @@ -73,7 +73,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.9.0", + "@backstage/cli": "^0.9.1", "@types/body-parser": "^1.19.0", "@types/cookie-parser": "^1.4.2", "@types/express-session": "^1.17.2", diff --git a/plugins/azure-devops-backend/CHANGELOG.md b/plugins/azure-devops-backend/CHANGELOG.md index 06fc4833c4..26c64b3f9d 100644 --- a/plugins/azure-devops-backend/CHANGELOG.md +++ b/plugins/azure-devops-backend/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-azure-devops-backend +## 0.2.2 + +### Patch Changes + +- bab752e2b3: Change default port of backend from 7000 to 7007. + + This is due to the AirPlay Receiver process occupying port 7000 and preventing local Backstage instances on MacOS to start. + + You can change the port back to 7000 or any other value by providing an `app-config.yaml` with the following values: + + ``` + backend: + listen: 0.0.0.0:7123 + baseUrl: http://localhost:7123 + ``` + + More information can be found here: https://backstage.io/docs/conf/writing + +- Updated dependencies + - @backstage/backend-common@0.9.11 + ## 0.2.1 ### Patch Changes diff --git a/plugins/azure-devops-backend/package.json b/plugins/azure-devops-backend/package.json index 6d213cbce6..12f62355dd 100644 --- a/plugins/azure-devops-backend/package.json +++ b/plugins/azure-devops-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-azure-devops-backend", - "version": "0.2.1", + "version": "0.2.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -20,7 +20,7 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/backend-common": "^0.9.10", + "@backstage/backend-common": "^0.9.11", "@backstage/config": "^0.1.11", "@backstage/plugin-azure-devops-common": "^0.1.0", "@types/express": "^4.17.6", @@ -31,7 +31,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.9.0", + "@backstage/cli": "^0.9.1", "@types/supertest": "^2.0.8", "supertest": "^4.0.2", "msw": "^0.35.0" diff --git a/plugins/azure-devops/package.json b/plugins/azure-devops/package.json index 9d235b0641..2badcf63b5 100644 --- a/plugins/azure-devops/package.json +++ b/plugins/azure-devops/package.json @@ -28,8 +28,8 @@ }, "dependencies": { "@backstage/catalog-model": "^0.9.7", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/errors": "^0.1.4", "@backstage/plugin-azure-devops-common": "^0.1.0", "@backstage/plugin-catalog-react": "^0.6.4", @@ -45,10 +45,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/badges-backend/CHANGELOG.md b/plugins/badges-backend/CHANGELOG.md index 5cd063d960..736d079969 100644 --- a/plugins/badges-backend/CHANGELOG.md +++ b/plugins/badges-backend/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-badges-backend +## 0.1.12 + +### Patch Changes + +- bab752e2b3: Change default port of backend from 7000 to 7007. + + This is due to the AirPlay Receiver process occupying port 7000 and preventing local Backstage instances on MacOS to start. + + You can change the port back to 7000 or any other value by providing an `app-config.yaml` with the following values: + + ``` + backend: + listen: 0.0.0.0:7123 + baseUrl: http://localhost:7123 + ``` + + More information can be found here: https://backstage.io/docs/conf/writing + +- Updated dependencies + - @backstage/errors@0.1.5 + - @backstage/backend-common@0.9.11 + ## 0.1.11 ### Patch Changes diff --git a/plugins/badges-backend/package.json b/plugins/badges-backend/package.json index 2186c8d52e..48959433df 100644 --- a/plugins/badges-backend/package.json +++ b/plugins/badges-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-badges-backend", "description": "A Backstage backend plugin that generates README badges for your entities", - "version": "0.1.11", + "version": "0.1.12", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -31,11 +31,11 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/backend-common": "^0.9.10", + "@backstage/backend-common": "^0.9.11", "@backstage/catalog-client": "^0.5.2", "@backstage/catalog-model": "^0.9.7", "@backstage/config": "^0.1.10", - "@backstage/errors": "^0.1.3", + "@backstage/errors": "^0.1.5", "@types/express": "^4.17.6", "badge-maker": "^3.3.0", "cors": "^2.8.5", @@ -46,7 +46,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.9.0", + "@backstage/cli": "^0.9.1", "@types/supertest": "^2.0.8", "supertest": "^6.1.3" }, diff --git a/plugins/badges/CHANGELOG.md b/plugins/badges/CHANGELOG.md index 44bc597d0a..449352f87b 100644 --- a/plugins/badges/CHANGELOG.md +++ b/plugins/badges/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-badges +## 0.2.15 + +### Patch Changes + +- 4149d74c10: Fix the path that the Badges client uses towards the `plugin-badges-backend` +- Updated dependencies + - @backstage/errors@0.1.5 + - @backstage/core-plugin-api@0.2.1 + - @backstage/core-components@0.7.5 + ## 0.2.14 ### Patch Changes diff --git a/plugins/badges/package.json b/plugins/badges/package.json index 4d02d64237..be38144ada 100644 --- a/plugins/badges/package.json +++ b/plugins/badges/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-badges", "description": "A Backstage plugin that generates README badges for your entities", - "version": "0.2.14", + "version": "0.2.15", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -28,9 +28,9 @@ }, "dependencies": { "@backstage/catalog-model": "^0.9.7", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", - "@backstage/errors": "^0.1.3", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", + "@backstage/errors": "^0.1.5", "@backstage/plugin-catalog-react": "^0.6.4", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", @@ -42,10 +42,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/bazaar-backend/CHANGELOG.md b/plugins/bazaar-backend/CHANGELOG.md index 88e646b5e3..812ae8f5e3 100644 --- a/plugins/bazaar-backend/CHANGELOG.md +++ b/plugins/bazaar-backend/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-bazaar-backend +## 0.1.3 + +### Patch Changes + +- bab752e2b3: Change default port of backend from 7000 to 7007. + + This is due to the AirPlay Receiver process occupying port 7000 and preventing local Backstage instances on MacOS to start. + + You can change the port back to 7000 or any other value by providing an `app-config.yaml` with the following values: + + ``` + backend: + listen: 0.0.0.0:7123 + baseUrl: http://localhost:7123 + ``` + + More information can be found here: https://backstage.io/docs/conf/writing + +- Updated dependencies + - @backstage/backend-common@0.9.11 + ## 0.1.2 ### Patch Changes diff --git a/plugins/bazaar-backend/package.json b/plugins/bazaar-backend/package.json index a6610493e2..9c6426fcba 100644 --- a/plugins/bazaar-backend/package.json +++ b/plugins/bazaar-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-bazaar-backend", - "version": "0.1.2", + "version": "0.1.3", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -20,7 +20,7 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/backend-common": "^0.9.10", + "@backstage/backend-common": "^0.9.11", "@backstage/backend-test-utils": "^0.1.9", "@backstage/config": "^0.1.5", "@types/express": "^4.17.6", @@ -31,7 +31,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.9.0" + "@backstage/cli": "^0.9.1" }, "files": [ "dist", diff --git a/plugins/bazaar/package.json b/plugins/bazaar/package.json index fd07a3b5c7..bb45a7b974 100644 --- a/plugins/bazaar/package.json +++ b/plugins/bazaar/package.json @@ -23,16 +23,16 @@ "dependencies": { "@backstage/catalog-model": "^0.9.7", "@backstage/cli": "^0.9.0", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/plugin-catalog": "^0.7.3", "@backstage/plugin-catalog-react": "^0.6.4", + "@date-io/luxon": "1.x", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.57", "@material-ui/pickers": "^3.3.10", "@testing-library/jest-dom": "^5.10.1", - "@date-io/luxon": "1.x", "luxon": "^2.0.2", "react": "^16.13.1", "react-dom": "^16.13.1", @@ -41,7 +41,7 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", + "@backstage/cli": "^0.9.1", "@backstage/dev-utils": "^0.2.13", "@testing-library/jest-dom": "^5.10.1", "cross-fetch": "^3.0.6" diff --git a/plugins/bitrise/package.json b/plugins/bitrise/package.json index 92cd9693e1..cc8f29c388 100644 --- a/plugins/bitrise/package.json +++ b/plugins/bitrise/package.json @@ -22,8 +22,8 @@ }, "dependencies": { "@backstage/catalog-model": "^0.9.7", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/plugin-catalog-react": "^0.6.4", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", @@ -39,10 +39,10 @@ "recharts": "^1.8.5" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/catalog-backend-module-ldap/CHANGELOG.md b/plugins/catalog-backend-module-ldap/CHANGELOG.md index a776f3f329..9e769af873 100644 --- a/plugins/catalog-backend-module-ldap/CHANGELOG.md +++ b/plugins/catalog-backend-module-ldap/CHANGELOG.md @@ -1,5 +1,13 @@ # @backstage/plugin-catalog-backend-module-ldap +## 0.3.7 + +### Patch Changes + +- Updated dependencies + - @backstage/errors@0.1.5 + - @backstage/plugin-catalog-backend@0.18.0 + ## 0.3.6 ### Patch Changes diff --git a/plugins/catalog-backend-module-ldap/package.json b/plugins/catalog-backend-module-ldap/package.json index 5e3cec24d9..36cacb6660 100644 --- a/plugins/catalog-backend-module-ldap/package.json +++ b/plugins/catalog-backend-module-ldap/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-ldap", "description": "A Backstage catalog backend modules that helps integrate towards LDAP", - "version": "0.3.6", + "version": "0.3.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -31,8 +31,8 @@ "dependencies": { "@backstage/catalog-model": "^0.9.7", "@backstage/config": "^0.1.11", - "@backstage/errors": "^0.1.4", - "@backstage/plugin-catalog-backend": "^0.17.4", + "@backstage/errors": "^0.1.5", + "@backstage/plugin-catalog-backend": "^0.18.0", "@backstage/types": "^0.1.1", "@types/ldapjs": "^2.2.0", "ldapjs": "^2.2.0", @@ -40,7 +40,7 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/cli": "^0.9.0", + "@backstage/cli": "^0.9.1", "@types/lodash": "^4.14.151" }, "files": [ diff --git a/plugins/catalog-backend-module-msgraph/CHANGELOG.md b/plugins/catalog-backend-module-msgraph/CHANGELOG.md index ee8aa49065..c2225b8945 100644 --- a/plugins/catalog-backend-module-msgraph/CHANGELOG.md +++ b/plugins/catalog-backend-module-msgraph/CHANGELOG.md @@ -1,5 +1,12 @@ # @backstage/plugin-catalog-backend-module-msgraph +## 0.2.10 + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-catalog-backend@0.18.0 + ## 0.2.9 ### Patch Changes diff --git a/plugins/catalog-backend-module-msgraph/package.json b/plugins/catalog-backend-module-msgraph/package.json index 222f56b022..2834b3d1d5 100644 --- a/plugins/catalog-backend-module-msgraph/package.json +++ b/plugins/catalog-backend-module-msgraph/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend-module-msgraph", "description": "A Backstage catalog backend modules that helps integrate towards Microsoft Graph", - "version": "0.2.9", + "version": "0.2.10", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -32,7 +32,7 @@ "@azure/msal-node": "^1.1.0", "@backstage/catalog-model": "^0.9.7", "@backstage/config": "^0.1.10", - "@backstage/plugin-catalog-backend": "^0.17.4", + "@backstage/plugin-catalog-backend": "^0.18.0", "@microsoft/microsoft-graph-types": "^2.6.0", "cross-fetch": "^3.0.6", "lodash": "^4.17.21", @@ -41,9 +41,9 @@ "qs": "^6.9.4" }, "devDependencies": { - "@backstage/backend-common": "^0.9.10", - "@backstage/cli": "^0.9.0", - "@backstage/test-utils": "^0.1.22", + "@backstage/backend-common": "^0.9.11", + "@backstage/cli": "^0.9.1", + "@backstage/test-utils": "^0.1.23", "@types/lodash": "^4.14.151", "msw": "^0.35.0" }, diff --git a/plugins/catalog-backend/CHANGELOG.md b/plugins/catalog-backend/CHANGELOG.md index 92b57f3483..ce19314a50 100644 --- a/plugins/catalog-backend/CHANGELOG.md +++ b/plugins/catalog-backend/CHANGELOG.md @@ -1,5 +1,72 @@ # @backstage/plugin-catalog-backend +## 0.18.0 + +### Minor Changes + +- 7f82ce9f51: **BREAKING** EntitiesSearchFilter fields have changed. + + EntitiesSearchFilter now has only two fields: `key` and `value`. The `matchValueIn` and `matchValueExists` fields are no longer are supported. Previous filters written using the `matchValueIn` and `matchValueExists` fields can be rewritten as follows: + + Filtering by existence of key only: + + ```diff + filter: { + { + key: 'abc', + - matchValueExists: true, + }, + } + ``` + + Filtering by key and values: + + ```diff + filter: { + { + key: 'abc', + - matchValueExists: true, + - matchValueIn: ['xyz'], + + values: ['xyz'], + }, + } + ``` + + Negation of filters can now be achieved through a `not` object: + + ``` + filter: { + not: { + key: 'abc', + values: ['xyz'], + }, + } + ``` + +### Patch Changes + +- 740f958290: Providing an empty values array in an EntityFilter will now return no matches. +- bab752e2b3: Change default port of backend from 7000 to 7007. + + This is due to the AirPlay Receiver process occupying port 7000 and preventing local Backstage instances on MacOS to start. + + You can change the port back to 7000 or any other value by providing an `app-config.yaml` with the following values: + + ``` + backend: + listen: 0.0.0.0:7123 + baseUrl: http://localhost:7123 + ``` + + More information can be found here: https://backstage.io/docs/conf/writing + +- eddb82ab7c: Index User entities by displayName to be able to search by full name. Added displayName (if present) to the 'text' field in the indexed document. +- 563b039f0b: Added Azure DevOps discovery processor +- 8866b62f3d: Detect a duplicate entities when adding locations through dry run +- Updated dependencies + - @backstage/errors@0.1.5 + - @backstage/backend-common@0.9.11 + ## 0.17.4 ### Patch Changes diff --git a/plugins/catalog-backend/package.json b/plugins/catalog-backend/package.json index a9a35d5858..c3f04e504e 100644 --- a/plugins/catalog-backend/package.json +++ b/plugins/catalog-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-catalog-backend", "description": "The Backstage backend plugin that provides the Backstage catalog", - "version": "0.17.4", + "version": "0.18.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -30,11 +30,11 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/backend-common": "^0.9.10", + "@backstage/backend-common": "^0.9.11", "@backstage/catalog-client": "^0.5.2", "@backstage/catalog-model": "^0.9.7", "@backstage/config": "^0.1.11", - "@backstage/errors": "^0.1.4", + "@backstage/errors": "^0.1.5", "@backstage/integration": "^0.6.9", "@backstage/search-common": "^0.2.1", "@backstage/types": "^0.1.1", @@ -63,8 +63,8 @@ }, "devDependencies": { "@backstage/backend-test-utils": "^0.1.9", - "@backstage/cli": "^0.9.0", - "@backstage/test-utils": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/test-utils": "^0.1.23", "@types/core-js": "^2.5.4", "@types/git-url-parse": "^9.0.0", "@types/lodash": "^4.14.151", diff --git a/plugins/catalog-graph/package.json b/plugins/catalog-graph/package.json index 13869cfd38..16c942de8b 100644 --- a/plugins/catalog-graph/package.json +++ b/plugins/catalog-graph/package.json @@ -23,8 +23,8 @@ "dependencies": { "@backstage/catalog-client": "^0.5.2", "@backstage/catalog-model": "^0.9.7", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/plugin-catalog-react": "^0.6.4", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", @@ -41,10 +41,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/react-hooks": "^7.0.2", diff --git a/plugins/catalog-import/package.json b/plugins/catalog-import/package.json index 933a84f13e..d46495a58b 100644 --- a/plugins/catalog-import/package.json +++ b/plugins/catalog-import/package.json @@ -33,8 +33,8 @@ "dependencies": { "@backstage/catalog-client": "^0.5.2", "@backstage/catalog-model": "^0.9.7", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/errors": "^0.1.3", "@backstage/integration": "^0.6.8", "@backstage/integration-react": "^0.1.14", @@ -55,10 +55,10 @@ "yaml": "^1.10.0" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/react-hooks": "^7.0.2", diff --git a/plugins/catalog/package.json b/plugins/catalog/package.json index ddee20c488..e0218090bd 100644 --- a/plugins/catalog/package.json +++ b/plugins/catalog/package.json @@ -33,8 +33,8 @@ "dependencies": { "@backstage/catalog-client": "^0.5.2", "@backstage/catalog-model": "^0.9.7", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/errors": "^0.1.3", "@backstage/integration-react": "^0.1.14", "@backstage/plugin-catalog-react": "^0.6.4", @@ -51,10 +51,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/circleci/package.json b/plugins/circleci/package.json index 7228044f4f..6f3eaa39e3 100644 --- a/plugins/circleci/package.json +++ b/plugins/circleci/package.json @@ -33,8 +33,8 @@ }, "dependencies": { "@backstage/catalog-model": "^0.9.7", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/plugin-catalog-react": "^0.6.4", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", @@ -52,10 +52,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/cloudbuild/package.json b/plugins/cloudbuild/package.json index 4125a8c82e..f66dcbed00 100644 --- a/plugins/cloudbuild/package.json +++ b/plugins/cloudbuild/package.json @@ -32,8 +32,8 @@ }, "dependencies": { "@backstage/catalog-model": "^0.9.7", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/plugin-catalog-react": "^0.6.4", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", @@ -49,10 +49,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/code-coverage-backend/CHANGELOG.md b/plugins/code-coverage-backend/CHANGELOG.md index 8e8f9ceac8..f1175172f5 100644 --- a/plugins/code-coverage-backend/CHANGELOG.md +++ b/plugins/code-coverage-backend/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-code-coverage-backend +## 0.1.15 + +### Patch Changes + +- bab752e2b3: Change default port of backend from 7000 to 7007. + + This is due to the AirPlay Receiver process occupying port 7000 and preventing local Backstage instances on MacOS to start. + + You can change the port back to 7000 or any other value by providing an `app-config.yaml` with the following values: + + ``` + backend: + listen: 0.0.0.0:7123 + baseUrl: http://localhost:7123 + ``` + + More information can be found here: https://backstage.io/docs/conf/writing + +- Updated dependencies + - @backstage/errors@0.1.5 + - @backstage/backend-common@0.9.11 + ## 0.1.14 ### Patch Changes diff --git a/plugins/code-coverage-backend/package.json b/plugins/code-coverage-backend/package.json index 90320d0e41..eb7018749b 100644 --- a/plugins/code-coverage-backend/package.json +++ b/plugins/code-coverage-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-code-coverage-backend", "description": "A Backstage backend plugin that helps you keep track of your code coverage", - "version": "0.1.14", + "version": "0.1.15", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -20,11 +20,11 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/backend-common": "^0.9.10", + "@backstage/backend-common": "^0.9.11", "@backstage/catalog-client": "^0.5.2", "@backstage/catalog-model": "^0.9.7", "@backstage/config": "^0.1.10", - "@backstage/errors": "^0.1.3", + "@backstage/errors": "^0.1.5", "@backstage/integration": "^0.6.8", "@types/express": "^4.17.6", "cross-fetch": "^3.0.6", @@ -37,7 +37,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.9.0", + "@backstage/cli": "^0.9.1", "@types/express-xml-bodyparser": "^0.3.2", "@types/supertest": "^2.0.8", "msw": "^0.35.0", diff --git a/plugins/code-coverage/package.json b/plugins/code-coverage/package.json index e5b51e90b4..3a45960684 100644 --- a/plugins/code-coverage/package.json +++ b/plugins/code-coverage/package.json @@ -23,8 +23,8 @@ "dependencies": { "@backstage/catalog-model": "^0.9.7", "@backstage/config": "^0.1.11", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/errors": "^0.1.4", "@backstage/plugin-catalog-react": "^0.6.4", "@backstage/theme": "^0.2.13", @@ -42,10 +42,10 @@ "recharts": "^1.8.5" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/config-schema/CHANGELOG.md b/plugins/config-schema/CHANGELOG.md index ca889ebdbd..fc4f8697b8 100644 --- a/plugins/config-schema/CHANGELOG.md +++ b/plugins/config-schema/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-config-schema +## 0.1.14 + +### Patch Changes + +- 9f21236a29: Fixed a missing `await` when throwing server side errors +- Updated dependencies + - @backstage/errors@0.1.5 + - @backstage/core-plugin-api@0.2.1 + - @backstage/core-components@0.7.5 + ## 0.1.13 ### Patch Changes diff --git a/plugins/config-schema/package.json b/plugins/config-schema/package.json index c9abbc7e4e..0d0357cd7c 100644 --- a/plugins/config-schema/package.json +++ b/plugins/config-schema/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-config-schema", "description": "A Backstage plugin that lets you browse the configuration schema of your app", - "version": "0.1.13", + "version": "0.1.14", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -22,9 +22,9 @@ }, "dependencies": { "@backstage/config": "^0.1.11", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", - "@backstage/errors": "^0.1.4", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", + "@backstage/errors": "^0.1.5", "@backstage/theme": "^0.2.13", "@backstage/types": "^0.1.1", "@material-ui/core": "^4.12.2", @@ -37,10 +37,10 @@ "zen-observable": "^0.8.15" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/cost-insights/CHANGELOG.md b/plugins/cost-insights/CHANGELOG.md index 7096af37c6..c43d7c0612 100644 --- a/plugins/cost-insights/CHANGELOG.md +++ b/plugins/cost-insights/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-cost-insights +## 0.11.12 + +### Patch Changes + +- 950b36393c: Supply featureFlags using featureFlag config option. +- Updated dependencies + - @backstage/core-plugin-api@0.2.1 + - @backstage/core-components@0.7.5 + ## 0.11.11 ### Patch Changes diff --git a/plugins/cost-insights/package.json b/plugins/cost-insights/package.json index da9ba8b1f6..12133fcc64 100644 --- a/plugins/cost-insights/package.json +++ b/plugins/cost-insights/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-cost-insights", "description": "A Backstage plugin that helps you keep track of your cloud spend", - "version": "0.11.11", + "version": "0.11.12", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -32,8 +32,8 @@ }, "dependencies": { "@backstage/config": "^0.1.10", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -55,10 +55,10 @@ "yup": "^0.32.9" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/explore/package.json b/plugins/explore/package.json index d9945edc51..8988a7f215 100644 --- a/plugins/explore/package.json +++ b/plugins/explore/package.json @@ -32,8 +32,8 @@ }, "dependencies": { "@backstage/catalog-model": "^0.9.7", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/plugin-catalog-react": "^0.6.4", "@backstage/plugin-explore-react": "^0.0.7", "@backstage/theme": "^0.2.13", @@ -49,10 +49,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/firehydrant/package.json b/plugins/firehydrant/package.json index f332efc150..421ec10c1c 100644 --- a/plugins/firehydrant/package.json +++ b/plugins/firehydrant/package.json @@ -22,8 +22,8 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/plugin-catalog-react": "^0.6.4", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", @@ -35,10 +35,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/fossa/package.json b/plugins/fossa/package.json index cc0b486d60..5c95cfe446 100644 --- a/plugins/fossa/package.json +++ b/plugins/fossa/package.json @@ -33,8 +33,8 @@ }, "dependencies": { "@backstage/catalog-model": "^0.9.7", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/errors": "^0.1.3", "@backstage/plugin-catalog-react": "^0.6.4", "@backstage/theme": "^0.2.13", @@ -49,10 +49,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/gcp-projects/package.json b/plugins/gcp-projects/package.json index cd1c3ac4a1..3068119de5 100644 --- a/plugins/gcp-projects/package.json +++ b/plugins/gcp-projects/package.json @@ -31,8 +31,8 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -43,10 +43,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/git-release-manager/package.json b/plugins/git-release-manager/package.json index 7f7ff6184d..fd1ef75ccc 100644 --- a/plugins/git-release-manager/package.json +++ b/plugins/git-release-manager/package.json @@ -21,8 +21,8 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/integration": "^0.6.8", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", @@ -39,10 +39,10 @@ "recharts": "^1.8.5" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/react-hooks": "^7.0.2", diff --git a/plugins/github-actions/CHANGELOG.md b/plugins/github-actions/CHANGELOG.md index 5eed309d68..7992f201cf 100644 --- a/plugins/github-actions/CHANGELOG.md +++ b/plugins/github-actions/CHANGELOG.md @@ -1,5 +1,27 @@ # @backstage/plugin-github-actions +## 0.4.25 + +### Patch Changes + +- bab752e2b3: Change default port of backend from 7000 to 7007. + + This is due to the AirPlay Receiver process occupying port 7000 and preventing local Backstage instances on MacOS to start. + + You can change the port back to 7000 or any other value by providing an `app-config.yaml` with the following values: + + ``` + backend: + listen: 0.0.0.0:7123 + baseUrl: http://localhost:7123 + ``` + + More information can be found here: https://backstage.io/docs/conf/writing + +- Updated dependencies + - @backstage/core-plugin-api@0.2.1 + - @backstage/core-components@0.7.5 + ## 0.4.24 ### Patch Changes diff --git a/plugins/github-actions/package.json b/plugins/github-actions/package.json index ae7f32be1f..ea5f104c96 100644 --- a/plugins/github-actions/package.json +++ b/plugins/github-actions/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-github-actions", "description": "A Backstage plugin that integrates towards GitHub Actions", - "version": "0.4.24", + "version": "0.4.25", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,8 +34,8 @@ }, "dependencies": { "@backstage/catalog-model": "^0.9.7", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/integration": "^0.6.8", "@backstage/plugin-catalog-react": "^0.6.4", "@backstage/theme": "^0.2.13", @@ -52,10 +52,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/github-deployments/package.json b/plugins/github-deployments/package.json index 062113a8ef..18c3cc3d05 100644 --- a/plugins/github-deployments/package.json +++ b/plugins/github-deployments/package.json @@ -22,8 +22,8 @@ }, "dependencies": { "@backstage/catalog-model": "^0.9.7", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/errors": "^0.1.3", "@backstage/integration": "^0.6.8", "@backstage/integration-react": "^0.1.14", @@ -39,10 +39,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/gitops-profiles/package.json b/plugins/gitops-profiles/package.json index dfbd6297cf..8456eb4919 100644 --- a/plugins/gitops-profiles/package.json +++ b/plugins/gitops-profiles/package.json @@ -32,8 +32,8 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -44,10 +44,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/graphiql/CHANGELOG.md b/plugins/graphiql/CHANGELOG.md index f6c8b9fde8..4fbf6b0dab 100644 --- a/plugins/graphiql/CHANGELOG.md +++ b/plugins/graphiql/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-graphiql +## 0.2.22 + +### Patch Changes + +- cd398cd4ab: Letting GraphiQL use headers +- Updated dependencies + - @backstage/core-plugin-api@0.2.1 + - @backstage/core-components@0.7.5 + ## 0.2.21 ### Patch Changes diff --git a/plugins/graphiql/package.json b/plugins/graphiql/package.json index 5c72a4c728..a04f4d6992 100644 --- a/plugins/graphiql/package.json +++ b/plugins/graphiql/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-graphiql", "description": "Backstage plugin for browsing GraphQL APIs", - "version": "0.2.21", + "version": "0.2.22", "private": false, "publishConfig": { "access": "public", @@ -31,8 +31,8 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -44,10 +44,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/home/package.json b/plugins/home/package.json index ef13ce3a00..65f6fe2ee3 100644 --- a/plugins/home/package.json +++ b/plugins/home/package.json @@ -21,8 +21,8 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -35,10 +35,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/ilert/package.json b/plugins/ilert/package.json index 6011dd4f46..4dddf17cd9 100644 --- a/plugins/ilert/package.json +++ b/plugins/ilert/package.json @@ -22,8 +22,8 @@ }, "dependencies": { "@backstage/catalog-model": "^0.9.7", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/errors": "^0.1.3", "@backstage/plugin-catalog-react": "^0.6.4", "@backstage/theme": "^0.2.13", @@ -39,10 +39,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/jenkins-backend/CHANGELOG.md b/plugins/jenkins-backend/CHANGELOG.md index 48f4461f7f..5cc91e0d5d 100644 --- a/plugins/jenkins-backend/CHANGELOG.md +++ b/plugins/jenkins-backend/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-jenkins-backend +## 0.1.8 + +### Patch Changes + +- bab752e2b3: Change default port of backend from 7000 to 7007. + + This is due to the AirPlay Receiver process occupying port 7000 and preventing local Backstage instances on MacOS to start. + + You can change the port back to 7000 or any other value by providing an `app-config.yaml` with the following values: + + ``` + backend: + listen: 0.0.0.0:7123 + baseUrl: http://localhost:7123 + ``` + + More information can be found here: https://backstage.io/docs/conf/writing + +- Updated dependencies + - @backstage/backend-common@0.9.11 + ## 0.1.7 ### Patch Changes diff --git a/plugins/jenkins-backend/package.json b/plugins/jenkins-backend/package.json index ac9efb3ffd..83adede119 100644 --- a/plugins/jenkins-backend/package.json +++ b/plugins/jenkins-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-jenkins-backend", "description": "A Backstage backend plugin that integrates towards Jenkins", - "version": "0.1.7", + "version": "0.1.8", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -22,7 +22,7 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/backend-common": "^0.9.10", + "@backstage/backend-common": "^0.9.11", "@backstage/catalog-client": "^0.5.2", "@backstage/catalog-model": "^0.9.7", "@backstage/config": "^0.1.10", @@ -35,7 +35,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.9.0", + "@backstage/cli": "^0.9.1", "@types/jenkins": "^0.23.1", "@types/supertest": "^2.0.8", "msw": "^0.35.0", diff --git a/plugins/jenkins/CHANGELOG.md b/plugins/jenkins/CHANGELOG.md index 369676b195..1daba68a1d 100644 --- a/plugins/jenkins/CHANGELOG.md +++ b/plugins/jenkins/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-jenkins +## 0.5.13 + +### Patch Changes + +- ad433b346f: Fix Jenkins project table pagination. +- Updated dependencies + - @backstage/core-plugin-api@0.2.1 + - @backstage/core-components@0.7.5 + ## 0.5.12 ### Patch Changes diff --git a/plugins/jenkins/package.json b/plugins/jenkins/package.json index 4456b15284..18341f6eec 100644 --- a/plugins/jenkins/package.json +++ b/plugins/jenkins/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-jenkins", "description": "A Backstage plugin that integrates towards Jenkins", - "version": "0.5.12", + "version": "0.5.13", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,8 +33,8 @@ }, "dependencies": { "@backstage/catalog-model": "^0.9.7", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/plugin-catalog-react": "^0.6.4", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", @@ -48,10 +48,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/kafka-backend/CHANGELOG.md b/plugins/kafka-backend/CHANGELOG.md index 482c1f75b1..9a417b04b0 100644 --- a/plugins/kafka-backend/CHANGELOG.md +++ b/plugins/kafka-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-kafka-backend +## 0.2.12 + +### Patch Changes + +- 4f81bfd356: Add ACL requirements for kafka-backend plugin +- Updated dependencies + - @backstage/errors@0.1.5 + - @backstage/backend-common@0.9.11 + ## 0.2.11 ### Patch Changes diff --git a/plugins/kafka-backend/package.json b/plugins/kafka-backend/package.json index dea803890f..a8f64b21e1 100644 --- a/plugins/kafka-backend/package.json +++ b/plugins/kafka-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kafka-backend", "description": "A Backstage backend plugin that integrates towards Kafka", - "version": "0.2.11", + "version": "0.2.12", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -32,10 +32,10 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/backend-common": "^0.9.10", + "@backstage/backend-common": "^0.9.11", "@backstage/catalog-model": "^0.9.7", "@backstage/config": "^0.1.10", - "@backstage/errors": "^0.1.3", + "@backstage/errors": "^0.1.5", "@types/express": "^4.17.6", "express": "^4.17.1", "express-promise-router": "^4.1.0", @@ -44,7 +44,7 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/cli": "^0.9.0", + "@backstage/cli": "^0.9.1", "@types/jest-when": "^2.7.2", "@types/lodash": "^4.14.151", "jest-when": "^3.1.0", diff --git a/plugins/kafka/package.json b/plugins/kafka/package.json index a6fbe36e99..8da053ab50 100644 --- a/plugins/kafka/package.json +++ b/plugins/kafka/package.json @@ -22,8 +22,8 @@ }, "dependencies": { "@backstage/catalog-model": "^0.9.7", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/plugin-catalog-react": "^0.6.4", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", @@ -35,10 +35,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/react-hooks": "^7.0.2", diff --git a/plugins/kubernetes-backend/CHANGELOG.md b/plugins/kubernetes-backend/CHANGELOG.md index d506571a3f..102c9c13e4 100644 --- a/plugins/kubernetes-backend/CHANGELOG.md +++ b/plugins/kubernetes-backend/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-kubernetes-backend +## 0.3.19 + +### Patch Changes + +- 37dc844728: Include CronJobs and Jobs as default objects returned by the kubernetes backend and add/update relevant types. +- Updated dependencies + - @backstage/errors@0.1.5 + - @backstage/plugin-kubernetes-common@0.1.6 + - @backstage/backend-common@0.9.11 + ## 0.3.18 ### Patch Changes diff --git a/plugins/kubernetes-backend/package.json b/plugins/kubernetes-backend/package.json index 4edc7b238a..0b3f7cb3cb 100644 --- a/plugins/kubernetes-backend/package.json +++ b/plugins/kubernetes-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-backend", "description": "A Backstage backend plugin that integrates towards Kubernetes", - "version": "0.3.18", + "version": "0.3.19", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -32,11 +32,11 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/backend-common": "^0.9.10", + "@backstage/backend-common": "^0.9.11", "@backstage/catalog-model": "^0.9.7", "@backstage/config": "^0.1.10", - "@backstage/errors": "^0.1.3", - "@backstage/plugin-kubernetes-common": "^0.1.4", + "@backstage/errors": "^0.1.5", + "@backstage/plugin-kubernetes-common": "^0.1.6", "@google-cloud/container": "^2.2.0", "@kubernetes/client-node": "^0.15.0", "@types/express": "^4.17.6", @@ -55,7 +55,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.9.0", + "@backstage/cli": "^0.9.1", "@types/aws4": "^1.5.1", "supertest": "^6.1.3", "aws-sdk-mock": "^5.2.1", diff --git a/plugins/kubernetes-common/CHANGELOG.md b/plugins/kubernetes-common/CHANGELOG.md index 0f685bd4d4..b0e7aca129 100644 --- a/plugins/kubernetes-common/CHANGELOG.md +++ b/plugins/kubernetes-common/CHANGELOG.md @@ -1,5 +1,11 @@ # @backstage/plugin-kubernetes-common +## 0.1.6 + +### Patch Changes + +- 37dc844728: Include CronJobs and Jobs as default objects returned by the kubernetes backend and add/update relevant types. + ## 0.1.5 ### Patch Changes diff --git a/plugins/kubernetes-common/package.json b/plugins/kubernetes-common/package.json index 3c9cb5e357..a3ab7710c0 100644 --- a/plugins/kubernetes-common/package.json +++ b/plugins/kubernetes-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes-common", "description": "Common functionalities for kubernetes, to be shared between kubernetes and kubernetes-backend plugin", - "version": "0.1.5", + "version": "0.1.6", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -39,7 +39,7 @@ "@kubernetes/client-node": "^0.15.0" }, "devDependencies": { - "@backstage/cli": "^0.9.0" + "@backstage/cli": "^0.9.1" }, "jest": { "roots": [ diff --git a/plugins/kubernetes/CHANGELOG.md b/plugins/kubernetes/CHANGELOG.md index 0ae3a6c012..437ea327e4 100644 --- a/plugins/kubernetes/CHANGELOG.md +++ b/plugins/kubernetes/CHANGELOG.md @@ -1,5 +1,15 @@ # @backstage/plugin-kubernetes +## 0.4.21 + +### Patch Changes + +- 3739d3f773: Implement support for formatting OpenShift dashboard url links +- Updated dependencies + - @backstage/plugin-kubernetes-common@0.1.6 + - @backstage/core-plugin-api@0.2.1 + - @backstage/core-components@0.7.5 + ## 0.4.20 ### Patch Changes diff --git a/plugins/kubernetes/package.json b/plugins/kubernetes/package.json index 618f814c21..0c78649cf7 100644 --- a/plugins/kubernetes/package.json +++ b/plugins/kubernetes/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-kubernetes", "description": "A Backstage plugin that integrates towards Kubernetes", - "version": "0.4.20", + "version": "0.4.21", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -33,10 +33,10 @@ "dependencies": { "@backstage/catalog-model": "^0.9.7", "@backstage/config": "^0.1.11", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/plugin-catalog-react": "^0.6.4", - "@backstage/plugin-kubernetes-common": "^0.1.5", + "@backstage/plugin-kubernetes-common": "^0.1.6", "@backstage/theme": "^0.2.13", "@kubernetes/client-node": "^0.15.0", "@material-ui/core": "^4.12.2", @@ -51,10 +51,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/react-hooks": "^7.0.2", diff --git a/plugins/lighthouse/package.json b/plugins/lighthouse/package.json index e53f6ee261..009252b774 100644 --- a/plugins/lighthouse/package.json +++ b/plugins/lighthouse/package.json @@ -34,8 +34,8 @@ "dependencies": { "@backstage/catalog-model": "^0.9.7", "@backstage/config": "^0.1.10", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/plugin-catalog-react": "^0.6.4", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", @@ -47,10 +47,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/react-hooks": "^7.0.2", diff --git a/plugins/newrelic/package.json b/plugins/newrelic/package.json index 16029f1783..bd5e57ae66 100644 --- a/plugins/newrelic/package.json +++ b/plugins/newrelic/package.json @@ -32,8 +32,8 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -43,10 +43,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/org/CHANGELOG.md b/plugins/org/CHANGELOG.md index f46095f46a..37c3320810 100644 --- a/plugins/org/CHANGELOG.md +++ b/plugins/org/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-org +## 0.3.29 + +### Patch Changes + +- 2f4a686411: Use email links in the catalog's members list instead of text to display a member's email +- Updated dependencies + - @backstage/core-plugin-api@0.2.1 + - @backstage/core-components@0.7.5 + ## 0.3.28 ### Patch Changes diff --git a/plugins/org/package.json b/plugins/org/package.json index db6cfe4d0b..a9146c8f7a 100644 --- a/plugins/org/package.json +++ b/plugins/org/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-org", "description": "A Backstage plugin that helps you create entity pages for your organization", - "version": "0.3.28", + "version": "0.3.29", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -22,8 +22,8 @@ }, "dependencies": { "@backstage/catalog-model": "^0.9.7", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/plugin-catalog-react": "^0.6.4", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", @@ -37,10 +37,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/pagerduty/package.json b/plugins/pagerduty/package.json index 7981b2c104..d02c2df57b 100644 --- a/plugins/pagerduty/package.json +++ b/plugins/pagerduty/package.json @@ -32,8 +32,8 @@ }, "dependencies": { "@backstage/catalog-model": "^0.9.7", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/plugin-catalog-react": "^0.6.4", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", @@ -48,10 +48,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/permission-backend/CHANGELOG.md b/plugins/permission-backend/CHANGELOG.md new file mode 100644 index 0000000000..5df0a5826a --- /dev/null +++ b/plugins/permission-backend/CHANGELOG.md @@ -0,0 +1,15 @@ +# @backstage/plugin-permission-backend + +## 0.1.0 + +### Minor Changes + +- 7a8312f126: New package containing the backend for authorization and permissions. For more information, see the [authorization PRFC](https://github.com/backstage/backstage/pull/7761). + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.4.9 + - @backstage/plugin-permission-node@0.1.0 + - @backstage/backend-common@0.9.11 + - @backstage/plugin-permission-common@0.2.0 diff --git a/plugins/permission-backend/package.json b/plugins/permission-backend/package.json index f30c73f8eb..f335079d0b 100644 --- a/plugins/permission-backend/package.json +++ b/plugins/permission-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-permission-backend", - "version": "0.0.0", + "version": "0.1.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -19,11 +19,11 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/backend-common": "^0.9.9", + "@backstage/backend-common": "^0.9.11", "@backstage/config": "^0.1.11", - "@backstage/plugin-auth-backend": "^0.4.7", - "@backstage/plugin-permission-common": "^0.1.0", - "@backstage/plugin-permission-node": "^0.0.0", + "@backstage/plugin-auth-backend": "^0.4.9", + "@backstage/plugin-permission-common": "^0.2.0", + "@backstage/plugin-permission-node": "^0.1.0", "@types/express": "*", "express": "^4.17.1", "express-promise-router": "^4.1.0", @@ -33,7 +33,7 @@ "zod": "^3.11.6" }, "devDependencies": { - "@backstage/cli": "^0.9.0", + "@backstage/cli": "^0.9.1", "@types/supertest": "^2.0.8", "supertest": "^4.0.2", "msw": "^0.35.0" diff --git a/plugins/permission-common/CHANGELOG.md b/plugins/permission-common/CHANGELOG.md new file mode 100644 index 0000000000..c2ee5a3ecf --- /dev/null +++ b/plugins/permission-common/CHANGELOG.md @@ -0,0 +1,12 @@ +# @backstage/plugin-permission-common + +## 0.2.0 + +### Minor Changes + +- 92439056fb: Accept configApi rather than enabled flag in PermissionClient constructor. + +### Patch Changes + +- Updated dependencies + - @backstage/errors@0.1.5 diff --git a/plugins/permission-common/package.json b/plugins/permission-common/package.json index 9e1d60f782..725aef0dec 100644 --- a/plugins/permission-common/package.json +++ b/plugins/permission-common/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-permission-common", "description": "Isomorphic types and client for Backstage permissions and authorization", - "version": "0.1.0", + "version": "0.2.0", "main": "src/index.ts", "types": "src/index.ts", "publishConfig": { @@ -39,13 +39,13 @@ }, "dependencies": { "@backstage/config": "^0.1.11", - "@backstage/errors": "^0.1.2", + "@backstage/errors": "^0.1.5", "cross-fetch": "^3.0.6", "uuid": "^8.0.0", "zod": "^3.11.6" }, "devDependencies": { - "@backstage/cli": "^0.9.0", + "@backstage/cli": "^0.9.1", "@types/jest": "^26.0.7", "msw": "^0.35.0" } diff --git a/plugins/permission-node/CHANGELOG.md b/plugins/permission-node/CHANGELOG.md new file mode 100644 index 0000000000..37c03b7050 --- /dev/null +++ b/plugins/permission-node/CHANGELOG.md @@ -0,0 +1,13 @@ +# @backstage/plugin-permission-node + +## 0.1.0 + +### Minor Changes + +- 44b46644d9: New package containing common permission and authorization utilities for backend plugins. For more information, see the [authorization PRFC](https://github.com/backstage/backstage/pull/7761). + +### Patch Changes + +- Updated dependencies + - @backstage/plugin-auth-backend@0.4.9 + - @backstage/plugin-permission-common@0.2.0 diff --git a/plugins/permission-node/package.json b/plugins/permission-node/package.json index e22e2d2de4..2bddc21aca 100644 --- a/plugins/permission-node/package.json +++ b/plugins/permission-node/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-permission-node", "description": "Common permission and authorization utilities for backend plugins", - "version": "0.0.0", + "version": "0.1.0", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -29,14 +29,14 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/plugin-auth-backend": "^0.4.6", - "@backstage/plugin-permission-common": "^0.1.0", + "@backstage/plugin-auth-backend": "^0.4.9", + "@backstage/plugin-permission-common": "^0.2.0", "@types/express": "^4.17.6", "express": "^4.17.1", "zod": "^3.11.6" }, "devDependencies": { - "@backstage/cli": "^0.9.0", + "@backstage/cli": "^0.9.1", "@types/supertest": "^2.0.8", "supertest": "^6.1.3" }, diff --git a/plugins/proxy-backend/CHANGELOG.md b/plugins/proxy-backend/CHANGELOG.md index a7408c161f..57b3441fa5 100644 --- a/plugins/proxy-backend/CHANGELOG.md +++ b/plugins/proxy-backend/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-proxy-backend +## 0.2.14 + +### Patch Changes + +- bab752e2b3: Change default port of backend from 7000 to 7007. + + This is due to the AirPlay Receiver process occupying port 7000 and preventing local Backstage instances on MacOS to start. + + You can change the port back to 7000 or any other value by providing an `app-config.yaml` with the following values: + + ``` + backend: + listen: 0.0.0.0:7123 + baseUrl: http://localhost:7123 + ``` + + More information can be found here: https://backstage.io/docs/conf/writing + +- Updated dependencies + - @backstage/backend-common@0.9.11 + ## 0.2.13 ### Patch Changes diff --git a/plugins/proxy-backend/package.json b/plugins/proxy-backend/package.json index 05499d88e8..78586449c7 100644 --- a/plugins/proxy-backend/package.json +++ b/plugins/proxy-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-proxy-backend", "description": "A Backstage backend plugin that helps you set up proxy endpoints in the backend", - "version": "0.2.13", + "version": "0.2.14", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -29,7 +29,7 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/backend-common": "^0.9.10", + "@backstage/backend-common": "^0.9.11", "@backstage/config": "^0.1.8", "@types/express": "^4.17.6", "express": "^4.17.1", @@ -43,7 +43,7 @@ "yup": "^0.32.9" }, "devDependencies": { - "@backstage/cli": "^0.9.0", + "@backstage/cli": "^0.9.1", "@types/http-proxy-middleware": "^0.19.3", "@types/supertest": "^2.0.8", "@types/uuid": "^8.0.0", diff --git a/plugins/rollbar-backend/CHANGELOG.md b/plugins/rollbar-backend/CHANGELOG.md index d2bc07ab7e..9c0f70ea6a 100644 --- a/plugins/rollbar-backend/CHANGELOG.md +++ b/plugins/rollbar-backend/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-rollbar-backend +## 0.1.16 + +### Patch Changes + +- bab752e2b3: Change default port of backend from 7000 to 7007. + + This is due to the AirPlay Receiver process occupying port 7000 and preventing local Backstage instances on MacOS to start. + + You can change the port back to 7000 or any other value by providing an `app-config.yaml` with the following values: + + ``` + backend: + listen: 0.0.0.0:7123 + baseUrl: http://localhost:7123 + ``` + + More information can be found here: https://backstage.io/docs/conf/writing + +- Updated dependencies + - @backstage/backend-common@0.9.11 + ## 0.1.15 ### Patch Changes diff --git a/plugins/rollbar-backend/package.json b/plugins/rollbar-backend/package.json index be8b6e65e5..bb30692476 100644 --- a/plugins/rollbar-backend/package.json +++ b/plugins/rollbar-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-rollbar-backend", "description": "A Backstage backend plugin that integrates towards Rollbar", - "version": "0.1.15", + "version": "0.1.16", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -31,7 +31,7 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/backend-common": "^0.9.10", + "@backstage/backend-common": "^0.9.11", "@backstage/config": "^0.1.10", "@types/express": "^4.17.6", "axios": "^0.21.1", @@ -48,7 +48,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.9.0", + "@backstage/cli": "^0.9.1", "@types/supertest": "^2.0.8", "supertest": "^6.1.3" }, diff --git a/plugins/rollbar/package.json b/plugins/rollbar/package.json index ee3fc9f5a6..0e4086bd4a 100644 --- a/plugins/rollbar/package.json +++ b/plugins/rollbar/package.json @@ -33,8 +33,8 @@ }, "dependencies": { "@backstage/catalog-model": "^0.9.7", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/plugin-catalog-react": "^0.6.4", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", @@ -49,10 +49,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/react-hooks": "^7.0.2", diff --git a/plugins/scaffolder-backend/CHANGELOG.md b/plugins/scaffolder-backend/CHANGELOG.md index f71849a1d2..092a678fce 100644 --- a/plugins/scaffolder-backend/CHANGELOG.md +++ b/plugins/scaffolder-backend/CHANGELOG.md @@ -1,5 +1,18 @@ # @backstage/plugin-scaffolder-backend +## 0.15.14 + +### Patch Changes + +- a096e4c4d7: Switched to executing scaffolder templating in a secure context for any template based on nunjucks, as it is [not secure by default](https://mozilla.github.io/nunjucks/api.html#user-defined-templates-warning). +- f9352ab606: Removed all usages of `path.resolve` in order to ensure that template paths are resolved in a safe way. +- e634a47ce5: Fix bug where there was error log lines written when failing to `JSON.parse` things that were not `JSON` values. +- 42ebbc18c0: Bump gitbeaker to the latest version +- Updated dependencies + - @backstage/errors@0.1.5 + - @backstage/plugin-catalog-backend@0.18.0 + - @backstage/backend-common@0.9.11 + ## 0.15.13 ### Patch Changes diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index d4582cfa25..e1dd94a481 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder-backend", "description": "The Backstage backend plugin that helps you create new things", - "version": "0.15.13", + "version": "0.15.14", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -31,13 +31,13 @@ "build:assets": "node scripts/build-nunjucks.js" }, "dependencies": { - "@backstage/backend-common": "^0.9.10", + "@backstage/backend-common": "^0.9.11", "@backstage/catalog-client": "^0.5.2", "@backstage/catalog-model": "^0.9.7", "@backstage/config": "^0.1.11", - "@backstage/errors": "^0.1.4", + "@backstage/errors": "^0.1.5", "@backstage/integration": "^0.6.9", - "@backstage/plugin-catalog-backend": "^0.17.4", + "@backstage/plugin-catalog-backend": "^0.18.0", "@backstage/plugin-scaffolder-common": "^0.1.1", "@backstage/plugin-scaffolder-backend-module-cookiecutter": "^0.1.4", "@backstage/types": "^0.1.1", @@ -73,8 +73,8 @@ "vm2": "^3.9.5" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/test-utils": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/test-utils": "^0.1.23", "@types/command-exists": "^1.2.0", "@types/fs-extra": "^9.0.1", "@types/git-url-parse": "^9.0.0", diff --git a/plugins/scaffolder/CHANGELOG.md b/plugins/scaffolder/CHANGELOG.md index 8c43d8d010..e809ae6c71 100644 --- a/plugins/scaffolder/CHANGELOG.md +++ b/plugins/scaffolder/CHANGELOG.md @@ -1,5 +1,16 @@ # @backstage/plugin-scaffolder +## 0.11.12 + +### Patch Changes + +- 2d7d165737: Bump `react-jsonschema-form` +- 9f21236a29: Fixed a missing `await` when throwing server side errors +- Updated dependencies + - @backstage/errors@0.1.5 + - @backstage/core-plugin-api@0.2.1 + - @backstage/core-components@0.7.5 + ## 0.11.11 ### Patch Changes diff --git a/plugins/scaffolder/package.json b/plugins/scaffolder/package.json index ce185403bb..2cd341d5b9 100644 --- a/plugins/scaffolder/package.json +++ b/plugins/scaffolder/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-scaffolder", "description": "The Backstage plugin that helps you create new things", - "version": "0.11.11", + "version": "0.11.12", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,9 +34,9 @@ "@backstage/catalog-client": "^0.5.2", "@backstage/catalog-model": "^0.9.7", "@backstage/config": "^0.1.11", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", - "@backstage/errors": "^0.1.4", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", + "@backstage/errors": "^0.1.5", "@backstage/integration": "^0.6.9", "@backstage/integration-react": "^0.1.14", "@backstage/plugin-catalog-react": "^0.6.4", @@ -66,10 +66,10 @@ "zen-observable": "^0.8.15" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/react-hooks": "^7.0.2", diff --git a/plugins/search-backend/CHANGELOG.md b/plugins/search-backend/CHANGELOG.md index af8fcfa79a..bf0c2df174 100644 --- a/plugins/search-backend/CHANGELOG.md +++ b/plugins/search-backend/CHANGELOG.md @@ -1,5 +1,26 @@ # @backstage/plugin-search-backend +## 0.2.7 + +### Patch Changes + +- bab752e2b3: Change default port of backend from 7000 to 7007. + + This is due to the AirPlay Receiver process occupying port 7000 and preventing local Backstage instances on MacOS to start. + + You can change the port back to 7000 or any other value by providing an `app-config.yaml` with the following values: + + ``` + backend: + listen: 0.0.0.0:7123 + baseUrl: http://localhost:7123 + ``` + + More information can be found here: https://backstage.io/docs/conf/writing + +- Updated dependencies + - @backstage/backend-common@0.9.11 + ## 0.2.6 ### Patch Changes diff --git a/plugins/search-backend/package.json b/plugins/search-backend/package.json index 2df51e1bb4..3767944a25 100644 --- a/plugins/search-backend/package.json +++ b/plugins/search-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-search-backend", "description": "The Backstage backend plugin that provides your backstage app with search", - "version": "0.2.6", + "version": "0.2.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -20,7 +20,7 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/backend-common": "^0.9.10", + "@backstage/backend-common": "^0.9.11", "@backstage/search-common": "^0.2.0", "@backstage/plugin-search-backend-node": "^0.4.2", "@types/express": "^4.17.6", @@ -30,7 +30,7 @@ "yn": "^4.0.0" }, "devDependencies": { - "@backstage/cli": "^0.9.0", + "@backstage/cli": "^0.9.1", "@types/supertest": "^2.0.8", "supertest": "^6.1.3" }, diff --git a/plugins/search/package.json b/plugins/search/package.json index aaddf130bf..a032f5ef26 100644 --- a/plugins/search/package.json +++ b/plugins/search/package.json @@ -32,8 +32,8 @@ "dependencies": { "@backstage/catalog-model": "^0.9.7", "@backstage/config": "^0.1.11", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/errors": "^0.1.4", "@backstage/plugin-catalog-react": "^0.6.4", "@backstage/search-common": "^0.2.1", @@ -51,10 +51,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/react-hooks": "^7.0.2", diff --git a/plugins/sentry/package.json b/plugins/sentry/package.json index a04043c789..2ea32c4f22 100644 --- a/plugins/sentry/package.json +++ b/plugins/sentry/package.json @@ -33,8 +33,8 @@ }, "dependencies": { "@backstage/catalog-model": "^0.9.7", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/plugin-catalog-react": "^0.6.4", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", @@ -48,10 +48,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/shortcuts/package.json b/plugins/shortcuts/package.json index f0139d5728..0569585733 100644 --- a/plugins/shortcuts/package.json +++ b/plugins/shortcuts/package.json @@ -21,8 +21,8 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/theme": "^0.2.13", "@backstage/types": "^0.1.1", "@material-ui/core": "^4.12.2", @@ -38,10 +38,10 @@ "zen-observable": "^0.8.15" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/sonarqube/package.json b/plugins/sonarqube/package.json index f92c21ad7e..749e7a2a2b 100644 --- a/plugins/sonarqube/package.json +++ b/plugins/sonarqube/package.json @@ -34,8 +34,8 @@ }, "dependencies": { "@backstage/catalog-model": "^0.9.7", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/plugin-catalog-react": "^0.6.4", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", @@ -49,10 +49,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/splunk-on-call/package.json b/plugins/splunk-on-call/package.json index 10eb807ba1..ac24c463c6 100644 --- a/plugins/splunk-on-call/package.json +++ b/plugins/splunk-on-call/package.json @@ -32,8 +32,8 @@ }, "dependencies": { "@backstage/catalog-model": "^0.9.7", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/plugin-catalog-react": "^0.6.4", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", @@ -47,10 +47,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md new file mode 100644 index 0000000000..92bd7ebf33 --- /dev/null +++ b/plugins/tech-insights-backend-module-jsonfc/CHANGELOG.md @@ -0,0 +1,10 @@ +# @backstage/plugin-tech-insights-backend-module-jsonfc + +## 0.1.1 + +### Patch Changes + +- 2017de90da: Update README docs to use correct function/parameter names +- Updated dependencies + - @backstage/errors@0.1.5 + - @backstage/backend-common@0.9.11 diff --git a/plugins/tech-insights-backend-module-jsonfc/package.json b/plugins/tech-insights-backend-module-jsonfc/package.json index 5504cb2d81..c7086cf98c 100644 --- a/plugins/tech-insights-backend-module-jsonfc/package.json +++ b/plugins/tech-insights-backend-module-jsonfc/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-backend-module-jsonfc", - "version": "0.1.0", + "version": "0.1.1", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -31,9 +31,9 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/backend-common": "^0.9.10", + "@backstage/backend-common": "^0.9.11", "@backstage/config": "^0.1.8", - "@backstage/errors": "^0.1.1", + "@backstage/errors": "^0.1.5", "@backstage/plugin-tech-insights-common": "^0.1.0", "@backstage/plugin-tech-insights-node": "^0.1.0", "ajv": "^7.0.3", @@ -43,7 +43,7 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/cli": "^0.9.0", + "@backstage/cli": "^0.9.1", "@types/node-cron": "^2.0.4" }, "files": [ diff --git a/plugins/tech-insights-backend/CHANGELOG.md b/plugins/tech-insights-backend/CHANGELOG.md index abb8eaac6f..0982a3cdc8 100644 --- a/plugins/tech-insights-backend/CHANGELOG.md +++ b/plugins/tech-insights-backend/CHANGELOG.md @@ -1,5 +1,14 @@ # @backstage/plugin-tech-insights-backend +## 0.1.2 + +### Patch Changes + +- 2017de90da: Update README docs to use correct function/parameter names +- Updated dependencies + - @backstage/errors@0.1.5 + - @backstage/backend-common@0.9.11 + ## 0.1.1 ### Patch Changes diff --git a/plugins/tech-insights-backend/package.json b/plugins/tech-insights-backend/package.json index 5bc616db71..0620cd6a58 100644 --- a/plugins/tech-insights-backend/package.json +++ b/plugins/tech-insights-backend/package.json @@ -1,6 +1,6 @@ { "name": "@backstage/plugin-tech-insights-backend", - "version": "0.1.1", + "version": "0.1.2", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -31,11 +31,11 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/backend-common": "^0.9.10", + "@backstage/backend-common": "^0.9.11", "@backstage/catalog-client": "^0.5.2", "@backstage/catalog-model": "^0.9.7", "@backstage/config": "^0.1.8", - "@backstage/errors": "^0.1.1", + "@backstage/errors": "^0.1.5", "@backstage/plugin-tech-insights-common": "^0.1.0", "@backstage/plugin-tech-insights-node": "^0.1.0", "@types/express": "^4.17.6", @@ -53,7 +53,7 @@ }, "devDependencies": { "@backstage/backend-test-utils": "^0.1.9", - "@backstage/cli": "^0.9.0", + "@backstage/cli": "^0.9.1", "@types/supertest": "^2.0.8", "@types/node-cron": "^3.0.0", "@types/semver": "^7.3.8", diff --git a/plugins/tech-radar/package.json b/plugins/tech-radar/package.json index 99fce10345..5b11fbbe7c 100644 --- a/plugins/tech-radar/package.json +++ b/plugins/tech-radar/package.json @@ -31,8 +31,8 @@ "start": "backstage-cli plugin:serve" }, "dependencies": { - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -45,10 +45,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/techdocs-backend/CHANGELOG.md b/plugins/techdocs-backend/CHANGELOG.md index ad7a8af85e..7c937e0bad 100644 --- a/plugins/techdocs-backend/CHANGELOG.md +++ b/plugins/techdocs-backend/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-techdocs-backend +## 0.10.9 + +### Patch Changes + +- bab752e2b3: Change default port of backend from 7000 to 7007. + + This is due to the AirPlay Receiver process occupying port 7000 and preventing local Backstage instances on MacOS to start. + + You can change the port back to 7000 or any other value by providing an `app-config.yaml` with the following values: + + ``` + backend: + listen: 0.0.0.0:7123 + baseUrl: http://localhost:7123 + ``` + + More information can be found here: https://backstage.io/docs/conf/writing + +- Updated dependencies + - @backstage/errors@0.1.5 + - @backstage/backend-common@0.9.11 + - @backstage/techdocs-common@0.10.8 + ## 0.10.8 ### Patch Changes diff --git a/plugins/techdocs-backend/package.json b/plugins/techdocs-backend/package.json index 332884c694..a3d2214eba 100644 --- a/plugins/techdocs-backend/package.json +++ b/plugins/techdocs-backend/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs-backend", "description": "The Backstage backend plugin that renders technical documentation for your components", - "version": "0.10.8", + "version": "0.10.9", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -31,14 +31,14 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/backend-common": "^0.9.10", + "@backstage/backend-common": "^0.9.11", "@backstage/catalog-client": "^0.5.2", "@backstage/catalog-model": "^0.9.7", "@backstage/config": "^0.1.11", - "@backstage/errors": "^0.1.4", + "@backstage/errors": "^0.1.5", "@backstage/integration": "^0.6.9", "@backstage/search-common": "^0.2.1", - "@backstage/techdocs-common": "^0.10.7", + "@backstage/techdocs-common": "^0.10.8", "@types/express": "^4.17.6", "cross-fetch": "^3.0.6", "dockerode": "^3.3.1", @@ -51,8 +51,8 @@ "winston": "^3.2.1" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/test-utils": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/test-utils": "^0.1.23", "@types/dockerode": "^3.3.0", "msw": "^0.35.0", "supertest": "^6.1.3" diff --git a/plugins/techdocs/CHANGELOG.md b/plugins/techdocs/CHANGELOG.md index 6b8a8f0ff9..2755daea4a 100644 --- a/plugins/techdocs/CHANGELOG.md +++ b/plugins/techdocs/CHANGELOG.md @@ -1,5 +1,28 @@ # @backstage/plugin-techdocs +## 0.12.7 + +### Patch Changes + +- bab752e2b3: Change default port of backend from 7000 to 7007. + + This is due to the AirPlay Receiver process occupying port 7000 and preventing local Backstage instances on MacOS to start. + + You can change the port back to 7000 or any other value by providing an `app-config.yaml` with the following values: + + ``` + backend: + listen: 0.0.0.0:7123 + baseUrl: http://localhost:7123 + ``` + + More information can be found here: https://backstage.io/docs/conf/writing + +- Updated dependencies + - @backstage/errors@0.1.5 + - @backstage/core-plugin-api@0.2.1 + - @backstage/core-components@0.7.5 + ## 0.12.6 ### Patch Changes diff --git a/plugins/techdocs/package.json b/plugins/techdocs/package.json index 663c83118e..1677d43095 100644 --- a/plugins/techdocs/package.json +++ b/plugins/techdocs/package.json @@ -1,7 +1,7 @@ { "name": "@backstage/plugin-techdocs", "description": "The Backstage plugin that renders technical documentation for your components", - "version": "0.12.6", + "version": "0.12.7", "main": "src/index.ts", "types": "src/index.ts", "license": "Apache-2.0", @@ -34,9 +34,9 @@ "dependencies": { "@backstage/catalog-model": "^0.9.7", "@backstage/config": "^0.1.11", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", - "@backstage/errors": "^0.1.4", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", + "@backstage/errors": "^0.1.5", "@backstage/integration": "^0.6.9", "@backstage/integration-react": "^0.1.14", "@backstage/plugin-catalog": "^0.7.3", @@ -61,10 +61,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/react-hooks": "^7.0.2", diff --git a/plugins/todo/package.json b/plugins/todo/package.json index 22a8e6b1e2..9a6098799f 100644 --- a/plugins/todo/package.json +++ b/plugins/todo/package.json @@ -28,8 +28,8 @@ }, "dependencies": { "@backstage/catalog-model": "^0.9.7", - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/errors": "^0.1.3", "@backstage/plugin-catalog-react": "^0.6.4", "@backstage/theme": "^0.2.13", @@ -41,10 +41,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/user-settings/package.json b/plugins/user-settings/package.json index def12ac1d2..15b1771bde 100644 --- a/plugins/user-settings/package.json +++ b/plugins/user-settings/package.json @@ -31,8 +31,8 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", "@material-ui/icons": "^4.9.1", @@ -43,10 +43,10 @@ "react-use": "^17.2.4" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", diff --git a/plugins/xcmetrics/package.json b/plugins/xcmetrics/package.json index f29f763666..f14735a448 100644 --- a/plugins/xcmetrics/package.json +++ b/plugins/xcmetrics/package.json @@ -21,8 +21,8 @@ "clean": "backstage-cli clean" }, "dependencies": { - "@backstage/core-components": "^0.7.4", - "@backstage/core-plugin-api": "^0.2.0", + "@backstage/core-components": "^0.7.5", + "@backstage/core-plugin-api": "^0.2.1", "@backstage/errors": "^0.1.3", "@backstage/theme": "^0.2.13", "@material-ui/core": "^4.12.2", @@ -36,10 +36,10 @@ "recharts": "^1.8.5" }, "devDependencies": { - "@backstage/cli": "^0.9.0", - "@backstage/core-app-api": "^0.1.22", + "@backstage/cli": "^0.9.1", + "@backstage/core-app-api": "^0.1.23", "@backstage/dev-utils": "^0.2.13", - "@backstage/test-utils": "^0.1.22", + "@backstage/test-utils": "^0.1.23", "@testing-library/jest-dom": "^5.10.1", "@testing-library/react": "^11.2.5", "@testing-library/user-event": "^13.1.8", From 79d424640792ae712039df62e994f4a9e1d19323 Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Thu, 25 Nov 2021 15:31:53 +0100 Subject: [PATCH 106/131] Add stale workflow Co-authored-by: blam Signed-off-by: Johan Haals --- .github/workflows/stale.yml | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 .github/workflows/stale.yml diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml new file mode 100644 index 0000000000..a5d6c1664f --- /dev/null +++ b/.github/workflows/stale.yml @@ -0,0 +1,33 @@ +name: 'Stale workflow' +on: + workflow_dispatch: + # schedule: + # - cron: '0 0 * * *' # at 00:00 every day + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@main + id: stale + with: + stale-issue-message: > + This issue has been automatically marked as stale because it has not had + recent activity. It will be closed if no further activity occurs. Thank you + for your contributions. + days-before-issue-stale: 60 + days-before-issue-close: 7 + exempt-issue-labels: 'pinned,security,plugin,help wanted,good first issue,rfc' + stale-issue-label: stale + stale-pr-message: > + This PR has been automatically marked as stale because it has not had + recent activity from the author. It will be closed if no further activity occurs. + If you are the author and the PR has been closed, feel free to re-open the PR and continue the contribution! + days-before-pr-stale: 7 + days-before-pr-close: 3 + exempt-pr-labels: reviewer-approved,awaiting-review + stale-pr-label: stale + # Will be removed once we are happy with the new workflow. + debug-only: true + - name: Print outputs + run: echo ${{ join(steps.stale.outputs.*, ',') }} From b291d0ed7eb8fa673ca7e07defc90b492440f90f Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Thu, 25 Nov 2021 18:30:28 +0100 Subject: [PATCH 107/131] core-plugin-api: bit clearer deprecation warning for createRouteRef Signed-off-by: Patrik Oldsberg --- .changeset/rude-brooms-raise.md | 5 +++++ packages/core-plugin-api/src/routing/RouteRef.ts | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 .changeset/rude-brooms-raise.md diff --git a/.changeset/rude-brooms-raise.md b/.changeset/rude-brooms-raise.md new file mode 100644 index 0000000000..6b5bd3ca3a --- /dev/null +++ b/.changeset/rude-brooms-raise.md @@ -0,0 +1,5 @@ +--- +'@backstage/core-plugin-api': patch +--- + +Tweaked the logged deprecation warning for `createRouteRef` to hopefully make it more clear. diff --git a/packages/core-plugin-api/src/routing/RouteRef.ts b/packages/core-plugin-api/src/routing/RouteRef.ts index 26e63c8f3a..8bd3d604f6 100644 --- a/packages/core-plugin-api/src/routing/RouteRef.ts +++ b/packages/core-plugin-api/src/routing/RouteRef.ts @@ -59,21 +59,21 @@ export class RouteRefImpl if (config.path) { // eslint-disable-next-line no-console console.warn( - `[core-plugin-api] - routeRefs no longer decide their own path, please remove the path for ${this.toString()}. This will be removed in upcoming versions.`, + `DEPRECATION WARNING: Passing a path to createRouteRef is deprecated, please remove the path for ${this}.`, ); } if (config.icon) { // eslint-disable-next-line no-console console.warn( - `[core-plugin-api] - routeRefs no longer decide their own icon, please remove the icon for ${this.toString()}. This will be removed in upcoming versions.`, + `DEPRECATION WARNING: Passing an icon to createRouteRef is deprecated, please remove the icon for ${this}.`, ); } if (config.title) { // eslint-disable-next-line no-console console.warn( - `[core-plugin-api] - routeRefs no longer decide their own title, please remove the title for ${this.toString()}. This will be removed in upcoming versions.`, + `DEPRECATION WARNING: Passing a title to createRouteRef is deprecated, please remove the title for ${this}.`, ); } } From 422de86abe612d81367b0d8c0246d9cd8446ecb7 Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Thu, 25 Nov 2021 12:20:28 +0000 Subject: [PATCH 108/131] docs: split up backend-to-backend and api request authentication docs Signed-off-by: MT Lewis --- .../tutorials/authenticate-api-requests.md | 83 ++----------------- docs/tutorials/backend-to-backend-auth.md | 71 ++++++++++++++++ 2 files changed, 79 insertions(+), 75 deletions(-) rename {docs => contrib/docs}/tutorials/authenticate-api-requests.md (69%) create mode 100644 docs/tutorials/backend-to-backend-auth.md diff --git a/docs/tutorials/authenticate-api-requests.md b/contrib/docs/tutorials/authenticate-api-requests.md similarity index 69% rename from docs/tutorials/authenticate-api-requests.md rename to contrib/docs/tutorials/authenticate-api-requests.md index 33d7d2cb31..9f651ddd1a 100644 --- a/docs/tutorials/authenticate-api-requests.md +++ b/contrib/docs/tutorials/authenticate-api-requests.md @@ -1,45 +1,12 @@ ---- -id: authenticate-api-requests -title: Authenticating API Requests -description: Guide for authenticating API requests within Backstage ---- - -> This document has been moved over from the community contributed docs -> directory and will continue to evolve as request authentication/authorization -> becomes a first-class citizen of Backstage. The approach described here is now -> fully supported and functional end-to-end, but will eventually be replaced in -> favor of a built-in framework that will broadly support authentication and -> authorization needs within Backstage. - # Authenticate API requests -The Backstage backend APIs are by default available without authentication. To -avoid evil-doers from accessing or modifying data, one might use a network -protection mechanism such as a firewall or an authenticating reverse proxy. For -Backstage instances that are available on the Internet one can instead use the -experimental IdentityClient as outlined below. +The Backstage backend APIs are by default available without authentication. To avoid evil-doers from accessing or modifying data, one might use a network protection mechanism such as a firewall or an authenticating reverse proxy. For Backstage instances that are available on the Internet one can instead use the experimental IdentityClient as outlined below. -API requests from frontend plugins include an authorization header with a -Backstage identity token acquired when the user logs in. By adding a middleware -that verifies said token to be valid and signed by Backstage, non-authenticated -requests can be blocked with a 401 Unauthorized response. +API requests from frontend plugins include an authorization header with a Backstage identity token acquired when the user logs in. By adding a middleware that verifies said token to be valid and signed by Backstage, non-authenticated requests can be blocked with a 401 Unauthorized response. -**NOTE**: Enabling this means that Backstage will stop working for guests, as no -token is issued for them. +**NOTE**: Enabling this means that Backstage will stop working for guests, as no token is issued for them. -Since the middleware always expects a valid token, API requests from backend -plugins will need one as well. Backends have no concept of a Backstage identity -so instead they use a token generated using a shared key from the -`app-config.yaml`. You can generate a unique key for your app in a terminal, and -set the `BACKEND_SECRET` environment variable to the resulting value. - -```bash -node -p 'require("crypto").randomBytes(24).toString("base64")' -``` - -As techdocs HTML pages load assets without an Authorization header the code -below also sets a token cookie when the user logs in (and when the token is -about to expire). +As techdocs HTML pages load assets without an Authorization header the code below also sets a token cookie when the user logs in (and when the token is about to expire). ```typescript // packages/backend/src/index.ts from a create-app deployment @@ -93,13 +60,7 @@ async function main() { const token = IdentityClient.getBearerToken(req.headers.authorization) || req.cookies['token']; - - // Authenticate all requests originating from backends by default - const isValidServerToken = authEnv.tokenManager.validateToken(token); - if (!isValidServerToken) { - req.user = await identity.authenticate(token); - } - + req.user = await identity.authenticate(token); if (!req.headers.authorization) { // Authorization header may be forwarded by plugin requests req.headers.authorization = `Bearer ${token}`; @@ -221,10 +182,9 @@ const app = createApp({ // ... ``` -**NOTE**: Most Backstage frontend plugins come with the support for the -`IdentityApi`. In case you already have a dozen of internal ones, you may need -to update those too. Assuming you follow the common plugin structure, the -changes to your front-end may look like: +**NOTE**: Most Backstage frontend plugins come with the support for the `IdentityApi`. +In case you already have a dozen of internal ones, you may need to update those too. +Assuming you follow the common plugin structure, the changes to your front-end may look like: ```diff // plugins/internal-plugin/src/api.ts @@ -301,30 +261,3 @@ export const plugin = createPlugin({ ], }); ``` - -In the (probably unlikely) case that you need to authenticate from a backend -plugin, the plugin environment contains a `tokenManager` that will provide a -server token to use in the request. It is a noop `tokenManager` by default -- -you'll need to instantiate a new one using the secret from your config instead: - -```diff -// packages/backend/src/index.ts - -function makeCreateEnv(config: Config) { - const root = getRootLogger(); - const reader = UrlReaders.default({ logger: root, config }); - const discovery = SingleHostDiscovery.fromConfig(config); - - root.info(`Created UrlReader ${reader}`); - - const cacheManager = CacheManager.fromConfig(config); - const databaseManager = DatabaseManager.fromConfig(config); -- const tokenManager = ServerTokenManager.noop(); -+ const tokenManager = ServerTokenManager.fromConfig(config); -``` - -With this `tokenManager`, you can then generate a server token for requests: - -``` -const { token } = await this.tokenManager.getToken(); -``` diff --git a/docs/tutorials/backend-to-backend-auth.md b/docs/tutorials/backend-to-backend-auth.md new file mode 100644 index 0000000000..b49a9fe3b5 --- /dev/null +++ b/docs/tutorials/backend-to-backend-auth.md @@ -0,0 +1,71 @@ +--- +id: backend-to-backend-auth +title: Backend-to-Backend Authentication +description: + Guide for authenticating API requests between Backstage plugin backends +--- + +This tutorial describes the steps needed to handle _backend-to-backend +authentication_, which allows plugin backends to determine whether a given +request originates from a legitimate Backstage backend by verifying a token +signed with a shared secret. This system has limited use for now, but will be +needed to support the upcoming framework for permissions and authorization (see +[the PRFC on the topic](https://github.com/backstage/backstage/pull/7761) for +more details). + +Backends have no concept of a Backstage identity, so instead they use a token +generated using a shared key stored in config. You can generate a unique key for +your app in a terminal, and set the `BACKEND_SECRET` environment variable to the +resulting value. + +```bash +node -p 'require("crypto").randomBytes(24).toString("base64")' +``` + +Requests originating from a backend plugin can be authenticated by decorating +them with a backend token. Backend tokens can be generated using a +`TokenManager`, which can be passed to plugin backends via the +`PluginEnvironment`. The `TokenManager` provided in new Backstage instances +generated by `create-app` is a stub, which returns empty tokens and accepts any +input string as valid. To enable backend-to-backend authentication, you'll need +to instantiate a new one using the secret from your config instead: + +```diff +// packages/backend/src/index.ts + +function makeCreateEnv(config: Config) { + const root = getRootLogger(); + const reader = UrlReaders.default({ logger: root, config }); + const discovery = SingleHostDiscovery.fromConfig(config); + + root.info(`Created UrlReader ${reader}`); + + const cacheManager = CacheManager.fromConfig(config); + const databaseManager = DatabaseManager.fromConfig(config); +- const tokenManager = ServerTokenManager.noop(); ++ const tokenManager = ServerTokenManager.fromConfig(config); +``` + +With this `tokenManager`, you can then generate a server token for requests: + +```typescript +const { token } = await this.tokenManager.getToken(); + +const response = await fetch(pluginBackendApiUrl, { + method: 'GET', + headers: { + ...headers, + Authorization: `Bearer ${token}`, + }, +}); +``` + +You can use the same `tokenManager` to validate tokens supplied on incoming +requests: + +```typescript +const isValidServerToken = await tokenManager.validateToken(token); +if (!isValidServerToken) { + throw new UnauthorizedError(); +} +``` From c8445162356bef7008115722a474c88b1be84c98 Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Thu, 25 Nov 2021 12:22:52 +0000 Subject: [PATCH 109/131] docs: fix reference to backend-to-backend auth tutorial docs Signed-off-by: MT Lewis --- app-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app-config.yaml b/app-config.yaml index 08dd2837e4..d3dad59c2f 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -24,7 +24,7 @@ app: backend: # Used for enabling authentication, secret is shared by all backend plugins - # See authenticate-api-requests.md in the contrib docs for information on the format + # See backend-to-backend-auth.md in the docs for information on the format # auth: # secret: ${BACKEND_SECRET} baseUrl: http://localhost:7007 From 51608d2021fccc7e305e5ffcc26e2268f6e2d9e3 Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Thu, 25 Nov 2021 18:16:37 +0000 Subject: [PATCH 110/131] backend-common: bits->bytes in config schema comment Signed-off-by: MT Lewis --- packages/backend-common/config.d.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/backend-common/config.d.ts b/packages/backend-common/config.d.ts index 66b54d1ebb..3ba3d83ebc 100644 --- a/packages/backend-common/config.d.ts +++ b/packages/backend-common/config.d.ts @@ -23,8 +23,9 @@ export interface Config { /** Backend configuration for when request authentication is enabled */ auth?: { /** - * Secret shared by all backends for generating tokens - * Format is base64 24-bit key + * Secret shared by all backends for generating tokens. Should be + * a base64 string, recommended length is 24 bytes. + * * @visibility secret */ secret: string; From 189f7f8a722ad94b466d494912aafd3a0418c04b Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Thu, 25 Nov 2021 18:42:07 +0000 Subject: [PATCH 111/131] backend-common: allow for multiple signing keys in ServerTokenManager Signed-off-by: MT Lewis --- app-config.yaml | 3 +- packages/backend-common/config.d.ts | 17 +++++---- .../src/tokens/ServerTokenManager.test.ts | 38 +++++++++++++++++-- .../src/tokens/ServerTokenManager.ts | 29 ++++++++------ 4 files changed, 64 insertions(+), 23 deletions(-) diff --git a/app-config.yaml b/app-config.yaml index d3dad59c2f..913a72dbab 100644 --- a/app-config.yaml +++ b/app-config.yaml @@ -26,7 +26,8 @@ backend: # Used for enabling authentication, secret is shared by all backend plugins # See backend-to-backend-auth.md in the docs for information on the format # auth: - # secret: ${BACKEND_SECRET} + # keys: + # - secret: ${BACKEND_SECRET} baseUrl: http://localhost:7007 listen: port: 7007 diff --git a/packages/backend-common/config.d.ts b/packages/backend-common/config.d.ts index 3ba3d83ebc..bdc7740c13 100644 --- a/packages/backend-common/config.d.ts +++ b/packages/backend-common/config.d.ts @@ -22,13 +22,16 @@ export interface Config { backend: { /** Backend configuration for when request authentication is enabled */ auth?: { - /** - * Secret shared by all backends for generating tokens. Should be - * a base64 string, recommended length is 24 bytes. - * - * @visibility secret - */ - secret: string; + /** Keys shared by all backends for signing and validating backend tokens. */ + keys: { + /** + * Secret for generating tokens. Should be a base64 string, recommended + * length is 24 bytes. + * + * @visibility secret + */ + secret: string; + }[]; }; baseUrl: string; // defined in core, but repeated here without doc diff --git a/packages/backend-common/src/tokens/ServerTokenManager.test.ts b/packages/backend-common/src/tokens/ServerTokenManager.test.ts index 20e18e9080..c00f708179 100644 --- a/packages/backend-common/src/tokens/ServerTokenManager.test.ts +++ b/packages/backend-common/src/tokens/ServerTokenManager.test.ts @@ -18,7 +18,7 @@ import { ServerTokenManager } from './ServerTokenManager'; const emptyConfig = new ConfigReader({}); const configWithSecret = new ConfigReader({ - backend: { auth: { secret: 'a-secret-key' } }, + backend: { auth: { keys: [{ secret: 'a-secret-key' }] } }, }); describe('ServerTokenManager', () => { @@ -61,12 +61,42 @@ describe('ServerTokenManager', () => { expect(() => tokenManager2.validateToken(token)).not.toThrow(); }); - it('should throw for server tokens created using a different secret', async () => { + it('should validate server tokens created using any of the secrets', async () => { const tokenManager1 = ServerTokenManager.fromConfig( - new ConfigReader({ backend: { auth: { secret: 'a1b2c3' } } }), + new ConfigReader({ + backend: { auth: { keys: [{ secret: 'a1b2c3' }] } }, + }), ); const tokenManager2 = ServerTokenManager.fromConfig( - new ConfigReader({ backend: { auth: { secret: 'd4e5f6' } } }), + new ConfigReader({ + backend: { auth: { keys: [{ secret: 'd4e5f6' }] } }, + }), + ); + const tokenManager3 = ServerTokenManager.fromConfig( + new ConfigReader({ + backend: { + auth: { keys: [{ secret: 'a1b2c3' }, { secret: 'd4e5f6' }] }, + }, + }), + ); + + const { token: token1 } = await tokenManager1.getToken(); + expect(() => tokenManager3.validateToken(token1)).not.toThrow(); + + const { token: token2 } = await tokenManager2.getToken(); + expect(() => tokenManager3.validateToken(token2)).not.toThrow(); + }); + + it('should throw for server tokens created using a different secret', async () => { + const tokenManager1 = ServerTokenManager.fromConfig( + new ConfigReader({ + backend: { auth: { keys: [{ secret: 'a1b2c3' }] } }, + }), + ); + const tokenManager2 = ServerTokenManager.fromConfig( + new ConfigReader({ + backend: { auth: { keys: [{ secret: 'd4e5f6' }] } }, + }), ); const { token } = await tokenManager1.getToken(); diff --git a/packages/backend-common/src/tokens/ServerTokenManager.ts b/packages/backend-common/src/tokens/ServerTokenManager.ts index e4afc2997e..ea79497b42 100644 --- a/packages/backend-common/src/tokens/ServerTokenManager.ts +++ b/packages/backend-common/src/tokens/ServerTokenManager.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { JWK, JWT } from 'jose'; +import { JWKS, JWK, JWT } from 'jose'; import { Config } from '@backstage/config'; import { AuthenticationError } from '@backstage/errors'; import { TokenManager } from './types'; @@ -26,40 +26,47 @@ import { TokenManager } from './types'; * @public */ export class ServerTokenManager implements TokenManager { - private key: JWK.OctKey | JWK.NoneKey; + private readonly keyStore: JWKS.KeyStore; static noop() { return new ServerTokenManager(); } static fromConfig(config: Config) { - const secret = config.getString('backend.auth.secret'); - - return new ServerTokenManager(secret); + return new ServerTokenManager( + config + .getConfigArray('backend.auth.keys') + .map(key => key.getString('secret')), + ); } - private constructor(secret: string = '') { - this.key = secret ? JWK.asKey({ kty: 'oct', k: secret }) : JWK.None; + private constructor(secrets?: string[]) { + this.keyStore = new JWKS.KeyStore( + secrets?.length + ? secrets.map(secret => JWK.asKey({ kty: 'oct', k: secret })) + : [], + ); } async getToken(): Promise<{ token: string }> { - if (this.key === JWK.None) { + if (this.keyStore.size === 0) { return { token: '' }; } - const jwt = JWT.sign({ sub: 'backstage-server' }, this.key, { + const jwt = JWT.sign({ sub: 'backstage-server' }, this.keyStore.all()[0], { algorithm: 'HS256', }); + return { token: jwt }; } validateToken(token: string): void { - if (this.key === JWK.None) { + if (this.keyStore.size === 0) { return; } try { - JWT.verify(token, this.key); + JWT.verify(token, this.keyStore); return; } catch (e) { throw new AuthenticationError('Invalid server token'); From 4e6b2319a23e37546208777b60dfc20cee6131b8 Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Thu, 25 Nov 2021 18:00:33 +0000 Subject: [PATCH 112/131] backend-common: include self-reported pluginId in backend token Signed-off-by: MT Lewis --- .../src/tokens/ServerTokenManager.test.ts | 98 ++++++++++++++----- .../src/tokens/ServerTokenManager.ts | 44 +++++---- packages/backend-common/src/tokens/types.ts | 22 ++++- 3 files changed, 115 insertions(+), 49 deletions(-) diff --git a/packages/backend-common/src/tokens/ServerTokenManager.test.ts b/packages/backend-common/src/tokens/ServerTokenManager.test.ts index c00f708179..361d98121e 100644 --- a/packages/backend-common/src/tokens/ServerTokenManager.test.ts +++ b/packages/backend-common/src/tokens/ServerTokenManager.test.ts @@ -29,36 +29,46 @@ describe('ServerTokenManager', () => { describe('getToken', () => { it('should return a token if secret in config exists', async () => { const tokenManager = ServerTokenManager.fromConfig(configWithSecret); - expect((await tokenManager.getToken()).token).toBeDefined(); + expect((await tokenManager.getToken('test-plugin')).token).toBeDefined(); }); - it('should return an empty string if using a noop TokenManager', async () => { + it('should return a token string if using a noop TokenManager', async () => { const tokenManager = ServerTokenManager.noop(); - expect((await tokenManager.getToken()).token).toBe(''); + expect((await tokenManager.getToken('test-plugin')).token).toBeDefined(); }); }); - describe('validateToken', () => { + describe('authenticate', () => { it('should not throw if token is valid', async () => { const tokenManager = ServerTokenManager.fromConfig(configWithSecret); - const { token } = await tokenManager.getToken(); - expect(() => tokenManager.validateToken(token)).not.toThrow(); + const { token } = await tokenManager.getToken('test-plugin'); + await expect(tokenManager.authenticate(token)).resolves.not.toThrow(); }); - it('should throw if token is invalid', () => { + it('should allow retrieving the pluginId from valid tokens', async () => { const tokenManager = ServerTokenManager.fromConfig(configWithSecret); - expect(() => tokenManager.validateToken('random-string')).toThrowError( - /invalid server token/i, - ); + const { token } = await tokenManager.getToken('test-plugin-123'); + + await expect(tokenManager.authenticate(token)).resolves.toEqual({ + pluginId: 'test-plugin-123', + token, + }); + }); + + it('should throw if token is invalid', async () => { + const tokenManager = ServerTokenManager.fromConfig(configWithSecret); + await expect( + tokenManager.authenticate('random-string'), + ).rejects.toThrowError(/invalid server token/i); }); it('should validate server tokens created by a different instance using the same secret', async () => { const tokenManager1 = ServerTokenManager.fromConfig(configWithSecret); const tokenManager2 = ServerTokenManager.fromConfig(configWithSecret); - const { token } = await tokenManager1.getToken(); + const { token } = await tokenManager1.getToken('test-plugin'); - expect(() => tokenManager2.validateToken(token)).not.toThrow(); + await expect(tokenManager2.authenticate(token)).resolves.not.toThrow(); }); it('should validate server tokens created using any of the secrets', async () => { @@ -80,11 +90,11 @@ describe('ServerTokenManager', () => { }), ); - const { token: token1 } = await tokenManager1.getToken(); - expect(() => tokenManager3.validateToken(token1)).not.toThrow(); + const { token: token1 } = await tokenManager1.getToken('test-plugin'); + await expect(tokenManager3.authenticate(token1)).resolves.not.toThrow(); - const { token: token2 } = await tokenManager2.getToken(); - expect(() => tokenManager3.validateToken(token2)).not.toThrow(); + const { token: token2 } = await tokenManager2.getToken('test-plugin'); + await expect(tokenManager3.authenticate(token2)).resolves.not.toThrow(); }); it('should throw for server tokens created using a different secret', async () => { @@ -99,9 +109,24 @@ describe('ServerTokenManager', () => { }), ); - const { token } = await tokenManager1.getToken(); + const { token } = await tokenManager1.getToken('test-plugin'); - expect(() => tokenManager2.validateToken(token)).toThrowError( + await expect(tokenManager2.authenticate(token)).rejects.toThrowError( + /invalid server token/i, + ); + }); + + it('should throw for server tokens created using a noop TokenManager', async () => { + const noopTokenManager = ServerTokenManager.noop(); + const tokenManager = ServerTokenManager.fromConfig( + new ConfigReader({ + backend: { auth: { keys: [{ secret: 'a1b2c3' }] } }, + }), + ); + + const { token } = await noopTokenManager.getToken('test-plugin'); + + await expect(tokenManager.authenticate(token)).rejects.toThrowError( /invalid server token/i, ); }); @@ -115,19 +140,40 @@ describe('ServerTokenManager', () => { }); it('should accept tokens it generates', async () => { - const { token } = await noopTokenManager.getToken(); + const { token } = await noopTokenManager.getToken('test-plugin'); - expect(() => noopTokenManager.validateToken(token)).not.toThrow(); + await expect(noopTokenManager.authenticate(token)).resolves.not.toThrow(); }); - it('should accept arbitrary strings', async () => { - expect(() => - noopTokenManager.validateToken('random-string'), - ).not.toThrow(); + it('should accept tokens generated by other noop token managers', async () => { + const noopTokenManager2 = ServerTokenManager.noop(); + await expect( + noopTokenManager.authenticate( + ( + await noopTokenManager2.getToken('test-plugin') + ).token, + ), + ).resolves.not.toThrow(); }); - it('should accept empty strings', async () => { - expect(() => noopTokenManager.validateToken('')).not.toThrow(); + it('should not accept signed tokens', async () => { + const tokenManager = ServerTokenManager.fromConfig(configWithSecret); + await expect( + noopTokenManager.authenticate( + ( + await tokenManager.getToken('test-plugin') + ).token, + ), + ).rejects.toThrowError(/invalid server token/i); + }); + + it('should allow retrieving the pluginId from valid tokens', async () => { + const { token } = await noopTokenManager.getToken('test-plugin-123'); + + await expect(noopTokenManager.authenticate(token)).resolves.toEqual({ + pluginId: 'test-plugin-123', + token, + }); }); }); }); diff --git a/packages/backend-common/src/tokens/ServerTokenManager.ts b/packages/backend-common/src/tokens/ServerTokenManager.ts index ea79497b42..01ebf55f15 100644 --- a/packages/backend-common/src/tokens/ServerTokenManager.ts +++ b/packages/backend-common/src/tokens/ServerTokenManager.ts @@ -17,7 +17,7 @@ import { JWKS, JWK, JWT } from 'jose'; import { Config } from '@backstage/config'; import { AuthenticationError } from '@backstage/errors'; -import { TokenManager } from './types'; +import { ServerIdentity, TokenManager } from './types'; /** * Creates and validates tokens for use during backend-to-backend @@ -26,7 +26,9 @@ import { TokenManager } from './types'; * @public */ export class ServerTokenManager implements TokenManager { - private readonly keyStore: JWKS.KeyStore; + private readonly verificationKeys: JWKS.KeyStore | JWK.NoneKey; + private readonly signingKey: JWK.Key | JWK.NoneKey; + private readonly signingAlgorithm: string | undefined; static noop() { return new ServerTokenManager(); @@ -41,35 +43,35 @@ export class ServerTokenManager implements TokenManager { } private constructor(secrets?: string[]) { - this.keyStore = new JWKS.KeyStore( - secrets?.length - ? secrets.map(secret => JWK.asKey({ kty: 'oct', k: secret })) - : [], - ); + if (secrets?.length) { + this.verificationKeys = new JWKS.KeyStore( + secrets.map(k => JWK.asKey({ kty: 'oct', k })), + ); + this.signingKey = this.verificationKeys.all()[0]; + this.signingAlgorithm = 'HS256'; + } else { + this.verificationKeys = this.signingKey = JWK.None; + } } - async getToken(): Promise<{ token: string }> { - if (this.keyStore.size === 0) { - return { token: '' }; - } - - const jwt = JWT.sign({ sub: 'backstage-server' }, this.keyStore.all()[0], { - algorithm: 'HS256', + async getToken(pluginId: string): Promise<{ token: string }> { + // TODO(mtlewis): should we wrap pluginId in a urn? + const jwt = JWT.sign({ sub: pluginId }, this.signingKey, { + algorithm: this.signingAlgorithm, }); return { token: jwt }; } - validateToken(token: string): void { - if (this.keyStore.size === 0) { - return; - } - + async authenticate(token: string): Promise { + let decodedJwt = {}; try { - JWT.verify(token, this.keyStore); - return; + JWT.verify(token, this.verificationKeys); + decodedJwt = JWT.decode(token); } catch (e) { throw new AuthenticationError('Invalid server token'); } + + return { pluginId: decodedJwt.sub, token }; } } diff --git a/packages/backend-common/src/tokens/types.ts b/packages/backend-common/src/tokens/types.ts index ede582de26..fdf54d4712 100644 --- a/packages/backend-common/src/tokens/types.ts +++ b/packages/backend-common/src/tokens/types.ts @@ -14,12 +14,30 @@ * limitations under the License. */ +/** + * A (pluginId, token) pair. + * + * @public + */ +export type ServerIdentity = { + /** + * The ID of the plugin backend to which this + * identity corresponds. + */ + pluginId: string; + + /** + * The token used to authenticate the plugin backend. + */ + token: string; +}; + /** * Interface for creating and validating tokens. * * @public */ export interface TokenManager { - getToken: () => Promise<{ token: string }>; - validateToken: (token: string) => void; + getToken: (pluginId: string) => Promise<{ token: string }>; + authenticate: (token: string) => Promise; } From ed5bef529e570c52c47a188d96d4b57a1c3a400d Mon Sep 17 00:00:00 2001 From: jrusso1020 Date: Thu, 25 Nov 2021 20:10:47 -0500 Subject: [PATCH 113/131] Add swimlanes to scaffolder page Add swimlane filtering to the scaffolder page. This will allow developers to surface specific templates ahead of others or group templates together. This is just a first pass, in the future we can also all developers to customize the listing component for fancier one Fixes https://github.com/backstage/backstage/issues/6661s Signed-off-by: jrusso1020 --- .changeset/witty-cats-tell.md | 6 ++ packages/app/src/App.tsx | 16 +++- plugins/scaffolder/api-report.md | 15 ++- plugins/scaffolder/src/components/Router.tsx | 16 +++- .../ScaffolderPage/ScaffolderPage.tsx | 21 +++- .../components/TemplateList/TemplateList.tsx | 96 ++++++++++++++----- 6 files changed, 137 insertions(+), 33 deletions(-) create mode 100644 .changeset/witty-cats-tell.md diff --git a/.changeset/witty-cats-tell.md b/.changeset/witty-cats-tell.md new file mode 100644 index 0000000000..c60be53d03 --- /dev/null +++ b/.changeset/witty-cats-tell.md @@ -0,0 +1,6 @@ +--- +'example-app': patch +'@backstage/plugin-scaffolder': patch +--- + +Add swim lane filtering to the scaffolder page so that individuals can surface specific templates to end users ahead of others, or group templates together diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index 401665b62e..b1a2235288 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -32,6 +32,7 @@ import { AlertDisplay, OAuthRequestDialog, SignInPage, + ContentHeader, } from '@backstage/core-components'; import { apiDocsPlugin, ApiExplorerPage } from '@backstage/plugin-api-docs'; import { @@ -175,7 +176,20 @@ const routes = ( > {techDocsPage} - }> + , + filter: entity => + entity?.metadata?.tags?.includes('recommended') || false, + }, + ]} + /> + } + > diff --git a/plugins/scaffolder/api-report.md b/plugins/scaffolder/api-report.md index 0ac6910264..164f9acf83 100644 --- a/plugins/scaffolder/api-report.md +++ b/plugins/scaffolder/api-report.md @@ -24,6 +24,7 @@ import { JSONSchema } from '@backstage/catalog-model'; import { JsonValue } from '@backstage/types'; import { Observable } from '@backstage/types'; import { default as React_2 } from 'react'; +import { ReactNode } from 'react'; import { RouteRef } from '@backstage/core-plugin-api'; import { ScmIntegrationRegistry } from '@backstage/integration'; import { TemplateEntityV1beta2 } from '@backstage/catalog-model'; @@ -213,12 +214,19 @@ export const ScaffolderFieldExtensions: React_2.ComponentType; // @public (undocumented) export const ScaffolderPage: ({ TemplateCardComponent, + ExtraSwimlanes, }: { TemplateCardComponent?: | ComponentType<{ template: TemplateEntityV1beta2; }> | undefined; + ExtraSwimlanes?: + | { + title: ReactNode; + filter: (entity: Entity) => boolean; + }[] + | undefined; }) => JSX.Element; // Warning: (ae-missing-release-tag) "scaffolderPlugin" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) @@ -240,7 +248,8 @@ export { scaffolderPlugin }; // @public (undocumented) export const TemplateList: ({ TemplateCardComponent, -}: TemplateListProps) => JSX.Element; + Swimlane, +}: TemplateListProps) => JSX.Element | null; // Warning: (ae-missing-release-tag) "TemplateListProps" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) // @@ -251,6 +260,10 @@ export type TemplateListProps = { template: TemplateEntityV1beta2; }> | undefined; + Swimlane?: { + title: React_2.ReactNode; + filter: (entity: Entity) => boolean; + }; }; // Warning: (ae-missing-release-tag) "TemplateTypePicker" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) diff --git a/plugins/scaffolder/src/components/Router.tsx b/plugins/scaffolder/src/components/Router.tsx index 9e4736ab9f..5d4e750777 100644 --- a/plugins/scaffolder/src/components/Router.tsx +++ b/plugins/scaffolder/src/components/Router.tsx @@ -16,7 +16,7 @@ import React, { ComponentType } from 'react'; import { Routes, Route, useOutlet } from 'react-router'; -import { TemplateEntityV1beta2 } from '@backstage/catalog-model'; +import { TemplateEntityV1beta2, Entity } from '@backstage/catalog-model'; import { ScaffolderPage } from './ScaffolderPage'; import { TemplatePage } from './TemplatePage'; import { TaskPage } from './TaskPage'; @@ -34,9 +34,16 @@ type RouterProps = { TemplateCardComponent?: | ComponentType<{ template: TemplateEntityV1beta2 }> | undefined; + ExtraSwimlanes?: Array<{ + title: React.ReactNode; + filter: (entity: Entity) => boolean; + }>; }; -export const Router = ({ TemplateCardComponent }: RouterProps) => { +export const Router = ({ + TemplateCardComponent, + ExtraSwimlanes, +}: RouterProps) => { const outlet = useOutlet(); const customFieldExtensions = useElementFilter(outlet, elements => @@ -64,7 +71,10 @@ export const Router = ({ TemplateCardComponent }: RouterProps) => { + } /> | undefined; + ExtraSwimlanes?: Array<{ + title: React.ReactNode; + filter: (entity: Entity) => boolean; + }>; }; export const ScaffolderPageContents = ({ TemplateCardComponent, + ExtraSwimlanes, }: ScaffolderPageProps) => { const styles = useStyles(); - const registerComponentLink = useRouteRef(registerComponentRouteRef); return ( @@ -96,6 +100,13 @@ export const ScaffolderPageContents = ({
+ {ExtraSwimlanes && + ExtraSwimlanes.map(swimlane => ( + + ))}
@@ -106,8 +117,12 @@ export const ScaffolderPageContents = ({ export const ScaffolderPage = ({ TemplateCardComponent, + ExtraSwimlanes, }: ScaffolderPageProps) => ( - + ); diff --git a/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx b/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx index dcf708db10..939fe7f59c 100644 --- a/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx +++ b/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx @@ -16,10 +16,13 @@ import React, { ComponentType } from 'react'; import { + Entity, stringifyEntityRef, TemplateEntityV1beta2, } from '@backstage/catalog-model'; import { + Content, + ContentHeader, ItemCardGrid, Progress, WarningPanel, @@ -32,41 +35,84 @@ export type TemplateListProps = { TemplateCardComponent?: | ComponentType<{ template: TemplateEntityV1beta2 }> | undefined; + Swimlane?: { + title: React.ReactNode; + filter: (entity: Entity) => boolean; + }; }; -export const TemplateList = ({ TemplateCardComponent }: TemplateListProps) => { +type TemplateCardGridProps = { + Card: ComponentType<{ template: TemplateEntityV1beta2 }>; + entities: Entity[]; +}; +const TemplateCardGrid = ({ Card, entities }: TemplateCardGridProps) => { + return ( + + {entities && + entities?.length > 0 && + entities.map((template: Entity) => ( + + ))} + + ); +}; + +export const TemplateList = ({ + TemplateCardComponent, + Swimlane, +}: TemplateListProps) => { const { loading, error, entities } = useEntityListProvider(); const Card = TemplateCardComponent || TemplateCard; - return ( - <> - {loading && } + if (Swimlane === null || Swimlane === undefined) { + return ( + <> + {loading && } + {error && ( + + {error.message} + + )} + + {!error && !loading && !entities.length && ( + + No templates found that match your filter. Learn more about{' '} + + adding templates + + . + + )} + + + + + + ); + } + + const filteredEntities = entities.filter((entity: Entity) => + Swimlane.filter(entity), + ); + + if (filteredEntities.length === 0) { + return null; + } + + return ( + + {Swimlane.title} + {loading && } {error && ( {error.message} )} - {!error && !loading && !entities.length && ( - - No templates found that match your filter. Learn more about{' '} - - adding templates - - . - - )} - - - {entities && - entities?.length > 0 && - entities.map(template => ( - - ))} - - + + ); }; From 6474ddd47dbe65fcf7eafd57e02be43a2dcacddb Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Nov 2021 04:07:07 +0000 Subject: [PATCH 114/131] build(deps-dev): bump prettier from 2.4.1 to 2.5.0 in /microsite Bumps [prettier](https://github.com/prettier/prettier) from 2.4.1 to 2.5.0. - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/2.4.1...2.5.0) --- updated-dependencies: - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- microsite/package.json | 2 +- microsite/yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/microsite/package.json b/microsite/package.json index a2a2fd98de..a24de8935d 100644 --- a/microsite/package.json +++ b/microsite/package.json @@ -19,7 +19,7 @@ "@spotify/prettier-config": "^12.0.0", "docusaurus": "^2.0.0-alpha.70", "js-yaml": "^4.1.0", - "prettier": "^2.4.1", + "prettier": "^2.5.0", "yarn-lock-check": "^1.0.5" }, "prettier": "@spotify/prettier-config" diff --git a/microsite/yarn.lock b/microsite/yarn.lock index c03ecf989a..9946f4914d 100644 --- a/microsite/yarn.lock +++ b/microsite/yarn.lock @@ -5190,10 +5190,10 @@ prepend-http@^2.0.0: resolved "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc= -prettier@^2.4.1: - version "2.4.1" - resolved "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" - integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== +prettier@^2.5.0: + version "2.5.0" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.5.0.tgz#a6370e2d4594e093270419d9cc47f7670488f893" + integrity sha512-FM/zAKgWTxj40rH03VxzIPdXmj39SwSjwG0heUcNFwI+EMZJnY93yAiKXM3dObIKAM5TA88werc8T/EwhB45eg== prismjs@^1.22.0: version "1.25.0" From 5f2c584d6e1acb52502e1e0262d10eea35bc82b2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 26 Nov 2021 04:13:41 +0000 Subject: [PATCH 115/131] build(deps): bump immer from 9.0.6 to 9.0.7 Bumps [immer](https://github.com/immerjs/immer) from 9.0.6 to 9.0.7. - [Release notes](https://github.com/immerjs/immer/releases) - [Commits](https://github.com/immerjs/immer/compare/v9.0.6...v9.0.7) --- updated-dependencies: - dependency-name: immer dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- yarn.lock | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/yarn.lock b/yarn.lock index 5ca23c482e..728e662b8d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16709,12 +16709,7 @@ immer@8.0.1: resolved "https://registry.npmjs.org/immer/-/immer-8.0.1.tgz#9c73db683e2b3975c424fb0572af5889877ae656" integrity sha512-aqXhGP7//Gui2+UrEtvxZxSquQVXTpZ7KDxfCcKAF3Vysvw0CViVaW9RZ1j1xlIYqaaaipBoqdqeibkc18PNvA== -immer@^9.0.1: - version "9.0.6" - resolved "https://registry.npmjs.org/immer/-/immer-9.0.6.tgz#7a96bf2674d06c8143e327cbf73539388ddf1a73" - integrity sha512-G95ivKpy+EvVAnAab4fVa4YGYn24J1SpEktnJX7JJ45Bd7xqME/SCplFzYFmTbrkwZbQ4xJK1xMTUYBkN6pWsQ== - -immer@^9.0.6: +immer@^9.0.1, immer@^9.0.6: version "9.0.7" resolved "https://registry.npmjs.org/immer/-/immer-9.0.7.tgz#b6156bd7db55db7abc73fd2fdadf4e579a701075" integrity sha512-KGllzpbamZDvOIxnmJ0jI840g7Oikx58lBPWV0hUh7dtAyZpFqqrBZdKka5GlTwMTZ1Tjc/bKKW4VSFAt6BqMA== From 139f9b3f3691ab21422ef092fcdaad8392a9b25a Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Fri, 26 Nov 2021 10:25:32 +0100 Subject: [PATCH 116/131] Replace stalebot with stale workflow Signed-off-by: Johan Haals --- .github/stale.yml | 21 --------------------- .github/workflows/stale.yml | 6 ++---- 2 files changed, 2 insertions(+), 25 deletions(-) delete mode 100644 .github/stale.yml diff --git a/.github/stale.yml b/.github/stale.yml deleted file mode 100644 index 3cd0d53720..0000000000 --- a/.github/stale.yml +++ /dev/null @@ -1,21 +0,0 @@ -# Number of days of inactivity before an issue becomes stale -daysUntilStale: 60 -# Number of days of inactivity before a stale issue is closed -daysUntilClose: 7 -# Issues with these labels will never be considered stale -exemptLabels: - - pinned - - security - - plugin - - help wanted - - good first issue - - rfc -# Label to use when marking an issue as stale -staleLabel: stale -# Comment to post when marking an issue as stale. Set to `false` to disable -markComment: > - This issue has been automatically marked as stale because it has not had - recent activity. It will be closed if no further activity occurs. Thank you - for your contributions. -# Comment to post when closing a stale issue. Set to `false` to disable -closeComment: false diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index a5d6c1664f..4e8c7faad3 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -1,8 +1,8 @@ name: 'Stale workflow' on: workflow_dispatch: - # schedule: - # - cron: '0 0 * * *' # at 00:00 every day + schedule: + - cron: '*/10 * * * *' # run every 10 minutes as it also removes labels. jobs: stale: @@ -27,7 +27,5 @@ jobs: days-before-pr-close: 3 exempt-pr-labels: reviewer-approved,awaiting-review stale-pr-label: stale - # Will be removed once we are happy with the new workflow. - debug-only: true - name: Print outputs run: echo ${{ join(steps.stale.outputs.*, ',') }} From 5510cee0397028d2ccaad5e58674a5634afb00c0 Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Fri, 26 Nov 2021 10:21:11 +0000 Subject: [PATCH 117/131] backend-common: stop accepting self-reported pluginId in ServerTokenManager Until we have a solution for assigning plugin/backend identities in a way that's not open to impersonation, we can't build on top of this information, so it's better to leave it out for now. Signed-off-by: MT Lewis --- .../src/tokens/ServerTokenManager.test.ts | 45 +++++-------------- .../src/tokens/ServerTokenManager.ts | 13 ++---- packages/backend-common/src/tokens/types.ts | 22 +-------- 3 files changed, 17 insertions(+), 63 deletions(-) diff --git a/packages/backend-common/src/tokens/ServerTokenManager.test.ts b/packages/backend-common/src/tokens/ServerTokenManager.test.ts index 361d98121e..925c770a0d 100644 --- a/packages/backend-common/src/tokens/ServerTokenManager.test.ts +++ b/packages/backend-common/src/tokens/ServerTokenManager.test.ts @@ -29,32 +29,22 @@ describe('ServerTokenManager', () => { describe('getToken', () => { it('should return a token if secret in config exists', async () => { const tokenManager = ServerTokenManager.fromConfig(configWithSecret); - expect((await tokenManager.getToken('test-plugin')).token).toBeDefined(); + expect((await tokenManager.getToken()).token).toBeDefined(); }); it('should return a token string if using a noop TokenManager', async () => { const tokenManager = ServerTokenManager.noop(); - expect((await tokenManager.getToken('test-plugin')).token).toBeDefined(); + expect((await tokenManager.getToken()).token).toBeDefined(); }); }); describe('authenticate', () => { it('should not throw if token is valid', async () => { const tokenManager = ServerTokenManager.fromConfig(configWithSecret); - const { token } = await tokenManager.getToken('test-plugin'); + const { token } = await tokenManager.getToken(); await expect(tokenManager.authenticate(token)).resolves.not.toThrow(); }); - it('should allow retrieving the pluginId from valid tokens', async () => { - const tokenManager = ServerTokenManager.fromConfig(configWithSecret); - const { token } = await tokenManager.getToken('test-plugin-123'); - - await expect(tokenManager.authenticate(token)).resolves.toEqual({ - pluginId: 'test-plugin-123', - token, - }); - }); - it('should throw if token is invalid', async () => { const tokenManager = ServerTokenManager.fromConfig(configWithSecret); await expect( @@ -66,7 +56,7 @@ describe('ServerTokenManager', () => { const tokenManager1 = ServerTokenManager.fromConfig(configWithSecret); const tokenManager2 = ServerTokenManager.fromConfig(configWithSecret); - const { token } = await tokenManager1.getToken('test-plugin'); + const { token } = await tokenManager1.getToken(); await expect(tokenManager2.authenticate(token)).resolves.not.toThrow(); }); @@ -90,10 +80,10 @@ describe('ServerTokenManager', () => { }), ); - const { token: token1 } = await tokenManager1.getToken('test-plugin'); + const { token: token1 } = await tokenManager1.getToken(); await expect(tokenManager3.authenticate(token1)).resolves.not.toThrow(); - const { token: token2 } = await tokenManager2.getToken('test-plugin'); + const { token: token2 } = await tokenManager2.getToken(); await expect(tokenManager3.authenticate(token2)).resolves.not.toThrow(); }); @@ -109,7 +99,7 @@ describe('ServerTokenManager', () => { }), ); - const { token } = await tokenManager1.getToken('test-plugin'); + const { token } = await tokenManager1.getToken(); await expect(tokenManager2.authenticate(token)).rejects.toThrowError( /invalid server token/i, @@ -124,7 +114,7 @@ describe('ServerTokenManager', () => { }), ); - const { token } = await noopTokenManager.getToken('test-plugin'); + const { token } = await noopTokenManager.getToken(); await expect(tokenManager.authenticate(token)).rejects.toThrowError( /invalid server token/i, @@ -140,7 +130,7 @@ describe('ServerTokenManager', () => { }); it('should accept tokens it generates', async () => { - const { token } = await noopTokenManager.getToken('test-plugin'); + const { token } = await noopTokenManager.getToken(); await expect(noopTokenManager.authenticate(token)).resolves.not.toThrow(); }); @@ -150,7 +140,7 @@ describe('ServerTokenManager', () => { await expect( noopTokenManager.authenticate( ( - await noopTokenManager2.getToken('test-plugin') + await noopTokenManager2.getToken() ).token, ), ).resolves.not.toThrow(); @@ -159,21 +149,8 @@ describe('ServerTokenManager', () => { it('should not accept signed tokens', async () => { const tokenManager = ServerTokenManager.fromConfig(configWithSecret); await expect( - noopTokenManager.authenticate( - ( - await tokenManager.getToken('test-plugin') - ).token, - ), + noopTokenManager.authenticate((await tokenManager.getToken()).token), ).rejects.toThrowError(/invalid server token/i); }); - - it('should allow retrieving the pluginId from valid tokens', async () => { - const { token } = await noopTokenManager.getToken('test-plugin-123'); - - await expect(noopTokenManager.authenticate(token)).resolves.toEqual({ - pluginId: 'test-plugin-123', - token, - }); - }); }); }); diff --git a/packages/backend-common/src/tokens/ServerTokenManager.ts b/packages/backend-common/src/tokens/ServerTokenManager.ts index 01ebf55f15..7796b675b8 100644 --- a/packages/backend-common/src/tokens/ServerTokenManager.ts +++ b/packages/backend-common/src/tokens/ServerTokenManager.ts @@ -17,7 +17,7 @@ import { JWKS, JWK, JWT } from 'jose'; import { Config } from '@backstage/config'; import { AuthenticationError } from '@backstage/errors'; -import { ServerIdentity, TokenManager } from './types'; +import { TokenManager } from './types'; /** * Creates and validates tokens for use during backend-to-backend @@ -54,24 +54,19 @@ export class ServerTokenManager implements TokenManager { } } - async getToken(pluginId: string): Promise<{ token: string }> { - // TODO(mtlewis): should we wrap pluginId in a urn? - const jwt = JWT.sign({ sub: pluginId }, this.signingKey, { + async getToken(): Promise<{ token: string }> { + const jwt = JWT.sign({ sub: 'backstage-server' }, this.signingKey, { algorithm: this.signingAlgorithm, }); return { token: jwt }; } - async authenticate(token: string): Promise { - let decodedJwt = {}; + async authenticate(token: string): Promise { try { JWT.verify(token, this.verificationKeys); - decodedJwt = JWT.decode(token); } catch (e) { throw new AuthenticationError('Invalid server token'); } - - return { pluginId: decodedJwt.sub, token }; } } diff --git a/packages/backend-common/src/tokens/types.ts b/packages/backend-common/src/tokens/types.ts index fdf54d4712..1fea018db9 100644 --- a/packages/backend-common/src/tokens/types.ts +++ b/packages/backend-common/src/tokens/types.ts @@ -14,30 +14,12 @@ * limitations under the License. */ -/** - * A (pluginId, token) pair. - * - * @public - */ -export type ServerIdentity = { - /** - * The ID of the plugin backend to which this - * identity corresponds. - */ - pluginId: string; - - /** - * The token used to authenticate the plugin backend. - */ - token: string; -}; - /** * Interface for creating and validating tokens. * * @public */ export interface TokenManager { - getToken: (pluginId: string) => Promise<{ token: string }>; - authenticate: (token: string) => Promise; + getToken: () => Promise<{ token: string }>; + authenticate: (token: string) => Promise; } From 10d0109d2e897c35b3664801c39e4ea8599da3ba Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Fri, 26 Nov 2021 12:01:11 +0000 Subject: [PATCH 118/131] backend-common: extract NoopTokenManager from ServerTokenManager Signed-off-by: MT Lewis --- .../src/tokens/ServerTokenManager.test.ts | 39 +++++++++++++++++-- .../src/tokens/ServerTokenManager.ts | 32 +++++++++------ 2 files changed, 56 insertions(+), 15 deletions(-) diff --git a/packages/backend-common/src/tokens/ServerTokenManager.test.ts b/packages/backend-common/src/tokens/ServerTokenManager.test.ts index 925c770a0d..fe724a0a4b 100644 --- a/packages/backend-common/src/tokens/ServerTokenManager.test.ts +++ b/packages/backend-common/src/tokens/ServerTokenManager.test.ts @@ -14,6 +14,7 @@ * limitations under the License. */ import { ConfigReader } from '@backstage/config'; +import { TokenManager } from './types'; import { ServerTokenManager } from './ServerTokenManager'; const emptyConfig = new ConfigReader({}); @@ -122,8 +123,40 @@ describe('ServerTokenManager', () => { }); }); + describe('ServerTokenManager.fromConfig', () => { + it('should throw if backend auth configuration is missing', () => { + expect(() => + ServerTokenManager.fromConfig(new ConfigReader({})), + ).toThrow(); + }); + + it('should throw if no keys are included in the configuration', () => { + expect(() => + ServerTokenManager.fromConfig( + new ConfigReader({ + backend: { auth: { keys: [] } }, + }), + ), + ).toThrow(); + }); + + it('should throw if any key is missing a secret property', () => { + expect(() => + ServerTokenManager.fromConfig( + new ConfigReader({ + backend: { + auth: { + keys: [{ secret: '123' }, {}, { secret: '789' }], + }, + }, + }), + ), + ).toThrow(); + }); + }); + describe('ServerTokenManager.noop', () => { - let noopTokenManager: ServerTokenManager; + let noopTokenManager: TokenManager; beforeEach(() => { noopTokenManager = ServerTokenManager.noop(); @@ -146,11 +179,11 @@ describe('ServerTokenManager', () => { ).resolves.not.toThrow(); }); - it('should not accept signed tokens', async () => { + it('should accept signed tokens', async () => { const tokenManager = ServerTokenManager.fromConfig(configWithSecret); await expect( noopTokenManager.authenticate((await tokenManager.getToken()).token), - ).rejects.toThrowError(/invalid server token/i); + ).resolves.not.toThrow(); }); }); }); diff --git a/packages/backend-common/src/tokens/ServerTokenManager.ts b/packages/backend-common/src/tokens/ServerTokenManager.ts index 7796b675b8..edd781671b 100644 --- a/packages/backend-common/src/tokens/ServerTokenManager.ts +++ b/packages/backend-common/src/tokens/ServerTokenManager.ts @@ -19,6 +19,14 @@ import { Config } from '@backstage/config'; import { AuthenticationError } from '@backstage/errors'; import { TokenManager } from './types'; +class NoopTokenManager implements TokenManager { + async getToken() { + return { token: '' }; + } + + async authenticate() {} +} + /** * Creates and validates tokens for use during backend-to-backend * authentication. @@ -26,12 +34,11 @@ import { TokenManager } from './types'; * @public */ export class ServerTokenManager implements TokenManager { - private readonly verificationKeys: JWKS.KeyStore | JWK.NoneKey; - private readonly signingKey: JWK.Key | JWK.NoneKey; - private readonly signingAlgorithm: string | undefined; + private readonly verificationKeys: JWKS.KeyStore; + private readonly signingKey: JWK.Key; static noop() { - return new ServerTokenManager(); + return new NoopTokenManager(); } static fromConfig(config: Config) { @@ -43,20 +50,21 @@ export class ServerTokenManager implements TokenManager { } private constructor(secrets?: string[]) { - if (secrets?.length) { - this.verificationKeys = new JWKS.KeyStore( - secrets.map(k => JWK.asKey({ kty: 'oct', k })), + if (!secrets?.length) { + throw new Error( + 'No secrets provided when constructing ServerTokenManager', ); - this.signingKey = this.verificationKeys.all()[0]; - this.signingAlgorithm = 'HS256'; - } else { - this.verificationKeys = this.signingKey = JWK.None; } + + this.verificationKeys = new JWKS.KeyStore( + secrets.map(k => JWK.asKey({ kty: 'oct', k })), + ); + this.signingKey = this.verificationKeys.all()[0]; } async getToken(): Promise<{ token: string }> { const jwt = JWT.sign({ sub: 'backstage-server' }, this.signingKey, { - algorithm: this.signingAlgorithm, + algorithm: 'HS256', }); return { token: jwt }; From e5b4256e70530e0700f0ab217d26ee6053882af0 Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Fri, 26 Nov 2021 12:11:31 +0000 Subject: [PATCH 119/131] catalog-backend: update TokenManager mock in collator test suite Signed-off-by: MT Lewis --- .../catalog-backend/src/search/DefaultCatalogCollator.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/catalog-backend/src/search/DefaultCatalogCollator.test.ts b/plugins/catalog-backend/src/search/DefaultCatalogCollator.test.ts index 1415341795..1360ca2647 100644 --- a/plugins/catalog-backend/src/search/DefaultCatalogCollator.test.ts +++ b/plugins/catalog-backend/src/search/DefaultCatalogCollator.test.ts @@ -68,7 +68,7 @@ describe('DefaultCatalogCollator', () => { }; mockTokenManager = { getToken: jest.fn().mockResolvedValue({ token: '' }), - validateToken: jest.fn(), + authenticate: jest.fn(), }; collator = new DefaultCatalogCollator({ discovery: mockDiscoveryApi, From 87f1b59ff94e9f8187dfd81dab0568bfa94e2ade Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Fri, 26 Nov 2021 12:12:01 +0000 Subject: [PATCH 120/131] techdocs-backend: update TokenManager mock in collator test suite Signed-off-by: MT Lewis --- .../src/search/DefaultTechDocsCollator.test.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts index 416b040d91..5f0bed55dd 100644 --- a/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts +++ b/plugins/techdocs-backend/src/search/DefaultTechDocsCollator.test.ts @@ -100,7 +100,7 @@ describe('DefaultTechDocsCollator with legacyPathCasing configuration', () => { }; mockTokenManager = { getToken: jest.fn().mockResolvedValue({ token: '' }), - validateToken: jest.fn(), + authenticate: jest.fn(), }; const mockConfig = new ConfigReader({ techdocs: { @@ -166,7 +166,7 @@ describe('DefaultTechDocsCollator', () => { }; mockTokenManager = { getToken: jest.fn().mockResolvedValue({ token: '' }), - validateToken: jest.fn(), + authenticate: jest.fn(), }; collator = DefaultTechDocsCollator.fromConfig(new ConfigReader({}), { discovery: mockDiscoveryApi, From 54eaeddaf1c3215f3681fe6f802a19c34d1ccf5b Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Fri, 26 Nov 2021 12:12:43 +0000 Subject: [PATCH 121/131] backend-common: move NoopTokenManager into ServerTokenManager namespace Signed-off-by: MT Lewis --- .../src/tokens/ServerTokenManager.ts | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/backend-common/src/tokens/ServerTokenManager.ts b/packages/backend-common/src/tokens/ServerTokenManager.ts index edd781671b..659cb2c264 100644 --- a/packages/backend-common/src/tokens/ServerTokenManager.ts +++ b/packages/backend-common/src/tokens/ServerTokenManager.ts @@ -19,14 +19,6 @@ import { Config } from '@backstage/config'; import { AuthenticationError } from '@backstage/errors'; import { TokenManager } from './types'; -class NoopTokenManager implements TokenManager { - async getToken() { - return { token: '' }; - } - - async authenticate() {} -} - /** * Creates and validates tokens for use during backend-to-backend * authentication. @@ -38,7 +30,7 @@ export class ServerTokenManager implements TokenManager { private readonly signingKey: JWK.Key; static noop() { - return new NoopTokenManager(); + return new ServerTokenManager.NoopTokenManager(); } static fromConfig(config: Config) { @@ -78,3 +70,13 @@ export class ServerTokenManager implements TokenManager { } } } + +export namespace ServerTokenManager { + export class NoopTokenManager implements TokenManager { + async getToken() { + return { token: '' }; + } + + async authenticate() {} + } +} From 73bff921fdae1b44d5a02b99250c59983ca2752e Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Fri, 26 Nov 2021 12:06:35 +0000 Subject: [PATCH 122/131] backend-common: update api-report Signed-off-by: MT Lewis --- packages/backend-common/api-report.md | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md index 33d41a5929..78a73eb42b 100644 --- a/packages/backend-common/api-report.md +++ b/packages/backend-common/api-report.md @@ -526,8 +526,12 @@ export type SearchResponseFile = { content(): Promise; }; +// Warning: (ae-missing-release-tag) "ServerTokenManager" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// // @public export class ServerTokenManager implements TokenManager { + // (undocumented) + authenticate(token: string): Promise; // (undocumented) static fromConfig(config: Config): ServerTokenManager; // (undocumented) @@ -535,9 +539,20 @@ export class ServerTokenManager implements TokenManager { token: string; }>; // (undocumented) - static noop(): ServerTokenManager; + static noop(): ServerTokenManager.NoopTokenManager; +} + +// @public (undocumented) +export namespace ServerTokenManager { // (undocumented) - validateToken(token: string): void; + export class NoopTokenManager implements TokenManager { + // (undocumented) + authenticate(): Promise; + // (undocumented) + getToken(): Promise<{ + token: string; + }>; + } } // @public (undocumented) @@ -599,12 +614,12 @@ export interface StatusCheckHandlerOptions { // @public export interface TokenManager { + // (undocumented) + authenticate: (token: string) => Promise; // (undocumented) getToken: () => Promise<{ token: string; }>; - // (undocumented) - validateToken: (token: string) => void; } // @public From 1cad4e54ca58d5e2aeaf4229eb7f8b4cb04e49be Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Fri, 26 Nov 2021 12:24:48 +0000 Subject: [PATCH 123/131] backend-common: additional api-report comments and tags Signed-off-by: MT Lewis --- packages/backend-common/api-report.md | 3 --- packages/backend-common/src/tokens/ServerTokenManager.ts | 9 +++++++++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md index 78a73eb42b..6efc504fc5 100644 --- a/packages/backend-common/api-report.md +++ b/packages/backend-common/api-report.md @@ -526,8 +526,6 @@ export type SearchResponseFile = { content(): Promise; }; -// Warning: (ae-missing-release-tag) "ServerTokenManager" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) -// // @public export class ServerTokenManager implements TokenManager { // (undocumented) @@ -544,7 +542,6 @@ export class ServerTokenManager implements TokenManager { // @public (undocumented) export namespace ServerTokenManager { - // (undocumented) export class NoopTokenManager implements TokenManager { // (undocumented) authenticate(): Promise; diff --git a/packages/backend-common/src/tokens/ServerTokenManager.ts b/packages/backend-common/src/tokens/ServerTokenManager.ts index 659cb2c264..2eeb7b5506 100644 --- a/packages/backend-common/src/tokens/ServerTokenManager.ts +++ b/packages/backend-common/src/tokens/ServerTokenManager.ts @@ -71,7 +71,16 @@ export class ServerTokenManager implements TokenManager { } } +/** + * @public + */ export namespace ServerTokenManager { + /** + * Stub token manager which returns empty tokens and always + * authenticates successfully. + * + * @public + */ export class NoopTokenManager implements TokenManager { async getToken() { return { token: '' }; From e65d8b51745db2361530edfbbc6c2c745a8c7f0a Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Fri, 26 Nov 2021 12:31:10 +0000 Subject: [PATCH 124/131] docs: update backend-to-backend auth docs to reflect new TokenManager api Signed-off-by: MT Lewis --- docs/tutorials/backend-to-backend-auth.md | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/docs/tutorials/backend-to-backend-auth.md b/docs/tutorials/backend-to-backend-auth.md index b49a9fe3b5..3cb72a4827 100644 --- a/docs/tutorials/backend-to-backend-auth.md +++ b/docs/tutorials/backend-to-backend-auth.md @@ -60,12 +60,9 @@ const response = await fetch(pluginBackendApiUrl, { }); ``` -You can use the same `tokenManager` to validate tokens supplied on incoming +You can use the same `tokenManager` to authenticate tokens supplied on incoming requests: ```typescript -const isValidServerToken = await tokenManager.validateToken(token); -if (!isValidServerToken) { - throw new UnauthorizedError(); -} +await tokenManager.authenticate(token); // throws if token is invalid ``` From f5c43945eb2b0251d7c18139cc740e1956c7b53c Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Fri, 26 Nov 2021 12:35:09 +0000 Subject: [PATCH 125/131] create-app: update backend-to-backend auth comment in app-config template Signed-off-by: MT Lewis --- .../create-app/templates/default-app/app-config.yaml.hbs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/create-app/templates/default-app/app-config.yaml.hbs b/packages/create-app/templates/default-app/app-config.yaml.hbs index 44bae0ff26..4b495ed957 100644 --- a/packages/create-app/templates/default-app/app-config.yaml.hbs +++ b/packages/create-app/templates/default-app/app-config.yaml.hbs @@ -7,9 +7,10 @@ organization: backend: # Used for enabling authentication, secret is shared by all backend plugins - # See authenticate-api-requests.md in the contrib docs for information on the format + # See backend-to-backend-auth.md in the docs for information on the format # auth: - # secret: ${BACKEND_SECRET} + # keys: + # - secret: ${BACKEND_SECRET} baseUrl: http://localhost:7007 listen: port: 7007 From 8bf026b16dfc3e439204ed57c0e116750b79d62e Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Fri, 26 Nov 2021 13:57:19 +0100 Subject: [PATCH 126/131] Add more code owners Signed-off-by: Johan Haals --- .github/CODEOWNERS | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 9be92d294e..195abc6b11 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -18,6 +18,13 @@ /plugins/techdocs-backend @backstage/techdocs-core /plugins/ilert @backstage/reviewers @yacut /plugins/home @backstage/techdocs-core +/plugins/azure-devops @backstage/reviewers @marleypowell @awanlin +/plugins/azure-devops-backend @backstage/reviewers @marleypowell @awanlin +/plugins/azure-devops-common @backstage/reviewers @marleypowell @awanlin +/tech-insights-backend @backstage/reviewers @xantier @iain-b +/tech-insights-backend-module-jsonfc @backstage/reviewers @xantier @iain-b +/tech-insights-tech-insights-common @backstage/reviewers @xantier @iain-b +/tech-insights-tech-insights-node @backstage/reviewers @xantier @iain-b /packages/embedded-techdocs-app @backstage/techdocs-core /packages/search-common @backstage/techdocs-core /packages/techdocs-cli @backstage/techdocs-core From 3f71f245f24044f4a0e3743b64e61769c9f09dac Mon Sep 17 00:00:00 2001 From: Johan Haals Date: Fri, 26 Nov 2021 14:23:12 +0100 Subject: [PATCH 127/131] stale: Increase operations, remove debug logging Signed-off-by: Johan Haals --- .github/workflows/stale.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index 4e8c7faad3..96a2a20109 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -27,5 +27,4 @@ jobs: days-before-pr-close: 3 exempt-pr-labels: reviewer-approved,awaiting-review stale-pr-label: stale - - name: Print outputs - run: echo ${{ join(steps.stale.outputs.*, ',') }} + operations-per-run: 100 From a8eeaa13b434297b4e87442c76fedf08cab05b39 Mon Sep 17 00:00:00 2001 From: MT Lewis Date: Fri, 26 Nov 2021 13:38:32 +0000 Subject: [PATCH 128/131] backend-common: refactor away namespace usage in ServerTokenManager Signed-off-by: MT Lewis --- packages/backend-common/api-report.md | 14 +-------- .../src/tokens/ServerTokenManager.ts | 31 ++++++------------- 2 files changed, 11 insertions(+), 34 deletions(-) diff --git a/packages/backend-common/api-report.md b/packages/backend-common/api-report.md index 6efc504fc5..9c66c0573e 100644 --- a/packages/backend-common/api-report.md +++ b/packages/backend-common/api-report.md @@ -537,19 +537,7 @@ export class ServerTokenManager implements TokenManager { token: string; }>; // (undocumented) - static noop(): ServerTokenManager.NoopTokenManager; -} - -// @public (undocumented) -export namespace ServerTokenManager { - export class NoopTokenManager implements TokenManager { - // (undocumented) - authenticate(): Promise; - // (undocumented) - getToken(): Promise<{ - token: string; - }>; - } + static noop(): TokenManager; } // @public (undocumented) diff --git a/packages/backend-common/src/tokens/ServerTokenManager.ts b/packages/backend-common/src/tokens/ServerTokenManager.ts index 2eeb7b5506..35a07509b6 100644 --- a/packages/backend-common/src/tokens/ServerTokenManager.ts +++ b/packages/backend-common/src/tokens/ServerTokenManager.ts @@ -19,6 +19,14 @@ import { Config } from '@backstage/config'; import { AuthenticationError } from '@backstage/errors'; import { TokenManager } from './types'; +class NoopTokenManager implements TokenManager { + async getToken() { + return { token: '' }; + } + + async authenticate() {} +} + /** * Creates and validates tokens for use during backend-to-backend * authentication. @@ -29,8 +37,8 @@ export class ServerTokenManager implements TokenManager { private readonly verificationKeys: JWKS.KeyStore; private readonly signingKey: JWK.Key; - static noop() { - return new ServerTokenManager.NoopTokenManager(); + static noop(): TokenManager { + return new NoopTokenManager(); } static fromConfig(config: Config) { @@ -70,22 +78,3 @@ export class ServerTokenManager implements TokenManager { } } } - -/** - * @public - */ -export namespace ServerTokenManager { - /** - * Stub token manager which returns empty tokens and always - * authenticates successfully. - * - * @public - */ - export class NoopTokenManager implements TokenManager { - async getToken() { - return { token: '' }; - } - - async authenticate() {} - } -} From fa683cab7dbc5dde0c5d658e3374b5838a42afd2 Mon Sep 17 00:00:00 2001 From: jrusso1020 Date: Fri, 26 Nov 2021 10:50:13 -0500 Subject: [PATCH 129/131] address comments Signed-off-by: jrusso1020 --- .changeset/witty-cats-tell.md | 1 - .../software-templates/grouped-templates.png | Bin 0 -> 1187436 bytes .../software-templates/configuration.md | 28 +++++ packages/app/src/App.tsx | 7 +- plugins/scaffolder/api-report.md | 14 +-- plugins/scaffolder/src/components/Router.tsx | 9 +- .../ScaffolderPage/ScaffolderPage.tsx | 31 ++++-- .../components/TemplateList/TemplateList.tsx | 96 +++++++----------- 8 files changed, 104 insertions(+), 82 deletions(-) create mode 100644 docs/assets/software-templates/grouped-templates.png diff --git a/.changeset/witty-cats-tell.md b/.changeset/witty-cats-tell.md index c60be53d03..55879b5fb5 100644 --- a/.changeset/witty-cats-tell.md +++ b/.changeset/witty-cats-tell.md @@ -1,5 +1,4 @@ --- -'example-app': patch '@backstage/plugin-scaffolder': patch --- diff --git a/docs/assets/software-templates/grouped-templates.png b/docs/assets/software-templates/grouped-templates.png new file mode 100644 index 0000000000000000000000000000000000000000..9a3689ad1e05cb07e283a9acbf597d043d1a4dd3 GIT binary patch literal 1187436 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 _T7p#ld!EM+EeN=(t z*>r-f(rtYlGV(Grcf+J{bbKByu-D!{kQgxXUxSE zF%j&0&&9T@7vkJtQ0Etq^>3(nDX6n~`wSRxL+90>Hf0{)lP%pptJ|a*-C@3MVc+d4 zZ#sn^w1lGB2Eh8SzAmdRoFAsY9EoOrw^9RosRBc)Q#ue?P2S(P8_c~~*SzeK?b;Bp zMMthKWCaKGJ^ioK!sKsxo_SmTe7R2VipZOvU|B;_#E^s+pOB#BllBKa-h$%L zG`eF8^C+=Fj~o)~I^% zM(NYpdwApp#dQ;cJ<9WoTgsq{r^@|!s2anMb-T{MG&)YupTuXZ!bST zi#KkpQ?>soQNDCpqVPRXW?89JaURA>AUP}2QHFj!sw`Ste0ppvmj!<-PWvUSDzF%m z8pWipFGUy>DW4pk0~~u6J$xxI@uQ6&3oI8FRMK~LLM$-P>KE>Iod0Hd!^Z^r`}Oh`#_^kyd5!JeVR>%WcR4-X zg8%OMXeBS+4g(czaAuuAycqs5%MM#Ok@;$5VmA3-!$F=j)zgS@m0T$ehix9brApoB z&)g@ry#CfZJ@js4k(FD1xIDHHO`V~dK~7o4RMrt*F02G^NsoUK8`x*@8+^`; zc>^+z_lb;Pfs{Nyh~XXSQEOTFkmaF5-q%6DAsH|dM2D3wsekuiOJzdnub&+v6HG19 z-Xezj=q9*}>p!+U{wj$0D`26mzl<3W!1rwaINzv1fyH`Tgcoq^D3RuA6DCkmUFehc zcWrRDRbIpV@Ffb=u2!f)T6nd)*DEhpH<$3`&uKZejOw=G2q1;Eo&32}m9-l&Z4D>i z7-?4s-j*K!EWfc|&yMHEG*XZcUVTBiR+ZNoTl?-uI9Rib08W_iG+}0B+z!WVa+b0W zMg6CsFgId=v)DFA6LVea?+HWd(Z=9;hlHZY-k1a3>t+R|W&XkOd*tR1dyZ>tnX#oY zi((gX?)5`_3+i_CASZeTr6U+04$3m-s(jHLyFYSph1eC!J|Xa@vLoG#mi`Q^t|o}? zwRI>@0`pE~-Bhm920))QXZpzL2a}wj=+tl+JIXs!h0z4LkRV}nS34g6nWv)Ru1tP= zsvVqsq~^q0<}ouVb(o;n_Lp~gnW{5qKCimHmyGBlyL;U{Bt5t57rhXXE$)$Unm7?oU!5f$?GY2(V(A3i}n_LOA@V9y{*d;W35@&K>iit=F@ z)}kQyoJOSrdx8uInJVyi2Wu5r-qOmQZkZBt((Z72C5I4H#j9Gh{s>qBl%RuC4+XNB zQh#a@*uGZgCUz;LWJ!)wxJYShn*}EZN|CCnlK=7`!(x);Gp;x1T!bvdII^5p5xTN3 zZ9_>n@=dAx2!ybWajvdUOxYEQvz1VCBj}JleU_Kw$u@VZ@gX|RU46X~_Pg~5{{Lb# zv5;j&wLdJgu6_sY$pGRNozgEai|AXBuSD%MYfY+WDd)FIe}<^-CBEM?9>M!>+Otw8 zJzYWi0GF&YjK^?G_#a!)A1ZiLbd)CDNyIDWue|a%!~%w4m`nNRMA<^w_LYs&p(hQO zCKx==Ax~U1og=yvBDR(`dhciLXMLcwv?mEYh8O!Xf`-@!PZ#$B#*TIdfe)VMI8Rq? z7_WzP5q=V`EHvdQ4pap>5XJ78vQoNM-wZt((lZIE#w+fJ{FxYQqq)5ESWSl^cE-1W z9;%SJE*s#b6Ewk_&0X;G`VB+GdCf*B+wLUx}#fRRBjc-JW<(}+;({K)75-L=Z5R8LwmTl z57=*YG08Ecd30BdUUWHVpSs}j+ui6AD*m^-*OKYrVbfcpvI%7WpT4NGoX7Z0Y3zYY zW4|);_j(uF*F&!!D$T|r1y{eRt>62XmW7+vV&dOQSMd6y{Pmx6`mj&KZmDjRZ$8*# z0rE|ZBFuU93|NMxYg2jV#=%iZaLk`hlQ3mqphnI5Wj|I9GF4Rsv>bZt!*F(?^Hu24 z@1zEEZe1hQRHY84yvrYz%SMrNhU~f%v=Mm|q|=Wr0K-Z{YbZ5F7#fkUuS(Ov2S?A6 zH?Z7R?p0>PBG=IPR?1%6JVw>9*_4Z_@mx6;2@Ki%%?6k0@Q*2N$hrvt1`buSw)Bhv zsD&*TWt&yNwYHpDEAU1b1<~f7unP%C-=s1q17)(DSk*?`!Z^XK$A8A8(ZM~Qxk#mb zXI+G)ssQ|Xxz5%kF$Eg$xY_X!&p2~Kd;Sv6CIZPK_i~ZG1K0oe+X=r)r{6 zT?#b9lpD7)la@73$UWfKbLJaM|56S$YlFu8NcCU18wI%E)~@pXnGTwT!ULB3c%w}F zmlJ*EO3UjW8f6V8UE*LBBbPC{-2LsMZL(uEx31q=Ll_l25Eo!}qqHpwg=r>;uy&}m zj!Q>WLmcz^PV|c5eR|o*5xuJSr5?7)3gy^o(H#I@*A6@Q(HHgmS;i^WQEVNYW|EVa z&U<<{D?XFrEl9mx#A&6UVnStTIkd0M*OcdPX9uHliz_5!fni-P4=S-yow~Sm)0hzr z33*lDC--iBsi@upCyLYstvzjN+Ue{JfA+$<_eQ4CP`*2Dfc`dUp&W7-IgB$En2Zxy zZ;T!Lcd&y`Yi@g;nw6H~TYzl0+O){vGyPW0XkawF!G z2w%O-_m1?k_l9X~a&2Mn-g2`F`3mdR29?`BZYj~JJbCpF2*V@-&KY!t%{?H%@-_r2 zGi5Y=6=*`b^3#vxSwPkht?4ytYh|?mvAXjXOFAeVKRPSg#zj4#Ib3dekj`Cu=y3np zV$97DfPSufndl0t3I>63^U^(f_;W91ENb9?z-7$onGZC|Os%Zfwy~&Gt0&a89G& zA?mfu3Ru$-d6w?$va0+6nHxg^516rn>L>Ktt2>Li3b~hPj5G ziT~e1x;wSy>55jq1t{o&wZRYx9WV!WsAXMu>gD#DJ%__}#vQQI+}3MGmRiv1>lfBo z#8RT^)Qi{Te9lRntfUC1PQD~vZD$A8&WA>tUZ1NFNE|E(B^*2<9P%b-$@Oa<6j!~2 zjbQ?R=j5VHa?A5!c1JnmGr%icSb*B&JDE+lxhP$6_yfg|Ml~<|B9j-jZTm%}DAZ9- z)k1^84aJ$ejMR!akDFO^v(D^)-)6hUQmi$8X46a`rc&* zU%SLbrqrsePyCwAip-3Q!7L~*U}{lu1amLX&M^6VObwZip#(u|KUK!5pXregu7M!Q zEM=nG5z;s7Nh!M4o_Z_Z zc9YECJZ%{ONGxob^aZy*wuU>48lCvm>zv;9E%$yH)gMB=2RztFSbcy{8^Xx2u7{60 zTUdV(!Eal{WvGf=Q4crHSIBMobt=r6zI*Mbw}jXyf7`C1qnK*5ucDx=0d8AQnq8YQ zb9hTX@Epy(KH*?E2qirb-teo&33`A0L%3C@OyLKYNCQtZP+nHK1Tt?1eK(G+Wsyt? zJNzAy`-v;DPF6oX&`d)rGpO&`!XvLEzP(Z)#Gi&`5~LYB_Z{?o5yez%?-%&Y@{Zwg zqKmDg(kEoGJ=DMS`2qH&dSw53^N+omPW)dF4fmA-JD>dyz9x-jeF4Ngt}cJihv=x% zAe(6vE3HrE3s->Z{uFU#`&o*QbIolBKPsR|jR9r| z^f5D27V8y!5o>K-pHeboPife`Q;PMZzTOL6xnmGk#&}Q(I=B#F+kN=)=(E(Dpn(jxdaJ zeo>uRSLgK}3`d+boaj|vr^%z6zW;Hu!&oUX4Zbl}5E6Dq1X`?(a#)NRH(glN7D znJR!Xlc3CnUG61^kmD-CtAn1_>}6mOe&8ql8kLqa#W|SQ+OxLTtG~u&@OKQ)@?3_) z!*9F|zCswZW9bG_Fc(PiycR(VQu&qHNMF{?Qtxgl)ye)Rd2&eI2mi+%x-h}o~Z-IW+8kOmEq)9DtxI0ZekJZnpm z{<-&YRsJq{%AR>}DmW~dhd6MC5;_rD61pisXX8J*_a8%kb;!ewJvjP@9F4Mwc%*4p z2Y=87ft*_c)>3RaKM67};=BC!Tm4l{f;RuutE&D9aRV?(pZL_y(h{B) zr+llZBa|$pU^Ru4t^Ew9mJU!IvnkY*S&4;rhvVcWL_jC=3?f&;VZgP>kx$~u7ck%* zkH8X(2bVU*{HNHM@##f&`7dtb6Iyvqk0s~cm7eMSeZI+^a?7jv$+ePGpUE2#JJId@ zVjuem(UQaEK~%fjCL%sJCe!0@J8owP^e8cZBOlMaYZM-_sf<)=#KRYca+ZW0N9soT zS=g(8_S>Cmma~6R4kLVBepN*MMP_Cq6Zf?%eN6RoY(H}bo%o5lVh!qJ3SS}f+zxqE-!Qmt0aH^83%fB2Phwxm)T14h6R{z*$={)CnRRqf; z9$b*}Qw3Uc_;U<%DUml|3-Uh_!rMSt+}0#7H1qt%*MrazBtJfOa&=4v>Ms;H6D z5SB5m(t|g2$6Qfy02S>DW;!gdqvGh9om4S>y+yGmp`->TGdUwcQat=Y7gvaCt`Jm~ z9`I8Gie`npac`b)Cax&)vCtox61C5rVYh%DqY(?*kud(`d{H|i9WecI@*;;j+8|_C z@alkgp;1!I@J2k3n)+o){Q(T4}>&N`TZdz;XdBk*to)p z)9I$KZ9Y;*iYzS6Hf!1+Rmc32VTSf=>NXR92Imkn`FMzCh*-g2pe*`LU7bwPEk5;& zax9F|;lr~+4lwL(rhh{I2EN7IS}@nH`QD$_{vTh*8<(g8;V3hok>a-f!-GS`T(_%Y z?$ce)x?@!v*{c7HUw?vZ{`#5bdM({H6%pw>M)QWSuow^y!c)Q25O$kl!j1&3-?O0@03lX;yeIoBZjr=Z^p= z+78T&bvmcMHnTIb_-wyv`}0O*c?|f0Ov`%D+gHJFGS;@ic-Bk!* z!eJ^D5%pq?&+}Y;l1)3SoPf#A`3~0#9)aBm3QJvdj|}a)BH|ttpM=i}VD0Q!%^PwJ zU;tb1QmkYkmFzL{%flUHd$lAdm~)t=SC7NO0GSb*;XRw*sV9y|H8op{CeLzVzOQrd zj?(bMuVo~`yS>sFu0ZZ_R&r0;IEf=&msfn;B}VWmAF-NEsK;|Y#_q6W{B>`+Xz!fy z0fb7t>cGf7A+9#P!es{7G2D191>f(p5$Rq0?Jl&(6WP_3p7xXJ)i5!+5vlDc!e1kb zt;QLB=(+;$id#rzgd)Ncw8!;$ckDFnX5A-Ob-v*a$$Ic!G`89{bEk!^Jx#jN%p~;q zkGM9tC&k@G;q4N?ac2&8R{PbreyUcx%9w4y;;r2Tj{evvo;h>z^Q?ULSBF3k!AIP2 z?pgqK@#skHR7PFi+DZ_B+4p#XGG>?Kd`KLy{D&!~{D>Qf=vqMtEqNxk?nxPZd5LOO z!vYEyCz}`&3=i^Fn_>U8F=aWVATnm$*S+TI2y9@ZD+$4jYGBMZR&; zl|L2T3-3eVQkm(4S=SHF>&9!wbv)a#DZ=lwaT){TkhH@S%5<&i-RtTTDfJ0UKRG`^ zw;7tOpU9pFbdlB{0ZHI|Xuq^o)xGTC?^W{2aPzL;rua%q2EK24#oD069>Rp@g^g+;SV^Lcr)2Hs!J)j>*{kG6y`Aq)ei*Zd@=87Vas3`N0 zI}VwtFpv#r$n+U1Fs|eL6mfon#wPyyKoAN}5%>I*;rwM~VvQfhj_cxL*+bM8x@OP< zdg$hU`rST()R@g#|EJ`HU)|bMv8^*cVWYE!EA78VgV{R!RMZ4%`dcmnwvUW1P4ryl zhXkde_@bUXr*vo~My<%6{id8OpDb^`_+)m>9(&J}6$2Qp8_tN@{g;$|gh=q1x#KE7 zXeWCXj_Hb#w*=^DvO-7vW$x@dmn9VbOB|V4gY2U(hTjbdz2N`?G0crx>PnnHxAP_7 zBUljzqf_J5XG^Y2u2}v}*pJDhuIy!kRer+Jf-hX>Ple$AbaGL>vXF~3M^;$MqPlZd zgR;m4k=twMH+*z&^B(P?g9{d$8SBQDNTTf?qyHLcshIi@!UhpWX*^BLTBXK8=|PCQ zgpi6;YPVA?EQ7)pyQ}a$wu%wSezm9k4C#Exntu z1)5T?6ryahN3#RJT$8D;wdebHaqk^Q_lLoL!Ns5|0PDVKw*+#-jNmDnwlt1;c3jaP zg8I||rEY}Yw{yv8^PN*=J$iz4Cu~rZHMcjgqHE66RZn@Tas=}a*;TrO*n0-pg0>7& zZF=);KOxm_z6Q^aSg~@ky$7v!3b^UAcTBWMC;U!Sol-Me0<6{yR*)YI1J*m@013&6 ztl;WY-zDE+dpDLvmoMGyJ-R=_rps@x)4ea}RN#N|SjQUqh>pRLCI8r##2K&usxKKs zn%;sXQNRN!st~i94K#cLJ1*-hc019Ydy}iGRJJ%fk^9=Q4vY{teD&nhI9R{ZWR4WkJ$IO|;Hp>W4Di)PLe7tt#jsQG zj5m~SxXf;y=xv;6p2ADJt2&u!AM`G^bMVjSz7Dx@euH?RbF;ai)&3*nfMqLQJb7o> zQL>&E7d)voV<@-s!U{pyi<)aOwu@9zg^XnE)_9kkW|J=5It&Tp{MEAfF?*i-(mR)_ zhbGW){h73HPlrb(Z~m}Vlzg)Po`)NAB0Ot_zdK@&r~_|H*>EJCE|2~cI6YlcSIOZB z^#<1pdC$IB7|=Ohc?m#v=8FO6|P^A~tB*dJo;%jDPO+n!etE2B)irgav+!lj9QB>2G;) z&&5r$cSHvB>%*C!gCxM6I>iyy$aHLn8 zlmuf%gC47~y!pu3F7XtGC)n`zUU>Y{j7dXTT-Ri zoXpWXE9x;RQ>WU%u>KBqv(6R%1relcVdL?_XON-==|nkcPW;jXiVXWhw8YWmuuW-- z6eae!Q_IsQYhlBH0?$LQh&Ac20Q`D-L|x<*A&z$SG4&_ifwZQnr0(7D*hJD5mc4xG z&$KWRIYvoyS_hPRoX0sPbBsw!b^`u}364QY3B0B(ul&1>xH3Yc#solzQV3t5;u1~q zR%>NzTpBztUYPcmVYRGKHLsWLwj7v=pk$u$O>t+9>8~UFwmEI+}^AYwQJ@)F?J*kIZMCzg0gz7kY&>qVi;dV)M)gsk32~N(>Wq5##Qf^p z&|gnIS|i8i_;gMmVpFf$yLdU?4hs5StaOENDdyoP?P(XZ{%zCfhFL3{lBRC>c1xc@M{$nkQN2W5mHKbZZs%LD2hl-1qDGG$+6KP9nvsql#-Gj(j{FI zGP+@Gqc*nj?DKrT&kxV*`UiHucHh_gT<4tYyho#)=SrpOIzbX=^L?m}=XqVDmaw(r zpd-A>*S>>jGu1YT1<>J#*~y8IW=F>9s>czupDKc{b0MVvu~3bq>J0|Ph9KQEaK%=` zg_Ql_6K(!^z6nP(dp_re-F&NTuG^Onp-BwmHrbrKB_|nj1M-*U)*+!C;m@sa0ot}j zc-9PtefQSBj6d(F0Ctzia?_%@LjtXK~YwVbRk{^Z*?!ELSNf8yjXL1wa~X_8L!he(<|k!AFJ8~??YW*N# zTQNQv>9Agqm-WnkiK21k%lufIxk1Ug-#KBr?9B$HqgLHZ_~Z~gI1-|DENck5$PW7Yd?ImAN zTK@Zq>|~_dgMSU{_oUy8vP4GzFx9CWJ$&1`9;jh78tMWgT@C5Fh)6KVnm*ATw;&x_ z9PMXS@iKVhZfpKKinCgO@OL8fs>lvq%Msqhx9!lGX4YyqZn^1ljMrY_17ooug*oTe zIRI&|e{Ay)f38VBobbN9T|P;y*hziz5yXXeaOY zyIsg}1mCpye^~$z++WAK$RSH{NqR<%GyYJpHfn1-@R9DzaLGe{{&t=ziFx!hgehBp zJY_+_aMej-W>pGd3Uap)_jreVF;P*x=+%1Qcbxh#r7F8S7W%?5L_QZ=lBWU46?*XM z8{-d!wkj$m!qS0GG*_wgU!{{A)Un{jz!ZH@;qVB&CeqD2Wfr z8VhZg@1=w$8ZIjPPIruqco7I)9!GO=TX4ZVWNUaXio6JvFEg8z7ihDF?&sQN%+*`QW zC56X!YO4w7lLW-0Ne2Ib<%#6#T*s6CCekWtMPA0~R7so-GsZaR6HIfU;CX|7+>#e? z!L&g9!U}p$i28IusNF6x%?3y6+72^cm;EhU>^&*uONXpxZqF{4xrY8= z1n7}jju`ufde!TurslvWq>J3b5nF3T|;?frqf7n}iP6uF1 z0M3Yq;y$VE>%cAZZufkXW=GGl9hnf8xK!TGaLwn97F;j{=I{d8@D;y9I=fq5wy+o% z;GEJ+eoa@f46aBQz^4E4jTvK78-Kc7qSuKY+NU z=0{Le#ZSq)Q7szXoc9suR%Q9p@{I(E4QI6N7g~}$f6M+@tMrlW;_@bUy6kN)zH7Pr zk9i)`P7e={Ykc4})c6Hd3;nEBSOI%-Q;eF$qSJiegohG>vrqdW4>iy@H?CTaD;-?0_K;vsjq^-Q- zSQ2vk9iw*m@G-h`B$4;%m9}m&R}om+7P9?2jiNp@ zfO)-E*BVJWCi1iTJpnL;LRh05$Cm}|$BzU@MV)jR>b|ZNR2+uAX0_bUgb`;@Z%yy$ z4}>21w)Ne(VFA0m!L1YWUS&3j5eK=4iS5Fzd1!lJ*KVy;l+sYfcxA_@_X)QazM;sM zAFOl_dn{S+4^sN8DWTKV&AQ~Y;ciKJ^D*!p_UaI39$}`c&1}X zkGkC2K-;FF0)*Atvd+jjE3vm;-D>>!Yr|;gIC4N{>(9<%6ToRk4=YDw(GyEcba}I} z;(~h9A48>Emm3!M8m~i}@vHdds_dk||0w`< zDfMK0iYdE5koIHsdneRgK)UL9`j~YVGlc2KZ(U>50oBV8xTUQSDLXKmY_L>5Hyk7-251cN%YhB3Vz=`Cz?bKfpaXrF|D572lKWA3< zzE?Qkxa~!+edCdQ&|cA%ome%$p8p{BKzz~Ax*+7Z5awV21qoy0uLUWr@3kGie-+j1w=iyBb^P&eo>czQ3&&SRE;MX&0X42{<^GUL zs#=-zN#+ZJhAzaQ`7|sitAUyV@mXf;H7%|`&}D6KHqiLI)Nr_$;jV6wW3ORYJgfML z`Qx9-)x6*x<+QMv@2<@~S~#Jj4=)aWH+?OpmK2zd6v~Y8*$z}HQkdlAj;b<$iH#M8 zOoqcQNA@ZymFrL&OC$_)Is!sHleSxd?hCh(cW4Okb%)f+vM@@gOb*IShTS^XTlYUm zK3f@hF}ip1b&tPcZBgdITE`KhGN0G>=iSKOPIq2kMsUWa>#0jiF}JGgLQZ8X^;LZ> zE}D9k`!1E(U;|`}NMwF-3?d$i9|0NiG z`qtH#Y~}AmT7}Nq=TiDWYbRzcU8(sn|Ln|e7^JJOYpwI-lH)N{%iam3hu>s#j*RMF zr;!!E*R(7W099)ve2)w+ViS3NE0Iciec_mb7xNJ-(Gb7QdjJT1_``~4LsDP*rr=uS zzNigJeybr1C6ZelwskY!LvAsja)_mCoG~nkX8&^qO!)GkzAEIx#p#1-_vY-v9w=-_ zLVRYU<6v(xUyU!#$~l=Lkk;b0eCwQi9Btj}_}!|E#f;-3-D#}a__Q_Yh|5QpC;j6Z zoshO@7aWnX<*gD>ch63xzIi`ti2C z)-~Q0bTb+RV=1NX}J#sqhZ?$#rJfNGVmc&k^N(iw`yod zUCfZaL_LkU+XBNcs4m)eyFN?8PKNFs{#zQnYZ$V_&@_~Ai$@Fb=MQbUz~OVMjQF#M z`kY9V;eY7 zxWf8SL)%2q#v6+t#H^mIG_yzcZ@upqV#M_)jDm^l_}&oltm&I{2VZuc0#h*$_YEx8 z46LDp5^2-i&y4QO;IQ#ADeZ5K<{#hJ!e+;l(9d&Mw?vI*%w`(wKb8>hVTXp$7kA}AK9%6d;CIuk&4mMh<5#Z%1Y&Wn$c=0;8TrXpfi_RG7KHlr3~UgJ zK-dr5tAXb`&p%;H8qG5|+s3d@>gs$Bd$-I+07jX`F|-hu#312-zVXpc?>I~3w-eah zssPhKsCcu~C|MELv6wXzU=Uy^A%?R{I3SF%A(?IQ9%TtA``-=N*s~wu(i5x4^bSm)GvQhlfL@s z!WUUJ#7m8G@o0v1dlZV>ueD~DvI1GR>Wq-lC#Y^hz$*;yLI8%;mmkJ=Zph@MpLr<4 z{~}Ow!!pIBlnaHWIsj3>T(ukpBgCS{Vv=HTH^EDi6G@e6_cV27p9q-&i#;UhQDsRM z04;h|=qvGoZ#{%yY&L`x+D_@X^`e|u1jdM`!Y)X6*;%w&%|W)rM;|W#9)izRm{2Z0 zh)2DCQF}p9=ZA5410sxZ6nnM%V!-=vPS(y0;mscR!b#B zQToXCXkVSoOAmL*1F`b zj%ntb0YwkkdO1VC*vX$ej;&p7tlJUGNcZ_V=m*%^b!TTMpDnbXmEB7UH@`frG{E?pna$m|>1pH}IiEw? z`OWUBC7&&c$c7JMfJeR8593%SD4C?*_f=j#IVs`x^zxoi zjDF0HW%d#>yC4=WWwcUyf+J_VrK9> zH|W0%x8RyI=`MUvvtp3~EA)Gj_em-J=vxb6*6EzHIG?a4HNsy3haZ1z)KFVXx#c=E zJ^KYAnlQ?3J}jy(y}lP134xvu9njAekmrvBD)PtlhRo>2wy5k`xl}eEpwI@J9YRQ` z0OmqxokKGmq6i;27>ZXwi*ZX|1uv-}yU!-$kZ-3tOOEkLZ8?AXq7G-)xf^#0(VrGN zg3g|D(qA5GbkWdCVwH-Xu=zBjTn#_$p)^fPH$__)v-0fVp&Uem7AQkv+S zu~&uu?cmO}|032H3<9Wn>L2CYd`tLqHT3nlT0YC*K_u%_>{fC>czSdlF()kITPDLn zti-479)nh}-Lu5`y&V08&w4rdF{X{}P5Dn3+`0*Q4+OuYz{uD3X0gs!DSg#&e79#p zu`J0p@s7_!>0r!wh$aygQl;?QM)5KeI{^7}yuTC@*jt*#zcy+H@>3`WegIlp_egIn z59qaiUN)3o*HT-Ce1JVObE&ISsuGQuh6mVZAuFvvkZkW+7W@d}`!IWI$F!3^#x#uk zk?nQ!NpEvgQr2d(mG|7;u_YS` zMQoA4PnI*m!e=5}^a;sVb8qji>FQ`crjg?jA&@AU_VihweZXcuXtc zl>8_KI6cP1QE^a%Od@nXYQk6$>um6xp*Y}X#PjxB$=;qP`a#d7m3c2+eWfvAPe=vU z!EnInYnIAIha|?YQo2?a4*cae z8W9Dy+i@3E-Y=i2)h@S-LV>1TejtM-HePf&}^N4%yua-t)bScAwC&s(XrM`l$ z#5lsOjb7jF*`q$k`$*$Y3#J^@~Tqmy}4E0FJzD0 zqo}v;&4aHNp)@k>x`EdypNsmjN;E~9aD9V*v1-H?p8k!q`m0>9XB!MfV>@hL>o%MUyqKaJqKFsFQKB@?<<~ME9d;!g zpqbyvw&9>X!oGNT)o^zk_4h%k#?y%}R^f;5{LNeK$sU;9eY`T)>9aL8@qT4W z`aA;2H4oyVYwtfV)9=t^QYe$jZy8&GB*DG-83s%|EaUOQ5+E{hmYe%=QrtP-D_PTZ zT>@$RHT*!Yi!m#!tWMwynM6D_U|IUBt8jPEa7K?m*SSc!=+4PoHpL=Owo>C}PE$>r zbQwdnyRq*KPqZs0qp6601Kt4Y09vJ=-wg@sMc6k1-KA0I%B)tq%!yS1PDRLlQ^2Ny z#K`0uuc{7B?~RG!<4U4`9u2!4X9uNZQUstYSHlAkQ3acK_`nZMcKe%+(CX?;W|MU9 zNRE^}S7TvY0)+x!7ESC_PVXqcrzMaW@;*4=9)7E4&I_Jvs)8=w(#nN$>i$D=iGP+1 z^u^cTJsQ+QeFLtQ_8s!VjcXs6mD=__3q4TrWSo!Vj%-Kkw21&VW;x?Mir>Re)amV% zZzK-h>PpIER{TAUQgo(D$h|j`1sWRdw;^rhfU_84RYfVq?%&{UB^ovsy|m&F8kUf@ z&%*8+oF53^kkIdBO?)MamU8|v*{QU2Bp150Q6Q+*K^W2fZn~~D+1FJCL#ZRW;THmT zP5fN6v=F-T_0qwlvw@4FsfQAo7&e@5fFw2tcXUN@NXI1-JH?tC=G~6Jy=U_$-cmw5 zW9#2UkHPQGAREQM<1X@rtbCaFyXb8Awc=&cF{gHkhlkeIaBvk=y<0UIvOjOfid@-L zVQi|* zX6A0luU?PF75_7r^1YJ5c$&6?=NL15V(h$z-|x8Nu#XsGFIhJm9fg=09JXVPnb7eAZpZL;^1jS$drR59v5Q^Txf4sWm67#b}>+qcUv z#r$#w+4D|GoI^YEV2zhCw9Aj5+V*V71e^%szuA@3Jm$}enk?9aoF&S>Ue-TOg0mzd~n$$m>u_VE?zAc z89x{MaE77DG$c+BcS=N6!D2GI_gLdy6p+FXPfsKEB06$5tMu^^eNr9?7ZTiPudQSs z0!Gm;b4bSC29kB5km?gu7eVW@n7m^6!*C6vg@U0$UW-*x#Z8=;Ika+zC*O>a6=Oc* zCxx7VAVP6cgOJ` z14rNd%lUo5uAKO7A!d~`jOYUj5c_11&uhux^-x|ogEm5`N?b1_#hd>JzVxEGc;DCNX|b=2?F`d-9{RFha!1 ziNK}Li%MbcFFXYgc0qW4iYp4Cjrv0ZWT5l5_Vak0Q&!UtdR|QZuDwN!($DEql6}AT zU(UiyLH^_wF6F(t$#^pm)aafn)BJ350O$ONK~<{QS%j`OaPEbQ442?%bS}*X1YO9A zAbnBKs#%-M?|3?f$M<@f_}ycJCaU(EG{}~_-OU&K=vbdCd>oSS+ZuBA)ZV&^DgWs| zaXlJ5b{P44+b*`=;+_%RJ*TWx3M8J)vNXLDNv1}B46qEkxhRYBZGsvZhKaR1ojp!X z@qzkIHRw>5dQ@LVMx>fkg{^9AJ{AsdtD2wAue`%E5qR&(9rWJQHMq(4w9 z<5w&42P-agF@B9XX#b1J;b-vBuI|)f)bPkw>Ob|aEm>s8q-ZN2q8Alm~t3F;8 zkk&zS#r!X#{2yHTzv$BZ+VOA`SyyIy40iZ&+$N$f(VUE?P2jkgBPM*tSlr?H`e@Lj z08Cv5bx$-6OcAsvuJhFw>fQKAPe0EZramBOye6{auxtG$!8Wp=p3pOz$iAOWvpjr8+p%5xE7-(>m$pJPJp((T?q?m$}6EQ;~{U( zu4>A!W_|Aen~+-cm%u{Dq1BWmV1?t`u`JDh#1;uDm#}mZ%IwM^V2U2U1;__- zRF>WdD^NG^yxS-;@ui=2q46`vSt2intA~Ap*B22rcm#0LxoPy0-{ZMQx6ypeDHL)$ zAH$`m4FrTkl=2RDSa7#7`SFx1Uz|z{J?~+G2V_N6YMTUsIFc%H`K#67sO< z-uoWM1T~Zc9i5}~`>YbwCu!FU^Lx>T2jjEybZUQ+ss)BYb8SfhQIUHkqzO zJK#R6nCbOY`dY2RT9)xUvty#F%e}Ziq!j0PA3jXIhUWk=f`0p8{S=3G1iMxXN$>nZ z!omu%+j`NSc{NUL*4h;}1lm{D`#-D^Y3SZevH- zxzsv;$Z84Gc>EA{&AVw${2MVQ%L0GO{_2-AU7X64nH%=~gFE7;jH!6-ZO=6>15RGy zvmB=by`%-3LYtDNJ!0clZultTk|nxfa4r_gNry9(fcPB;C{AwDsBI9#n! z#Kc^~-$5RZxX$*EG@bK9_&*zZ1|GoE_fXDCh|T4)ym(4>O7^>11}OImPSHdbtHu^E z^BlSqow^AbjJHCWBfnP7ByRUHgN$l`x&|JIt9%TWzWwsF9<2B)2b;7o4nKUKLFE^%1sYBhEiW1 zi4lsA_T6SYFd(xgcom<~KHG>J;Iwl__QaxC=eO>VhXK&9{*@;!Jy_rCKO!d2TsMwdU6dXYtzQTK!nB~(BeCvM7@wsb~| z1irIcD_FH^5}MRs2}+WR%Ng82?{5xmLESSqNsq%_N+imK$T0@o<$Z=kd-|;t0VW{Z z3*Qr%^hO?U>58{}P~qmXO{_UI>eObORU+Vv;L;*EwDrkawy_`sx6<{9BaFjDmhEZU zKR+iRN*g^;9$&Ha6Y;H8TXmB9$Q=AiB18T{l%a~W2ihbfrp8WweWAssM4eFJK5$fpYs@pIi@k#Mg*fNxu6xXreljLA z#g{zkN;PWVNY)6Q4SKVBqL?q*M#Aa&DM4{9_3*LYRJyG7s6xzS9O&Ct3_5kR*AxNP zMl96|b};z7SyFZKo4(A@)BF9sXvn>W6HT3n67E!6XzDcs(~x;~I+q@?Ppk(jF~IXl zF`MIW`iXe6pTc z=Y==gBGLs3ZoYJmmegu$2~nyXcWi>c+H>j%+udjIvIJp1R#uu;s_KQ|WXa4X)Y^r_#%TITu!1G^h zYU=j@9_dY_O=z54?pTZSsU$v6dI@k2lM#(JT z*c(0%T(%y)UFIs;5698#Ndpp~;)&$224FeXAIrTkyg5@MEFgnlL z7pj`*4_k^vYHLrB$U5%g<-bzcqSN|z9KF4t6UBlm=e?&y<+XG{Sxp5YevC=L;EKRa zj|=+GL#aoNa96tBkZ{N*sYLU?W_(*9_H%7^Q|BL}Qvgcow+GTN5`uKO9PdoSNy4N@ zPG6rP__TnWS(YG8D31+L6ZQsLGfLQSEhhG|s`IxzGk?k7()AtO)lp}3on}+$0*ZT% z2sVF_r|lIm@(wNY+^gddGNhxjlOUSb6-9QB-K~10o=P+M82A`?|LP3o9C?6bJq~$E zyOBZ`OaH6Z`#kiSZ}_m~B302(WF(5;gL@orCv0>c5AXrHzQxmC9BJ}H(wL&51NsnA zqdAcI`oo5-kJC^&(*L^mwEpwm$pP1WgFecEN^u&)3>|O)hDj5UYx5wz{R+ce@$r?6FVSt@szOD z4uUP{h(IBYdT(p{o5UZnvR!S1$FX8#M2EiaXb+~%7ySg$nCd*$xIfq@ z6Z0+);CmfyHpL#VfvV(HzF;1}4+^ra?*&noy8l1-U7rQ;f64suFGeilVV~ncVvHwL z#KRA=+Ye2%od>5l*|wV42yV&}muaI4zu&1s3~vSxkEvI=4y^ucbOZ=g#ap~tq+nPO81E`4ul9X9hO^vO;bP-MGKtQNxtO;*e}BQC%>OJo z&4Rc?soq;*?VO;#z7RannB!AGwdCr4awF{u8)&1@pDnf^7wYu2G~N=FPfcCstL9Bn zcGc)<1epX16fSxHh7_3iYdFsh1X*Ifr{``IcGc-HY@XHHA?q~bvLf^apuDH?&MQTG zS$4DAem~kSjTS*S1>qUiJ7ow`A}>5GSBeiX9Y1RnTid3}ueZMD zH;-iwhjaM6+H z57r6CW)aD|iI~a=GA?s?AVb)iKY@21Z$#_(9q4lZpj2{#Byii0AfQeOmsTe(R7KTi z;VrOof>&;AIY@yr1PeY_(I`?Sq81K7Z(nZV4wQrX zXH(}E@S*(*5YoPJcAn9(JN9QCDAp5!c?=f4a1i$EY?eQG>Pr(>^sJ?y?IbEyJT>4( z>f3mNzwCRJeS-ik8!=LBn`#3oQqTVm%r1Z-9O4VpzNLe|Blh%Q>arN{B8*2t?nF$PfEcimupH(E7J_M5x#_ zl7q3|D$4Df@-bf1h^0&o%w(8?FcNTq;_r&F`eC>3X!pdHBQ{Ywgtk6){Lz_O|2?tl zk`k;rK`njMLutI%|Hdadc@=J1-ov8e34iWbIF}OyS?IpgA~MXJX>ey4asUxmN!k(- zGg`-5+{Y)S;Hd)gND~M!_CiG_#}pUo*SKf%Zg1^aEn@Qq&R=Jp2tX5VYg{U}0c3mY zPZ22_eLMV7vy5`}Bq>HYw59NCW9eaRY{zUHXe}dmv;;%Y^2>hGxAplSqyX440bl>4 zAUoQ)7s3lazjWVYwQh)g#*759zhkGlzQxLk3J=t*v(D?D?QUGB7on5ze|YzEBqtzw|z0%5T7uG*Zv6= z(gIfRwhsap2zl#UM$o3-gm^(_>2DT6l&1>q#9YbTmK(7+aVG~INl6X@)2ej{H$!NV zl%U`mE87uM=aQE!)%~v4nOZ?U4EX7*s12uA=uCb6l^wGw#{R(2-+EL*`>D$sAAgux zyZxt~iWF6~iJB=y$-mgIY}%H-H--laS_Me|&ev)~yK^!57W-Oxcinm5xUyIEI~s*x zds$8fcq$R6y0$HAZ*l*w=^~L7;wO^7cxxaM2*5OgFqxA2WhD`I{7y?^2_$e{3@y+GjOYS zMFPa$qVFRXF8y2exVT#)n-~g)F5x80wd_VkImYaL|3akG>zc{5{O@|!1&%n^!7!KBTSLfz=tnCT z_CIo=Bm7<8G}*kh=Q;32)x0$TrVfQ-ee4vEQENm||ERklsz}LXu6zh<7 z=Zb8as78U(T%txbSR1HR#ZkeAY2wF->1Y8pHq>29!NDG!;8!vct4cT zR}Oi+_Hw$g@5UpSU^$dP+e1ql+LTY%in}U<4cu+N>3Rp^2Mk~ge9FiUemx!<2@d^m znu%7{Lb;AIc+$ASrgX4uZm=LnZT6IlK#=Vt9`e3I{X#=1UQIbH4^^=Zx_wG$dd{;U z$34YC)*#K&*w_fwbb<^i=*^9g3-l0Fz;%@rsF>nTwooyY~>(#{C6Fx4f zMp`gPT4{jOU5J1TZ$g30x!JI&vzU7UIK!XZ#bTqeU|5eFs%OCu;x)FaMSz0fO- zh{*o8c-}Mmn-c6owFff?@a1jbrJnj3-%GS(p}lwT(Npj9((&3$9*R^H6vrfelu%!( z$BX-TQ}VCz`rc52%WXCcQEbAIqd8%@zghcJ_jC1on0kAZptS6D^4qv?WE%>5jmt(p zIdj?(yQIDk(@v=wLiK>=eGoyBSQ)M;n8wBf$-|D^TwVR+pFh2bcK_*!WG44AYNmWHM54 zsv{*uHpPx*L}MD@=afUOSOaS;)r?sJLfooshq z_E7De{I!A_XCEq-dmlP3$QLv8x?B(yVhYe{x9*NFI~pS2{`$zkrFKnB?>IzdS2pm% z`J+Qt__ZA#<17>63geO`GsxGNXb*ksYq7J#a1!$1tD$!}vtB~=XG-l}6+_+eV%%fL zb}1OHsD($f5OCbb>PE8Cz8RW_OT>YE7IIu251K92EH0Hp4J5ic^eKZVuXx@)QuQmY6^BfoELQoHp&@wQ)?lfNK4-W zyO6brh#<)W?->{3h&<@5#EMwjIy0*f?$5rs{<_bo{qklnP=#_j$>qo6|J<~+L^W|U zp0&=1>q+oLqbbUvuUkecem;Gb#sv`XnvR6>6h)azw_6G&}9xvmibI8%AjswM}k7@xb8G>nVRyMz#pw8WvKxQH^03 zbFPHEm6{brLY6!OMQ2}aDO{u-pe#^yB|B;EDsB!XMtbVcV&>ai&JWzkyVmm*2%YzK zPfg?6HJZ}mMQM-sD@0wiuOBLyBXdq0$Oh0lb_R5Cmhni_C#bl|}#^Z8QHsnR0J z{$urMmz~!LOnST(tWRAJdW~PVY@a@VA7DZRv=XnjOGs_%9S|QC%EB1jR)zY6l8Tvx zV(>N6VQ;}?ZY-nzq>dJ7#`-{A7s6g~`p^OT49g5cU3Y;#TYDZmn*14pIb$d}E%O0_ z@`k}Rs&^{Z3v#MV@ERBY?EAD3brAcp2$(1C2Eu3@$vnw+6C?|BSw4OuM80j73$mL9 zDJR*)9jBcljHe!&0%73ypzoN(5t;KHPz%=0nRt-9be|#O46ft`?I&I^F{E@~IQ!i; z4OrQ^&xDOWFCV$_?L2Jht%mbf0JBo=d4O6w>h0^}tYe@G8%l^61Ga(`V>|AAC`Z2j z;xl&5M0yIO99&3IG0MzM{LT+UH?uy%kDakwfj`+-UoM|{w_fVYKHWO?xzt1^|B?L_ ze_~*bTz$H*BQYw2Ib#FipV)B?q@x(wPjHVU8ievsRG2QP4`Cj#^*mDI2A4?AB(};D z>9be$2RyzT@Rsk4S*Zy8pTZzU%{HA_ZCxLJQpfdp8|lrcfm+iUy8i6H4FiFNNPEA~ zl(X4Xr{?P1FzVYoW;21ikw48U#y{tak`ry0dHy&qnBTi#ak4vpokNWqG?_6_U;l)bz7t-t88+gEwB|o-h$Yx=Zpp3+LTxxY>?r@5Q8G2&L^$n*R+8O!26@} zv&dDE%lG8A3NQ#K9PE~fK`Y%NwQ&h`QVFi&*-IzJZ2sk0ut9c@RO`p1_V0Sq+&Rmp74>c%rX;jTg&gG1zNz*Fd3*a?+)A#m=k@Go%`r@G@Y9Z) z+V&o66~?u@xMJfyBVBlO8YkhXiS*_5Sb@2LqYh{3Tv={}96aETM|+~lPRe0G02=}n z5=FP23rYwAQx|b&i`M6h-#;xffeWquDNhcez40YX8;T zy1(q=dYCr!^uAh?1%P~zd4yKm-#@D$ZY*9Jw%u&vlwiFyzJm>C`1Sp?l7o_g0&1%ISXx87PM$~S zN}x(I%G&OJX&47D+@2TAN!gdHMd7e>IRY+YY~-4F0JOeI@0WsX`IsB;P2+ zj(P7>EF;udI@lzM@G$Z){);j~{JT%z5}|Wn_>KMr<%)y$o|^{>R?jUcnz5DIeOs^e z>BBysp`(sR{LAsM@dTq;f5>w0*Vw6S;+}ZRZEm#Yx>mPnz3l}UW5jjGO3OYOcY`_H8E2nhnp^?C_w>JK5Twis-i#8~fl%+nj!l%0 zFf1=UbBlO*`fId|7;wxzQsJ=;gM2$?5Zro!`%Vzyw31_+(!CLnM{0aR>0V_n`5yn)^W7=E{1c1sXSp}7!S2! zpc`){IDpYfk=@^x$G4L53&#fIcI@-sdl@HS5#uKEvINc*rq+E(89VOZ#}Hz5arSuJ z>ts!j_HkzL%`pW&_C>L0z=utAi5%1!Skm@41!)hPq@YYt3b&bD@q}BAjw9RSo1`bSD3V1iWWN1S)oa3#`U#AP|X^vXS+Lx=-c^T43x(z_+rp=5(Rk&=cefkxJ ztqV)J9nNefCT^sA2XyZtabL@PDl2SLrX6fSi(6dDUkrodVo`y`v+^mO73+fxGo27w zV_NTWyA>(V>Jai$!-8#pgR-cHL91updw%~AQNt%xAyrTUFzIm5>^`~%*pD|--VEzk zaOcef=3jmIpfwwgORiFyxcrp<&;KWb7J}_aj2&a1^MXWT!hP7=@E?c}ALa=GPUN}T zi6O-h+FokHko;zWfy5NCpP&;fgY>UFBn-hR2QZ8l7&rbo7UfYcsyVfk(y;RC!9YAV zd32AVLF*LzST#Cyp-;9Ue&^L%2E&Ckh~5s|;~xtmN0Z}n>PL<|+DT~ApnWnf?HA(S z9-Tw-tF+R8>x4cJV3~{R<*TmxfSd(FpNpu5;BHc65puVz_-MT-(T9sr)}ifLl2D+rv%mvPE1J=wGHALj%M|=@318jxO$`q zIg8JHOFP4QIhnYyt(N;u4sK9#=8qOfE(JKgSa!0( zdWC2c!?AZRx7*Xc3I?^{kO725>w&e*k1!%C6~u9p7AR9w{cZ*NAiRK}Kl%wTWxle= zu>vJr^feo=5i~DY%>(^(ZW|*;vY^J7Hw|DrpLltXx%9daJmtt=#DX)k(o0ckIp*p! zz!`&w+>9Q3!wfELi_5UA0=9Y5895Hsu?Asx9~|q&SeV+_-Ww59?S38dcg-C5vgxSx z{nz;VPxdC(c4FFSGfWifyw>40=J+9biZA#D6_42fnm5wUr~%FTqsGt{-Si#x%8WzJn`Idh@msmWoy&PxXg-1@e;qc%%;6*&|V{GT5kQ~ z8_LAe+WS8|7*)iWC{fjvXn)-k=gWHTz`~`>U40}%_?ab=dKa9b8D+o1J&%yFG$(3; z=kRJ$HxL&aLJM_aeCq2eUm~LU-Ec=N^Q>dbgLL1WXAy0#sL;2X^od8sb$5qSL!8NNZ6SS7&zg=`}JTQQibDE*FW@${;}tHSGfcM|F6n_4&) zsY1JVHgnbao2Kn8Ilmid@&9zN`?wcjWv$FpyU}pqWs)k%&N@oZP1AFWwK_B_iX64F z`hN&}^Khuc_WwJSC1pub$k-)ivP8C-?8%n2+NMHCQTAmP`xe>C&RA2aq>aK%MRvx% zGnQfOV`dm;|4sM({r;Zk`Rh48$AN!7mRT<6b)K*H>$06}1O1ZLB_Pz|MRW90;bH-I zusNr3_l$==XqgW@?dlxhu}Z9q9k>>RcFfv-8u2ML*4M2*^MWC{Wep9BEG39J&Vzm2 zcC&K_wQHtC^yMY<0ejN&@gVfp(W%O>yy}vdB(I)O^OM3vW8^2-1qn@^l|W<|cqTMY z;itTo9I6$&(O|7_7S-X^N1#k`cCis=IP#*mjM70{;Jkw#+IWd8>%!S=8h4T!;~`(7A7lt71$D1?)o#H0X>^~&JZh@vo69Y=D+c#DxZLZHiKcHM1=;3IgA<31 zfAoAGU)&FH3^=9QcrSD^K=nrE@64#F?$>j}*GJ5(E^{tf6{UMdS2D9NI(YtT+no_O z=*;~Hb+GAiowj^3uHAou0G27C!rk2aG6}rYl_vsEut+L;%N)bvY ziY5=fRj)ktJM+j*i zj?2g{j8BxJ^FGX0mi{llr0yG{R?f6N!5JiNc@QTuYAY|}hR#(_{3(Jyk@~C4dr~`* zZvuUR>5?~Il}q@jSSe`&r!$f0-H^y{wI=zW`|%|qPmO;XaVNO!3nLhZn;+T*G;t|p zCP8oHmYtS~tLY21{N=nuQ+vTH6%d*CS{N7DKVA-fJ1Bj8864LE0W+zMN(?=-Rn^UC z(1`owrTt`)7HOeMG1E!20BEEcME>h};NDziW>Uvq{RNR>zjFhA%2wvhUNn7e90#6M zsC?I#o^}lC9oVa@IZid51kask>$=6`$52~cmg3qU8wM_qI)Iv+)yS0p8vbU%>u4}4sHc5m!nI=<7-j%E!XtPY< zY>}Z~U6pwb`y==zxgfzT^E@4WFIiH2u4S9#kWt1U<+R}eVM85mA%IarKxN_mKVw{t z+s?j_#53Wcdbj@ZqkqnrJtQe4&W6^<(_|7Z*&W&~(i6qM!v5(}z4`v2d{UYyZR_Qj zYS9r9y8L7@l0_Z@g@V3*B&B((^k4XXrkr#%@Zw|bu}F5A>4n8A{M;8p=hKA!3t)0Y z?|cDB+ypm9_j@9wTlOpm5W2Ik5%zTOjI_T;(vxKj^h?>;%%)-5+m5`(Zk$Hgy_9~B zO=`#d#hPQ9UJ{r`AR114pCw^Zco;8rN*;iftsu@5e?jw0MtMZ3b_Olq+<4`Y8p7L6 z?GY_O4%!~BIz5SU*itt+Q~EX$R7F=P;XK{*^=QWN*FZ=NIyK@MYy+y9R7o8d-1NtP zM9gyyiy5HO)N2n3V<%ElLW8~v1?Ou@vcAeLk$OQCxPbO{abm}$pTzNN(a+=M*4Fpc zT>Mxf)cy?r-K$fKkj<)qpW4Lx9n}h?yX&tK09Sli0j3&?9GK~m{$q|%DQWHI4-=)l z7fD%_ks&Xxc}`WxeQ6jsaS~=IkTi}}kt6;DRP6rcwA;Ro-1X=19n9!RhTl-z8Z-Iix?2+LHr*`Lvr;=HUuiYqEtq<5!*?TCRP)a&8^+76O zpTn|QlhTN(SlBjLKQaF?))4a))`5?>W{9}0K~G@$5{a*SBU%>|y1n#8LFrx9&lg9+BcJpm{Nx~5p>W?-6=%hTDF#w_6yjXUeR%KtK2)zp3 z`NcKPn&1`en)S5xkER*P{0ce|ol1W=GhngZpN~`o|4U$5_a;H@rX<9z{8A9xl*T!V z@5jY=k+gO#&AC_U*!cSGQaZr9)KjLUD1QVkcTi||GNqiO2(;LA3f z@}`EGIED6IIrhZw*#zjK1egZ^Z8pZeA{S0sJ-Z>HdFK7K*F`0>tCn77I6CJ&+yLSv zAxNDWwVW}bUe~Bf_&0#=70U-&_}q2QmYER!*_6?dCwGjx=RJE^awI654cOj3V#^Ba z8XT;3f%r)eeI^`7SWq1YGW^e28qhdiil}C9ZDq1&fz~lsu7T5dL(QIn{-~iWIS9uT z)zQwiq6MD7D{?Gle#9}^tQ+jny=TWPks?$fd3odyZ1X-crY-kNq_C(vHnYyURn{za z+QS65NE!!Bt;#j*Z@g2NK5z>`<1(yUJ2a-f+!1I87PFWc>m3PBI8kP)0ioz^{=L~3&#}L(aiVT|9Yc_$w!fT7r*)+} z{4?axlHmtSFh+yEltZ|8u5UFzKR@T$pH~;iN=6DEuDV|>y6QLgAfldrpWT@q4TTv( zGtvql^SdR;hgt5rXq)u`iN24x`yKUjR^w6L=n(2sz`@UN0j8+m9v!)!Q|LHOLj7^O z=ABQ=o?!yPMeD!kZN4B=+T3Oezs0S)j)wMGN05%K34F^Xf3XMbFH@v=Jq?fSu_v1a zd5w&CSf)F-v;gX{)J#Z|x5LR`|IjOYCl}++jR|CO3rq}g_Ozi%2RP|Xv?Dv@1$QQ< zht1)EjcY8@eyo0H)gm^dN;pJFY~oJ9d6%u8bgf*ImiGIn8ynWP)Bw$baY0=qje5*~ zE66V#GAR>==HPJijEBqJ&;}T1&gPwN&i|Y5DKmqtb)MdX{PU%b*E0QdOKxF16c2pq zdi3hUF?XGxh;vJ!hvn+kIDAaZAkT-Tl7!3|a@KJobJ^KSR3fAG3F} z>HkMj$4S@+z~TKzXd-38z}!Aj2|W2cXNhy>z;M$dwWs^*LG@1!vRn}nVTZfOV#T@l z+DREqkG7$`zeVS;gTONQ)ra)nr7zO|)yG%=l2bIvA2TZp6m5&m# z35fh9MRJhfZ1PS>3U8cFK-CM0?tqNln@yBbOgAa#{~Tex*a9CY#KMJjK0=SC?H-8* z+#(2rLjSEa1$y|h+uw$G5U(YK=~x(1*;$xy9i%7U`FWu8LB_1xJK z{+OUVc%K^ZPc;^i)*QQg94P*WdHwHmQ;fmXuM;D{pbumYMirkap!5K~LnpfNlwCF7 zLxppYchP4l{juW{>(;2R+F@TunlD@2hEMZkTkxBK?xK5kD@^B^8P&Owh@ptEwIzxB zoI?d7=t;uN^zttqm~;l)f(ni&?PPQ^R_+fUB%X z2y8X~qfK%aXX=|cAEYg^6A&r1k@&rW@35(Qft`14hi;FVsqYf80XOIlbnOSQ~a(F4&@M z^hX2lnv2x!mKFqMgL6J-&`SJh_G3f-?1HXe8Qy*ft}~0Q>-XhIn9}mOnU22^HUhJ z;hrxhz7lC;SEl=1*~XlaP#iHY2lEa>Q%uZ^oeEcYaV$Lz{FqmBr!tp&nQ^>*hx!U5 z&TGk0z758>vQBHT1@?~}P1KffLksC*xq8>bPmw;HXtQ=fIk;Q`O9D7`-@_K#2j`4e z)XV~*SMfuV@>sKqJBbk6L-K&`v}31s6~1bt6QC~xPsyXz;m=c(dVn8}z&%c4r9>0g z-L7Y6HR|hcj6Rzd8IP6lxt4GpDQ5wY&2ju=l z=xKH-ExH7RteaX6r@s!K!6&~0WWe8l#*K9?h1*v2>~0QnOa;_;`W%1{Xl{m5@~^c( zNk7?ESnT`fTA7bIq&GOqUd97j;qznY5T`Yj+Qij{u{A8s?aiIZ*tm5x1M?<0Sl9bT?|1qm-h!koo%ZUj$BJ9-#1~ zaFoZ-*{UF_iGlKI*iY#PeKp)#|;I9~ej~hfg za&95x72^(f=6X5?LOY!h=Hb>c8!gU?6#MPsxv9&;ZIr0g{xPDNLJ4;BRbqUb;%c90+lLnHw!+cAxAXK(=`p}2v_cs`Cvd$76T@U) z?cRQ^Fo16zR$(;7ItU>X?O8OOu${_D73_ZFSKNmJ<4f zKJM_>M4Nee0oh9&%9nouy)e^`OS+LmVTz#IV=E}_QOoERIaMJH>-{))r>{@ncH6Irr&k7x_ysonHxM338sS`Wdw;*2m} ztz`gp_TKupJo}5`-6XF`7sPp`#8!3Td`Le|Va$Hu7VH+OqmcBkHDGvj#5+W7I+Yg| zpCYj+JN`d8(bBa{W4ABFmUFy_2or{J0u1qFf;W;iE>LAZCc?NXZvx=3Rb5;P_j$@` z4*59bKyvABGYlKH(St~l(4u4y;ln=-yWmZ&;_L;|YSn?%RJd==< zA8O!}5eK?7kq{gT%`CzxJ@F?y9!$KaD|hdexv82yKm5GRmdZ<+P4i+c6_eCe5Ul7@ z&-rS};qPL@sO{@|mr|8Yf9aw>NtWkVKhhlENaqcW^H>_=?3=mZ`-{3`xZGmrqa47m z<>FDx!EPPRb5oHk2XHMdJRIPY&%`KVz1#j$@^-8u!usz6Sxyv$|L^lSh2MF1W%MHs z@)}-rE!8S$S^aykkt0v}J#Hs#S{2Zjz+039mE;K(+I%8(wS%C~QPlY)Jk7ird*orq zg$}{HT`y`$W?r}%i4I=JxM?|FPXK`%8` zr}s?3@}+7lM*!2w$#MrmU;_L`U7aI_1n9{ZD~_2BSk|n-%CR6cw8VDYD@pCVf^429B!xBdrhP?ElbSE&s8r+~yOdZ2 z?|OTULwOSkhZ!O-vCoe_W(6DUL_SFI)kh>i*Eu#8W#=m&zn) zh@pZpZjk{|D8LtBKqh*u)Pxnj?FUiEW!)cX9za#yI(-|bvuw;-?{FV|hwnAMkA4eA zn#6wKJY0!?JGngWnfroz6%ZBo0UrS7f+u1~VV4M!(^}I>NgWG>LMvd~bmR0a7ir1TE?CFT*|Ta}bM++VJLnil(e|Mny~BmZ;zF$n?V zGf>YjP78tYyW%dIvs1;CW29Lr0fSe!{@Wgu7wETq_J30t(@LewS3{|9?kGjyQMybx z*GtH8U&7}gGijQpZ(x2tH~+8E?tjg8S(n{%F2flwTt(3I0ncU)18U^ss98PU&3sT6 z;kL%!bH3OE!P!e$%IS|(l$>@QueVA^%5hy^xVLKa2}M8nR>#;$EarxUWNIBH``IIH zAyb18apIy#X?TL9XSHt7=*oeTL)GLtt6;9Iv|^X6vx09w-D%HmRae&Z{+#?)8E@j-OM5#^41lnVlV*@rEZ_ygsxl?91q&ih|n$t$@IYYV1GH;q1(Q{H0QqL?+>| z#JN;H>hqRxuN&eP0Htk_5JkVaqEp)==}9?eK)%1c8kOwIS~=SL!zbpGXJZxa`&t?7 z#(T|g?jjGvq1oK0)vtVKpeHTfT$7Vn<5m9Q{GcpyW<*@F%%M70fk{1~Q@gc`v21k!wnTTlHcEm!>(_d|;GfvWxn?PHeY!@Vk* z4Fm*LfHPb#S2$0Edf~ zpA))nzj1~DZ}Qop05(y7^*FFPJ?`VR*XL4AOczo-yQv@GE<>VOcxT8UqiU0{HLPFd zNXeD=tj)3EM7#Qn=?yYL{AaV^<=hm2KEIKd-M;{-|R~+wY)}pAZ$7_ zj|K{#maAyb{3MJ_$I(8aY|R%R0RQoMgh&Uzl08qj<|gMg1mXK(dX46pYZ81b?3oqYEnXrZb+fvuHEijSB^EkURy!|POyWWy6TBNnEy$N zQaMoI{?n?j3>H9DRrQX_n>cy+*Qz*6C1ZVdSa&XLjc|WAbG_Qz3zoH1Ea3xZRT51% zpXZ3v59Z>hnxrvgQ8X|)r|&tfYB@JM65hGV#1O<%sSZxY(>~q=6ARQJU=X`QIlw89)0=2n*vOE*<6%QS#KlPSf48 zpt~Pr*X|_ZFU}(W8kF2fRFE0IviV#2S$L$uIqL{wg%f91Td{0{NhhFBPv=gBmz z{h`5v{TGQ?LO`C*!FF!zB47z}rP&aM4%!x*K|EwJKs}qVm+DAGLqsy+unetq%n~cx zUW>+&MQsXU%?yu@mUgPjM`4Zz*anq|@roA>T z(vWVO~clu?SRA?lSO>9t`1 zN6$;(QoB`qwttUhexsXUrlpit|lPH7jz0Ls_)pze-!m#K!BEK0A)QM-)<4N{4rQ* zJtQPIfBf9F1GiEO*6w<6To7|7%QN#|t68!_m{$s?>bzwGh!Z!Bx>J;XbB2Ljf)K>t zx)Srl5(#>+1e(cca+OR-c)Ov21c*jayZvLpbRmYTLe%)p%hQ6GPaKP!icowv(~Jbj zR-^(0GSM!z-m8!PN!5!Z%^&Y9sa^&MIHhgy(M7HL>@XEi(u)WM90i=v16LdazN&7! z70t=au2+m$9J9cYAF(}?ZfKKGTbKSicC}v8Tv=uAD{8+_k#>D^XI_4LI^!AYXuPmA z=->y7-S*}h9fbZj#GlyaxtN_VFx>_T$pq#$-d|uu1x>rW+OZ#SC$Z1FG&qN#)2c8( zSU>P=<4ZS24_%d3hbY56)AHDby&+H?b^*plcl8A&h1Qcdv7XEiwQchHXxM0t=|N7_6cDyiKZxh!J7R}K>n>h5-MFG?3A}B2 z4%+1isXiu;Oni}M23qHgFI7XoOh4R{JQ!E9xy)NWKnqRc%wtu$(ds3piCAKF? z^Gkx75VZDYcV}rjuJhw|vS6uMPOvMO>+ZHa%B%DWMd_L${p_U-nt-(3OzT}JP4$}Q zdc>Ka@)RYez$Kx`p<6A)m*{izDc3l;gzb!|cK9H{uyl~<^>nH6!|ki~FX6a{%|-i zqS#82eP!xYCH(M9munfu@6xGLPx>%=Tlm5()%v-#>baG)2;nV50-u$?x1puJzsfmS z6h+%a-QieiDQH}o>(#g8 znh_hvsqD$mN8zl;MvviiBjakwT`@lk1yGl18!TIDTJ8w_>!4i;Vu;hzl#6Uzz3i_`L$T>6r}J`VnMiUsoB%Q?b*HQ^7-EWt+pxY2Q#tX zG(msO=9%^+!1!xNlO^!h53kno((`rj79Q5sgD?(17JcO5!s^PlDM~vu4#h#f;?W^& z`~>KuMECFK%Rz6$c&0B(xE|)2oW|UhW=1CL9qP@n&(>A(2-n)gNtnBrRMRXTj$iG_ zDuhq3wGJM0!!Jnw8~I*4;NSMV-XQ0hG%x5P&v(XmBl%H7fWvD}N99))2(O?iE&0X! zBM5nFU7%K~0J}zOF(e0Gfzsll#(@;6Tf!`UDrN}&nXilCV?n~zeLdlPn(EV_3WBksb|5OwnA zoVHrllbN1qTfW`a*!!nmMPltM5WB^H$(8$OBzH< za(W3kt-t{wzC$GzJbM9dQQ`!?O#fd+s|9k%w+3n9?Rk3y6Q*Be%ZGV$D*yfC*B8TM z@LbhB^P37mD1`zajNp9Fe2Da5sWc^st`XRv!Kf?X z*wTMdj{oAo|NV$l6{wuo1)Jb20{QhxZsRB;6g_Y@H<3Qd)N7aGPG@tfGyG6j|15$S zsX^hKCLhV2*gjMbubrpef#FHVWB~w-zXfaog8E$u&y?n`Yd%m zW6!Y??G)CqHG5<6=n!{~AR_caU-~C$4=k0g_x<4CwbQ^1Ln0$K2ULU>x1SH`TY)s* z31rjL>R+hXg72trNHsN}ERuF_Zx9*GKkszk0}EJpx^2#R!oaah&TWkrQWuk&nFVeq zr9YrkS@o1cWeHQnhaX4IQfSZE7wmn(KD%?5=tMk2T-61em%TjoHxO~{a0=!%74r-> zN>eK%K42|9^B~>z_hu>m{^ZVeSh7Xz1hDIOcp^3M2X0+GgvtMtb)EU<@4=5xw>$11 z92eY8%o4sD-<~-7{Qc2{+P~{-$0)Im3FdL!^6B+`frcet!i}r1_ML=KE7< z5735D16W=>$a$n|V91cHeR^8#g{Mc@Yx330z~O_3$8QEVWmz0Y#|Smo-mQAF0>wQ} zNu(LfOio)~B`DVPAMgZ9Iz*g$WrP+Q;Kqji&6Zo;GwpTyopyVaVxy+QF)Q`nx%Ohf zJBQsXkill~O6&1|dsE`4Y|1OZ9*#59@CBgp`Cs+R&F$6(r?gHh$(o951|2R} zh^?0502NRAFDtoO+zBvXPkfQ$cil_`!(UaDmlK+{BJLkNou+>2#Fb!0*C`a)zFP7A zyk0_wE?dA%nGSjniilcW65F)SF^}q~CSPFYE%0Qf_YYEJ1C|@?gp;QytP?PV>oktmE#J)vTmGy@pNZwN0BRSiizEe=f__=H`rdcPHdRPHP>ZKF*7a z>6w}Tw^QRlY605VAm2f5zstDxE2kAm<^>paqs;-1ALy{B*5o|?jY*DTq9ZDi$A|Fz z(=bQU7)063AegCMDj@M}*wYU{QnN%$o7G;ro=7QfIGn~#aXKb#HNng02#()4j))Yo zerV2F4lZp1$u|^ky8kzdxgg7R5z@vuC?rSHhUQsVE-C-WD)HU3)q%Nr&<*&&0YANnrAxz=Gnp@=30lJC#@I4< zOQvwkfllQsG&Nc$`nXsLr=?>R7JHNHDmPcw<&q0H_wZu{Zi~jvqQL|gq0jqhC`x8v zSBP7Vl4*^8$9w#on@cI-?lJkgfL~X}KP_C;+pjE}$l&N|p|`sI^@FSh&9qV9n{`QA zo9(sNUP}j=DT-?rCFjz~SoAzc4QI0WA-&GF^%YCb)DnTZfRkEm$q;r3e<4#Hi<*U| zNtu6*7$3NOtMS03T!GW8lxjK5%1k|&%@0J;m7yrA)P{Z2TlpK{O$&wC<)>e;tk(un zM`(ZC)~N6M;M0bE;huW$r?&O}0i!2p>z@1e9Zh;^W^r#A%=RMm#s>TJ(LRCbGXy5c zivK*n+gCXOE1i@$@yl~j&&`E=F9?~Jc8w>i;-X47##>LE*|?E%useRSLm6?|p=EL@^DE^Edm5j@>aTI%O^IlQp=-#xU{T}0WWCSI@Bp>co@*{YQ3>wmEW|UOr zuKvX!F@Yd7(-&pTtiptudltdxq}U^9Mb|KEN$^6jDsrDfirQzNnP-dtK`t&uM;nJ; zeYW5wUF)iM4NDn;)Vfj2bG;)eMDIWBi9~QE3ZIC$+)T&JR-=f)kdLSZ&UYt$12FQD zvW4`!5wCv~|A^p&ZiB*d;iJ~9g)=IovQjKF4f{SU(>lARHyN5lpzKPm)vyO8-T}i$ zy!M=WdKzmP8_sZB<_eG%*(@cv;BPv=M=iGWpSi^*8L%7_W~i?bjPzk7bQ|Nlew1}* zy9G-%T3a&?ku!IYVS|eIcN$j(-p%X?L}(vxj(GaY?gpKEw`xNzw58~MhrucXSIf?# zJ#%^=WF}~@Nil}Ug^u6XBf^FO>Pt`Ey!p|~B;Y>ItEQIO4Jl{+2`qse3}1|da-YW& z+u^I=jE|?qmw8s{Uni2G=*udk0fD<4x;}|j`jad()LK|Ar1>=*XHZzwvG*ZJ9-E(y z4pAWyeSBQNwIwX8HN^fqwuKS?6z0)69>e|Ubl43T7EMJA8?ch>rMA3O?0=BYJbAxu zzJ`XLI&UL?dM)Ca6zMj6uYN?hnOc3KzGV_uGm{K0vYd_nR01E$)phBpw#U`@0m=-a zCYutlW#10Op25vb6%kT$&a@kINSGP!-c*3>XcxS*K2?3@Hd%~1YfAB1G-u8`QY^8g zn~)k%t!H7HuE<=k#2n!gVg>nCRk*84ed|p#9b$9Gqc+kRUHPK^l)?~e+Cg_jK^UDU zPBu#Zx*n}R6@k{r(vtLV11fgLf>^WJ!!LeTP)3G^XIoUf$BGqLzjrN$5hWA8P0YMZ&JA-B64uy@_|KYhwW_{ z!uibd=9p*bvanV)Z5z5bA{1h@N;$t~?trjFHq}oA^{P+?Vo-vTj*X>9H}BZzc&C3d zEt5wKu!*R}Qa_uSXX9Lr-iThmzIo4=W=IKFa(<`$%wATmMwa%Xl9k$4E#D}CDw6Niz? z*u_K}EIfTVKsO)E4Q(s^=prkOd@=8pVR09>Jj-9jN?6cYqHn{*GjzOoTIsAuRWIx3VTWm z408M9H6<34IQN@!sU{xkeW{7I&Mu%ejj@jgFD)OPeq>|61$YOb1JJ&8Dnza~Baf;O zvk_@V<~8rB(V+zi{$y^W2mwqzjDt@J?XtcgSvI?Ofz%_rT@olWSeFXubf@;~=??gY zJ^K#P>M8oFSjAh3T-DG*M!kM!y5!X-#HBtdQg+30%0yg?1Zv^pnmLlR(IyC0AC*|k zon<-yWDuz2y;p6*mjhR?AIOabf|NGU@J)#~K=_iEu3P_}m$nbPU4X939(7)MY2q|@ zndnj>28ZJiEScs8GfS6kYypmPl)VnVmX3wV+aduqUDz)rH0@ozIMKx&E97?ap}L3u z&6#$%NG;pLmeiC5`)Y#0KKc_6E7cgncuwLoyr#Kb3dI7kDdKVPO+3PC@epkKKEp`g z2j9LDRE>ph6c1-E3#(p5w%x9mCBp!$QW^oZ*O=LSl}a>~20}W(Z+;Y_G4r)@;q2yG z=6YD=OL%W6^K`RRvTv^K!X7d5?0HT2kQA%hLTCFlmJM6m>`R7T!BlsAjbvNZ6W-J+ zM!IA71kw#tEFY;(P1`H#gj(p}@n~!6gf4Nn8N2gjje1eV&d69L1vUd_MC!Y~B7a zF}w*g_$WqAnc^F(4JaP*ki*umxK2O6It|SnG1y&yuLYqMU~WQe1S7)TV}Gt=z%)^( zGi>o)0(=R)_VfD|RcF44bsI$?k90$}<#!baH(yK8xk0PdK6n$LVZ~+FBQK-U_-FgvsRl2_l$57 zz$iYL__rZ9Qe`tp;Z{d27#zl|Ne8eIXA56@gUMQGfzZg($Jzy+i}$GPKxAyoemDDrFONVd^!;Ca#|(o#XglAIM2&9H}A-iH{L%8Z9V{`$^E-1T!=YG zqVNJ>jltu;(2M;RcAa=U*RA2QK;x#xiUx^iw%Rm~Y;&+u%Z%Ztr>hE|Tvz<7#0w2W z9aHB-Al>7?P<{rOgW9eFRyBf`w9RSiLi#XEyADi{wwemA4yTBMs0UbL0I~` z@BH^AgYm2OvG32WPO&%b-$M4Qv9%x;OZWz;KJFK1$$GAbONN#`YqgV4k}$00nWs2% z4*SbSlgxo5DnrEb&jvwRiwe5_H3qtV*QayWwnQ&p_155GGl_h&wX>|m^wmRGEZf^( z`V}Zd;WPQhtw1IzD4WcPJ-P=A+i_AiWh6TJ24c}i81KcJ= zU?WEma6;s;Wl3p#SVTKtEI35`N>%2@S8kBcBWImW$whI&7loG^QmE@+?`$vcuCI-L zlUiH;=1U7Y2Yu?ryl1m@%(JJkHF5Y7qN$Wzg@Knu%&$#2vAedt?lK0DXb6nKn%N0{ ziJj!KdpKVla|c*RR=&P*;b6Ran?i3?tO^hc-O>Wz<%s!7ook0z#gQc)f`|7#s_x%on~ z7c*x68aQsjzu(6X`c4J75{Vlkxh3DFa%{Hxh4$L{??15NdyT_{CcN-)ySJzo z!>rEZG0aJP3%j?-lTM2!lNt83 zJ*Tld&#Y@6W)JG|Qe zJh+&y_>TMoPT!w5de^@7HXTH4pnU-EW7b>|v{@S_7o$h$%6IrS_4__({Vj*Ui`q zs~*$-cn%Uv*c$Mv*(BR9MC~k`wgfjZnKz{7^>WnIKX!($4mW%Ct3uP)#Ax4F$0F9R zeK^4aeY9WK^1tjyVLscvJ1Eigg(f8>$C|G7oicio`Xl10`Ci~==aGj{|1CpI z;*UE>73Qd*k@7>vTjSHLL$~A%cjOI0ZG5@y!1>guzwPa&VZSYR+@bXCb+2K-Crg3) zMX5oQh4mlr#5uXJeU_Xe278;b7jgn)yx_lOyVF}V#|yrSZC`0jd9o)dGdZP*LM{E? z4;b11)Qj0h+raq&T_SDHuoRa$Rz?$uc-BYa0qYQMiCnjXk7^g8#S)e*K+BPaxO-?_ zdA=4pGK6LTg%`jOGGYJ{urpMoqaB}FD7W)>&wdl<8Q6x-AZ)mH2MdI@hmt8rz(z6` z$@L8~7s$AjF!kymvnE({$xiUh1I z-k`bT9yAH9`MmrofFYNsdkZbdG2^!r9Tzjn=*ij}i`nl4zeO_kOv!cgVn3nBkg4{m zKK6AhQ;#J`ckiF&ESW_8VEie2$C}$sHo$Fqt9|50AvnPq;aoh8uC>R~7wZ{0=jH-0 zJAb%U5NMAJjIm_;NDWpfPo1gz*=JL6MQ6J#&-0k1ou6WRz#{(+c=UwQsGQ(B?69E~#NdRc0hfKqAx8Fv6iQJ4w2(ma{wYiqODzp7K`& zZ7tzFr-#XJ{|^00>E^>{W*KmP(l7pV59E+ZoW$3v3FHea^hTlV14uWVIM`qh=)Td!?YP`KoysSCf zYC{K`jhE5IN5%X62cqz%u*cti^Fe<)UOP4$&&QGmqlMjYzga533wLjZmb{||;j?g5 z^``F*R}+S;C5Xqj^Pi2!Z2#PAOjs{=j(F*xwD-*9%r?wTT>?kjZgFs?I)q#*22r=pI;V)jqRG+ovA6I^HB0zicz8PSU5sZT| zNsBdt_DJDq;cq-a^lbZ4>mBTT{b>F0EE5>5X0sZ>o_Pe@d_wbRb(frW8B**S2JO(l z!|pFgxNS!_iv&*=YOEwe*g}6BH$TWtifOb9;2V5j*FYi zeiyr98V2i!Tk=>x^WAfsK?5V2SddVg zDpoelb}iILxbLe`leHj~5*jkh+5&avtueU~)#!?WJqg$`01TU7&<@pxk;Hn@stXz) zMFf?e_P)ANbFb`{TsRc)M$#Yf1vX^H0a7ZX4!mLAs1|NMU*c+%6xDn|);V8zF;L zu@!lwt-YqLCb6}p-ZB;9Lw(uPF0BjRB^SECl325zyU34mf9R3BVR-@hJ@vMt{kyp# zeBvBnkk{1^c!hp(6v;8)7Jf}H^)I7dqjgu4XAn6v#EyHL6b`irus? zbt*j;yjG4ufdqiG8k&YIK785bI0`{X*;!N3Kz@tI@XgKx#C3bTx2fE0!&vyDI3^y0<+y zvmAMF1l<1BbfR-LdDv8;(|nEoYzOjGIX;I{wSST5TQOX};ID(N4Rp7{HBbYjD`4j% zKA$rRAKbL`HX*1t^8YB1zr2YFoLs?YDYJ{n$*>)jkT2&NMZ=#rRe^Fss`j~vJPUlS z!jH=Vb0KUQ;M&xTFBV><^VB9cfB$r%On~}>0lrxzSedQ8WB602pcP6Gi2w>x%inG;bag!XHhAhMbuG8@R7zHskjT1(!o!%RHQ76uuA*@wk>sfI|J zM1W4KNRQ)o2Py$)rHN4w5|z3W)zHb=i|*8%Q@@ti(LO(UjFI2f0Bbz0+;ILB?Ml>v zW8nq$?aM6ezTS8?TW0X{e8VEml7g{is?By^r^6{A(vTq|t(M*RO@#y-6K=9<-rd7y z(gNrB*d^7yLwH6DK|!V{%qM)2eIDY1etHSw$8_J?XV-s$us20^eXpR*!VnJV34A9paMZhrfv&P9hE;jvo**OQm( zy^R6IG;BJ&6h{uXbaA)a;e0vt2! zvVz|gwoIJ}N?C0G;@~HzcVQlmmHxhAQD7LGCMsrj|A)HN;f_>9?h(&HHJpM{PMI5`Q1UZsvl=sKV6-UTAl(P@PUD@F|F6U*Om`&B&jE=JZR z<`?H(hTb`~TE9zxZE%1BQl% zj5uyhmkE3|yl?+ePGrv3WAy7AOuzMNq!8EVR@MKfDjJZN<>Z-9*ebj8b;h91JN4)O zke8}fUmx=z86FcG(#3SN-k4-dTWJp{i)Hs+xZ<#CYnGpEZ%0gxYR}Hz?=gHwQ#~7* zVslI5zSd1NrNxeMoT zTAb!~<&%#IIp%d=c)E^)4#q!vrqW$px=9YRJ7Xm`LFK*klGuPvG{OG(-9n5Kwq@=& zlEVCL9@*c}G$2F~OnUo{T`Chc5WQIO7N%^V63l4^zrMC19m|LjHirHF67s(;fHHiB zU|8AGuIyU;4H?|TJjT><|8lD!+;12Nkt$(+pB2@}BR zE-5N|7|fE$D9a>8Wtn78kr2X+eJokBM95(5+st5?eeSFG=kxu2@B2RP<33)0`D4a4 z*Ku60>pY+5|0 z6-C_0UK{VE^m96hhen}}=X5;n59&ymMX*HGZVV0~ax9|3c;jB~AJn8$mV1qJ9i&71OJEa9Tu+0ysr3ql}1NRkK1#GM4`6P7mpB%-51@-Nt4+4n104P$HcH9Dr z+juf+mTta!AvZdy)$I+>S(Jn$e1@Iup4eQ?wQtFPE*D|$2QR$uepmAI=FLaq z#DoYD=C(}gesIek{uQNlXA8C5>$81aaZ@psvxxT)qmKx-I?lnuvr%_LHSV!oLf4^C zlXKq>6L~;@B>OtCn*yVB47`|AhrIX3zK6h6PQ$Y_16hJM95LIo_+rbttG>s+-n-Fa zaJS%AM9z(iAyu??8utjnr52n!P0kM%wTz5A8X5{VyLhd)o_RK4#c-!Gkw( zp1?SIcR0sGZXL9ko!ET}Yv7ut=*BNpX?z0*Qw~lN0;RYUy$4?r+h>!N`ASn@-u}Lj zT6HlIv6|F+mSm7$-t!FoLfONC|g-^B`bGt+a5*hM9ugXzq^DZAgd# z;|Xz$B69|UKEhSV#rhU@lP0O8k=lUW$T7_Qvj;~gQq^N_@|#p)JJFJm^R)xAjN(~* zsZI&)o6A%Ht?g%bP4B=PKU*=}HJI!5x36{W8T5!`--t~N zM*f&O`-C{j^)Xl=|99~o!x{N(X(q^;1sXOnnQt2<4IMO|$_7{4ZNANhwN?7A0#W{C zF>DLNI#)Jo4LziRNq;g)mL|3G_}k!JoVu|0UZcT&OFUS!Y|ce$2l+;=JYMKeayGJw zN1UU{Sopu&0ZA{y%W@}s4@M0y?XlxlQ^jmi;?)TANXx76gR4n)o$^yOLwO>iVB((9 z_zG15e!s#EaUuBByOu3;5+GvKHhAXAW_9ByJef4RM(m@^{3w$3b z3(JyF8!q~Q+}w3?(R$a4n0v+^$!i6#r+rBCO;;pdSoyoxYWmHliEl*-^r*Qb$Q?~vY-*2bba|{cdZo&|uGMKY z+hkHZwu{~OryKO=%)RpZWb zDf(LT%9t!)-wVGL=MnTIGe{m2Qmo0EZeT+B^i)(td>y{MoHy2ge}?biXOayb7|r<= zM!(46a#5BlMAZVto81(4+d<$xLpv}wKs9GZ2R~EVVG&lK4L^^mTw8zgiuxJfuyJoD zN@pmnIj7R4Wy#7!wfhy(A?)XRz`HojEa8dYziYJVJWH}*4lk>-Zu$-WJ#gvWcQYLN zx1vI9vn)b*7NPc54pj1mu#3g4hs`Itc1P(}pmC>^=sW}*1E@SYdB|jE9GAPldKNz@ z(V=+(v2_PV{_hI&_yvh87LH^la^%+K`s5(}$*wGcLBJDb4xEb@N;Rw1<^KGsXug4u zg?zZ;@uqbmb;=7HC30Vh;AXrTa*lmWfW57`=}O{9O>)kenjjlezs#&&i|-vA$Xiis z`pm<^?_$4NA7{^Q4&JgEHR&NKuxW-D3@NvC?56oR@KO#@s~+Ra+y==Rf#dGDp>RoG>;VVGMV596Pu=*L(H{6=;awTuUq~KMFFG?}T=RREoyl z=$F9EPW%+2%32Z8YnQApN1}x(v0dX!Cs!Pjkz11KCmHBi{ zyQ4~T#a&hY5Pnn2XJDntR<$$?$xhQ9Whv z=i`5X=-Ohbxe^!h47pcviCc>La;fl^!eG@#_WgyG(Bla}^_;7^jQug{GZ<8pWtB+L z`w|iwltWDm8}1R;AWMn?Z@5|fnY?fAWapOQe zC(jZH>@)p>Hu?Pm&k)?m0`u_}Ne@XpgF zHg6RLY$Jxb9ovBYvk;v|_Siux1I~<~Rs%YG&EPwZI2e)%&HzVND}E4`5-U}llOX^e7}9fXC|bdjBoIv}#3 zPHpNjsMGY596^AgPv*^gg=Jo%cTCDR{thl}H^ge#r4_Y#5e$?@O#E%pgy{J~1AuPW zJAw)?2u?%*Xa20X*db4w))1PbFH@t1;05wnNd}d0@1G)%t_!?#Lz)xBCU^||1@pO$ zH(~K1JrCpBZHWsMULrg=%!M^+){IBm6A(*kf-&HLvrW~i#Ad@l$+ef$1#juW(^Z}d zU9?*6#Jp}A!7ZvXYT~r*9RCAz@iYwMx3-JB@be1JayRa2wF_s=M2tiyyoK0buy354 zG_B8m1L;gJg9P#$<*8%`@>FY0D`v0+k$@o4+q(v<=89goIwhwF94A0%OrC5o(V(-5 zt(bl{)m2{ETXHP$yGGGRdW74&PV+_?G?f#09PW+1WIEPH830AAUkw|P*$+Vq6WiP0 zQf+o-r$M@~_r!&2aaCTIc{6HWAIr+jOQZ3`!#{KTd}5VcbIIUHrrNRTDntx-ekdSt zJaHk$z*Q*)Gcc|>ehOxHuV_d5l}BR3!(U&3;$;5&YU7-Pl@>*E{}c+L5!I~~{st(; zRq|YgNypQ;Mrs!vr!jKQbfx_y*md$`ERtq*^lIqw3Q$CtV^ylPDf4xaK%50kpxc_X zYOwPL*c*aYJj^bi=;F7Hl|E?saJ_EyVTCp5jl){T+P!(yw@#SFk}1kY?hD=ok++%x zzk1VFoi*~HQaN^@buJ&4L6GjxIbM_nNv?Sgoz?~gZ9YKdw3UCP?)L{*#$ZcVaXqm6 z_~hB-vC~1O4FZ8C^}9`?_eKClrSc?1a;+Zr&bcw=Cu8z;V29z{VCdmFE8fL#O&UcKT?8v-p)a3v6XU4tP&!pMAo+^v& z;Tu&m-t8e(p1PI{(li)9%}_f$p{Fu`iqGtO)YpXs2pCqza8_=P+k>FK--iU#F5!M~ zM0>;UAA>sMm(yX|(YH=b_;;!Q!&de$z>6&)uo=E(rrW z9<1l_zHLY^;y2Iea*Q#3qqs!w;`Wdm^Zj%UnLow0o*{+|1C!v_oZJwaQ!dgO^hNYf zHAlP)y9L|HPF{viywyGZ{Vs#%KXKO7i2{Uce!w#52IC2be5G~z4s3!)n1sMVI0+oR zcg0sRce~}@8^$EjZ&U2kA)_!?edWf_8>5-W3k6ZZ!ItlNhKOpR<$K0Y zRH4I~CgE2MCyK8uIxSWWk)(*Xn4a^HTO|x!)Qk{c;ud1;{RG>3mknpvK)sT1|3qvY zLoUHLf;RerfpDI{#n>p5F;9oEtdv8K#93`x!ZjqMvNhs2jYk_;=ku-jzj>+05s@zE z4bLsC!;gDTFWnTmqiXEG!aUdhh%}>|MryB4nbaK|ztE1DzF_Y_DLBjKAA=__U+YZ<#{#pP6C^>s8;hM)lg(_3}iZhN;{ zg0|nuNl$cIQ7%l1MWkT5*T;X6e%pFtm01OGHOf_|*W*^yRT$Sgr)?`3pOEIphp;K3 zY~+`FjoU`EW!fE(NWSI}{+__880~driB?WuDdKMMeh2H9$){?AW5FDyxiJ`uxOt1F z$myC`?&`wI&VUbNrqjp=5v{;1$~Tk4$`RKTjB|if57y7EdoTEW(@CBg7~z^Y8%}iC zXHrSdN0CLuS8hDi%EIjA^*=bqnKY!c-Qm~xfT%S+Hl?5z1AQ<)DAd6e(N>hF&Yr&@mOKc6vx24BBjcprvD? zr1rQ|Axi#BS^{cC!$?6g=ggUhx3>1h^u7xHusb<_x%sy8Z?Sjz-MjVwT>ql_?Ump* zl`JwYDHAOUi(hTH=Qd-}qxiS% z*?&zksry^(&al>GV4@Xi`B?MUXr*5OEZ02}?{WF0ze=!K;!D(o8gY~&%gY*ddbRb! zEvdiN(tnF4ndh5yKG0wkA-1WNs?ebjlfUF-x(Al`X0OGrgf}1NGaC=(p0D3Gm+|IN z)T_H$_6F964%Iwsr=M={`ILLR{_dw!23DH-&L6%mN26^n7@ch1h?naZ(4<3|w-rs9 z#AjBvYQ@ZUt!m)n9_ovKec@9wWpI7D_yqwmseQA(Q#-I%Mfzpg@|d~Zrwjv=&5X{& z&YxE%uViE!j!Bx1Nx~$hmP4htTB^bbGm$TqzR)6mIsx0+o+qS=#5k*Abfz|8$5jBt7co8&J`{fZw%7L}Gy=rcXB3fC6&$2*ErH-OJj- zmRG8vxZ-#mK!L5%*JHu2z*ob@s_fYAB1!lN(>>9udiriyO@9l3w#JFAi{ zv;`kv*9|}5#R$lG0p|a(gHG%`vP4$nN6%h$E$SZCZW#Wrcr&ZQJ@}Vc)GMO6bG0`b z$|>hWpM-Tpv#!6A&NC%$-vInq4dGE#&Oo7ab|Txm$3r|WW>#@waU%-Y@)X-Nx7~E! z18V6dgZ`rj*}eL;^79GIxR`)gc2eF7KX7IKvt8&R<{Hkv%`(J;c01J zHSc|V?rC~~K{q-N2@=$LH%$!JEvvjFc!;s05JT+ZT~YOd$X zpAcv0VEPaA`%};P`_UIjZRwaW;!t6N(0Ax1A;e$6oIyqe=cf}du1AH8jY+>}=-A9_ z&Mv)JTb#J0qDt(hD!l&ngR(yNVopNZ4uBIWKR_!7uW$oC1k=hI&JL#>oopZI@W;yo zkLF&ya#5(?b9}*c-_Rv`J3&T%e@MlOU%|mi+xnP4GxBWT)Y`CUwgqX4Ips3oJaQeD z+!?R&A{k+U{Z~W@Wcx~|=s@Yc-#7jxur`y9!AL5l7|7g{HlARz!Ei+i3aBSEnetxJ zL+tG~BAxn{ay6<%*>!^y=~QWssG5+5_pt<|If6jA{#&I}bWLuyOyfZGG)jWF!@g=j=d>wv^ z0JBgK@WzHCiL3dTzOI`0TXLXVY??R1M_2f6U_rwAJy*ngv)bO=9p3T`KQSHlQCUdr zgBZR+kzl_N$%hXwEiV@u5B_nezJ6;yW_SW!M`SB;R_PI-J+?Fd%&aJ!5`J5^3`1ps z+ZG(4V^nE4#dmq5@d~VD%)OcuT&T)fnX>h|YUnG$q5`i6*YQriZlmtOV=om~B38JM z@)$<(J^|Q2G>O_Ci`JF`MyIGI*(7Y9kb;TNsDpg} zh+;bi)E^uM@ze(sm_A;dG?v5b@2HPnqaR#{U=H9gLSQ_^_%XkanXC6EVj_oF zlhmKSuz;Jw`~;W7cAtgtx#ikEL)je*A|q3f=-MyW`+Jw$2MAptFaRfZ3vbOagIW0I z=}Ob&CF(0?zzW_&vmV#av=OLJXotD-GuRDBaDfY4o50nft9c++PJYdY;IEWpbwyj@ z#YNTFPa(G;n6U5fn=m6(_fc2Qj1+PYNM5i>{5E6))Cj5Fn}ywpJCOrt@Ek}&tBO5c zkr*y2a%>~Sj4D)RSzO;3ULYG)Zl_Aw;5Jh;b7rakV9)k%933;-e40}iTz32Z>Q7aX zahQrdEO6!6Rtj5@_7%XisahTUs{CeR1-)_A;00EJz}fo{GHrC>p&{w5FlrzfV0_R@ zSrLgF=+TJ;9Q+}#tslaM!{r{ z7q)8dEI8In)-%aRHl{H+x+^DL``Zq-s|O}g1k(6t#9Gu*`O?+~}K3j`%y7N)0NP1tZGSD)EhLT^lJ~)zq|?7$ z+|SfBLD-?xRk_b*@DtL%M5)+UuXB&VEV|68;RbB6B@;(dF>~>)D#GyOb|0FkHrFIv z1NcY&7lyX`hwg)*b~%I|^hR}}uX4)Qtb9r{u}?s#(cc%y$&uybke04w=89<4O#EP!HRExU%&igC2BO6ExjfR&DGL`c_mKL z3-}p95x>x~3m}mor;x{d)ScFc zNshniDbtFJ6w|aYmI4G5;>TFeu5_Xme!yF>B5jdyJ11$*eApL?><4sm#G{aI z&{=YIWDaM~cvyxG@c{M*-%cViHiFggw)_n(k)F?v-}T}?Mk_&4SPTAcn{tf zCx%OYE@iO)+hgdo)0Gb509PpUt*r zCU@|s$|58JQ+6?z7?MhrlHu3o-@_PEHt#2_o;`S%SDDjssHrFh2_}#JD3Y~((mOK5 zvR7q_CI%XdiXjzeV>s(U8?(JT9-Je@485Ijd@k5ZOjL=fDSmM~!Qr7mKEa__xboz) znGU@w=rdL>jd<;89EIL=4{?xtjvc=Q3Q4f|>>Br~XmCWAaC4UaRBorY z+}s^fm8GTLXu0YYs@vCGk2QAMuXeq z!FE@!zM@5%A8E;*vf(BfL`kS>28`7}m(p>GQ5cBlT`l_`qh%x24aK?=Z7IvC^|ApK zVo_--_Np6Zi7F3d>upl`slS<9Jnzg^Gs~_9f9p$HZ9^FPyXn?^QIuJp@%ZX+VHvvv z(a$qhz{Usf8%Ha-NR6kG*EqYzQJ^cDGt~s%o}o;%aXOZ6E(#3Mf-&Oq*4xjE!ofP8 zCxph<;m~?u@Y`jdRFH|#-_P0Uh`Pb?gKJ1By^#L543Vx#4A%WbeF$#$n(_>(c-9-G z9(Od(8eS6ORtUq@O4I9W_P~%>gH%E6?^_*XRi6)W05nynR zF6khP>F&ejEo35}iILQAEiS(LE{0E3&6V)!KE9O__Fl-VAZF_e7cp77E^Jo8K%aVP zG=d0NdXB$M|DielEd7k@`zvrp>r;s_3BmU)rdY{kr8r(UJl)PcWG{7#Qas8m&SjA8 z2YK|vH&)yKhR$)+W#WxVOY<9*OvO^{qvJt@x4ROv zokdOp3zJ_xjBz&U!C?|4Qi)grJbaE zbimfNftJ{b>$o=ZOl&O${w{se@&4m1NGU1~(QGbpmUtMSxb`jhl3@+8Uz^dy?Wd6M z^lHUZ?_V(Fr1su**?{cRa_zgPb3AtsvTa)13CpV%X*&z~Z?@|&c|x6-MBqLR3K7=~ z-lPz)EoVv9kEZ0*zTEt*Cx<>j&2b)i96dGh9B1WtX;5d&M$gytcVx3eobAp))3t27 z&BLtgOpY5_3*-sVbGw)=PXcCC}G;~ebZDHmk>w}u$)+m#1)INVjZyN%tbk-M95 zM)h{jp0wQPQ%Z@QjWZkX&3bzWzr0mdNQnSyo!lG^^nn%Kqo3vdCqi^K<{ps}S9J?E zsbHVBSmWz8&pO-*`u zRG)LdjaCT&H6>q#cD;<6G?zeL^Y*|%(ZwU67I%kyBfq+JA|9}w+QGtKG!xdWBBO2! z7AWefc3BdnEmKS*Ah*sH*?j=c?U3aU_RqSOvdrrdPC7EeCpg8hU8V}aN(i<7E5DqA zf3cx<0Y(GX77Pf|v&F!b_vk+9DAjz#X9e@lslm;qV?{R=7r@hU4?PhHq;FqMWd8A6 zb(==&B`8j-ZL{v!U>r$R`dx06U-Y~lxx$b7FvE?iV#?)_x#y1DL#vOwpx^5V*@nyb ztZv0w15|SSl#^lFAzHXvJHbEsvg7d=cm$;b;k=Hq;_^V_0bSCc7S`j%Ch4!Qce$ZSfT7Ii1Iq2DKC?b?J{ z*!fu{?h#pzow;ns{=ZKn?hjzS`;j)$G}z!3tg#Sea8OiC8$N{VGZtSw>vrbxP6lCPeFOZd?`)TKHQAMd zijzGvdUmeFi`;)zr6+{3hX0T_|MA(4^Q0IPkfd?QdQec`=&~xy@4oF!#M#(0KlP`x z-UE`2KEN)TMNIke`HD7L@R;q#f z+f#y6Z0Q@H&8bnD=j~69DLRRaH4QA0Y9Igv3Xmf#@nQ=M9B5ts2I*ZMn^tJOm)F#R z8mPi>b$`?m(L4R|@7B4iDyr~qD|SVMrLt@_0^bJdNnmdmuWiWv_ww1HVpzFftF;&J|2i7w4v`b(3E|$LBm7H{FR^@uj*$THP-*viIh>9keV)Fe<6SL`2 z9V%=JFB<6fcr;eD@8eQL@XKj2?->{hI0-Lt=Edd-X2=Ng)Kju_r&mZdMG4H1{5yXl z6HLY&f)jtqKI3`Tr5Ii=%F^lvG2vQ!w-3u+JN{?kfi}p28UeYf>Ve!}Q^;3Zs_GMI zgn~$0o>HxXUzuZmhUai!_Q5UqdyY+-7?}*1yviQm&XVo2=A9X`H0Mb?gFA^h!fpx$ zkbV*4@Smb>mvO9CIA3|C_cd5_SopIXF2Fs3$w}T!?WHv3)?l2f=3(T_OYrB5ApwiS7rpb4Z*nhNcnys&nWPbKoF?o3 z6-5#SgE0$Jp@Kjn2gNiJX_c6b>EwaT#vdw~CDFBs3EH!FA@0-Mx^99|6`5 zR&a2o-Rz&To1UGf30+%U8xh{WT6TiON7ND??31jZH7EZAlN*h*R}lC}_Fe})GuSIT z$9U>Q@}uRMd3I>*G+z>Nr2YfUE||hKN_J^G zBy)6ocqIXR+$P=L_1{s=?(kzbOB-dm>*t~2&~HMC@_TNTFXt|qmGlN0cgly%IedAu zc6Zsh*U~nW^{_~$zGh!yYW?dYmo5P#>NlsJMjt%nTmd~frJ4TDUPAHgNJ$J05Q+jf z7$nuq6qoU=Ge8~lrC0{2oZ@!=`Lc&{78Y;-`L#s;+xd*Lh0v+_`jGTB4mzUIn8uE8bD!yj$Gl7Ib}O|IObyGgd3tb~mT8V&RKwr9X%GsuWF zKJH_PjR&FEgm=%0WN?W?=6EjKzr*D4A(P6h)gXQ)rcs!GjIh3I6e&(v*P4&ehtk?Z zeS)e>QG^W9gPv!!62-tEKeOLsY97V#*{U%$?%0q7f6rQ`HdzuE&D|=LhcfoPD|&#u zXvhg+ZrD?$KGD5It+AThnh?L?svktZbD;U6#our+;20{(7g4iG6KPK6eXl3)Y{mGC zv19{HqHI5Q^Vj9#K%X3N&qJy61tFw=ZINtWh~76}IJ~|*QM8XaAvCpJrX}!Cvnu`k zApMPbD2PX`PwqyNcO~;-X}9*rlGt=cH(0HNwf~`8A%%GNxmdiAm{u zAEei+!A0Q%BW%)~4o8q1Y00}I^O53aNbPf@vFoZ{iT`*?**wXtam*#6k+v*lP)W!=F;t=BzLe~_f4~g#T3%zm*ey4@6mk+X2 z@htW|9VI)h^g<_b-fZ`Ag0!xlLY`Z*T$C1O7r=q`KCkiV z-M_P=cQcBd9lDAaqYe9Q?nR=fQgcoAC5I@`iddNM3OHA#4G-dJ^xvl7p7pGr6B zym#*&P?lWLIi!Snhp4%c)8&r~5ma^uxlHL;kk66NE~GSSvU(2jUK_C}1~=p;EZ^}G z3iSL~>m4bX>E{(F{}fD~mESEUwl|>Sy%ZKY=V7B*`eud5cJzc>oAy_y?+8=)&jJXS zf9&9AsKe{Q8+|aZ`#a`O$!aIjsl$sK#jCq6;(M-NWdDS>^HlPu$1h0i%pF(IJ&XCi z$dF&p2<|z;(5a=CgVbr%r1Qu*Wf_1sEB__M2v1^SXM00@7mnc5z?-Sgx69xa?kYj>BQ3X zl8M;AL*Ea2z^vHS(0%jbHsPFAbt@*)>D^-1h4B;0SfoyE&)vq2klZU>pX^CD4BOrj zDAjbl)88Me98*tMulc$%MVILE=U+$tCl}QcJo0DL#x2;Oy@eVRJQAZ(rAqBV4QW!TJQ= zLADI6VIJ?faifXWcYWc91@^!mWL?@<-w|nGGAB4%#=J*Y&dI zBuMWUcTcg--}L}wFS;YR^9#<$&B#jiAosk=5&w_Jjq5W)|g7Dx*_YpLOtB3~;iz682~@HLB%x)-vtSy|Aa z;FI)D2QpcFlEY$RqmjV12F+Z5r7fQ^++rCv*nYI$43enx5Kk zOMp$>ZDUVPxh+vzx-bobB^)xSfgPOaTT{0U>;OlsXClt&t<*y&s;S}7l-BYN-YiiW zCmlBZC{{#c_=mYa*nMapbJyhv*Po(s7NyLsWnexg0pDTuFSAqdmR~~O*1ofq0wI1i z+O0}_1fbxl8LjMNrzFj-IKpv|rx5oM61WQ25**^bZU%b@AIIrb3r9172?>C1yqm6@ zEK-<62=n+a*M7StBY{$17bE~S#i?tg*%tt**50ML(t3KExN}@-lm z{J@K;ne*SA71U0ELwxZ;iiMS9HCwI^OkRdw-hM`Xvvtjh1A{NGD9Jqh+PT_j2A~l^ zeyUPQFSnTeb3u|F5$XId_$wpMl8G+=M7fYIFR8yL++@HfFJ++6$6rB%{-pMy{21)H zYhNy6QCF6ax}Ck|a##JfR`mahDi3AEr61i6Y3b!O9}l{;Wa)Zcp?&ADrWl|G-vu}p z;9QqS1_yj^fAvZ_55T_(SS1Z*#p6=HQ`W9s8f%dw|yHN*bya^3Zz=!%z zTR8)yOw!*$kyFmd1M9e_=;?E?k^qYSlExj|?gd1Lty-yDw(HL>lVnD`!Jt}XZeRIK zh_rM`JxaB78|W`*uQ<8M^{_#(qJXAiwsz)n(nj!@Or1pVB3lgGn~zNYD}cB=Ul)bo zkB<2u{;9XEm{JP$2_BqCi}})U#aXYP@{-T_>j{$H3Pr1KnA^`9O^Unbu`JgmNm*ER zOt;C(`%wwVlX`jrX6{j)tV%Za{kb)FfeT!f`QvT9h{rNhO#eCc^hzG0mZB$rPj7#^ zXpasU;DHbGVU#XrIQag8L?79_udBAw3xf^~x~RF9RuIFIYJG^RD<50quHH9Z~p_Y)qJLhuE3YE`xJX4tFDG&GmrD58r+OxbTu>1x)w(bbzxn(uLGf8|fVpLYSdxrW9s_#RpGX=B*LWmr=HJmiGrK{5lSV95KAg;x63+ zMh9qswSRqj<8p1zIA5yuD(xGcH}`{ynLn1>K{QJ8Nu2EBHYXPakJ;o!0`8Q}6idXS z<)_tLD7!Y9ppDwUX*3tpP#JO5QA5U%B|aIO8vZ|!NN|&MFY!BxYJdr$K9b&pTfZDD zO+O>&e8vLyH{+-G8~dT+uarLQ11A!R9m|4E$~$o?aKY%H9MomVu=;VpIRu~|fDK4x z2P6U1omPm6+sF2o{(mI|LG0nEcK}eZeGhrK@Fm-emws|H;2h#_7YCAu{zWbx!`P(+ zEaOfe5RsEF_~UX;{cj8#cmEm8-Ex)3dFU!B$dOdUf>XdyX&xaT7YgZF^~_rnpz5so z|36toy&SyDyn!F&xk2lIzaJ_2%y9?%AEx6_cBq6ZN8+za1l>FNEhfP>kF7vN#7yMY z=-5M_*Z)DsD-?ncUq0*o{V-+sT);dAN zukO65&4f?k8*}pG%g~oV!q8IbajeG|q&Fjw-em;Mp$`bF*R`f-*xYx{!h|wUw9(V% z86nV9CEL#S((Xm49$u@A`B`+}-&_oSP${r1nkJEECWtfeq z`-@LzwhWD!c{ZfPXBb_UQLJ8)Q`Y8W+=xt8k`pB+!QR8gM@jJOJ4g=+SdK1~_8HM=Gv9tHJqU!pkO=)Y>lT3} zJAM>zIP(6tHMn~X!YJnSCCN%fEqtS)u9J5$ZMin5CnHy$#2I!RhR z9L`?yx__?+oPQ*}y`yU%F|GRvNq0Nq1_o5SP=7;}gpTZ*F8~r+YSWv)fXTSt*Z1-> zU{SAip5m+RMl;wa*Ub0?He|MFRypMBcVRMc#}HhqXQ=f=hOeIReLMAa^7=uwff1Yw zIn;*ONMR*aR!}bqo{FJ*3*R%dHL&9$`>10HA9=Oa?10is$0ocM-4&TMA)F5L@$i2M z`4dsoRl~O@O|$9_&6l@0PRjZm=T=p7Z5EM>xcfZn2l`Q7RT$Ujxv=BKl+TKwJqOMQ zKo9hQc8)%{f!A-M^OUD(v}r1PQ2yF6ESx)Nj78U`SV>nG-Ttl&q&sPmr~F1fMsF`%{AOCN_w3i15y zb>I%2$2D$PF;s!$I6vIz24O*LFyI%}w?d^$a!12u-NIH{-c+cY1IVX~WO|yL{^G6& zo8LI?dHq#59fura;%dE09k@0DYuUgOmpf4X3^~Ha_uQ z@ZkY1Gip6qaB;`Ru$OOql|~BDBp)>KV*HA~p$Xhk6EL3N#+=+O&lj`&|8z0GS9r1R zeqLdDq$1zjwJN<*Gj{*jf&G|M;J6Th>w*+kZ~I#WJ(GI$LBdA$ouk z0F;7i9g>chmJD25mg1JtG4Fom!NC&Pbi&o7}O*{kz`53E(y`DK4sk}$X@N`o?Q}j{gsNWG^uYK zjYFevpCD%Q#xeXln&9AyJ8D?P@<-=k4Et1=ykKTIkBNjP{CQOS6$p8;-J$vfF=eKr zT#{)WCaUxlW_w|)*qJ#(^(Nvxq|m1p|4n)__b3*a^uVJk}oE4dG@tlX5jT5=^WRxT3;~n7^WxXkJxr7@zN)vb$tw~reyDLMLOe}Qv3#_ zN6YVp2?Z{#%8guEn+oq*mn+|>6zVMx)cx1Lzw;%ypIT1tvwEj;JoN9CGzKDXE$0kIGo zhwC}xQ7(KCEgX3@*Dz`)%wWs0G6z>H)~l`EOoF{f?SUw#yzjcSUxs_U^P%(VuW&$+ z)Yhgm&+PsXqTuOo{L9n9>wcniircTgjdAAK6=V~6V;OW2W8jU^M9Gd$kh93gX#JDY zSwhun;k1u7uZp*3N$r*x`#iHn_%}PtLWMZ|_>#SUUC&d{(o{k8c5`T9VBd9A$y_ zkxQq+4%ZiWyhWo!fC#}^>tyzDxlRb|7>)j;pp|(db=>o{^LwIs8--HzwmR0lc->^5 z&*Cr|QL^s*BbVCWs$k0zcsYmcfoHO!o0Ct%JE!nJ5XzW6+1QKIvR7Mi7og~{4_hC< z1U%C$fmp4iN6}=@28jrsljd)mPHb*2sa{t7;|S1Gd1bNqgp$|7EN^P;KRSWy8o)s_ z)R#}uIomZwVSn)w3?4Bl+pjV>Eoa)a_XzBn^q)WLuT0XOAj3wk<0@AcK2n~9LDzlo zncwHa2N8xNYy006`c0Da6}lxZzItZI^)i-qNIufDmaQt6a}UG1Iv?RHtbV|YraFbf zGZ4J5$Clm7Ekibh4uD6Oy{NahioRelDKO+mwcHBvAL|-AumKpXyi7H_V$!0C`{5bz zSj!=B(nE{5TA&H-TT(9Xlhc`X?&)`{M$W6`2PZkx$sXqS{wE8d`vxYoL?hrnHT(N} zA$-6r^uTG3d@V7}x7yPORn#jTz)#FKc#-@T0=3;-z>iftZDY{|cXmC);)9&nDo-zpeLRUxJc&=0ue9VCE%Y-YogH5!|#s@*ne=IL1 zrX|^vEDd|k@Zb5^VMph*m;~-lfJ_@l>6l9-=_u;>-Us9EgSL#0nOt5PXcZZR&F8KA0_8t$e;K?EX0Q&IoK)xwkh?;L8i-9-ci!05uKg=oTfcbWM@mc ziXSk8<${=X5A1O+_p@^->$~4?ZMwt7Pck(rdUh z&2_EyxBXhlih>h^&$U*lys03lLDsfa-{z+qTW58>Hq)#cPdFtDTl&DlEg|OVUt6W zb1D^CMIq&Uwgcr*PRk*O#G;&1CMAd1LeA%$kHee~?ZDW1zxDdOzn9-0|LtN=+n#$o zpO44we!E@oi)!MLwvQu=7nn!1qKOW(@S}>X&V+wozo65vsrw5FzsDufZpY+ZohuJ;r+%3h3f26 z+-{7S7BwHKNIH7h(b~cc9rZ5nVm(HBo1B&TfBH+H8IQseWahm@d~h7itJX7n4_ODF zI5k=Neii<*2~REp^r^oIYm?ciaJ{9u75K0`Fh&6QO*x~n`ESLGT=6FRS?}Qcv$;=9 z#jy$k$SKf2&&D2(Lszpcj_0^A{==(~>c{Z_Epz5QA|KowH_$84eQ(z+5B&=zTAM`) z|KXWYtf`O`!O;8>P&4i$Ya6 z@*o~W#4K(%ThfLUQbS=gdHvT@lXJjy`Dcy{Q&~^Ik#R#7Vhx$f5Zh(i2|%GG$VSns zeWU_N$ZLgq+dFBtHnuC#U~q098Cvl{r1TA@!;$xPG*TElqdcFy@gvr89mv-)7Ht#t zPpdIAKxKxH%J47+@82@i13Ti5@gtZ94iqTy%F5wDY`plvzL zoq#F8nXQl#TV0i@J`AZNG+_jwj}-~q4}OmF;^uGjlOq|7Smt|6fUvkR;b^r~ShuYL zGeY=@Psq<7z*w^1wgXQvy3CB0uEI|Rzdx27JTrDfSI(S)!i5aK0feG1^N?xR=^5gh4)R`Yy)oG?ia7R1v~it*YExSQu9PGXlK*(+wA=+B2>G1>=|xQ*NYFrHfu3(6v(r>K*N|jA*tP|}H_zONTZk9p zFGW`=!hQ+?)Ohkpo?dj^TFDS@;5)<)Xyk@4zViU%0;95 zD&g~l{a6t8YeOGB+m(5ULh*b`v*eg^e{(iMZw&3I{q!?7Fy<9?6%Pq{-^1m55Ax>q zzbX0M%*fWGD6>XBzKfU{Nj%#773%Er$NB8rA}dK@y&moA;*ZvQuEy{%VE=CdACQHZvVxJYnY!+utfYURNPaT^h{Za`knUD z5S_{2Ti`Dd5Vwm}^Mf#D;Bi8T-}rahcve9N(h3oK_{2%(5~olMthwn9>%Q&eHEbgHiBtf@v$fv2%Z-@g0qsKZHt#ejf6!cAWT zt{j{B{Yu{OP7^F>Iml$H0}Vt2u_7#;+@Zj*4*hMJdK1dgXHBBy7t8X_zL)c6pE-zx z+|S-xU{hYi88AqDzt&?DxC8gh#Q>~^Va=ul&gFH9e;b~Z-vDrM7$0DPmp0ie{)t?r zFC%;7mrojUp0GMeBH;}9qw&H%!LN^I+EUd^A$62|wlXUL4dgjDl(w503H`L?d1ZFL z{_VmJRfAQG!iI6Ev`bqD*^b>sd;$ChD|NR{MJ4hCjM^8tPw%6Pe<*K`j$?*M9RXLH zX@f8x$NLfSSrdCJL6k?cy746}HSYuR5lt`wJEs?sV8uOw^zgj%3blqb1MZ{!qTag) zC-5#3^yUCG!!HeQ+f(?F-G9M(8&c1S`=R;@FkuzQq3&Un74>^SCw3wRNoq{oaYh=P z0*FytC&uo_3&E$Rr|thsPKcL#FnN7&^%);+7jlw!CxHkKZ~Bv|i-TmIo8cnAAp7uA zoVYp18V68a&4nEAuU(7nN&A)*hHSC@@@g{!{B z&QeM0W{I?WGo9`<=t=m(2Oj(601=YYjvQjyIsNoDaGzqyzyql<)WO9RU=H#1oB_IL zg}*iP>7}Iwt>~OI`o`8EnRiZHZ*x)Pj!$I$h1U6K{khGuc3k?ZsQOlb#5_#bz&RvoQ}ih+5%cB&Pz-tqB! zlRA$G3*?*;{Tt{rU)7Q2qcn3fOv?5~OmFCehmy^%n@r0_SZMdLLdDJeD`&;nuZQ-S zC{LY1>{xD;+3@CY+PCxUpW`_X&=cJwk8U40q4S@48B=M(bx zY*Q(&spyE(9!MIq)p$V&6BRfw=ySpSoPdZ5@%}`=+Cl&<+QuHi?zmW0p9`zfGheu z3Q-8$#{sJq7W-P5B*m&VR^P#pxch{GP28>f>Bpd_QTvfA%r>2R^vp@hqz(KRT^PE| zJq|KJG4@hlb?uVTXHYsj^31Jyq*9vdDn$F`XPf{kEtWx=s&Hp7()7Tjuho!s%DStr&YoH3(ov~8>0d+%h~iT8ji$Pq}- zXYkW9+%YoDk>}>%C#E4k?#=!J$@u+&8%Y7QBpCL5f;SxGJeZ^2nWnwuNsZ{iP`Ak) z--$d^<|Q)P1F9<~9kDh8Z3tr5)dg>Z;6w8|MDLHG=;KV`D4`ByOpy;tIp-e8E+i zLon7qG^FIU;Lc6=?~*Y#@xr=(p{nq^1apEu>^U&R)gubn z`Powk?0(u|G#{nJ3#pyr7=8$5!PRuTh>mRF1>c@|6ik|m(!S%9SXNeX>5eG~8qZ3> z2;(K|1r26WVava?w?}<#pncVaGV$|+bY;4|+0{i=zWSZ75QQ0CIkIPiMQefsay|(tz1U`p1L3bg zVQiV_ZLqb|Va4%x6*1V*g&Cd`R>mkX1!xNipeLPT@q7oAbZI<_iEZYU>e7Ye9OpCQ=h|~~ZyliXB8xTWv`p*a zAP?LT*Iye!e1(R=( zyZu0SnCLrmr_UDDJ1m>q8*)XIX-d>}%**){mr7h5(p@6(MJUw%Z_0K`oRt**Xjoag z`9l6JAEP}fXKk(Vjn=^~cCDhsYRKNzzE|ADVPyIEys;c zEEf774iIir4yGCU!6ij`{S`O}X-kBuO&8tU;41q{T{jQcYj|mhVDojQYQbbXTmr7T zt3m#Ov3+zL=*aS4{BJKb)7S+y@+$GT3<&vs*Ut3iZtPM@?@9Z2Cxo2C8pU;4X9^`( zR|qMK3C(mkmWG`6wF>(t87FSl6l9`X8fxWPn34un*uqeB89$n3189MbcPQRVy zo|JtLi*;2!k}e*6-_xJ+uoSNb(DggSaf4IQe7STpP4}l7Z`^YA_kgk zOsrlZcBg&lNOr1a%7I3uSqjANJ$Z|BBg*63U#7^;S-$PZ$UJ0;Pgq*{;x=3;>qF*JH4B-uy6$XVqH6bVzY?}#T3&<53f(sjBu?c$c_G_Z0n?G& z)i}b={>CvKK#o^%%BsXTDmxD*M5T@d0(<1YtFHY&f=X!;Bm(_83%`#VXoGNW zpEoxP4=VsR{6?;-P*jYrU!XvE1P$|TWgqDpW!`Fo*I>k}-Qg<$58m-`&0seeKDnc% z69((v^%z81+CKcSJjIk+W-)aVkvys_v+sL#$%T)9Wv-Yr)pH)-*3@^2*}0#QQ9OoY zVOh?4=^euC?Q>1kj&OrsbMD1^=YaF7n9fsoy5_Q!+?X7vq&; z5b&5T_jw*ITy!Sd9q(5w!DuF&mjh^)gCsz3q<^aqDY`JUccz2$1Sn4TE`ZI3L`D&j z#?b-5gF89B+((85$gJfA((O~E_Q4%SN|G{{b8_AG$I}NFY160g=3Q67Z+w$)I)5av zW0!d$MVwqrqyWNz)IQl~Ztz`_oqVpG{yq`#uQvV`x*E@l)3pNWG6uJ8EEb#n^QFex zE~J&o3QUn)C@o1nUonNQV4azptA1^c__(b_`uL}tLHRU^bH|E6+;VCiLt9f4|g+&0 zy|$FNEg--Xq52bOI$u9OEY3Nl-Ldt0U;FLJ*DE@x9MwziQgr*A=en2EGt2@GEL!}x zsQK@@=7Hh^?He!VmEc#?vDnP*s?LM&9%7yDct1Q^7jNxuYV+u>TNk_@c3Qe+Xb^x=LjHj;-i~Y9(Oqj-MWWzPl41q@p9!@mb52p^mofH5Ch};H zU~8``FRFg6p0J;X5`e_#^3zsH&#flQS=7J8iN+i<5}%F9P>z(hB?-|a zhCWB@>VL^{=)D}H0et(lkJ@Uc3q`j>xK zOJR4?E%6TbSg_i_ZP!F+qwP za0d6n5TIuO6@NZ_j4^RgUMMY`Z`ZY;l%uk_!Ml@tU7K?!8Sq#m;bQN2vIEE5ui$5Q;18dY?KUuoN1jq@z8nNLVZrJn(e zD0jO4%uLZPn-#Pembdm68%JtM595Fj1x~pqv$>TB+>|aM?)i&Z#b6NP1~0+F-v;36 zitB?TweoSCOA|qw)XBKnxc9+`w{#al#OcnQGf#cC>JOhsV_xcRLZ_cvqR-3azpa;k zYhG^_xUbd-0$W>qg~#wgo*=H`&L!Wu($<5@6^=(l*~aw%kW4pbd4UXGEke_oW&$@R zh>!2-V+uTCKCGo1{I#`=dt!+*)o2~4slutGBb4o)+4 zpMt|g{+Wei*e~Bx)c$!GeRfU37k1(C0*u{8pSu^U`JJl|D{*1Bg-ImOmozs`^Omnw^m43JR8JJt-F`Ksj42H*H~{k#x1ByMezRuFZKWNT>FL5@ralI2AqcA zXQgwZq)W-GFnv?q)jy)APc?t-255=ORTAzxbYxzB^$3G!oLxv zoO?{~`s04?I0T$~0+~Fc$Sy6(PC6(Ierjvqu6i)G>hCH!|E8rZPWat>-C6jhUDDVR zRBNUj_*S3e@P_!#W-(%(guQf0Z{!Y%s=&HIPunJV;wr_Bc*Ya<*?&?6UI^xP9Qg6X zh5tAQ2IzKo5VY!Rvv3|CYMDWjQ*CS3Pdd9ONkE+g}q^g8+N-Q~XAvS|^^~!3S zR&`a@`X?z{d*(v(6yEQi!Y;6Hht60~)A#D|bkB)p(9PSeG0dC}Gurq0LgckyZ>r7X zw;l7O>+gG;teCd~{h96SkPD0JYd{Fh#$dtW7A|f-(3mq1{f#q%nBn@r@heg5@%Yuw zZ&C%g*c+KmPT!f-KIRIs$7^)>L*OCw_yhccp#GYZ9?yJ?{;e{1rEd@F61)PhOVby! z3H-(wyf6g>2y#O40Q?Ds=|_pXL5rIqhEIlHn@|Z`%`vKmC*DWy7R@zM_wu~$i2YqK zYl0l?93})idI3w8$-R?^{wQ#@)gfAU?-`nexL>lWO*w9&bG+P=l;UgrtMPv=eoUAE zh3d%0xg;2`EhB;d zYC|9G#j6ist_%uu6av(R&^dyC%#i~1DBCPwZ=#^?6G-va13jo4W(s^tq*|4F1cz6d zdiTAJK6}v6hG!4{R^I{KvzkEt8IHYGLdv4<;earJU!E7AwAx=4-|m|T%BU_ivGpy6 z0O;PSyb`ZihxBk}_zR>KXhd2ZlzQyMjgzC;xkqFQJc2q3Aec*h_&vG@^?~p&HJX1( zAE&5j2JS!U1e#A?$>c$SHcg}`jjjK4uR}sxM9=Ro|MoTUq<(iVQN?3F&`fk4V|i@_ z2-~~of{cp|tit>V_PhnfZ0vVuKgC}<`a>Bir*2Wcv|$ZB$w{ z%<)65q>Sf5P_>vaD9lzyE}}*2{$#NuRw1 zt2`lCy5kM+dh|Qa$R7F5_Thi^4Zp=FFxd<_9`)nb%D$^Vp9HqQP;Hl7(_9sTut9nq zDCz3TrwMCOv$C)E{r|AC`^pkyh1gjR5Aa$fcC0jC!aC2@3)MRGJpQUx-80#wKc*Q6 z2eJ=E{r>nXy`^S>7hKj%nQ^OjH9lFyP%Emh@aLszJJPkEM~5l@RrO#u88Q;A&6Og} zD|sD+j`H(>-(KWkkaOK@TV7w&!P45!om0W-&FpmBVDZ%!hj0VGo5YK$8?^i|RiJ#B zLVM_R8Q2Nl3k}V#GZUq;{0Bk~QgcuZCTw0K*h)q}0a!IBKWIq+us9<+o1YuAtx3Xt zY2~$A#Ab(&m+mG*a(|1F*Nr6eJUgr<{w`zGiG;$0lHtB|JODIb?fE{@b}v6?_N(O0 zV|n`TjjA*&(?rw57B8JJUo`E|% zD;k~4y4S(u?0)JdcX{{El4x-Z)kzWwy@`Gs!)nF9=g3c>#y8>UW(5Z67t(`CA`m;7oUT3`P$3$hFS*l>E)IRs))8@}{%?pM zyqCBRz}>(|+KOF21hW5|sl7Ph(zInlwuzYCX5Gl`7lAvYF9Rpnz8QcvC&3(F5e9*2 z0tE3qGr-@#O2{BPprC$mF_uJvw);3DL>MdUXwvj#Kmn+E6p26AXR6B#fa&Bs_OeOYBzee+z*LAAP+>PIq%w%mprxgN0UGsoZjt=1Mkf7hJ%yL2-hc&E}w<)_R4MQJ$I~wjlVcTvOh9k&XG#d2{ zX?Sz;{9D1@-*frlzW!DZQ#rU5%PQb;=R?|3o%hHd zi{%}jF5<&^gSp-p)~fob)9E*<4TTQt!jz(C_tNVJP6B7>`x&%zv34WD(uJzGreZPqa*?`q>@)`KAK9Sw z_$kI`p9f|m1iRYB`82u|V+uc6;v7n3QRc@rErHu!E6y6yCDtkv>T@bF9M za+W#E7Id{>`ytt6N<6+rK_>mS?<)-;Y$EW2zmi(ZbAa|Dp;4vI=QFuoO$t5-i_Rh* zt~9u0xeYzABmV~d>M2b9q+ZMrPG(y(Fif0hF8Ud_J1i?duhmA0X|cE=X}ma%OMw>jENX7%SFV{I-(s85^Jy>ADG zqHT_Gs8HIYHEj^0RI>}j+Ho2NaO2R0`0_GSPU?Koq99tV&F12-#(#W_OYa8n*Wbok zC1}pxIo!ItB%hr7)-IfMbDP&_G2f+RzaDo6$j)ad=ANcEwn2&z)DWbTtp^9nS;F74 z#lp=AyG1~*$m6M{Xn45`aEzgN~20B^Eh>*zg2|9m3k_4RQ<`ff^J zCGBS{q2Wx`syk5-gP6Oxdgv5M=;Ys*PS^Ai194BfCVdUxck4e_nTsuEks^<`yzq5E zNA9WxhuZX8&A9%30}6k|hy^jUz)85^vUMR0<0h;|3X4x&H0jQL(9CAt zagKbU2Kfuw&F;I7-_gdu|JItIid|&#e!ASgnV?^H>?5Z8Bi@`;syKY`;G2TTNF}9* zE%EoBjvYA?!A9**4E-If}ve{Nv!%@}J! zbkZzv7T#K0{!2!WZsv;FdLrL#9{}xVW{onM z*}jKEBb+`fe0KDPykAhTX*J!Ej4@gwe(k%jfAc#cA73t-k6!{Zf~G6Hr#N0dao!BZ zxIwe8hVt4In}MJCK3n3B%!19HXt>`pz}*gp@Vqn9lZY6NdV^XYfbf-FQ8`aH-wK51 zAUR}CR~b_DX!&Y^H-%B97rXxQ4_%t^jA;T{cJO#W*m5Mq{9S^8Kd4_D^N(1ZBvK`N zGifXB+Z@B2oI2c}v(v(Bv~Hi8qJ+9R&dG4-u6>Sq&6*}SM>iN*N-sHPi`g~Nb$KZB z5Cf~J2E7YgJ+Vdj@Q}Wrk9_lu$y@&O$9Bgla?&ARk%|FMA^^wDC;G;?XV8`EO#pkq zw*gbWX3OsIUSfjo#`fVSQS((m1grLFdjw~E*;+R#LM%cVry9LW3(W|<_cDhL7!9=7 zwE{Mv?kF!lb-w7;v77BiBGij!v1S(;DQCjg+xqY~!X2!`*>v(;TU>9f+h`vE!b|jC z&65r<_TBn$K&HR*jfP+_R_pD9?iS8*GOUDuV7Yw?jgFsZ-w8ygg(E)%X^87GB3_KB zt`%X-=NOUQ|B?P+%GgZk4j?&{X%KU zZp4-yv+RDsW@QQDyp>cJ%!;PBV6-5Jf~~P+fDXO^h%vKgR6+d%1~buNY|}0Z-PO(X z<{|PC8wd>f?dhWbx2MCMSIhH@ed%%QW?8P=oy*X4_Bxf=mYEC!EF|1jAX<7Ts;Zio zx3_27`{@M9_UNLzJ0q{qk*erNYoim_9{M-ayO}=OeaNh=^vXNUSC&3w*;YxXZ@#Fh zHspTH1|xZ`i=Sc#aD9zMUINaFM%b@Hl$gp_bxNO&z~wdkGgBW=QEiHjYn{7}KttN5 zc35_`!Q839i7-COaHii_d}%_CG6?P zu}?YHgw|b$x88j}E~gc}&6y7lPRic+dVV9}=_l)3C!cyd&=DHMFTEf-$88Ok_%*{;MZBe?PN($j@vn}@b(pN0HnUYrXs`S-sIZKmIT{ZO>ZVq)9=0pm+ zh4BcHjNIL{`If;W-F;dmPz~IBgthxL2hMoTyX^=SK3+&@b=R*#2VhVm-_DlH+va13 zi1#*y73zKfj{SfRp>r%FjjMAfEFsCcXBEyQ68A!P1_JX^0BdTIE1BLGN*MtGydE?> zdP%fokF_9+yibDCxHf8(Y`@jigk?JEU5o91Ho&%4;afa2J+ZyBv`xoi!Y(We8#{ z(;_gT_!|t}vYXJd{KWA4Q~|{cJ44-RoQ!hQpItVi)Xx&#S<{wnmY3OYZKgvJ;YiCs zx>OADT$oe}5pbAPTn@~fqYe5I?)l(Y^`xz)$*ApMBfRd%996K~@{4zP&^%*I26+dz zf`!%k7k%G&(-fACUTzO$I~?BK`i7fFL>DaQegW*UO(R7pm<$+7h#_PB<`k; zLF#Nt<lc#M&&M5P)kWV(X zD22ydChC<$ZSAs-T;QI5b6U3Y_04iS`%jD>5Jbe}1p%CaUBeRx4 zW-eBV;9S0k#P#}Hafv}(frZ^S^?c(2%i@ohGbVE`-LDFxegpJGLr+@59{2l}T`IC3 zlsf6Y{>+L!;gqeHAeDt*>efngx7JO_)J)O(4)&|op{)OTtorep+ou;Q6#_0bJmV90 zS!t^Uh0nPoy2NYVnoa!X8;v$AtZ-j`c2?4 z?#t2TEcv%O=fC`T7H=?`vj@rc1m|w&R_lJY1C8ou4=)uY?yXwSTI+9oi{zZMbUdS*hTsmv&M&HN_0|mS;|G3K!uq4!Rw&@Uf2wlUj~Eyq9tcciGWx zHh+7jN_5FsrIr)k3Alg2>BK0Z-~5^X-F6v5QZ};t2>Y5M@4(?98xK40*V`dz@K4)& zFxvIkTH+t0a`h=0?PDTP5dtdq8~jWh+^+1dSi0jL;j%9X#5=I{w#m}rq&}<82ffs$ zcOO^@db)c9l6n1;-+4V)o?6cez_TvtU9Il96=dxte?BW9;M{W2Wq@2?!r8}DtZWQ} zpxJz?z7H4JMIc%I%=ps%V+F{;IDbt|Y_3g^dT3z#nqEr3s%0VDiw>7**4OcRaCG>K z&yP~4zR!1l-rBx+49=P!LMt==Y>V~B-s{J8hs>p_JQkR!)1DX;Bm_=|Qy2FrF~cZ{ zcrj|pB5~in>L*h}-;KCiZMP=0v{Gzx&pWiHEcMaktMLcVT+?0vZ;mRB6-@_wc)it~ zy7jbUtqSSN>N!8i&2m3!&D;Z-^*?cUfZ{y*%w73=Ku~;e>);@EXQSU@4JRJ#v8_w^ z$PMwv=8gd-PW7(S@7ED7-hLit=GPUp+_qDpr*TwUM^EhN+fQ%Qb5^sY9rBBzXT@)o z-}}%ayc**1r~5+ev>U?VagW5wk=Xt%n;xeE*5g=0#9S)Q%{z%pZ!?NZC;Hb&QJ_Cv*gz=|JFJ~-gxzRza<;@v1(LZ*gxH*+}~XHE&3Y}wA= zY2FDD4E=ffsd%&J=#sJR;UwE?@u$$XTVGTRmuJlJNvLST=6BEGl2@L#$6~7zbP{Ld zRMc-}0naVBxr*HrKDLx$D>3H%W%Amc@0+ezy4F4)v0R-}pV0#7YD?(44*wYU(YYOIBcu7L7pj(R%2ATib+$0UkzRPemOoi>H+<&qh~gc zij4Q^Yx^A8X?uHf$+j3GgWfD+kGqdftAzdB{GppPu$;bn-?(r_ZQ_=TSM6t{DxYCM z#g&`Q;k`h+j0c9x46VP##GZ{9nZr1 z#gbYVg?81gX2&sVldluM%O2^>Y~#49wNh@Z_#7H}`()|LS;|+rR$Tjog~9E>V;?~J zjhe6LvLX&WiHn!;tYcIk7AS z4U_md7_MV%sJ?XF_OZ>p+H?#14F2+63g)yfP*?hot= z>a*@^80giwYk~CZ_IoknTH?`}94v#NbhJ#n?D{~#Nu*eBbbwz+y>q?J+iBVCf$)%f7`ck!CJzX1_`Lm#dmN|dPoW=qg!zRyWZF)<1+aCh5IV(_(YYznzN3`xtmNjN zQn*~lgk}(&`FZaRpx@|v@xpqWAU*JKgl<99yLWQrv=q=`ZT|3LH(FRIBVABj>;UUo zA2{j-_ZvB<2yv%b3*EvNTOUdjT!*#Kxhy;JIqg$YI!nsi(oAFBD!=1e9_m&h8@fQ2 zIwd%4r{0GO6P|tP^ZGADZio0#93KF5*bCiw)rDIh%_+u5OvB71jO|R4Zg$E|eTf^# z1?>LLOx;EdsbmpXcV{H*tjDzqdtON2lTVV^YG9E)wm75E+44=?rHe2)qtU#RpLF{M znR6+k=&Vfn-EUHy8%_b%N8|ycd4W=q*Qh5*MeYiMq*CpPhy3n3F-f-5SO`b-JcR)8 zos3Z&17WwDqDalV8++IX4Wu-IDZkf1?b+JH&r=s?S*GAZz7bh>7ly}$ z)><}2txdntpjbXsW=?GqYgp6HYR%Wbr}5X3PoMX?q&S(Pua`?&3ZlH@XbL$O27rA)Nq-rd%)G*yjRji2T(td{Cs*Qc*K!eR9Lc$ z?!K(~Zmjt=mIaQzKj&P>yYJlNYFiJO`??M4MiE7Anm;SYPJ|K5`nt=|$w^c0cnKNP zu-V}`E%y-Hvq@%3O(v1;k|oQhg%1?_mFNqA0IOJOqoz{m0nlwqu`Hw4>+#-SkaCHk zpuXD7P7Q_c!0lhTOU{v>s$9IMkoQq&Qw2!`d%QtoROqVwq!%)AH8-s(^u_%YVHf!2 zNQdq9%-hLpwV2g$tfWul$s`>lt4e0)BRVp7v1rTvbmYn1hnnB|vN?ZTZFPE%`dbxA zJ)ixHd{iUk?NE%>+ah*F@~FImvb5f7#XD z+N!y-Q`miHT)o<{Cz^t0mNGm0I2V^IK5T8En9wj6qgz4;#cF5cO=n7T9l;99MmN0L zuH^`Z;7vvXeyHWbM9u<71N;j-;i##ykh3SVmsvQe?4)5}BZB=JuxnBp{hr~TkGpKX z3wVAL`5Ec?8TaUy9qch4A@FysTqGu@0bXSh;Z;WS{1Hl+MGgpVEZWBIOY zOaSexF7yii)>-ziyeZlDV>g=UG}cNrzj44?7+3z4-ov&WYw6?=hG!gQ17q6{t(bnB z_kL+m{E`7*o2r07-2D~vnNX4UzqMq}V3_7>`*)UUsHZM+A%hAY@6_xsL_l^^CS*1L}K_*_E# zu^hLTd`DrE(IG7N@YBsoApB*k&h0^*j`G*GS=2Fa_6E$bb4aMa!YubuIwuvqe+gGeau1ILY zYM!_{bOWkJ9&p=Qr&u4deR&UaB`-JII8& zJ=87tSd!t%Ctqc0RQfxNmP3^)ZZ2x)#d2s4x(LO4f0)&wVU8VgswXhi073+*5Ows5 zY3QAJ;-#>jT}TXEfwa20Rg&z50l>kiIzM(v-q7@)=9_?-q~v2500zKB_-y?VgnaDA zU#sOReYkt7gGrzvCa7@-Hs6|DfPeCxh6d=rXW{~xmeY_Uk7^z*7;}rpF>#5`6Rjm) zlg+`!8A)QJwA$JS7WQ!ImaX@XrUuDAZI&L=qPhr*0~8K*qoyzn+`q29VBRV*oDO|p zXrjj83~WUOyG(4Q=es1}F$W^_ zIiujADwx)J42^s`!=(XL`%uL^(4$iZCD(3U+}}kHo!9lZzEY9k=Zk(;K>Bt5j&r-Q$zBz$eEaqlf55Ms zoeHOP9oTc4I>$!^?3!3=Zr;kG5>&G*wc+;*$3KPlm|Cq*F)0B{#j-fFzf}CL;tD2r ziZJ$#;q>qazX>{rBlg{b2Vu(l*;{*&RylNkD1y?Be*wF*lT@5{j7I-35VI>tiuzF| zVd}e|PdPpNzT(f->^ALFj=M_2`^-iFTIAO$2^$t?9NSLcsV*1Jipo(tQaRu(;41*| zERonS)ltymzsWCQ5|bETO)#oQ46G!78(S_s1os}?dR_VBl~Kox$WF>)GdN?Znddit&e1t>9}noqjB zIVk(48|$FeQ4q0i@LUa)|A)Gk($^j#qc_4AV~t5Y!zjQx^~MR)gTAABbMKf6PksF& z$4LObyq22auF-SNWXoITA>H*I=gwQ}(_RTLhWL@iAUgrTk0D_85!Jl3~OPQ75f9I6f zbHfC9@443S3wxR~E0g^<*q0(=&xYBz36UoRiA9Mg)93EAxcC zCoqF=j%5%~ch=2Mt|w|!BMEV<)iQ}YGm1{wEadWTpyC@vBPpPWAUW=Vy&&Ex{ot(! zzuzw|5Pq>(HZ$=?#$tDd(f!F>kU?R~;;Ku){Oa-707bvbpq7{)SwV%bEjIll2X1N# zoyzSlJvD0fz?rK7B+?5;_j zuS^~YPI)x67U-39S~KVx>8rY1q<*O_epagO;<5rW_JE(@ca>)4NthN)i=!Z0OvXoki zb!rU06L2zM8)*VOq~CYJZStUB}l29nN=|b({FrCS8D(X54z`d9Iq!$bggs zZ7z}!0hAd^`|xU<$)XW%@hVQ_{`GO~N7(rn0#DD!1Su*`C8vCeS#%U2#hs}a zvJ6)X7xO?Kfm>v2L=n&t{PNK3o(2zp0;eZoH1fY;G;@?RqU9q`mvIqv5gh*#^@;Xc z5#o}%)*Ly0F952K;pdI0g3(B%j%K*LbdU%P)8{D1V!zS^1XV)mGgG@h_Fnj9qW0{6 zqeA6LB+i<$8>qFdA|g#VllpW*)VD8HBh`93-5Q>*!Tvxcxn9vuY3eDs{O%q*-7q+| zA>&?^#kpjifiF+LMU3Ak-8Byu7UCPgO`jL8m0LM4wzf3CrXvm0}ObRNSjieazQS3zxXdTUEEXd9z zMyTRSWbAIPQZtB?C;nJpp|=Re?CQH{WhmgN!>xDDOhK)7 zMDBE#=)UG&>d1dYC|WvmHc_o)Nj(}u9=ZB^fq$24Rd%w+_ccezIrBN^mN61zj1*#w zlgjzt$P2e>APnP=4RHla+-3?OCs?qv_cr%c?4Kn6bwuYlLg;+s?`K|)!i&Y1qTzto zu$xd5UkR@8*~C>Ec+Y`z83#QC`BeDal9(q_@}MOT>6d`U$eVHq+}1|IM&@U`UX4D( zsOH6hLu9UCg1zN=i37Tys-+&jtS9g2hX82#BX&NJxFxRCJ z8rGKjw{@&s$WFMK2&c=Q4{Hr9X^EAb8Y|V#PVGlTO9~YzUR9XD^KqZKyPOav%OaRt zww;&5Tk+rSnXiH@;#hwL2gmvbk>)SuZHLc|fcC!rdU^9wD%Vv;lz`+|bk1cKzezz^ zMQ>c|o&3tHUrCJkXo1^@95IhI_~aOtj72^LgJgrE?svx#C)f4|*AjO0_*`S52~F=J zQUkp0CCb^r9n3RT_7LFmb*XoCjVuGNSlPXHBdJH!PZ%<}zLBvSq@kjp+xb8Fn-p&c zyf`j;H0tbA2wN^wNZoIPg8Z^J+%q2c|MB#m@oawoA8=ytC|cBr)@*HBqeiHrYPF@M zH4;Tt?X5%-6ji(S)@rFz)ZVkTXVu8<^o)u z^!Hj$BWbCGIuA~NzNGB&vx`U2Yk;(@5&R`@7(-7cu@L!=z6Suw7o~Pa`BN@C3Nopv zyD>1XKJhfpd_V@9W*y@yx>=hm0u)khoWBefx6fOkmk;?)+2N|%-o-5?_Vc&sp0uA-Eo9FEylZl)DJqe!D3^_M zEt>Bpw`BNgy$)Q7!Rx?@-YwYY zelVO$n~943$96t+IQ~g&WYL(etQ2QR&?o#4(BpthBFnXSkdvAEEY$3(>8n5HMG*#Aqu`|%N%^v5TN%?}UdNDHf+N?0P`z{&LC!y5( zz8=?}Zfrtw(ftr(_)+jg9Y>t5?_sIl)L3K9Xcs7R4#YiWjL z29)3zdmS9Fg==g+fnkNbZg%TB4iuZntgBSbXs)of^$@9cx(|wbInn_WpQwvfomtbh zTd78pz=})3F&R@{b!exKvc&crd_nnZ5BPJy2;l*o_cNJ3`o=``y26d4%NgjtfCU*n zK>Fy(#8k9e^F}o%$V1Gb`|~dq-rm%X7e1s0EPt0SCyqnr6_<36JL@W7r zIv_ihDTf@g3AsSF2Xs44b=wQ)G7jBB&L@lJyyHHQT0euVlm{r!t$nS zGIX!LAeCe=Wf2<}a;|)N+0|_{v2uw7fX2WWX-w@gw7YCFVlrZ=_Dh;Hb#=r&^}9iH zIcrz>h_L{;>Lxkg$YH2TbUjWQeQm88K;4lu2n-fj2n(B zWU~nOW+;Q)IHn5Ux5!;B#RW`m&+gcaZ3nB^&QP{IU2Xb`q+HOZ)qwou-;eTdb>=bU zi=4Czo+Nx`V7Yk}V%?;E;Xg9XD&-f@JsdZPK(G!tKuTjG<5$jD=Rr|7ISb}*-95gKw!~GE$oGh>+DE6fc)d|@IwCjY2QtY~mZZw|PyDgz zGQqHK=~WL=Zn3{+IL*XJU%rZhawRJpwb}%rQnqksj?yU(}U{ zD`VhQxt?C39u`!`dIXg-lAbx2OYHTmn+N)8G7!b}GpTW7Sn8`SM)p!npud9HJPrk0 z5Jg-r{zJG(Z}=7Lxu}wVB!q<16BV7inU<^l8TyJVWw~k16LxI{-A}*)(l&cur43sz zS}#&_yYcsIOj#kh-~K12QC;(!w;nW)^l?+&Yog-Gpe|A*;bgF&&Vz?OT<><;%Jii9qeG_QZ5qvh!ZV*g$)J(UOn%P3h(wPes;IqeHyj%AL z3{Uj8qYq@i-)3=M1f1RrajNTWWhs$iY~w<&=db;lcgj9Ze71itOIwdZC|mj=tbd1-J`nX^UbZ;jPUUUzkpQaiP~b_+1v53Z*LRE{Tj z2Uagi!lG{~ePr?+C`;@F^u&yh8_&6=uqwTmscl+l++!&>m%etxIlzqE+oww?MmL_a z{VfO3jUsQUz@aIVHj7pODj9jq3V6g`Xq0gO&H_MY+j|b7OE0Rllx*C!)GccfH`{jF z6N0J)l>Y*=*O}D$zUp#>T-(lh}`sqSXS92Q!~^&XU;d9*}Z#c&_XY3 z7?H-h6~V}>qkcMb$sG8Q>)YIkgxjT5U|Ogj=Eghs3oBe2U&P-blOb6j#!;i0$wv0w zD2b(=TM)qSi?t$*(qs8`T8Yz0#E^u9B)nWdY0<*#4yo-c^a&6W?}ZK)vuE=|WIj5r$W z7Ak5KQWZNYbsJ_D42JD}+PcLs^eQ046Yo2(zke()R~5I@Mp3x6m7>W%N%5w@D>|X~ zU(Lj?I9K?3F+ve}N;_$xICt7@eH3MJQHPn)r*4Dk6Ia@J9M~+UmK3tCX0_y|y(w|F1zK zr(Yvc}Zp zG&C(2MGV4a?#ty0^3go1xN1$yQ^nEd>>>&ZTcB=};9lc`p6Z$#`_pOfw3F)i3>q&+ zfMd*oXFfPCiq6agB3r}Xi!S4Irh;KJ%GQOl4-NAld?I#4$C|0bd;GeBZXWjJ6@fDZ zMl#XbW7$k?Ev15s7f0;7Xcf)oDnwA@%W_^KChn50lf5-r3i`i#T^;Or0wr$MbxZdRn~-p^j2w-WOk)W2!Y->}_jBNZHoaV0aJ`7Te(3bqkM%oQnrv|m zLjE?`MJKjHHmJZ_s_BDan*jW5?OWR+Dpuoa)q@2K!1m3~*cf9SF$x?P2{=X3doLe1 zA{_dpkZc9WTGHY}`1v zW`{e1Of&4Q=^oQ-GB>@xxK8I_;d%Ye9lK8%3VsSx=LihPUa|BuRFmCxWeN;vh3*~ z(w1yTnI9h%A)%7g?Jjf40l10t#AHiD{@ft_@@#b=7{MZU1t)V2Gw3EnYqYdy^QGec z9y6*<4A)rE(ddLkisg?&q=B&ZgZKpFkoWT&?Pj`d`CH6ww$%fMX*)@+?wglKy8C~g zDJ=*AkUbxLXw%r!r9p3@7fV)hukWaOSLd9vaHH;tOcm$^5yQA~vgZ6ItBVvG91~$j zv>Ih&8^c#=9?VcOARjbcXL2X&T|%Yn5wrjyU7Z^fZrfQe)>%*w#i)+5eI7#UU-NG; zw_HV&BPn)ri2znI;-0f2Y$A}pV){=iKE^dSHrt~yNk&iYs7t^7yaiBV^%K}-)7(Q5 za4FtN8Te&u>p6|a>V&*>yzDTXruC!*_ih~ngZ;P>9Ve0KwSF6L(PLNm<@f`l=6Ict@%Hr7LV(2z~9C zk5)u-MnQ7YhkjjcuT4vszukgrS2hbhDR-1C*Gg&N&C~YK^h&HtrL+ydp)l@xWn0D3`q&w;VSnsqJ8tB1D+K5VeQGe83M&}QQr8p zg^Ctw3Ai(B#P{1?v|NkrMDGS+-W~)>ahj1Sb&<%tFEfz|qt|!q6w0_*t`nUV4AW>i z#xy@81D8t=XJ{BUI)4IUy2BJQHEfcd_*GFitKFRrJDX!KN@SBeo|;TsK4I1P=7^JGsI)erg$jR6snh-;{~ul8U8skc12t+^}-ze6byK6`yu8 zb(oAuP`c5urr{?}y!FwP)OOd<-8bu`9wW4@_9;Fj?pXJ`WQH`KKBynY_0@L}E{@U% zBM8ITSaQ3)LqRr5Abw~%fJe{x@%ls5{`^rrX5mMGAw81AiHRFGcVID8CjgrjG|7|8 z2`9RorBc~X7C*B%x*>o21+U+m83~G)YySM9_gKAq<-{70WaF9(QLA+jO13HB4?F9& zj^ZXEClPoP;*2z~3sY&yfQcaJ2M!Z61Bq!1)zYqy0<9`KlY5P4zx|}Q+5}zRN4{y@ z`;n=h_3o472?lwY!kPI}=ihi%zMobuNP72tjAW8MgD`K5V}Z19^we4_uk zEJW0=j}7L^w79h5(XOgNs&KDbNK4S+m8)Q&dQfM&w6Ze)!rI8?$XWba8-VSU!IAcla zk#IVwmLMxBt$gWU2iM~nE)IZNSy;4y1ko=&>tZ5s$!~JW1`rFKx>IL(D_PNvW1jTi z?i$-68!S&9^~tj$!sQG^GcPa73FRkyaS_Mk7AqU{LLpY&F(YxKNg|dQ-Fcayla_Up zI`?(lVmS7xXsp*na%?f;EnNh?arPTUo4xs$L@XCzU`u$v9yu(;`Xaf*0r z(x>K6L(v)N@FmB$#r?P{{-XJlHO^o}Iq2_(L6ABV@jI9l_6c{?+4N33XlfB+vQ^}L z>!KxwnAzf|@5^{e8X@uLG(gW0iOc&Wg?iE`(aok)(e>h5(B=CLjFME9s?WRd4;#mS zBfI)7{k^lk?q8Ny4WxqC2gUgm-@5(JlX2@Mc*6~@?)IoP=(79Fzs9=gB5U$LD+YKb zq9fd?<;i3$cu-|}@Zx;B4wr2yi0pRCE5E)p-DEG&vV=>GnTKlk4_#aw;2N(V;IZhj z{cg4R;cQOQy%7x~qgcztgtD)U=@GuJHr(G4*=p?0cRCds^yYSd#AmyfclMl}Ta@)_ zIx`pc9}Ov=h}BoW+4}p{UC|X|)kp=MA%X#5J7v!>i1#E==7WJU)*~<7`Jo+O|MU$1 z!9*REQ3;XUsg&X$wXZ@%0)|@VsQ!LnWat(S(`Kl*Lhu$w)+pR!rP<%a=)Q1zY6cAfX#S@iH#+-|Z%&%#V1N;;dpAkxOSd}P2JsL*&=14+m9dsr_|Y<& zkKP&Znh1fsx7plCA2SJgRjRstXN)87ejmGA>uWlLN1{{~hXN}0=V@mH5sN{54+e{e zxf4(o_h5aWRo}NnQ{w2@gbqRl)JWxbH-j6QxHlUp%iZr|DA)Ld**ExoqX7(5&M9do zO@$?aXRY@v+h9*0?}9c)CaQNbXe?ZWnO^eFQi+;U_b2qd0c2V~+O%HJ`tM=SmeHvs zbbV`-@A^~`eZ^Eeyx;qi>%iBjVS?Q~!Jb69U9}Jukv<;;smf*ICd}QU>O|V>s>Y+O z_Yxkd!fAZH;X2PHSOUqY{nC;+f3xDPDE>z8JKej@t#hL6Ym&DBCUzmSttNhv$MdEG z4k!szDQ_-Z56$^RUEE!<-sbboM2gdrjqWB}brOlEJVbj|Z@tR9!`C_khP0^nz1uaN z&6XS#6xZ3~hh+!!N?LtN8oUy?PpR>Wv;OibN=B>wp|)~`uG?6#mP0+s{*(#0^-=V+ zFd+GML7)X=heto>$O{#fh*tbG1=Zc6Qc9}qg<_a1l{IC}lha~`V0d4TuD~KQY}G4F z`j7Os-z&iTQJIjs-dH@LN%^&$xs-!a8%IoHDv!e|53Np1UA&9_M&DD_s)TpO-@vFG zhK8}g%hE#TOlbjC3WcIcC8ZZAI2Sty@F@6+k+5R+Ti)#xb(z0Kb@!Uzwc!dBG`?`m zc!s=ts;7^tpyeBf&{edZR|iApwQUHYZRLO-+CW~~@cOmwfCa#gQu`>@$t?`q#J}50 zt?f9+7|z<`FzE$666Ru7p6HCb^2V8>*Cb94A+f{)%$}(W4z%S}ZLHZAYI=UZ?1 zc@t1imG&4j`mMzrLsLBxJ~Ne=$7k7^6q)FeG#x+5L0+;zUh^JGGd<+hLg#}wq!Y$s>3t(D_hNrc7MA;IER4VBS=I-98p`t z#gb-8i(#+*qrvjaGX`~U*3_uDeYY1{HkY~pq4QBcwD2P@3LKk&Dk-h489cdd`j-LK z9IVSPswv*aTC(J-2&#xncy=dwgx{+~K?9k%_i55Vzpa`9!l5aUE8f@B9T-P(E@ zc{lrjUcf4P4l4fDcumWc5;yv*OH#^@udM{x$>J63e|Y`idQUXX)3WF3y|WuD|Hs-X zJE9_(nw*ud3ycLC!oSB3W38LWr6o<%-tFGzjh+3w<@Sy!TK)R@mG-C8zRPizTFh1U z3pp+?(CxJo|7T&+p9BQM*A9OzuEaaPw5^9V04*!f+g>HWkz?}#=Q8CgwA z;#_N{(|0qBr{(1;^rZhisu>pz4CtHuDnQ;(hwO`=XIw2dyDC&~j3!U*arE^Ajh0uY zzIwMG1;bMkj9VqHG@SOlt$<=SCf8_wBRqmZeZ9CfMN9NIPY|tG@vy5^dNYnu!kkL- z>qpMZFN{EEs;=)%0G*_2SQEQW%YPEibGWerM+H;;)|vJ@-IGoGTr>ZBR}bmBmMNdP z?z;@D-72}Inq|dTVjOhO=W0O>S)R_AB=ay%BDKuY@dr8rksPcv-~y_gr63bY%eG+& zZXA6ZoKKz4Daj&E0Nq{Cq@n3-v+%B)U+eju{b^F)VDtXh$^ixJwm#kl)?ZPgFzRg= zevi{xKPf(;EUAi6t`^u!ydc>GxseGf8(G`tQ%psKGL`e4CSwsE3hqYCzoB@W_=pAi zr*D{G6WU6w!!PHF6jOVziLO$Bwr~yQ0zsZhH^BImH02hj_4zmMS(fH9#OYpeBj%RI zP5VKu)eo#$SScYtKq19JOE2_~)3sd424EsdW z6Wks>RhBZ3ZyTgPR@je^ub@F<^68JqmEqoa)l*^44e>`yG%v;8WNl5d))a4?(wpYBfb(BAm3M3f4b zy8Q%`?Z)G6{CLSrK4&*hs(?m!I+P-yq1tKsdNf?OkNBrQB|{wCEd3WTQK{R=vOZ-^ z`>>hrbse_8+rtHGyEle}y_uQi9jVV;71U5aDT}pDO~7nD0W2D2pb#r{wZ1RWqsBU2 zL$DLOdQ6D9kWTO);fAlNc*-aIk`eMX> zRdCFTN2bKF1?S;N?vX>#`NgP<-3|5K71^Sn;62^v`O7bvi%Y1FMQajf$s~z?szRUh zHMt|l03UiGAubQa&G@BKQ*74R#?4KiDjBw$_eVfYMxtRhtF}2Mi^1jDfuYsEp5hp8 zMSW%tB?Kb~yi#UTKaq@RQX`=iDm4JgMg; zFNF!$p5L%rt;9AKT&4rHFyiG`?JSx1dXa#Lu;|zl(RN2y|DJ;6)!6;*3&&EXVS{C9U z0T>?_{ilrF+w5r|Enm=0z<$iPWI=$!s(LK$4z1JPpYAN7GaN8nyu2`GqbwTk@T`AUKC!qbzda;zCdcfE2;Gt9!&Xi>I;wBpM7w9%HY{Y><@Zhs-1) z?4{cldo_6Z<+ns{)gOzEpXZ+j@^3Ew>VBIlzxEU}m;334&wK+`j#M@GY4-=h+wy8M z^mv}liVwWi<%H!;ksW=m`rbbLJ1s^3zlG4sO;I7axyP-Z z>flf<&;Cw12BYK})mMfKNM(w+xbMIDqj`j&y*3GN-q|xj?7ffUYynNNZN!jrzM%8I zUu2Z|Vf|!ESkIZG30P(xf7f<7!Xc3cNsIlz!{k39NO`>@sw? z3I2k^FUo5%C70YnBQ-e+mN%G`( zYJQ5Fj++^tY1Q7F^xV8wxVmw+xWd~yBVAwr$0GLtCr7-H8sa~;cj>*pRFAe7Hw#V+ zb^vIpd^_!J93{q+`MBV)M;1*qL3)36694rY=0sLP`Ubu?3VM5@3MX|CgxIg+& zIoSOGite_my#Te>$srGKns7Ud+Fe^|f7f@9_oi^B0H`}Ld%G4_IS7G8)?G2szDZmS=CH@>Kd?K3QiR-*DMM^~M z-oI2?lhBjB9R9OT7Bk%`5@%`{plGUN>5prQQ8of;%hMd-Fs$;6>m`OzO8wAqvtiP^T3g07gAdfib-} zRx03>z>Qr5lW_JE-d+Y}L?FwoUWb?Msvr+vci0|xq*UIlZ9-0m2Ofm5tttU6+kF7#a+PxBQ8HvKig~82%EFh}lM!xYja*Zy%D=8!)q1qv6@? z(eSYXl#SQ>-!|ve_Nc%O`(Z0FDmFtmpy)wW*zX0;pTu1WEYkn?I+1zJVY zBJX53IE%KoaMWNf0^JmLmj1RZ?8zKi;ij7PPLqk84y%D|(eNhZJwPGZ;9*nK;j9=q z3Qp_nU2{?sx=Ct!FFV+Y*A0DU!o5Y+lM2Xogg2}mCZF7p+GH9CwObwY7^k;AUnR06 zlx&asHoIL^$)D@QGPR9M&FpI1GYahHFGche-f2E-KOpn)sgpXY-x zK3W1-v^%$6>a@I{x2m7B)Dd9aZ^W_v)~)%q_b1%N_WF2{wDh;M)IJqx5ChPN z;o#u^isJ}J1e2%|_U3@36{tRkz2xVPGKA^?I>=DI zlpd#cHa#MJ-QjAbFnEHfy34LqFo&0oCuO`*@%g#3UFJyq*}m(m3fQ>TRDE6IC#3WB zn6LEjoK-VR3;?i4-wgV+S}%K~c6Xck_-fisAGnMrWjWp|wLI_w7_6Z_VWPcLj1|() zXW+(7kUjH!t=FOG@3~U#7gfC+6>}bHUY%|#JNHePHDvp!%2P_I60NK|ux~g3g9956 z|5uDWuF8b$Y{?xZB; z@E&)5x#gy>*}{}kkXITvP&s*KlE|}~y#bHN>ZIkUU(XZYr8;3lT1gzwmu*iMK!LX? z>giVn1s693)Q;;9tGouEk2^h5N@wWpDa0i{%OGem5YCS|oCn#s2wDmwm_j1kYUjlp zh%(f|rlsq}jr1(rEzNT2#AVZdKP$#yZ3aVMMN%TVSsV&P2GzVwj_Qh}3LzbCnUxN#geL(doN(foapY=HZ&zEV0FHwn7S z3g+A%J~?0NtaFl<&u*Qtu*z*6M{Nu42N3Pz5Iw$a8|fb%)$_gvt<4+e1C;?`Uz&*w zlZ<D^bP7ADFuSBT0>0DktoiLgx|C4(ntlKB^iq7wr%; zb++`9Z(MgyveZ4>IP(X*)>2)xsI_jUj7;5!WL^5~trnD$qt4$7ER=1Z;d`whyqEfB zr2vl+hD!d)ABsNBB+tp*|2>?%W8wYRui*Xyxo<}suQ0E!u6}5Bj@Sz!*cB~*HYZkG zbm2Rt58cH~4!&_W%{+%0EB$kMQ*c35e5L6tBo_If)4GR8S`SwQ{WJZktX&iB(mtib z4O!C#BW=g4a+HsXc7HT_8=Gm{Ei<_>G*8L)?iJF=)^v~73jVY&DXO*#93(%J0+jnX#6qUnt+e&2Yejs-6 z<%d%!>3~Qz_UtVY8s#x928@UA4kpMcxbXdNTAGaRzkpsgc||6j{N>2aYR*AFC0N zZ(Fs>*pb6t{jR6Q*Iap~Mjzhm0U@HC)IEPpo!f;LLyK8lQ{=p^4RV&>1ZtY`LI7t9 zY2!|l3(ZL7XG&!TOWe`PfhOrc#J6+zjShOejvWG*!N zUc;CrB4v!5h#6lYTwc-9p3#u?Opn)8>xoxqN$+(#T$)c}naQF;6CT!r4Ra7TF1j8s z8#0t4AUF$V;4efDeF>@b?z`F&BEw31KTEg@%@2tUc9RnS8Z%wMIKj^x>vr$mk`V3w0ijsUsFxSyy zj2G-NbLo5lK;{013+8F>44+)M12kheW|lJBvVM5FAZcL?frsA!xch`>r3Nq3O>ER8 z<4ul1XPGqE0lg>2_SRLEGS3KA%{IuMp}>ldbvh;?JWdOOjMlHR?Jq}i z;uD?)!>cL<+u?;fYMu3p^S6Hu`%}RVBd4HmmCl&XSekCa{-TvE#Ph~i@%n$(j7^bS z_|Vfz^r_1LBKtl;Z)A5~T0PW~A@{OtqA>5!2b#Y%UWS*BUR>`*R1xH{4lf~x7mVAr zJ7%P_+4K+Ksm$O0W{^GQ)-EHRM?erdBmcHyph?<6-sO`JNxeWP^u^YC)H){J#Rg_BYXc#@<2y`QI>m`MH>|Y>ax)>$AnTmn)~Pw!~@J zq7)Y07hal3z~bH`S{vUQ@AT7}>8!JeCHQyxNEr19)iD{-GI+|NL(1?XLiqV7dh$-$Vy!4W+vsd)i3`iqWHfdka_oU zsWZ0;KT5syHD2{PiRBaF*y)LC+!jgR;xsiSn6Z^}xjas8H@S;*xEjGU8I-Z}Hh1<^ z25~Z{YtxCw)guNQ#qgqAI6)867$4+iOROlCQ#hh25FWjwFj5t1N8^e#=eM7c{ zM(;Y72Sl4`?Mw9^Lc?x+g+Iz9|A4{6ho^*txs5Fp+}18U~blgV=z;8-l$%x|MvRZ)N6SzMDz{Gdz?z{cB zaqpjz#*^##lR&o&V^Kp^>0lAn&5~Ea@cw_|u7;>T`$~kH_13kn&Gi?f?dDWwG#+(z zPw5VBYM?UjOzilSzZ_M=l-ssHpM1I!4Pa-~H1xP(8!smy8=WT;$TibNzR>!c2Ptvk zESG}`t}wlPx)IP)sOf#!lgjWIp%2kwi9rAUxZm8k7Jwks(!b|ou9I!xG2pcogN`}_ z){pRlo(PnTc4(h%-f_oQI{XupjiPD{+DhtE^s{g z94pSJHedqE^QUthi>s=(ctt&D3+lRf2P@Lsue^8HiQa@6L}}uRSoe^pWOC6xnWD`T zvM{y>8Qi_wqvW+le@*Pq$t0z~J%>>W>yJW|xKD(C_N#&C*wlgdP~^nwm9ro0G-)Et zH7S8VREEqdE=wqQ*w@I0<7=UzMwN>P=wwn1undy-E+P+&=?pwDyY#yB?u-`tWrJ_ErILere+ph1mvdA_|Y+_nP+&N}%{b{m_| zZ4D8Qio^NyfBDPiiH)bA_VR2%TD}BD-F70THQ9+Qw#x<>l1mo0v~w~*NhbBSyR}Z0 zbhapD-uCp=j$Gsda2>oX`;Ro-BzeQ~TD2H_Bf?o+b1 zFv00;_%jz}knfI2ZHfpNZgY!Hq%+&X{6Kw=Exl&tX(5d>mqxQ?rC6=1gG(9!2dK;c zy|W{C6a>^!XLSDby&X*Eb5K6dEXk@vtU8}FG!b`@@fp<9?-HY*T8#szZCpp~>95@f z=y_2djgm}QW`c$R2ZJPmKr_p!LL$3!Vv5H>jliR%1UFSK+!x<7UOR zDqjSsbzNRWSJcSSZm~sChuZHV zuoo+~^|6;XmNJ(fU6nifsRx`|WyG6)GDGq$5;VpnZFagtY&_nhNQquEVS$3Es#}oZ ztk_Fmx1?Osb$8Y@t=h_g2D{ZjX4rY1Wpo_3yY-Vg5N}ivZz8zDG!p{cj5=Z{X$1 zQv~OUva(Eaf?Xc4;$Zyy)4To-=DaRLgT6S2q?Jt|H2nW8VWW-$iab#7Z}=?v&p`eU zYsF5dpRJF>0mR2B%&fti>5b+8u|{NihKo6=Jp$67EXkPnGX287GfYxnD0AXT>GAZ< z7yq=suq_%-%gK3`={}Fil=xwwFz9j$^BpXl>;9L*n_)<-5h4%|^ga2X*=tl6fxB@?9rZi)6(iaKagp>MF00vcVnc+#aEV)W zm@uYct(X^M=Z1cOP`fX1!o)wOPSQJTi|z*I6+LcgGWEh=)UQuCfV*pLztcn{4F3?e zTNNyCFS=9)tnPjS_y*y|&R&a|zfl0JuBPa=(N8CcsrDGWRt<-GT-++)W_f91NcNi$ zc5;L0?sIH1wh0nH6TNvyL=Ntk(|yp*>%LwdB%8(4#!le1Yry=|>}c(>+2~$G{LyP| zze7{E{T5X{1=?wo@))a(ORs07XVAaHbjIWQY|=7@^4$LLOSmT`;8vxu(E`zHzSn`8 z_ADZ}eV1{wZ5-4;PmlWM1%f<3vVJ76sO7gjlVVJ~B@>GeluIU^LjHMo1iSQ|#gZO) z^t6&8F(^ej_nI4T-MG4Nn^xPK5tAK}!S+?(`$8;ew%-TRE%)=V^j(cZp=pgfr!Ir2 zP*Cbj8G!Di#>eDhv;Ney-Bis-{WdX;L(NK?f)z_8e{68%oj-#N3i8_2+U`K9ZRZ=I zK`cIpQHH(?&x*{av;2Plf`yqpUh^&=P`&zI-WqwL-2Qr#&*u7d_4VwBO2>_dRmXD8F0?Zaf1Jo`WL0JNvH6g4gpfWwa_^xhXU2q|Q>tEjF}z%xo3#1=dK5XHTXD z?1hb3v??fg8lFdKPlYzCdw+}G>k}>)AOJg~a`(M5HMfr zVLfPz<%?fV%x~R_4EV`b8ojH6c|x(^n6HlKXcj3`igq~nu53A`XcedTsRqndlcpm3S{~|-YssU!J%Xx z_Qm{``4N8NmvxtJyL@Lr8%8PEFT_0{6-kNv&hi0(<8}WEzIIW72#w16K4hMq#rI47>L$Tc@?WTYyYO5N^3|G|(k2CE)NirdD8EpYb3$FMwmy zxb6M-BS17~%4biYc^{pTt$%Ayv*9o*0TU>5)Xc9pjMIy^;_az*@6G)*zrc4d9TB)E zK3NRxDA-FU({b@kh0F41KobJn~v0Mv?SK`F~b$^}( zdtFNVk9m!p4@4a((;m}H)L#0M2^j;mnKPi^cB`HI!-Khpi6}Tli6nVK-C4h1Y1b{* zu?GfIBc;M2vcKY6B)RSsiSH@Op@S5YQT5Dn(5p;h(Qq!ex!ipK>j6%eR}|-IRk*jp zA9ftPJO{q>!vf@lb!<0ZzIQ0s_Wt@1_A~&c+k4&c-G8wy4zN%E+*20WZ9jou<_$!+ zV%pLy1;KQ5JBvQu*@K5nHCe z1vit9@0Kn)pBA@NL&nPp^1qDFd#I5b)dZfYV%3XMl5z_?g zyRD)KaiN0n|GEY)qC3h*u%AA_rVpZHh_B{$#ws<;A^$<#%0$`r~gGAu}A!WU*J_4F@7lZO(gBS4$H9X zPV@18U&{ZN1%QCwNX#9U_G&eI7lc1Ffe90&o3z){GqD zIoWvH96s4uFir_Q{%h@yyiwXTY~e;s!@v_0au=gQ5Z*(atJuIukntrUbJF3J_4#2{ z?>h7xewF09PFmRN#GWx1=hmq=A<^|Sg(|!{sMkV zh;nWE-EI5BBOgC<_=WUk#F(`1*OB-ArQ93n%ITwBzIB(2rkEYGpiL#IN05!g)6k)O zZ&C<}^bKc!yLmfbtV{pNtY0o9w}GAgC)dQ7;WxJyh)`M_Q_!m;M>+-c>BsrAz0m75 z(T7%l@w4P`FBA0q2O3XL&)?8e^l5`cvcDgp%Wy649(S%OiK2LtOx_H51Nh%kO2k+C z2=cnqprmf7_Q2KJoETFsu2$s^*oN}yw21TbJ6{t7&x;mYfFsiAhi;p6@gpv|0YJHr z7l)ItDqWg?wvUW;#Q%x8KQf#x%|!XeA!St%_K8Yd2IkhHHm#w z%Y(XOC>U37j9PO#8rTBF{rp6*>E+PV2Az;Ur-T=8Y0Ij9Uy6R6TH;(JF*AFU>ZtLMRp1c+fw-Z1I zk;PXD#>a&ulCC=slYJZwRJLp-P*QP~7E;u+ugU>sws9qB3Ysz_1X92r^uPg;Ouo+CKgxua(UTU!b zg}i8}nb%&4Z{7$4EkwPqRI^)l9IuP~{UW-lx9eQGYwAqQ>6SU@ZmUbXx$mH!!$VbK zrz-S8&X3f+%sZ4C7=Pw#e&=a^gAt1{pd%YZvW&w%u>bnm{iMaw(fB}Ml#Ax5!W=k57jnWCN`3AX-Ar=6QogSXa%T;~dl6|0F zflHpRwid>%@;c|!Vd>Vfr!fV45;Y^Y4L>gy%Nc&0Q8lJ=6Qd5po4~r?l)q^?Ste)( z{;*-P2BEn3Xzl4y#db4U;j;RVpJisPzm^_w8oxrwmGJrzcM1^8dG`>ar?1me+-AyI zhRGold>C>dt3@u)^{LWEKf&6tZU|R~6RfF7CZ4qGJKrRYK$rJiB681Zb zit#F1jfHh!643dE^w&tniG1VIt9ViIs-BxNulo)F`!yTzahI$>`0ci%Zwx}|q9rciFcbkN#pUMuKzNvi;8z^g=G@w%wncc3B;LmUG z=uy0K94GOyN{h-Paeg3VFZvg`qKsh0&+iyj-|&%|dcs@^cQI`hH=SOEEH23?^rt0XQW6BbKS!N%tH?))@h_Fq+~p zN)IniX_?u7zfO}q=%z%tjCK-+gg@+MnIqwl!Bg5`m%&jmtv3rH^q5p_+({Bhdy&3L zM|xdXQVrA3j;u~uvgR|f9G=d#3rxl~`C3&vG{yqiZ|xW^`;*?KSPjPs#g|#NV|C;2 zzTkNGCjNeQIm?`zDd2ncRgHS88>v9Co~vd^yMInen|^ZHE!aQ0a@O=;R`CxAR?@%~ zTYd?&6gjuHmA<0!^tb$d7zE`)wb4xwe5R%=ysfuR5fagx##1I5yo}p&kd!VXy;7~1 z{d6_)ejd-6v58G*U8Yl*PaN#vC)@FxijZE`uEPK!7dmHUd)^s6o-b(g`LXt%$pxF$ zK;qahJv>)Z2svCrnct^W@5XuOsaI}~PbGy$b`_e+{YPmXhU4{P)#%C~$%JkJTK{5+ z`l?pHoX|MthcV1;ZRW+YIh+DPe;BTY?Ij8{J)-y3Nx9@XIg)4#pprj6kUnmubE4l6 zUK?JUa)4pVS!|JPyWlhKDlc*{oIHS#;25{Y>aEMFu(SAWPzn$`OXPsOZkO#p#eBd8 zC}!-3ND-{3(KIsv-FFQ79@kMo5F-O{&2n9!lo+|3?UbYtA{4$f#fCv z7fK0ob30zqe$6yZ{~Nr_LJMZetJn^V-vz?KBpUjTJ*vH%$bhWwmZemJUq&(3y$8N* z#pD`}LUvi8Qo03`pq^mw(D?m16&h z>m|KpCp*sP7tgC%uj)J~^#;-5o%x*hLG6jm?b#a2V#Cp&EkdJO%Yh8PRciE@KE@ys zXitIL-A~|IRTg~kSTM8EQ5fGVG6F1l{6x`i@&1_?`)B5)!se($NUrY%_d?mr4L=5e z{MY-7tC`B-*B)9aS>jSU`My_oYo!Ua<03jctU6yjACQba;X)O-sg$*KUeX93a!hDK zdG7|=IybfEH+OZ9^qG4PtR}6F5*oev?`JFQrY%wBfjd{Zz&%Sfg zbLZ||@}z7;3y@cc!9hO&o3ZrmH|%GZ55;WHfB?P`z_5Mr`UFm6Cl&0mV8l?y?@JWp zJ2Y*w^G2jiTE6{Em;AYdGtK@19T9wFo!N)yPck19zWa-p1tmh*W0VA6?a*s!Sv*wZ_FcbUb1)>ICo5=>3DEYj!CZQK{KFW z&gAagfVRAkOpgLET_jqT}n;J_VOOStHx@u z6~)yq!`XMECa;e?LGt?ZL-Kyp1iJM_`R=}4{3x_}^oy&!eiuFc2SRvGSJ6GnrSQeI zdIS2Q##0gzXLX&f*mWIA1bI)i*mUw81t1#?X(e zH3e$$&zy{K+Wps&H}e#DdcFJW;qZ{fTx0_SygFd6CkoMVf5VY z21Y7kMueFq%|~xnZKIo>X?sCdYW(WHhhW})GOo(NP#U#~w9zw52cRIw8a`Hd+|MmX zOO|_W=-Ykz3G)Dt0tv-aCOb31YpS6(eYsJZD7XQWPk(QN%Xp3LfuEU$dB`Px-@N(V z@7c^fd`5>YRQ|b-r@In)STR$vG8SrcB7O+Vv*jp$$PRRxgfjLczDP^dTWb7so{Gh3Lc+oTG9I?;L<=!GR|d7mJ>-eUAu_UEWXADQ8Ys zS6$`HOFLpH+NZf&6(AB{2H!7HFjFZ6#}v)iuWabkwvlfA=@K?Kb+aw#`1cW&g3IT`1iC zoXS%J>qQwXuEy`Q^x~X`_)q`bJ&d{U=qR}M#+PQo^jXDzlEn8A>RZnSn#c{qNmQU< zwd}>S4=xrbU03UX795Nf+%NuE^4LYP!T@+QEtco_IUU(l-`TpKw=2WM3m4=)b>;IU z>B!w%mCJT~9bUwmki*bRThoVw!>R>729~~a;OsdJkNCBAebbSj!gJwTy(3ny9{&mA z(Ej|7n5i$fJwevjU=gmRrIfq2{YfYg??p{7-z$h*I&IAt1zQ=C5f1Vg!UW@E8Kw}l?TL>VOKex(k?H|Gn&4PX9QzID;FiHS zD^cjTZ)c{tt3&|wemrM02OgVnkj1s_p?AAOIGV9Q6=hGU>`XAC;S)uDSijlNYA^cH!Dt1>GlOebF)D*Je=<`H z4&U-DwgeQL(7xMwX`rre7G{5Jru+3@gmapC1-Z()i~lZLobVk$J>`Hqdl2P|?_Ktx z!bjEKotRx+!p41=20izh{h_WP#4B(47VbdS9Wx^{)KR5 ze8rY7u4`LtGK%Ey$Q=jVmDT#S3V%1)2!7UROa7i3heh5GtY{mPSe1 z#9ph-pYN))o{#+1b2pgN<}=MO{?puf+Hq02e#&zkdI|G86r-Xt-y#~9Rh#CY3o)`ywK0y;W6 zbEzABPjWAdKmT?`*Q?~zaU-6~db{eq%lpb*_O_c-Ni9AHWekOHz7>&Sf8?139m|u{ z=*lW4UUgCSicQ;rYVVKy60Qa2-u&d(R7?3`8u6>~P=)gwr9`ENJ2HB%`qF+N$ww%j zr-bTFMn{X!A5FfHRi{e(iNK~#9Gd&%aJxyA_%YC9iNgb)RnJWswtK&^g`I{l3d~cWDc#PYj?k-Qfii`@`;9DxG{z+&0 z@ChpKuN8ZBvEUoe<>$|A*p9}-w1CK`SDq3Ba`F7dD!ajY`wcNuCu5<+-*)YnW#&hx z4FWfhn+M6x@*t7~AA-yRfE+S!mgtNs`Jx3d&HN-S}PK!Ye0`ZIw*P{v>B9-SVA(mThlKgJ8wl+KpuN_RWBa>Y*>=NnLL&K2-q?ClRDdTOhs z)Zdx^koRx=`WQ2pI#^+dfzO>j2}oa?`6oBJyqUVci|P@4wP%& za~9d^bX_7x0M>Zd1Mc#Q#mc^nXDgq-+_Z`3&yd8OjpQZc2{9tCTK#w} z7XRj}3}u!op4IOQE_jApJjF-f6#5d?V%-B)Z~`{2xr9%GM#cW;2Sq%^!X@HH7@Ii~02D(~AK?T9z7G(J{I6_1`> zhh8KXSc-L?wUN%!0LLqrI{U+Z+LTomhxuCs{5g|5^GBd3$t@&!b+S!rv5 zfG}O;;NAGz?2%#02SIWU_w4P4N2b1BF;NpwimS^dcnz??r`39|^V0ZiQy_dUq0f0{ zzVZC*Jy7$gs%l^JX(7vs_ZqT4kk5C|-SfC`y020mll}eLjs7aWxs%MP#8)<-$TX#> zYd1ha3X{hURy*j;HJs=7!#9AU!VBH0It?#;CY;KyBw(}nc-R7c#MVhgKH}jIGv&Pn z%Fl>x!s*@}U!^yId~|VkYn`@tm@9i-^o*lM-0!CPBV$j&eAQ|gtIu3|r#zxdqE>0Eqo|(w+ z{Kc2n>u}Mzp8qIV{7YT@uW>;>D^UkwN!udS!)J?KcWkts^yhd<3tA{2RqO`#|(tS(>r^kKU>O3Uyx= zyc#CD=GHYaBPRxep96N!W5#J8|0OT)tp%osB~g_yyMIoN>4SV?z2sx6Vt+adZCNE$ zS{gRe1mF9p^eHm!f7Xs2eSC<2(CiE5w$fO+btZz;wT1uZ6=_KFY7n5mhm4&5@$GPX zmBQK|qg<$IhMf)eW+D9t!hMo^<)_fuoP$rIfxvKAwaq8h!_LjCp1&VWT)Onqdr&g} z7q;Q!6}i~cF{x^;Wv|&*Z`*p`*cX}Wl)cQ-)qdeHqH15?q{{N%ZyT4I|FgYWOxk!JgsSd7qHlwx~Dzo+@VbL znxIC7p~Aa+wjO%BKCl;zQc10PuHZDO+(Z|5-tDHXvIc=-zn@gEVK1spK*DVVn2)6|Np3t~u)aNC&sv}vJM6L%OxV(_rl5YBxtRp3KRYONHF|nyx z-{n-W^maJ^jc`jrL<(C5l`r{;hMLFDt5B;E1m9AEWrg*A|XnQo@B_YQHWU z=c_Sq?*E(_O5y&t!#-fI|0qH;nT+Y(m+0wn?(Q!q$13Mv4=R5AE_@<&x+gXPYEJBY z{d=P7d2LchPfy9?m$X2|`4HyP24NYou?L}F(vM_k%qYFEY(M7$TL$Tmha2E?eyz4Kcq$&G`vzvtGIb zU+G981itrQ|0X@24oYZ6fiIw(ILR(MHzgk!q$Q2@0a*(XVtVTayP_ft&^9B(&1kbW zlzF~tv^W!t&;Epf0H$ishlCl8uLJ&jcL(R|XWVae-9b5@pHxDD5IGGDw6ZRXeRY+fGY96m&)lAuK@tp$->JNO9zc`In) zlEJqCC^VV1==z!D|7dE&}Y9UenO6G*BW% z1Zkr93z|Kfa7rOlmKF7H{}jH<3Chr@LjD=|o&=?JmLWap?P6C&*lje!agmVRud83N zk8?f!uK{+lY3Nsf#l9)NSd@7lmmJy@IG*CE{Z|__t+mGVUi;Pma_m>ZS_UO{HLg{2 z`m)t{+30k|qD;b_vV^DT+h>;$zWn&yFtKjn^Hna{V4t62jAz{qHd6t!oKr8C;i-G$ z52mzU?lLwk&0uSL;{AZF{`}=NJY<_)rhR#nA1!y^by_~-Q)gXKw~!l0q&g?6f%pUB zO&p%S4gSg1(kniw7albETjgmL`I1b+Z7<;G9d40k<_aW9X_McE@JojQYF zAoart!!pv@Y|EK_p;^#oQL3AGMY5=tI^ROVMB3Rx)hwotuqQ=^-`yY$0{CFyiz zT+1gYP`esk0L|)sn>g z>K5c80eT2O)~Dki!h8#Zc@o#(zft#vP*NB2;n^NM8pcU0L)^BIZ{Gc&D$7JK?ikMz zo_7Ma5OS#79JA2UH7;9>dx<%X;NqxP(LK>T+-qqgOq4ZY__kXcQ*2bV&(gx~tej@zY1Z(PnlV%Jhw?J%?NAl3|=lXBHvI@8a^uu&$q88kB-{|MjgOZiYHI0(R{939%;H9v;koSj4 z?^i)AbNDBk0gN=M@cFgT0pHeL3nw#A|G6X9%_c|Q`YHL)Zcfm1@PV zUOyGQe6 z@+$fM0sWxw#@UI;qPiV)4WiBeBk{%&z^=l^TWDzccisX>wAfSJ?ZuY3UgG@v+%g-K z9CCbf!4$E&461s00^s4Dvvc0giTrd3795uZFN7$SYcY4+SN+FR__N~YjqnywgyRfg zx5|&JcNBt%A;opLOIfR~)Hax=E3^&V3*P7?Vi@lh9qD=NwJ8ay6@7>4vrPMDWdrDA z=km6dUL|Dp=j~d8nSI!c$Gzw8zrH`~yq;BASCOzY9zBMBIYA8ORG$a*`T)8%$Iu4B zrb?2GdQ|fBdT$pr#RwOK!8x4x$2x74NLzbe+>LF~7(02JO_1cjBw&rCIx^e+> zVaFINWK~Zh0*&BS(CZL4SR7qtdmig~6>Lpqiv?V#2eZ!WsEk)7xO>^u($*L|v$zjs zJ0xbL`nZi;7!Dd|`cg4zJ8x(Z1$IK@c{TLp4`Kc|Uq-yV#U>W|*p$8{CV4{2aJ@*= zN}LZGw(ULp3#MSj{E8XB26FbMoHukS8`DAE& zm|)5Lf!mnADLm7hndcy_9X&$i3}b;J^g#+Y$o~W$z#(xZ-z#(LPyJLD^7$?(p{~#E z!IIIQh;=Pac37NCS_U%+3u8>+~Sy1#3-}=lPS;J_ezV5fI zR*sB&6^Rx*WB)fQT*=o`_*1?9_qEb)S$=!r$=V2OnxdrKfoBFTS|1I0c7ozVF6kEq z5AHEKZYMYw^swX6i#(ZTWxz_;6u7QO6~113yFL$VbKt|ViNhBK4;_7Vx;|P*Cv|`x z|1x(<;8*;K36(g2_4XYr#=(KL0?V;)h;QFCx0I}ZTRp*hRiKiebdcSIrTOm(Lm6Zb zN{Q+UbBExOGP)_lA7v;e_*BVRY%5hhS%mI;!nx$5taFl{kd%mBOaJXys-Ep*4o?m^ zhIs5r*z60>GMZUg)|P%5eAsjD8bF+d7pC}i}KBjjvuw`8&WE4>2++Mr&1ka5_(0x3(Ygk&wScm%D z=q94q!?lIGql^GE!?;ZD=PXC31$tu{0g#AQr(qV?0h}n+$I#Qt!T!sdWMgnjKyHW@?rDW=WM zpvz^R+XlT+W?}N%%eH+%@F+!%D*U+R{4(l0QE4N0(PmA3mM&h1N!@uL#klki=7L`Wz}vL! zMYpi**H=h3tAG~Hz+rtnn90%D0_0NJ*4@#5@W&&po};^SxbuxnlQqxl=}22d+l+nI z%%>3m`y9OY;$;Z5tslTOFlSRu;H-{Ng&19S+)hNOp{|-@W3c>u?LK@!yq9wm=@22M zOq1+BLX~TY4%Iz_-Y{i)!vS5P@97nk<(B47^!%RY+-WR~wewDOB`kIJ8^(_S8^hEz zf)tcWg4*Oj1YqhnL}em+%Zgy~_TL#yAmLfZJ~u|>Xc#AAC1tx5s)8dnzgPiXPNC!! z?O=mLLg!pXcf)ssRFb#*NSu^j_BBd7>}|3Kf|G{$z+T7|``A!nfi2w3U?ayA-Cp0U zi!K?TXHNu`V(Eok2g){>ty#Lwjv$c9=a_{!fF}UNImN_sW|5B)JeJec2LOc*Ms2md zhw|KjX;u*Cmg4VB>gMDh&KPUqu6Y{=fM9TAho_?kyK?+opv70B6Cq1M?{*$PtOa|r zo!sX|RtMUCYGw8W1;RI-9>u2jj4l?_a6=N!BU`tpK<2K%UkbK*H|rH_Ic*t2Hw)N! zY#1=iap^=n#DcSM*=oI0(SdtWV!@@&J)ChQh&GtUii0kF%kT3-IS!AW`Q!2ZDd z%@}hb8t{nKU#lBRRYvyhT148#u|chjxUPwQdn`e+=)Pz259bTJ`L5~yMRlI5)kben z^v)O1nfGE>s~*=o%wN|g(D*Y8i=OEW^rJGmWQxq!w^6-+&VzsZsYgnu7V|DMfOt!utuojh-B|9_>tU5bz<#Czs zd~b?olkP|kyzD5TUVp_poa~pn3kbZ;9>(~$1+*U(8JcVfd@fY)TtHQ!-esE)im9>}Nk{&+s<#L6J84FxnHSOhCnpgG@noLqRFf<0@X7 zlxC&@qo<~V*qW&^l-nURGr0b{u$TVRz=2s-hJRhV6d_cWB%w!f&mLigIBjpx1O216 z2Y0ZO^T7{y(q`RhG?LR#h1(1iY+I`Yif2KxGO1m62@&1+5O6r#U{zz`r&Q{|_5)C_ zca4E_>NW;7%%N6rGfI7l6+&WVVO2h1qwk%g@I1Xe-HXYOM>5ilBMxJ&Lq#u%1Qmdn zLsV{?=rpGkBw(S=1G6-RRiK^Im#nlT{VqthcCZs^yKZhFB*_RHA_LC{ywZJ}C5M7p z_O8u=Pw7AsugYD+&^hKC>eFd-dQuVj2i51Z1)EuO#eYEoFFIot79J{;5aOzU*sA5< z5W5GoN=M`LhU)n#F}wCMjJ^LVlaqpn=68;ZJ^U*;VX`0&9fp=y5QN6 z61}|Ts1JJ0j&vb`V?_Kj@Lwkq4B+Ry+!AZ#b-MxJ33m{2fDG9mGq{qFR<)yVAy# zd$S)Rv$Kv&zpbpoE()tcxtt1TuKOw^0(oKKd=+%wU+_vs95Ygao(gY#RqhQJoZ*|u z>sdIeEj?}hrA|-Onm$D{SGvpu@9hlxyE1;bNozUm<3+!CLz|zX4ULD3&q*Kb>^btQ zf7AU0?1y(8?NHtB@HWAx>~p6%R1%aSnO%Zv93u1LA-?y2l!HxFI|VZZ1j9|)Yd zf8)Q1SV~x+Y3mt)O!vJ{h7JvezEMIoGcf`H4InH9cslErrHerRenk5IT$t=bKw_ENWX}%Y^y*z(!hY_g%X`W594l^5z^5@G_L5suy_?g&t-BF_H%nmB z=)k_MhIayRkoyz;YJrd}kW~+~b*FF9FXZ=DIj*E$@iUJ<4ODXPgYSdOQ32Lq#3yQ% z9>ykoI*?~^9qX?+W!*D2{6`E&KBMn@BhC%UXzQ9rBBuu+=p5^S$jz%Lt$Pm8y(;=EaW?t6(6GO^PwyZ6s+JC4fZ zBjfw%#9e%UnZ7Y&m_ILn(k8ys6C-PU_E22#xz`lW#Z8%YXpZB52{3>O^IbiLLhi zS0@*tp#NhmRgFTox_!SrYqDqW;)pk&9B=VE%kl!+p}!fm_R`!whq9i~tJdQdZyIo8 z+L5F1IfVh^WXORdX)(|Pi_M#nJe*_Q4j><1j$ujDYb6ErU$Dq(B@aiUbpImNrMcJ4~vlV0r`OF9{_2St*;h}1T?r49`@{3*3?8+`PY`|Gs(1U~FfA$FzbZIC&t4RC(-mB_aGONMz`a>aE}zV#A%3oPE` z*-4HLZ47l`v>rOx8b^m4dd{&vB&Y<);Fa+<7INJ*w{a~_mYTH8C#*OeRt#Un(a zvA~ec;A7jgWW``>3s4c#(SHsC?SObWTlv?S(P)@b>$Y*+#*e!M#cR1vW;c!NYAMDV`W<_*0A;);x`@ zrr#Ov``f)Z^)2aa+Hbak9%68vKki!ZYFZE~)_UTIZ`Ju5;cyXR5-Roeh=lSC(NJ!D zdsgJb4_b68(lL|17pB(+m>=~X_gMQy-irx=|0er|J>+)L+-gXJ4^KQ~^>K#A=VNd_ z?j(7^YVRt?2=Z)_8jf^c^^t20YAPmWV?txiP|#wxEC7aGv&5@R2Pfs&wiX= zxh>IEOExRTO+(O?IHRtDi$)VvZOqXfzn>Hv6h3wO1@ZiCY~{v!&N{M3B3R_IBzS?z zQJPLbB_sLSP`K~E?9EY`zb_|8bR&0T-Ua%BR^v*}MzT4y%?gCgDd=T4> z^+v#`70#=xF>t{5-Et;-{1mM^R6M!WoDq6%`+?2CU>X<07g)O)ws-05FaU&ibmD+c z7XjeNrodxe%d>XlJ3Fn*Pk%a(i`|5^gTV3IdE`^Sd!G^sgeoy7mqBT-aJ#tx_F3juvsf7w&&%#-#Skm& zWAJ0bPp`;P^>`8Oa1lXh-{oh(x~Ik7PJ%P-6PE$}pM?KCUi$u8jpFZ=9CaIZs5|;X zqbu%FAovxd>_%UmI78aJxkjhwq`ucy0^gIEvm=k!NgwA3tjUcBQBvXFzlZNnUmp6E zGQ<-CQO10*{}e-?=&Ph$_o{GWe?4>RM6qR*;cMYffGn3h+f<%dXgGZH@E$pnQ?@E6 zJ@;G3>_}L0TkqzwES+$vSDNH&PN;?&xp)X?Dk2{$<8Uz-E^jCTsCSVsMQGO;=;Gid#w#_P)p<*ib&xFEO?VRvY&FST&Y=4p*P|9 zFFi-Xl84EglVkgHf}I@BKzG;V9aOh+enhu#r`JYaOKA`{BiCJp=3M zNFYIM2fr)z2;mlXJ*<~;%7=oGMT9dPXCPsHubpBL0fN}GRomansXT2`b?zL6eb0sK zQ$90eY8b-nNFWs-nDgywZtjI$NtSbcDkF-(dqyt9|mS4FL4{hi27fyf45w};70N`Fwo{0y(gx>B$_=4INQA_OQB8I}a;+6ii6X2)OC#}+uP^Zt^ zqUyX;_$s&W8|J&ovuOzN2e*=RL@XbI>0(X7*>hCUYu?y27b97u;#W-HjpGUACEAD*F<*Xp+CX@WNDi>_c~NmtXW{A>=#Hsgrm>AX|YnuOrt84Otmg50Bv4gy{{v7({Q`TmGVl z*_9T~8<<_sVWb`6QJ@P}q1f+Dg@m^_#a_wSenDZRr)`{GSmNrz)%V*IjL!BG755WzL z?4+W_Ftpn4r;m7oL&S%jk{HhF+`CIpMOpc3yAyen%)cd+hisa3Xa$65j?u5z!`5|! zLKvsQSUem<`LpvhBsB0l<;fipdhuJL9G-R~N`l_B9t~!>Qsx0%?dH|6#CrNt#+VeA z)=G%enid9h!FO^29(a0B&@Jk4CoiVkyfFBHKD769scs1TuZhyq_P6Au1TQ%q30G^u zUfS81)!z%PQEEB|e;e^bejY9tJXDptSCS$eJGBrSJzFAhVosEpG@@|ekfX&fHywTS z;z`7*^MOTE``~lEhG%$|{J-}=*nM{*E@5QhwmxFRMu^XPLr%?)?I$qomM8@z$&~C)q;^%!^T1-e? z9xesx8ny?%C?Qdkn+Y0mDw_RdkwMx+ZuR{ZEuJl`iC;)ZEEW(|J?*n+lTTQD!%0kE ziX-E-!5#$(Kn#Ra+&qwdH1CMfCJrJ^eX%T~Jbw}!*7f%Xb zL-+=>`#Al$F2A$8=z`4I&bx$HlPemaf#5?Y_50m*4A69H-QxhutQ{X->XwP}8jE(P z+ivxNbdUopWGiD?I=?uB`l`c+g- zJatun=ELn&x226@c|U^S-~NPFUiQRqpgPy=26D1(h_HEC_|)rtwFQXYnP1q;zyMn7CSbK+WlaPVtcn4;_?_l z3DLkm(cz6?HOi;%IS*TjcOl=$m?6GEtBQS=hU&Nkqi}F}T7b)-)*qvW>f16Ui9~aY zdS!Vjm#wg>mnul|h9vqw6l3Ue4o{w)3VVJ8|7TzzumO_N7+6z^`ak3> zemz_SBHsPkqvJpR9C0H&K-Kq;m$x6dUL_mgDcbF|)J4gUl1>Jo<~P zP9@>L)Tisueirl+@oq_)w)p<}%!Qz&7OTH<1L+EvQxnBecOiO*GmMk1!anciGaEc? zdzN22mOq9L3Zaxs<1dtdzprZaE^ zc!KTqBdqDZy7^x|~ap=}$ef|#q00}CR`xvx){`_&@6M(g( zV08N5?69ztdOfj&KpxOZC4C}axZxtEe~y;_TO z-qRa0?8tw7=h^d-=Xm{;z0m(4?y>EA1YGP|-G^BhZTTP0F?7@JFb%FdDK_X`GFyB( z!Cm&>*XjA9E@b{P!zLe+4{_X8R34Y_F#U57|9{;{&L=#W0`X^^B^1jtgNrul=XB=x zE*fX@-rDce+}q0Zz?g*Y9w51F4lWxZMdpHtHF+@O^0(mMz02dB^UHBIf@@ospsDYA zNu)c0p|O7ge=O%lVS4?V)pVDjW>2er1g|lUmY-wyZCa>`|V#o@0Lwn z&Tnx)@S6!UV99Raqn>NMBvteyRkpk+j#szoEx-LorhKfyJ7#aYq@h{Z$j}(JRwc1! z^=M%4-+y(M^25O)a5WKzqGzu&COI|)8$sz`31+9xW~E{-@NTpWA56L{NdcJILSjxq zoNuNZNDJUGPV+Mcq>pF1sdrZs96>S8M_gcSFI1s@2fje+=3aDUIQ$P>{Npzv0}0I| zVo-bwBer0OxU(ChQ!oP1Z&#cOn*m8bQjq>H%JWcZcw&ij*#Eo$3_;FK%JcBJx{hOe z{x#O%w)XIsI3;SaFS2bv!hNS#`gY}#oIi2@wx0i<0|lvKf&7yTj`}Ovo;9XZM&xLy z`R$^A{7VZu9NA0i_X`a5Z+e1EIJ3n4`?uIJQT#Yr-SM}+R&&SbNHyS-1Oj&QyUyF) z*Q~pAqvf}XNvj_%Qa}SSUgE3P@6yxlyv7n-@4HR5CtN^rTX)=a0~wOo6Nl$5rvDKm zzFnn!*zP=OdwKH>rm)a#9emDrGX@>W>u9P!jpPT#*tS#ifG`zirw!(sewhz+UT#bX z0JYq@4R29qz&5;{yPWER`%kT$K#o1VQskfopO=bJD6bZHgMW23Xy;SHvMFHFFJ6Cp zC^?}y_ubqz{n4DR?cWj6x7en~7v}T-NT{#z>b}u!xW$vb{yVd;Waeh$)fZm+AI%IB zO}3Zo4YWyC1O#`5i>C+UBg zjB%pNz?%`M7c@A#ZgVv0iu2y9f>J5Zc3YiUa}Q6 z5tB7Pzw`D%xh0g`6|&Yz7HgF7;YF!#aw{WM7GeP00`y^UYypzuUl2c}O$rqx%**MR z5b|w8$YbsiMVnFQ#1REj=4eL{sRZ6eQBMWP0@9-OC$0iOCZhzV1tN~~`|Bc3YpK^7 zQOV2=hW^d6F`&+Ngw><4*2W>?x-6;ojwGip9%UTs+SXK-`^{C<1U)&)jw@p2j2U$S zH{#Kx4N4k?HbAbeg|7hqVgeV%8j(Bj*vH1b^z@6+eqA!@stu@8s~b2Uv)Gma)4k3N zd-z3u4Eb2;b>dEM|~lr$K!CPsR@E!P=C zm*`HbrQf4avP}?eWGSAd>>K%5&vM?n8&5>*)(Ub3@`k-A@1OdKuC6FdW2oyNOihkVlDNrnPvKl%frC$QrWu)?+4<=e3|)I3(bUF2_BEx1Ih5 z_E@vF{3FID(+lE(Z065%PF3-HbwA=+%%iPO^x;sD>Pp22cp zR&OdvGPe}h%(6Jesj)oC5UzCigs(~r4FqRg3S+Une8VQ3c8Sh`%p^(d?EEobUABG8 zH4GZTULUjfsbAdk4wD63#fDLzQ|gJZgs1-wZO?zFcO!ZO$1CX@D=uBfsIBB2QQbWd z=lI0KL1VMPwLS~^w{Ea5gjnRi&#tK()2$&Vjl> z4#`cq7tG(fNXr0;yiBClto7m{L`O^hiw`6v!}&0d+B%?)_=I9Z&q*_>pUGG=8Lif- zk}@_C{zO*g*`G@V8y0!R5w(B}^C!EPWCrWSZ{6|{?=-*lOzv2wRoGgdujD9CRqZpG zp?5*1R-wS&UZI4E6PE<7j9re1&@s#@;v=6rQdBc7D`>i73){83;e*ioCweCIvemp$ zl2Ib`o$DAVN=)V=_M^f|bwG36tKiM2W*|l zx_9zdkJ%^qdLDt6tY&UiwC`0Ob4{U{?Oo8{N@CUrr-#1?J^^)pW{bV6^C9sj%d$W+yI#-BqSG*&?nmS*Zz0^c=Lp;}Vv?k&8$Yv)?v;i#*hV|9VK<<5 z5-^fzBww6~BV3z!$0&wnn6QrnsxW0+`Y@p2l0r@wDPTHx6ZUw7+B}X}W0JPQ2J=Z9 zpdnH)tL|9Mc%__z{`wz4`;nD>OVIy8fp zW#n?WF&pV5>5H<{Jr~Wt`}{j-*+c{~e=zF@mBS=TK{Eh&){<5k5IQTOCTua^Tmbd1 z|Cb;!dL-x%Ee~I^zk)X{kgNMu@$uu?s_Y7lD#f2Vuyp*VdW9lcL`m@N&V&a~$PSzP zZa*;*JMHW%E{dd&>oM$`5g=B-#fTfxRdu=4%+h~gTZSaXlT!38ghwF!3VZztzIL?h zeEN!hngqkC6XETnS*f);B8q56s3AP#Rs&1Yyjwa5AII{HhL~YNn-9@lComZ(t)x#E zs?4SNbCnVsnAJuV5~)6Nh)+m&c#rG`-xFBeVkPDI#?%fRf$a?uhkiRy_ZZm3-0>m_ zjt^DndvA1&kKEl@x3yT(OW6xE`i26yTjxrA*&nxFv`sM(?160vY(VhAQ3oJQ?YmI3 zchPL)bBm_8e7-$H1>{{mR7`ouF*?9DKNr|V?k_UPbar?MFo1nD;O?{@hv&@V4Ipnk<*e&2U$`%%~q*Y%0j(Sm_w3;$k`4ZNe)X6E3u_QQY7coMh**QM z_ZjpP2|#9@czSGj6IEm|uVbmT8O-t|oNihA9y!MJZ1whcaDTNvPGp`{6T?g@!26`T zv>j^+>gRuwb|XIgbdwGCTl&LyCUo@{@F3O5>|%V^<5z8eRUyceY6;~+kRPM+(Z8+z zM0Z9&l)RRMT7$h!iY4m!5?hi7m7 zUEkzSl=SHuiAZE=x64ygWodQ|d$|ujlQA6F7dp(c6}9R(o(eu}))kS)d{GfhWJQGc z=SP@GXvvdj{BMA}rA8?nliwynMD~{;GUmcB{NvVCo?lLB(eZ3>j&))#?m`9Y|I8|NC6jmn+7egy;6Iq(lzV z_e?9C)_7*lG@6{IEoK}VpU8sS6sW@ABV#-lN+kwzYC89TfK7%5Se`BxP?*A+N5wfP z>1stMTsuhv$5dWKM?rR{J!JGNiCTC1zrG`e@mScWAy0XGvSBK89FC7(Gn;d%m7@bg zijSkDE&TIB!E)x9WH(nV2V)z=)5sx-(M(DvK2xeOse8U@*__EW+Gtcdgul-hvI6KT z;|wuG2+6ioqx$c@6vnDpbm2#mt1rS)k+zcc9(uA7Fm_Oo7iezZi!}i?0W;|b+DEk3 zAY7oWD|AN%kGI)fKS&N-vjaOQtzT5!ayuUmELlcfYpR);<*I&l|LU<9C`Lx;Q89A1 zr2no{hkrHKD)!MT>wM??yIuLz7})QHLAfIiMR_~dpbPy{pPQE`u11aC>_sVjuAy#1 z+QvI7`cT3z-Cb_<4Z(m<(_4Nu;bNI1ebIMUO}YBjo9`hF7OI4PeapPGW63#r$I^Cp zksI(v#Av%t9WC5YIJdG_xvMZLM*_ApFF;d^+VRfOQMFe&d!wUbCwu=V)TpgSJ@Lh_ z=q~4Kr&>bk9=`=!-W~=qN{#j3ZmifidGoYDyth!}Qp~Cykm2Mcff{z=s_okY_pfK{ z2(G?vIzOB|VB_9>%=hfvglkN(7z)9JjEbN{$!g7o>i@~VHQ@nV8)cfN=I zJ|Y{viTk>2H|;as3CgV`X6Uhwz?a}hTM@%HYrz^p^+rknStu{Qje4ggkX{Y7txMQz z%!=XPm)}0aZHLm$w_Uf#j4&;7nSCAquwED)EP9~?TKKHYsisA5^}n=cdd*wUaZ&-Q z5IW(e5@dO>M;_riZtX~*+#kx^kQ|b{+zd&KkW46D(SjtGeSv04Q|52RbP<2xd+~j4 z!jJ7*UC!kg>Peff!4$CBe10T2j(rtpdr;wp|_cm|wAFej*%&>C7FI-usv;U^hY0 zeFQMppC}Y_zb@H8au4>97e_C9wE)m73bda2&J8oZh!%7$J*CAjWGl}Um=$(l{r|m& z_zWibgOhT|(Gl;l4br1i;j}-c$l){0O-A*;dghtK`LVJqlK|U!(J3I@A`)u0g?gEq zU9OH}n-_FwbNyGg-~2|%Eu;vzbs^w9{%qKodo2PkIVQ@W2{Lw*j!XN1hiBhd3@Z2* zj<08(H78`gx41bmZ6T>+pn2 zvO`?Z^_??&xg|c5&5ZmpQ8t;kXc=Z;wfJ-^?iD+c4+~EMzC7z*me z$|>&q2tN1!++(ytIq2<#_AJrdwvcv~fOvt+ZQlM+RfQde8(S;)5oB;&Vyq!4Pt~fQ zDS(2E%cOz(pG8#cXzF-NIBgDcdaE(|qQ&G9wOwx`41FZ$ z{q%r|>4Tclv*>64`+1_DQ7sX~n_zf&y7Rh_w8@xh?NrE|{9##ZC#@W#QuqSYy)?|k z7)8?Kjhy0vvE=uR7WsjR@7@@PAC%d@XD#fnUf`hGh~*l=AZCwTC##HMrwi+ClwAtx z&%*;$*^8CmBb}k#AI!IJCzs8x9;4G2wZZhuF7CJ3r~A*cdcK8|*Ir17n)~^|EcFT` zn$Fqw9MJuCVzFx!xV}F%>l6P0>NGw-98WtCDhL9ksqfHM5o&=S1v_<;h?#Q-4~sq4YSr%YR|?iz3U@@>rd7=$`Fn z+A<#NGu(O26NfEIW~(Erdq2|(YYauOr`SnRk->b0@bHK%a~(bGp}0#34Bb+2t-Yym zGhmOb4=HNRvto71t;^jpgPp1F$)Nh%V~`@;WD~*%ypef)d^osz)1g(>X;GH&V+(xf zF#q9p{ZwQHPpro66hUqgqrPDIj|+x@>=0k;#{yL~%QZcQ_ZiQMqG->or7(kqW?4=M zjYDNQ06%o81}CRJ6C0&?KcK|e}JeU~KYf4@^h}VJrRJmQ z7*ym=K~bgTGPxc)#0M-!a;rsWhH(}`4wx;maYlhbCR^6taIXLIB^`XYGPNk>sEaB9R6D#k1?AZ4evLXEWzI#B`IH_$+lN0d?nC8xpX7 z2igIHi8avg-}qXb*mpnlC{n)wKptVXNCl8dI39yxubIW0_2L>S!cJfeWIKgN-B63x zh06iOfu}_KxjEeV!=+d&hBwvGf8rMj*D13jD^|;YWmLW&4S}CDvySY=dqL$dH@f7> z(8)DWc&mPX{x>U=EPoYSL-=vViV>5m-%jC)YC#X2V8^Z%$VY9e;?PS~kch z=L<$&at)qh$~uUw!`9`n_JyYkc| z{=gO?!?EtXs^u`ZPdxHRz~;HeoJGna{-<7s)fo`wd4uuEzmi8?myPZ8f+JBnIk=fq-Y)%Ch^^L3GS*FdQS;bQgr z;d_u0%2Oden~}}fYYqYu@s(Iq;JEc@WEfLQS`SH5Upe+&IbDnXaUeANn|*3q7~Pg* zc?tIg?I=oXQF>eQn)I3kv@@qBaQzPqsH@f;L9#?$eb%W2d`02nqq7;;sR0MU){GmS zDZk5gdvLk4aO;8(#CO{YQ5P|rXf+{?hI?xg?_appozy4I_H6x$P@2ujBi$(fMsy2P z)v_zeV|YP|a71Xci^B05!{6kVUnf#LpvI9 z>3a8GsI0BjA&gs8S*N?3Fe7JJo}WLr2Ef|iij4)vZo82%qqpB%P^MOqcQVa1`!yW!u+}#{bJf;t3;=RpbVM@Ah zkX6cCwj=cV8Wh2ZYYT!1llcwxAaAUrN3jpVUNjY6l0@*=^)g0?rY(!4_g_h4!f%=H zr$J<*ImXq%{MU~rjCiPE)dikrU zhtDc~2099w*||aFbn40w36|TOWw~2*`-<=`oVJ8wx8WdZEkJ;-5&M&o)3V%MFwT#` zw4E@ITQq*i?2w51r+X~JIAzpq`dT#=p{%98fO&${9u|TF8)IgV!fx1#8~#gNL1*gA zLdPw`FD*BhiDu_jf081qJ%Top1@mvF8Rf!UNolV*4CA`rgnrmgxZbwa_EH-ytWwFO zV|j9))^(}F!V0?5$%3C7`S@2U@!dRHj&u8)fJMW##!t?9Q~%QiEL(zp_;=QG!1XK@ zG4`kb6BY3`Y$k9ZN4ZvsYv-n#y|o%kohUUg^Tl+20=>!CRLWOp%7WhiJ3%4SJfuUS zQ`>aNe<%m?r0d0MF3yu1?Xx{)(cWO(9gxLgFb3RAO@ENnHw+V#BoCQa_#SRtLJ z(2I`3x;c?B`T86ty$Mo)^{hD{>K()^zhLu4Irq{ZiyN6a-?y$JqS@^uPuy5l8<0?{ z2t~FaB(oZz%p@M(=r#P-oxx(Puuz)X`IWzkSUP{GYgZ?@ljtYpG#BOcTYh^B(&cs| zvw=UuOIE>mj3tf}r(qA4^2owGKR1`|Y1G|U4zxdaT|X11Q%!8vD~! zIKWOTx;~G_Kg$T&@wN}wyruSJcfMfr5iy0LrM$U%qyKILmE)0y>g<0cPVH4e295;b z(+hM9veIgX1*KeH)mHk6|8Pf{p-wy)$@-?a_Y*Ijb6L5{XjlXhCI*wmHUuJL8+ zemh!#zyD(~I+9@q_+H?fW&R^-de*T&HXGlR`yS4=(2t%RUfEm$+aOc9)Ws23(_+27 zf462ESMR#_!|oC5)q2UU9UQm!&WCRZ&_W((p>PJiezh{A%Cx?7=<=`L^B>c)b00+I z0zvp6ffpl^lH2yAye^)}&HOaz5q0vVLSNav3;)K7QYYW*;)--3gq+u>T2r)N=zQ&a ziuyceL_-+@#?%!tmNouVB=f@ZyjJKCm7-CzGEfAxpCaQFkWp{ts{)4~4C{${%Dn1a z>H9x#y9|2oO+>%_sP6QPW_r4Dw=@=1TK`Z@aN=sH-1j#9O6Be0Gi#Ylx?pHU)VVO5 z2|`9gm<5S}lz@S~Y>zABd1igCYrfW)--O{U=$cP~?0pO*v$f#216Gj8NXvtPVgj5m-72+0Z-(1Fqm-jnhqq+ym;5$Ol+RE!~)C{8;N`ay4z ziugm9>{}9cr_AjS*Q?oUO&C>5CD>Z03!DH`F!hWi2K8J;@M^35NWu6+-MOT}IzuMH zyTF0$lVhL-{GXn}81(&Ys}J7@5HmA)QcQa*O5E=^;yNGUpbwYS^nvfT8WMn@7MQXZ z5OjL~Y@NSe;rvaqGea4VmPY6?|5`w^czQlCj-G#C<~P#jQWXk`ytj;DhM!1~zl~e@ zsCLW;XwAN%zXUvTpDr<|H1z!xaj8(Ag}Mvu`p)O#C*s+X`V*6pzHRk?$5nr+-^Pcl z=1u7{Eh~=s?k%OzFfK6k=N)Ym) zvLLLx0$(@;QZ9CEWE*P%EXF{8VsQL%b4)v`bQ3k`!eQ}Ou7%TuO*9POeN9`w$(AeP zT&jU*8xV;C6qe1nR}1ygGvH_)GDMsnh+3k?3gW#FvUQpr`U;K`b0=_unCY$T=wE8% zfr-e|f-C=|>So`^<0L-m5cYkB|MYYxshj(J-Vygn$M5`_sA-6C&Gk|1sb)u*<(LJ;|9q#e$Gy6%1k%{N4SkJueQ0;1r zB?uxRp~w=Xb+dqm{h_DsynoHY+CvB4^kb2A0abgcx<4pg6Dy5B;q@!tPFM7+G>k?n zrUCQ3o3_Y}?)e_#&R4<#&bc}%3bNTXGB$VGG7{iDiR%K6i3jLqJ48V!)JsiNmP5pfvZdbD-sg+=;YY`>-Wtj`DsOS27VLAEoY1U51?sVXAl>t><#Yd z#-Pu__h9(HVm-?we#a9&>e8Dh6hj~y=UZ=I;??BV^}l85x?KLvx&_@8!qf5yHV|w( z_2mEahJ1^#?j6DrOW4^@eXGs&+BuJTnc?tl9oznEvhmzKG7%pkS8lP5`NEPDu$Ee_ z88mj>+SgJ6;ga(*PJYeM>USqCLXN(Z1S)%)hsEC?)N0}z)>Jayw1}oc35$U*lhXf8 za0$@a%mavZmd5c2)fOx_HBSZjg;qnaC0&*Uen|a>npRjchRy0J{ePC`OTek{nqHH1kW$$vKJo}!8PPHDvA0 z)u{_fy}v?zYNkUSe^OPaDT28!;^I=6bm6dJ;C_?L|uI<9?`XP18AeSdZ3;*wlG@d9HUaCVO^ zC~CpE7MA|3`ID=X=7BG)&4=}%TE}KQRod#a+zlEPUisp-^iz?|R_;Jug}!Y5&cg@s zjW-^6;#RETv@Pwpgr2zCv1ADlkm!Fe0)4AGomBamdij&7p5fnzfyUM~C#b>aOFYB> z%7MEM%iYy`^Do-LFBO<7d1nyPw>`CL4z=R8zFhNJY^izc+OkjURRgB&c7k`#P4J;_ zZFjA$L)}h<-`Z2xHS3+fTybDJt}}Mx=&|V1>uG<#Lzm7XYh|;A0DIZn_oWZ$Te!La zB|0=Eac}i2oT4Bfi>BMBwr*J}7+SwiaFG)ezHqNGWnrSi?xMQZT1AxHto4;TKzgUF zdS;e?GJoxE)V6%;@>pz!-;m|h(d5QIbtY|U*gGg^fd{H`F~7fJ{Lsk6x?9-EuiK3N zZKBmS!vc?PhOERSt8bVnNmBV+fSxUGKpbxi9zNm!3|&PUU;plrU0Z!ydB(mqBmIdU zXwp}U)nGURV;%XNy)h9M`rH-x4H#Hfw*(BGS@@~w-gvPEjB--qhH z3oj*i*H+YT=he>u!_%P;*mTTs+f5E%<;+oTY(@Q^!w@;q~OT+`{9HfY2051kN)z zj?@pS(U)ekP0bn?tx|eZ4pl=&D-RXZs#bb-1n#DJ3cKL0=fVQg>ch^~E&^!TM)W{p zlGrJzL{Up;MRiADUd*xOmPnAWiWT;de!WG+PG{ylXKtYNPS7bHf{|M)*gfpoQNb%O z*iITOT#T|KOsD|m7;@sbI7D+-?Pwgu?5?Y6hY;a z&O;7TRhQrVB&tj&Jg|h)20mamklkN0t&AZ#%uqqiYmS$bkhOfpj`h--MKY8U@`jY2 z3*Ve1{;^jdF17p@l#TDv|Lv>7$4t^G#G5!GTm^fIZE^~$vW#t#7Z$pUeYJ^|b0yf> z9UNfBO8c~_NUm;Wo>3cvIuMfc!zl^1uD<*nRsL2TK_xE6(ym%i-Em9UzfIS8{pF<^ zZxqj|N*G|RrdIbIVl=kPGu;Z_^XPu%otq)I^vw=&P(>wG6$6n6r{5X1)2X~}fTvaQDju*p0A)Q8~kO~CV`e{#}unpDzx)H*79Y)h$nXLRtN zwHLj)BYuRY#f$0?)FrlEAkb1N4;p%e4`Q6s^ZNUNS6w6KcZ=JC`5FIG|D{e@=FD4y zuS@zOw|45z+J8ox$W;Z;P8`b(H;OwsReSh28M`1(o~iR4O~GyAG(IduTYTy6R_8Hr zL}m*$-l`Xc*rLCeytd^^4(R?+^hlrQiqP;tyIu1kVubgQ_)RBxza6cn5 z(36s*Sv7H@z3k4GX^5>q&hLj3!JWL4t7`4WMPXy4r?#hK_7#q|5efLfD$FTnLm-SX z?N)-TWOJk^QiPNXMt>-iv=iJw_wS5nZ+UsiO+l(+{Q~{TC#2Z9)3*g``=o*C+FmS# z4Ox49lJ?ckQ}&8?ndqax(vAvc;-`ywi6I@GZohT2<9a!2WX8iBCS+Dl^AW&$vdU?>5s(_0rC#&iKnf5)qWBMg@< z8%W2N5P$H=xlfU%n1zWoHm*HpQ#l5*&nV2dQ+2aq!-_y`cY%WN!mKk6@t0Jo?!ruro4zzML|r^2VlTLp?Bk zcWLiTQf}5A!HT4Zl4t!Vkc@)7*%BzWGDCL9gqZh+IJ~!)b(GR5#Kbevd}%zCh6{IT z(UC#nzr-yk@~a<*RH(~J+24rgBzELIJOr->sdYwQsPp{ao3+!*O*Q#i+pzCes|gWf zXlay|&_^BKFk7&p;t7u1%6ZazABedcb6C_&%sgR$6p3?4~PR!``CW zFrXC!s^CDo9xu8g%^I6!9p16jydM3xt>WnB{aEPNxTB5-R&?Q=YXErC;(}c~QWYw) zE?UJ){!71fb{**|_kHr&G5LQ>*m@mTkNzizDBo`V^`}lM06Dkv%O3wc_dAs4Y$aE! zr6o9bhyE^^on&hs|M?#^NdoTFctngOQ}dMbPyk=MRhi-WqkOQb1QcD$;$mPG8@c+4 zXIE-;qE6Z>R972QVG(TO$bC6W{hkV!o&w!9Z#GP?waWRAk3<)%w&}eQYTheO2T(!- zB6M-g8s6HZEZm9@Rl$KugQM*mqoJW&HyrrK*LMOX-F#qBv*kvL%wYsyV3qR=on|(L z2g++!!N!$zPXJJ)rlvzP^@loFqBu@=_FT&Dc~_?5Fg^yBjbBFB*x8j<;*7Sj@PW@shL^n~Zk^;D=zkgj31V*ub* z@U&?X6y7&G>qFqn4JE@(*&&*Niw0R46KH^fxFEOV^Pz}Q5BN^N?0I5~jWH4&w_A97 zy$fXhAy{`{BO=C-t_xoWbV0sU7PbLvMc((e%Zd5{&dTwF_J50Oav{Y&D<7H}iMr47 z6oT5XbsD=>@CU#c2e@hCtp}_}I)R$V>u}6lCc<6jzf$^;!n!lj+bLy9SEfIAr1B!& z_fuGIq5P81N6QuH^05sRZTyTgnO`YjtYo^3SJZx2g%v=eN>^JcT+S2XhMACQ@K-Dl z%lgYp5El^E3Ew;fqz5#E;7q%zvSzX9gTQ+cbLY2sf=LZ6;T+&3RVWK4%;H|(W=Sp) zFngJ#ypDj)46hAXSOE=q6<(aFuC2*;;cJ1}pM-83j3@J zl-F#gzWR4eCvU?>?CO6a8V)tZi$?>?Hb)hzW$aj8uuSjr|7g>hs#nq#G*&|0&Pq5y z1iDE7Yks-@6clGh%zJr5W}*eNd{jL)xREydRz925RD2P;W#wPgrN0(Ik%z{2c5bG% z`%m1@gf>XpC++R={Q%JkNhG#Y*bPCslU^oYP%G49`YPYG_}d5GS&f|Uxar2O-v|pb zJwn@`>%sl2tHg8ZS3|yG!(}j4;nLl+Y<_d~f-P~Ek%p}5ZNu1>Wc_Q50Y0wFJ2@w`$cEU|y zZ3&)5RAU$Rv3KH;uws=ciU!#&y@lS5IDNG(Xl=Sk^poY2VVw{Ww$f4 z1&>EQ1a2~sWq!$YkvYsc6#THm4wAs9C!?MnCB53p;ll(D1Y2_h|8tSMH=`ge5xSl~ zCp_*1p54{-v>K4vSFQB!RLxK(C(rUS(*ZkAV5o8y;7Iwb8~gwvV*Fx+0v8}A4p#qr z&ykV=$d9V9h2**WeRn6$1vBwXink zlo~i3yXIL-)#6Xkc(3xgrG_o3MD{+Ejaj&$icLDC=l%kG%_1dW0%M7aCqh}^msC4d zXIV}|fxl$>`xYb(SeLp~7oMFR`DpndqRnhHn4;4M&K+JIR&wZFN;t}A)B6 z+NqbLh3%I~5GnAvWX47>GaamF$Ytsya2iu~LC^hmHTJyL^hXJs#iN%jpv2DMsc*)j zryN~?Ak=N>Pm+p4EAA`&n&j|@TU0Cl#(bur8N6Lr<_q1v$#fi za~`jC@d(r%J<4|&oHzjkDo4rLtgty;c%(eGr_7S4czLo1Q^qyyVK|EmQH#7kBQ-#} z2{at-Uz;Q`;gS!5g=?$CTblf-k+LuCGBvFK{)!SJW}dQWC=TiG-8*AB$84Cy0rknp zMV5u+u2hInetjQ>Jix#iX#TfM9XoYWw3ffA+kOQWYaFoC@!!VD9e_6^I{*uwc&p@n zANc49m3hgL_G-{LktqmrS|FRC?P{Bd|fxfpC77H%Iz zS74p@t<}1=xUjBlOf-r7x$pJN!&6I>Aj4QXV;1%!Q5{-YC?;ly)-o2Y!s<&ouU zzX}8c-y=_=z?mv^#c&j^i6uXx{x7SMbC{yOu{Y|(bQu~&ry{P7S(z!**GI0694(j< zbb7O=s6J|8q#F@1F_bs>TYio6%;1bwuvZM9C4#0N=>a9-=bhs$4W<1#kcl7?rN8xl zdYjjL%)l+)en0==@EboEB`uhBe;2-|y6koCq5}%9yKdVX${lf?iQGAY-ZG~$Qd|SZ zpijS9SUy#N>@)ca{_es%#6@K?Y9mR%vs1r03M%e23^gzOFbaTdqAl=wo2FI#x$({4 z%TBpoKu@RKy?!5<%8ZenC7WwwL#zHeEl1=+blMxrhBWKHWm%3pz$;}Zr8Me2HKKFW zNjte7D7AZ=PGs8(`h2);i>e2vPWWV-&j9=8->rn3wksz+`Wo^8V~1ja_07Uw(xI%^ z!JMoapF?}^+Wy`d?QlAYVApMzMB2UGfq&TIpdi=Zv-@R!@W6+JPqxsj>7QEMmw_K+ z^y}u@M?UFo(d$+d~MAm~yva083_#BW90=gkE6y{BMbIo)#5+0Oamz0<5at(|iQ zC?tRb-w`54Eh0~&nhW|#cl+NAVO?c+c+MM#K1gc#ntqmFhrWIX1wh4H=I)jev6I$% zu>3HWfeH@t>srrr#VWZ-TjNy~l8Y~Bc$&jVl)Tb4vnZ|Rwzms6 zYs6;+`>F>o9L0gCNuh$V3)s(Og1ChLz>DG4|1=KmI08$KI9W5(0vXo2E@-g6G=p@E zK(i7=z4@piY(WfU&J9MGZ=vuWOSi93)*PA?JW_+Nk&e0nxmmsLEU9{Ef(sOb})(LyvjV+1b zspVS>Xv<&ANp6^-`*k8tX1JHX0ccB{`~#bx6e)WJvVaNmx}~^k`2NPQ1AmxK=t4qZ z3v>7L<>g0sQQOIhqqQ$*e405md+X&<-k5`gf&nAhlZcH?IZs_CSrm>+VfFJI@YmQD zS38Ji$V*NKt8G;v38dNrTZ%8ZjabAtxLgB5T^>-SNW-AWQvL_YKb#5_d|`1%OuhWP zGQVterxJI4q+J(MD!GZ&66Q&8GJ;nIYSB4*7Uu!I8p?j+--*=^Ivnobe@CTxv60k$#?x}r8$Y$ZHvnQxV@x6pY zKV{aaO|o0Y@tFurd1rM^Tq5pxDf#LW=}Qf?ONdyAT+`&vz^JiL?84ixA#@x@E5rC#EgYd|%^Ba1Tj? zWpi#{XEMp+yXredePLo~-j?%4(aN84^vfF}jJDyfUpxqZ`8t_xxUFpmB7$q0U87Ou zoSEogW`Nz}S;g+?)a|DL$QN(?EcZR!b?kFSXB)s}Zsjk`5LPlwKY!f#Mq=EVqK z^&P0q<+E$6B1}APh5>HNr9xEi{nk{GrcH6fpjqpmgoA_2g+))gtVr~WDNvjZfv&Vw z>zd4`pC4iW18*$OGJ83G=FI3WgkrGSM^{FM26FDt!;A;X1%MTkoBf#4I<^x;_mU(t znFX}u?>>&($$=*2I#&|@fgRc56du5^n_Y@Yf1SI-{Mn$z`??(|B>04hj|H;0X{ zKj4CqH)4OK^qHg`qh(f(h7*fj@+aAWldqA#BSa00UuD&|d!gh(%r_Z>14s&z(hgju z7$7LVQK0Xv-EA$18?dRm&WcWoZDavZdgDgguM6&U4ou!k-tPl@`a{PH0cWRMCNI6D zoxOQ!77Q{$4Q(7K3tqMAFh5-o&UhD9Me^eorOYR3bh@+&gc(WJa*JWERn>fE#bdtZs$1$o} z719Dq{#$droMfnl$bvmy5=%S<#KFmL?CG%j8QKzU@XdV4ZzOyPeQdlAr820Q+h^E+ zX+6_oKSQ)-#tV4+5}U@t$(I^QQ`2~+4zg}NQFDa)VH<(tiDFKKA0{(Oh6s?>aAFtL z-xd+~$=m<{=zZ5Z9~Uk?xG!faeGw3+iWw7o)Eq9T)o!`7kIW_NpY+xtcu1dlZ4$wD?a@?)U)u5QQB z(B)Y$_f6szY6`6>Cl9C;3X+M{IQB}>s0-K=b>fk2)5@ZG%tcnr2uAo46Wb4A@!ju7@o9$HX0}*KCa>MxAGlc zfN?&+RM%8ly)j`v4Yax*dv1OcTsB&&9dH!E5L_Ki9Xi?7nR) z-EyRr6yJO-^e3A555qV`h}UK%d9z>f5du>=6bmrG1z$fxP<4c(`Kd-LD;Vyi;Hj-> zamROHZzPXZR10j!Uq_&Kj-d_9^i|5 z9&lf+h@A30^al8)LbM;&uJlxXq6cw=>4BHs>{zkS_CRGFk zr!OHxP4_b%PZz`sHL=@3Y>W0a{&T9kb(a$n@iPhXuoXYW#{!p-;K_gk7ddEVeKpJk z+`lOc#DrN0%P=GJz~CnOJiuM97VDFNFqAFT5j4?z$-CE)3>>}Y(yGx6&G%;>n7wU; zGVMFUEI*nOBH~wn(LdTHC7>?R86JYI{4k0w+hFek09@oTUlDyaCmP*-`{lKM$k!#Q+U#CuHAWdggb22{?I3PZE^+=qsMsAk!N?(* zw^|1;H141rnh$I0O#ZFJ0qmnIGlxVb>~sBXCD_MWkz&zcK&j%m2B#e2{OQtjLhB=v zRYzIgZuC_BpL-nLLTTvaN;s4$=J_Z@)&*X(nbGOoxq@1vJFzplHvY?($!W9rg^#n6 zF~EG;blD%Mw^8P6-2yF)lwgiU$lM}EoT&Ia;Qo=BmcJQoud7XEjn<4x`ZBPyN~ZqZ z;oMT0nR_^F1TTz7kA@{itVqp&Z{Dgjr|n88s1oy08ZboDv%kMEk9VDnZ2JM&G|Ykh z_a>WBD5B9ZUpnL~l6mn>97Gp5B$>D9*Q6bVN30?K>>aDwL5ltSPPt9_crGL%lJd53 z`OL!2lLEpz+NtrX_y^InGw7S<3BL?84qm)ryza|IB4*F@2jLBt=5qd$BMv|>P3)C| ziKCkAbF+*Z2kc$iUlLX3)n)hoL_uecvy*f4GzvigqA+N^;g{3+lAMtFW}umP?3bpi z+DbFA@ThU3KR&#!J~(g(ZK8WB7XmZA0@Tj5LmZ#h&6p`jD7o7Wto2T!h^RYkojT~; zlx-_GK*!ludSypyY|w>CMee~8c4Gwby7Uzh@J05ocru%a8pOAdz5CAPoLrSw?%R7A z-i`Fy1UNCg#HzMqxLpZ&6p`OSWVxdZG;J}5*C*@*qLty^{L;g+E-qDkO7Ww-#f%Ca zuqZ~Vx;W|zOP!v*d~a9>S(JU3P& zdP4nAMvRVq5GVgV;4v3Or~1n+eBn}m2VRnuN{*>*E2X?jbNcV@r%O0$N%75knh-Qg zyNxcLuPgx^ZlBxWu+D(MK-(qxu1MR`&1{2VT}tFeC%{P&eFq)J4{x!;%(b(MoIX^I zQ%)pS13ahqprv_MV8uG$mpdnJF9=WRe@AV8Z;YIvq!y*Ua=ApYri}v)GegbbtuQM- z316P1wN;wwTqu4cQ|HwJ%1x9|BA)Z)bVQqbOnhm%|I{=KM#waD(S6x4=G+~)? z=-WmUmfl6fT_cssAjGbRgmF`-*h8c`YoX^~U+-cjdi3=5L-S1MX^RqKJAVsEuq}7y zpJEFUE+6XtY*u&Tf7e0nBdshrIWeol%hg|1tH10$R;;;w;ine5F9#B>5AGyIR<}w$ z`bHig)g#Mi1?6y)jas_v=?(5Pd&7CL-0JaXjAPZ~@kv%dzuj$2ndDM|c~=T?@-3jv zG;C1{dpzzAZTXUs3)1(zCiS1injBKgNl7^S>J ze#`(q0G{Aac;sT9=cHp#SjS9}6LE~+C%_(k(ZK%~k`OE6cqAb3FfB+s(?pv8#@}81 zzZuVCV8(Mcx^Vk3pnqa#Lh|}Vqvx16lHk`{54BLneNm4>uJ8&57L5@8JtXEeNt5Uj z8mYnlOg*s3K-K399$ergiSnw%tu~y;Ohv_L#~EUE>x*jmCNeyE`LYLR0bTa9x;&xnM?dhmB*+;^fmTSZmJ2-253 zwo0r7kyV-eb}&bBu7rHzsdz;L1p$=azSllBpH|4dCUH7_9-eKE`*%uo`B(78>cbNr z8ES{MzXIk9nDE0s;;rsueM)}#=988|e^g9IEGknU2(-sEr@Fs_I$rUX$8Mx~v(%23 zTw#KKxhTcd_XRvP#$}{7GPfKVGT+fDyI$!@93(rLk~)3vCT&wWa_o-n&j~`^hrT|Q zecU$S4vmWR-_a_MLN-O$KHNl!K2+ZL7q*~8cglxD{^<0j9aY(jv{gR^SSZ!wylVRzK6f` zo1NO5*@Op@NK>=~=ga1osCt)u?m}-JNZxyAh3=e0$hi=Ro(}EHON|_Yf#YJ<3YSTB zsn=|^2P#!dkS|mh6EikCkM1?4=B>klroJX!aOOK`EvjxNe;OUWaA+%d5*j`kg?jLS zq0R~jW80G4vkw1;uOe{iiwZMd`!O4#A3+Uxl#gUX%ismL@&<(D@JvxW%p>QKCRG_( z3S#>-nf0iQq9A#4vS9~C)}v72<=bAj9k%;0srw+7zL4ab!dN? zc8fZNmJ%w#jL^v!8?cpKHnv``bs>26%NYqS|i5NOWWBN1&TszP|4AZ6klMpGK>| zp@X>M-(F>qEi}$}4_}MpWWhq3>5Mn*r{Vk8`~blv%&P5xje7SSpi!)ry96$sdrHJz z1F}mQ<{IJB(pm8xx3c%*fRRu?lkIq*SxlS=7;p^8I78F|9QkqVXMJZo=+HpG1o0P|T)Q^dlqa&rFrP1%vNIl` zYWFlNZVK;-t-rv)IZ+JO&?ZEA2WBag^0WX2{o(?kYgn19a+hY&qCS>HWf~CEWol^* zlnUJlCTpWi*?X!!XTIHt+b1EGfIE_+gn@@?p_*eK`ow}lzK_Xk-g%O)huCMFND50t z^Z7}0<1>LM+50RkU0n7OzMJE(vnVFKnf?-!BfCJ(dS3PvW%~3MR_Fh)_U7?Wx8MKx zok$2pQp!?7_OfOtl|=R>>m(#wWM5{;5|y%K%Qk~Tgpqw2GnGOHBV!-?Huhl#V~pYV za=-8U^L>2(`F!vD-S3Y)@-XvyUDvtJ^*rZ1&$+JiC#Mp{Nr~Y{HaO@2O*k`76HkF# zmG6fc)n1!kjkDaRtUZ`p$%4s0Z@b)`*^%{j-;qPAV6Rk{eS0`qLi|1_pX1_`dUo60 z!Rb_rRh2Yp$nq=1Go1}wM3Npu7u7^$-wf^oWw%H_la>92?JG@vk(R5ep z^W^=JYXf685Q9O`JH9NWRjA77c7P-l(LXWO&tKXN+^Y&)6~j2(Woq@sCH>-6c{*b6 z&~EthLD|7|#QuBFrkdcq;y24Oy;&jqm1Xug(m=S?LCxMidW7OLqEy|#Zt2bM32UIvgq|3!c39j+l@GV!+_=f?Y=z0p{UVVoTL{mmh9@|k~a?U|5!K&=ki~G9q?svEZrQxk7wm8h%2ei>| zIStPwZ|9KfT*>?9*gy8swS=dX1(2R5U3KD&E!XoUl$fPaW;J*KqX=>Gz zcN&=GpBm6XVlYy|r9o5?If~-p!%k{t>pDVaA-y%|mn}V;o3qvLKo?uH+sy4Z^YD98 zL=vH4YDa8_Z1MB|LTVe+Zq~7Z$uUnCkkayar;RkMV`MLW_vF-(8=;*-1kb) zkCPDy5GOb;PLp_hjQrl;rvbA&As>#JH0@-6jDqi0n5#A%p}ez9oj6t30`$wYTtvShp;YrJ7+aj|Y5NQKjLHI-zV0jKN zKF+R41CGWe1pR`SX&Z#%sg5;G5(h>;tuw`a?)wna8eWB9x1C8pb)Z{XaG1rW>vWHKDl4m&es zm+#%PlF1k$HI$&HE5pt)Q#itaf9hKe9qMZAG#xA?y?Z<^?|?(upP1P{8}Rb0Hz9Jw z$e}Zz{kcO z@noRZ0XPRVX76*2n(kTFZ5lo+aSZs>Vb1Az#Am$p``OojUH5taDxHGM=gE$md`Y?p zPNfX#AA#ATl=r%GLh@zjU8Tf?I-4}1))R^*^8OL6-~KGFOFTgrJ3e^%= zaV_KmYGLiPmbKYQ2I^-{7JjZKP2*FakK)>H-ui50MsIxj{0iH8&Cx`TlOME98e7Q7 zM-724E-tm*YcIzpXq3rKHQ9-b95sCXL31tt3nba~o#6pjjO2j}qJHei=Qiy`>49ja z+X5G6eZ`22jOtr+*^VviiX|Qz(keMG^R{}u{C@4P$hE9PPV2so-COk&jv26-*sRu2 zS>+8$cX1!tw#kl}@_KevJ;XLZxj%2KpIK=;Oa8`$)5+c2jMUKzF2CNKT3l+1Ll0$y zl5t^#I?{++1oK&gLQzAD`X|cVk)ffO3AHi|1BCBmUC6L21UZDyh1g%_2^p-zHe5Y1 z0mH#s7;-G|k&W+I=H+k+Igies>N(Jw*}pYn;PUWnF!J5tn`DEZUty>&h#N*W$3Yl6 zvmHFgJ2LZ`wCY!)P1s&Ez^$(I@WtjxWjlQMX8$-mKzYmIBL{3B{E>^+@s6sAqV!t4 zBeAVQrgOZCn$cKb#9aMX7r-lfktbG3Ey}pXJ>C(#-wrK+O0vbrifwxO#{?*~d<(aW zMkbjOs6CL(wdye`{@86~4cFe`gs(~L4MsE{oSP?5Qzw?Y_eWg_EU3k$)O!rb67vF| zA02tHIu9X3l5aYRWLb#~P>Y!#yMq$7I*9*zl5s66KZJJ(b$*0)C}8*4aoR8?;GG_N zm7u$Qz%q=|SzNZqD4Jq-_Y1=ft7zBWFp{<1;EYt?T;34c3RtDHZf=~^)mOb5>#z{! zukub~{5o)UJScX2?mv=PYcr6&`Nt7@8PNwY-&#YIt4#*RVn}qw!C^n_N%+B2_Ep~@ z8a2wlH;>koW+(j~TR06PQS_)v`Y4AZ2O8CC_NY9X+STzMFBK}usxbCR;IdtccG;cM z)bQ1(lzYn?!;c2h+tp(U6BSqCmW6N)+AXN!k16F5d}OoKaAqw{MxRF5+E)Kec>m{b zvj^}IycS|A=1rE3)fT8Mn#PY|*!YZFIyuovUBbQew4dnR{c7ISbD|l&T5b2kAT)LtU9La?tK>YU zg724yzpmgLcTmqpLEn=Rt9}ZY39#6g0MKPB=KC@l`fQ8H7Pss}-B_Lu0S|n>nqcU7 zIsg@LKaqy>^nXkRR78240$h@E@yPNN?=EG*_eVLt&K5+LV5g}jKjj~k9oz1@N~Ozt z<~@s)%BJFIY?(A)iAJ@XP?3Rtw$*FHu7pJ3%ka3Ic>Ij&hdTI!!9aG!tPZeso}u_w z1D*s0sl{Jh zq%UgIpVa&#LXIJuT_MwxLK7j9A`3S6M;{bf@o@l?y{NwP@fjIefgR;XK#-s3NWG?Ni<5>iHp8?LhgvcyTOC$&5B0GnyJCXC zzBCE-8bqfh=q3!8p9`TMMd62UZHENK4%^$0hN<^t^+8~dsC$bVmnWMED{_Z#ZRSU` z=#TO5hE0Wy;b=}J;W${}or6E;-yI0!a<@SDriwe^YRg7p^N%XX&w1xtXj+LFd*{EG zTd{8JCne@4o-wrS1Lyv++jgZBXCI@IuF3K4o*EqPvw{v{mz?>^r@T&o#?GI=lMT8g zd(|`GfmBqm)1q`iAu2nYZNdPDk^Z$Az;5$dNKn07y+63AE+=4IxrNc`_NI;+E^_>? zk7Mvc)L0U!2D@F#BE!qko9nQ^t`VRN18-4y2;denP|y6+KnLj{N^+b!hSSsQ1{p-40lOTlB(2B&$cVI3QJL~CV!Ui zS?p0fzl0f{e{v0*hmUE{t1}EuXS^4?``Uw$Q%eh`V&+__wzV4S+)g9Qu0~PHZ(kLl>8NE<3+%*Q&#wky&uD$-CiCuCPwPJ!*)rb}dGPSGX9Cx*+Z{bwk*zpdzVCr}IO$50mx7oM<;MNnv}2?yk7 ze)bwK$EE)SO%!2dmE<}yj@rh<{ECvBk>>JWEDK7^%FKlJ_D_!#Aq^K5dzT;|-Yibf zPeG8u2?=w*2(k7sk9)EE21)!Hgo0g?=YmzfA!j&0f#_G%jL~S)08~Z^n{g2QmAdDk zyc-;?^OIN+K5;@#`yojB5YR#okZxobDoM&^M76o@pc$t=QKjZdZaH~`{$zW!<^ttO z_=JK6?>ojO^)?UmpP<;T$i)~c$-KKiO@p-HK<7B;#m(<(U{ZDtxTE7miR6qRRQSjY zc}?Ry_M&BTf*=92eEEzNXBdr`h=<|GxJAs~bBSIKxYxmWV)vHr zCe>XTJvJy}a^%|n7SSH{4H_Th5-yQ}zcG7-19T8MuE8)iJ|3Ru7_TZVqsB|vH<%Aj zL*sDNA4vOVzQg%&caY?M;6YjhP_5xA?U*!Th15b*?UBy1uXRf;wQf?b9NNqNNi(US z{@6cQI$07NzBQX8BhS0raCwL1`7(`j)^}|C^=mg+0oQ4j>SA}^kJBYkJbCiid~2xW952e zDs;8@OwSE9V{b`mti6izDl9kEU5dr)PJznGaJ3nlu$bN2>--&8_5|A#)QC+%VYV*a z9Ds4TXmnRBqa(Dx#4PRAoVZiI_O2#ib9^kH9ZV!Q4W`Lz1HUm_38Wu%+q9>wupKU! zXoSo>TB3@AnxLc>I*m%<^66x6fjfUJ6p99DXmAN;T|(*&LE?{}ZW_EFU+=?n{B+Hi z5!UlgbD8Fq!RWMn_0!v+7j*O#=2K0VS38bTjzyD!>1SRcON4lFnAWeTw{y|sIIj^4FBS$>p z0@#O9VC|R_PwBus^VoGL>-umW>&9>eH1N34Z@uxjK;kl;!WTSWV++^}Xep&4&_$}! zLgs15#)xkW3&7aMj;PzDV%9ohC@a;WXT35))ml#-${#Ql|K*Q}Y2gP^Az^KE_JuR_ zl)aR9+(Hkcz%4PXzL8*_aa^PSC(|UuSf25!13zsqO^ga}KM+=o&*=;P_j3JnO@7?^ z!rMzy5hnPklsTx2^bF=|MTOH8ob1C`h6E;-;V3>f!thntF^b$reEIjHnGug?7&ekk zQkBksJJUY}6ahY2@l{QwZylUlyL~z?pFmghA8(P&$d2%62=!1ItsZN4Ya*@{dk-$E5Si@vI=JSm900dC9|fSEsh@q62` zLHOk9SuDvfmU8#hEV@PymO=Wgg=E**yIR5wD{FTlbDZvD$@Hpo{LS|q2M&N63VyQ_t!Q>b>q{8GD@h$*@HnxjGs z3EZyOm*LeCtnkI9X!Z8EtIF@Igcse~Nf=Z`3khyI`c@TmewMmN!sNUPUCV{?)@cW( zhml6nv{vkJE1ZA+;&1Nh4371fjkk+~UgvWF1w7ZRYTI@UxI=O}ZhhE&vYWTjHzC$i zMo^11wtO}I_jKX-?AvFc7lxPw0gx1M0}3pTl?b8CrB6YdkEjv+f^OaZ?*Z{I9KCQP z5Zou=P5{3ht&d!xXfTR~ZDKM3_Z_*H+K|p1lNi!;3Ql?cA$h`vMMk1oQ6=@tNi$`r}0B z)@%5Xi|y&Y=_#Bye$Sj=;sC^WbNvUTj-K+0$~C?7dmBIZ!|{`|;-Z!%i3!O9po>ve zD!<`c0kUhi0)(a%>dF%E5b$5;+XjA9e9r)_aS=Luo9X0i-1Gywzp(1Ro%0==X9A!R zzlP?ETF6l(GMo4JEZS-4A6m$7RZ_;Gm)b4!rMMa6eh=h-+y{nt4SD@m@MBk~+CL#l_g8p|G;}$SmG3(%JDJ`UG<50HP z?=6OtIq*1(V7(`Jddl6knwj?B1FYO2K;^{k2j34}VAVoC^cB5+^7nSel_|P{?TPS% zaJ?NR?;WetXXV|@&V&}Z|K3wI1;`A?iF5n%Qa$H5X2nnPpZ`6b`Gd}+L@Vl;+3d{i z7pESNBN}7@kK+WZ?7!S`xry}qwDg3AGaT|wT7Lpw?htc|n0d(%-+9IuV3&Njq?stq zRiFpX z5^C_B|4t9CctivpK?b3jsn>`3|I*0Q<(h~ddxZ1z(3BP61t;$q0IKF=5L|ag3yEl& z&A$5YH21mGBzG?jI?yU!`lk+kB!rNLkqkMwL@<>ys z3N%zX`xM>r6eqyq2~n1uH-?yq&ZpAL|DC?IYaaqk zbVyeE<50m@T1Ede{KN@5=ey}|cjY_oQXi$xtq1fw4+^K|e6i0rf|WExK`3SI!-CH= zpC0-L+2yydDW8c1|5$kFedXU-;Mr%-SXUN{hyH-&xD?fS;)IW?TU~)2AjKHF-=(Agx>hz>j3kPjA5i%RLo`F8+6s zmQg#MLPb$iO`aNgXQ0d`2WVca4rh+hR!lL+1&nL~w~H%X+_*D73b3h70vFi+-6j>f|K%8ERQvn_Rt&sL$S~wKehH@s zIkNHosSFX{IC?t3Y6+f`X7j$5_^PjJgo=vzIND)!@Dg~l5Jv}gj-Eo?{N_9I@8s`v z|4R(H+UERtmG=4REY-lAQDu*?7_xrgUyn)rL!WOd9r_H;*C;^noAD8U@Ww`c?o`K@=!izND<+H}=>%3eW{_B67rnekdOdC^9G&R0V z5x11OFki(*Sus+nj6i-+b`}Ce{eNO7k#QG+&EQnQC;m4Z{301_aZJz zt;g^so>>+A%itgQTqTab*7C|JI=KB9fHbL+HUq`&MXA7WF}#z$3F$95X9P}Z3b-5! zV5LBE=p`VNclz7O8=F()sx2G+T=BMtEUDfolg}5xT>1i_gNf9`G;R`i&RB3HwY{=@Bzt`u;rxIrKmPjC570~hvr}$ezPi(^Y*K6@ zB=TJ+5&lAouIbhv5h(zm7JN_D5a*ml!`!2~PJY%afW1Ohg9yp)j(oz3(hQl5c%O7@M zIdCo8Tg~Fd@yA9hkt|X#I@e#jCK85SU|XH6_m%=SA|JKHvP;)$A*(RzIC8dM;h$-! z3-zkWECIvL>0j2wEXySvTVFHT+V`H>TW?|a`E`q%YtaD&+3N4Da=~0uI~D*v7f}Qa zxw{E6YFaGJn*GKieZsmE{5O>R@9HApbqHju1^Dm(@u%7w4|f)4)lp!RRRI4z5jB4| zkaA%*OC8df9W?z?*RJCz+jY&D6X)LcHI|+RyddsS5g-td|M~p_AOxci?BYhfQQ%LO z@HF6N;R&cgXN5tIvJbHCt(`8%{uxvm8AaUGLf*?#_!+}`{sZ-kGs74c?k|AVgfcx& zgg^Z8$^;1x76tZ8im2)ByQyMaTZX!Re20ed3L5}VuUgEn#Iz-1w2(S{!8ebw@}%^c zi`q3-gK1lXy%i2E9|l~6o{B9QCrR%b9I{YJ#iGFI-+tidy0WN+6w*s;|H{aJA?O+a z%wjOew$-H1ng7|X|GT~{0&1dX8Nd1$E(j!PmNQaXG1lTUF6B?po+%rhJ#oJ83gHA! z5iYixWv+YkyALqtM~7n`W)PK%O@?bB%WUd8regV};<%*^c1>(US8ICT>m+;_#E`j) z0eLh2-}2T>#N54lSfKL{pvZ(1;1)8u-T#&*k*?wFER{%}BhqHgWgG^0tg0N`ZC{sg zq1)HGN;)E%EYja^mvRN#ow@W(bK@l7^Qx9>e^z+~26%B&m!fDaF;m`M`0(=l&rLBu zww@g){;)q63H~gc@eZgJ<9xO00I1iWp5i}A0cie*Wqs)R*HrG<3#3Pa0l}r>)$Ihr zC2e7<&)mDVyFRrC$10rW?FBGy2N1V7aAVq%Wl);r?y$*Uh(`PFSlYCX?a*SF6n@TypJt5a9L z&^TvVK8W_vMS>Zo9UT+?&{AhVp8UVB``>@ndmy3i>SWp z(jZtx;m#qHy4i=h6DrYCVO2T7sp6Jt*Bo2vrKDY1&PZBc28Gl7dt=ogyME^sJnoNf zv8!zwDXmnrOqb8t4$b;qHHe`;CE)A_0&pBMK;B3O^7@w+|_v$X`d;H;4R8wX{D6eRMe-5YHT@ zW?ugv1$+Wk!0Tm}b-n&tkCUga{M1q}`#!k(Sv0>TsO(nM-Ckrc*Dr5qE$U2p`iAUa z$Lm|mGoJI&JNAeG?r-3ysrO%KPO$)51txKPZUdhn=7cO269I!lZw~{U@s2b}8@hDz z@}Qx?^{MDDa}rnT0ho+D&oRrQaJik^qlM!XKxh9`qY?s)w%1oL;M2exF};~au7ZFX zpURN2GgcKI?>lW8wJhFk=-0)_qgALQc?Jv=GU(}c&4b}%R*y@Ve);I-hRjv=mWBxp z=LIkn+vZhE*dl-05?Ez0qad5Qj5ru$*;SBDT9s?_-QH5ITg9f$h|-Dr{$NRrU8Au@ z>6nM5uIs{@7kVIk4%VOLL>#TD^zaX%6;zWRR>~avF?+*lHvQl@JdyR>%uV3H#?3MdiLf%QgSu> z6e(9?YTuC}#T8UaL1>1TXUcfxT*JETTad0Sy3Ac9e*cxLiz z)cZ6qTLNjW!rKcTh-p zG@u9B;nrm)3BXYTPn-pSHPWKyB|-atSiI9xr_IcM2a4a*L19d&0Smajr2q0jYRJ}- zF5u`oAJE9$R0)GE<)SL2JqnK6x1R6H5@F$%@@xDELLuec`tGm++t#(e#QfWn!E!rs z!1`o#Le+4KE;FrfDre$Vlrbz2`A32hf8Pc0Xn|HlzM+8YNEM&^1V_Gg#TF{nE|nC9 zNQImLJdpanlDPwxdx)71i$rN0hCkF`_kzaGWYnrtX9e)l?wUBO#Makb;uh_76Jg@A zk2<}fM;i$~a~(>9nsC(kV2DIU`9l@g-pd)v{v}n0kb~av5ZabiF;-;)a*r%_y1ifhIj) zr2s^+}kr^6;k5MN~lsWRhKfv&K#KXV+A_~U26EWQfq2XE=_6W4-HHMuah`jjou>= z0VF%B>Y$`ptO!57y zta47a^SirvA(mb?e&~IzpIT+oiqjr#gn!A*i7FnFiuO9g9#h+y(_X zGk|!@GrLS)v;8GtZ-hMwnuxQG0ZdO>Q9mUFwQe~I)bkvHYc%K@ai7c5z(teC_Z?oo zzEF3gc1KlYY2b>83%?0S+5h7zmCslAK;zy6aFnlVZ0#peMOdxrH%Ap(gl=UkJ*+0D zGTg3VbEw^Y8$FR8r`+Z~*O8JYyd`$WmotALyv?svs9!AY&G76sECyeQ3MzZWG~s%- zDVX-Ek`$jh*RJOF3hDL3ohLrrzwaRl*{Giee*>vCzhYy(JyFxh$Eb1QWf;XGO2^l?zlA z0zxnZJmMl#rk^3x``J-PWY%~3rHJy>`vF$Sn8f#6e$v}2a z6%S;Emj}v{@z79%7-l8n`@>-}ynjZc2x5mg5oqS7@>R46 zmYWyz4TzB>fUlKvmM~evugr7bPBhfc00xC1W%gBgD*wF}7CS*eKgOEs7To)AY0{vz>_Ho^X09EHUeC>pr@M?>ngEw{~gOYWl(;l@CzS8}2X;6=yF*octsze4zH7;BN;xouzz@m!u z;nafmFZlNv=U>zc#Nzdgu+KaT?tTuZ?@?pw8y4I{H6qMN*)_HUQSLl_KXyz5_m4XE!GLwBj1 z-V;Q-4SkP9_}w2e`4QFH0fuYnQk^$coi&JKjMsWA#3N3>Kf8*L2d^gCu<&j{K(CXz z{2b_woiG`t)KWZ9R0SIl0AT??WjsTYaDcd9&GBGF3#nx~SGTIAPNp=nsZ1^GoclC) zhO^bmr9?ysC-bz^y7_TW&FZ(*AUQD3zyz1u+nd>Lconalhp-5(;zl%ln2A}bB$rP}KIt%@w_fi?`S9n3PuNYU>eVdzhx>*m zN}IxMnqc{7)4mH#>}0qXkmJIC%=J#@)NxGgSmn7`QXiS;*Y;~Z$p2zJ@kH|8b=8oj zj|R-wH*nScK7;O6)8nxL+$#N_t|Zuxnv`V1Tt`=@MT(SDLH^@;O@k>mZ;uoG7iF(q zc&Iw}tg*L+b2fA~X9rlieSZY9m@f#uc+YvT^%n+y^Q)ehhH}}sqQ9${e+h+gJ*{j+ z0y3T{nLJM)jvUX#5$aCPSuu)=fp3lf zUx=j+1L{3@de}EZkFr0>Q5+A_-X3yf|5Y)vxriN$%Wnl-ppb^yw|e>W!6KUpYzGuf zxKkI;0l$DhZJ$O(|I*=K9qS9U7O(YR9qA9u=vG}Wt(q-wT4T1|C!&E)8HO5?)>_2^ z_dac^ZG7jfoCu@-SiLQt=qe!n(e>l>A<<%&T`T}{fcaKxAqhyT!4nj1+gn}^M32#D z{qXoI5#WdJmh{>Q|5-cfUEUCbHSx3_+ZeF%dSk;R+po^j7^V;f=E>!`?wyMOYR*@fOzZrMR^FD5SHV4cQteI{zWs8`_W@3?woC`r1n)<0)b|>CakP<2M8S6fk;M_ z=i}X4*9WDcf7arU4||HV%nn-|DtO|{55XnT1=A_cGhGMbx%fikjk z{}vzNbDWt3zZg%R`5rQ>-gbX4H0Sdb$5dLP5r(bNpS#IwT;q0{DXvuB;g@dJKzp=O9_Fl~tOGYh&GHJj=zQLk zZ8P^4VocIFJhijNbD}h}+SOKQiLxHfnT8&N)3`XdS(%B!Evajc6*Kpi&EImv6IhQ3 zGZQIlUR%&lc4gTqPt9w3PfiON>c6#$8^qZux9Fb_iUK!sHWR$Arm9C-8`D!Z?;nFG z7{+9{WoW$-fL-2FS{6X*V+dQFaz)>qj8MC~=e>iM*B_QO24dW+oPTYT%Z>@B1mlPA zy)W6aTOV>FA?FW*ZC3ASJM+w=Z)2se)o(mMm*4-Y##|0ldaz<)XPp5%HQ+fajKbJD ziajfjW2X3f7@M!Dp@RF|Rd8C!kitv3RIB{95=`=(d+kkHX%QypNP3Nexrz9an1L_j zTs8YD8n@Z(TTr~T9Hzcp!vi+Y`bah$GiV7VBNVWu{LJ5%5sm$5U0k8L6aIFpzWL-m znWx*<8O=`G^%|^IAh4gd(w4^ODS{JlEZV(B3F%)BGxbL)$mu2;$}<-M8JG)rj=FR( zGjNOU4{n3wLJODVU3+i(@p|$E{pv8+Dsx7s5dkD&kYvN4DDzo!V}TQ_hM_t@aOos+ zdMbyYI96oHe@@x&Ev}3ym-I7A2AJ=>ilH}AO9(m~QJQX)8uQe6{PKRUK+H+oyS zwuBEVzxjzlW;Sj}da~T{hO}Zvi4pZ3vwN-D-nKqvr>-EN_grH_mvp=0O6zv-M}sSJ z*MCLF$yL`pahyGhAJH9KnwxXryzTbr2II)4_Oy$}b%R3=75uolT4iye^kVPamt#JQ zPv6uTzRdQ)483DdUH&F1>`~XXM~a!=ee+HTmY`c6IRk_%-}s*y`XQ%|$_O@P-Hoh+ z_Fu9+XOM2Uw{w{jamQ9(XRxd9nmdR+0B5z06Y`NHT`9+5?@a2ZOL){rD9l5!I%I z;_aR1#os@sH`r#}8InLmo(m>-vrUym^33w=EUJH~Hw={Jz1j@*_AF%Giv)-KLC%<*u@p9192{*+{CEk}h>`KSrLGqLMp)B7srXF& zgNE=LO_Tsg7*rQ_=D9rlgZZppVaWJT>R>85J`NGnsIDM%VY;fE=Va*Oh~3HuRq9W= zU~+ERWQtaAF=#F7HBg0M=^oU{eQ$4&X*b;~~e5@b$MwXVq z#GrmK9Ql!iSo+ZFvu9t^vb>B5OjqA3BK4A_$ncODO@%Q`Y`|z{BCZESxR{rv6Z-W!^nTcF; zN+Qg})oQFkrO(`5JPc-4Ns^l^xcDomELRKJ|H)G2YZ(v>eaGFqi$08^Ak=M1qF3Xc z&BnfDfCIA}orIIWAMB9~8vw_}d1Ly=_$^mM_viP@s?WiNm~-raB$9#rk08i*8w(&G z_Y1O6^%NkUHZ0yWm0H)h839-O?A7d!h8fEJ|eL$8y;%V9O%%2vYAKnTEvSYK) zj1FFt|=UykT=O` zJAZcb$$Kt@+{&+zHlrH&Q&|hN{L!MDWoHOOawm4SJwsy#QH~3KoP0KX(13)Mhb0Ya zzH?8etjORmC<&8lRv*dX;jiUkubL$nBH2ro2B42)G?M|5pp4H89L=inJoH2TxhBq`}F;F zxL;tK_wyFTdpj%VIB&!a_A(J&!;flYh`=G7Ob$bk%gjXQnHpy@uUsGV3yke&oBDkG z@_ao^wvE5f?VbCaI1TV(~4__&VlTNKGZafjxnJ!gK_# z*j_}oaW;Kvh8t_ye{0Mc37XOFqV+jZX|vSEKB;R=Khnl z=;nBM)PSCU7+IvKW6wG7WU*rO!kXUEdAzEOl?9yrd9T4xQ@rhPaND}rEw0%r#`Ogi z-#OBRw#M?~o~>pa?&YzUH3b|gSn@QV;lVkD;WAz4;LT}^07aQ^wx1$!@YI-{HPuhW zD-(qwK@EX7Q65vbec6Xz#R0CMFd5XN>Q-YGZ>V@d#qrH3vG=t%e+X!ScB;>yd17z$ zbMsr61wEn~%ck{72I$io3Dy;un-QaM%mTFq8IR?Q%4{6N6DtR408?>lIgbPsaZS_f ztoRU&KK*h{l(ffHI>%iAuYausHylXUG_InhQ4-XZDnrB*r=`AP;>5weqIZsOx022p zg4F$P?kFQ$iVi$}t_lSC;mQuA& z9>xrmSHx^i21==oR%}71;R%cyIosEeamzeW0Jg8S+93}2EB7=ySnMW@H#eDjN{y|` zezq%&0*hOedPBKM__nYabFKI~zr|hyp{^Eo4b_UQn|W1VSWWNelCx-n?#x*~N<(_I z7=HqX>>keJ&H+^w0Xh07wuZw1o|`cswO!6W5q<@#0RXt`$-M|hzT=yB1GQq=c(bp9 zj1p-ij0St`GSCu|Yx^)L9CnE9k!Irg&~N0KuUU3XPbdC@D34jeKch$H=~rCz{TB9% zU^pBixXNRsT35kiNMMXn*wR7LS7(00wB#$t>fEq>lWvx99(!*>2J&t>znuJNaLLr? z^_cRcO6R*j6WvFiM_FL!;l3pa4Hg@`{;)WU+U18OkIU|J@2(@BoFoiwyV_~*X5J00 z-IAYbFr@qDyXz2GHg5Sdny04O>ziFzDxD`tNT|JtYeBs+6z)B=^c;gnqd{%#x&Z{+)ecA08%&T?Lnx;<)(^>o0QO7 zSM(ny2-zn}+rTB82)R?qY5_@OS(d(M+^>>WkTZ^A-XV2r%ZV|)E#^sUuNhl^a#WSo z`t7>gHbtJ0huc7CZlScS=fe8e73CcEmw{aG9-2cbEVRFsAR?KL13~%h2i1B*VmoAd zqS?*Y^G7}#(J<7v4amlp@zAio%9M^E*vHa+pUsacSwQ~z_4hj3JWY@abTz+$S zfgEltk&wasYTRN-3t3DW=;#(c>jrl;O3W01oqfNm*hJ3fB5t~}zoR>&ezC`oO|V}8 zWX{P})`-{c@i7E7#J?h+piw!1fei~@t+*j!{! zc*m*Ug@-@pESGraX0-M>5Z~eAsBLws%w)%!(8JAFYK=0N3IX5U;k*99?q0*zX3jV2 z2_A|^rw^&~rRsZv61-srr@X12kNXe;w!XO0r_R}hna@+R_r7^l3EwmMO@f{hS*{;K zVj>pc(?~YMlOrFE-}~&^*3emqs&L$h~N?|j?9KLKV52Aq%wWkzs z4wc)fGyqAUY=P)H(yh2NFOOM-?JkNC@;|z=20yNm@DhIo7-N`k36S%=T|*uZMI)(e z;#*7o$-my~paHIBiQagHzXnkr5YomQc$&45{`muDj@i(C3cdh@3Jb7Awg}(Ld|{!8 zT{o|K)OE8324sXzvVM2-R`}?8{T|4@X>AGg==$R({ca4P%y82LKDC?F6K=aKU!OFs z3h#zsUEUmf{2!__A0cw{L&m&Y zSl3JgTDLMowC8s98z&=KrpE=Xtt<%Q&8V&M-jesb5

`0KK)S!^wt|v<%v(`j5o9wcloRIW_ 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%0ATDvtrDF0fO%sCPtucJ%{-JUw`<+RYrPmKm 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

r+8()}Hg!a~LkD3lqHtPaLF6}nfbGl?iv-X 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"t?4J_C2mYXNUMSIhsp8 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%0AB|A?my%)8d^N*5Le{3c_0czg-$(`!=V;o zC8dVgD4KW+{td;ny1pZv+D%LD^NUx8rcWv-qju4Lx=lIzig4A%zM3e*!#87yn%lnD zzE>x_jKerUw(xM|if1H%9%N0F=A9EvHwifi&zatoW!|p}rLPDoZZRKBYU_~3!xiWrxq!GSa81vuPH$MB8H?iyX zklwq$KIBV}$E!KNPWpvqW#5ifdvDr(p@w!UAnU=fz{6g37bW_-B zi3+G}`o=OTvayVv%D%FuTt^_pecUr&A~>q0L|I>JDOc=_7G|sS>T19FtM*cJq%)lM zuNM{+#NKQo)JZcx0`CI_>pZYtr=ovT>jqq__wlbgScdfkt#f?2?|+A3!|IimQL@g; zP4WZz&-4VJv>^`b$f+pZWt$uPCGqE}loqL&Oy8N0$@0`hR4@{V7l_!DE)O@j*-(V7 zgIFXLG>$&EpO|<3O*N||0#$ql*_MSQ% z(qif%s|lI3LePt2;8m35Dqccsdf;C)(tpMYOUeIHzTdE{KOd_nf=f4v;1azT&&TtB z9o5w)kyJZ%-(QfuPy%0YEk>U&dYN!*y5xQS#JKL+G}6lfTn3iZ)%#Msf8A)hS_8@cD0I$4WJ9PmbfzW6O7HGFMLl-1GpdWyw!IdKI_wSn_g1* zEFsAKHonbS=ZGSnuqkn6Va0MQ&4_VO7RVs4A)w~8X1+E=CV>S%@{h+mANlL zzS!y`T^{~`6yDhb3nL`Pv%T|S>pn8v%GTk|47xL&Jf+WRP3>F8K^=U?vKNrHHg;N& z(kb$JM`%}TZ@c$+j52dgoxh9lc8cHnClkh8+&~}F z*A|7t)0*`{qM|FDmwKSfL7wHh)oo{ToD6c}O1R`v*<0s`qlsb4hJMh|{9vVW64$&5q+ttI_~{fK|h4obC4I z9quNRifSCf^{#|0Mi=xY&+8+|G`Y4U9$rhAfA(ycJZInzVE4XIZ-zhKm(>~SYJ3e) z@3Tuye&f4+!VJwA^n>mFacKnK)X-reAvlITB<)oi=J4nPCk8tAbMjO)I9c)H@a3!q zh<;25oeH3EGjTaO1%|xmUA>UIJj}4A{{gxWa+Wqfc(}z|JC!Ro`_oG+TfZ$MH|W?q(b!m%%^WoaP}8M#>y1dZ%&KJ zHXb|yXs$^z^3BPU&Yq}SuL@vJU$#JMA$j7%C^+eNkJ>xl?_1==oJ zSp#7%gK=nmeVTAPn?>~W8zyg&VmxSW>o#?}Pb8?}H&-a`_@nGXU1kGFJ&AC5fzmPgp0*wR3|D5nC_GYvX0tz~yXAwe}m9(&2^70D9op(m7&)iU&e z+Y;^N<)i~=;`%ZHaL|xuQv5&|;K`4R2D@DPQkkF)8nv#S^RVFaVdLbOv}V5;C;l{j z4x221vy#RJa}+K?D66tk;(|3YK8+UJ)nG8=2Y%m z4KkM7Dx7i{-4OlNRQbS9+RZPk^!mOK0w6Sx^g*5;4xrWyKQYQ}bdpJ;bYhB*e>V@G zF2(LkgRvv@ocr*bXGNnf|f3ZAObMMvQ^f19X-XJLu zz&yAIclR;^GWKl8`KtT*Kzd2*Ky5Zb%7rc|agXHW_H0f#IaWO(Fwls@6oNgPt63M8~!W{*!t&j3u7& zs7hOZ(abPG|G9Li2Y19_EUh}kfO={BBEh#Bu%jp&r;x`68yq|R7P9ps&HC!{i|nHF zeXq({Oia6*e%l9IEk5<(`AIEkFS!}fl%JLqQRrL7Pmqe!4X_DJ$==F9hxGCxSj_a> zCytg>#&>J)$1wE~?v0r@Y}`UsHxDdMY4M85&937gL(7+zoUOL<_<5cZrCl*c8VmSa z;?!`x--u*MCAFG#YCo&TTSpwctQUT-pELt!h%s3X%QLpI2~hHAynNAdf>0be>Y&Bg z;3C6HUl34xd<+|(5u9<$#EyO91_7V0FI0VLJtxZ!^xJ0o z?ijBq3Lvz*R{S9PE_A(r6|!)F)sM3GSW(3q@H7G5Y0;WLhQK874B% ze28aRZ;jqMsoHXoeCnMubnN(m{|<0cs<5U~yh*mUpCex@MMh0m5f%d#W%v0G8C8?* zGokSC-Uw2M+D0W>XBJ72)MNi_k<+JdcOlh;*@7UjfKd{FgKxsX08?!7p(M!{hW2m4 zN`mc${09$1QYs&>W(G~*Dl&dhY^t;a`m5$d0N2m65)65Ca?B2`E$kdX5jn_BCGGZX z9(3QNrMhNg$RnkGblWCmBe30wY1nZrsb=qiP(Ai}Xmuv|n}S5D5}A_m&kRlzOiR=Z zmkHqGkvaUR&&!h{l9GMvBFsS%`?fuv)Qy(=h$ZK+C+gC-$I3=f>cFf9Arv{WreN^V zqnt&eYFO$8qE=z){YXJFebCa@y3Hu%8Nl~+nM_Vk`5gX;`lwCA?*eb(x5lEK2C2q@ z?oN0efG2&!y^D;!^p7wKIz1*W$y#}rC&u0P;-Lk?HWj1INZr!sc~dzz2)pz<^^M?p zAvH>$Jf)q#J8K=Icj#{ZO}D#}V(is$n`daGcElB@IP@X{o&Xr1e zW*yv>XOtm+4UkH5H=(o4VC^E1(|xk~lC{pO7uq=W9yS~eKLtN4eGcgDS8Rpfogyuj zO2=}C-W`j`&C*t`NK_At746PW&$r?tErl~UR7=_}F8vnR4kV?>_k`s+kyxi+HBz(2 z1JY6X71gv(+YF%J8eLyhw!g9@^94LA9vTu(QP-BD5|$m&Go9BE{7I5nLitD(K&b07 zQs>XJnR~`~EDSl7GNoJDy%P<|qS)vtG#RpBR0%HBm@e*`Fc;}vE@ryry~n96Yjnax zBCcx{^a@aMonuOFOWZvs64dGbmK##$=vx_Q2~7)`?>IYu-bCp)&wjq2mot^B5=!+t z@;GcUR>kD9;_~Q-t5h%i-6$A(cH-FRbkW9NbL7RPUy{-bL{7qc!s)t+Q$E0$+zZS% zT%$6kPN%}O$mho2zH@V2=UJz(x4Bo)TWkFTl_|976qB)9TU8vLh8!19?0ngYH)K|s zW}@!uB3e;TbGTPkB3m<3Ktz?o@gpY>iO24lV(`biqo%JdI<>}_`{b!Sb-*M#vh0F( z*`L2PYbU*dE`fE{$=vFO%DTwJES?z(UFR_N$o{$95v5^E@Yf-}rC{{iM+R=A3Wa&eFriDq*&J%yBS^bm56D>z&QU8qA&B77qnw@ahhgfM= zkl|K==ezI@Y#rPxAutSU%|Y2t8bhOz*Woz$JCYY7KaN?A&7%h1yk>~(R>^@ql6TSW z?`0JXenjJPLHi@uz`b6eqJLWIByUI@BARs`IKQ)~5Cw2}+XjOO`d_yPN61W8_?b8u zyr49S6rP%3n(Wv}s^TessoFBZ&fU)`=(}H7`wV%g9lSFCMrF}F5*5l58jq#iHB|OMHOwDbu4g|&0uyc=k!!g;kOaBH|6(=5WI2nAoxW0i zX!sVp?8<%959Ye1yi^)2yK+Kgs5X8X&*`PFu@oLbo{n|@1g|N1?mzZ9NQ!fvV~b$w z^jTW2;IDB7*+_49BadEH_hw{M0**LbBSSHL{2#8Fp8HOzY6Z&_bjbmMikZ0~ox2;* zjQX`L>z?jW2{p5H$(d{2JKgz=SWnj$2>|y;2}Z!Bx%)H?bTF?r zsBT@xu-p2Vf5maeKF418L@@hlohh;0Kww`y?ky5UJp+^(-f2(4P=5bGr-_RlaA8xG z?Gp3<*v?6H=>NTJ_E?zCu&_Afx5p>YlJz3Fwp@>~r#XZ)3F9%29m8gGGI;sAyL)9> zLqK$o`nSAP(u-gd61G)3&zir>rznyIcDu#vR-FW1r|fR5lPcaf#-`-&TSHQ_GG#ijFB>3oRof3Z5yPv=rR)3$5wI}~la(`~ZS(?~u8?c8@rjVx1i%_*d!&EEdz8C-aqr z#W)n}?kW3u9hwZI zQfhhzfNF-E;Gg5bgDuZ3LaWBg0d0Wk+l}*47l%@)za#>2qX@rAz|{KEYGP@9q#zzE znd3bn`>J-e65hv&8b)$cw9glEy&=jWmTePn7L^lisMFbH>D4Ek50|}M-$Ma^KmuhY z+*-e${1ph+b{Ndg;Th{ElK@M>bzbDzD7?Td!p2EEm~_SC0C|vfv=6nlh*W_$CJg= zdksz#7fYMFr`sQNH*f@54YzwoNPbZqMu!mN;UV{$a%=4^>_;54*x$UFrYfP4-a!Ro z_c6FnqxEwX49T_;%&X>`s)t2mvnd@8IYwQ;Ysg(M+(=kZJ){O7@j&O8Hd>l))j;R` zcyVZcKj`?;1gVEq=M@{lq8OCJ_m9ZFxT^RiF3>v86>tod;n1dDxDKQww@Be4sd9Wrq&<)-Nw z!*Z=`aLgs+hg;(ltVD9JoU0+0DbP)JoEf6oLLH{@8o~4eh?e|6SpaW(D4pi=)P|Or zp*Q7Kf4y2f+mw9Fq#2ep@Rc&I92M0_kvCP~BhFQQB$Ir08tLioD_Umc_pEJ)W02o8 zJof5d#*M8eQlM%@E4uV%{TTu~X&|Z?&NtC)~aIJ^!E&G6O_q!54 z1d$`by?k!ZDQrH2sIdz`WN%WLD_YrX6%&2q4D;{}m(8C@x8rUHwo2biGY+ewg zrt_mxmBlqCTHQ*S{u6WGiA@^|(5gs1P5rsan(F){$k=Z~T^8HaNvk2#)J6W|HQ?hj z1S53^9?J05C9+mhCov$H+(m$?kA|Qx-rDsw+)Z6M zws_e~=!)V@8vjQD0tE8RKn(I}jT>LA?j8km`Wz~!92X4SM876r7eC!-RO`T_K8j(TS9 z*4sV{In;Y5g2;S7D9N3^@j1@fZ^ZCLx3G2bVtED9KD~FKI2Jrk&ElxzSCW^HYJuUSRdr7y`bJIYmVSqrv!mUk>8?gOGy4r}LvJ#5q?+`MwF3?!M~> z$<1y@7E~jya^F|=Zl1d5K|F}&Vnr3fDTH(z1N1N^x8}`4X1Onn`0{KPuu-Tp1nlIW z+3y&uU7^G+8N{cBZzx}9r^nBa?2AD8DY-{_Di@>g09M((#of)N983}oV!qeIoFExz zNq~b=0wwCMnyr7BqJF2e>#ez&VoVrTt;RJO%yeH&O0w_VG`?c*3Z}Tq!^!t2nBrF) z3<6d*VOJe!OoHWXt)=UvPyxCue8j$2RWM)dY~gWT3%a121|M9&sF#}xvANpna|2>m zAjgK-8&!i~5et88U7yFzA9JF;YgLR6ynT9|_qOiSeKa2CdY!fPPANcUrPu7I!yx_x z8LQtH9zffRI*r3Z@KII$qDGQNRYZDMn3EkFWF?MdL-$~P0n3#SE)z(5WpM9)q_!g` z6TR|7LfY8gr*z$G3D)ZsE8rCoE_=T=sjc=%({AI)kcG!|>xTjJn;W8sq5AFpNCC02 zS6vfq*n(6Nx5sF*p}tzaqtOQtwxhwD?%SxqrS=crYKi0K@oS(PE`WTzZx>%@5ucYf zz)5M3P2C56>3n|r2~5-s;xq?EblXEtlNVk+(OMXcud4p!(NxdfIz#N$)#FRy_J=_U z&VY<&%vUhi;u{A^^nARQHO&H)EtWIpg~~3;5R!1WJ8vyo6NI5Ns%iTOQP1sY9h_Ne zWxBb`GNPM77+zX$IC$Wq>~5MqSFYotdZeO_rYrPRh~8$q@-0P$GJt7wC4N|}Oxy_T z{G;K+{=$(90lOFd4Y;FQe!K7N*z35NrRSS_150(k)$jT!B7>_lbK5b`YM;Jf$aTC3 z`9t9;Iaj#)Z*BCjE_5X_EF(V_|Ne|DMC=3P zIX<^+-gy5KIsQv(rAdXWGT&+Q&Dkw_i4UuJQ>v69Y)fIsBv8FWUt|4gOLOYg*@z z(Jlp7XPBE?VuaN}&k6^=WkI;`9^p-V~zWbLwBxz<)b4$M65~ z3-F}_WL6)EegOtYEZsLncb5Kjw6vJS$$lx%j{#5Vdn$Q!LhXObqR^+nU7Hf))S zTO{RCb^7WRG5*1gvdAa)TBP>;$e>t(;D7*U{dVF?0clqehj$SsQO@0x)8G>8|?B2xkS)@M+o zNP5ZjDyaNcg(;vgN?#OL?cy&eQIXS-NMHW+r}N zGUVc+on={VZw~%a-1h^K#9fI#)t{zy(kuBR3Q4i0=4J>DXu1=bzUj~0L~6z?L>K`c z+soRyeJ}DyPYZXdgO0sH;|892br}Or1IiA zK)?nza5RDCkJbh7L56nNl&_CpPoRBxBN`0EI4>+Pc^F0#!D|z^he!H6Pg~zyz z;mPi=;-wx*~Nl#d=tc;)Q6gokBa32?KafL<8|MZR5rVKl;-7~Qn> z4W-SpFV}QJrXhsmA+~Y)fl9y8X<9CpPF8z-?t^l97G7x?y1M5y4A-d5XGx|v;9TLU zZjEhy!V{Or7>6n9T@}%B>2&Th(9|<(9&O`K9vxli@XgT-oL$wQ1cpkB<_Uh%c~c3; z4d9I2A#jTL!cFTvs<&LgB}VYQwjbgqg=T_D6^{|P=L(9pEYElPyV>+g`pOoKr!k~D z?LB8hntg=aVxT8=uBR1f?hsissu3L<3{-o(Pz%B0ln)}>g@=Dlc>F4c;Ly*BWL7Ta z0cs!@kZ#^t>Rg&2KmjC4R(O2_Mg<6Dv#CIh>>oQb4!`;1=reJY>!fj#b$u3x3x zOe)f^!rZAGQrYSn zy|}oES&RxgBZ9>cPnsp=@VTh7aGU68Fu@YL z4pY!E>e?L6&`pLpw0P+RquR`Fh13t8*S_JWCg8N-3W*seE`VEUP)O2>AcYW0MDEFo z6#A^n_Z4zmD(hNvg_~dZE*@${(*Q9aa*zWKOMy$-8-WadR}1!^_3rv&k4*girPgK|(b=MOQoi>L4`3xHqemG8$NHahe1fO}N^@ zX_zOpx_MVWC)TEusmdhm(e-aE*?i8<*1a^6Fv5q3_J zCv*X;>D1@!KFRyZwK$JxeVb zSI?V(Kj;rTBX738{zP*`W+!^PMhhxq#aJ;vWJ`Mt-~34~<=UsfuH27}d^{&i8vXDN zFv4lRiH~>%2ok?*l6oCp;?$v~@39pe!N^oRb`u>@tQZ7#g#C5^DVG8{~GTU)w2xaWwZHlYN0uXCb9&u`B$VD z`woZcuefCH-0M!#5`a}Q-#;$w(YSBgHypl( z@a@_*PkP{lMDOza$WaM;x?lav%)5$y@gL4?J$GFLg=+4h>y6kFr0YoLgrf?c*2<~fi5lf=*so5z<)kC zVX`+QK^Yy!Z^fzg4+~GHj0X;R+E6eTU8|8f{M^KHV0!chCT!58wH*F9iE`{yOSnxs z2z<7TyBpoSHX!O|9;%Wl_Rt2>3BMjFTNIj5J4J#qAT9R1wAU>kuuDqD9gP{22waN`jv0u@? zcGjQsz)-VS{yqZ9nc%U>7d%{6H!duTflpDY2XpxhF;UqyUI*@tHln!fXmfYDHTg*= z8s77vD%*6jeB$4v=EmMCOH~OKexTOT{{WRek#~;o?N@Fa-%3}G41iQ2um~HuN07ic zlFxSK(rrzx$!rlv@^|FA^)XUwgDtTx%erAt>7LhB=@6JHK2P-&zCII~%yVUe3 zy;iIzPP8RuFET^PGS=c?2j?o_cwH71k4Qf)-V56<6IQh^r5=CSwSbd{Y(-Z3%dO8n zUmwkWOgykB<@Fa76uECyk?^e=!0yki!@+rrC;+_5w|1#s42vg5u4>W02;lI=FE(s@ zI=pFK3-FN;@>nW9x<@1VYdkdP3h?7;2_bo5OqwbOG;DI4c!RSzEzxTs8PT!lt>N&U zhcQh6+N$cb-#6|L{Ue1(<0V1+3C&+i8HsX3Nb}GgDYVj}$^j z)jydS^J&{S7q_4otRix#8h^I>5tap}qAwIq=56&hEc5rv zulKtgBCfx?v>a>AW7AZrNTRQvSnz-&$ z;l!B(e(lZaN*8Q>2`yY$P6SPdz&6xQ3Rq`dH$qBKKM0~>h_2TcbE)fU$bu}4es<1m zV&mjT2&({UbM8lGTkzsbIkl7ags!*KTYX<;B5pnIYbpB~9B~```?40y zd83UfH!+1J&75S?e73>TLv7vHO{^J|Y33tu7m^$40d4=x2Mx)M~AMKrmi3tBGFGGcR|Lpc(s42MChwHiM)5orBe5k z>u3tcx7rjie>&)?Dm9NOBQPN`i4GO&IH6?1unP2IuH-L<)`zQ~lKNK^;lb`;-z$hL z7_ZTc9YKjLo~~lbqmk{0>cD=xvv6ZSLYy9!L%o&y_t5LcpBBuuC9xS~;eSD&U6_Z8 ze`kI~#rR=r=H+Ol8h$3=M^cHFRL@DIjnNW0a!_*5Mv-Ro0kmoH5bD5hs?!EF(`(03 zqbd_X!IAWot)E&ZXtAvWRHc&v=V)m$dTQkqBYI>SBwUU)5eK4+MpZzc=<$C32%Mr^ zM*|0`y-4$=l@nk=CUhUp$z%;27yId069vb%dF`c|N1R-14e|-X)*`X5NMJ^$Ca6~< zAK?tHO@Ih7Lf^6=JO1IDM1jZTT0x5ynHs@$v|1ITy$z@3xF37oADK2#I zjbzi%al;cV9A{Kn*Oq16;7p%f@K9rG!>o^*+ox+rq)OYpllw5!bqVG371o)r%+fsr z+yBtWU^c*gdCg^zj-Z1elQ(@kc<=?tqDI20j6HFRs%f*ZJ+?OTDIsG7{^geR&cm`J&y^?5(#Z>}uN$hy@u4{45^K>7%ho*|GU!h}=@71BG{V_EjSyoBbGx zeZLoit?oKHgtAn*N6KU|IK=Xw8pns_UlatrnqrrEqOZ&Cp&-Bs;}^yAG5QB27DrPU zM`N3AGEsf}qr#ucT@jPfAwk9(6mp-nX5wM4W?CA5&h3e-dm*74pOMwaLnyi?6}_{t zGjju!l~+V{=DgbbPwCU6FnznHMYc2q=4;t}q@Gv7Fo!kV{L@5~CtedVy}!5iqS8~~ zi;>xd4;vO=i3{hNG?;nP>^zbgxRE(NA;g<{Sr%m^WJpia5<+O7l!dy%zdMtO;wHSN zwP0?k;%R}33!lJrAM4(M4zMfmKd?ymxAcTZ13zcb9Qc7y74S9#J~5^>@7(*l^`9*2 z9pmsL3R|%qiYe7%SN0GvK)|zVT!H zdMSqxp<{y~V=+)<5HZE?vBEY%)2qC^{A=p2de`f{cXFgq~pF5)Md($Njg`y!V_d;1f38m)7t)O6Ztd0-FkZJ2n{ za-oy%8;~S$J6f#dji4m%Vu&oj^OI5?cLu;`xr@JhgGg5-#H*fqI8W_P&|H3 zEMdB2W(yQxX7UApzuX}s_@r)6N2(?)z;ZFJ$YQ>!ge!ReWshW3Y=o_2fP1=;?j#fM zGbbhPW+Y_wvvkwXn432HVQO@?=(umJz1yzoFf)@p&)e?X9hg7K?oy37<>R zgAx9yCOOwcs*}8V=O5sKJ3>*)l>B#A;#SBRa_8w^QGl8>mCfX3gg(nJ@Ok+%`tB}r ztRyym9>Z}w<YPA-1F&s=tcd^k>4q?oaY6sAq zYT?b9{NldP|bYIJzNn zPsB3-G4!oz(tPe{OVk?Mnq1xcJSYx)en>C~9AO4o6C-iE)WQfG3|G%_gUWy#98;XStu ziluFF)e6S(RiOejtNjY-(bs>_WneVfnVuA-lIWfFf?rctcgWn+!xSz*il%Zt?mB*e z5Ykh4_$a~tr_M=RB}sP{&zq1DVd&Po)Bx$lq62QkuYuRptqA;U-qPqMzmJ$1!D-GT zFPflR4N;qFhPs%3n!vA_aVG8~T|Yuj7i*&1)iIV&4z_)}!g@S@UswpMaS>qt@2d2~ zad?kNGwqw708v-x6v^FenNs#P>_r&Xp^BHbbI+ElBE=vjdF5YCD0z*!eq6Lv3M217 zmpiTIj*Ze28YxI)9jm3#&Rgc0G|9C$=tIvlNy#Kx?|iD+Doj!m{&}%IMU}cwOu-Po zHD&iW=z27>%e5N`d7{N>BC7wN^o4#$jLExbn< z#&JQKYTH2QV*|g7NkmNdk=cc$$Y%&&+TTw^iWWV9qDIV(SMeE*{~qciWfgOztny@G zOjU=w%;Ur88*$JCco{;-WtX~Q63yPK4Ha3D+MY;%O#V9nzd_0n`May))J)%yU+$$r z+}7W0juaq_u@$c%Aepko)TgN%9hxr~FS)sN{J}UGL2h+N7)4a-w(w+Dfo-wT+A-yq=;mMs|0 zzc21KNLOmhoqGS2^I_mk&T@ zbCV_{{*sUQF9TpJS$H}M3MXqLT?+BLaei&fJJ(+4>7GBlCF15&7^~*?zP8SNor?upjO#QEVGkU&u z>9IGG6`fM+jyDmERB(-xJVQah=y2Hi5zI`b?}aIcb*^~zB^#j0EE@P@$H7I@qzyLj zvEMafJS^5{_8ks0(jP!S97oEL0xF*hcO;h^2L6g2*KSrU^(exF9}uVPL=2x^OZf7C zTr^Yk4@-G$oI?3$hsaW*i0jv6hpnbt|MmKBq)$2rA~s^=shYmgOFsOyYRD`aAalc) zJ8H2wc<=qqe$nJho)>lP$HD-q&cOH&&*=vz4D6QbB;XL?slkwiVrQfq?$nrgi-!v> z-pSmz>B~2@WdrijM@A`^X3_;i;y2$|Io`dNR;FDW6 zw9R-|v)wKMoK}Nax83LAl)%8($B8UV-`V~3^HwMuJnP`bpeRJ2yU^4MUqawt=xXPqzNyPEf)}+waaWN_;(Y^C+&a@LbA!0MD;DgDT1ZzJkg^GNvvGR5 zg#w>=;qCrv($vvaBWBeO<(tB>MTT)m#y6)kO&A}380O;TV${abmEXyN>~zh}L;Am2 zgk%|a8>K9mT_AwdROuSoqX(DrPXb%+{gh|q`uj@wJ+3R$q~s4=p~>%Z z{v;;6Vq^L)wMnb8^pY#$p<&G9eA8F2hetI!N98UQIT6tzw5GN;m%?(%l5w`5 z6=elji0P29#{na>w|-Z0MEA>&@wZoN^aHD?dY`W5k8>ok59Gf3TiYzv7$dNS{7l{l znnr4}h^}<{j+;eoef7O5m?T_0m2#ofgeT60qtT(=f*h?N4AhvXTe{%$>s1m?>&yz) zPZ9kEufD_txSb`>vHDPPbyHX!UVwH_?bGTY9$J!>om%Q_xRtc0LQ;Sozps&@OCV_Rx_6pzU zFTcK|Nz72u-f=e~9WL_X+-W$5PC43iDlprpFWp6IH|bIpx*#}*x-7ddwZ?I0K8H7BvNP&C3b4Fp0M! zn&TLl_vn`2OnGy-EUC}ss-^_A?mDJD&jrEOzBawbQ>E4n{-MR(4^87sm2>y< zP6GAg^bZjWwkA`g>xK!W17A9fgfo6N=`A|^b3!?ZlziXra} z01gdY3I1ey`EIobF(R3pUf*AHP#%-LEL;bxV3~a&_&-U*~U>w>+9qi>#a{980K3zB!qODq@K@MQJtn0je8@Z*L z!bXh^rKh9|WcFq1@BI&Q(Z!Z?*luK!gØ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

Qj`D4G!-pZdHq?K#Nf^4)rrY&-!B%e7ac zZew^YAVredqqDlK`x$K|u!*?i`1{rQ8dcs%#EnR~;z=S(? zLg=KEztD^PFs_EwtGQ>Z#nA`rNH6-zB0a7QxjGWYxqLa7fzpDv4H~OTa9c&V*O0{2 znZ;B$t*K`ilg7ep$_~Xox}-%or2BZ>x3P0Y0y?Pu+7d|?(rRu;iNC3Dk|8kiZWJGU z>ko+*g)p|4(3^@#5UH93Zxhy&3KB3HlSgm)tQh7Typo0mjJL4g9et`sWdcD(RAi#~ zLLNi57)$0f^`<;fqx4|#7vbUO0{ZUcGyIxvV@=xH!8_0Du+90Qp{BU4mcuvD3K zOTDP`j&R~CdN;F!IOuO~7RouTC*D|6c3)tXwgc+m$WIzJMa=O$0Yk>~;RiOH>pDrI z&Bnxa7hW>e1tlR z1SCCM^$K=tWjV866+gHtUy`CnXIg>rJEuNLE|DU(Z#yF5%I`YmB`COZ9eURdn`T zmQmhx)ZX^9tLZrVE;$0R4l786UdyOkKRg!QW1DsU zZW?FJ(i5V&_le$Sx356_&-VywcToP_`r zS4qy@8NZxo_OX=3!BbAsZf*yWNrom1E;hYSA`4|}jNj&YAfIY`NU!S;0!0;NYJFSX z_c0ROfd{c#fVID7{nt>lr@+rBqNc%<8nEPiCaK6uZy<`KzTL0XTsnmMtA0bp<0foL zAPamAeiw!(AbZkvI`P!`FlWT}>5gI)Q>`M&&n0g7bq&Fpm^)Fmnw)u_;JZJn@R1>t z2vhk4gL>V{vZ{2#-9C7LE2xfM4G1-8=YCi-ET%a}N41#9_FQ-Bl&JPAT;r8|+3TSN zXl^QFB?#<)tB|{Tw|G6^@;7_^E%Yf}aXu4xak9=x1F3FW;l#X?u6%u060S(CQ;vVQ zjU@6wq|AO!X`b`uVEq8BXL36j@FCIqjlz_!{xlBphc-o~^bbBTnYFrGFbYYZeaBb@ zTwc7fRhz9eEZwaZL%3lb;rcJ{FrouqS=5|o^w2^R&}UDBJ3P;Gx`vy~~S_ncHG=lZ2;XP#`J2iMW+d z>xs((2gL4UTLNp~^}0i65B1z^=AZVDgO~qM5LSV759l)Nv-`?QiW@f0t`?q8i)@|A zF*YNwTMvw*BdEQ{Eq2K+)&J}5rTgb<=gSz?fUQF{vtkaTI8YtgXhu_H58xQj5a?L% z;T%li?D58Tf9f57TW>r#x9Or)#qis}#$@GIPUgL82q@ig97lXWOkyE)pxUa$!8b({ z`(9E9^%SlU4S(zY5aULe z89;$81GlkNneA{Qfs^w*QDeRK9se(6-hX=P?0@Ty{$F-qlJ3Id( zQIaJEmzaUz{{u0U;I4&WJfcQ&lEetGS63~@3z^jP?0Ysmx&E7{BM5dD6|Ba`&4nB{ zajj;L|G1&4wY60`WQ}xbIqX?z>*7YNbgXo1RZ}a)ci6{iS+OZuyV07hoz{Vq_Wf}9 z{_*dFgHIVbA`iKUt)FQ$77@bO%Kbw>7Z8h5zm@dUsC`Yk1R@<+a-S$LqcP zxe|GqI_3&KI-u23n}(d#3i#I*`pN-Hj5xTr6b!Lm=yW&7j+rkv7+2X2z4VihH`AuQ zG_2k-C(wBl+&5U1BtLH%&5UkVX3q2TF&L*bo*@XUOnf!CJqlnTP^2z*pd}o6(fp5TrBt{H??*Q-czJKX2B}&W-1Sw#0sCurA5VrD{Y;t`_)okofv0mM{NAA{h4pq6eD5w`{TQ3`;&d7dC&Fv{W4pFH*IeZ%Iv2OPw~;iY?b~T zTb2v`q6u>kRF1x<676kBRfbFz$Ck!KB;eLHLw3cEmLNE`qwQbT& zd9;lUi&CF~?fm6%BXLy1QWVi)<=^IWEzw(De9dkGA?#^FJ53!I14e}!Fjz(wL6%sl z(_Q{UZ|2(~+X(=Xr%|`JDj#=Hn&5*?1gr_EsuHv8tSpMo#A85m_}?532f$n{?4i-4BZ>g zb2H-lB30@rSdN({AQJ-ml^fzA@xd?0wRO(y?GKyaEs0r4hQD4;-AGcmk^-YRy+rQU z4C+a8sc4fzBa4lI_3@6@Dq9=DEZOsZdlV3^XmzeYZ~(oawd_s?U1EYC0;B@AtZsGA z(A-NWJG5IAg->6TjkskuQQs3bV2A%4ap{uApk@=9&rrHtaA1BbC25B%{{ww7KXORo zIETyZW#coGux?8tJB`#h4d)y%UWD9ZGZ@Qvir?|>mo_u)7RxkYD( zEN00k9V#qD`?gYNjOiN>X1A3(jXckIy|rB7{JF#5_h~M`NJdUYbKb{0qQBmg@!u7v zUvK9-{%G9x_!Y{U;g*{w8lMGA*K!M=^5+^i*~HS_iFPz#7mv$ebt}hgk;vJ5cPfP|Av8Yt9gKKRHXDr z9MBQ$g~R{X|6iQExOX)sJ#}RNv$<*UK+n9OPjgZ5?{^r6XHEJz>-?cf!+CoJS5QNy zzKC2cLW2otq^gkXBa=bUsqofVIu=L66fkl8ZZ^AWyQKJ<^=+^ctFZq{8Hf^oe1gMG zz8~O=Q7G5bJ*kj(+-3A9jo5HesUcZTTR1>iMEaxDA)2JklO7NK9z^O zX~Gessg#|2|MxB8GF-U*QT^3GgN%%mmcjswfeq8c|d!7Pkz z_oU>-g4fE|=sc$i>$Tix*KZ|A{<+@nP|SH_UB87@;B{u|+mFE6{FotJ+5HcHC za>bwhK1+)8H$*JR^e;v+)t*a1m&&{l3a_ECz zLs9Q|{@1YzJgb7WGT{&VI~mpKH!@_mfkBpF1l9}25qS|yROE51aPUHirBq9_JVEiK zqf^KgXXcowZ`VV=fj!1EPq1g_+X;vNmSef!R_(<%2rc>sEQXNX<3^F}=>@5Pt+mHU z3b{fsotBv&uJQPa+SqDsptuFb*VgF~7I~lK6x_v(7dahQj0$qkA}L0`*4wQ;Qb?}Y ze=Xho5}Zjj(Wi1xp+pB7YX%?PL*~F+QVbGs$dNYVJB4_MmNE0gYNPn*4+rZ#m$O?F z3icSb3nWTq{w2tMqsvEKxbj1BF_G-_5iq|+9P((4lV1whY6%;6HSv_&h{9WG^TQmy z`|yd+Fyv^9LC?dtmczqHH;apihciS~C*e~B>g#P~lts8@|7aHy(fU!S%@OeFRO?&6 z$8zffZbL3%Wcker=7P!vlv|#|4`OrcR-h8Wn(DfdDXn_>=9*S*OZ2r0Juhgd761!AeS35b!jPv`? z@?c;KBY*gjkbRl9AI3kso7rlhV%AqYye3AjDNUV~y)l9jyk-28eH69HSqlPlh270( zIgtAu)#4fiJ^b}p0-6MOr#Wj-E5!=}HTR5Uq5BpRZdvw;68sMhHW6%T&IIE!yZ1Hw z&zJlVy7xOj#AT0*YKym6$w*9^D1c@PhwZ0N4vH+qeNlU?!MBGf zhsoc~^h%F0+pi)M8Pm$#QmxPO&4k*3w9^xis@W_?Rz^-EN_zuVk>sIlx)7romll^Z zCA2!u+>Z6sS4fhq%X2t zrwSWEJ<6_f^~Fulw07Td)Z*%i)uc@Us$>YonKD!RW#jmpS{=u4l3lnr>8+i!6w4&L z$BQT_6=C^b)-xTk_|8kP>Y68VK75&|!}d7|JR~KamEzQ-VIG$p032s7M|>gl{k1q# z_xI)9wZXTJ{BDx4`q;wRs}s(!lfN^0ju@gJXqvCpANbG}kuTsgI0abv|!XnWd7)lE@L(>Lqaam+Y(N z!lB5pzfCUPcIZ}*wMPQ+USa*0@5wBA8|D+#L_}P}oP@;wg(dkpRlkqGkA7cm+M@WF z@p?exJfcqo!WF)gkR>_%sgV1pFh8{euSRW81x`^Zus-iJmfToq%70+TlJ`+-n+0lL z%L*fpw=tuvJ}M+PkBtry4`m=2QZK!it}tR;jPuoZ_{|iATqxNS2LtXIfQ1P1>*`Nh zI&l`|xlBk2o=46)f;0w4Qy*Ex10H=VUj?=aK@+v>%Qd6U`d~-&S&Rzo$26l(Y{Y{A zeD0~vFfcGsF`QuQPV419qV@k=Cry3oomZ&7`F>;QcPcfK9{Ws1GeKZw5QRcutHxxn z%$^3&2MV!SQfl4K(9>lI`N2$($F)Mc}n((`ebEgnkfO8Kg?eR30eHGeXu_2C> zl?MYMYZEe83TI#y@eR>YGVQ0-Yq4#d<5nEt1rXl`pFNzcy=I-j=7IfK0Bh^+66I3c z9vt(PIeP^zqA=~Q@s@UlA9sAV-m+V{X7xL zA30xM_@_CWC#3u7gAX!9(?ysI`XScTl^aXJsE~Ofj+k|7eF5vNBLbCrs`%>ysUXT} zc=&2r-gSxFZ9Fc7FO(Q=(=lHsL^qw`T_lPfLpSpVk8#nO)ZtMiK?X6=B)BkeEBq2h zv9D!@vCq5#OUTVLO{yDzfDLnSn|dDlV5L^J+74Q{F^KoI+Z6m-etu=2UC%V*8dF}eXEaBm1A<%F0S7Wy_5`YJRpc`Vc>yzA?iHrfKEsTaC2uI z1rc{9jLhjJs6WS-^r*01z} zsAGjOrn@|tmSnyjEl6Z_f8(fBZM@)6&NohAqt-eahpmq)xc^)CG3*kTpFw0JefmvN z^CkyX$Pq5jRu%D`bMNGkAoz`f`hCW&@`JeJpo2l(X{c0|Ve*#&wp@xtm+R5Yz8aem zfRws+=_h>q*J*lrMq9wOG~s>#X*{64Qs;s`iv+Rpz}IHc*OP?%MmZSgt<}LR zBRauxnt>pBh$c(PsmJA&K&I}i^?^q91 z-iuP)@@JEtlnN$Oh1j;*%X~*OrEt6z#+@fM;`76jj%M+qbV~+2G9UWIMrq=XU$5+x zzE0^rkm}{gj#^-%nwfj){kW z-|$=3(;4ON^=Vm_0n6dfiQg>0*~YrZ)gn)TJLg%rtX^91nNp3#B+Ds?>U z;B-xWY#Qt9+|+Pv$RE4j8_53%?@D}WgHefSVm{r{f8Op6_;XP z2kSlkR%X4?+<3zX9B62^U53Ndy(;loY(bK-v8Zo77Ku`Vu~+{DzjC@*1PP(z2MpO9 zm6@9(Jd`Qyr};pGc9Iha<=4l5mczfgr;--ZA}H~;(LXBC_W=;6!k!aybDmfyDls8G z@t^sE^)0GCsdz>H315@06DU3lInepKsYd&ZHLj8B{5A}GyaW3q#=TY_s@#Sk*@fMN z?jxB8H%xai{Yrnj)meFBGN0Ho?B#ivxzS5F3|jcT6JnHOTK+BZBIdk(U>6=rT#Uoo z={!0!6O<^ zn=!Q@}r5h({D$F8eRm%Wk<>Xl>K$AipKoNVNS6BVA);xuD5>a zpnX;`C6qhgdBC%4$0+}$+rtXMbE%U=w0WbEEnZp@2Sd`kMgL!x%(;77R)Bt{QoQuJ z>R&+0p>^KA(sC)-79*DYRaOHHlWc(F@{`W-@AVW?Q3rGxhK!WqR|Vek{pEHWk5x(GLTe{`6npTYo}>8v_pzy3?T4e~CESE?8#eMAQm zDzCgX>$rV+KOMm$AftG6_^PP96F*Syu{8wz*3RksX2dL~Q~3CTdgj>jjchV*9aP^E z1}PH){5#`3B9Cl$fEG^1iXMgt`EBvqp7)DeV*77NQ~WH~LYnHXO!svBR+Pi?ETaAt zez}Vux{Z8^;sk+)AXK!WvyNVjf4*~K*72tu);bc*dNGB7Av^0)YvY*AnfaPI7vsOc z&K$Q+;Jq%Qy@Wes4~r)ToR5Wl&q(~l%#iOt6OA{4$7s_da;~}b#?qLKQb!!Lhf2=B zqDlBr1g&;GZWG0L1C@lC;5`ax_Z;js3UQ&d-Sxy~L8pYjKFd7gR65RMPNhWuuxXau zrWPe$mr=)5u^bTT{fJdhV51zI2JJIK6gN+1((M@48`zeo0%h+F*h!R;JG^mY+zJ5J z=Ym0;44hSr0=U)y>aUwE$wBTH-<_6o?JH9&yWgBD1h0L4NA;I8l~Y^0oR<`+JAo4t z1WR8udyCLVJkxRF3TSQ_-c`O5CDAx1|0|q{~@U7igUx-aGaYq9Vx+`T89UdVeGz19_94$2nc8{eVkTMx(bY+%j~??O3qRp@7Ta>jDpvSp-0|)urN|@) zyNj>NNW-Lx0n_c^8jS5n>Ja(PiY}FEaPKI)rT}DUJ9M`^dTnyw z`)X9Fb{&G6O$PD}Bls46IfOe!HaX|Kl=o zKCTm4y<+rL^e97rhBxC&_Jt2V-&pC9*0zr9mBj}0o>&I}91ke;-Q6x=jbHvWSpAXo zgORXbzE@#zf8$mOc03pyV1{-k@!n0x~LY)H4G+iF=HU~PsKcN`x~7$z0zOtHSV;> z;^Fp-lZAjO!4%3NXP6#}zqfLMt^@ZZyttz3crekJ>HjHz729 zcT5YVhQ*k;dOb=GU1(@H9hCjE3?bl;FSUqXWXg~eKMVkV=8G4fMp6_5lsK^l+QANt zc{-8Nd$N@^%210Za?EGz-^TFz#k-%KCU4y+k_#ketA4o&bML2EPBfd(|4!s;SUvhm zA})`DmXD}_mD&DZaF%w39(lphIT`w<{}m9U45LE2k)&6=A{+mi`BR_+^L%;G5<%a^KSX>FcGx!yRvLewgA)5Ys9Z>){_<2IT{K^c)(rJ2t{z)}YMe13#mNiHu+SHH#+ z#16csonEd?AZF$J=zwWL7#I(K#FBIS+4*Ry-%H?1UF|=jzc+IitR9orV*t^^+UZr+ zUK9Vehm}>h)K(q(Y%3FbD*R7*EbQAC4u+7Of1%hn`Ukz95_3rwJymUqZ_yE-R|6?@ z^P?IIJ1hX|I_!)+kBnkF5{bofl_3Woq|LYrZ1MuLW{R|(!2(RTbOmZ1RT$+H^`D9& zRo_lIT#>{^4bGGkhwQ%}QzxM=X_cUkkV;y}CVT#Ysh!1L!uv*UNi89diqaL3CfU1% zcOn@2^o(eT#@XDd(m5dHh!5x4A~(j@3~d8U#Ag)&pVFy5tW|4j`#udEF_+cjMM3bm z1+x~!RuK8xcPmrBYxq~}Bk-GAhp`b8`|qEP-Nefs;B3-ElUz*KBS9ut5k&w7f{O6z zK^fzgR69n&XqV!}n;Y2++V3>&7^>ohfpY#|nfUJV%PW7vC+PR$1bMixVu z#cxLlhHXbr9XLzAnaZYj9~hEnZF$Htu+=ME`2=h^N?FwwwLEA#lz1l&N~9OjV)#Yh z*Zv)l>94DXiX@Iru;rqRlz}s^&nAyA-?#+4nY10G!)?A!PZBJ)dP~9#I>E;6`fw>+ zx~*ah!a~%$Vjz~4F)WiU!WsLcqQIG2MiCLI7X4OvQEDB%(nQRF@4x-Ix_e8yVx0P} zo^1sPplSAnC~Z~G;Eg>ZqR$wI4}Sr2WMi1rki)ALhc@=#1ZS?tE6sE++D>mt^r|)z zKy81Oc0))**91N8xvuhu^r9`5pe-uQ&KF$6SM#X(fa?6$L@?Ou15+>>R?RmWc{%MP zs{Z1I<@|<%_nyqFy69Wd_PPj(!moYowTg%MlF&UlsMD+=I^jLwqRn=pH$AB1%&KdP z*oMXIYZcJmoX5&!T+I+UvK(OsKea;Z6I>QM9zuPs&YMiR^juhmoAYMHjiP=!i!wD# ziFTC4t?$gDMyDFx$dNO=d5qtG{pPtc!)VNH6E4n>K{x~eY-bzUGh&V16Z~iYFvcVtpWkGsYHJYqv_gjaO=u` zz-w_1qN8R0HPW_HE$EHnOHLx~-P_pv3r0zBsS6?B=uoF$bpdvAUQNcKmQrj?hJKA; zrrSus3=e*l?b(?|J=7`6dw|_ndc})y4-FyI)*_JJ;TH#2Z=TBZFfBx zaICf89*+SLZqKKi4~_Lih{0IO?x|10)LZ{^u$<# z+%>N9!>(|*Z1U3Pb}i+mX{pzSO6kapk5~OA&~8;Ll$lo@un>}1HIipjQ5?u=ZsI`S zRT7sxi2iECqHAUB9S^&5o}Jh|)TT5`yIo$j=mj`!OQ&-8=q1Lmn)~mq$0T{Vig>!{ z!?;hJ{55ZNL^1__Z)xCs=GkNJ`j9lExQDrri`LV33DHR~`nj5JcNcAb_6;Ya&%Zu~ zJMM2fr(1zq#7aGZ!omyc8$1b#oVpQr%`+fViAmZi(eLY^>ZIsW{2i4{>BtRewQ&=m{BBFl49Kc6H;DY zXhNNL#`{B88?SwG!m4?RqXS;O6lfdPURrEWll6RjwQ^_Xa5qy$Y1(lp<4*>~wlbo* zzHyBcmqV(DpUSD*S}Uz@2dhSiG6Uen?_YdfUw@d$G#LcCuM@v9^7=O+vSKHTpgoU7 zHZla-=lfwph9mU_(k49Sak0)Bq3&9*h!(Hkw+k#vlP9{!qTf>9f$7h9?LlHVTSLiT z%8*WPTJGC~alH$Q<#i*k2;JYNw&JuHtEfv1Ff{ovUX9| zC|{JMK^INma7AAXu2|-DgXQ6^;`7M6T&vpr9u`daOZM~x+XSUN{Gw_xY1-zlmj92f zw~UGF54(2pp}4ziaW4)76t@ zVCTDyD8;|Kr^m++3WP(1D#5Mh|69ll>{^0@^k*Fe{+2{nO|SlN=o94AW8T4;ONfFH zUhmC~?Cz4tPjRCbh0*YWiui_!vMW$&#Jk8@9L@lFjNG8IvH(dfM~G;0Sl$VAOFr#H zlJMkUbP}BrPxD10LFY5yI&rPfvpI~Kk}Hi)9JJoA ztFc0fNuUcy89g9a0P0s8`i7kL&m+hBjw!0iWf)DC8>Hbp_5224ZuGz+kYq`1QhGX$ zCJTPT8zMD=2gPT?_5~T=;k*JF_XvRwMv<2I`HF0DgB@mvM`x2$0Jw+4U|_lFp#+P8 zp6}{v`#phkicT=Ntz)v{OOppqs#t9QuFYcF zE-U7?3LfC{!suX9^W`<vkWv|#sFL?ES*?=c1f?;1ml z&xH!)k`2JO(U?3y3)ao{BZX*hp~Pl}|DDHW*0??3ZapyY z6;qeoUhZg7kTg+K1RM_zN2-Cq!X;pyw!<$-8A*!VAg41LNy>%UM3W2+++47{{D8l#IiSj6~aAfZO=)VEB^pJE9(zwjgpC}gEGL^s5bu2<2QmO4r|RXT5Z~VzhJvj*q|u{Ei6UDlX{Y&v28d| z_%XfGR^bY~$ICXRq+2>=mF0rRZ@QRs*_!-lX<-p zXQFpt@^i+-8VYki4S;y%w@c`HQ4R0Y^f#y3ZYIlD7q8&`xZaw@-vZA0P=NRuvYl{Q zmOtDC>0^|?=UXVo`T(Zb%jl;PJo9cQJG5Y|jyqeZR2QK~zXt-NhPNeNQlCVV24oBU z6gU6nYnvKz*Li+G5LV!z+HGWa`sS)PdI#x zy0e^U$_*tcYRP}*%8FntsWS$o88ADl{pG=i;dc|IKw|8{fK6d>nrw5eO5_B$9{9dL zy&gC+@4~KnzuL;w5T{u-zhg88$BVGuCI9JSG6qwItb`q6->%jL7%gJHbUqv5-IBYTVtb=b!XC zwZugjJ;83~selgOu5kozMZnu41=|(=HD7iSwA!d~kmE)OXuDL|Jiq$;#w`53^3<)b z`l0A5zd^q*u2(^1?B-z9u+v83Y?DLp*;XX+nLYwUbDvpSX%ig2 z@uENL{qRCA;E$ejgsr5w*|RP9GAWfH_Qmh{0d!fVG`3KK&d9zo_;^KfV1PFi(1rz^ zpcr5kL(z{R+F6}s6kWFbGfqocz4!MWt7A2uz2~r$9fv|;B9ohanI{?4oFVS$*G$r? z33EiW&P}0tkkZ94uj|{d;EOWr>gpkEhWx3EhqG|aB3&;1(oVR2o|Ym zV>$KZB05pyVQQ*+!^G(f9p-15EP2eF#jjKnWWLHmZhO?rsps!?-hPHol3oM_&v+0< zRWkA-Hx~AJyT%H5XNLdj0?1BCp@f5_9sV?2<6l?wD>578y5vsT71l)So|~cyaW0UFUmY1sRw!)g)Ol9Zw|}knc295 z+n7seTSXV?(1NuW%pE(l9&73?%-IU#4PD^j)1X++BuF zBOwj!XE6eXy9HdWjGX{4({GV=aZG7$T?`qsWKEw}udT^EP-jzSRDs7_^U;u+Oy>o7&klpE%Xd;hkS*nR#|W;L+qD~qJ{Q_ zNGL9~yOaL|*)(G`>XI6r}*lN9kFj^N8fFy{oXPZF);O6 z4=U=cB1cS65jBR_k+lt=Z#a)zS*bn=e#z5vc=Q@pLv}FL8;r4zb}mN?kh3?kYy1`@%~yb<_B0T@v~Aj#$SlK>H{-kZ4wG&-~4ezNs%(197Snl z5G$X5fjPPvJt_ZiDZNVBVby{+sabc^{7aN@ZIeShw|c^elf^U~bWZP3$fxOm$Qn1O ziUpNp=2l#IwBy<>IgA|j+i$izd32@Y_b&4aj(>p1sw6A>7pbXQ2Z6x?CV(GEc7;0G zB;}7JUCS_qz+=WUmN8oHFEmG>_o-){vwOB!UM@%B%2az;)>t!nS!a6k!n45H*`U(g z^iiB%Tt%_Q$BNi2{Yr_BB5!*5r!gN*4gzz6WscPD2+y2?yJj**t*+(5khD)Xj}B)> zeY5>+uKzb#@IPzJCZ!21;n02TVVHk5&VPgf6ZC50gjAdMKmOo^p3XMqf~kLcyhrvqIB0Kho-1AV$SMR zn4?0;k%T1O%`&fuxekMW&B^1&_==VbHLJD}KgsrX|AKl5MQ47iQ zP@a7w?(12v618|4u0Nh+qd=BCaG?b(@T1vvu5O9DWd`x%#VAz4`ENB2d`bez98A$OhV-}d(Tr}?P zagzqU?-~pQLN=4IEP zDF+!+eoE~0LuWRb!}!<{&rdp0Ian|R*!yD~OaaE3{vQH|@@2?^g`01=aN!5%R6Cp{ z_bcYxK8qL#od;f9QD#6&vtzRAB+?*$tkY4$^=l8cgIkr{8=Y@YMw1T4hC}iC7nr7A zPrITw=e3mV)RQr%igib-b>>qhy@@oJ9pf3+dvzz9kJs*Uf7y_Tcnt4{WNAKvJ>FoS zUR_~SXaoLHknk!1#`UbG>q_5A=9Uqf?Yll7`541vIv2*GC)fcyVRz#(dq6)9S49CD zCFzpmLEmvzddv1w_F#2wH?%#hkISoR!ljm@)2%{CZY#X8xjt35e>h*CdJcumSVh6- zGZN-0@}S8$Bm=NHzavt>a#w8-E!-B(3w<_x-yavCy~&drQ3g|t#tOWZ~DHxQ4h;Sb)hXL@?A2zczWtoVNl*^7_Gy!rh62}j9Z{{yDK-o2yR z-bmIUv<8+$nMH_BnLSlj0`7+IPD9xW?~_v3wI`be&OkviuPsy}Eme!q4l8>gzes};;9wR= zY5Gu#;nm2JD_#uM?uhp7h1qNimfNM5Y$uD!yZLhXiE-+>%#|j zz?D|U*Hc)-U*;7C|`ogK#J*sB_9M{zeDTZw*DIUoecG_Y30 zW9WMzBMUIj&MBDxvA=TtLi+AR<-mm6lo`tRTowLC=X+@QxsvTyK>JV47euPqqoeMh z_oeMzOlJ~Mr(R#Eh9)8P%I3zF-=~LK;OA9#nk*p#4%tjq$<8v4<0i9`u8U+wuz3n) zxfQ6+^Y-8Y{aMO*dSvJ0RGq3&mk#HZ?5kiJ3np3{>`pS$ui&>b-yx~3nt4Q#ZX4m) zjgYIuvUK`3?<)mHZCU61u#+hjT)?zSla!zNEaet98%^vc~x6&TPp>zGklFSHm`(1781E`=!zLO)Vb!vnr+*qT z0dyA|b2`hK3Rr(M0?T~SeLbRHHS&@1CjPuzN&`E|i-T(!7z<%Y2yQ`P{j6AoYlD^! zs6qIEiHKIYIj4_V=%N$aV^%BLYoS&3PVCHHZsl57)|f?M7&G&Ih=`Z67PA$*S7tp! zMHUU1Oklrv(pjRmFEA4!9dXJ14y4Oyj}=W7f*uq_wj$;l7DOS8Lj7eub3VaR(HgBx zIDdn_i)*Mwn*3|psj((Jx8Y2=Wy+xCb1f?iZXT!>gUN{T^dnQs;^?nu08#Lv{(u|> zmVq*dg}UgPNbES941B8J z%%qM9#u1bi9&M!O0BnJ>$R1wM^5uVs%ufi2+}nfLdP!4<$eeQ)0|ck#$uZ!$C_a;1Cac()Pwn0NZDx0rl33k~A*%s2Q;3u!?%u zebPMd8=YM~(8%=Rk>}X^)3#@j?~)0GU{znV4^z-5(wp#Q4PR>dVamjDr}xspd=1xb z2m53b5w2s-_OP)~CkRm&U+n5x|nNH#S5JBn9ZN|NMT(YHfs zt<>A43byg`P@M5Y@3`K|R@M(l%|tT|uRoEvI3Dc$|I_CO;YE3vXb+RQ&jwgP@uHhwz^NWXB82^hTXR+WxL4I+Y)9XUWvb?pDxkpY%rjRdjyr}Iy6eR z#Hi%LrXQ|Qsi(zW6aeNWc z9`VitT=wEQOvD`)J5?;QXYX2VCE{NjqUQHAfkw2V2S zf}vemZWI?^D?((ko`_pRs5a&ucloDVkqjsh|?S@r*d%!qSA#b_y#fjp%2}8 z&y!7qus1Y!0I<{~X$RD^Ka@U8E-a+BODAHuCAjIF|1%@TW7l=5h=>2Pf(3KKN2-Ii zZ|JJn7*c%zmCk8bE_18k9#(2kFnH~{GC;NXr2Ev>u~r!K0pTM8CrcN|ta{R*l9rT9 zDi1e=CiGc}n*7=~c^>-7_~rh<1L>a3Lvk!pys|uwe~q4_N0S0vj_5E86LSlJKFDLI z{4c2^$G7Q);fvNOGcQ!IQcy4#=~m6A4u!w~ec>XPk${9lCOpuvKL}$E&u~%T;&h2| zvUSBT9uJaq#X186mF+&0MXay;9o7Jb$`Sci$dbd1g>=^2t$u#g5Xg(C&3CfiP|lE= zQkVx5bBS;~&?0M~cjc`Tu)zg_FFjE;Cua;+C|x-h|7A5BKXBI7T1x0rGM61FFgrlb z9>uQmb7jSRvuZ^kPTrGb)|gy|my?>_2uWHMw&bp!;f5P}ylWU2P+5E@@`MJ{lgAPt z^jE&3uW>L|G$04dwwQYnnhg{`nywrEG{yKsxHL*+OWE~Oi~sxS2joRZe5TaCvLZyd zvmaE(YUpSBfL=ia{D`+?Mm6Ib4^=A4Tcd=wjI9`${?hB9lV31%WrZPk2Def+f%*>J zn{R+QW@=v~DA!-5-^Pfy(kNw ze~~yJ=bYDQG60|EFz9d<=kl(d{3U?A-^Hm1jGvLj(Xhn_+~Zi>OiPkE@_$~YmY;x( z+g}f=r4UwAE?e#qAZsBx`}QUTZ2MQ~OPKf07!;3pM&P`u*q@g}3$Ab!pZMS!#SFGR zE?xA=mADr#gKa7cW2H5<#pgjnDx+)>5wkaeT&`~y@W zI=lM-S-?>HdmG}vZ|$JfHbdxa8tS>`=n#6s2pT?tVjv*)^q)ff%FPN!f&em~lKK zaI8bmkvM9%Hi0~p(zT-mrIrE8cKJzc7$Wdy+S8&VB!i-pxJJr1aJ_**Yd$2lB%tX( z4O2KPwi9(+pQ}rDP#>YaM0<{t3W;fb?qIZ0yT-mLHfCnC{-U0TrG%vCmzZt;4-N+_ zvV7Apx`g&3L0)~1Wa-!OPq?`jx=?P!C{M-3l`3aWWF{tP=?)}Ae6~54N<7p)*%bdI z=F!(PI%#!ozq^TYi6gae?3pVe?<>CW(+B3C8F(W9&F4K|fZ3~oR+TyFx-d}7BUJ}I zvMDDt>DgN3PcZ_xHk=5mPB~>_JY)P&`)m+*v2NDx$ojafHHJa&!eFNPS;Y6u z34wL`Z5##q1ksQLjp@g%At3xQ7oB~!f5jor)#7?3b|3rQhfLN{xRhnH^|sm2EC9s@ zu;@y{Oi&#+J_E({sXDed^NxuPMpCmc!go{LcIiX2_m(KUzR}sJ9jfX3$DD`=VzC?e z(=02v`$32rTDm&#exLptjor#~S@TO&HPI=T?2U|48t&SqE`G~JZ)sA~TcG9kqp}{a zDO={D^gKJ^a>G;wU?+h3f00L)n)cr&ODz~zz<-SWVCF;lVW5$t4EDm>Xy)hGryI2J zF8z<$z_13^!>xE#03`5olBeDMI|0YG?#V>=@tSk&$WDkUMw;5+!1yy1C$+!IAbW}G zl80*j?C{X&j+&=X9Z+9gE48}W51D%(-=d-h4_xTK230MW0|`gw{&3>$A6 zZ$YIeSOxdpV51m2LyWpVP}_Q!ullZpzD^HsbOkPklu(M3+HY0@y<^`V@#!!$Q`Ve= z_$OLD?Bk^rMuIXGrTUa}!1ZX0fBCbvTUYlpacwM?m+p17RKLglRqwDa z2i-a3i@z*Svvc6l-`d@jMYf!06>*V@kRSoV4#mN~SO!Or7~|yuGi{WK?Bl~tPpRI4 zM%H}KciKzIXllhTA%*5Qh7=X0?_|(C z4+KRq-^BAmFOKu>zJmMs305ykAJF5To$C1{jquU#xiGmq=U zVIPJ(S?vc~qVwP~cV5aVqWICXI}X3=mKgHqYX9w4RP>>V zVmyAPEJWtL=IpQGod+D#*L6a%rxcIjG1)6ZFH!fVH@%GBVctU#qX#O8kJ!tg^=xZ$`+-@Da>^E!2A*W{QF59)wA}Vjd{un~?6x?VRUOVm;!iUH|q76Us^ldJ2N;SE~Xi zd&=bHZi-jL7Vw;z9`;|W{6xE6G;J4CnOoH9RVdr})dq5XLh|1z!fFBt?+tuJ`duNt z7&4eNhT}iynP;AnQpCmuT4EYFvaAAFiWyFd@G`g~%nNXq6ArWd)28;V@&yLS&x`GS1C?AJ@-NMI)rMv6^#=d%nBIRf`2#@rzo=fY&`wT4L{3i5 zmqF-Nf>-}s|NkDmpA-wS&O<)LuC82u{4k(jZ7&4e&-SA* zAlvS?Pt7ISAT&>X;@7?E&Gs@%vQO0@vw9WT(4lWK2^jV<-AxerIVcLg?UUe73J4jr zQ^E75cZec{DQe6@9Yu0Jic9&oDBwb>Jo{mr_?xAw${2q%nFk5F6cYy1NaK9ha<37W7#J`fvZy;e(4!2gPB{0U3pi0l8F&Xg$RE(6%b`C(l z9Mj*PT0RGAip7Dep*(-18yV;D0rvfPXNjyBcC#{_*7{eEn8ITgh@7^vw(DOy8d8 zX<&$<*( zcBhmY&Cx!YExCC4*Jw-eh&9BI8R)Z$7GXzSpMwea$ZXw;fFoiI4~eex+-;AccubEf z?kh6?NIcE>3$zY@+gAmz1bug!kcEk%B()SgZx=~q1I2_5JZ74)dHFrA*pXYy$&j^f zj-n`3NA~JOn7>J=dfG8o54KW8TXm_D!Xq*?RziC>^o(C=2_1S=T^vPuPu1JM$XM&L zgNpXSc8A1*mx;;6^fd}_ogC-7xI@r%xeUh!V}MUVEE@Ktz9Pl!nh@P6#bZOTw}O8y zIJdO&QSI+;yeizI`6qHXBk>k?xcXgc>5(&DJDyWP7XuuDw`iEw8Tz2ovr(JETiJ>r z)P<|Z54Q{sF8Z>(vm?Z(R;l_d`3Or}Haj(Rs@g(}HaRgl07%}NP5_DUqO4}`+s6eo zOa}LoWJUVGdE|e>u3Jq+`#&VSHUw%4+%@@7hgRfMj^_R1F@j`bNw7PTKTEc$a<=Q! z-~5nV;9m8-K@n0}W9}$q+R-Xu1C>x^uD52waC2?^S4x3QQPTu+^xRcH{tzqMiJ|Et z8E@OEr}=tt8aP9Z&|NcT-)ylfXViCkj$d$K8=N7M%tzh`tIqqckVb{#(Grju<_4ex zDwZ$G6)2J64m3>lSd7APbZ-NXED~;=x843FJbBy>fdCb{MoC=;Nw$Yu{mcB=-L==d zS*E^U$84LDJ!Ko2;JzmeY!_VC@H?_oeB_6NecZpFKOh;8OwMoaWegn24_@?e)$%ya z6$4_)l%joUF7R{of7^Gdaa{3anv=*I&Qb)H(ak&HBRJadenv!~%3b03q*UX%ON*Hi zjRfeX-8xHe+(!{W|FS6l;pRu&%1C#)oorR#MEPa&$Mj;Nk0jI6Gqgr4T=OC{Leu$5 z_Tp{4eJ^Z;XtB}On37)3gQT@aL5G}$RGDcTKHsKF*eC>XNT zp(r8QFT8nd(8FnVMx1CpR4_!c4{iHxD2X@rd!Gin1ow^cwSX{h#O53KqSD?5bmlyz#*M8%7 zrYKh4!|<2$M3%=K(OH2$hw&F0HTfm~l2Cz#{pAjoN-07DaE+)({(%5d=63R=kpYIOX&e_4~XPm``D}Bg_3qw$=}qmIg9%PY`Hj z?f^%H(!SGD2mh!=DFC8)tk|&F1Jk#YN~CqocSfORnZdoVUT6Y3pXa?~x&k)AcQcpS zRzp&b2)Eoaz&b1KwoA2M+e8CFznI|g@5_9>vC5u#*+DtEDdnj$3 zg3F_aJc){$XBFesr?rzlAn0|PGXfBO$Dib8tP+81pTcdnuKv0W<;PZP%Q@{{ouaiB za}9a@8MkEV4$W}LtfTD&KfxT*B9cKBVGg)|!_|4Zg5-ED2eZlu-s^;>WNorAD+jj~ zxt@yOYVgIuwfDd0#c+U>BFHnelq@zH8ZaG{KP$~dZQ}SJwetCCKfaNx303FtUXUb? z!OTVK*wA^3+r}6^{*^s$iFwDY{Xu!GUwmtzgcUt0fz3P!d@=o%YqQh)@%N()xkieZ z@vmnWiGMDUTota1(6c{ojBY9_jwQBFF-1Oc{d88D(ZD%jY+TY9UF^~$mg^@or_6Aq zXR@^#;aZG>)I8u}L#9hqE^9jQE(~8$6X23*HAcSC614_fg3zu z#(H){5wi0C+#3+hcynBZem4Ko6~5S_z)dtM$PU>pJPqF4F){tvK8gqLk@|%|P4oi}(=8 zw$lFsM+f&MeZE@?_lzgq$MtK$fL4p|MfBr#jOaCI{4&L@;%%a8-ScZI@v)Zjz%EVI zoO3e*Wa)Ia>MP0Nq@?&{O8FR)$78zTm#^^XNT=NwQzuLD<4-*oVP|*1$)mxbh%WQe zfj`bKJQmOcK{Gdm%$)$Dwn-JC0CaK@#TwrdQM^Ta8j0^O3k537ho(@cb2v=e4R{B@EFncV_r2#957+cD9!{|dCw|PMtY9`W5e3U$rcR%oo;r|`p~5oHe2y@zu&u_PG*@XFUrafrx6MKQ|xHG)2( zl(?_#pKw~@1p+OgJLUp-N~=XaKnYD!?6~g)u3u3*2}Hz2D-Zi{zki!D`RD2r*!g@g zu@oBhB7WLBmp6;)lY!`1Iery^);>U$G4-1P_Y4t9l0>{2-^d%zbf#^b!q;4zYO>Vt zp@s(cy;FVnyDtN_&}H^}n4bp}F7uv*J}pd}aF6WPj6XCP;Ik(qJfY78Mz~nXQRO6B z$&bV_RcXiiFyI>^i)B{N>?b32;Y~rkhA|;j)Pqd^8A$J@2GY02m~AhZUKo zG+?g!HAoWN|1D5TX^tzSGPT}<_2jW#6vCI<_O)cR?68%}g}mjB=&|igY)?KoE9qMC=8Z6V8H9QehyP(>EkFj(}4^?{RMM zJS|D7RWFf)ei-kgVnE!&xoGIG6U^SUa%8{#K;y%{>(>PpP3p8*M2$3-?w^dI_F%En zXM+85T~6ADQe*Nuy0B%blwPS*jvq1?%b|H5O}mm9uaB2k?j?feOyJL$rps{V$7U7_ zY?&X@Q^xHf)BPXehZwohg|U%q!Q1h%#~;^RDCR>c^Sf;vwjLUq^rp7EXW)hyFRZY0 zmNp;ZT7QYW&^rpEd_=-rk6c#AN-yls7WU(TWz++Puz=g)k9(Y zY5U~Tdp808=73T$usU|`Jrawz8KEa+9;OM3p{W-FnXR?N>eCUGL5Q1AL7uDXekiQ6`XQxS9QR(Tvs(Sz0jdZ@I{F2@f~0C< zk3HdM-x3zW08!xb9v)Kj7@(Dhfiv=4+!Oxxc?V=0mwg~QD6-+XnxWK$>fI_!a-?bJ z@lZol+_3m&3d(HAjRd;Xsb$;z#pMl`fis zx$^K_gva4@R*eD7BddZSJFMlq4*9(%0hZ_a9aU=cb<04trtyvc_)A)@vgZjul4%K_ zDHmLj5vnuXm0M-eyVz&%tfc3ElHIk6z2#Z9u?Md!qrKM04K5xoTwMZYw{I?&*I`nb zFOWs7qj(jBL7B zE{$mm4I%VVVhIn?q-Y`P!Mf;glW?^gJqS8RoKdHzne?mw22CYDH3sN>vy4TxfP`Mz zjr>^3Ds~84E3VGCV@eW5L~|(e7x<3n)nW*~u4uKtg3y{uz3=(jNREWe6LtEWaLv+m z8+Zg;xug6u64DNVcC@9d1v!WZ9tUd~U+jSU-)CDq=FK^)l$jEeZ4;Vbt1qzwAq^to z-6sg@Ch7aHfxna+J099zQ*tlBYx|fXuP3x|)p2hWxz0I-j%VvUi3Pf!3*@WUc1U*y z`B;rlD?uE2uLa{H-1JaVoL-vdC0EjB?QUlN_h4JO5{)TT=drtlC!QwFk@>-}2=1?Y zl<xzuRQ@xby!%r)>Ej34wVM=N}>T zAE%5Dy;42G*2etboHB5cAeWHrW&&fE1xWEIhI?p%jOcfjJ8;t*WT;{7@SD!_;qA{U zN1wN)HEX)0~_viM*(5M&6 z&R%{=tDhPn4xJ2#QE2c3nL)HAHmR_hBdH8XQO76M@r~zB$Z(k3fo8NNXEX`rM?=_M zL3AJf1Q<Hr+pU(df{Hpc47o3grTcF_o>3in&yad*Ht`O#&96FI{&p$)9KtNQIc?6Jb?3DTm+XzA>q+Z zZgx*G*62FFFr(jK$#MkaK7S51@7yrSkpcO%ZcA-R&gY3)#sS3?b9~;ejF;eE_k3%e zPqq{e70vU03L=!Z&cnD+<+G;W^K;A+0&r5Hg$hBo93OwBGIeswbke&h0N;G(d!{!0 z-w^~MY#_#o!^jPDaV9aGf9=+Xo~#ltA8SnIzlRfDZCF}Nu@J=SW~OCRFq!3X7&++ zv!y8{B>c4)-`0SetDAvM!F@`$k?nUw7~iJ{cwMBbL_k07;Ksd#mPH`1fs8vW$%b}b zqrAjPk&lWalB*u^%GwVe%7y%R5zOaupZIs}d#*K>b$Iqc8FOoVE=Z zyWYXC+LbTMj?pKnwKP53b5F1*M~APlvr+g&ua?1<()C4wiX5jlw!PqV#B}2nBERyemUFd5sZB9=>h*^5l zH4KE0xJzxOZ;F-@_VHin4_C`x9EW4G zg+uz#zK1!$CLZiNo^QyO?a}P79bh$-6j1)#v40-WN9YjY#Cr=ui6g*_b*4(ovXqOX zKk)o(O-WKEsKyu+KYsI!M=r9C^{Xb$ri-Pl7FYyZW3BNM9R{KIM)Sl-Go(!pruHoj(8BfbsuAxnSHSxW7TS4=TzvuSnXm~wK>way#+Bj;fV_rz zu`phRyrQxHi0vR|ouvMkP9rvUQX1TsjF26?rRX@3_klaLv?Iv{IEwOAzy5#^G9jff zkHNdLsU)ad*<=W91Y;yLcUJ;hK<{v(e6UTQTSOpSn8)veu|B+pDL3U|Cs}+Tt+Srk z0$cG>wJ{w72SFZ}2oKH@d1{r2mggv7i%$YDye=5JO?Q$$l}{FVTGD#Xb|OX@6+wtRT|pzxgOHJ+qJ*!m~iZtnrtD*uthT zRl@_O(}m3j1E(*y6|i|It(PGdm>}CpzrxY|hn%ngM$4$Q^z%=nhuWgI(`gHopn3ba zN^&^n*>V$#p^Paw@=4hFu;3%HQT$C4}T*f*1iAG z5b=}jO4MW;1zAU+d6s(Z?noZfLPvl(Z|I@8hk1Qse$$MR@H;|yra!TpDM^tp4ud%? zV@dme4CXK6L+C*xp=#D({PxOF_lw)-6d9n}SB#UM+AM}|-!sGpF3||f74VW%iyyEf z1|P6d^hR%C%kM}PISZWCE=%}AFP1a@Pw#HW>pAmX<*F@*veOUlX3!JpIivqF(22dK zSkUONOxE_jnmUXnbJA~FG2u9eMQ$X>k;06F&Tf+4nzr({c1)FT9px1ykjLKbMEqhE zGD5F8R#S@|&5Kt3t<61B$sC;x=`daL^8AzzITCcnb1}~kR+1Mzq583#)0H4BXH5TC zzMkRZvOU3LxHF*G&CtPzT`AF}OFR~~I=Z?~*;lFi7LG=CmBs#4$9Ye2^bb9O?rN-c zC2F*^-S%!>Udz{iT@ViDh}sbR82^Tl#5qZxIL8U5-3oVS^WyK{7hbVx~e!vK+*(jWp-(jZcTlyr{n21ktUkt5$d z&#%7kd;R!tuIt%_k*7s{=>f@2VJ!la+5z=7Qq;yt4?jh zEb*vJqA>f|hQf+dH>OAsPMG@{fWA{5W5rI(?%_&RrhQ4?k(-^Y0LhUzz>8Z!ey7`7 zWRc(aT$A@h&xj_OL^wEtn9iYIuNMT#e|wy^{I1~&t)BdZ&$WVM=JB_}uK3QO$lkeY9rC8V74@zayKJki$i!oWBN#R{VeuNL1SM%}AR-5bZQ=jT+kVz?7 zYL%sbv>$Kn`Y<*=-#sndy%gbgWB!*fm)|5m*|S>Q^jG}rM&HXm)0I`zmtQwRWjqP| z|MQc+l%?YLd+_nf-+!XL;p9mO+~krnXv>#8>Yh3%>;$^On9DxEtjJfuvq{BJPCPurpJZopbTAxO(W}?5V3eS}EDvu#*l}OxglZ%D=_SW8H8v zCD9uTsn~%`Q4X$;UCIOpQq#8t?_E0mbEJLyP41TMS~pYswVpya=F5LS3#^S|WQ=sy zA*`TKh#8zQ#O``z$WDx;mt*|`UsqFqd%IaUM27JT+cNMi`j_-E<8KBb-`l~>I6!Kg z*W3sZ<5=Cq0!RFp9I~z2)a@+BA8>VO`c{J`_(i7wi5^yh%|2c&))?AUsT$p zO>bHGv7No4k?R}CO_u<*`%hFV?K^f(e=J4QLeIsNzz+bN3amM#mPp+|>;Gni)R$3U~WHBatC8>}XpJYANq#QGw20PYXgi zR_nrUYP=9qU-qVJpHbQjGgt5@5h2+yDYj5N5^+L7*XJy??>w)5;c^^*yRh(#P@;`c zIUmCbISnPBjg4b|8Ae0yW&0UtaMFXD5)hD#7E|Kau{C?+L_#eUA9F!{>$pgVU++nW z*kVzM2D_7Sm*+|U@awak*byhuQ6X*{kpF{8wT7|(bxGr2hI<219o&e(=2}+1U4NqX z9cIF-$06T&qD)+T&umK2ejX9OVu01DGW2sFF7xT+@;P~jobjP4Ax($SMSWnP=*U5+ z5tN9IG~73ZP;{qYTjUEwV%=rRu z&mJ&RH1rB0Y`3{Ct#n7CWsttNyxCJy^R_8y3Ixykg!x4h>xjhrvt+JE#H1Y!k#OPE zeK=XEkDT=nWXu3VS~^j@p1)hwhx$pB68;`ec(rbt!Xy`&NJn4rmzew3l7yIRFhj*Z zpdVrNYj zeMT#X3Sy2`b^(kkBfrlDj>|yyudM0%Q81KuW+=UZ5HWF68lkK2?xjy#3WSYS3jfd= zH_veDh{34+L5Pm?N-2?Rq2 zT(X~(d8{-kCHJ`{wPegWzQ}k77*L7ew92R`b1$X*D;f)ptONj zc=xF~ZOq3+)Bt^ufMr94fE@yc2WzM?wRs1j=DDn5$wt6yv&Uiv(2m%`4H${!5eMDQO4K5a40=X?-cf9p)8eeCbhgpH2 zy(Ka(dI5Ocs}iDV4ZXzVHtKpo@$|0*Ip`PEe4Mge|11oP9(J>Z^^U*yGYuM(4@)UI z+UDz%o`|J%9xjYP9#JluFOSU;%?%WF9<;y2JyhC+b0FZzNbN#YyR7E^54SEDiIL6jgq|9Rb?@H@rQtiYXNMRKIe4MuU=rT1;l0hj>Ezw8{!2d`Kr zPj=UV$(^vMp+-Ht52)yt<9eJ91JI9B&*S@pgVEchbU4aPSjYr8>>sP1exJPL{fDIU zrR9UGSb@3cwmC(KQg@m7TIc%7*aQAQHZ}{j3dFZR>WWRPxXt0#`MQC z<{fqa09rbgnJ%?MBd31)nMZq>z%)Pu46@ILwl!W>I)C_6_taNf9a9-oXGl{XI{3iv z(@ss>@569m*H_s3Q!?W7&ec>1W9fd%Eo?FD{K~)S=}=Ij_(XGL?af8+rp5Kq;RuiI z6HEwx=k-g#WcHFJRLi>0$I_SE0JHGntAmK-C9G8eLV;m*f2j5?I6OU<~O+UC=|450SOVgK8i#A)BWi}3^dE0uAvClMWb+4t!t z^a+3UrutXp|o&Gdc?^p`M0UEuM_P=5(2e^>+cil9;M7&3OeTfry{g_9uFQ>9p z;$BM1;dibLs6AL4hY%r$t}|YYTWl`H-H1{H5u%gD>;>yEJ+ooYGw;81A4MizHf!*) zxMiL?IZvqy#wM5E(T%0jbE4{!+PG_j-kUQ#eOa~tad#2#)fRccBnPKDlz~_9JA@mV z@@XM1$Dh%@5752)k|g;KtRNQ+p1m72TwkL#N>q=ss*qRrqC@1o1+_~ZgJXnP35vbG zE3S^5nTMFf?zjo62Il@^ag1JN-@ z7mx2&yEjtk{A?+vm(0+kFq0FtbCwg*f~9_Q%$5F??l2T=)t_uvx9+R*<^e+H$^{a` zK|RhUk$ta2l_6jht1E*(Jx&Ll3*RRuoNsCI%5J4vkt&fq7zPmJW$kPsvF zDk7gD z#f1L@_WcJWp3+Wzw1-~PI>kMuu%Mx#$x)*qV#f?yF30}|Bmeu7C%}*RSGOlNP(vz0 zQju#~Y8N7G=+jl?czcvqcmuN%`-$Up!P>YHHWd8T;d5U;krjq~=)E;9^ zqCKVeHzwQwU-vHnAsNc#{%!tp<}xd8;#ui%RG^E7n(eEIc)X-gS3a9;9>KSkl3P6Rtb}MV`ef2LfL2O8hw)y#>57wI_D(1h z28;=tk_Ci2mls$Nbm72!Pw8@)$C!8rcEVp~fB- z3MdeGb=-`<8eG6pMCitIRcWSA;3|+RZKvvK<^O`_9bQ~)CU zyYA=W(uG3so*-bhbTEsV0P##!`fL0faJ-(6?!F26xa22W*229>o>V;Kgu|GJa@K2n zBxXFDEr_sJYCHOCIyydfFdo$TKl^bJZ_H%UNgOw>Ggukjed=4K!|@A~ui%+&iX$CF z$zgV~cqHXIqc$I}D52gK`Dj0I^H2Mm*a{w! z?IMSXp!n9K`@a4)GhAR&610G7eV`NbsynNxcY`)&p}t;~`bYVRWSQu6dY$$>OO8{P%yc*SqB!O`_=BTYCK%r6%*&xG_f~{%Ym1KfqOTurY=B zU|5PJ{&>pr?VG2LO^H@^9YKo6j?RSL^}aEnY*t>yy;Z`9JbK;bFK8c72*C7@7T}DC zWMeYl!~z7b!yo<%%$rQMb?mTyC{Il8+RZ<+B*ER^VdLl0^?nGu*5<% zm?dV`!q!%g)g9oVD^%h6OkCtDa*fYz&myA{*<{2l>L@P+uNyKXY358!O*a*J-Y^)Q zdKGbGCw@_&>9*8VaILUpw8b` za6=_LsOT*#bPm=~n-9(a{5z~%lZ#ef>NAwNZUQFY0Nnw>orQxKvKjOhW=~hF28GSh z1W50XhqD#ojW)tPNavfJXM^QpZB#qq>ICxbbA>_>iGmgbx1j2I)?7?gxaxBq`cUgr zA4~_S*7LO&0A!}~L4vef^fVVs)SoY<(cEe!f(!a54Q7;x`tFyh@k!`U&|sIiWyojWSNpLY<4IcNEPJEW99r=;!5VUK{=4&M z;ZXZ(l?=n&na@`5L#6{_rvD9~a9-f@WRg}Yv*)41M2(RU%U9k^Gw0|}XW`z$?{`0O zdh8Hap&6TJBrdv9Z+w6@sujLht>Brhac z-t{7;YnWRqauyu`0GIxfdWLFtlY8UXO+ng)(bV!y%eTyuBeoi7Ic|JPO^k$$>_q}C z_YM^WC=tB$FeTbh>;p_;o+TcSO`V&-tr{|O;a+lqXQD}L8pM9fX8F(uoqJEo+)X=9xxc0fb zF_v!2f#5bKBjl*cah}F`SR+;~VRH7J#x+dS%*P?*j7#1+#DF)e4}5a!Pu{Fu%lGr_ z^^)!zpAX?uw|?5bA1=1*Bv6NDU z7V=-DEz84$-QNaN zO8(#M)&D>$_v4P8{P4Rx=c$fTITT9yl#IeG*Spi38~>BW3IN=6RH8L6t_A;Kv>$z7 zvZirkoQO{caT7?@6|1lau>?rRfwx%l{tyDWzB0AnXh}QBt&^qV%0>&6$jbedy0cpU zUSXZr7f*Zs&T&Kbb(5#2Cmo}>pN|Y52>??n_{@O**ZTnNonH=6=J`LM>)X+jq?UvNW!4;xY>v2bQ1;r+G8kl53Zn{1 ze%b!O6oGx7$67bmS;IRZQU)IUx8G5Sli?J{?C~mwV*=9JDg(SovVtuW#+Ywa?!ahcHuo zf-fq`IE4C~9ze$cY|@f=faqv&>QRvYJs^I~#GcRLIp2ulCYl7ww94uRAGp;KMJO7Z zO1HGnjy5h>M&2gpCY4m>{ABJ&BbS4KSFsMa-b1CxIH(kNjYilrVtW~i#>}&R$~^}G z?!>9%XP1159M9IBY5g=o?V{oKRzvlvx87QqpM#tC=$S8tYlIa-*3O zBGe6Bg*w7@$z}Zm4+4Oui?N+2TwTvY0k7Afs_yCxzvGo2P1jXNwF?dbq!6j+zjVdx zNFVLbq@wof)C+sFge_$rT6|>ia^4c&$w&VPH@#Zm!+&b;Uv@ZI4JqzEL7Y;f+yeDW zMZY6oCKGBY8n0sA<#W@+2vAH+1rRZaG!eobg`JUrA_pC8OaD&x5Xwv-Vz2HKKBN8t zy#ZR8zu&0N-oM_nbjl?xsgXD&IcbhPV{*kG^*+C?;Aw)n{oy{LO+NW9$(3X^$cHv@ z^_RL}tYt(X&TV}q?EIGh$5l%lB>b;GkRI;}*;!m-H9B*qWHotT_wC=|S+0}~2gOAQ zFozRww-)`1?n`l#3gzXcH~>8i^6jpCYEAa2RsnD6Z=+?mDOjmRTxnpPfD!yrR8On( z8@{3buK-RU!&sk0d9Isgr4k1Qt71w@dxM26ruFJ4sZn<^dY*V(xzqg6qVd?3gsH}J z654X|OsyilF!=o;gJp{8>Gh^w3wxME%?%nr=svuiB>eNi`Z)QyFk8wk5;dr~t5B(W zjhBXN{qf7&0ydR=O_)ZHff)~6lZ*7Rkr>&2<4L)Xzf5~c7XrJ&DQWnSqV)e42r*7Xe2oppRVinSsBN_}WhTvA9*FjV^t9qB(&hzCr>W@4)y(t=SE(ShL1pe= z++%ik){nhD)9KA~crNgYjw-#iSyK>G&nNSPn6p;5{DK|7s(9>|SKsqgk0rg)T_iqX zDRZVvsZdkQ56!%IgJ2>}y7ru&qxpm%Grqa-^lXmM5#kKUCgosG()pIpD=jQ>C#R+U z_EKS&@%-=nhVptU5H=)fANRPL?_|MJ4MZg8+mv%nKkUaerOLt*PO>Ok-=e-+$%!WK z!C8pYz@^A9(M0RL>;7aUw^(u(<-)efBb}=#KTc#>DuXW=8ezAkno302t4MNQukQOK z{{G4!xTAo(EpP=1_rp*r|Rg=*pJpU@w5_$4ak&buFoQw(QJwCS30<7f)hvHKS$dCMXo{F&2;`g>ui`%L$gnL%^Ey z?SR$6q!YtJ2>`j^8fy%a0Y)`MfDv4K=QBVT%iFk zC{7R`dHbR&<`32$f;Wc`uSo0DLHD;3;-MU+ad;z(QeZxgrg?|uuZn<>0jV^AbdW7H zikuIwnnuL;zB#!Y%e^)D^4P|K*AGWRzK7q`jkRwZs1biTfI=g8R^^WO-RF$R3&}O~ zQQ<#y%_R2U2^}~^$R}?$6#3_ie#8Br)H)O@F0;@HbKCTnN{3-{_m=?Zh)vf3>@r@Lo?Bo1gJ9Tyl4LXH>5>T3CdEOZaYP za^ue{B8Vv<`rLRJ1En zG9lF3H|ny2`oAGY`jv$iXBZQn*(gNUx~j{!PoS8z=G$jt8b&9!rBQ()T$ciEdI}H# zYqlyZ`k-k29EzQO%UOWQ`~^q;d!{q5FsS|2V(P{TXB6BYdn|H~r;!KTePw zXudRkQSMu&mf1D6JLSH?1woOT*@s&Dn!= zcyFAWRbM)iT^bJ@3DZ3CIjn|$ya0BnnI4dRg@oB7z`L7zU9T-~i#nm3X0Ek(y)8+v zeFnhAp%B2J1*9Khd=(hb+bjV` zv4VbtYURE{U4Ll9PK1^e(uTJR6Y-j**)0o6u&1>w^OMDnNUYnM!Z|Ge#O$YYbZ8tc zt9JEjN7(Q_&D;u7sI)TvPaXCDMWT-kfKxo=BLhC_7R*3LCj)^~A|B>V`cnt~59zfE zZHXfPX)G(>J0D0Zx&+10CM;HUy=xWfY@m8k+Ox%=#eaCi8pI#QdeM{N45ykY~ex`<~>+YC~nA;hKO3 zJAIdPBnI)7{rj`_6O`z?jE$uw(XHS1{-Xi@w9Ik|(~}EC>IP0p^VLr~or{zKPna!Qnyfi#mijO#I_UVzNgY^73>Pj}%`O?%n zRzY+#;$mNs+w;=B`J|GQm7z0>T(2Lsf{c0I}MHv9F)F+fE}Ro5k$xu z3$LCP8rrc|U=%KxhVZ%l_ZU~XArjr&ujR}@4=Eaf!XT%y&(KD@bNpTDjBP1XU;(+q zLv%E&@5!%Bo312aprG5c9I=y+@-fHdBFyx(l;Lx~{;2Z3SNx_WF*s;}wZQ}f_DKKRioP%A zAF(v8=JBEqreW<$d8Lu`{R8OWSGI0*ltQpLi4RkP{XWArO*<)zSpsAE3k|Lu>(5 z>?LdZ7k}=1J*Ja?5&`8fZf-Uc`@(I-zN(+RXzrgxJoG8;=Uu>>L*L3vdF6ACSBBtE zUZB}9-ryMB8qLF2lM;!yScH>rMPj5@KOdTTw^tlRK(CMBWJ2M?dI?`~tQY}%dsPSZ zvo))7@Xa$`1bYk+mZPNY-sB2ZLh>g8&D6Xth@!!$`~80X?dRJ~TGPIjj_%GSB7CH+ zl#{gIn2@`^1XV#^Mn6z*j{2kH0ioAx$i1To_P(BB)L#C<*FUetfJ)0=NS^@bXS)v& z@6iK;X&%NEF#OepoV=V@%ZfTT$tm~ibY42HI7hpN$+hN4D094zZ7$CQF)=bb8vGW; z1&ea+3FC>&$(TylqhUpzpzaf9{L(WVE|wXdxBIAom`8h9^NaMg3tO_7BZU~)!{q@4 zVw)kP;sVWNYv*Ac$q+~YGQZfZF-IPIuPwDPM@x)OCRN)NXJfVrzzgMlXLNj!9DMcy zQ4dX-IqdS=q@E8&?ZFqr^BrNPDX*{8MK;rspx5qgr(IB#wR(Hy0dx-X6RPAvM z3g6@!DtU;J0ju4CE|w?U4IAdf$Pd62-Z%XpijCCiLjbQoTno(GM1J`_ zFZRqW{cYZ->D0xrr^wwddIV7VwIw?v%FGjQAYmOM7V;Sa&V2Qgl&?Mo0ydMO0KsFA zBcQ@=>p-LCgXcrxJ`J~|v=9HC(|H=dxw~r7eE!O6MIk1C@X`(L480yz7R?(1Tm1-1 z{wfvi7bzqXyvi!T){5(nGdT;?dQ``mNE&ZlDBaB9^oS-xQj-V*5wj@Y$?SeDHQ{_} zcr)V;M<9P+jN9et3GchV91-aO$j{|O#?r+%2Jg5BeK0%f^D-%j*mA^5v;mW9hp)mg>#HQeBrFY;W!J z%$DHFg7#>zx9|@j%s4COl2lYq#Avc2pBQGh#I_K+@%#HXhc>2AdoOv69p~&%)5NvP zL<}#Bw5Z9w*4~n$Mq3YU_|zu=THn`E{L`1NI%Y!Mk?dTc%&bqnCu7+?_hXI&;=_d= z4e&E7{kq?7DkpD*J-4JXn)hmkXffIOD)jL0HHZ}YTt$4)ZpTX8SG$Hw`Ha4T+%A~o zO7k}Hzu2Gg!r9fL!QDJl+j6e5UwrxD6(6I)aZn|%c*l3I`PROtuXcG0=dT9bTSVhQ zlaxg(@^^!es>9a&=Nmg>Px}6bxqP6I&@lET3N`ye&TLE>p#aw#$sx3gBt}tX)j=Id zmRi9AZP~Cdp|OF+mNyQc_xANzQ^oZovjf6kh@<4|CHvgWN!7z!h0rqdUb9$3<_js> zf#(ZS@!SCJ+naQ&MXI1#_T30*dRreTTWBy zQLQ?;j=F_suM@#yl@vY-qXRmn3R=A*1N=`v{`L~@o&EbcrJDK9KNTRJh83_dFtE=g z3hf-d!gx`I#5uB~QZ~T8q_2Sbnac@vjn9eJa3ghb} z@M+})(*!+v=S;)$gZQPkD;3BfpS6uTfv-H1k0_UJZUL)QjAH9~OFOw4M*3f3ts#S@2EJp|uOJ zBfzaK{mh6=9}T+pWwlsME8j6TUZ@joKQ?Q8&v1b6yP(>*ag=4_Ka(c!onpXs1mV2fO9gqU#j%xt4JTiq!W(qIjQnJ&K|9w2AFUt~89f5@ zWjbj1ImEo5cHYXF-=bFwl+;ku{>~<4E$qrr*#?WgniQF@YAL#ak0-gK(!>Q80x|$_ z8k!Rj!1mX2(x}O`?$QHo^4cXPvH(m;!nwqZx`jGGh20w@^cmeDOo3=q_Hla=(D@E= z8a|jK1ETzz!tYn-RvKN(RaMsQG_es81Y5`8Zm+#X=eyXCG@0AmH$7nfx_wJspR@F3 zK@m%a0i~*r>hUAn#srPZfSV6`D#wJ6{Mw?wxW8FO);>Po7HYK)-@F$!>R^i_ben?C z{V7ZOsEtP>5rC6Ol#}?c@ps3Bgu}nqF|c_Eyk`rmbbNH+=K}+lsVZLrybaqG^Dgjs>(XURtu zxJ9J}JGQ57O-n2_c+r$)b91Ibj*Tz=vRaQ+C=c}5^D^|TR0+l{bjB-LK_%p5lF#K` z1vU=MmbsqZ7JP(1et5pU4xn0mz{)VYHZLpJ-+x;lTD#1TXRGp>JZO#+V{mghB>T62 zUMt!+dZ$={3#L)@dX^JsXnHyklBiEk)SSRRf|dU7H}zZ$ot;mZq4_$`%vzDyp{T`E z;b|=*kU@AoII!`obe~zoEfzSXRIqTBZ&vVR)#V1NZvFCNL!=8SqO!umgK+ki6rz~a zyvpwG>7O|k3FD_HABPRKig{rOv=1zQt0fPO zsC>x|2r_DakchMN%7A{|^xMI<7{7MOAonVX9hmfZI#Vlyg{3(#-{#1dO@wp|?Vwic zD`F%|&a%5l>~jZwhcMyh&rs1LCHGI{)g1EThgu>d4ox`7+8`rgKKO9?P)Q6y#?Ila z(uO~Cluk%Nwn-oAYF94_(**z#lJXb?x#^39HykhH?iwhPS>}V_iX#5_9a)i6I?X{( zB{fINb)@Ut%liGPRLzQO2Dv)zCDL<+$yI{`XMj8Zpw??R8BtKNRBoAci>SGq_^Jl? zuV-0ba{Zq45tbH>Tnem*X9K#oHxyk#Z=XW4Cz#pd?pUK9M7i>&f@iK2;0Lh~@Bu-N z9?ZU1q<+8lx0a2!IaxjKwhIu%(w4h@7d}uc9XJwzMXL|_&Rhx8$phaLqlO5Owf8=? zw7W5gz5f$lr{PDjBvzkEv6Ef%ewp{iYEjcW!?R#p9Og~BeS*FbOg1#VGikVBGb1! zwxC6RB4m~1N4B<6KU?5F>F6`_iHyWIm3`hnYIDpJ-qF082*7W{MGrw)Yr>(1?ap){ zyeD2nIt;7GeVm*`{2R)!yZTW!d|BbiD?$1tGvp0re?6BgL;(VJCNvYcm@btCLcgxu zZ(nVF?Aus95^BE)WL&E&YjP7>_CKV*-}YNe*|n@6Q_iC3@E83rX+Hn?V4u^Z)CjZ8 zLL@%r(olfn=;9o+$zwA)-`yfzS6oS+wA0aiWEg-V*e4tKn+X0SLwBzM<|gYPIF*Dm z^Pxzn`G~jx*KBJX{z|c?8#L$Nzlepf+t(L4T*+*{Vug94{drZ)dWkm=ubx6aKJAK^ zNLprE+27r98XmwDrBBHdZ?(M&bK@?5GN=c^z52kaLET}$2d0B%sy;QX>n{ZT@GCg$ zMh6v}Qp!<%5F=H(VCPr&f>KnG4=XwJF-k|-N!oU)55RB&E#^Xo`Vs6fla47dgUX)X z6PlnCx{bUE!gRMNPAP-5Nt-Bb@zWE6D`QPOo2R79-`>$TwycWK*xp~v!Z2y>#xH+8 z>5!FIe=GwUvtlOgo&=|?WT;QG8cXFE9aA!1DnZSNT|}~kAVAesmUn# zWBH}CvRA;~|KXJTzhLqG-G8aV2ca7+RU#rHIyeGF9Hx$L;%xozlJ)82GgrFFupQam zYzJtm9}%@U4zIM2A#gO=t=%yL5HE)c6&yN1uc3SbQ^;s} z(FE5@4q-V?slre(G@H`AsV0*|f(Q684HaL>pG)tZV|JtZ{on7$?RH&{dnP7ZHTH`@ z^6l!Fi*QQ&_YfJB`-J=rbS;9i^^6T1cY<^^xG4zYi_mhNnO!F#)HlNtXt?_s>O>a$ zsfE>q7u%w>m+I2Dnd2o}&dqd*Ynusc-_6E|nt@sLuy9`NS~qJSo%?Z9Hpbtpm2g!D z>}?^b3>GZFD#n8~O*9>-otBA)oN7ql4Fg2c>e19NsYxYd9>bmGDks#^S(00pm-EjO zx7*Ri_HcY4|LHWsto4+2{*s@G9;SbYzIuC7hZJA3Jk$r6*~-8ciZaTQySvv{1=mxx z4yB$j1_DOKoY(xtRx7igf+l2fC})uR*8HZ%8& z4h~RNWygbWrR}_UA+*x;cEky8SlpIY&A?LB6S3{b#qg)?bLG$lxETRbfTS3S|0swCFy!82 z;K)Zn$uWtMV0`4Zx-<@dNw&xC;0rI47Iv0+RP?VC5I?w>ZhpP92Ux!zI$=@Iyp zpRuw8Y$j~VD%_V{biu3p>1-N!H=$r11$jcffkGgRI=G4n z$y|lhD$u7n!0prb7EXRcsHa3y8EF;uVnMSd|!Ni~AdvO220_dBa z-OK=%qT}HR!l>!`%5_ZQpQFoC?FVVTS90%4B1qm%P2paveXvoWy4+k*-`wO!Ljs$~ z0~YRS02giD5g*|zw}i3wbyK(#Z)Y}L_eYhUsG`9Qpxe~ydvMa1GF!HJwQ=$h{uDg| zzut(IAe6Fbjasq{2o=@yY6~$nXWfka_4whgopO?LxB+;l8C}58OfWSv}Cz`1VU@F2>&nnqe`sXYiq5hK)5*J6= z687OD9=QXo&@Ghn77rh3VFUA};h5Q)%mgWbKL3!qykJ=f-WIFRtI?h7)IGhKOQSR2 zSoq@hv`95^yhFz3BJB~YENwMXrp;pWF{p!RHG5PELzQ20dL6DBcqpGwIv=$1QY7Ht z{i^KwN3U(WberBlVk^_Y3qQKF8l6g_kAOsax-4d%80qubGAh zaJG18FksG<1+yF(1o7uC5jlqLVNp{2jW@ritf#PgqdVQUWshDs$jsYsfB610%^8(a zNz*VVqKDboL1Pe~amLo2AB=guCF-lMLVpK`;!>M|LeKB63QIkr(NP9JEIM|0FLaNsQfrq zmHXJYtl1OyM@h5{j0zFYZN@|qkmKQMs!(442!4lOCD+!ory}i7SWOT5M z+W^Cec`N1n8@cg43zrWZzcV;rnn!B9y(76~Fa)(*#Oen=(x6t$SQk7ErL%Xmwx8+J zpx#dw0&P4HsmwC+^gFh)B#+krT<=RlkMEb)`i`i{Pl?_6-l)lKioi40mjtkvY$esa zMvOEfxOzK{BJwlL&c$bCK~kka%MQB1iCeXP?;exaLK_xz8@7dL?BPUnUrl;HzLi|! z@~hXf(oNUh_=J@p8T3fwL)j4(v4Gy)`SAl1<$5+j$y4HTfSl#(*6nmXZ>X16^oMC@wzv`UyBMm>c=ejic$ikJr3j2 znCU#;05WPMLhm_PZRCe~Cq<}2PlE6dt}S$|b|SRdJ?&(3F!J%8kE)m&Cbnny9+{-7 zVfUE+#Apc0(RHWiymyHfF3RIU=Lhxw@hAd%{_9aRlaZaBx-7xnz2yk2T~N`)oT~X) zexV-}=AD5^bu!Ok($bQS28+?>jeP)D{A`M@#rM9-`%B=;%t2zac;8+yjATZoH}JpM zs+RNuLteNQ`_9r5amocaypw9oFP+62>uUF&Cv7`>k0bC)hteiTT_Ejt>?4+zrPCK| zbkk@-vS^|aoAs;B(+AyYI`a=TECLS{FYPeD(X!q%*VG%D+qlu&{80_D$FUJmI9_AE zWoObA2r)F9DJ1BH+?Ugr#u#jVT7xQ>=ncJg)e$1EIvI5@(op0KpPoPY4E|L5Pn-UA z{0?zjis@}1BiDHiOV_k50h&v$jn#Cq^9Ns zZ`@(vBjJ%`m`-FPA5U(~F!6!f)hiX%{_(bCySf$6zK&(ep;QPVz+O&^S9)KxZiZA- zts|=)(y2?`}PDg9~1G#ddVG{hkt;18XHy)o)Ej|Z4=pJN?T!xSUH5k>Sc=_n4>#`I@f>BNKNK0#=Q1p z=1MPuV{(je-^;L@U-Fx*$6n1Kn?|&p-jnDRTyBC=>gZw(#!D(vZ}zOlj!UuQK75(D zF>A`vP(CU9WQxS}7k>WqJUScUf8O)zMfb&~;qLHB6%eaSiq5Pfh`L7&fJbJJby|-Bt0?#R| z?oAaegw@TUl!|o~4&3}PC@&SWvS>}YaU>3={aL?2|1zK7v#BH6>lxlr3faEC=1+&g zByPK|KDNWFiF&`6yOVPg0y-o*=>Bh7VuRrE8mu%1maArxR?2QH<-l&&WnZlQhE=AE zWHw_`BjI@opNZfFtBkARz+WX#IVDjfFXgXBc=35F1QxJkCf@h&nFy=m9#KQU&BK^o zN5KI#efww|Oq!m0_7oWc65OP$rv6h0#M64zFK z@CYx3^rpbE)?&1}TaXu`kSEs$O%8rA(?4^~C;+Fr-y~+6>RZe{^dcI>Af7b|wfpxA zR`B3w)G;b$n}b7q9Ga;!A_BkI9Czpx*~6gg1cD(?VFTa8b|++30j&AUjaT`Wa#q6` zVZc^WEWlHw-d|@KywL@ht?v~RYgwaSJqemdItr8NoAGWSeDs`U+i1T^KENfF$OTzK0;Mx`>-Ge0wdi5-U?&HuVzEQ+!psQefO)v$;Ub50dVGRX&3jD*c-i$457A2 ztBHVvIovYKuu2MBM2W?uWK$N4FVQR7MTse&GG7MSf%}|L2?3v6sfw>jnNJH4@NX$I zZbVNAf>=FE=T*T#&A^3@0MEfhXhlj)OSO3d^$r?Z@_Om#zWCai1~Qs@*&gG$I+Wh1 z$=rSm)==g|nI}TROiX<4HI&}_e5a-5k3pxJi?mcm z_fgknJTbq7dX64uw-aW0Bk_98Iyt+7rG1OQo^^Mbr-IQ|_X*6K*<~4we+eAuySGcD zQ`M(pbsG3~Fwro;BK+pMN9A zYeIwHAM~^PJ#{^DTqK63eP_-093D|;yVr!dMA|sq|D-mYKsbW0ck>7lr1kip2v9K{ z^JRCT+yBMZS4XuGcTu)Tf#Oo!rIbQ(cc;+eZIR+$v}lk(3KT2uPAJgQ7I#mI2e;zx z8Uh3hmd&?k_niH9_sq#3b24WlGxK}z-FNSOgjYt&Sv{Nl;xgr>XN9bz!;*)?9t|cyp0<6r4XP<<5bg|O@j%5i_R-4 z(Zrt2L;Krug|;tvq!yh_sxGy+x`In^S9#SU*_XUUQ6lu)7%px~^-_yOG<09rj#|ZIfuq}UF2;el3jl^R=(+nlj ze8(?L;VKalL64@x8i$b+pZPTHo{Q}XdNyQnC+U$GYa|Y*iSozY_K6m8Fk@pk{e3Ds z$G6Z=QTF<0$#|2Jeh2=ZkQ=tEG;kui_z{gny9v*=Z2WR%nm7pQdF{FHE>tzqe!>P} zrM@h;XZ1Kz@W!SmDvi}n`(P|HsGBbM{BE-N=Zo0ulv}S8Wl7+ABW$+NpL$P^Bk^tZ z!-pdwJpQG?uWWe=r(lRq=}8m|5I?9t>pqkS6*#iQhg)-<#Ab=%Bv>XVOs$U=Tai>9 zAQ_B?H#E-1{n6LOiB{d!tz^7^g1;0b1rauZNv=-%?q56o)le@cAE%)d+;xojxDJ!t z`3d}}#0YbwIQZ}iV)+=rya9BbxGFb#R9h0=&sn4mL3xTTHKT{=b!Tq-=`A@Oc|<8( z6Mp%&9twZr$eSb)Mg|RFSTOErHQF{D(3LGpG_hvW?>~rdR5XyHGx1yzX;R=5?fhZU zbygcsp!*kY(21OG;J+QqvPE0*7g}AVh)G3Sv+?dqpO7!C(kWnz5>bt1 z&@M=lqtq+H-$<~?^f6t$9Qaum%VudVx<$F4@nFcozWN!{&k}Q3TSygTKpR%sgft5D z2gPcc6q?B+B^F^Vx7OVcyw?RK7t{yIJBtputRnQyHEn^rJoStai$(?Y=ieyl`uqgR zPoDG1V+{e!l1!Sdhz1ZZgae(1!ji;Ue-ask2$B)!=^905?tn9wXK!$Q-;|0t9bTGn zk>T*991h_8MG+}Wv-IID&EZ?P#ZzK2IN-egS-OI?}IhQ__#P=C9Bo~QBk>)om9Cm0R6 zf3(vifThDgz5Lir)BQK;awb;m?%JH(CfZyTLSH;W*!?ePT%Tn^Pja`Y&7YS9LnR+;}R2+AX9jU?nAr;g9vH z>q&ZdQk4N>-sV-w)_b!@2Q))O+Cw>!K>OCQucZQHY!=j{m|0@ZL-4?mK$c{zi8X!&#IG5(7eW3T)#@S_E&grYT6A4DO;Q9w@YDu$u|MDO{CHX>yyyU~=P;=w;2=T3;jHzzZ-&oF&e$vRdVEPN8 z5)<<0yiURE z#{FKjy|t~BlLQgoAcD@!dC9h&+|93x^C$0vfl=SRjSaGPA2V0}xfjGLvu`S;-U%Vg z698qhUb3APUhq}9MCc+|zU!7JKCg0;rTz-^VN8SD?Q6$2!NT%sjxHO9>SmK`aWcZ+ zoD&b7+6-}Agm2iQtNRHe20Yt|BG}`Im8KGY2?orOjr#unC}*t0ue)6w`Qu6BR%a<_ zX}Nny5|%Wh;Z7BIaXq?WLWll+ai~x!TBZ2^C0(qT{HH>YDLXkszV-3e%b7z9zBHcjEw*@s z$fy+I#HyL^rD^4VRW4uBL_QDCEx5IcirDL!&k_Xu#MqO0=v?!Wtf-esDI4-yILetR zZ9ZL|c(S;rV+W%tEQ(;W{N793r&=Dh@THTMAHkujH%DuXmBQM^+;#|S+Xu9*UAOcz z+TUi?C^guPU&#cerc>nlEIoE!6SHq&{LuhXGwH{I6 zn9qKoEBqvfOd{?DO#nrXr2SdI#x~jCLmIZm7umXv;EmmpOiehT{2U@)EDE)-Y46x> z4gVq8HggQMRlCXjBx#)dcYZ_uTj7`V(*iVUyvfl6HHr6+QG>Xh_ZnV?%$h{MRp)GM zx%X1OhW@lDFcIhyM;@~_F5HEVfsbj-J(f0X4sNS`) zlX)lWM+J+j{KS*zZ=U@xp6sCuH-@pHq#_?)qo#eKne>AFZH~Uyc4^c^v}}uTG|4m1 z_z5SQtSUB^2@BPhAi%tJ15585|B55I^$84%4A1vZ8_R^==U%T=(89S8hJ?%TpknO|`;Xb5_+MD^;EHN|)m*+f ztTk7;pW+QeMw!00B59LS^&@$*>n#NtBCKOH!ZpoqfyQ{%y9VCZJFz{_bU9Na=^5s! z)@D3P70FH0s8or&a;r95qWmqe+<~Sjkeeli?N1&eTMQ}UOI64}CfsAv?L4m`i8NO- z6TAu8*Uwv-Zk8@hiG!JATwc3x{&kR#1gf<@l#~202x$@%94fx;On+ahM~xY~)1*}E zzw1d0@h^*;T8Nr)x4Sly&kWd0!k5uC$6eGh>*JQ`zS8C`WCI7!y`w+NjxrX(SAh)n zC`(~P5AT>K-zDE!)iw3wmVUyv@3xx4z|!A*F$kvW=i<255P!3m;tSmip~Uejt5?iW zMU{S&Z(*aQ6ke0%I$|e!)g2Gb5z&6;&#NN5B@iFsc26z1JWQP|#lRaXr1{Aqi>E`* z%q7h=6@w}c#GwfrGt82ScvVeVuldrx@M~kqy577eVEOk+8V9r3h}NR)lLFDduyLZAfV!_^D0(?M-pru5D6M0^IuM^7DfuxuC8glquJ8sWp> z8D%QbwOgv$>YJNPR4ft6!!i^`I&aV`;(uR@;vAmP)1c@}AS#CNf1t&VWJ%-qXT22*-prU*jDgqQW}{-C>Ug86jei<;cE1SxRZrMt~bW=H7N!eNK3s;j2KQM-KeH@+N`bJ5Q%6LoI z@NF>?C(Q>j@#fn3#F?eI;z1j!l96_aa1h>_B1hpzI54xHB}3-(J1+5C@9MP+;|3+2 zDP474^5?6GEba^>xl(z-XN+xy=6az#|HQYEMV+qcZ@(ol2kQ3uNhPdmC%u}O<0tA# zeD=5x(1m!O^EPU1B|=H$vWSf^M1nl{>rJMQ9q`6HpHWY+?0$vIuDrFwsFTvIqVK#_ zSIrwe5uE@0-&jUYn!kF7@j%g&B)O_o}UN6_uX{8E9#wHjs@SJe5@C!OC!!T~Ecn z`NxFG<+ifyXGK_DeI_mV~KZJ=AzyVXS@IT6fI6rGXdyB5f`k@kXB!CNJKTHfZZ$2Bey?hd+TwO8Fkc_mL0vNyT z0(KlysTISwo-F6ZYgn0)Rh;_t*+rut`}{T`)7o6n18~qBe~EB%eE|vj*b*Jw0NgJ$ zPnVVE0m^(LK9bcuYWVi?1hy32+1NTkj$rw2w2RtikJ8= zt%Sqj*7J6(E$;MM$|@RtYTSYx(*?T^8< z>T9NXanmK;aUY;@35S!P@?R>QT`!n2#*^`0o^l1Y*MiA)52Ktt1-lBm-+SKajOipl^?5u6r+y0oPg3~Ce2nBDF?=u^WU zmya%@k;y@gxZO=+S37|3h_y^$KS(g=`1Az$o_4S3iJxerX)yFj{JV)qc<2E!CJ8;- zcCu}e>qhYq@2M3;8sPYeD#g<0u=y7XQQ+cUD}?8sQ}Yl;;dlJipxzf9<4-@blJd2 zt8W*%CA+&c)t1_O6sUElle(8B$&)}YyxD3mcoml|uKmha=(GjyH))gbi8uNPp zMz9XTCr}^;keb>=bNS!Km;c)))AT>-Guj6U0d4;WV0XZHAl>`!ZJ+=5(RZozCxAju z@9B;cHaDjiyL0+_3@Wr$;_{qAxF`o(31N_gsX=?8hIoAdjN#`Isakm5jnm!E4!>E* zlf}#Bh>rk^nA)k*Z%^q?6zB@*rmKYkdu=RO;g!)TJ);?ohT_Ax$pR*!y_Jj7t$aVo zf4fh9Mp|Lh0kw02NiLaMNV&)4m9U!ylVmkjMXBCC`SEQ|;*J6=vI|xmkUso+SAyrI zWEiXb^ZfF;Y;V5wE$#CWrGn@e*JK`mI7$v#JN2B__o*s7M9*JMq~?A*=ip|JS{;u* z<{Ip&y&QzuGuJdFauI?9y|Jr> zUio65>4-Z*x)+`I3so^Z=!s|^xf=cB^==8lo!!l90`kWm-;<4c@L5!Hw)DUI#c%1= z8Y_od{En`Ol5=`JUk|7DPk8MyruW28C2%V&^1{Gd@A?V>jhv4zX!0Iok_^}(=Tz^W z+K8a|J3BIUON%e=+(_`jy*UiUr{;Q=v;_;)2M$>^{5d|dQY_o6=wKRo^Gc4Txxzn-NSD1pN2K)1y2kM_d!}f}J#;*l!BWd**Zxh`) zHP1;|+9O+?zG}AqxUAkaq8FeDO*|jGQTJWDb4wJE{-urw_NR>wcgY$ZWns6x4=hs) zC>Ic7{>8X;#Wreh+ea0;#ZxTIunv~=W0_%Z-9jM~$H(E%dQ|^G_)Kh7rVn_&Bpvuj z6pp#ieNzW03-W#^#*m2^PKG_60TUkbU|?@ywgAbFEP z@MTG|bjsMXbu&6k;@6eCe@v4XbTZE5Q-VqLplH|k)5a$g1XZkI+-y4qa`*T;`ON|( zU&c{Ac`XXz1>tY8Gn%d~*s%W^MpybX?@|jZqWP>jUwjnG4(-wKGKZYdnu?i)t3UT* zJX6vt9sW-0op^E)a9?=E@YCQN_tJ9}1J(rejm3hM@5IK|K z1eA2+SsMg1C!UHYIEN<^EwpFP)Kwrx9wCGkq6hFd)2F)>eQ{4i^PM+kp4m?<-KgwZ zbza(jzId>WW|Cs(MDsmiPSGL#M7bDAMlS`F$RrXKBng-LXV!e)IB=;t_zP{WaAcws`t$A`k>BFJUQ<{0ZN)lU&J+CH?(3+HM4 zjDXiemXme-JqgYX0C2)z7Fvmp8##%?FS2pr?MRLkVwZ&vGVl=+h{+ZKgE(&b6b?sw4a)Y9p!ef$kw*4P6y4{+xTOo%J zhO(**No_-QO4LWqlQ%1tg1w?85e4@iz0?Z$YV z_Q+aQX>hSG{QB_oG5dbpb;{#~7~ZRh?-nIeQsesa_>iPczjIXC)#Q`eeSwh6!$ zUS%u+@4%lOZ;rb;Xkln}Z;d;AUc!DXb@~@@b+dzTlTPaJSu~LhxL~6{m+KP0Ba@G% zdpx+M<-mHXuaxN_7b>n$*&i$XOKv;pWgr!eD&$!-P95$pzRz23tQqjee9ATZS-ctV z^&)l{r^5jHtB$XH)Lph)H=Q+XmWCLWMf7`$Gv;x(85yei$h_bE?=hu>J~wHPy&~O7 zHSn_DlT9PX|83D7!5fn9Nw}orFDyHy`&@Q|AC$=+IP7P?^H}vB8$SQ`v-eREv3w}k z$Fa_VH>7L(LlR_i2L7x$wE-zb9uFDYac`OmqNJiZU*8|S3Xw_XCn`GZjj)Ix_K?%{ zG^<<+AYfiIeJT4;x$M98QuZ%GE z4-)wsHUgBd+>ZIIU=L6?n9(NQO@7(XK!X*oi8Tp5B#+doz3ruHqQp$qYZlk68I8-p z>O?|}&~yIK>f(Eyy2L-1WCim_L~eGF)KBJOfFW{Kl{Q>QPjj_MVgg$=wSTSWdM}FQ z`VHd+mI5DLXpGWiQjFh5n@zXV6{@7)ZDga##+FMfyCBHf^>Nh4&xn2RXgVIO5?u;B zXEtH0N&g*5aNWLO96`|qiSx1n!)eaMcj?OX;fv7(%FOk@Ex9L$EYQuzKp@`cLJras zb;K|dmaLjdfzn18=WBiiAv+C!iCdBAuYt^M8O34nN6*I&O&KoiEv1!WRCYWf?AvsH zUw(TghBXW~7;+@;*z9>W=XX?V447<7;WuZ+Zhc2!J8!=>HNXq_-n(btMLWu4`9Sno zu%zZw+&Rv~MaGdVu8+R@S6%tY|B#J>Re7HqL5-=MOh@l#On)vCiJGdY%D>&c`o|q@ zC0}ajE9#%fd3FlM3`Q%Qm<>onQJZx;D(4L4i880%%05%&q_P`vll37Fe5%EjWTq`v;RS{x9hm<=db0?6R&-h0krm>C+R{ z-M+uGNe?mviMz%Mlh+P9cGrb2h5pQLy~j(J<=hmIE89d!)a8>DbVLLy#P30_$fi+r z?AvNzmp*yEvJe(2V$5+lx>Ts>Y=l0w`>SymD zdV~Gk52Mi~X41oOI$QhI|JH(bQ7T&>gVxwHY^N?h>EV;3mO$XiUaB%baDT&OaI+`k zw=wjmE(HVeQVPDPYX;I8naz}jk_S=wtXr1)FPoeXa zgJ17N!fTv{J{^IYYIHYO@GX{ z>3GQ?e6nzQvs@Y$Ig`L$BNtP^Xg((hQQ-mCwC}Gy!!X%16h*kVlyBsc6jYR7Wb^Vo zMAl!i?&YfFP8^aEAGPT7$Gb>Dy`j6+`$MM)*a5zmOfCEJ&Ex5)edWzq_Uh&9Hb`2y zhQn*jSWAX%l}i9YYt5$qC^S=YM-ugnRABZ<+44`v(dGK8B?X;%NJ7#5;%dz% z(vkON)WwLs!CV8YyCMtN`w0T+kD;;@W%e-|doW&JBr6NrJo#{KzLGioj)rwBOe(XA zg^$I7u@;RFHDBrz<1=^H>XsF~IeYfRmM;K9Q!gtcvMBlQ*#Q5`(*n)&KjoUgcdilm zlo*=&*Ha8lUB+!g^Z#;I!*q%2lU2|d{~SA*MnWU|zYqdB7m_CL-p3jemK>=J$$cad z4YuDYBQ~Q!(wFtz99M>B% z{waiPFOg0mzd=ehoW`^dOTu(Qh)|-!r!a=~QU9lzDx1v+ylgz@%!+m_IN2+0Nmobd zFK=XAE#GO9bX0ptN?3AzM?(4y`QxR)HxCC4d6$@^g@{^36(!%9n`hsba5jS8&~ zUpY7TMV}Gy6_`^P6e}IJwGyQ2C|`Bnn$_v+(v8337Ik-Gf3er&LiW4*VK(>c%0H4H z>WaZH=m%-YiIe6URBgMoo~3%}UDr)W`q0xm-CR;Rj(xA*Kd@%`9s2~_Dii)hvtq$5 z{YbDg1_pRaES&m0-n9_Ek6JE3tOO9O`mQ{dAnzRA$1ruS5FJ>;$G-Hm(#U;lWs0L! zkigM=@W(`PaPYr%%FuJ!jp1@ChFMZ}OKjCG!qFc(OiVYVgV@Q{a;wwY^dO=T)OLBw zxBegoXf%*d;npuEgdCNms#h$19)E`8WF`J7@>BJCENs^W24EqkTwM#zy3SIlPas-) za=wBaG`==FpEyq*XD9ubVC)BlB$`}XW!YC>his(#`>=K-*~n3sc`n~ zX%_^2o;>Vw2Bf4eZ9%T?A&J?Znm&>e15#rFUMWEykgJuYrEttJhPrcVZ*1zcB#ZMZ zCKE!_moX|;jje#Kpv$P!bzG_SSe~<4WQ*YFc?8y_SQ<_%74wU`>*#P9ft3Mec@#Uq z(x4k!{9zN>=O{-JJ2Xj(?GyLD^9tlG@AqL|DV-MCrwh`6!*>5Xm{Xs@$!I=*W&^86 z3cN=&#`A5xv3v_WbOf!@oINh3V3Dr!egBDV)pq4hlkaQ$&}G#z6jE?Am`f`7(Iam( zydZckb7XtS{fzsIExYW>MPi~@;;M|ftXe^^K{d$(tf|_NtkPw2#dWLw;)}*YX2PxD zSu0u&{j_e3r3$+9x&#V#FIJsH~BD^ywyHb`R01-{)d}{aeV^nG>YUc_22+jc_!n< ztF{-j9r(NgAD(w>sx;eH36jRXR6zEX`Yt@I2;331!CE09#0G{@5`X6Us|uYxNxK2$m_Z zRVQ<%Cho_!%9fabD=B?DHk-5Dq)Wrh`7|Q#=)=|V*d06YT6rpf#cyko<0Gt}38kt# zS$wrH*#7V(*vx_c;r7(SO5)toj4ElyTyhM!V+ppRp^xf1S_3COB)9B6U9tqGKz$RX zw~{embE#~jVjK`|R1Y90QL z@4FrZ+n=ex?=RTvPclF#M5VAt`X}t&_up=4qtg9ruybs?mOp<+;Zv={QHE@*Zs zp%>(5rkFjOtpcv83b^F(E6YLOEkUg+?>hWJgxG}7m6K@LBR=nmFt2ppEe$wg-mSc? zF#oO2UZ96TtSv9EZnHAw**f~}*C&7M*b7HufrCawSQ3_ruT~{c_{tk)DJ^ud`IdK` zn>FK)2tl;8y&5~J{m{*T<|i||CIa#Y{zne+0n{nxu&b?OWe7tmsgNXI(0VrxqMyAJ z7-|vWYycb(lgOC`p34}!`eHifkFhKI;SKo#SE2ieS9t9R7k3T$ONOz;@nn%<$JG;} z)FW6_gxy%+m=PsZym+(3+1K-Pcpyr!M}s7wX!0$oM_)e`^W7Nub>CEYKiM4Wb0LSlGC;W~Y4qzdh0j~{s+T9Pbt_8r}XGh1wN(L8#$#1@BMof_>}VhmW? zk6G8SKwdwzY-&P9xUF{g#`UX1Ho}`ks{C&XY{5gdf=F{Pss(kgHbl|>RgY^k1U~fg z;*0vTx_>q+1I=rEcllJ6y4BU2G1RKGhLdJPon!}bMD35>HIt;Vs=d<1n#vR%F{wRy zHi+e&n7JVPRpZg`U(Z}?D)r#W(!XE6FK*7zI-sAnd5$Yq61u%$-KlD{>z*x;Ma;(@ zmSWBLsEax^H2kgiHfByIQSsB<^y`BSG2>x?`6a;o9iG7&_Sj>+(+j30zpYq(7mZg~ z|MzxvgyCD?U?NWw#k3t{AHQG6K=Duq}3hoI<7!A-M z(1|VIMvw^g>3Zk;I|E*b>ORdNireAQI`$vof`1S!!ul1jy>N;M-H_wNozF)wBOT|z zno!$3&D*ABoA0Rgrh>dIv#9(==Cf-Lll(i>yhWS4mAucj%1Fk%jt9Y)K|Ux-2WiS@ zc4uNwKC@XJG}Hg!Hupxn$%du^giiDxb};t2C{hOHa}uH~?kTsIvjV&wa{v!RD?9db zvB&kH^;c!ad#IbHd#u=3+bZy@Ioz_du53)!6SC;j(J->F5J2sRmHT6)`}C?h2@!#Z zezCQ!NUd1e=2U4yN_f39VovDqGEXyaN5kfN6UNkcQgmG;6*HnFfKF~9A_SR%YF5+g zXW7Qy^p(PmxSQsHp{S$MsVWb`>mdsihqsX5N!r60U`uBGYwU0psP13;y&EXJx8i~( z?e&@NT)+|B_&ngAxG4%5Zb_1HxOrR0gyM(zw*>Sr>Pl#U_Q)N&iD#d`eZTT`S!nfi z)G}w)HdCYtJEe`JP2fZeeR8v3at=1rwbzhuzDfiXGc$RbiL637z-^;ZzC(YTEJ-5M z>L2@+-DOI^Z7&ysIE(~0pl540gkV$$>MZkg1I&emePT~v%K={TRJ%DvT85;|J8k+a ztR(;gWj}vUfNdlIS?=Od;(p(4(F9-)`Riyq4al3%qyf9Rx?(J{I};A!@sSs+GOJ#H zP#k`~d_N8nfX1#g{NYZkD%IF4ZGstJ7k~NO!sqta2zRrIB~1H|BQp<&lp)p;a^?kB#s3w&8g-x@!^V)^MB7^K2d|9Qj~Gr zdgR`+t>b+$`ONrpIdyLOa0ir8?W`oZO-^`(I>+6OQGF$ z`=g}jV*6it))wE?JkV!(K6sUwm@>?G(O_99usj-pLV3t!V`ryO(!f-}_kzgi#c3&-{CTk*U-XGp-M|f@Xvaa#`C%#aUIrPC z?$ud23&P^AuC|hl#H7!ocn>B#a0LI>W&$vQWK-E|x}Alkk@*#9k3ToJi8(8Q&?frs zUrd(7z|fq$6q3$Zueu?iSLCw1uiz#vQ=ntMeRE2oKkUaxGteJ~xnE4E=<}YE zQbrvgTas>N2XI|XRb4ETK8a{pSQ#HW5|41N0t3Jl&CFI*~vFsCPWonc&t`~c9GKb zoTGqS0FRRh1l2C)HgICrtnhm2L;=ttpz)^Y@|Z?;Mb;W|egy*r@8it{!|$wEJcfA^ zOJ)6Okmv#wz;?LIU9bu@MtNFvdp7r3abZP;)edig6uR+yF4-^k-$eA%?>TeC2>2e7 zoS$v3)!+SOj_3N&BN$>5q!aLPRp)KTwh9QRG0ogEjoy2Ea(CHg`OgG+vD6K9@|b3$R%n#fSV_rlfDK zosSMKS2jaj0jxe8N~V2V$E3pU7FTgm*}L-2fDb-fp&B7_d|N@MAwfAt@?7^XmRF${ z-a8IQK7OS1oSsiNnP}4DYr2t(1y`?;R!3*DoC9KehYB*76!5F1E#7+oQ}pKe#V}@8 z;8g*Q!t>D72%zJ=Jx}}Yf)Ki;D*-qLyfUK5TZ!{VpviiB)L{!EaAxm28B#$RN0}q? zA^t5H3?==7D4oH!w3ox;QW7b6bcFc~v%5FkU|R?(7Woa?Ihg>&Yri^7D1F;={=qr~ zayy`p$^C$PhX^|WX87>F_D;3H-4f$NZGX;1&F#rA&Nh4I%U*CUA%B}Zoo;(2ynXt~ z&VAL}{=doBpL_P_l68N+KcmcrMIF^=2OJWf=H{Ax*5J%;V@6LQ95wsv z@U3jwMKfR*ycpV0(#b?0;IQ}5a7DgST0h(uI;|q}LQ{GG37kmz#`ODRA@RGGJder5 z*4A)CfpLeYzO0O|q6K7O{k@&ULK8?$89O>o1nGKU3`HzSa5m{26H1SDb5^{G^_iLM zzXzweAhnXva4Y`TjAW51qkNVQAClj#C$z80oG@iZi8Ic#zN9K)_ZxBp(oal}b@Er0eKIV@4Lx9=X{Ekx#xb9%iL@}2Tc{tL&2>A}x9a~=S^c4MEgjul9N=xuwtDMKh@whZTiA76L0my@aOyU(squ8Y zPABEd!0KCFsNP8#O0|bw8n9|elEVotO6`l}|RRUv}@36+0P;E7QEmL7!_S`ym4mYl)w5?|FG|iA- zqMtE{+Rtfo$f_lSZ|io^E_9I#vxd|f<%KOzJLJ%Ge0D^ZaC;aoe}d=LWo8#ANKcss zH=t`J*XSbFVsP^xCZD;h;^ZDFI=jf6b>PdKO_6|&1JG4uVvqL4yJWi`j@R6%sraL{wEBTRJywzOVB>IAUKXH6^> z!4iOA7$)i2*%KK7=(NJ>yf#jXPbN>~8KQ(S_s)ruLUr(E7Y)Lu;N+iM**)OcWN3I| zZu-o5aR!UL@VMOtpaHq+*!1x}7^_Yacq0R^g`hO9mu@?A?Zo(bV_kKnP!veIIQU`4 zva>j*bSYN2nHvpL!JPV9M)!@7qQ~sAgdkpr7od)5G!saE2nyb6+QH#_H2XN+E{6st;&`2{wd`I4IU0nT$Y)a zi~A{2-aG<4yLGgByeQ?c7(Xl0-+@Av*Pg|LZyHhaEi{{wetQ}u{I4(|o{cXd>QcA* zNEuRRPx8zV;{tH)pX1*UgowXCpCWB9yQHg z?o8`~Uic;OLZbtEYqxh4bfmlQ_L^vN;1VBKfkKwBs~=z+BjWiVSp*_-OCY+}^V%ol z_h@mGLJjRthcTt-3C5tVsw3LF<8{2}ftL5DEyl2@TZfEj{@G}3=9b)m84kbBH|wz* ztDm$isq=t`G$2v*#qw&_P-QyPZyV4PF)ZcECaZ#gPFsM)80g47pJq8+o`jQs^$r!V z!%$k_SlJq)wi{UPYo8~#xh}KWd)hHV&A?YHFnM_62-)P_Nv!2yN!_5_D{^1SGZB{u zgODO484N!_K}?=YzpeX8Efnf~;Fly%uWJv77cH*=c2+-nj(=$6J7w5P2FY7d-f8Fan_f?|R0<-{X99Ul*NJr; zEcu#u7U$Q?HP}o$E#5;QyrH2|$9oh#(vwfNeJ8MGb?-FgNo6y~Y8zyI)KdBt49K<` zV{CS%$w&WhmluIBM@qAJwhxIj?LI93C5m4D)Y{U&>}IugjwwO9frF9cx~|ufao6!bx1gKWbK27PDq$ zx$lDxr&%&0fL;)4iq9)AWX|NAhV%lk{gNb4s#B9n!|5DK-DX5I?x%{w6Bygku~1Q{ z516iZAKS^SWX>dfqES)}(;rMz-1{ifV@{v4iM)t(${ipiH9s5zmSYR=or@|$W= za(Bp=bg|;72d#xDq~U7jb(@|S=!}U;o@#0efe3sE!4!zxxd>|w`3LzN(?lL@#A4e?59>zlKgr)>S zKryJ9s?lzZNBlKrQjk{)iiZv!t#;o7E~c0rm}`+A96H<6c6G;EVC@7ffAFa%!OCyH zU@7@M^|J^X_uDzilx6l6$_Jr@z1Jqt@TbCc6fEK&L+qdVYJ%m@P1OC~%DXVJ>%W%eAB;&p`VPk{dn4cr{g*8c?&nnXAFfZXZ9J`rx1e zbh6TId#xuw_+yH&C5iN_<=wU1NawsVgxiX3RomGA*+$m+mtmLqfEh>|7KoH1me*y! zi?^zYrSSR!T=}}Fs{3W*4@?+Etx1f`(^%L70y0Pm{HBPI|4C?X7nxA)c(>b+3CPOT z6t#fB#uxh<4~_oYsaK8O2N%?p#mBaNu%h}XObm(OtdSz~40yaV^3k%-xfH9zSant)+PRlJ5GEU`&(9 zs}}v443CWxyQCL!FwV=9G+)K5)`3GOMy_+kg5gA73^-BNLQi;;Qi6JR%(pe`xAmrI zM)<$6%m3_M9sW;{^YFMzBE-g~>qBD%@Pf7>=f9I%F&?Z28ZEz|ovNcu&1EDtzZHjf zz__O_@DU|*Pc`KEG6xCd^+pMZEDZ12rIfY56*8bj2QOQ{=mHgwrrrH;Vw z^@3A)fCCd>O3U$$%<$x)yM*K2u{83~yHcddmOQ3hm+~FT>jz(6ZbT-@l8)_?eklBF z&rrlA;ha|O`+-cA2&R*BLOwfQ16dtc$hhq1s9uLscxKi|kB%WT;QXtduAz)vWDPGZ zw0d~gbf)B-g$x|?S+F=WF zb@E&FmAmd(yj#Cx7}=k5J8G0MTFA8B$|np!EA|`O)bUV%;WHIvAO#`%V(*&PaV3Cg z!<)scaJa;E@&mgEYU5moGIp3>hEIs{qk!<6st#hfnRSb~{=z3g4~|gP$;3ons4Ty% zZN=16!GMUZ;FO1C$wj8^@dO_{;(Wlp)4eA2_EK}no~8zd{Y>7i`B=6MxvnDv+sJGf z=5j)EWiGjnLif~r=!6X6>;)NE98SuBpdL3ozUU=~vIxJ~Zlpl-z#Tc^3pDUld*=fm zb*#lU?q|f8L=kes@uFwfT<3`<36X)ZWHJ z{ydi%b7AfP6a5A9dsPsHWr2py^L4`e&g+_Fah51Y-es#C0)wk` zJUsshyGmhsG)OmGAlH2qd0KNZLpYMcg&bzugW5M==7*~d8JV{f&2ASC{^e!NdL{Is zv9H0;dkNd_?zNc!^xVN4wJnh=Q>XT$mer#_e^!Ka$qie?Terr$QG#FIUJ&@?!SaI_NFFqlR^yt6e z{5ItNKiE3Upf=cUYa^vVu>!@41T9b`xVw}BElz>r6e!Xb_h1EzySo?H7MI|`o#L7h zic7GdU!M2OnR(v%&fLH9H#6DUd#!7)Eu^>92_7OaW;^qqj%OAan{EKcSY#7bTX+^) zlycI}5^#3LVnZ#gaDRSCp~TQU(^jT!&Bn;%=bM_MUD$<{+kZ$S^JE`=waWbh#`fE2 zRs8JmkzrAG@$jUJHs|mj>q%P`^FCeKGJ%oLJ;9y==TM#{5wnSRr{Hfxs?X?khi8a% zo|-yDvZtwj?Iq2xu{ZnaTy+a}st1!E5Mz&JV=*-d-YDPI+!ax@a8m5osK?l^4YBHc z^xw7ExyuzVd$!Q;npveIv1vL>72d)lwQiKQ%rOb@yqfgk*bLEInEg>}*83LU8n>TX z-@c!3io~%BT(TPZ#z$f58)TgJ&Mn@xq~po_gUrAd-SStv##L9z_B+w_qpZd+qDQy> zEyG5h$(%jTVapDkoyh6Toa{8fWpQpAsXr2Oyap2XZG{C=hL;LUcq67Lsk$FtYhgy5Q7rz%JFf zc`oo=CnaszJ{qxu(3maztPjIiaNYSvapL|V9TFz;Gu8t74UXZ zW!K}H*w340My2JWP7TQ}SAVJnW&i?Gxy{dl^X zNx+$0OM3t(-r=@4FcQ~|rtO_Y_+Q?mq`E)%hpqcU)aIHjaAo~wcK^sB)xERnt(FA> zB@?lqs~Tme2xwAlRHR%`q|?<~mWvf-2H>YJxa5C^)YOHmn|oIxPG7NyxIjbUd^uJO z3yql;Yrk>f@AZw`x7|1nz$3M!xzM8q!RP3&m;?z!mjyNsn8nX%&;CByy*KSbjVRDi z_M)mbhb9L18iVE0{=4(1eY?*%^(FSd7l&ouNuthw;Nzw+yYW20ykjjJ7NoM8?KkiI zyU6!5#)OQ_go2Kj>&(=*UboShL@Sy)6V2Ifin)xAlkR8IHW|&YL||RjQyypG)ik*H z2z!$L`QI#nlKE{0aB*emC1*g@0ig$`$zBs)AMQJ;j|FP(FA^1hkY)l0TI#w6w+2T} zPlGwS-jCb=bd@NXZ<5^+4`dT05(;(0w3N<8N4rXXw&cb--cfPF_&dv=yDpF=ox}j8 ze_lRLo>D$u8UKJt^GP}#dE3#{@%G16t3nuJHF#c-E5Bn$L==cfI9^Mc!a_jjYb?P>wax5#3Igw z3p%al$k!h0vHaNZmS4%qX$BkG-i_QKqGk26j2g^tBIWS< zkcS1YaFtN|+udO^@`rUvl~7+O;ExbuKIdx+^sbW}k-cv0DmZ?%O<&-}E5moRBH|3* zX#-hi(+%|qBR#MmhLmv9VYM@3rA4Ww%6P2V*=@P~rx75lht~j$#TR&YR+{tA`ZVB5 z9NjGH-8DOc02g6{yvAN~>IEW6qfju*xAqJ7QQXw!7P7-2+GiHO2Z;{rJf(=D+jIMJ z!Y@Zz>tSq~rJp14kW!41*2WppL{Eo}oJR;wGk3qYTuS*!F8OeipBhIKfs&?+Zi&pM z)zV!YqQS+MN~%b+O)J$@YNU@6oXfe>=1%lF`~AbKC9=qK>ncIgojGThaYfa`@4CXN zpV}3jjaKcYEf`&t78MQQ3R&VQONAqrQj&o!(8f$|AwIvAl~Ze%UBQtV(J&#E7}fg~ zNmFBHl3s7?XZNO0vR|+19P(?`tuOd#@=oFVpCXR zDuH}7mD!Ci9jot%CpvbC6T)v&U`gJ8P@VxM&u;4Z@0Ra>J_)|Y_{y;Ua*o!XFg-jR zSM?_s%+Tegh}V|b=3nn`WPpTzl0PyA)b@$N)bo3sq;gzk)jp=Rv8N0%VSAmA4kHk6 zHbFum#c~xIH{tO8{D-|;n00VR4w==)`Iyey*T)kJS6lSk6(gM--Z+-Ji-~-+Wa_a3q{=U@x-v!Ij$oz) zx{JtI5lk(zHt-~-9&t)yN#F2Xu%^*A(J`NqL+oAgWPu|qQ;b$=AfNzamUsNgRFQ+2?l(H&W&DlMG?_Q=cPGvctk=| znT{-xT2M>EIXx5=q!p`mCXY%o_LanCHPLM|l*Rt|>SHS-pTr&Jtvd<_WKhwLZV18ih*8<43ok7DD8E%Box%uXu8z)VTQNVu4 z&@zA7)9#>5F#NvURATg4&-f#Z@#|ma)mk+xPWm4l>?g9Ai2d)9HH^WMDmQEuzYNAg zzd3g#;oFr_7LV$A0h+X4O?oG}@i?;@tYwb$bVJt?xM4m(^0RI6Gq*RjopdL`m!LNT z%!Q1LBw1Z4Bs(={eEID#ZwjgJPOPd3xE-Ih(;i3IHJv-k*B1RcG z2hu|+3L(k|U%7k^DfQWm(v|i3Ey8Bnt8n1ul$lKX37SffYR5pKaoxzdrTkthUQ{03QK2{2M zJn7sNRYo``vr~SeHbvi78W11m4(`Nu;h!^3YoYDpR``EbUhGtf z21xqeKutfVaMQ%E17^Vc=W=1sR0cltxnw*sfa+d{5sl4cL+BJ2m+j+VB^e3(Rsj9A zL<6ZTPt2Q&KJlQ$z)uqZ4Xv@1EoSur-fwlxbF(S4>?4yCERf+MoovteC^eqv)bnU} zbTP5nE74y2*&gfBPz_lumSVNygikuD5rTky!|oRZa=zcfO9zju_eXm}S>a|^gDu0K zcvJ{cpwj4-a)qH5{h&xac1d#_k@(rgt7tuqq&;sriMfErdHtaZV%iBG;yX+r;I^^z{j=)1lQI(Vc=Hr{E+8E$#zOQToG|AV<#N)3%kVdXFe+q)JS?rGU(Sy z<$fYP1oE{%P%1;IXC(VRDd`+xL%J8kf7~7UAV` zQs>}uHQ5BCA>Z%iWF#XGqi*{6KtOSAWQ!;vJ6`*84Cwy!OT+&$8<+fNHZEDCE36_V zCH>IG1*2xNdEcOz_pfIr_$KdCZirj`k);zS8o0F;_~We~udtVPnELBCCp#|K@eF0y z)LP#>$h*-2Z(D)Fw>uT}Cn{^0bL!1W9lkl6Ii5)D?CwahfI!xSc1JvdWqi|Yi3#mL zHyY#%!6D!B8JS+tJt?CA<#T+T#?N1#r?FC7TKtrG-Q~{pzl9O zP8zq0p7@Z0c!PhN@Xb#X`16Tk4|_xektgU%+K7=v~jZg<@D-SN*)Vh-ze zn#S55qQuQxAB@7AtX5LnjN6ec-^4aWaJ+UM-0{V~C&y`mFCJD_^ybI7+0l_z0YcJ;rRwa4Vt z`q`uVR9=v+DxcKA|@2ZAyg7;-k!(^lWmA2M;|KT|%#sETjq`H`c zeR0OOmg>_=$bLB5t%3xXLF&kF@XUip>$X?ser)N47mbx=khv)(Sd<8^dT36IOhV6w zXo0kSk}LWQuIp(TFV^4hiXL869m9EU6OFgAVqc5hB-QKeBk}!X@unXi zw%kV%tVY}30|<51?P1!Op_1~LXE(U6cY!&2yUjnhrG}q{dg7C^Kzl(ooX_FD%5dU3 zX}pMhhLgN<#5z0XgwA_IC70M<+t9a-N|usR@d4S8CDZzT26z>HAMI17soy?}$Ha>L zncy~W+wd7P&Ryi-arCB#+)n(J=^2M{6QvS0(ZWa?7!%y)%<7`G*=*ja=l-&?pD2crjO`gKd(kZ6<>)*ZZ%$eWi!p&sA>JxiDm3n=GpXG`c z)_N;{kV?`hNsIfr>J`}o$+^B&_DQL=8)SxZ@@2E#pPA#eS2+&6IW4+mCVDnfPbM$= zKfQiq00z6?s>5sR)6~f?bQ5aRP!?v(RdwkmCb(BBYotU*pC=O)M=2vCB`2duZM*$otaHbUvadChy0%8 z`!gJWPH`ISG2~!J>;k%wF_EkfwtRZ{EjGF;iSmBJxUwqQ^ z;KlBB8GDujpMKP^V==$>h*|i8YdZyaVbmVz0Oj`E8@jBkNm2afVXoP4?6JNNo(+Fy zb#&KH@#MN7U{FD`4KWsV`X~7U%Cg|*u-fm5`!e#Hv(+wUyV7$`!*$tC>>yU>PlNne zn7i*zU&&8Aq+0tR%`IT3OM>Kc8>N&xMPZrM$v#nx=lZ%e9`c(|jR>XqnXO5SX3G3^ zH$FB)r>HE+;UIo<0@qDYbrR%7S{{zzryKxriL>Qt*uIrwLzDi@dBk+gQqXz(r!@~t z4~F#$6SxO#-;IVNTbe@pz0xpiwllp?w^Pm*GNU4@8KM#oZPz;zEnvt6a<3~VeEgl> z2Zow3Ub+gZs~*+|@Vzw(Y`N%8i27UVxs0bva*TmPy-|@i$M^990vYS2MMvfZasF*1 z1-==9n3I?gJHq1O3}Z>4cd%X(cwth1#J&H zU^^J}SQ7PP0JLesUL^b&%G^2n%0e(@>3nh7DvPF49>t`3^j$I#d(b2cP2|ih!)$t= zY&Z6NP4_QA+W0=6r8ST#IoiN!-xwZY)s(h;m(?)vS+@hn_;yt=y@}9pI}7-Gz|$?t-@$*5doB1I^77)Fh^Q?c?@Prho|CBje>pc;0wNuJXaa-=5bp4p6s z_NF|nQVbWaoLc{j`EQjNR0}FsmLb8G?7iebi$$Kqtob({sZ-ymZija& zz^qKE6pNo1;>mHrKv=5HINlnc;8e(nVA*w5IdcA5U{FSo5D`fARb6TLx6XS(m0~Fi z36_j|s_kpI;qh;mh2`TUpIEgcZ|?btMyA{tRq=2Cn#KQTE^qc%%Hx8y`Cs`rT%bDF z#%eBD#g9_m-#Gt%m72t*9UAqB89!SJnH!PaQ<=eN_ z-q=kBwP0$jU$w=V2SP&HCnp$A*F80l)4=@INTMDk7E8?7E(meLqxC_2D)xg{G$hf& z%iq8^><`BEo@URHWmqx+|0z7;K!CjHqwFB|qkPdS1Ev%Eu?&2v`?6@7w_!rrD!-q3 z8JhE}hlns32-cx78I^7S^4LQQ&4Rq$Lv7}oLr7xv_Ky2<(XK7;X9%qtDKxnxFat}E zs*1YUPeRbSvh(%E6bMJ!eTW&O{psmJ#v7HcrsXk2E3VQkhk;Z-fF^y6%L0J1mdllp zY&A>S+`%>2ET*Jn&SH*Et9vp&Y-FPTHivV=@bg;b+ux}&m9Bo%&AfCh{!{fkr6s=O z<&`Jdq$oH0AI^d{n$E*lx6#*;b=A~p@JfXfMxB9i=!iD*yJXtvqxkImmsc+tCqZoq zn}-pkADHf6p`EZI%b02DA`9^ra_F$hE_$UkP^`{0Ab8{*(N0g6)w5wtE>Dd ztGRP~kkHCIP86Lh%wz^9y9AAJ1-T!iSEZOV^ceZBa`j*SQw($bexsI!-0iD0Ki2$A zj3ru@q{|g&j64|sw1wnYuz=7`IGb)tKybUg%&SSyvLEmTKhY-rFc1L{r?uy7c(vT~ zNx)M-)@R$B7q9`I#a}ANI-0C|SQlMmZpm6Cy_U+CtlW=^n#Q3I;3tuqrn~Y`gZ27t zMIt`Fx(~-SK0HnoAUxlPVG5Z}fRI%a1f$yZlg^Ip`a32&pta_)AK?||pPUlXQyZ*jhS=8?mrVu|F zY|uB@Ob;oydYh#HCi^Hk8gUZ({28BPoW>1p(5BAZ=M9@7Mq z;xPWKH`Qgm+4KE`$D1>P8Cv1+ncWA5!7Fo6D@etO0bM=CfJ?JsMrfY`Me|K({b^$| z^?o_+gO8`G!e_V0G@&G*s(fRvF@0FDY&Q5kp(p|SZ-4%g%_5QZmS+8P$y`^#k%2gE zx``IxSm@Z0oA;SK(#W@$EA7|t5r`#}e{|1e@G7bhO!)1n^~f)GYwp>Vf#J9W^H!fb zYZE#dYh!}qXrysguDMje?XOJi=3CJnLB^p_gb^eN)HgnH%rlXB7Go5c=eFM(4y%~% zj|68fuFn)nveh0Ycu_B-gJ^{ZYM5<-H~pJh+t69W`bEL|Ul|Pnj1C z-1fsOFDKX9AL7{Ow8qVMb}5U4u8?zjru(AqzV`CIt5vOu;wHQmd7TL2+I2dBL*sLD zadjnsV70bvFOd zKFD-6aAsmljZZM|2m!h>6RS?=zk&x370uAxucH>GGDq!Wkez&-r=`3n)(mTdGe!)A zQk*SRwg=Vf-?GF4j+$W?u6E~dw943mPXbIt)blGc4SBgJ?0c2_+CJr+IG;wv7X&4o zpNj=pEy=5@I!@hE-eEi^V#M4Hl~^26Fk$n`us4|INKu5NmkQ8(SN{^N{HZC^;e z+%tD$?hw5^`1IlqqVj0QAjPoz;(R(Wl`o-abcE>TYLLeL+kp;|th~Q_l?6Fuud^xG zi21vl#K%QL!~$kvhxzU{6ojB&72xYIe=ml@42+m77Nm+Z&lLTQ_9jF2u+KAJoyujH zGL@(58tV_deW6}&-)diz17Ugd zlAmz(9r^gOmTp{~`=1D&bk*y&4|XzR%ROyy$UR9y0qmsecPIt*(@Ok=*I#jIImk1x zoR|@6N724l!)1s?I8%=fq~ZWlIkZ4vYWT^7(D$MXxb)2~{6XDJ71?dn`KnM2a|j-a zvm+2!0O#>n`Yvfk&6^*u&mXi*yg|R1j!eze>o|Zpt}Q<{@OToR;m(S zUa1Gg_X1hKKcd;YC+o@x&``VLl2uj@olQ~mL+xL+|uV%Ew(4$?x5OWS{A%I>#7t9@tdQp;#wePC76 zs3^jhp(#IQ0;Y}-&hYssQ;dW%kJ%?ZjHcVCvn+Hgn0!y6z5X)oM84I#^1+zk2X&>s z+xF`>8&Rcn=;HxN%vdsNa#4gf(ur3jtWA#J_fQik|7lzLSZ)+p39LjgLJ~STau^Iticu zu%pkj60XL`A{wPm`3=9KpU#H*Cg^5E^Gn_dHPANgl#~DKD)$d|ZK{N9y0qQs*aK$Y z#RiVih~*>aCWg7Ve>P1=Rbi$N|6pA=o+U0H6zd%aO=FD6#5q-jskWBBQlkU(rYNRBYwt2bla!^hRt zz_XWRRgPQe!FE(37Djxu)>g8XUFdYkp(kl4n&j75Qs1HIl~xWqyPX`qSv>*hAI^`r zl6KnY+3G}cV!x^q9-Mt!;|@!Pja5F~%=`GpWt)uIP=bl~Jb=lN4baB}uTJJTT+#Il zdXK{viVF%U(IOI=mRj_3;DuN5c_f2zS(63O(f(G_r<{f7#y<;pPhs~Q9QfQ$M~N7x zknE9QL&;hVkbw}8!bsLTuFT&=biwNZ4>e+3>3YdNuLaaJ_QBuIZgR4AU+zfZ&~GZo zd$Hny{vr~SJr--p#hde<2^uI~7KSfAHaPye zbDiyi0(HSHhxg|J9#5P%=!v>0@85p+xYC(Fhw&u4a1m}_Iyi~+vXrLQ(4siq9NO$^ zD8#bZ{f#hH!0%8HTZi*nPS|ElWosI=t4E&-^3`?+uKMFk?iPJiJHwXsWA2sPhB%h4_G+hD2qu+!>$-M8Uig+t|Li;48I_S3KD<}Q;|#6` z;#gSLt|oCTE~OpEZx`d$uhyLr>Oe^sERp zK%d>p9zAKFVd^=uCJF$K-`WT=^FEAb(L>BEt)?b^zl|PkK=6d-mIWWDW7mvKu>0PR^Q;)iR#!otcX#WVBNypD^3mf%=>nOXaUcm<Fh@XYqQtwlq0@gu8WZLuJw#0U1i6L9s@^x>(cS5<4cG<|EC>HK*L> z&-+p1KWecxmyU{dgAEn$pfZwfd7Y&D;cM9;&l3@bfqM_QP@%RtF4u=Gtv4%onh7p&O zs8g1!b+p(_HFTC;WdPTe!mb|nbVEdYxcG@C6Ken{OxSgShGrVb#cr?`pF!k=YSuM0 z?WBl#8X=g51%!FMnEf9)1k^V)lza~#)WGtlPN`Ba^>>jhZ^OT*OFNL0ACL7ySmEiS zzdk?pm&L;_yis?d_M!<;vipct^$p4!4O&AMDE*^>@p&_trZV^h3y$83@N1NV%S83v zUrH=Yzy1kdMSu?WKR^5X6h@h(0_U~cn5T7;iG8`vkM^2n1HE0$n$4_9^N+boJ71q8 zMuqh(y0~Ds5#oEw#RQ>kKrYdp}o7PudWmxAfl3|T#dE0W{n5uAubyG9% zD@8HcXt`ps2y${*zTrInQ+Iy-PLQyD%%jFK9Gf`cr*{H{>0fSY`#Tv-Y@w9=uI*JO z>)UcdALc>6R^WxmmTHrF_p;|?J3gp*E#qG61=i3#G540sFaVo{s2-{*r zDE||ptD|x=Sn+)QgX0P-rWw8}TgGhQKt9wYua2PH#x?crlZ7?vbI)hQWpZvD z&jd)N8~vfWA~ML|&Q=qm&di(7?>({ycQ=C1Ol_g8%aa@|o_R zUXDl?+s@K}@=&pHb6;!Swosz4T_ZW-JvDJh19H=C2a!`8UjaL>Gl(XLrqUx*b5c3G z@Fo{JEVEm(+6Xri#VPqG_6t*vB+g_Eq~9SsYfhgTxd|GYY9JJ6*@kwvYi_H?Ka>5z zf2PCEoo;SJ*{tpRYz)V7>u2KMJf){-l-gB6{O$DiUxh%sW3#YP0^N5Q+ooEU`8lJI+x z-Yxk8UuSO%1u4GI9b2tr@Yc+gnCX9(2-3lW;5!dJaR(~|$NR&M(Ax)#+sZz)`70KC zKqGx2sr&B<{t6b|WE#Pm%`Cyqpi5Dcql4dopIY;go^pK81)k&XaQ=~)J<W1vG0 z_6MJ|L^XR6oIQDwPOnh0R=D!+EKw~70E|k)1&YyZKC!#(Wno-=mp1uvM5>5qCE{s_ z=TjnuWMt#d1Kt;h!1)^-3BDhcJ`_QBE2#`0fKD1h6G6oc%MBh?ieNmB`J&DWPQ7mr*sQBE~{mk1EttPxgl6%?Z2iPGvz* z<)fE5E~bg$n+m6x0VpP{uM5F(rugLY>VY`^RZzSS{#G_*!IY1WLlqX&I_NEUI&o$t237we7f>p@iy5_1q|Cowm+yAZ%LDnsxEP z!X{p`JTChyZ?wE+c33+&d7m3P!P*nk;9IQ1hlXtk?1#j|e zmjTnJ2f`e9ALJvx_>_w`4@N$(dt|~Be)k028`K^#?h>4~)7;=m$p$h{-xm9#Xk+?! z33CmVXqXp4>||hUM`XT*xih$&%Oi07c9RKMxkyo1XPB$s`Y57%8v8u+qRvs>ea+DS z)F|`Vx7fDXX9snrEr67ehU$H-wRr7Hzg}#iNRHU^#Gk|jhn~7S9dy#P{_=Q?Ajo%U z33E_=W63{Uanx50jIvZG8GD1NSE~v5uTW6&_q>l18hfo^ow_W>*V}>yYmIn&t@;N0 z@{N&JqxSy6`Qr--Xdk_w?>Nk511`4;ZnM!*ro@tr@H-`qCXPcwTGLha%Nwq{*S0#6 z$AB*>D@u+&c+k-8U?3cOw8m!Q7R#^-QJ~$|bm&5U`tY(Qvh|{mma%{Rz3|#MsoQKw zIufyyx%lhza<;FPo@sdIUFNt>CU|)KRbwvmQ5cxhuH-kZrX78F^cS`l38$JuaUtJN zLjcl*o2mD*%1wgGlC)xtq0m2YNvPpEcY^rmWKR%BYZe)&jhQ9G-{dnXT@8LbR9yf z5`p1ralQ(*58c6H!r!`;xLl*#OW&x%3-Lj&O&Z1{HY71cOAnHm>~Lo)*T@@KzfIW% znq9zPgH_!@XXvVG%Er3utK(=B6t8-&1+(20jBc+K~fv^pm|`@f-G9!L_98 z??cM71MmCRk1aYzdspt?sS2-cgZW3JIlc*}T6lD7$F4dEP8fnCmgQHdss#wYUa5+l zM{8X%K|%*Lm6xqrqkiQ;oV)tGs=#&urTd>@o5DNqZBll;Qn1;<;7v@`tBo9hrH}*5 z51ufP$iyoE(k$h`Qh(72`28Hfpw?<^CqjPcs!ydP&h4~@C3P0c@N(3fVu;a5Yw$t+ zn)ziRKRdV`{9_fI=oI08DjIOR>LP$`_ts}})m&txmJlk_pM7I&%d|C-38Fh}z%-lB zU=ho4_DTX5rhjkQg0{DsBznS?_g1-muPh)gNcxcalK?*FR8IY6&W}DZ2KZ%0a7Sg6 zJ9Yta8U)BSzI%$5RSN7@<05G? zY3&~EdG#j|SNrt5ge&)YVTA9rw-RsZrKKe#0VcxiJ~g>B!zCbJ3*nz2m6$?no3amh zA-zODg*pWR?-j0uM?zidGXzLQ8Be`6b%G?1ft&S7?9T1=%|PJkR(rCas003#Ovvr+ z62qU*p@Hq@Lv`aB@Mcl1_NrbQQjdo1mx*wmYcOr z1n&(Z)O#<;Q4zB#PZxX=pEa02bfdionq=7K4VN3|{Igd$t2SQ*0jZ-7H0=b@#h+~~ z`!eX?zCR3wi5Y>iiqx++*an~FZEKfRkYfS}LELcemojKXX~j zK-@=HCz4EA6DW*p$=6Gj(cq`!nYBK;UW)#53%`aiZ!c%gx86>oxrbEF|K#pfoiehj zu?7WrV%4);eE-;F)6CG3YDqDl`WIcQ9Fza~KK6N!SK#*}WIR>$@E+W{wb)%#GRv%0 zk~w7)e=OyG)ng|V+D~p5`xEx*fM0 zKR9*vpANVaV`+JWy>1NEndh6QVybCNgyzCmFKgc@j|GkC&V4sf7YO4UVC^s+>aedY z^787P!imS87|etS$>W0Fl-~$Q{&&|n#PRP7`ywbjNPiVl=*JCa|*M}11;5Y z+vxc_e{i2UhMtftyO&0{u_iQR1v7d`$;7>F`PkW6Sn6$^=Y!EN8Iyp4Ey=|(%gVl^ zDQC_A9fMw2mAas>8ubgZpC3v$u}_s(rh2XtqXH*S!?!lx@nG}z5C{=M%lhm^BK~B# zOPT+W0Un^kmEM-yi}n;Xc}IxY8-YNd1Z&nVS(EKnYI6lNDB}u*O{RHzxsJu9dPSoq zXQ834N@+>uZXmfd)d*!O+Sdk85^jcA2ug?_pcg*XqKFUFJY&`Fqat;5UaK--wDI*2 zRlS)9Q*}$uw*}NHdSVCQE=L4$_bFHyqxKgX5laj!wi$&18ZMN~_j@i~u6x!@ z;7kJf`KxmKGJJi`PgUdu#X0@U2t-P?e^}bc6P8}t>{6zo9vQCzM!Z{Clinh)H-nT^ z-E-%o0|PbXM_~`B)9+z@2o)WKl(&A5r`ok;ZVn5dQ?@)ILcR!-y=AD1)MJUhj4}b8 z57WX4WD=d_nZ0N7bco}$2>F7H852;?H71Z^Qa zxeVsx_qu~;Vu|SIdnn3UCs%2gyL0+~laa~1TxH%K=75*gnycpCY zr)Q}?VM;JHL#=+wpI|UNpE-S!H6e~lK>Xdsvg)v@3Mp;GTdwr|BK@^h>*R&@KBb~T z-2!`+RzoTC&>kkR&-5bnutcFPbLd{#2&t$#y|3Tj#Ty{27@JyzZW8oh(-%L7j` z(aB0Y=0k7sk;5kR?DQ_IurjLbaPdo{>KBSJkH{->?yRpKt4868FuHc5>E*=Y2VfgO zbI&KNkG@wVfaNx}{@EKWu8Lt>tlKISjM$mwj$f2>opd+Zx+mKYAwnyKzqQ&|z>Dee zWUIK<;+w9YHyc%n&HRn`TuZ|GA1u*^;@R0rEN(hs`{+VH{{TylKkxKWd#Jh2h{nL! zo4mik5Q^iu7h}*`<)r;*b-KfVS(Y{JZ@KQ7Csh2TjuO07Xo;fId=+Am#MhE@UJI^L zHwd(=MdaoYz!ux?)t0|^g3*NZU2$m5ABuw9yTIl+^^eKHWMhrJEcV}aycsv^*kcp1 z^JMvsEME*P(i1x`j+AV0Hyy(+t`W%@N@-vZd}CPvKu8-_n>6tGsXJYZ$0)6)3g{In zIizX)v%XIf`POJQ?d_JG}Z@J`MUVlJQ47xmj&@ot#^97*@KxC^+2T7hsTEQSdOM6j0D zMchsFGS$U%>(HU=i8sf&NB8;x*gx3?Poy^ZAxSVz2iE%nf&0Z_s;e$OrilQ;E+hKn)5lCEJ3FujD9Z!FSPplNf-Vy7Z6-O^a@ z9FTw2Q3y!=2JN5F77a(r^##no8p?fq8=)U zTIO7VIH8GB6D+Ur1)kQ0XU-Xj%pk%=fznBb@0gdpY*{3q@op_T=GWbUXNAGJNcwnr z!fk-*zPT=)+6&4$k%d^Pzs*ff&hvrn(Z^HOkuPDr!;=zYc*(P*q7n=;EM3n(8o!6NZFH3pj~Nnz$&+; zmIl{qj1#qcb=q`u9<&S3a}I2Ei2iEp0FEV6sD9Y$|C^jZyb{Q63pfZCZ?mV#>dU^K z2=tW&)v+8BR?*dpiR8Z$FXbRfefrPZP%B^W=KzHts8jSsMX*q~lZ0JXfg)8_F^kI| zf_Uv(;IHhh`=BgApeg)rx5B(#>?czMeca2?U|qL$^DQD;3RBo=v+qFA{!bYVkPV_+ zD!bq-;NZf`0kWenl7aSIw5#FV6W>4g-IBbbeJ)b@#YixzODT%bAZ9@H2K?PBUGdR5 z>#fDlTaT1nG9evLpUt1I3;~HcWP5xylTfr+O{ev{_(M>N9+Q2%dqTidsIn1+k)u~h zt+(XW4DW_x)03a8daP!=%;mw(!2sNQD263QU!C~jNl*rvNa^gU2&>OHxrk-x&D+T+ z0|AEtyFtD~_e}VC z4_ZLSEQ%qTW9=@>onS^Qv727z7IFMvvOW+;5vcjf| z>qtKxoeC}Cnnp6>%Gl+}yqmLsPNVvs-8Stdpx`XXktItbc{AH&N=%e2YDFp9l zW0$Jo5(R!Nc|Oj0 zW~Qap8ZFCpf-|`775+VV9qs%B;q}lWEj;U4pY>z&qKq&$Bp;92A@&c3!x5~lfuEzf zzLrB`tgDgze&$c;e$033a1za4eCJB_z(d=fvguOZ#NN3!3)dnKKJE5n>%8uEibpNPcpxwzO4`wSW1Lk zPj;2nJ}%JwNwFjZdd=tf(AV+fOHF+>rJ?$CHw`}DSGk+fI+@Y2!%i1_ziL{>wf~96 zMPSO&#uh9d8P-UyR^E?iof(3+lg1JWPg~@ldZx~FPI2Z%`9ya3sMUwXgs0mp2vMHq zY(dtLP*sf1n(g%FyKG7&hm|Bq<lcUt(B^v9C+1x8r)A?kU)dcwEgP9|Hd^Ta4e(uO`shs0R-wh_b zpRkvt%-3}QY}EyEsV<0Mthn~+1AD?Lr*aiUO5@u-t_Ih2UttvGR7ZSRZg zbLg%2Lda#Xdo&=Ihp-sz$@EK0jE_jfwP^WXq--e0fH3F|?CW%KGf=VMd{8Z0uW6)ZLB3Imyqn`r&nW2p2~h&xb6(x4>$CuPGvx;FF0;i z`ZtI-1NY3=`VKv;9@IuKGO^=32trH}aEK&E(Flh5EcPLxt5k2s+Y;ms6*y9SW*G@3 zf7ZKp)XlR1Oh?pD+bDqQ2XO$`K3eaTxS@+IoA?tui>LPAt-zg z59`xo(flVbhNTY5F-2c?zd=P2*XB^77g(D5mN$p{x6r=z#k%B*e^MOO%SnGsYhn3!pF|ax;Q85e-4E@gb6z zZWY!_q?=riXGEovRN`ktBC+>fn#WK}`}=En*H0K)&D$K)4>#b>j2x=^JKqAK91)Ynl+Jde z45O{&z%JI!T7 zO|AiPl7N;a8Qys=f0=w*8(?`@eDQory`ME6w$S0O-xBUlK|^_)=LvT{CQ!U~Q1=}@ zDKlI@{_&gcbI4(ZlO=u;8~u4>(}C5ggs450Fu3u4d=)Cy@UYTB`%SI>KjI$$om(z# z`X?GPv(#o#Hq6S(T6+J0TdZ@Fb6)w6>dPmJb?PT`x5b-CG#?Kbqe{SA`L=BJFBU+o z_-a`gpmqbhQAwNr?` zO8(@Vo5#X;@z5u#1SO=9OYCS<{uy*oygp!`Df;A^?M$2G@OGz1+%(rlj%ga8O3J=Tu)|B>qTM=Z6(AJ7%xCql_p?Zh6_Gnp| zE^5z=$aS{-%-h}l+uZU4@SPN1E0=w;E1H_e_e7nUeD7hQ_}zGQ-aDT0yV|A;)B34` zR2IA(o|%2Q*g&5L)k+1xu3F&BzPbE!-q1{WI-jZbbA-+Go-r0^>fOQCt8o^>@{7uR zIh=1;$Y#JNM48z48S%HElp9A3!c>vR7}};8#gpF!vSibkvt6Xfu#G+W2hWWV&q;)$ zHAV5IIFkJ=0WQ8skjg9LazGd6I?T=*-%OJVBO=IxS>Y4`jo^!ro9O!ql04jDf}1#6 z_O-r7H<-~4zyDZx{hDk@owm7V#n=Z@-Kj9&7#Y~TPy#C7)kMqW)`}ISxake zE$x>~Kfhb=Rl;ByIFgBnzpZ*4-KSr&Oz@tGsOU0OZe0gs8(PnADo74cPa;S=(?#60CY z^LH2QQXPrCeOeHcEF2fYkYyLw3;g@M60@%(#EIM^--)xi^6c@N6|WX$Pw%wIH@ayc zu#Z!bY-Q`+=eG^Uy&=Ymol8%FSt*i)&U))23S>l?n<9D!!ykR!pH`Z*@Knr^(@*0* z_G}eR>u{l`e2B#{BpL%Y&edmIUJ1@3f25chqw$*>Zt1^921c( zpq0llKs1nL^HF#J24@5O7x~%Vs+PJcT#sd6<4Eef;H6i}*gCiA{ibzx9#~>F7O0fY zV$w@+Jl;*IC}c9;>5tGge+;=v`1o>JUA6=h!v*HmLYrhdM`55Q#@}JZEbBKk(*#b} zJ0jdJ4qNs^>Ja)hzCBhBT>02(&*CRvy~8{}Q7d)_rQ@8jt?sQ41Td?AV2~o`F)@37YA$vHjiOchZNF z;}Yjh^;Y|>$f-M(h-Rs-Bg>*sCm60^r)wv_D00eI#1 zAXyYZI-uKMW}E$k1?J(r0U@N5pPi<%LUOC(WVhl*7hTE(G#5KDpm3M}De4rj*@0xo zs`ctAh=XL-8RJxnZ9?p^{bP*=Tl)P?W#wS4sc@5|o7O?)tb6qdz>e4O$7(_F@IImU zz;AX!$O}@q$oTT=^PDP{v3ukef5rP(ys|^*Mt57N88&mpwuzR(l^VOXCq%u@hmGuk z6YVeGsm3=>`-b#il8$26`onq2m}KJl_uP84e1!sHr?o1--m$?+391&(y?&0nGNAD5 znbeB~tQWX`{k)E~=>XBn=SHPxnL6Q(U;YrxB-SnuY z1rl{Jl~4c$mv0ZJi;X=<0KiO@eCLiEe;o3INgkIZswtrsM!9=HW41{fC-&=*n$CSi zHGI0yD_n7)W_MsU;$}ogs*u%FiN#gV8F+G>g#;~#A?4D-$)hbji-`DC()b}J;Koz4n#N!Tlirq}m_Xcw1*;e! zLe!Xd^*pOgtimBE&}V}f(*-_^xpSMgx#f+75Vib@&7T8u{qaD4u22;chFSys5{Df?JYYOKvGSLYGOTfO6*(o*-S^LnwZMoG?{J%x?ng0Vv@Bt^2 zHbwK9H2EQoG4u~kCQ!WK?f<~Zg#ULMjgUpoZIj9FFMlwI^ece%@Y@eWe$cZIO1Bt2 z>EYl&oHu*eEXf)`9S-n=&-9iXuz9V$&E~O&rMeaq#4gs4F2z~834danWQjMCuKH%M zBrozie~dj*8-O_zRj_S^N=ropU}bX^_304 z!IoYN>~QpuG%4X94s5|_J!Wi?ua@RsAw<4V5K%vVZTDV%8CkGWqER{oVExjAUL%R~ zkC#vDs ziJ8FlN7J}(oBoC!s#MQ9Div(Q>GGiy2VM{1+IFf9seMa~udQtH#X>jifi-^(0MAb% zZ9jJ}`^4J`=8K6|j^t(}3a(Z@>c{p39RT`R=ABC5iSPCa7+DCkhuOZxp+1j+Sz*ZM*~A%Nu3Hz^}Z)7+`q_EdOP#pCYs+xx}Dw~Xz&yXy}sGCeMP56eqR!kJ${7|MCRsDObaD7 z8*f{16&BCQlM-8U&o11ao<2aGNW8>oPuqW=v(7R(b>BsI@i}Ds>2);maXcmlw0P#E zxkC&;>Y?} z!bNb={nzAuzz@anp=0Ug{35+}`1!QO(t&l)EcID<&0y+0CdHw*FBvaXV`OG(D(t>;?U&l?{ziAL_j3y!u#QzIuc zlR9!}#z@0*0f`I$&6a%+e8#U<-t~P{5 zzQ&6ruHA17Qe963q4H`{Z+;kChIL}s?FZHP^7`xl6(9eRZhm?A*u*ODy3(cj(h{-< zdD#<<8wEHOUg@X2`f{j5x-yigAwE0-6A|dLlqRTBE+i`rc&Q^ul=zm8WgcC7Nh)d> zMjK!Iq2Ooat27?H{Yl?qy7+ccliup0hjlA;xt92%v<>aAimz0DnP|Ne-I8M@iYNK8 z$=aaq{hf#`_(^IveHOFH3(YOmYNq?!NP4cZsin-ycPZ7wOixgKEf+GsHnBfx+sk7A zJ6GyozZ=K?G18WIUfdnH@IAC&;SIswzL~eP`v0C{UAkw~^!gDbajL^aMo+XJjstwI z_kA(~Jtrd>cgBZof~RQ6CW^z_)eZM=!yd;z(DjselnD`ND>MU+qx1vrSJc+)R>=k< zQRe{~CPno7OBkNx-3DR4cV&7Fw-53y{0tS2SuZiQ&N5fI28iLRfcj|~ZU3Myrq3yP zLU!oUepff)>!j_!n69B!lE6iW`@Dv$!^ zUy3`xUwUTp9ycS?uejlhjxW6ojLh7JvFxW;i`_c-x~YPWlK0ujv;E+1Yh34jId>=P z4*(BNLZp_{hKDtLCzK`BWjC46_`NU2ACrbd$a>=s`Ib~0u;_#Bq9G)9;_Vd(-n3fs zi;=vYs|Z9&9DVQ#i&Hs%LrNO~cOt{ivFb7D>~-4`NZEWEK*J+1CR_QEese)wBQOsP zdmwBTb@e%^#C#ZFHnypX20n3lME3gSBe5WW$0sTbNZjxE77b66I9Q`{rtv2ekM{y^ z#J{)YB*z|l3#`O^N{fw=Gcn222EAyhUcoHz+I~l>bBzTo`1w<=@tx}i>k=gfMTK_w z#ctHsVx$61A+>l`m32Ra6*D!a+pSVEF+hxv(q!I4!;R+w?q7|{Dr<<3Fxd(#X8f=Z zhnIJCPhME)sA(p;qxCFwvNK`jZzLyp`kW1Ky(bQSDo*%sW8{A0vruW2;h+^ok<}#l zlq*WbHF+ZV?qn7~BJ^RM$Uo@-6zv&XZ{!mA;fuw**`b_Ue?l(qvr>d&r;07rgL439 zAL~OU>C%$J&$LqjZA0R3z^wwn~97UyVx6yU?>Gft#7Kt-)8QJV4B^>V|S1~#Q2=5d?aJT-gSmBybqN)o`URS?m0pY4HunY z(28~^C(t>B5DWzzb?#j{lIPCGa_eT2+@IpIMAro8L9g(2Ne>$ti2Dd>doW~|*ENB| z^39MidlDD@3>MpY&sVZJ_%V@zXZa>?EsqR+Asdw0;C?aV^PVw2_DOU2I)?Z1#*f+O zMd_t|JH@AFzzTEx?`AA&`|!JSG9t{xUNHronySG|deQ{eNA#Ey<;m-P$ox}z%pqj( zaF1FUC-qesMQ)@&y{R2|JNDbHr~ho;>L35=GQnbX)8cgy@6KO2<4wUhA*d%PpPTlh zz(8y;RFQhdSHgZ?EP_>wOuDtzi* z-^Y_}8_1wsdoh3!irgU6x4Gb2xrpq-m~D00G35zax#IU+k;VeEAOk@km2geTP;;Iwt6>as9i5)6*Kzhzhzp$j?k z{*M<0u)WQL?l*Yl##Z|KW|gZCNcPUjb*6}`aXSrDa@DpQO>!qvf$*X8q7ScLZw(nW zu47W>h`KaYZkA)bWtydo?0(|<+1TMR+wXBh9!C$R?bk!$EfH$`Yx-+rTdK=0ty6$n zaTJY*)T4H~q@qvH%b>(9Zl~PpXa}yszBe2ryS#ia2(NH#sNzUus4dl-<@2({b7M+!1&15MW{RDw zw?t*N?Bm=tlQ{z%b~)}G{b#pdIhjujt%XBHz7m-Y+JZiCrW0da1AB4StpsvyT01Zm ze#Z!B06RN`601Hg6_8=290Esy=8IQzI_=3ws?Uq`9RQCPErrSJi~WtO6u<1#l10iS zm$+!WdO)ym*P)>qGb)Yq9)l^%8KyWn{-+|%2C&}MKilS@Py$8z(Q_L2xm66my>>F3 z{bF}5Rw08*7cYw0o!2+<)Ek<6!ve-MC4W(d^qbBcHY~kg95S!~{d&>cG@1=x?fH-D zx;XmQOWY=G;l+D{)Gyv1rCZ;O--Xh|TV$-9G@70HMD1`p`KkxNR8C##$q~(5939K<}>BwY)S4PFmJc`5{GmAo(|*Xg$@Z z(UDp#!UVS#%bUUw(~`;Vz@S&} zx#V}UgtIL7L%8Xu1E_|!61oE$#hZv;MkEzEC&?^s2RjB1s+`*+OGS;wtB|E*Or&O( z1l_lkkz0$>EmP6sEmCVRbn7oKCg6k!ax499{JuZ$g-+W?_Fv5D&{}n$3}G8~&@oix z*MV?Ev3EtP>hG+BnR302by0<$4Z7}gI>}Ql-N(4&3rwr=yq_r5S#Pr{#53|8mJxx% z1tw@!#hFoTF~FI++A|+E!_p4|r26ClIi@d4DM=oE80;8`1YoTx&kOn&ozFimhY?N` zOIUzge7(^($f~wiSCY48%SKuwPkuWMPi5qhKYc_{QfO100FB=OoXI`9DYS)>h61bY zkw4=XrBiI=eOO(7e4_&U#Z5Ukme_6j zS%=Kh=TGQemDI6eL_+|JJ9#wM>;_{UH2_w!*~iw5ycArPKRrVu&h|3L^U#mNZY%qF z1`2S|LzZAUP6uHivlIf?Sa{tuYzut1wX4NNj~P#PhWUA`{WX1|b~!Wwvkv|9H4P|} z%r$i3ad8~K?QK5tseodH+VG`T3etJm2YkDfm7Q#?z)ELr}VvA%BY z%G0y@DBHzObUJ!2!e_S+N#wD6Cqq03@VHly@BjFcW9{5@t{0g{rVJh8rTnIv!AESm zc9dv|#aYE&E@0n(Eo^%s5o3DM6%dPbNjO~>;U2eb&jebTyrQ-=`Q9ktjd*8uPUCyI zIJ11I0IwB20xiOv@I1;?zhST*%g=-lkk7f$+6J6HLhAR@AT==rfG*STh<)hWX666ueacuenIC^vkn0({3B76ked9U(Fh$W9efPDlK@SjdpM3{itZ(0{BR$0g#;2AdIZ2bZ3jK?a|2#7W^te^|tY_G@0m0^g z^ZI*geEh@@ZnyG|iEW7HC6epjs=Al$lTc6Hs;v~jqIxO&V}M8Mt8Q;zG@R7FpsN?B zfzvG)JMd}KV^4vsH}9oLP_|*XL?{(zVn2kzB0s|#`4fwb0(BC{mTq(tR4Z*-Ov)RC zr&<-`c5Vufa?Jq5CHDrlJY$BkYqN~7d9`eu;~;pI-)jh)w2vi}4&l-I!vB74sd#bn zL3y}Z#wCL~;0y2cdn|JE!(DPSDOtTiK34Sm@AEPbD6#U zC@@xiUXp1VHPmyIOu@HbkbHFjl4V#^zCHk*yK*r+2RIT)F zxGA%o{JeG0*P=%D|F^&USG!k{?Elc&9nhsaP|u@KHRx5qsn4YO+^ERE8o_^FZ^s>)2UuD=>RS5|RFwi#Lit1MJ8b)`#~=&^k~nm$x?iJ4xo6|IiWp8{n!- zKi~}6qtR9=&b>tE|5>gcrs&!eLx*QS&11h5^$oM}QJ!L%B6kUS2BNgGS;nm-c%y)( zH^ZrBZ?w4Vd0_Bu-u$_dZ7qf0un&Gd?o@i4v8s|@40hy-D)bzrgL+AMi0|iAk;s!Z z!?y@7Z+t0C3>&GKV7h$UFq$rIyaa8ES}v0zIjV^fkY!q%dpNCW6cFEzG}Szszh82o zLOt!5!FDOH2o7T1kA$=B05mZ}ruVRlJ(;%W4Q0u+T+u0g@WW@GTosNDX1L#t;PKAb z?fU9)8Nb%eqTj6>55pkJMv-?S?L&Eq&wMaD{EY5pU(BAKEebQ^NVY!kOj{TZ5zKfZ@ zm{yr^2wA6v-aD{qsQxq!LF-cz&itx&V^Q=zqCd`wS6G9?{ z^d7fDicfQqJa-v%x9#74;QWW-tsBf^s5^|n4g6}H7;bQC;sXGANBIJ&k6a1yeNu!5txI&FYX^F_9 z#2&=R-}2*V@1gn4ot<9Bvc=)Fmf*z)r9pZ{g252-I69<3F?6@qH@fGhC2&+GEoWaV`s!K~Dp z8dkv@ez>oPaed7D*d+#)L~MDT%aDD57)N$k^6WV>(C0?--O|1KZ)FfrC>Znf+GzgX z$vB`pB@u$Dd7JZTOXl(9F~?|FRjJRuRqJH0oIS|Y>E;GGd9*tBR{zSNm7ef(XNyWV zcHB7KbOFix_*8%G#99u(zpr!{!XA0#W4z3s%fs1sPcK4 z6&48@S9g`*b)tQR5_HC+P|69f#Vv=c;LxXSo|DI@n$)+BcvK@XdO3zU--IW!WVqej zxZj_h!1@7ihx1lj|F>xTS5f)r@w1s3xc@J;!ur!*#LW%Y+atV7ll8U3xc{Rt|9P32 zD9WC_gXS_#xiL4+B+Pc9hTC}7F=1_M1Lt=<+0A(})(=SW@lBjtNiw0}9YKM=v19Ck zhOR)s(x}P}f|z5tVsL*R60dediDltX27q6NL+8;WU6iLEteOy(l_3{uecS%)Us{Q! zc`TJp);(!CYG#ZE$zi1nhj>N=zi6U)so7%!eb>Kvy`4ZZ|AD4$vU;$VeClU=H!-%YJRq1`%N5JBcF0Rf*aY?1E|=hi-JTq9ht6 z6A2`?gD>;XmO-yG`wVWhp=g|s-z|%7wX=v~A4OdjB+#1OFzmFTL{mjd{@i@OGHY@1 zU6U_H!2SUCbEWUw!MKf6e-=*_R6!u6)<*KDi2SSXys=}rpxiTuEgICpV~wbNFbm9c zsS90ItKz=I^LFwk_x^^MFq~Yyq9Bz$DlKjO@P@ydzMhkdT;3lkZR_`#;%nH~SrVjm zr@wpB5Dxk1pnp|Q?EEj~LnRNbqrKh;n8U+S!|QwAAWr9E_@+jD_Yhrk#Ti9$8@yiI z4nKMj*n-EHK(0%nH@x|p9FrFIE9dpMsTg03e~Q6FiI^Ek-VhIal+;DnU%_=HOf$oa zG8#HG#8!Wf3Gp7e+HYK{)Rs!_7H=c_)3+wWbn-eW;Up1sABQE1bM0BKs2%Ys9K>%C zSuJpTvgaR^Pq`7v3c0JN*Xpn<}W5C365=eAdH1&`k-4K@|>wFqUAW>N@H! z16;e_+?|n^8Qmj-y~lTWYL4BYVRK#0Ayi|(;o>u5x)$PAsNU=`;$s!>?t>`2f!JP5 zINtoTG>X(WeB$k9GE)PVw9Ak*|875SB}$P!fJeKxroqR1X09N2g$bcQBHCvT#WtW1 z8};Y|A#hVxH#FLZeFnaRJ)fClhn|4E1Z&E8|8m`xxwwG3*Jqm^gvHsW?}ZUUULLvp z=_RCjhWBvu&C<{#_(!WQ1wYPe!}%NP@zbPe?CXwdq@HF*Urnd#i%s9#qScFNZ(ntX zO}NKOj9$vQKFd@y9XQ`TWLEn^n7;c-K8atDsoR(!Qri6m&u|0l6JQL%5hMamG}K8; z>qPAKW=+QbGQN~AlloO7fy z?79vGW=WB{T`G%jWA&8AuN3Y8RW$Z17$XcIXIT%)%+%zk_>oZryw(x-++X9tPkizx6D) z6k!he&7&wjo@flPiQ>`o%5eF%Ik=1Qmn_S%4{~oaldYlj!Ha*B4{-F8tyd4e-q0FI znHK+gcE*Is^|wG>d;xeaM+dSzct`u4nI3D~1E*I!s}3fLaWeg$E#}JH50sHVO6ES# zo1{P%E)chg31DLxE(75^X}I55$@Usp%Y!7^BPn1 zkTnT_OVtTEbyoV!NJBN)x8(dlC~3LrKRvpCDrgGwlRf3iG?|H1 zk?$=8Qalvv=EA+4zPn=>fnOP5qwyfV(bhX-tG+pSe|NV(COkNu={6e8KkwZFej;_CrCZdiQj(v+i}ua| zeLZAf4g`bRVq^ShuMifz%l1 zz_+|h)hz}3wE4fI@E#-)t|tvxnf94x>`rNeZmF2t>MPY5m5nAR-{0I>%%|zS*$De; zJa8D{`5W1fYKB=cT!lLY>8GEwzJPXi-gY%bpM*G5jKQwA0jIZL7JUro*cxo;gXOJ! zRIdx5zRE`4Qng(m*XmMH>8cB%C%s4pp69gityOp8Lkq#BakLupTUwY&NQ`hPaK6)Ok#GYXQXWw!WEo5~2e|k;bMP>h3 zucqb*_b1J+h!D6h_?j!Btc&2bm~vqC_i2~=sUJ|;rpl$q4P%94_$42o7H-tOPCZ;^ z(I=|D8wX&cc*}Fj04t?&l5Q3iz%HuPuM+))70am=ef;~$hU`;yP2OtS?7_=I`U01m z0oe&Z98z_a6eC*(JLj>5Lo_`%@vfahUFL(O zA4?K2Y>*4n*C`2QV$o>nzb(u$F1}TMlCXO>So{g7b#FXcKJ`{`-5no|!%&{Gz*fhRw zFUK&aW$I>zIHlo83;3O*f7>6t33mLjixCebrJq>D>Lf|06f7$e6fuin@6?VwG7NsNt`6~Pee~QK3CRRUM0zAOCf!oEvEG=u z4{XNq_Gt@4<4^KDsQ`>FB18$$I=nHv zF`SD6;fhGFD80;&-g!?^kpYOev8TnR*jsSClT|W^jJZe-W@AJsNs?YfU1;9#wNmV^ zFRXn(XxB8F1;LsQcjHby zthG88ThdQF&i3;beBdv5g`?spl_f}gbz`QEoTO%*$YbAGD(DW>eQl`{*x*8bFpu|r zl;9bLClS)U1y>$vdV6;>F{E17?M;1V(Q)LMo3N0^{G2!K&e|V;> zB&9u!!Xd3hci8It72`RmMyuH|+yL^n-{-8D*P@!HQGMki+`gPh!R$`K9!}AMV>}D| zej?*s-+&iv!oI^hGDU@D5a1A0f^~naLT+ft76HC5cr+oq>_U z`GiS~A`88Z?6b$iMmR(?p6DQ|A;JQ5)pZe$oj0AVVofBH0$d|W7T^A2UnX~PFz0Jw z1hVops#QJCfp)Cn;lzG0)TACF7U22Hu4%BGaURe z_MOI{wx$9@Zr;Rk;pnC-#lIP zPlT_dXi>abq{=)JS^X<*$e7h(NyFLMcwMup7aq$hgilOF_x_qxgMYn-#aj);F06Yw ziPP2XO{KeYJ8(dtHnF~r8+}EwfYqT`^*N6)8yZKdF$WdbcUfHT3uMZf6l7pv}u9oAllK&W$ z8(#Y`Kf>uu+t*_Jt=1I3LWkAE2~05aJ(C${rn6;ZIbsBHiTj)Cka5MlRh@Qi@DU@^ zFk4+w^s_Gqq4dCHh={_nO0T9jMuesOjJ!F<&p!NJkeo>JOht~7s6f@q*P!wJhYJYE zVh@V@`$M<%cxGCgtMAHWXH235n)B*AE9@-o^$vf=q)mpXWA9I1kn8K7Kg>{Pc2-vY z=g7kj*MtrGTBdDQjAs?}b7$vcxcNiz9SOC-`&X&`Z`mA<*~ZuFic!-=OKLLAMktZGVd1LW?Nq^CYR<_rOjZs!3fTd}Jxls-n@uZoEOOycH@SapwX za6En{8lB_(?n3WVh-Xo}2*r72wx-zwXsahWCSGVA)#D6}du!s^>28xn9Ov`AWvM_1 z1M~GDY-&Wz%)~-`Q=hOb_4lXk)&{#T*Hxk6fo4%R(!aKqJ)ab$_R^PYSB(^GEx=-S zRX|uRA;r2$iZnb80M&P;dnD&-ib%=}z@WxOIJqe91d5Bq(C^55?pNjtAahc=pvi&U zEm!LJr}Q40@|QOJBmArS7d+C;0NwF)Wu1LtTy&uI=d8L-UH>WAf3`OI+&SiD=4IeUDJ2xZ!;eljz%p znA*mzB<=Rw=Csj)XdaUB9MLMwbJojvK`~N|zT5S6c&PhnZvqhPlPGfX$K;HNVQX?tcZ-}@qAOQ-hgmwS(L#HXgAK62)dvt|`8K>>l`?{XG53}SDj z$z2RQ%mfZ*&a|>vTg*B+F+BXQhSz1X)qaJ_sebeJwvQ>frRjqM9&xKvZe!w29>P6DcMtNRq0gfwIKo z{!Gl!4c1ze3AlXpE;g(C*guZVuy2y<&f3GMjnGu)4%hfgiPep7fL0&YOXKNzg>?)c znbFu<%obMlW1Vr24vpicr=ypq9S;VG?yS;d~I3Jtk6rlde;t=|^XkgsU=ZUY`kHoBL zmmVK8M}xuWa1mntmL$cxk02~d?^O5ciX}^Jk52C>N_Il*VcZ^#`_}`K8K$?G_Qjv? zY%qWZnU`DMVz2~Jv$+;SWQLXKw(6itSqX%IWdn|Ecl>M3-5ll`m4Pv@L*Cvn6zSw8?`jZVX{lxh1c_I z`Ws19^Y-glr+G#f}k(zs&JS z@8pbcRE<8y7@0fmugfOL70TniUaDZ{Zm)H8(uSr95qQaAY|W{s;KEvN=BYes1@Cf; zka(UNR2v`G6tvpd=fLBUKU=+q-i@VAk{+T2&WifByqGI@e#txG+qMipI!xXf1lkY}K~-(t zo{u+5MV~+OjqK{3KKtN{WX}fj3G#;^j>7V&k8 zShfIdK3AQWG`id_nI(qLA>bZB#+LN%`y^;f7;$fF!CWKHnm(!*;5VM2y!%KDk7!WY z^;32aX5gd9^zkoS(yu<(TO+dexEq%7AI8DkG*7InZILq#zHuia6v2|Q#214S$gOSv zqRuHpP|Cyn+X&9IG31oAFOPcv*OVwdyx(EtT84=O!)s;dTt0lt$oiEOck?;hjbbX* ztguvH!wJV_mC#1$f+&$BP$##td~YN2t}!OSrBvQDuDzk!sDg~-bOx=`9i)pTBcVF{ zuviS2URp2^F7+|WPHY>^pyrEZ@XdMkum%@<7D#?JBYBmV9a_@DnD&Oz^G@pQ_h~CT z=0>P8Y2PwS0S{I1Ke`IqCd`)MyLs!@M{c; z8ll%bOzJ`$1snKU`5024=vY(l)vQ=Fab)dcU%yVBJ=zVtU@Sr|zskyB?b?{Q+o`Ta zHpSFMyoz>f#*!ba#>=sA*{T++VwwX2>%^ga~NuW=%W`;??1JI!C+OphrUZsLSCZs zKcsC8W?SXpKb_V*&E*CTu95qi@gG9^W|`>9-P%dqKdjEiu(x})lt{|y=hSbXg%g&Y zcY3;Q_4GJbYr#F`8uJLh)8g%9C6Rj|iFvHeqQH|X5SfuCx?apOeDI9Kx2Wq<0}|C_ z)6b5usAbj+Sp#1luIcBft2?Abvr`cL!nMCW!{r+hurE|mH;7%jcD_?nXs5#FSK3SS zyoH)*b;n*xLUwK?8bv-ZEhizk!=HLhb+{Avwb5U~5f{wIe%RqO`lrVM_vFj(J4I3u z#LPDr-^|6H#EkF?eru_T`GG3U!_r)8{DJ#s^yZ@ys-8;|!k$zd&g`1SJEt*IWR4J= z2X7-uJh^YAdxRIovbTZ}Y0<80&tE*9O24opTu6QQdpOh0WNsJH93r-hf1aS{mX-Ef zbk+!4;9Akw1mq79hY9c7)8Z>`C-oQ+bWvkC4LGXdOK_=XR(yua|Jt@PZ*2WeM2U`5 zyVkqkd(|3W(W6sO>hP_xqjD?OJMSom#FZ28C+7%vjKHd;z8=w!4{+(UU5P|K8!{0a zLxb)47b!0h(Vg}lIg*MrBXJFL4m1^zJ5cA(Tb%wrY!N(C(NpB$(*`n==)SC?3?m6> zd0s_}M;GVE&(h)JK^}^LJxL!(etI@|JkaaG%~=f%ZIBC1#sg(bEH)Rc?Bs*zbC>^%u`WD0oHyf*_ld`m3gGxw+F|*_02s8c62=zeJF|@bH2E4z6zDIA zy@T*BDCLcOkDJ|-XCi=o#H?T|Wi9waBcB?_b(l?h;TU~Q5~l6)i?PD=vc}8+_7y&0 zK_`xf!*&otosY61HttgiCY1?Wn`$2J!-_g-D5L4d+yhxfsIMmxfQ08aA{G6`RgdY$ zFk+Ln4xMNn|MoTP^Y=!tYU8FvRD0_V@v#7yh=lq5l>M%Z8SprpX5(l>AH z+#~Zm*6)5N4gYY8bN$^Yfb-!*B$LIJ#Z`=6^LNiV1Ft?@l%3RD-T%$T-R%A5Nozk% zfhphR(Wn3EkX2GO_Wx5z7@ffGH4lK6;XesE})_Nz*Uni5&YBhW>>j z;qb2OzJ`cc(J5eRgXuBP13Ay3869IUyDnnyt>}NZPIylyq-@V-JBefRlH*AmINc$I z-Qg<-+8gx<))DJVWw5fT=R_m5rR?_=KBGj2T|;<;Odf7BL9o+ra74Q|Wun$hdmntX zmG;>i1F4}#l3OY$mxgJWL;ZT_6-3DcWY{i1Z1}xb14-V(rIDpn) zjdGItF}wP*(x!huUu_DDpd$_?pxbN;A)bEHv;wLK-r`r4Swx+5v5m^*Rio)54n)hJy*rp zxvfQ4(OctME~}`|kCnO{XiV_l`1R>4UQ6p{tvM%ZtT=#I6I&q0slZZwQimEvUt6jR zL1F=W7GPb)|03w4W~ZXl(4QfWyKs3JzcwWhkYxRpF~04ch{T!eS0_C~XwyHD(Q6 zQgL7j?jI^Tu0KPT&;rgx%B7Z-bJYf=uj##B$YmUQ-mx9XJvxlCoV$hY=nJZ+9iRE(M>+F(~y6A(_**}U?}&0+7YTe-W;s&a)x_+rKC4a|F1 zgG6P;LiH9DN^-iln~!~1&)#3Kn}FnpXmyCxoPBVXVmKL?i+DIXWt0i^jdO}1ssOd0 z;0Us}C(%W3)19eZMB&&O+W|dYA#5VPZzPf5J!eksvbeutpUPR3nTin{O#6Gs3#3Gx z8;fn7eXU43Zgm%9KORywPU^x)S=GmQ$Kqf{FP(W>BxMndE`de-U1Pm-{Tl%UTenf+ zv&eA~i5KTAes2moyNh5nt?u0fcHf{;MmX!uSH&8ys%dZ$`+^{s-P$K^GJK!M+0=%# zd2aYCFO7vhK7$gnT0XQl-cBJ+?e4tT@5);Kd;RD`@^}5X8gw~(e13gx7_fx$4BS^O zJpGp}HN!@{!FcG!xwb-WABXA&Nw&Ml%};}sKX<+&QrF{l$W6iH6> zi6*?#P~dBphh;3%xiyg--{_kxzq%f!JEzbmj_vcLuj1t;(Y<_l2dhKWjk0+;i$CzB)TJc^P3Q1Q)ePJD*xb|g&++CKtb#X_b$-TmF z%%30AG=!j8GI$*cK@t88mCi#9~}g&hKe@!GWxaOL_aKtBYF9c6}Au~PF8o_-N%rt=Frvq z%LXFf`-64?(%T56OI49tL0YG96%``p8r+wD=$`o&LA$DENj(|?a58ZGUJ6uReHIh? zYEl`lEavl}B+Kc`a$lf(N!Jvi=`mfRl2|p)SkvV3W6yVY24W5-Uoo3z=xw#LG~ZmG zsKGPYG$%$9*#1AL-V!W#*$$_0W81kkuxn^;fZ^hQ28f-$p zpFcARFI;0qXW>z|_xD}L68g@t^Bef-EL9h9Xx!lfnZyH2vF@h?jeNglp&I)pe(&Uj<|lg=hh%q(o16g*zX=v;H~h{OQfm zMlr5i_Et>!Xcn!MGz z#k#G57-$%1{|vA)Kv_ri%Ix54)36$lXIUtLiGBT7*^NSCoTSDa z|21tt8K7jNFuBFKK9O%DcWmU%p$I9Wqlid5{e(ZOlwQi?nxR@6*gg~cL1QWdP|bDW zYFysVZbE&NO*34uJEz=%*w z6JH;NWfnhPb)#2KIxtZ$%4k10et!&@*|Zy~*BK7fQlw*-c3txLj8VbKk$MR@!bWe> zNnu0sH)05?L74@TZaVMBhZe;sR3=}~)gs^?;E~27U}n-@ZM7$3j=wLYQDeoY3#b@4 zMskU1;6Q#AL;+1$)S!q|0pemjCf~Df`;1C!XlHz8R8apX&vxN4(GR1F#WxTe*$fuE zHJ)^v_R!jUqnr7AbhXn3Qo1i3a5TB+ECshRlviY&)4v$$dmC+Yu^6nS`#BC*^-stW z1wYXXV}}VW?T!(JH|fyY`Tz1*h*TY?$xc)X=U*OKQYCyMBHB`J{={rb`i!%^{YGQ; zQo0RvzwhKO!m#2QfYbWo0Rpj5?dX7Q2=$&8V1PNe(X4>PAiurOoJp$@fahzi>_^>33JI2+k0?AN*lSQ{b>dHyi+qz9zTPQHiom-Iqt8!FJ)Msy zZxw{O*L*_VNs$X8XMyeD6ytQmc zoQ6o}75xHv{@OEiWF^x|r9ZGt_A7^DbtB67S3Dy1TXmzr#`Jd*@Tx!T8&qa+h(1Nf zQm0HO{esZ`$??IA{F$Q^)}*>VEZ>o7LRBxp8!A&dZXC{WId?M~X6+$n=b~0`N+XFo z-4|SsKQRKJU8Rno102LGzP0l{+`b9s4Nd7Kc~#=J=);(qwxe-w3zHUkYpvBjZW7ym z7wFTTV{qab%o0U|0=2vj`~tQsYh4Cb`T~Ulrs(7`P4RNIMaU>h_ilyX;}NaZ9kbqD zc?7e~rGICI?N1e>Lt{UF@pCuj#&LN@KcmFHMG$`gJ80LLxR-DD|FN3p>Vwa$9?<~H z5M%qTu|MyrDYGuX(f%@ZwHE61?H++Bl763o*LH$!6*7M8@;DLp;l46T7j4C+hx#GG zne!9l{M%Q2d_B3IN-MnE>T~spj?xuXc{mE23mT{rI*~0ZUJa;0AwoZ`TXF? z>rn#=5^0BwEV;2hkT+Fm>MM<}p;cfcBJ}0Q7F!=Y#a1*$va`M+TAr9+ThjK}K4x8y z%`!hcU{|PrTgm@~ez0Y3qABIWqp&>qjOyc)O_t0T$>dHy1P`k(fogsmjDeV(QJD_U zjfp7rilyc#t$2={Z)twTix{FMY&AZITl!TqN4@rhv$<G2#EeKu8 z?Kk?|stYc(-f==Lf4Ra8!LNcT2kWWSK^}z}>se>8wI=0`23S;wNLpP8mn3gsgTSK? zXfla`S_b_i+7!qqK67^%w*Z~j?3{0j1@|+80+g2-bi-{H3BNgnH0`zRyjbI#zaDS= z6sTi1Z(B%+a+)TGuxEIL5J|>ZXindsKHS$6on8Y^f5{dFfcJdlZW*^J@{XbtyS?N` zHLn}H>FJ~DNFviV&?P%AfU>Z@^)8Z6Pd3%yXf!U7(8!%XS}8p>=h%|4py(hMdbsk} zMU5otS)%iL@izE%*gYg0m?So`QlBJDwMnsBo0PI3C`#mFQhDd$JtPi~!6-W;sd|+j zY3|S*Z7m+R)a~c^b{qCBG3WhEr-uzU)H=Lde5+vB%dOT!ki($Hgj-ya7vd;^>G_mw zUymzQq|W$=BRLp-aAdR=Bb-X(ga>OvT{J8Dl22fQkR*D90uikhSwQnS8j6v6cFd2v zNHw{31LPFUIDiE|vO2>Rv7hLxvw|no{o!>4g=T$RGTo1SahiciNbb91*Zw)dox@{i zP-gOs<$%Pr@b}N2f%=7vrW%-#F6}2HZzc$>#;u9)JCKOjY5xUB{>E=NQwt3cW(p3* zTW%se!2%vBPWy4X=>1*!)qwBEMrEeIodhKA|L9TXfgwzpM^^)b2XEsOLr6EM;CE4( zZMW-_IA?1sDE9k=GipDLu)%{6j(e9!llpF1$~`TPw@;0TV1Y;aiKZahqMW9JjovcW z6Pdy>cE>OCsdsu`2ldbaESNlk4Xb)gywjeLXS{%0@F5~}IyuMCrmbBBDLE? zJ=q^kBbZ%rj$p32wwZ0o1>K2|O!bkF{2M`f{5j|y&=>w0keQiDPrqk=eY|Tj~pzStO$l=BK)n)I^i|H+NVT|fi;?I=P zM;%xh0U@dJc@VC4f-K?`R%O3cJM8Pk)Ylq6Xt$y8-`o%P{+pkJ6yngAS(=v?w&d84 ze@FOUq^#Cob+dXoA49KB>&3l~lpSe#AAR@g-0|!H_9TJ?xnRK}_LY*zXZ!}ztqeS` zdY{0PfX%(ub)HkYb)W+*>@GwxGk*|{7&5PVcbih9~{C4yY zvSpi=m-u#UK3?FcgG!5QV*0-B!N;kc>%&=X$)ITU;Rt_v=TmeJWTGc&nU;-X#5W(Y zDu^s&L)#{Is9o8?pR~wDJhXI;6x>&@3MI=GAu}d6h1XMXk`&4hBVJ6(#W=okL^*T( z*4YYQ$Z^nV=PmBYp%)EL4v%+3L=)M@;Ak6@Jgz{ z>}<)R6(GGU2Fip)`s;1-MAa#Vsz5Pv4e=*x(7xz1OkwF7jHF@Rhxn2vuItare5Y7p zn6NNjjb{8JmbL4^f|~Z^HYAJ@jv?3R#d{P=h~5;szrG8Fxe2$E>6F@omptb=4|Ik7 za#nY+B%a2X#M8|*gWYInx3JB%EZWAh7PND_RrV`C^fz{Nr=9R;{j}Mgng8%w$mxhd zB;S-)l!b$nUFJ(NGvs(H8)L+-lXtL2X5%h=kNymQ%*7>z)G0EFNojwWZvI0- zwcisCdwt8gchh2J>hNP^KkoCu4l5FZ5gy#X!a4~?c&fBW zou-((Ka=_e`%0hqhPDN}hWx+9nsW$m_N3+wJZ z#VjeIih`L>ihIh=vUOa1s6T{c5(pMWlzb(kF0y_m;x->FLzuiRmBAde@`UFcpd;!= zLxk0Ho@?@rsE^6Nk|{jrNqb~?)5oQe-nYHfOc6PRq|ayJwYo zv)MMD z%a>lh<+a<9k)&M`tvItLCD?y>Thd4 zJpUO?Jz>yzWabp1Q8Vo*zX8zt@Mn1>><`@UNhChuhcE!w8V%$CbvNmYZTBf=171)_ zRm&{6f5Gn#-*Si_l zo=yS~ax#7GF3~Auhi2O|tAB77R(NI|wl6YXNldi!YzH``p%{#AqCCz?pGIue9fpSe zQ?T5BphY+&VOt=yvQ;n>^5E+U*@i-c!TgK^&-Mk^;}_kU*3G1ivg2PHxT{5<+`y|- zaTW#XgM7{6+);S3v~kBwQ=8?HnyK$y^utO6s38?RL-I3KfE#$1loglMs*Z%qG{UOH&JO~F~zqBB(}*)+8Sz&*dPv%`>LP%Kg=jJc&yN#sfi zu>t|QLc!-~9oY16=g7Cy*SC@one#%T=<_l9J56dO(`KVu+XB6(<~o6UH)PqAzGaix z&M{m9a==ndfn<>|r0n1Yr!J+j7(?5)ot@7BijuPL0qs9*-D6zh5%;qLr^Q=-0DN!P zTW3eA79qzX-yAwEiB*yujh(GGH8a*&@Geif4KC%9zm#(CUD=Jgqnjl`9~_2UmKa{0EC=19i7;ndt5aBee6qc zQC?zC;VnLT)0y_`(Ir{Z9X38^yaruf#9Oh6Osb`40lkxaMiFbn-Jl29oqU_I%}V`$ z*#fgj{+5iaNt>0|NvM(`y-0Mr96Lo=_n#GGjf1y?LTT%bE%+ZcsY#u?hoJ7Ag70;X zY0)RT%KZ4BDv*07w{<_~&;3=W7LIelm z@{M@IXUl-ey`~T=ws93xhb0RUp*y|K$ki?X_L)ERkNlXdlsMsyExuQJE7eyp)~59o z`nlWKdx;5dsic)3mam<~HS>?esvO|P{72XxBbe(?%yZ1Pqzrd(w!>oW-ebn1HDl{W z(sbc06Px??FWygFuz?%_Hl@{|>!DS`=tzC66`L(BscP@<&rwL-eKL^O? zvoAY`X$26J_VWHA)y1R%vC_Y3SnrsB97dBiY?>1U<#_uLBXOgz!CM)@!)>tQSJ<%at5D-2okiov%mxC#UR(a4GIAm&+f}}q zTz0jw>L)y*4}Pvc?O-B9(IcV!IoF-f6G(|x((w(M#L48eCCG>j0v`G5u+o+$*~m~= zwh5E1z7Z3O7^u#+WHQe9)uX%N{SdWUtsogA?-Y^<$jrvMl$fB&Rq+|GuBW~o0y(eh zGXE4`S-*vuOVoE$FG!uBhtf?4xG1vhoz%*NRcaNg(*Qp)zIJ%srsp+S@OY8AA95YK z6QlS2#V|A5KKGgCv&0}}@vY#SS7m4vd_Rjyy%K@DZ?+Kzv-+>FINeRJs!0-0=}N`C z?5}IEmrPYYZr>!hK1KoI2N!)rTWSx62#)o4HJ$LV=U7vb;XT2>$;G9X2jnJI%iucO zSyM`I^^=rA&ouXlbzOY^(%*I#a8m0p-Ko(nQRC0>S<*}MXz2UcY&8T1`#8MRj`Cyq z1?Vw);BAlOsmX04-h0Oks~X)oit-(PSLa_skG@(2Jw&5Q2uZ2a^uN%azolk0^)L81 z>IJS~y+T=z`%upv&^iwO>pAXzsb5vm+~011sY5Hjt+~^B4v5|z{>-My!w6Crbs%=& zg9XI& zH*RfDLl~a0AvnD9;>VA6RLI+BiS=8JDEwjZUMj7BDBLZ!5+A8|V9zkVb7EWSQG5Z$ z_v}o4D_mR;T9XeIjBa|Yia4#8P}GWfi8sd98QzMC<0H46wr{wxR)&`QB5vwwi1X04 z3d>nMjfijF`-5Ltbw-FBt(Dj0AR ziV5&EPNko0TH#$~v4vg>1lO*ZS_=fV)ayT3cJ@_H8|~DLWrT4ygL-+7~BD=#*i7(CFr_r z3pj}?#q&(XuyucW6V2AqkkV)@Nhdz=RpM+-S)Lbtr+;GV2oJH-5ArEfb#*SUyvuq%0QeeD*{$OU1@m zxS_K3#gie~NGMbFic!_}-0BP`j?rs^au6H2)iTl#pyr$bxcKriyMkgg-xBn+Gyb4~G+e=D57YnAAw4m_J4IF-W zJh$^j)jx7XkfDMl{jVIcM9C2&c?)ROe>N9pBT~(XJ-}u+&GoJv>FHoaBf}1Nhc+w7 ztWj$yILsBG>mdVuY!;YgED(H;!JIF>?E18&c#Ef7&;B=sA3K9mn}2|3B4~`on?rxy zD>G0s*Y7|~ea2aqkPgM}JUwB_8Z$XUPwM}<(Q|d~x5C|4NR#D@iU_zS=`VzaUPTY# z5vMol4T$xxMo@HX=aSHLG{g;m&?)jZ+^(Rzvia(1w#CyT)xO5gAVy(NQ*k1-9P`Zy zUi*3#O(burQG+P`i-OGNiUAa_Fq|+C+!2VLLfdu4BVG5Bzm0}l8xjMSqSeL9LW~1R z0$96V0+ntQi( zG1DKITox2V!Po~BsNC<=kRAM^R#FI?89h!xN){~Mo#QCT$AoS5>A6Rl+;2W%ilJA7c}33n;(5ZmwMpU zCT1E7%$};Xdl>dUL=isCcMK~F17Mfq?vE2~9@r_{t;__P~} zmdz6gYlYP8GN$+xzD)}9)*bJmi$lzg`C6%NNXkIh=xtZ$3|UR~+m0pC1x`84X!90F zSa_{y@)`L)0CgHlU?M89=HyMEPqwFw{bkl}C|=n|I61cQ6bbls zmvPbC*_;)Xa`!Pf3&jeyy^gtLpy$t)h#z|wM>Q5_u30UVbD%T5;RmMs{kUQ}jIXf1 z6v9r=X3S9Q?#d`3K9b@oC!}(c(OyHS?`v;Tu)1fy-IJWBsV;vir0@igUFT*|lo)^|;L!%f^wll^18)Ul$n z!+#P=_+76apHDr3BNRN&#Fs5~9zcA1WX?QLNxycj<|9bbri;&VhUu0>L7?>*pCj^z zZJ&GoP(>AP8d--)w%6^YXp{M-Xw&*Nd>x9~FlX)gw*vN#GsJ3VhxjD@Y_G|Dq9V(E z#REwO~^;w@>-<=;v!n|l z{zh0+pMPHzy%^fN5rYaaki1U|Ei5byg+dj)(2%0nFxWAYQcM=$5iwJ7YDH2fGV*)k zD_r-CgT_C)=Iq!KmI8;7yuN~(n&;1h=c<`)kG;e`!(N8%++H1TGPV{T|0RXN#*f=s zyvRXHU46l|H+3Xl&r*7Fjgqsa+txwPl4)b7?z^zN`qiv`I-XTCWgD?Dr@ut~1B@L$ zB{D)Z1|Innz|)sOE+#cu8%s~mtdP`KO6excXMuA#LyCM4eozf3Hqk^RKnX%JF#R4{ z0hRJeDP8b1$RR_UWuG2bb6K_8A3AI|zR^6ac<&4>?`Pw)Td_z;TGm&79^d{Kw;v|T= z>Qh-O$reS^_EbSb>a}W|29ne|-bo$kdx4MPuPWYsNav9i-Pe7R8aU%ZCZyN(ZDY%1 zv15dnTb|r1?;ZbOJJxD_`g{n^T=pN9YO}H$IJ&Sv-bjK#>iZLUT&ZpSRZcr3rd_GT zD{`lwbDvLrGNIa+zO+dUE@JH4xY--I%36|_=jHG4-58vXVa~f~Ycmzt(UBj?;Iez$ zC4V|BB7CTJjVaQ8zp65z9UwY;9Frq@qK^o2WX6>pwy1G6PLautaaZ7$7k>iA6*5{7 z(fkP=dR=TWOdfn&k@WTZlv75QA;v7`$m7@Gl;-4wx9wjhg`aB-CH?t*4KJo8N=?M? zN(;T-#urq#0Tl@l{qrAc z<9>>gav3)gcq$;#mGHQgNA}1kUysX&|7c#Xg@O43k6FK^M+jk0Cwwj|exU&NVeA9F z(jrbMb)S6d_YSw3d+qam*X(bF0a5;e@Pw>TRKAnFRZ-I9R(4Z3YgNko^E%sS+{uv2fi zf~7Q9@%er)(2mcOk_ETY)$Ebvt~`oAF(4!sXf^A>?*g=nB3pQ(G_K%+z%pi4BQ;!MOHfv!=PybZeJvh z(JLrxy{bAQbI8J!T{7}|6riNNIcQtM#sWk= z$4KB6OS#v5n3IL2Q5jty%oz0^2SImb;e!OeR6#WlTA9fJb}~%n3?eKBFjypx^eKDR!9&s=;y%Q^omPV(wTY_UVAh{-#E?s zQ;#W~ArwyXu%*U|w0epC%}D}XlN^UupH8PN=z4i;5c(n7TEyWvb5>+cEOWMR^o`g- zafR)IC+?M9ScvMIVhmN6Y?|k0YBe<6Hyi%5=D7iPWOt$NBA6#Gm{`zG!;IOaWT=7f zPYHL#1!}lvm?bZ^8LL$KxlEScdb6VK`Y*Ind*nj91E8I?zZ+=5$l=tOUj!2?#E3|< zAOoE4${e%4;b+%o<^(NVx#|>xdAJ$z-71A&YV=JPYhzwg41ppJO`dE#Z;3vaAwhPm zT%E_zw>w17mfM8uy%Wpx>yA(?S@Zs3Rn$!aAOcGQJ+&yzas=YW(gwUt(0$dcR(qmi zLbQoB2+REXOqd~eMSxUJq zmr+hnXmv3HE?d_!ArwhleLYZchdQG6sYv=W1+`zbY1mV%3u=2Du<;YOHm)94z8F}$ zf#U%8`YW}V^SRL?w2+(LmU3Ui27{wsSIWkl!u ztBq#GL{@p~QPm3Gh61fa0xRGB%MvQoi3ZAElZ5b*KHUBJ-0qDya`L^cM6oOL!NKRs zGR;9UPfzo|lJuJV>cFBuZeKFk;C6YAz-HZ3OGEAK`Vu@CGl$d*a-;0TPUR((BP=~S zTTGJmN+8|aSns`FO->M`N_Nw`^Ns#KfG?+oj-FSpT!GD^H(9;RP$AOBzZmDx0FD@f z@iH)SN8Ktyse!WVF3Rx*F4`ZNC80Az(dcF-F2qCX`h1dDvVG_=BFLHoKpN zAEr?yH`LPZ`7(EeM%-|saxVqunhZADdbIO+8Sn0J32ic6m`nEC!I>Qi$6av(Zfz-x zKBoe!CQlMQ(?m}TE6pENe&i(^p&QjOy%7qDfR{^eOto*lKc`-Y(*V}GtbzrDqP)f*nPA^39@fT5nAC*GRheLc=Y;WSEb#EyiZtcC8 zvs8lEzXIFW`z{p*&Bb%Ai+q;M3m&Rm3tY6t)^IvLH@?0p02|RJn=MD`swPKpd}>9? zI!$%cT(%V+MIR3kqN2azlFNbbN;+E;>=R8n<_4_^DylSP-lUlDw8!IlbF-jO**81s z-|t|F?!YBusy9O2;v)?tjRB6NQNGFDr{n>ALS90A>`TKyHY0(_FDiTSa zQR;_~IQpqm%_dEO`)`kRvr09T9@59oUDNcOcrr^gVL%nNFo>=UVM?zL(*u zqOIUIw>$GEVXn*7=7F@l*YDI!b_8#)pC7QKem)WlJ{DLQ|FGZvWK+ilCA;?gc%yJ! zI?b@6KN;L97dvjsdsR08M;dT`4Fm>6z9b+XH2U=ZEgcHeWwJLpwu$W^+V7{iv{}CK zN6~Jm{^slPt1lJUiB0DYP&ycu=wZC-tj046tUMn}eRDA-Hx@#l_|pfm4=@q@b{zWU+0l;Yq09o*1Bh> z$A|8w1T(~u>))Gqu6kNk5ZrylELC!|g z=IWB4%t62PM!}b{`kf-k+3e)}CXvq`uW@Ye`4;o+bXsbS#5+_-5aP${vn59YTVMq3 z#uHc-U1N;)n5J9Yl>RBKVPAZFQ880u-1xH1H?RG8*Bk}0T}9L0(S?VAFh8_?S|j%S zL)5CifYhoXK|JE@RuKBwn_@k4_@MmqtThUXo9#9y5R?BwDwbz;X&5iXvyP2Tt@DWD z`>!d_`)5z#k*HJiA%qq=?Xt>*h~NpCIdTupI=X2YmX*_7quQ!!Uw&3p@HQ66d6~OT zivmU-I}q}@CD>*Cm*L8S{z?#2bJS~%yLn`UIhU#XxT!yYz_iz)X#= zV*tH*u{*VCxr>`;QS52rVMW5{InsMi79Gx&vEc-tKnlD*Yn|x(j~NbH-V$gtXz&-U zA){w>0`=VPio#J^V534bY zBBLVGs%IUm&m_@Jm#A6{ubxR%@;fTk4h;t0u5 zWqhJSt!p(7aFbl@ynePDgwg?=z^&mT?Vj~hE+&+N?Kh#mJL`LUd+Ts`Y}+wH{hso8 zsEXKS^f}-b!F}(y!0mgN=GfMcoTLlXWX|DJ$d%~+91`l7oNM|VuJFLfMZ0QjhWk%k z&n`l!0k$`|I=EF`3iyO!#$@xu&W2JdTiUfX+aS`anb8#8+)+?~WYL=UBjW%1{v4}DJ-;}(-_#o7G+ zD8~jm-Lu!1=9i39dc|^w9L5(8JFk+iWdR)0hokRMV~&YA(9^uc`15sy@a2&D43! z1r}1$=Rsh|w#L2XCg}W&odltvla;ha6sP5$9|0}SXkdfY# z8SrkuF6lRVmJ&Y8B6-EZW=KH?Fw*DdWEn-om8_76qY@Biy6fMnyzPr5lx$}hzVqxq z<)G+LT)7AypHrAK} zrPNE$GnbZkHr$xTcjXxLyTZPC_6Ilxus=dPL;7-#*0Ch8*&!T>vVh_2`VXO%c9?md zHCSIE-z-1YT|8Ora?h|Q4A2m20%>AS&@mf8zdDyXcxQ{pJ7zNR0BhzR!rphQ4VPjt z@qNp=&3Xu(MP*v`h$dQ!L!thHBQKiI(h{T3X1Jcvt>6pUy@#O_E`)_tP0>W-;s9lf zuM;A};VsNNfYq}!rQOgM5^cVSOvlC@;E~H>bAyllOfPRFPVxuHLM(X`5Os>>E2e}d ztCACOpQn^X(ZFLmD~jjd6Wv2&D?M%=Se@}-@=bYr?^}WCur44+Uf3K=1R6 zn5Obt_>0T>+lb~a2~Oo#{_Vw&cL|v6b>j@$PhCPJm1^%^T6O8^oJ*-KY9>XwJ+Kk{ z`n4xS)4h44&!Grr5_pY=VF&EVb$+Sg%oB^}TnHv0XvtJQ9)acWz1vcVjxVgHA1%gjyxppi%+=>)L zgcVbd3sI>!3;yg>zE}**pFm$RUm(|BR(z;hRLb~y9q6A=SN{qPGaHqQ)7VZ1DWPvy zihe+pjb+&!u`iy>*p62r&B#;a`Hh`^yM!Ybz~?wdSjia}5D~^HNWpaSq7%+WU$Tw< z#=-FQ+?NFQ$k^wk7Qol!eXcP{4p!ew|7f}436%5G7w$4xCDUzXg);fCJMQ^E-sC=6pyY4|2qUq>F^FJUIwlF>yb1UYy zc4X+oRydNl_nqqk!+#89|L-{?{eMyqb@%RISiTTQ;@VZ9k8jI|M&|!07i${f{^Nu! zVCK~rLT_|z3X70|HcSfCbr*ax*QbWu2D{i)GLx{z1zEZo(?pzTXU06mK%q`PqrHMN z8L_=UrthJx`7Z?M1=KfQ-YZM^NbiuKrY%JKUmpA&Jqp^7QPbM!mb+Nrt?PHWB>qu8 zO_xe&>c{VUM_B2OpP79ajwZjdGkn6WeJ-mQImJ_^8^>3lh_iLr7#Fa_#z;c>)DkiV zOxlmecx$x#g!z|7PuGaKPes)vkVDsJDS5QI*zz`%N835=eVWE}?#Sov@GTrRQ>%L) zyt3_AENH~j-#?YuG~9KMuKXyBWqp$$>@?8gJRA)6cSO&A zGM(gpL^wQbd42=+3_st7$34fX8OPv;C;7j%ew=#35P8=8l^a4$mn~;W)&BgLz&9Y! zrJv=#;H6UvLG~pEJVBp83ur^3dSwk^~HxJ2MgB>kvWpRF+A* zAjqr_uI9e#$5+hsA0+ovg{~9mzB`J!v62!q@FjkV;X%_>SfT|)gMwwmG#{)V*4rVm zG|F?_552&&--P2Y2nn+=+qC%K@@~7BNxiBLb-}q4mYePfiOdc3pZFHx_)&=CQW`ok zIaa5a(H9TLz$AJ|+!k3qLFTNS51n>5yPokmaZ8rsfH|h8y~ONX4?-d_|B#Uors(8X zRQp$ofyou7A}&H=3>#Li$u$k@H=b@q7JWi`$vCNQ(AXFz-o;*!hr2&Q*nPW;W4XjH z$vocC!}NPWUjsXE$!JoknT{6nln`2}j)1R4R_WElw0aMQT@{o{ws4kTh>MRx8&ACe zL^G>M!$iP2tP9~o?O;24bprq`jx5XnIU~Z zcvF!S*;*iZSwl;-)f-A?`a-(CWe~B2v^ePUhop`&XyExARw$o{oFb ziU{0ejkYQU9sZJta*C0BO1)!DcQTQA68Lg;6!Vn(#!}*Bhb0OJ3(|MNOZ0FG@LBxd zJ92zB*O5EGVso6A&-ycBUB!y4T^JbuZx(=%OfxwVtp|J$$tiXU@zAbvVH{;-7?ym0 zD9R+uf;A>_l>k#Rcg5vBHu$=O+4}Sb)AvgGVCw3*WUNnK-2v-OY}nQLT}d7zRApn5 z_Qcsl^e`gBu1)J^z`%ri*{ZL zbAKW~AWWxU8TuKAF?l?#m(wJh#&{aE`N6`lJ@JgzzFN`>cZWIW-EJTJC!vfCmvM(& za|z$-g*OL5+JSWi5VU~rdMuz5FU|+u~K&cYR^U?`OnO2X2OjTW~&vgK25qqPv~g6ALJ2w9^hVSoQg+ z@r_fa#xAQuvcjz8ZF=yz-2 z98yjoME<+n4Ze<-9G1S8!HSlh3DT+!9$dY#)-4K2TQT+$ieAlw673}5oVQghI<08+ zgs$^5rAqRZPYwGt`%5H%x}8+X{c!CMWGFr~<~$bRY@_3H1aUK>p)=WUhjC>C&c1BE zT*Hx~&wcB19UE5$Od|lKip`KoYTGkZV{vc~woE^UeGRcfGb;TiaHdKV;sM3&0tKc2 zOt86w{2o#Ej&*F8f|3e&=>6c(@Cj@2{Mv-?ZZGk*Fv3OKV%FzyM{5NA`L%NO6#l9? zwKC{lqdP%tLyBx}=~J=5S_O_?U*wScJ+UONQ~!k$%UD+b1||9<&k3R_K1s1m-jz6; z3(P=o#c=%h$Np(%dDpS@4ctlHdy}LSXNJ>RZ?Ypp7`eR$Rvgh3C~-ZZD-g1y0V#*?PHig$L% zhy?OULK^V9Xf!`Hp2{QsSFipbIfNcpv)GzK6MD-(ci`LypJ$Ssd2jDH!VMTQ&}grK z?3DBz+(B^#?&z#^&_)AF3tMnTv; zo=TnYO<_%;5L?@&a5!xLfMvoj@Mm|feEBNsV3%A0(W7TP^u(L)>=hcZ&Qw%Yw$C{Ri%QnYAFDN?k!2PhQR;_hBZaSK+g6fahs z7I$|mZpGat5F}U#0fJuMGxywc?*D$cGy6j_lVq}I=h<0n{noP+R8*^+PAFrm|UAaQ`6_RP;Y$gg_~ksT8gInM3!U#(wFCg;h-A3 ze1p_nX)X;{V;-zN=d>B&($Yyss%b9{iR|8y8KXJvO*cXOh_V4>0FvN>3Z*jLiueD7 zZ;5OC!^Xs?gWCDZAI0UM$9+w!!`lu2g{~g!B)MN~yfJV4g$dg3@k47;+vEJA9t95C zQs5%zA4bBx(0{;~zITn3r#*3Ev#l{|be$h?&5?BINx@}@et7M_7!NXknjJ^6;OnDy z;@hGw4VWqg%|Nh`z{wt85K2;vocVx4-w}6{CU*Jpw_xM)YEl@Cy?IL*vt}Zh7I+j@ zhfT?*Ts`_ltyRkX3q|?gbu!660u{W*Pxz;M*MD+H3`pdszXK{ap)kTn&6YX;;%SpG zL%5@_74K(W3s_R5KHa8F2P~>St3qM;j&ka!xtS&?oL~=Mh3Yd!0PYzK1e8tVh66b< z^bYC8y-tIysube$xl~?M%%_G!v=w12BmqjWi|TBv!AAW(jfzTN;`6Gd@*y_+V^-X#vDmf()}UINo~p!ls76R=Kp%z)9ZU&P1iCEjMQmUmEY( zGe2yioAji8969H`CZ&gZcl%<20Y(n|@DfVe=vX`hy7I4#8_t>npHERg#VZ43akb@u zv58(e)G%9sT+zIjqnF(+KBM@9xBrG|62K+UIn)h^cs?+i^_X?@X})?NtrE_jMc9$# z{Y;*f=u{Mmll6@W?ovDi4Sr7$SVik*{}dZWelC0G+>WUR_3Si$2d+m=pN`x&7&3jt zC&#iAh`4LDJ@ps&jT2j5hulwB4(QV=UXXm5Mj(pdLlkUeJjSd3bKjVy*=J6Y*DW&_ z&p07s6}u49*mb?TM-Lzr!uQa3ViX_`+8){Z0r6GRed^@gmaETyFT(_Ln$Gzv&O-;o zzj~;>tf-!2w`$*Axmi6~qiUdzz?8|!6 z(AQ_*$hTbtDT$K^7#ZywQ>5vCb4e@bN*cVTK}tz!PRM+F8roaFwRX~a<6UxKg4B#I zw2$K2HMAJ5p9}copRKMnUhc1D@mJq9ic5BqnRq~u=Ew&DhLxu#qlcIm!Z?KE)tzF-|(sKWV3X7$Q*JYtdRKTV4L1;+1?hEVkScnox=T$N8}D zF`DgpO!nwwR#{LJk)&VW2P;Ha3>eIUccgTWAT4m!})cRwgwc}XAb$h=5+F?D# z@zH*MBKbBGPVYF~Cewj2@G9eM`>kh!4iL4_p@{ zvt#Z)vG%s>hsijn*Y9=~hX*&>y-PH^(xv>dWG%&A^$Y=Lpan2URg@Nam3+}}{5`3& zg_@m^bA*?m_tOl-oBj%qVMZoZ{HgS>zc<$o_}k5LX$Ty_oi-xu&a%5GFf@-_w;hS5 ziOj`(`Pv$;aXedzZ|& z#)CE7M!IpVW;+V94uUK?^@UQ9}IXg{`?F%)=UwnVA zY=C1sBu}83k_UL>p6jl=$7`+m;Kmi+H)kB)ah!~w%SCSZM`IMq8os~cvM^0UV6ofr z&u*Umu0HiNz+fN$JlLPmH{-gZPjWPr#RV$=+`K>${DnbnSX(`vV8xC0$PfI&+#xN^ zA>FCyWRY(b4`Y2=8JTu(8MXkS!TEdToKD(E`(CKBjs8wS0H~B}<34YrL4g3VWSZ~E z;Fxe+eXl6SZ!7mc>YS|0IFr+ZrQU6;=t(2`AKvmfnlzX#Xj)%73kXikKz3!?)P)m! z@Q9Y;NK(Raf#XL2rtAgro8};trSF>CpX;Ed?z|f~negch{@{SCfPu{}>zKjNGeJ=y z82R(8fZiZOLIT|l50+n>L&XhqD|96#(LFOTrncfG#`FP)>_2j%ZtsPQZgc=ls~9WS zFR?4HhctZXO;&S7r74W6e zo1MZ`B5E zi&Tk++TY%gF+BkXe05>hP#YnS(cYde(QeDH_K3YT4GomB#{L~_UoI0YE7J3TIiAMP|ZLGSo68`5(xUKu(=q4&V>f_d1vZj^(*7_)olXGJfvqmRBX zrGe-n)74y`)1>$v$vztCpP>xdoT;04i_P6De2uX$a2DVYtxJ@g>3B}MD$GvvBGYS= zg){5x$#8Kf6R&);$i4aiE;eV}sRxN3mJ+HNQT^#K+-bJ1ZM|hlt3->%YJY*Bx3sa_Iaq`c=t#Uh15lg;>-2D56 zEdjYX%R48ek8v~YVlOLR2P{Zi>Os!4_2G1v!O7jt?5sZ9 z`3Ac%XaI%K-8CHNKvwVcnMW#e!?abk={|Hho8GD7G4eG{mi%yO3&nn@X&`43Q1OiN zxrr>jvRXXFtuv>%X?}pm?*neME%Z|WrTk$wG zo$o+$c7>l>NU z!Y$EGo{6`!LFgZ*A!~UAFTOMyJ_%t;@zu-0;nu#kHtsY{VplV>ax$#4I6QM^vMy+$ zd;r`I6&@Y8o^-4#dyAxZ2q`?iSNcH&T7dZQ;1KX_i`D<|AyF3zcUD_z$kiWP{{8aV zlE;!I!p|cN#pYSGTi?3fTR;F^WhL0#5B9m-i&fkU_V&`{OavV|?ZIc3V-g8g3_OcO zvJAP62VZ|w7T^un=@yKTSRPgw<$n#az-uAb!kL2*_4Yan+3RK!@$6IYm>OCWWAi=&AU11i*&iAhHu!k4 z#u_7|rE)os%{>jPK_1lix|ck(isJ_YdoH+|_AZw8PfyA|LhtIlpA=PkIB5qv^1-`f zC0fayVROIxm0oeYG^8@a<_m8>Durt&Gl!O7d}@OoV*UH5?e)$tDYD0I5Qx?g+%`FGc;_@Po1OZ(dW;&B4X;;hvSZ8z$9bWD1iZQKUmOLAX@+>isw%gU@Y)e+)nN|{L`wr*f&Bgp{scB z2vKSC%{&!f8+@_g27B&FA7t7 z|3OUO3C=Rt7T(kU=U#gHY%i4juCo25&kz+#Cgt6fJHW8>yAI>_hos`usr~s>R!YdU~$DImHVu~(=951zfwJ``% zdP=8LBnv`DO9B7-dXs0@x44X znPB12O%EnBuvH-f3K0-lS32WpX8i>6nZrh&v-@l+`&?ILt!$UMBcB3`l4_I(RY;0H zvmyH}{3<4fqcz@dTG9?ZEV;{zR=%odXr0BIReT|uIp!6L$S7Q|M1-|h9yKN+0~1m} zE@SmS*R#&0U<)w<8EF0bciIb=mKOWPd@Kz=$HyCLT2G=huG(r|#05HYKY!xR8omEx zbx71jyfMY=2O_L!G`iy;1Zf{J-(3vPGc=*o;`;d6lYgx40~5yOeP+JZPUm|%iE(&IJ2qF?n)|TL3#BD z(REI<^`-Y!(z>m~k38&&U+nFv^p#=%W;=7d;&03OAl+Ss1JZuO7>K?Mk%Xvs#{G@= z45~T)L+4x08)+>hYR1Q-eI}^aNU(w@R^D}E4o*^9TJ`0X&bdW}RAnS3mqKKs5rfxh zo;3(&guQEM2Vt5xj?hKkDyyQ7wWHH*ZN1mo!4==QrdH=w2b}If-(r4g9J#mB+SoD^ zp|YtxC4yaS;}yin0WC?klf=X7!r3C;w;#n%!}_vP|EwrLhP5rcB6)YmGg5RlVK2Pi zt2C~Byn4-mcyFDL?d;a>qEJ(lBFs*}uiB0TzBgI7#1NiqXdb0c6vG;bHQDhY(JCJZ zLu2Mle6P`b$>@C!-J#+CL(>YlE*M|f4rjhNevT*q-&`sXlb`+%Hi}=$ulY%4W@cyz z>h<~#rGT~Kzq!;GKb*afqK~(Re`!^Bm_G2z7PVI#Y|k3~IMsf_2;e@8=Q0aKpsuS| z0r2h|Q7G5n6z(0fsg@`0O z^36Et0RX_py?5gR=tNFGKcxnswA?lXv10mubkceXuGP+<(htw@&Oh-_i#9Z7?k6cW z$pfz#tfO~PvSNleJ49%rIVS$^gzkypc+NSX#A$)!eYf+wF3O{7`rHOZ{`R zU6deCQl8o7w@>0!eyu&S_TPa|c>N%o5nDWCvq~U8Q{>*R1T7`F=J|bjvhU>_=RY5i z7Awp-d*X=XjOk8S3mK7Saawc(hQl>l^8i-2`3|>Vt2l`-3j)kUm4M#269Ms8`4DX= zMDgrNEE}H*O4Yj0hvK##b-eiuu)$I){kArd8ERo5)4mfN6M~3Xn7^AxbCweGIZnx~ z(8sxd59-3*+2+W`X56t11Rr=!BrnYvmBY7oJdjLOXW#PK??3jwjgL#hoh}N~`)sZU zwGl&i!Q~A*PCtK=W4Y1iyQ7*h7Yrt&j~O=$@Qn@%KG&sb5%mpozxx6HLX1#uj?e>H z&NV_q!{OVE)_ym|Yo}$85XwOIG$*T}boF2qHfGN>gcc~)JYjr~I_BWUWbKgnK;fKHtK7m94FswxpYkJ6Ji?+EJjD8^--1@SE=Ih(BT7js_ol z(*-A~gy3}K@X(Wv^ufcenK`w$9R3)CV%?+`xK9_IiD?!2fpWG z-NB$1VGa-8YZMQM6Wd~kmn|}|`XiGaJ6-@60bPO_j9@e_>A~-LkS~h53nivNGa(!d zzEvH=fPPWbmMh$$2NZ6Ozb>E0(={J@rx+>PpAhSy2q5*hyy4zYio;7Ye(xv;$t!#v zHtEEk7j+XW68oAFb@^Py@lk-?A#75h^WRsEZ%TVfBmAdK(Mjk9hac-|NL|<2B0zcC`b#wALw65S1IT_=B0vVHG zU$c%)k$j#t_M`3KBZuah?0o(0Rmt(b{F^oBhVAd0YdvZg#vHpjc%0Ky{{o*dn_LR& zKk7d+4JYpu>~BkcTY#NrjRW5PEH{4DdL+YK=$%-RA+v#dH(E?*+{C3#)F8mue>eLGp0)7aLzSMyybqlZ!J${W8t* zmRjJQij)^^jaEHIXOZ-xg4iqAE1HJ}N_=t!u}bKuSioSRT$7|I4F?gczdysfetT_4 z{_GjLWzLl%w0E?<)Rg@RR^EB z81>k<(_VVqk0Gla=e>UsOol$>1^S5^7CKC|ZWnMH&D$GP5ZttIkQwOptmQv~7?{|? zRR8Ml&&{Uy*(Qb}7+eUSM+t8OpO=-XVi!@Pr}B4Rb3yb=_yOe&J*Vopjl2(3_rHEn4T#>2(UA1H|FTzQ3j|++)NBHfjja| zy+4!?qg3yFmZ|B}Rp$vP!4z}l!C>AHf0g}$Cp)_N>zyG52Y_-|w#}XB^JmM(&8w}Z zi2Yr@FO`0Ec0zu%x~l16_e&DFXER73p9L`YN?G=^bGG!4X!qbf-)4i2LGdt{tp#x6 zV*&lX8zEFSt`fz$+%{?1X?rmYaV z#f0gGWXPqs52Wpkq!>Hr-eg!mm*CJo;n+f%vZHnuS;*Ua0@4}|_)Xg3IqPnx+gTD* z;hvlIt%y@(vQ>sHUErQ_UZwK4-@Wf3Hcp63f~t6DgOw)mp+kvY4tSJ6tB+5=I$T_@ zGp+A!HO?`giSU^lDWplth+M4>Yv@=4i3#n9{yJ~^o{fkhD=>)D`bLU%a#b?A`)2uK z>1;(Y$P+VE=)gfwCtJ=&NNsKH#6M4(2jUkK{{1RL zz>{_=g^s)Mb@8w`&KEOi`xpve_0)$I zc-I-EQi$qzTBi5xH>UX8c5dy=y~0C<{20QXpVtrYZ@!vO2Op+CJ@3y_Q^}l;TyAn! zFC|ObQTTGBSUhCZRLp#D4m-am0a3mQFj>Opvd9{&oJyfmJr6577=8c5#aVP2u*u^i zCAsk~CLVh@OS9r}ACshifw&82a#YHi7is=IVap1DQNT*C<2tgR9iU-6-N`HNmZfyH z)7IvXcWnXXf|{IzZu1}#pbxF=vb~z$12VJEOp^OKp%{Y2()SzT-2GUt4c9v+JomQa zF}xjPtf$hqnqk1D;LHowQH)W;SWjxeUii@$yl7)|aKWOBswGE-J6{g?V-Ob3Zt| z>WO8uUcz@1d>^|SgDC1y?~=FM7?|YO>Lbin)v%kHKPJ0$V9)KSS4Ef}7J<-QRb%|p zv@?sm-+V9R4TzRmLvFopEemI!MeWPo#AOLhSKVA=gDi}!Ef?yK&%brAG{tg_(p zS943J8H)UsuK4blmm4dt3`d(7YD-prFM-eMGXxfVxmnAXD3ogn8Mf&-5I%)X11;nL z33okv_f@k)wJ_|&_BAhWJ+U%k&E)CPb64u@U0+3zxo0blC>{aZ-)=?ETQ3F>_WXu?ZM+^ z+|d{B!)0wE5g*0ndjYfH`Uac-i9Oe-)kegwlU`ykAS16ujL!{pk$|;DrH^5ta6i&^ zt8=vMw@uXC5}W^e^pdlcV6FPyOZsc`^C+#niAz%Eg`wF;5C3@6&pO;qx71zDB(mmc zOp~Ns>ImHH|Bh)7G}C|OAb6gqF0yqjm@W2%X3&Ou67n^$e&^$(uR0fW*U3Pa4$3s) zp!0jY9^W%RUikQb&(4MSY78$LGD?fC4;_|V$9LJ8gGcY*1z~IfV38SXY#qv-6@xwMa3(^CDq*n3~92sE#zJlf=#z^9F>_k ziU2{fHQV8O&zfJai;8op>I`GS=7&NY7)?D_OJIDXoTJ%@xZGwn8Cre6sR=cqshRGUDpu?+P)P>vGlK#+0h% z?}rF_GsV=R|G0yxym}a%Z7TC%eJJj08rf})ld}?H`AZ{y?U_`eqcw+^@tNg63ggEA zL?zYvd(c7Gq0Sb7iU3TW&;X=d&}?>oFLeCyaOgJDboA!}P)&%K{|G3BhOactL4)fq zhhC#_+IrVqMNVib6}M~N4nW8e)IKG`Z@lxpX&q&}@!M%vnr5$&8`As#H&vC}Sovor z;3^9i!pL|etG)k_Rcdi-<^Mxg@1FHWI!z0l`3=Ojb>dpgT73t1(Vu)X@!AV3qWs$M z)0cdVrH`IG&MI*fOX);mf)37;)keQ|@FMJ3tTy!NPWRsVhvkXBBIh{OWmbdZmW-=( z&2PoXyrY4YG_SR!A(D#G?qntkKBu0fv52Xr?rYF0=}1Fga&Gdq(315ky`*!+!08hE z&&W>jZ6wBun%cPT>^|n+He`orx;*ys73W7-$SHVqF4bRBpeZH5oVGq>OxojSmv8VT z=z60sX!fm2;}bIZVfZ9XWJRoGu-Ljax3kKNvJV=2*?CF3v6_2$7CvyJTCMpe6ejsL zM45@5g7}@gYc_<>tNP-Z#Y*L3s5d+0R+&e8#qLkn+;(nt~UM=mfx z9Se`f#8n z%d@Vw)a_ujOwFa&YK=8qv#yn4U3ilvC05Glj=ypSyvJloKX*h=t5nxNYQLlXidine zEe2ltZkNiE)YURYTT0B$@(g=rd&Yq2vbto7XjGO!9W9 zZ|S?ViFBo3vLy4r=ytirivFnvjx*u5;=f>8>p5E(5e8HaQSNA041ugyfl&AJ{ZCb1 zLHV<#{a2w#2RPxSXmAQ8z z+n%tzQ}m}Ja3&nv~BQJzQ^9xgA>B zrXQM>;MDF_gCN{hWjfJ8M1zgKfBru+ynh}9!DIp-NBE5|O%~Q4kxI@GHj3;?F6F;D z6dI1*+Mv%sj0_NLd~%=GJwdCnrwg!ka#%!AXJ z`sa8P2lDM8z14Xt?jO!^IN`VhCB(x%l0rhgR8poV2kB^9tu6AMZ!_-rP^KN^5AGd~ zzHJ1)*D^xNI*o}J(*1KY72f%xV7;cjXof4REw)fqFG%Jv)s#PLGMo`#4x|h7dKYtr zUdSeba$j#^igBmz>ZBfrci+}g7jpUkq5jmOu_nhX@N7R)@pNS4?*3;}TKIDI&+Jh^ z#_QI5?0c60;>x)PywvxNy~b9w;y5HAFVI=Tt$vn==#!K)Xwr{>^W}cY=BU`)->z3U z7lJP#R2D=6#N@=3qD;Fqe?5l=npi=BlD-GzG3eXBtZVgx9^*J7Xw)DU)m&9V*KShifGnkZY(kTInf(z+au}tO<#2`tsrr= zu-EN%ZGac|b-R(n+_c^&&>iol`njdE*cY`#vZGMJEtP@Nzo67kVxXf8#wCAy5GCW_ zW3xKw?DgY$tL_jrgKEu-WMImJi)xgxcZ4hfZ}u9PuLik)rUjdg=&$AC`5sp*f0|F+7YFr!r`)ENe)nD4=`lBLYpMY@0$IGo^qFkKSp8m}*W|_G8(dj=mg`=6@NXq3%|y zU&-Hg#C|t?iS(*T2{+)}4gMKBLAtWGZ}w@uf?V0Vju!c30r><$FC?WrkikXIjns@~v|}yeH6V0VBZOZ7f8!Pii~GqCEr`E+v)W2ju%G_*cMsk zGPnMZ|G^ZeH_~hx8`Xi3T?fsE-9XQzo2wYeMbAH|6u)Zu$v^Zk zkQycO2gMkY-6&fTzk^gLS6U)fugqb(t}`l7+VMOUOw z98#g6q^^nRb=&E4zT{bb@gIAv_sb8D6ReIK4*}5H3xc%0Q8ypaf$=CSjuczuTxI1= zxhFfxri|JKN%b*PmouncTolbQN~z2u*g}B0PXivYJPD{-!)PX-`D)Q{fvu&MWI!=;uH=?=XPFt$${b zKQs*Ku~!-?cjb8BYUD%+WQ?H_e5h?KbMaz%MVyzN&ZD^KkN=fQ_r#pVzlUU7i>c;{ z;X$2sHAxLC6%hjuvKY6e7yM<(h&lcR?!*nW9sS?#Z&`6wt3T=L3C^rbUTlPBs9#vl zz`N_0PRa84iYUp*%G!AVBdDocKThKQH1?=EmC>hYXag8C#`Tlev+_Y&|5>E}@*6V! z170#00y7kZZES4lNFQYu7W!_{{}>icm2y1k>-^#f2!#J=Fo)xYe4^JO?8eeFe3wuH zrg=+IXLVb{T%j0JV<@N7zNgCBwmB7IC>a0LFh?V$yi-lv_on9(+AX>@OVlZ0a!Ws^ zp4awHay^c4T{Ow^ib2q}!l2xs~U5y3IzU^W_Vww%K!cWM7W* z_%v)bdMorehGe6T@+y&Vi4w=Ns9{$q3d3K%!ZUs_$FQuUO{pbDaXwxl!NxLI=W;wJhQ0x-mTyeJtf#99qpy>~{u7 zmeBxCQ#{^8X?DPP|J~V4n_vguZ(nW$HqR90lFX!wN-snoaPZOsp`i@QQ&Ssn3(YjywI8fOsTp1QRBgkclFkPpo7{I?y3eUrt$^i?NXozA`T?EcYby5 z#hRR*j9lLaBjtc65#js~h<6yQTlqDO9k%ytf7$|HaB>s2R{X`tVq|7qlk4vPEBiN? z@9dYsR3#Pny*BiI@X8l9e{m8kHRA2xi+VM{bJnp+akAo<+Vt~MJJ|!CJ0QE%y}6Y{ zEK99YQgMHH+XMfFT=-&G#|gAc6rjL+10s@bPa33idvz_N|KPne7_+b9QSHNY zRXk3vMXN{y?d_G|au9OVx}V}S2pf~u4@l@&34MYtaJyL_3m9*Q2P33#!ts5%g?KL5 zv-u6-1}(u(lH^vbliE-JjLT|FB7&j6E;c>()rxQQ3m^I$s%kd?^|raBwU1mlQhT8` zCapm0BMf^}TS#tL_Ke3P7&AqVsZ#9PY8MZ>OzRY5%{^v=lOlJu^%%UPVMZiQuv5tS zm#TaFhTkCBjpuTv-B3j{+^SwR`%>^U>^d!pd1GOYkhzgNl)Ul6l?GN!@eX70I{lI! zwDjZQBXGF5%^MfA@rh!6X6H)vF0Hp7x#lz2AmHr_!!DzLy?c{?8&Z4gd0eAks2~l# zAC-UmR4h@eVxdfLuTt~b+O6{;&3eArn4;&c(~uYJGD=$*rk(fQowGyrYwu-dLmB@S zkZV~nI)=4j@q!mrXXIl5qd5- z3H&%pJoq*&xgo(9YgiE52HB+?&qm|D)*18r&j{&3Xz>#8#p7a5a8_}H)31!@EG{A>U$wjQ zj?UJ3ufN~cU>xS5Ibi)QH-z;Z7>MuXIA$+i{@r{^#IeME5J?g(c#7l2BC;K+Y{SW* zJ87(Y?V+Q|d$gH+UH=GIe&SO74~u}x*T*TBNQ9YS``fXxu@9df zvCDaX7{z}C=RjErPR;#*#vOUKyOSVn+J)7Chr8C3>q!EoN;N+GM?(>%);pgRj{^Nw zN{g&YRc&Ku^i^h`G3zw31lRHr)S$|N?!(hqNyf$4JyX-C2Ogpdq6So}FN~rn+gUZ} z@0$6SJB3yY#5S0{f`m-%H8X$Xy{L+dY0>;On?M|S2t0X3K+<*^2M%en8$fSQ1ur4jKs_k>zT;v^e z+8c@TbKFeo$7kcP+#HIqfq6{n>MXo!VCa1*zGQ6Hs6afG`KSGLf69ENi zMIaQaefu|NcvFVhx%k+vVGqy7j8pS9u_M9r>d6~{d@ZxnbC=bqE+towTGPVwH!Qhj zL{#0sMB~*4xlg{8AZ=l}DHANS5EM_uf~Icg7FSef(ZWH$dFfWo{h~B>+mEG@b+_ur zYNV^vXfVTLI-vF(!fcb-%Zn_n#eOck^u31N(c~&c!qf`ol|YD$N}qj`ry5XWeDgG( z_fgky)TC#6D%ROgMH6Y*hh40%Qe?o+<)3A^{}+nk$!dg&JdklNme1C>Y5GK!KIa1% z?d^&X1LI$lqyc6J0AuLrdRvSI!-f9dsMt#UA0~N9tQ>vY>hcbI%4ciJj${PZLCDjR2XHlL`_UB1$(6o+2&5*ln{V8?0UFKsX#@{% zHt1GE`j&PvnzrY~Ia02OGZ*pQZu1UU+P5o4o%Xt1-}C;o`+OU^zdnQuQ}JA#pcUXT zYaMksllN}v_zIwNKpfoPmD5*E&Ygo!P?qz}jPB!iB`7PfvZsM+19d$Dw}|iM;uwAQ z846&L7~lx>-*)k5+0C6(xU-`hnKQXMMVM}en{({Pw9 zD)E-LRvo;4*{vTetGWxpqqnvM-uH29_LvP!8@~8yu;|QJ9^<_qyf*7yjLMiwoNafS z^{gtUrt0qeWpqQ@5gUDMA$2`p5CPThMnf{EP=qJPQ)9B>Gx^q{yq^7Oi@XkFy;F$OyQtSVJlLe=oJMDJqX`&(t zsz0cton#4@+)0nqs}M#EA9dP!l6Ti<-tIQn?>e$cF4tFREGXaE6d9#|w3N=Ku_=dAa$Nw)tpIJ>4^N5ysSg#x7xp*JB8DKlX1tbMahr^-ZR`^NNz+J2>sE8<@TTX z@3+na{-S=6UjwX`jfc4c=-y~CWEz1Lhz7^BWUkD%)m39F`Wz89mNlh z;x#vxDG2o*`|0l4Ng~yQaQ285cZ)@QAjwt)uI5I2=x>4>5Iv1pVZ9G15b&-L|n(!=Uy^Nr-=vC6J>It~E*Vw(c(*xUV z3GC8dlvcOdzOZw#?@hIPLWm82TH`Zad#*Y%=un?X&}*L=Q6tFW%?A^ZcRLrFsqMK| z+L>7Epu+^cm~3;SPE^zdrE(w0aw94SiUs`h{qe#v`nzHpZx|(x8n4LlXIli4;GRZ0 zVX3bQt(qtKD{$5N^F9iV@ESL_zq2spdf@8F>WC3J8xWPG0JU^oh1H~nXNi{w16Joz z=mFaHhM%hUs_4|eGe;)gN6dli5RNl7ac zX$s9~BJlrodnh-6ht5dW{QJAb!`dvOGwr0hPZR>@H0_o0UDN-DyKk^KgbmqLj4p&t z)&OVQ+<>s;)>IEhWJzud{GkgP7r+MC##K@0IIlo0nW>;S>#|Dp0;cCi9o{fmajy2B z8z+Pw5eSx7SGrks?1|2KTUd%2Khvc+{%34Ae>az{ayE7s$N7Y79ad(6<6}#e+#{F| zVS&>gL{3l9;(b`e_oDR@Bq{z`oo`RlXZBgAINTRR4aMWE+RGf>_7c!7vm|Gbc1vIYCe+dzthjZY)whKv`^#lU}GM8A2`O=M!p=qqAT5j15LfWmV0MXWSJT-EPB_1PSCt zqb}V-2%DV0+p{KoR|X&i6eqiwpB6u21Sg$s7r5`j3^JYZYE&>6NVMZ#FLH5vbhfy%+=>rK_#K&_1Y`yz-~2KHqwAVNh3Z&yVLj!6Ht+@ZZ_S zrRC!<(|KF(#-CXY!T`>I?2FgD}(c=t#Yn zj)*&*iy8yJ$)Y%E!X;H8$Hc?65dyzA!bsxJ@}e)W305$R7YDEQ2@l8|HT!EGKnLM8 zp6;Kc%sD5Q^{;^hrFihS?0NA!6OISr6e&4t#k4IhRARF16!Tv`Mci+m))?nRQK?wI z&U;R2OKMk|kGfg+dW1#o_l_t0L!&471BIvzMEdAUHu|)6V zn_HL6=~BBo)ILw}{BzcmCHy$X4?9*Q92K6dNHe;M9%%+or3=14v-Z;FB zuhz1kWDrU~_o$+bRXO05VRnmTpm#B)A|kb4PoMZVo7S2E$VbX$d{#82${#nd4|`^I zwZn))`IH(hs7htljtUPcsjoE+pT{G5R9wDW-BI%01?0|q>Atp~lpcLzM?;DYyDS5Q z7@g!FPoVq9B&i&Kb^pnla&jJX18Do#XbOg&0p~J6s#fV5My^!yzpA}lp(6liYpA@) zXRyfR_k?>~d3$4wH3^8c)31$@|Mrm%?7h>`Joiz*`ndYmSuF4N zNBNLR<)1t}f$t6XF0F!7R|~vjP1F#QyCkb-IGf4UoWGqA)(r0#I_ysYlg8dE{Ag7! zzqhqWg1I{=8#~bU^f*c|B$Buj3bN|`tGul-km?$oE#-j4aQkXqL|4eL&f9B}vgGDuz000QVxwbwtu-Cch(>Xd4=S zg#^ja-#n$u;#G|a?(b<@xD;=I)v2r~v-A??3I8vyt~(IQ|Bn|k5<*4Rky(TyWJ^&Q zm&(YN?CiY>DZ7Zu3Pss_ugHjuth3JEoORYY$M16`=llEbJf7!yf8Oi$9-r|@77lK4 zUnqE|X^7qz*4gv(_!zFt?OuJioA+17&z)Dk?TjVWyB@ER#dAs>LkL#}qfD_Zo>}WP z)&s4_(YI}@HCV4nHghVRjD*D`M=i#RWMMwXrK;vq2(X%e(t83XGNKkIDJN5x9qLPe zbiG)gLY|1eWHh!;|9gzK>#J(TH$Bkof z%FJ8{3UA@J#MaXvJFiPc5A$2X{erw-oNcqa^VU4kY@A>)jy-v_t3goxc#Mdl1hm+0UxrnL_4Hb@ucA9@i=yms8kkEeLA;jmP zwCE5_Rm3$^T$t13lTKoSsW=zt=f&~V4;saJeV{)4+IiJ8pEx-ao;GyqH8nnlm|BT{ zfwSH$oV-DHUC(|Epss?PK=nAM7gQAU{&WY5n9q7-aG%e-WKlCdF$^OL;u3X{)xzlM75eUIIVgwLzcN_pS+ z#JCbD|IXhL1qUZ3eA9bF(O$zosoN3uZc-#sL>Z%zA|833P!~VGPH29${BwSpgxB0BMV=aDTXE4 zFrH>e3~+Z!p4Eyv2na6BC9QVENfkDAJQ?DD^>) ziemEm%(UT^bKR(s9Y4Kh7ytA-gU`LbYO(Y(1X@Nvgq8Q^TZu5;fQU(R$r4U~qG)}Z zVOe0&KPWMr6*cMlWL;R?>1J?nK@9~Iou7wHGD$sC9eC=Dc76H!+#1Um{TcbK;? zI~%eok$4{|KXK7@4W+<@Lop+dbz^d89CDik9Quq zxZiC%Y|VSF29aOxHOWJYz#`65c_X_|QB?`sR{3Naj$zhNVvrZq4H zUKi4I8cCX<7jx|P%}kb_ZfBg2_jp#j?s|X5Rh;JQ$b}(62vX(&$3u|%h&7B`q(dBCR z6{}}xK`+(d$mz52&hj3^VyZ?v;+==xnX$9qDp2;k7oLWGIA<(u#(9Uhxs&eT`)DT9g7K|?*q_}Y{lRfYOyYb>ZgC~BNte|EoZP!{p(iTg5TDrWzyRGoR=Y#&>$ z@!ox}S31`d+fU5>YUW6E==vq6YfpcJdoj%9!Q~&f#PzhGp4nH=J)pqABpmo{e2a5YtlG#9KZxLrM=SPeJ-kF$@02=l_$k zMAW{f#BS#lVorP8j@`}~0C1t@6+ZB>&PbI%XfvllrSDA8@uSlL$1J6$pH zeppQN6!Mna%6XXOHCu3bCgv5Ub*swm^sBXnc~vUt7k z>(hcSG|2%`pJ;!~xl3xOAq)F)rAH!|H51X)|B&G#G>(6LjeU8Dr<_vj&Q-qQ!I6Q< zhR^4_7Au}p5x-2f%!ssI1|Nf%-?gUxZAWX%ZDH{vZ?>dGDQhGuQ}3+#Ke|zl1o@qdD6e?a}d}M++&JwM7+P zf3Vv~4Zh>aKubG%|Na5UP_7#B@3}sPc#9fygt~k@t6$RX_Uk@0$3!aA`eg=F;{4Y@ zC(e$a8yZu0Un~+WT(#x0X3CffB3GMab4se*c7b2svaP!L<~qKEPPxOLEyKq8_axuV z71BCVx+GI=}_5jAsd+aD^D=n zGI#p3Ke=YnbMHMydcpyQa}A=}^LLx>G|3<67UeVX5opXYEU0mG|2CjkO-0Jj7I>$A zm=V~phAS$G-Pl|U+4Oggb7o+8?746IjBp0U=fhK5^g*lI>?u0YLSPoZsbk{t^Zjpn zJ4_rK0&ygi`bp|vgL`r=ZV>8mDmFcF_Ya>bS)r-#Cb4-?)Sk0f^^Twml?B%+x+rS6w&YTs&uu zxingORi{L8#dr!30 z>wxX5%;LqD9#7|e>`v3}eelTF8+dX(jFxbU2<`ark}Gv&BxsT{EszxHU|=zvNmW8Q$i$*_9}ePo3HeZ_=Ag`KY&xVoSu| zi8Fu9dB8g|-DN1Bw{uLxY_73HJ*x$|HU zd}eHS(z}4RbL0A*jSQL>b-fhL4NNgy#WbZw417LcpY%#*;;DsJ)yzpz znJDqHy%y-Gck^#S!_r|Fd&cWt>ps5*&J5m&DRm7SI+L_`*KkC0Am4C+VpKJoKJ(zM zTwIM&qj@WnmTf=n&`TjdIo05V@{}3Xq7lo1ZoS9CKhqvZ(O=&yyx}zx^rTEVfqqi? zgQ1e&Ro+#@-Zb=Dor{zq*_d^-iL$KIt&y@zgN@at7pm=hG^P0EV_9jg*)LUI@z40| z!7(4YK;-S!@8$aa3$KSVqumLIy<|-^ICZYX?YpFxZbP)hei7#M*wcoQ$)}jId5u%^ zB%!6GgW6T>?x8e4{=U zONLgqw=RE9d?ZOc_7nBV+;Og{SMg^3?W{`-4rH3AqJnw6A@ZCF=wyladI<)?Il6wg>(-u5 zvmgs-%*{Nz`INXlsyMeq_O)Jv!!`+tE;9$IIoXjU8paoE!*}u;g!rObUu#-C(-N$` zIpLC~%uH_biqh~#8>+xzqUVY-9p<#Nr2$6Y?IJR@Ow{s3unI*5OFJQwdQEF!rkk%M zx|kuWaOP_)(PO+)!vZ#&CWvB&@ruv4b3g945?Sr<$b$(P1y8dbOyieO|CPm*p6bAz zh`0HeebqFN zUJ28RNG8q#3o*!fvb3LT zvnpEhPTJal@2LL%$;3H8N&HJ>NpNPjaTx{FHo&$O)KU)(S_!=L@@zJdI=7h3TA{AY}eW2<+q)HrIS;hweD zzKoAwGUD??i^(4j?D_@0DZZ$yg#5+J6Wx4Koiz5^XqL9ATef+$A<2}@H>wf@n1VLJ z|L$R`Pj8TWyUyyIO&P>vS>rYF^sk5L3@P;qSH3uk)?lBBCPmvq7ii$gM4||x5j*+h zCutJbioAXwyndMeHB}z^?a@jD$=a zh_!$kb^e^Jr2*)IiRjm+#KxY34TKHXVs-Y<$AhJsIznfIsjMqw6Ks}6e2GvajQixT zIG?rA#5y%cVOydKpNsGlvUR*A4RpU{t}pI>H1nb7Hc>1bNKX;V(jJ>Jy%Op1Od__% z`JQ*08xoukpnN~_1Y^~g-afteCdJ9@X0600JfmRuJnc6bCoU;mD^ck|>(Y1S+xfC) zjLi71;|bsUQWTM&@QH(yr&p_N;I{h5t==~)R2QqJ1mmo}D@Y}DCwo2f4061(?-kxZ zmdDrXdburS6?Ims$(K<@rI^Z+`h(b&tHe?&=G+q~fy$f0)4!|71veCaWup69wO#X- z-x7Q`Xm_e{IZkq>co#1NRFzr<(OR6MybB``7Q0a+VMDM=(z5C%R`-L!J6^h~8gR^Un z5*A2%2{*=HK_8nQ%NPzgW<)!BJoSugaALHmQ70R5sQzj<$e(yiC4CdUqQ1A{5kcX> z^`CVoW98JK%z=3lI_!Fb3_){;S&!&!2JV)zAH+XMNxSKjYPL6#)>BA6^&g~E-HWv2 z5B)brTF&!lUc}4cm%4r9r2+->-Tmphw}o>7?_}5SVII<~;yWjZe})tx&O8{>rsw58 z#oL9?9r*>u=dU&65wG@&^W;*1+nJ$C&S!mhMRI$Q?SyoFl*D8`O5Fw+fiMSW8M@}| z=*_jfW)INN;PJh4|~qodGF2>sGBm~opT;QvADri( zc5QLFnOUgxP1>XSerWBW@~-??e|AM_0}s>HxJoGHSqin1u41RaBxzrC3+QQEL9YdS zMy!O^2)MCA+^%%Ro20@QQ`BK+tVKp$+(;KQD*`x*K05j=_t0hBmv<_;;-n%ce_Ksh zu9bhm&zq+Bo+RA0@cLy^w=ZUDO{lKOCuRd-Ls>?tMbQYFmw9~}s`<-m7YV0X!_>*c zLhJ%+@NaPYrDmOA=Js^1((H&`c0v~QrS%!`ir_py8p$K-8HvCx2KKthvN9`~?UWt4c zlJIkVi1eJ^d}*ZDI+Jyjxnp@NOXfmfpBsmj#`?N2bRKf0+|uZea#nD&Usxl?!j zKb;9}E$n2YNKq69hi#5iwF2KsxqIc`nTcwc1{+fBmB%3@g z`b_w>lXl+86q{mZ?}BWS+Jw%?YTlV#>yLYRb0?G|whKBW1^cxauEHP)&XIY%*eV3J zq(rYU4(Oa@zx+w|a;yf=NjT}s#HZzz_3YA*228J;91@6UNmY2B6ng0J70Jkd$&%aV zzU&)r=kZwL)f?m*q=J4$Pr6d*W|Y=h&E@A=-ouc9Zu>dT2}cYM#n)NKxKS3dZyy#K zYc3xA^l%W7(P13i|0H>r+OjQsx}-6?%d(s%Rpw#teuhU8Yx@N>jg-`Pnx?>%gp6U^ zJXa$ncpe!G_^{d)aFWbyPxk9aCtsN{i$1&I-7vh~x=&vc?cDdI)DWXSZ+6QymPEv~ zk&oN`dWCZn{%z*qEmOXb@ZsjT(Fe531iCL)NpG%x`~@jLZ~eA+(`IM2nX*rxs4~wl@hj<+l*#`t4=%yDyGw2{-ik>5cb*ahfPT z67c#q(qa@n``PiawDG?FrLUQ48kVTI-7i+t1h0@K@7mvZR}sfhvyU9+(2#6=-UWl~*m z0e^#PEBl#@cdw|CK^VAmWv1Rx$8-VFfOOc*4TpB9nz!}+z$Fm`<7O=?r1ZSr_s`R1 zZ8PD>%h4q7;_Q3O)DLzfc`LumwnIcH&QYJ>x}mVW^?~e_@$|Y&`_lFQ_iO5&i z-T3!t1NOKA;?ySy0|wW@^3zDLp>OTSfJ}|EisV}pF@DDd`e?;VA8D2EMiQu6j~C~A zC%FB*!bI^%|4vF==NpK4a;0)zId?1(awCw7*8xd|;2^MiAU)75PH~&4_kr_g8Ybh2 zuz~z5znau$ew>vt8a77eo#rpUYlf6@CjZ&A8@nUpb7{?0;9c-bZz_X_21uFy*Hl+l zQGqF<(e>L`?W%KN-fIr0S{u54HlgD>61PJq!QLyyR1?GQ3so*n8c=5CpYl@H92bM> z28$7A1|f!i&$0d^*`AJt}h?^58!5&Gp; zlNKy{H{Rk&eYBGV#oW%CjAXrk#eb@Kn>OseTnovQZg43ui>d^$LH^Yy?iL$Of{hn` z`_Aa%YRBoV<)am%>XoPiv6$PNPi5UtHbmQZ{yaslbuu^;KALBIkF+mgNi^R}zh70i z%Z4qmPpP-Y0Y5@}{4&iHq3aVVqAiM<1cqm0!qb({h}7wjXV#U52bbhE-}FCi7(Bra zE$5ASJh*4PQB_(RAy$=Z%~%pG;H!4S-8KY&=y`e-T&VTI1$V}MvjcI8z}^P_tipX?0CTt!*fkr9uLeX4SsK0pWA$~=^$_#bpoIGZr*xNYWuBF z2!z;8Mjb-A2{vI)&wnv=Qp1ltC*XU1C}T1ypGqTYDNIyGdO_9R2oYIWvkSnz=P=8ci($*;tViL*jKFuCvdaS?i{Q2!R6M|b5} zPrB@Dg-cj_RWZ4hOcTy)QM811QS>>ddciCX(%_!k@RABwWa{u;XOkUh`0V&KMBv4~ zt-c)V^pR%Rmc3?Us4%HAXT3*QpXtj*u3sTF9#1viWKJhHr9^jF$A&>YlfTdAwb&(y zaV4?~Yo<)Hx;~(4>~}gNqKKS;v!b5N5`q&djI0=WmlajCg&|eq5z=d}%_AExXBwq~ z)Rw6`2UE1rJ5Nj_J0#?TEa1$i5OP&Xh6(;0;z{CsX|{s}_j#ZaU`EvIt?Mmi822M@ zg&=YJ<#M|9ijuD;Ka@KP>}%6!or#p*|H*jY zk#{ybW`NM>aj}T*bfo!%V$2ot;VMzNthW`M`&)E;rH|0#qL3iNGPXn!BAyfB-6HMU z7JJ#qBshM)aTWWhvs%+@T5IqDO>6irwe^8_-C&hRf_|Tm!U9W>8o8(x#$Er@lHdUU z$k(}@8AtYW3{t@v(=^Q!oqP?4xr+nj(?6l7idqf!WdcrMs0sK-&YIk0X7ant`i%g#i5G}%=ItjlnYFLG@$?mLEu^{WYiw{0x?YvaI?d`eF zF2Y-x+a}7tFp2()wW06}$BJbN?B_*x;Xn z!0YtRi5=#|j({Q@4V!cV7uJn$VP}xIop!#hcl0yp@0WU2X(L|@y#06XNkr{8%CYjz z9yx#1@m59%@$(`t#_3w2V*|l%PVQy~Tq_$gDD#s3>2uWiAKTh<*GKpk#aiwgT#9p7 zpT#%p51->c4?>S!uVt@w%m@y6ha0mr9_M{5pRb(~&2UTU{|u8BYW;;)$mPe^9r%INx!~`0l^65TxF^Wnb( zo;4GpcnQS(aF5iEU`dY5nI01%n?CV#M_CeB4xy;?aa&ZQ9xHdeah>ism)gu&iZuOq zUjE-&L5;hh(|wh|5#9r6JJQ>3#r%`~SU&YwXlINk!3QavOT-cWmF%WqW9$6Ax~a)N~6Hn1SS)!*;`4H#I8z9F7gmY(qPg?gM>{&{3c2GB&DM2NlzmbA#< zvUGF`ZLR7hV6{12rulrwXxb7KmnZoz!h-1y<#40-&5#B(Gx&p+@NpsmXB7dOITR{e zQO8E&L%_?2Z9cj-Eo%$R`gzO-#kAv;G&YA-=kGUNEXUrXaOf#Tak@)_xa$m|Ctz9f zviIb1!;{9NKMOpiTt=Pt#eZnt9h1gZInqAry>URsy>E$8QhCZryF$zA?Gj-u`dHsDmyO}cF80@vvsc%0RPgQBRhL}#NU;m5B6!((`Z z-S%_o7no86jDGq3Ob^E>K9*5NxeuOf|2&r27s;91OUABUlW?GM9S=uT+Xzp)M0fhP z(dg0RcgGeefpFb6oAdr7ayFYyEDU7`r^?S$0@|nLL|Jg}ZzEonn`?U@aQ4`{%?=rT zmms&qfV&4@1g*8=C{kWRJ@7deHa^tD{TbH8&qg#~E_K$9Wg`TkX zueM@s-^U537In6N;U!hJUWduv+_CaD8!O$M*1H9XM~}1F+`z__D!RgcQk=>_bG&pA z3q-w4qgC!rM5rw}`C}R_J&V=otz3a)n$y1dkI`7srDFnkejj*?lC1zOj`xUKUxH%I z8m9LgZ8&fE8^N)$OvuOMqAU<{tBCopqaZLQiUlH=>&AdHZkQrWhd|_FCkofL;#}+! zFx<8ef1|-+OgM8W+G}#blDIdG?NR}fyI~UU$~a$)`C~$@%`a~rouh^wWUV9i5Z&yd zSA0u+kSQ(VAoFA5x`f4{*JlX2kIjiFC?BRKQ`7*yZQfjxRsgCs~y3rYu zM=}qIW;0$~I4&^_07IH|!$&CwP=|;kHm*S9@sX@YF!Sd}KVpX&V&ba+*e%o0xQ8rmfB8fk z)?UDw8?&z~;ImyInGiSTh}wB<$aWKzFy=Tu67X9BFqk7h^AU#p)28V6{P!kb1$m%Q zy>b@AI@}{RZx0n3$>7Ct2dDg)mmp1uG5-4g7%)fpU}@g($36WARnnl?kg`v!bN3}s z>wmF)NePf#2@N~8TSOY~Wv!ZUlnuuGll@V4h)uR`025MYO*wg-%Tw4C-pyC%ndv_+ z{u-}u05+!FdH_=bD@DP1N+#Y%vgZ}U#_Iw32o%mEYRwMA7}T)x!zmmAZ8dDX?t5c6 zg5$|Xf&?4J5*!9B{zJ1=8%uJUE~hPj+Rr04$(R}UZ;{hjn&(0sjwSuDguiUMA=2nh z9s>#)tOXH6LXQRvEJcU|dw9yE)wN@B{SVkOVQDgTX8VzVq=-D_m*i1s)@H|A?Uhgt z^f8(=@`qSkdd>J5Zg{1q0nMt@Db13{#<9r)Xm0MFHG&==$=$JaD&Ukc&P(k#>;V>K zyUfSoB1)JtP$z`(GUL%OB5I4+4uP+AzCrnz$bVyjPcX{iHqNNnazQ24mqYImz;fJ; z!EbUl;GN_IE~;&y)>dVFvK9P~=vX=xz`a(vExm(HJ!c5IzsYGE?mW6oEjdo@VHTwZeh4V;x}?G?P9X)9N?7^d`Oc1jARnf+?5{b10!&Cm=F-*yh{2+7-M>4h)RhI^p$ibPtEEZ-E8Vl4Y97 z<7f;X&Ey1p^a)g4xBy&1^NfJl5uVxv5XY^Dc3OL*hn!cuwkvc76L(%Gmbxz)LMqT3 z(1Q)QiT9RC1w|hQ+do+5^qSz*cF$SI{^1Ocbor%3A--C>9KYf*yUe)aBJYxWhRhl6 z2wS$7oV9n-TRo+hi;jY#&OL@s`B6xgqT!<$I2=8)T@4SE+8d9LcI+lPnYdM$hDg}1 zoGqhB#|(F1hL<7x;}DMh2eus&+y12;ZhZw#;of_bD)C>6yqE10E6|l4=*nTCr|A^! zp6i_6>&mbVsP}F+cdE5ZJ-t(j^=P}-j8pYEeYL^%`zCQ?SlD-%HwG3+n}A8&`#!wsQ7Faa)oyK~Yof_2Xi^Y?zE^`4x|D=TtjWWvU0ILr$HTV}${$*ZUD^7nJ=p<2?d9=jkc^kN}X-GR#^ z>(M1k`wKby=@xdAjiGR1Z=~?b#(17nH_^7&IE@#JcrC0rDbsq!{ilNNbywO|C2P0t zWm(AX*`D%;qo;TFW~IEhmrSH8y7IR4HdXb`Gl}@uJxqmqOi(-T@+VaLJ}8N)S~3#z z%oyuZf&}gLKrub5(g}=y*63pESn-Io$&J>Uz19k;1EkbSxq6@8{^SGOLWf#)hpmYla35mpbI_04TvWptF#LPvA#P)^ z-E+)r1KDW$1(zR6@KY zLtvI?1QgK=wRWFZ(EA9M*<_9GX2Dku_E(5{v4%c=G9SA889L~>kph9w$4&xF2=^EA z42HMr?XSZDZp6d)kw7%djydi+F7)wgBd)XY6;N~`l=R?RRW&2IbxC(g!Cbv%xXTaL z{HiLMTce^oU*#pPl$dFI-aQ+;HCs`Gu5kWHFJvL*76CPs94CPi8}CLW>=s+&c{B9Ev8z0)g0*YWMuY4>0RZ{S=r5ANpJi}v3~iY)nTx* zsm8|csmHJ!?TY0(`hqg2>A_8p4#ACoS$rUM>GGl)dvg&tEPHQcbJdnq+;_(wTl=f^fR7D!?1Xgmdrk^_8Pc9? zLqQJKAkN-9f!-Qbc`HuunR*p@OiB*UxvEgw>o$ScwWs-RGX9a8QoACEp!KROC0K5>DXWDSl;lx4X@r% zsBze4*IQ>VgG;{e1D{yF4}8nJ0R0o7O=gZYtH+E$;)hmNG}9y68f5&+FlI0Zqsg_v z2d$a8k@Jn|q5sIx$W}3Y1v9b|ki4aH(Pe0uwsKZtWdJk5xBryC*G1H;m~Yqkwr2s$ zNS`ynM9?C3uW?SJuzFg6xdW&1UZYv5UTUpA)4&LsYUL`GJ&bI#a@eS=?1&lE`r|A> z+OtlBNrs1#>kqDV)GN6nn62Y1=C#tYqO&dP+xhAcwRr#J$fR?0vbd1?r{c-PMnpBd z3f=_}NyL-*Oy(?D%tJ&Wan@*1f8-Ts{ zn!GE~y?Pi`I9y`cHk{OYn)DQ^N%H*+{6VrC9sXL)1b6k*?crHT^^AI<{6xca>(d?$ z+`4Z@UHYqKD6WNVGLKs5p$Fkjl3RIWTQ@sg+m|zHb~7k1DYV^##PtLUJEHdh;=qxK z2YbU-=-?K5VXLL;NwI1}Y!Kmi4CdS-k`A+CUnDCwxkxMbiq|r^?246Ow$5lFx-(Gn zG2<)k3N;ap!<5?Bp3?>n%R2quLj6ES(x`q#2UV5Pj(_AT_y3dy4--F-;<7)iFZf`S zSCn?P=T(qkZ9Vciag>SyyM0Ou#OPtqs&U-@!6|9`2E*`ZdS^YR#v_fQ zV}2`s6ct~A74CqrQ`j1F;?_YR@V)Wtm1Z4w&1CsVBJWkAijwNhtR(Y|v6SkYYkd0? zd@n}+#4ZKh^|!elL?}GM{UhTAjrl*uD_YY2a0dX1lXgWk5vtTl0``b1{xF}Dj`?H4 zwAnfsBGgWm#R1W5sS_gMVgJA8!YnBAHy6vC{ZAgr@9z(CY=44W&gBLpw%K(vd+Dew ztLu`Pbf*!Usu;lGo^3FXw&j5iFQYKNr&c3%!m9sj?wCNrTFBm()LcK&@Wu=w z*f=)W1`fRf4sX5v%S2M3Vh1E7`R=fak)m!QLPvKHF&LSOyDM{_ptoddDZ9N7w!KF& zTh<3#e-bX6FBCl03#vJTAnDSviT{F_eUz{s1rOHSn;15B9=w)oz2m+DzKH4Gsx?B@ z1KG+A4AAK7TRxZu0eCshdpAwC7lfZG_cjaNNJvB>1`}KYJBAjn@V%kH@l0sUcT~o+n+5+I1ue9?u^|cPegn4 zIl{LGCI>A%`v%<)`fk>&?B0{cqneABezIjzGK~}`xeNY`@F8GhK1p)-lQ`aKREwd+ z1NDc^!VlVv4A`+(u{TJ6O=lHU>duxWdCGs=;Im`j6Hdhs*V%c6gPJEAISzzIJ&=?y zZj#r(9$##A+|-#(aJMQ&wu?>fE@b2|2@O3j*sXS=u`|%j zu#bLX{2_O7`P8GAwcvcqeu;7&}?P=eR)yv?s`O+DMxH~8O4gnvV`kkmgC0vrOWSYne(^lRU^Z0z+SN;m#TMgNC*=N`Q0;qaTBnNhwS(DN6(2?` zs#);X-H(eppE$~>CR!De!+L0Qe@Qq%rCId0mpC>)oJMgtAT@9Pvseyh-*nMie&vjT zR4v|fNr5lbbzRwu+rz|`Y42!d3Z6!70UyqtOAc<}zZV*@m|Qk2gQqgl z!kxnaJplJIo-Kp}jcs!IB0HqKcR+llG5%2U9k9XWSF z(=@5nGOyu6hBcq&Twp}bwH78szoO~Ac)qHQE{$_7E@Qq#eZlWw!Z&5RAz>0*{i}7P zd_N}pGz>$_b30ynI6CkiI_d8HPdtHd(+6_~vsskCCL!pOtFjS;u%_S-hc>u-U%wxr zrf*(hUXdCLvKML+sY4g;Wq%Nj(bU0BA{^CD$WtEfF3wC|8GWHOWR+y?>lwD5?Fp*DN+2oPwDQ-JpSKCT~=%*l9Oi&~@U zkWsD&&mFzQ6c;a+XaE^e7+jjD@&?4#?$cWqs%ThOZJy4#@A*ym^<3a>8O6&v)>P|x zD?oo|u*f1FQZ1v$d3h?Bc8~L~?aYZC+GVk!iCM+VPl(;NPTDu&u_{AFE8%PchdwFD z&cEcutzW1k3ko8$l2@Y@LY|L7rufI3A6&%x_q%Vor`{ZT@LxCoNCo`+T$|0xgJ$7j zgf-$HMAC}msXF?SBJs*bhe{YKO^gTE0!M8(B!WH5IobwV6P|qFCq}G0^s1@{&|8(VSY2`(2lWetl_=G4eRt-TU4tO+R?3igpwfQvfLVE>>x%$U2-s;1C5Il(1G;YgTcA6s148olWY? z!eI%!T?ajM{2eN;Rxid;O*hAXzWX=YFoI|^m?Y@m#5F}2cp445R6fsV{5*rBk~DE!ioT-4NGKU<}_1o*gIo(AUg%K&WUeR3QQ zGUObt!b!T%_aZq0uvMD@a6eMwpZlO-4_wTtk&KX<_k--|_dknNnz(-OCw_qLRD*{` z+L8iam4gegNjiX~0n%*IF}iNAb*`=8lZ!AjQ49C%Pm@!%`Fohe*~*oIY-jRv6dF{5 z-lA30sGHqJF*?QkgZdIF7f3Nw>)&_#4a3Pg#F2`XgY+Y-FPqJQHpB7S0-4;tGQAGR z@6)u%TFndhe17|!RIIiqHRRnCfy~~Mlpr}wM z4cX}w-(JUlC|wsyEUYdMX14`+fB?3lXbGF=(f$X}oWA)>u(iw-SoD9ac#!o|M2>{A ztaH?@>Ld$0Zk|KTt@WYCMkx*Zz_)7eX*BeGa}mWugqJ3#zo|6GtZ-|Nm?U~8YlM43 zB{m<6%zuttcv_V_IqWS8LMe^eqc3lcMAdL^@*k2Q~BuZ!%(VLD@F(Zqb$b%ML`hHs|{3nPbD1nnRr6q~oXBq9hQFi{H z@bqi{z+z?=!~Ges$DVdPjLY33yUf_&bCs^Yhjt>DtrU8oqb{ptgihBR<0#Zit)kWk z!fkFNorV7sllY=)2|X8J1@+T0dQ40ntKVsLcoD4Wf5Ja&Ya0kSX7(5X=Ll1dsfy`n zt-3EUx^x}i2}cdXB?d*MOf=84Ku&R9AMI7wW3;NlY_0AgJ79}=837kGxtP_oy-?GO zLrAcQ^o@X^E5v(m4T}vSX_u#3=gSTiJO?=n*lMh*mg<(U9?rsJVPaAq>&nd*6+$%Y zKvEm-kA@sYNn;Leaq`|L9<-zQ;#|=`)cce7_-+w%O<9C@cQSs7u%7!keEOd-`Ns&- z7l?J(Gjpo8G+nj^OzJ^Ipt<9YjhgQT%^totOZ_m&%Q1V2%^ev#%D@3lU>E_eUF^A> z%eVs)$)-7vf(}V{4d97JH=Z-r?%v00skRp2Nz!d}kt5A-C(E|9QTHMpv{KLB;UEp6 z(iM(N7fakvS;Cy|ZO)2V!uD+hX%3-mfS@H`uQfXc7Wp545ak5^U~epI`x5wrsWJEE zfBryl=@aV)fw^MFrK7B*@s0Eoa`wTT$^K?t&7)|lcmi)Qi~18~){DQE2S!SJ2^&IW z{d>~?jQfzFzCH=SyZ%)Ap%>g!^jg(3yhm@|Rg#vU^P;{Xb%c}raRe=PT)({-+xLyK zj)X2EP0QT0lFy)DR&_|diYODFAPA|ZBp2vL#eV@J0PZexlVIR=Yi-aMR-l|g3s*k1GEzqh>f@d@jc?QB+4IieON4KgPx1dNKV zTj5A(z9fpkRPcneRdL2Z9f3szg4-tV4$bKg5B%f6!eece1`|(To?4`kx5woKMwFeD zE5w#G?zjAE)da_OJ=;|4glZZYRGt-QJh77br zj1?ovi&pa^0f6`F-=YSIOj2wKx&?5S5N~oMW8XDqVEQf(wm;(3I6?Wx^BgBO87

(ivQ_ef@!qJfRD}m{U(YWStALEP+%b8Wn%*~_Qu$)Pk zflT^ctGj-7YJ|1^$Cej3Io_3)HxaPZH*E30t^_tvpP{8$Zp zx`vaO2-X&730K#To|VR91iJM?e0{+5FBkZWS0SXpsV84l?b4_=t7C-n{f{1D=KRF! zpj>ZsM2y+j>Mwu{T9UdRLxvN8GX&AmbJBQzx3O^~;=P6%?%9(hXSe~S`oZ;-9xawp zE}!A6M?$|M2NV``<5dIB?eMXs5OC;|2<8hoP=K`wm9 z-Tn6+8pgbi!@2^ig}cBuh`tpCwWcF9e>G(N6OE!GmO1LkgrdVl_K!kqe_R4}>eC{V zQS+3D9BZz&yGN3bx}_h%kfi61C|Yf^_7c!`_tky6rn|DmD0!o{F`)76e7cD9R*GgI2^3r2%jD}3 zCH+1CJ!F4b3JF1Nz|!VKf?dmHgL*RIki|+d*FX%Irunu~v);m854tW|dMi#zuDLe(YBFkV$j^2*BzAz4Hy7LQ5~7^@L8b|mr0w6 z*PKGjR%IjUaaW-ZCLKWe?s6hl7fma|=y$_-GZCVUF~uN1$7s@RZKoAm)VMu7SpV&W zfGF6TD`VZ*m1G!a&)C@dIKbytb$a3LhL)s=oTp?@ZE*pYi-53!^5Y!DeWl776xw17 zH*S>%)^q%pN$^y#QEb!968Iw-_&}KfP${GTQ>{i0 z0$tbXcl`;(sP(8z!)I02H(`1?E4TdJmhzg~$6P|*n*punKw#~7lnyo=d!WFSS{N5u zz&cqDWP2^#TbuzbeAwK4o$K=mEkne3E@Qn@mZGiJg=Y~ff05HDNz6R7gLz79%m=>? zta}K|{mBvgV|GX*+VCv08uUx+ncSBsgWC&gPE)FTDpNd#=KnInCcw`gEWxf1Y};jl zYD09`1KD4PAgoPW7(22bASKYaWG|-|HK@EK?Sn2_ZBL(~xOR&`p_8 z>DQ)KZQgEX4fm(;TJ^K7^vg8@{R190fdnDwl}?Qz;aBMGQSXBjk;xm&&NX6#JqlNg z9{*mB9%>hv43U<)G%@8|jf{_OQZ9@akId+?X_AexO@1yQ|q{TZ0 z3B*r+Mx_c@T?XgQHqaQd1;G9D|!N=RR6`-1}BjJoYi$&D;GH?31Y1XgB-k{tI z>H;F6U#>wi#Wg-mq?!Q6&pJf7*zA z^EGlZ-a|S3e^gy}JeBSLFDaC8kdeJdqLXlJ>DVh&$O_pzd#A`b_RJvMfR?{%DRIiG()kIt_N)%Dtpcd%p_Qpx+;09~a&$f)wpaKPTM@ z`t0!pvkpC|ONJ+ba^Hw1C7W5_1YR%rc5zbAc!iO>T+2o`(l@=(C^evRy};PS-FV_3rOs?JbV++{p)pj4^qRooEzm_|aysPiiC)8Nd#= zzn4%L4Ike<&GoTxnD6!SUzr+Lzc3MrqgOFbkOHlRDnCw z&rVV0e&?IVFQJrjQim@_9CQyc-4&gBy1D({qo>d36}sTmv`e8bzd~d#7>(Y+4xAiX zHVxNjqB~JG4eu&Ipt+{LvMJ`j{oL=u z9RLcqS(%ifEI7&^D(F4_Te!tEF~4kLdw^EKm&<+TRuL!c1)+mpsXbVfA81NMsSnBu zJnp;iL?lygM9QwK(W)Sgma7Qxh4-EYk|9H_cDwlS0c6^l9a&LPB0=b zfoxSenk7iX&bWC&P}mz!@Kld5sAUKZu=I5Uz_s{S-C-@4O~FP{3pF&n4b91<#iY;O zI9H{c{#5bGp?%BltAM4R%ohNI02qFvV8|kIR^=Qt5qT3M@JDjf8yRU{zuwdMpuxg? zLcN0^Yj=b3p=c#vcW(Vo%Wvd|c-C+c<{at1Nj(1f(6>(uSfSas`nsx%jPLBQ&1;(H zl{Es8Q+u#%^2Niei79e7M0}zLtf)FAM;!BXssX-Qfh;$NMtfR5Z_NxX(DlgHJvOOE z;{c`f0No$|g1h1MK61yz)$rDi1&$}MY_|5Up`+YLYuUhmE>vsgL3pr<>+?Y`- z$Ap*{?G6_GgZ91kk{;9>KyX>(P*@Z`wg^$Asw}A4Y5#>j%c5SqWZQ8AT}ERN-w!fR zut%FW^p!$QDmA zuNdpPV@b*muy;bfHr)whIAlL}19Tw55ReOoMley!S08OR)e@R$+}4X&jehbM&-&k! zylP~?&%XsaeZ0s+;Vl;>b-;zqc}P&FqlwY81uie-$Pb&Q+jG3DSE5mSpm}XR{U9*# zjsJr&BpC?b;_u?qIGj(~_1v~mH;j6o8cJjg+r&z8u*j@A+r~`0$MNlK$J@<5Bi85(O*{!g5}wSs zQM22i!~mWA%;vK{l@p``v`@j+J7}55B)kV7acTxrJ!b zrO>YW;#4qI)#leVl#{_dx6BA*RfBJ<%@^~+t@GDvdJ27IM(F|Mc!{vE6{`gY@hmT< zhY$t7QNaCjGF!@fqY5Q$V+lNd~XcWr+;Ed<5tYGKSV&|VIj<9oBtdNaPH!R44s1W@wF z8cBsCKV?@L>2)i3mA*PwA7IUWP~4!fcrV9U#W=1Xh+kPi&QOcyiBvP>ksAr^4J_w2 zTeXM5@yoZW62oZF(pg_3K&g(K?oGcq)D+m7k5CE@z&@A>QHVzQj`qoj#RM;vX!EWl zprDX*pS3B#*=_TC-}hH21s!Cjs=mhZWng^e;qs}x%KM<<7_xi2xazONB=qgA)=kSB z-Y$Ip_>z4*0efiKIw+gUcv*2ga2t1F@j?(3(7A=*!aUH%^Kx>#$QbYo)T&Xe^_nFX zb9aCLSO-XuCa@!^Pwx^H^rGO@Occ}FqyUAWalSU4`(Y_ml z=orr%(0q>Ox}0cbCd!VT>=H*G7Y;fOIew z07U%@5D0wkmOowu4TQ*_9U1*+ip>)7W)~EnE3NF}oq!{NBvq{u+^rGbrwNHR_2QJ_ z34FGn8ugGq(klS{zX^(rx&2%H33OkHC%FEA4TrfrTyFws1e$2mOToAOJnP#_iB39G{0?h*6~W!=``3!E!|mXrZK@T99lNYACEZJ!@C4zRgQ@2h zO;yC+WWgaD8S{fTxG8&0R1*d%h%Dcyy-a(;(lV2N07?RXx#pZp?%Xf`w;VWeCSD0| zZFMey&U!m zl;%CX`BMjk7Q{t%(vq7#LmL7-y~((@m0Eu8A!62#my(s@CEe+3(nDzbTUFD}l{`i?BQE(*ze#RmcbAl2&u-QG z7Hv$|;|Oc|#5%*Oq$|4>sF*w;;qp}hqX~^shqF%DH01>eLA66Xhy`ivlomdG{DOvMz1wv}}rteXo4~%?OFS6~6op^uiUq z_=d}a7t4cnGUd0+?UWny#kKtMVhF`aPayiD>%~S$1K3B~tNI@6)qR8*iALGVqeE=* zk=DgwV!#!^~|?Q!B?JJFSHZ} zc7+t?_Zd+sw2qj@L$Bg^b*apqk9XCMb8MkD0+$M10xXo7E%XxF&imzC)rNR8liZiQ z@8hjK`q;Uqlq??U+WQ#Gfl|3_WE+FN9Ib>eg2{J#$CR>qYzOG#lIl3?5$k8RIm4_t zPVGya@QKK`sl@u!p;1(iZT+9cmw!H`prf8V(m@tE7_gsorw!G%Y}Z7fXIs|Lr5_oh zyv)t0z|0+6JAn_jq6=)RGzfEa6?T371B7fB*z80`j=)a`trCY*$Md-lEG$RJzdi8{ zFJH5@efN&sO&-ysh$h!+tRJ0ju!?4k6_@9f-!mvUJG^ZO>&53^*AcyMgZ3B4(lktji?6v%>DulJ|)=t#i@ z`pSmmn^>9&6EERNBU~)BH<1AWsIJY;v9Z+Z0}+tUD-6-)0QK?5(d3x#e?NO z$PqMb$&Mm_#RdB1uT329s1m+SD70nYmeNWs4Xq?m{0ZNpwWj2gDYOa{6CbmYpChBZ zkG%4P_$K9?&0W+?xQKi#WcTy3o=lb$CZ$oHwLIL&V%WRjlSWYR!PuRv*( z)x%2!mjFAA%H3l+xupz4zVNnr#~KM&q~+0xcDvGW_nk_!5rPtl(aKGPWxEoYA zE{ZKTkCiZ<{7)-1>WZjiqfyRONoV;%17u*Tf$FGT-zCPaL#d$U`#T>tW~8HJU{^&V1Xsi|3tgkv=dAs7%t` z=?GIA144@eVqd%lig)ZkG%eCP*}iZdFlH;04Q^DYPC=iroA((LeyWdXeJv5e-n)p% zlODu^xRgXr#BAI={#xYHzb{xODo|w2DoR8eN;XaB${0>RD~!4s7*^Osev58iX}!>L zr68AYJUV;Q{o#wZ{0EZ$gfUxOFBOSOZIm7$Z#q73Bt<@4B=WRxXV&HlLT26bAe-=m z(nP#{P;`Zt=#c1usGQb-a@0omjVMGS0OvvBKqY>*W}MAi^K=ov^G0qzR^35wD4PqR z2YJ!`RJ!gK)FOG5$~~wupXCRI?=*^+raQ!|5hwgaA?d7#Q$KRD*YiYXS}Q}1xehoT zX%0AfAH93JuARj9z^G=Lb&_%GOF6&coM7NTB%I!nIA-nB#c8kXINu1(ZGyAWz#jRAA{7C z?+fuEx4ZLU2fQ~0kdp|aNACpb@AoF9Yhl6%W3+tW69pyR0?LuTpAdE59RkMRTf(j_ zozv=k`bpFM1=~k@kVxu4N0mifq+N!Xb{zSJVfIPkaEuLzy_2CIA3s?u&=qA2@zI#a zRTnL6!wB}76ohpUG8wnT!FZMSXec*VreOzs0%>#4s{3W{No4B!#L5hQxQ5#S=S)$8 zq_9|XVJ5>?8UqgIsb$YuNq3Yu6@nh+U zK`jS&CBWMP-26SIO8JtUf>wZ*(`CNJ0||rl87A4BFo&~>*PsVpfu+S$&HF4ZTEPv- z6F}2^5qy!kYqQBHK(L?6wWL47IM0wuyn&1fS)%W$pFcuyKeGJ5eSucTJJT$Q3+G?c zq(m)q!J1}?<5fKImmtTkE+jkdALf7{o*?G zB}_OyS1&3vk8|4L#4=A?-~=^F1k4L;UdgnLk4@mK3uA*h=g3MwB(e19`<3dc%9I2A zt9V;#gcvN%w_Rq*+e#vzJwjgHvc?pY_i1pW=))EFiHxgd*~Jkq%zG8jGM>yRSQjPP=4`B|`d_CktJ#xKLkAAvwW)xorTk-Dl@OXoz#kpJSPNV6~ zqk$sfnP;Asr6m#9L|P1P5oyG1D<%=pL9O(6ZZT)p=gSzZztB(B8OME0XCOwXJl9Xg z7?l(4#dc*-}TRQs)qb9ha2O+M&|NBw1r;xU^zJARTI}xW<#duLmE*<* zUWcVGf_hbD*>LJ_OFOI0%&cdTNO&k1rd0?fz~t_3KgBx4n$xXol9r*H{)KZ~s{M_y z)*J%q zHkxKqj=XlLuEb`$6k>5E%4FMNBW9P>7sO1I&yjI{b3%qqbTJ1;2QNfy_Y@lwp5Y~E z+rDNbycWEIs3i#f9O;uD)SY1J)yLAj}~9o5Z2@1JIMKtoI?M|p^N8czAN z%9tQXG4`S12ZJ#iAWN2%dU3+~u40mnMoM%w5c`%VwxFN_EPt;42kS+uur2myY8c7f zGg-lPKmqK_F+%Rp3t^VEfiK?EJ<|`oDMiDys+~5#NB$EN$qH%70p__&yyTO?O#M0l zCKt)?-x?ty*qy0Cvc7wh!D@$C2B1Zyv$fsy9QI@kf$;2Gg~1QNQCnSCz3g{TS`w8e z*keS=1;HV_`U}AjES(v2{4wA&6h z^K>4&n^)xxYi1t70I$DICe@wPpAoH3g#;nxv?mM;c+}upqK)+~a@%}UvpH5G>Y8f3 ze}(cYnU*fu3v??1W*@Dt04nZcI}iti(;aPT_aa6V|Pl^mpj%>VsQ}42@^6S@2nOGoEyWv_)4#b{q_L_nIzD z45uH^T|3}CV2((m3_}TgZu{KoMfD)p9U@(MbKepTuJMwG=P)ghg#sXn`89 zsl3lrkPWj$T1Q7CCboQUy$|Uq4clEkPh4fLD!#ic6w;2QE%cqz5drf{#htJyq`7nz z)em|3LG$>aMck>5+PnAqW@#FQQNrmjB65GNzrD^zbNalh%jLr_p#}cH``u(;vcB0B zK$#iev7P%*Z;S_3{#bKPNfxj3JTM)vTAqrSrU-%@!u;Tol%Q1=JjSE{Z0}W)^ev#@ zQ)Kth^deEJ#4W@wJTzqMiiu$UM9fkCd#GT`Q@=>W>z-y+_y|3_P24>5#!|#-JYq}8 zN#^G92c_1`4S|i*N#|>?FH5z{v{jv!hwx;Ni9O7!Jvr;R^#*zl-3xwKfV0F;({p!# zx>U(~a?!$A2o($DrboA{H*WeC*EuChPG0{18W4r90dLj<4aNZ3!r;#Jub$&8?OVIM zUNGlvwI~Ghv+GOE!0;K}w~Y;vDqwSJmq_qtc*gmP{&N0Gtl+OZ+I$kv8Z_|2=(?59 zXps!uiW3rw_BN<6f`*$okFk|=RqiU#_REd+^Tc_mSha`z%m~9-`Z-z#PCJPdm9)ao z8cC*ZZ_JufNERhvNJ|W2A5xA0hW*0^xI=K{P*ALATL3X}>N}@+9-Zt-(Fdk9o^Il|Qz`1}aj4oB7 zIi8J4svqSjdpckorz{d89h%<(b-9#Ynoq`tLS8p+0xlY9xWtW=wiU^=YHJV@tuUzq zJK0|Ao|F^iB~S}*IGb=A_eSCepCHHx;QbX7GDzd@>}4TJxfL#0G3`@%<=7pO@Brpr zA=p-SW|IHsO_N9VOXnrzNCx z(*W`(sN4I@^?fzSi0cga%+&&OJ71H-Zz$5Yq#iPgW0XfYbFnnIPWJx7rwDG9Nk8)# z>!?mmgg$u!y{QIymtfO~qbwArq*&j8V7Ey!?tE(_6w>)3QUl;dRu)N~qcnNz6r0+q zVqsZst5`0HMJcND^Nv35fqF&4vGzXD+lQ196879Fk^qS;u;`D;dX6c{Os;1!ChHSR zANWXdFZAThqNIz2Wzb|O6U`0P9|v*lPAUg)87+TnYkJ zxOcDP?d=Mj_1;Jz=tUB+tjiNA;l=;6ITa`Wk&FKkbxD8vf>sHY8KSDRZXTnmuGZB2 zg&~$h#hz28WJ|_9PFN7SOSCqXKFQ|fN9CB+)1AB&m2lVg4F0p9Ll|gfpcpi#5Z|A# zhGJlgKisx%!+sDpV6teZntvY54lPJFlruCrK(Zn{Fbdz zW6mKN$S`0;LKC*l3K$uTUm77im)phL?!(94luLpqw}b7|iD#}#>0uhOom`=R=(%?? zRN#5%l%$a^fe$$@Cfg{U5WsJQM(8G_PNj6~$&-D^EJ`1Se55(G1Mg8SF)OxdK&fDx zE8_v!pU6fOytxETA6i{BlGZ(Cl}_7;P(1@A&Rtl31g5C7Nttk3`t8-Et6PZTC=)^!GGTYAJhTFSQqU0#y$FImiJiy1p2s92`g0 zb1)w>v91x5T)mB=Xfamj%~=-#wb{MR5`^_d#NnWOZo)fA zPw%JE(qf6szV3;HyGMEqe{2G3Ne1w*@2=qpVo=zE8W^y3E6E`O=mk_=wcXxKu7XZuhfIvIiM?3b%g2Yza*|Ac(N$NJQoXfEtoi5jwzat8_t3AS+ zMP(QZX!k2uB2^V}fO$mE!|4s)64fbC4OQ3Gj){YPnR;lKB-&?BVfkl!#-E*VGzrjf z=@HSp%9}o-qjBVlfTi2Tm|RVA8QhIj6HG=U8O1W<$uBIEQeQTq^g=0vcKlHk~LsEkwHTE{NB$ zSGf42WQC=OmLLmZP!c5TEOys~Ol>gf39!Khh-mL^dgJuqqk2cl8Bsxj`!9g92UgXF zR#35uDIPlUO}mtSJq!;m7;qrR)k?K@b;xHKZzTq{pp6?8 zMiX~#0%6+#vid)xGFrwIg_bducfz9O=%!(OZ=<9C*{DF5Nr-l248isXRSjNW|A+=~ z3p*cn6pp@VTp@+xuK=Dduq1r9$&zpqx^`qNvKvdj|E5z$w zh+^;&?es|k5yKRsIIuiiipk)HtIrF##!o4cRL%5dk3j8wKncH{qYQ(ZB%>{M0(E_! zFyd1G80BYpCzHT8c-M&vcnq&@t5vUn{pNq3Fc)hp8k7gN4h9Ua-9^}UK=1?779J^B znrRpQ-sUCEh8^IOL-bLMr4$=SrK0?{Tjdj0eGPFNzoZyl!GR-X%jiJIj$e}1uekRZ z{t=tYwlxV2_c>AyeEG2w7nIxvf#Mt!ya`v!i4;sg+j|_a+>@f<<@_6^1F0tYQ2Yde zSblzqO}W$f^WN@@W(2PcB%$BsIHccn!Xz0!@+p5K{m-6U3ZqnoEYe{zG11W|lde<; zu~~Cd>Q`NAGNnG6l~xp$E?Hd^57z3O>L?+QoZL;5$S`^F!q>g4wNe{n;J0nc@bnHH zcaL;ZbPz9-@*C$1Ld!sDezyG+i`DNJoxV1s5^WdKh8+y&516*<*`Gi9iyzr5 z_OTE#q+_?Z>@9#JbL%DiU3y=$iRsSu;I54%oga5L0?8|N1aac=;%^Av5DbQ6@}~|H zp5L0Fpt~>uG6yu%D7qf<;^6lF>)G3>96u{tPZRee3BJ+C$&_1g0~tiG5+XmSUZ>UTTYpsaK~1c8;8KO^ibZ@^R6hVwlTfc007~?jOTx^)kM#)`++*^pM>x& zM=UXveN^vu{25;bc+m&x;BKaeqX6{)a8FssSgNrCzo{b2X87Ne4=oFR`Wy|wk3XE# z%Aa3vu=vdUFWlw5N|aU1V9)ugJuSEF36BJ?%aY(Ud76N&;%4M20P9LPE8BPF#2GNP zOovb0z4{(1k05B@UL)yCN9gkbt)w4dB|V_}BjIwKFQy5$=_?-wmcIU1Xb&l7`+0dq?fnGjS!CbUDtS5@2rp;Vd^qb#qegxryjh_6 z6&pxg05SqLf^$ZR^p5YUu&SB$54+48lFx)w*Jhqo0=sm2uH?BpprcpACdD%;2^UQ z^|y^T=1qFeLz`pKbR!i(2ZYWh+2a6bDcQ?2FiV=;)<%X6$)&OMW3kSPrO$Y|2Xr_d zNPG&jp#Nn7*y(eMn{;BeYy(#rr&S#=aqAO*Mj6@bq|7TMb}HCof^-^JQd); zuC;#@O#70P{uZVwT0A+~<%Yny7hc={zpj>Mi|vP607tR3wsX|#^ik{t_ozObnR%bv zLxn6c>R*~bbt@k}__~#0bo#pB zogD}BeRs~I#7q|d34diumi?Uat7`f%-fojbNfbYG->qe^B1Np`vN+xEuX>JEYHyh zrv``d`R2f2?ef$>tIzhma!~`jqzSZc{G0%@MSkZUB4)7rTstGQAc8fp$^clyW9OV0 z^Xgc#o!;S*+-R`+EHIwWK=GSLr|!$4f>V#@$A6!G5+@O{dFWO*!aLwdMFAk@drI$D zvLm+1fLB-1n6I<^9&!804+jC;|M|}T%$43>(E9nIkK{{l*ybtzpL^lc6ExWD0>sRz zp8_@ZAR#mGAw{3-!RXI4ji?=*9u#dmA4f{GumGk{|>Al`)N6}CbMAmm<#H;+}G zq1qx?MiLz;Iz+|=W`!t8AdF}QpK^kq>OLBHa@~8BT1QLSkF5F~466CV4PES| zd_p!37}^IFWrM5Wq43d3_L(eyhP98HRvIDUaX#*_$pI+}qP`CVLyasU?W4|=Yo%Ne zRcFcFggFgaGiHFmYQ$`EulAJWYXD_fW+Phm<1`=|5voF`%dKw}UH|BxO=mewT6hlu zZ>df&W-KRhypjC}1L6Wtycq1$cD}K=kC1?JuKEEN&e@nxr2$$K<`(cH0(+riR6n5d zTWprdX6|`Mat9iHa*_}<_+WqDCsNe%Lfc`8j0Z0scOtL|XX}$A2l=(~4~eoGt#b0YAvLN+~t$(;{8Xw^!phpA3ICh{@Ae4#Y^^k9Op zwGAi#I8pVjgLnt}K}nemiO~tG(U5h-JOwJ|3V{BFm{cpqC*0&j=Pm4A0|#25JV0dV z^Fz}6&*RG19yx-TfM4f05q=rz8*$P;M^sm)iNZc~IezXo^w?@I`^QK751}JghK6e# zPXjeq09-@i%Jr`e=qvqG2dU*pf=p57_VX4mX6E0vT?mD%3o2G&BaTvlV36b%A}|gI z%Qm6u7}8>xS_35#46Xthcw&LhAEk&oI%046|Jh76xIrDTC4w>kL3WHOv}@q)d;3^% z5z0wh|M%S8tr8ed+JlxkkYP5PT@2+5?;a&=9Vt`x(U+`p0l{hlHPuR0w^>dei5D)T zxUN4VDgN?LUFtqdGz8J@nU1?q@WSKpI_K`6UwfiRtWtj(qrTN(_MkF3wRjmsF4Kd}|g5hWRzr;)>sSUwa+@Uhk78{-p#WFm)0$5R(Lz0Ruyk$w2*Q+q0I+ zHK6ee5bp(|_iAdKYN`(#lo6;fY#de06?>fmi*d-wUK4rTP6q2-HjwE6DI{SU%0O^2 zEHoaBy_O|?U}l`majEtH=)%lRj-$*~G=rdi8Hw1Fhugr1K^@?4u#1`wcf!T+G3zEER8aU2DPs6fbq7;OS7ufzHNNXYSE!s6o!fchV2;;2mb4N8awn5B zhUtyI&zS}53^yKhOo zEhGB*c9oHi&WVFr$nzH(hBr`b5n$-`Fzf1rQfm@Le(qAO%H;pH_*S%Ru~cI^iEA)H zWNjo1$78M9OdnNQyBMfE{gK2hwYjo@IaCg)(1z)+q0V{yW*a@b8hEzF&%c&ob24;W zmxZ5D?thVRXA>%A{uJ{Sbn(q+RTa*n>GnWZ)v^(Es50Ke(zDiFJGNU&Qp9zj8a!9+ zb9QkK97kHB$%m@4KqX>6TkV?EwR#T3sl(F@ds9MyknIj}(7xBiE zMVF_SlKS&g9%0RZq~mN+Moph3c3!4Gr!mV`?q04ZkY%ev*OGaPG(5c6t;gG370w6` zD_qsILE^x^kfP}Mp1tdt#X*w%md=kgo|$HZUB9el@!PLcic~v?)_-86Y}^g^3@0p0 zo%mmL#r2%4j6=+~vbl4S>+wnBIbBaswc`NPjgNyd55IT&tnmd$V9g;9>9p!Mgvq>r z$j#fRo*tLQp;OIlbFZ_Gly@T#*-w^AviDgGHW4d%t;H%SHwK-fQ*fe(D)@BKbD z&ZgQW!#?O)bCX9;BgW%k%m5lYbp}N6xS2_=X1Q2>rHCt0J-j^@b39n%&hFHAIILPP zsK8?b<)VKugsD8koqQ}$YX;mz`fxAW6B4!_W8h=L;i1!`Egk}ie6_GAol>`rd-7_X3( zy)|KDq)#D$Yyt}aE>DBT zevJ{*^%h|O*Om!e)B!e2b;r>R@?X2sRx7Sk@Oil~4}_yQoF}!tF9gXUevWt)x|wL7 znA$TQ%?72%6GEV*=1YlVbC-`$mXlnQIg>>2afXK!8?l*>I;>_D2ScbFN9jZvIS1-! zKxpkXiz*sZ<5ap%ko@B<(pf9;@N^_IPJ zpo@kQRDJlWqO%$|{)O2D7d}7-y(j3h5H@PoSn$;DN^sbRN>Q_S^<>BI=K@lN3lk&h zsozXPJNWx%vM5|am#5)aDO6?{D6*&zB5;bQim9T6u^G(4ffm`^mQ#wd5Z?YGAvKpD zpIM_Ox5{W*nxfQn$nmprOs^@2sF<I7n!09w$aT18r@1tF<9B5`*aIo1Q`jB9))2!q4gE7BHKwZQSigoKH{w`bQ-@LKW zhsEPY-Jx|g`VxJHodo7~+pZ#LU4)9)&+}@a3i8QJ_H>00vVcEru{w0I&O}eMfGV#? z(QfC@YM+4sWtRNii$<$Fg>ZuDA+!g@{X%~_V{l!#tr|$Xw~hdG&$6g#_bF&g4R!C^ z(RVJ4K2;?BM->Gh2x2)>r2;_UEx0QJX&(AYL<<4iH>VSc$m5*Yw}u^6`5?!w)vED+ zcCKaUv4V%rJWHXx-VlRVSK-m~iu+ZZ9=?w9IPts^s752BK#4>|BP>p#UEL61n@SpG z`)%sQyc&;VEX&9Ar$6`Ta}Qw2)E1f=%MTW0F-Mm1J{Aw`|L9quS7Qra-?A(xB#La+ zAv&}%k?*44+3z=Evqo+3cw1y43DUZ7Ra3(J>BWY;V%N1UYLbm|IlC$H9TTGj;Vwbm78VTH%mmqu{v} z$Cg3JONz@cW)&*-Xvu6U+68=GU8S>53#78OIlOIBXH+TMf~R{^4y*6aU3(7ujj}n$ z^C|p_5RF+I<5SLop4mXT7MG+1rkc3?rObbe8XC{jM&o%CymK#$_nv$bud}th!S!#% z#5nU)L%;AELWI4IJ1UHmDIv_PHOS8)|z!F*2W0XA%1nhX-w8M)P^-OL&e6YuKXJ_*$)^_d8}ANw+X;yNFvP*7 z_(!EeU;INq;C?EDkY$fu#1i`!MUpV~k+gh2I;u^=?VeTE`PuKoX(dlpN)mwGjv_f%R%+X}Yn);p&??CHDN;{iAAc=#VO8Qfkh%v7Bc}eBmzZDFEtv_> zww>8izOn10zKC=4un%cR*c1nW+}(&n5+dHx_*T;D;s~Em8kRXBo}1NQ4F|eovS`5F zmY$?A#ce!Cn%_|O95xDWWzs`R0 zH|{ciw%-C)4+C4G;5nfJ@=Km_KCEYDU2GIR;V&^;zG`=!ewbb^Y=9hv9Vxyuekvk~ z6qGz3S#$PYKUTb+;wmd2(^%Vf6i|da&GM6@M=%}CuhSlJ#gE($d%4KnKEpL!lDBn! zQp?V9Z7#ih)@iS9vUI_z*(x<d)@T@0{^{t&~bF6&u`3NVK60JIc`XW&P)be zBYc-dyv-(>p_-{hzm=###7WmLqZl&p*Lpisularuw*x~4UGWPY5z3S!<+x&^Fpe%~ z1)ZQ&c1m0bWX9R=0Z3G9;ZL_}=iTU>y@b7)5%MG8fG8$tUCr7qYz<-+X zH6#j2!@TI&Q=;|0A z>QJwQpM$;bSP5b)4TRt5ae5?Td%#cRx@%p2lu{i|p`n25n8zXsbhh@NY4U-m>o`9H zNaqP0L~}{>!jU!vm~Vn4>1bMJUdu-+p4<=aX4`f@0#GJ72uCeo%~zP1IF=8t66&br ztE@m%jjl8cA{wd8AH`bB4erOiHjq`+#^zp5%Oli(l|-thW&0f$W7zPc2J;Vd*i*iY z8X7*ydASzHQx3RA<2ih~_4Mj7C-5F_C#8!Le|7}knTdR=-OV%K9!*(Y?iy-NM&rVwI z6r%VmpRv(~aAP;P(W+5oAp-F%U5hNTd#Pl=Ng~tW!`aKOk42*Wm}E7(D)3CB7Cx&j z$<~p)u891pymM%r$CG(|dOM~R@)0>lER4G_J^bQ8%jWc3HE!fe3m*5PO2&*q?cUMX z$G4DJm&Z(#Xw0`7E#+oj^$WEI!Hz*huCJB|Ebk$!vMA{FH>FT%*mXOD@~th)Yj`nhnT*{H;zV9Bo1rK*Y=jjrbZuwDaY;kiAbFWyspT($7#T5JU=B5 ziQ`IMkgk)mF@EeUk0t=8L;=6P;_CS~f9W^AIm86A!oFH^=QF9c^5q}ZR{m`gmSe=C zs8Tea-@vK|RasDA7D5%ArG<#vF;UFx-g-^b9fFQ+u|H~Bi6bA=WTI4rTtdc>tVA#w zy2>`9?m(D1!}=4@E}PU1QP6*FCfg54$IfD1(6RMYLUBoEJ#l{CL^ULdB>tht%isY zH^kGHI#q4cwmVayMZngQo`1)^0TM63@M@EJA-D=bBZI)4X%jv`yJ~N`RJTg?CPP=uhz2h`BV#zVH zC*$Ep&x_h?nqks%a2m!Fow;V5yl%^~5cgR5chXj!I@4VxUjf*jQ+&G-Eya3P;5kmi z2I67(3e5|z6CCgssl(uVM!WzW{0XHW_akvQ;hchx;HYk( zASsB&wJOd}R(%m4v`{M>X`UL<@UBQ*@W6{o%rZsRGAa7reQw1W^1#-rk!{y+Ew`}8 z2#mQsm#RNlsQ?{x&cg@8^TNTc$f8?~dpcVwFGlVe(3}x`Uoucj9b#yfN{WTS?RDnX0cl)y&STzsJIZP0XXK(V__k$4$1^T9S{V0KrC-S(b~$yy5pJ`|$k$3r9BSuJJ%j zLC1`cyc)UBcH@IGsZ57jKbLg?&Zk{I#J07d}V{R9*~;hq9dWy z(K!tuTJ|@402>yskN&bhzfR~d*tskG&Y`@1AokiTbtm6#9x`k0@XU)CpWKoYng z+B05WFSOf9)D3WfLZC}i`bARYN*F`-Cpj#U?EL#naJxY~BDejedfdPxjOWx`qmmmC zvBC^n5kSeup(eyzb_scM|AdqI1ZAaESmUBVJRd zW(WU!^^O1rv^VumlIp;60mq6?UCMiQ%mLC`dK3OU zXk8Qa!r+o@2rJQ1NI-;iheXq&sPH?9CN2x6`IH)ZZF^;@L_#HMx*j~g)4gYp(Nn1o zz$T9pepYCq-ofW6hSR46a_?K$GSPaogVp7U-;>XM2NkAd?^qBA{Hxe{iC)=tN~iza$x?+sk5hSk^R@rfkDDO3jYQ1$zd)NI z4#59kki5PA|Fb$)!MhD9SB8Rs#OVJ<$~{X45B88XgB$fMcY3~Y^`qS1XgAy&U||g=EOP&5Su#Ed0t?Hj`OkZU zZNCaWI}lNLH<}QnSCg*mJp216?9qvj`F$>_|9%W&l7DU(?$?0-Tr3p`M%*BaW%*C# z3eZ)35HTu5}|F@XqjG&wRMr8dbqF#t=uV(Mg-_%BLGlJi_ znPqo3EZP26wE9nk;1eADSTgzd0$#z;4+kELw)wwed9bhsbnIQ>cur|Q`~1DzWu*U3 zE*^BCM(93>L;hVDnd_hQQ9KVdqQ6^_a2W}L5tWXF{u@>J8Xd96q}I{#pU3$BIQ#B+ zs^9nj5)m0?mgFc(WHeCOB$ccbp`?|03ysqncfpzOZ0}ROW^l!*<3<>7t*bxU9oC8d!PUrFy z?GAd9NB=6(Kc>$z5AwwqNWg);ZT9VyCLRF9_Bz*vwDt1x{=<8L0tDT@Nch)e;E?+ z=JP-d#Yw&-C-II&B=eb;5&p{OWI)3h_3xiRbe{XXyL^Q@Wd{oHvk`dMMa_4b>_kl= zm<^qnl9_L(5^=F$6X~JG$hR&2s7x;z4CcI$?7?411P?o__U*+13iamAe_}7&mXMZA zd}S7TK(X}9qvOFpJN6UeQkrF995Vao4}pM4K&15YpXo300s`I?p>*PPuaW|SuW$5x z_CS05jQa0s&xStf9vsjE1Bkx3*e?Bm_42bL#ASK$?9G3uUcs~8$^(P-!?X?4ewRb< ze?*Vl58UX4*mW7==>T@weZjYraX8O=&^r3_3!v}W~0Ueuh62qEqObZCNi zfQa~==$3BMfJm5P#t9+F8Zljp+#rFA8sv^%qT)&T@$)SydV0m_)je`!;a__FU40o!%?GG=o`AMnpm05&!D`ClLe5~&9Tg}%R4xLPM@WGOHA*lc z!FlJK#WL35OQ15yBc6KgzV=?n=-qdS;vBqefa4sfglPdiB}OQl%Nacy&ug|~pb-;a z0C2Alq6{i1;P+|$V*T?J7Nm%&`_Dr>opZy@%ab(PZuT~xN9)s6Q5 zP3CyJrVq@vlOH=?3K&@V!R(duScs+xuv)N>?mB!MWy6BmBgX;nsDd^-Uv%&^G+5#+ z$ggp~uH*>I1EICoSN~f)Y$Jxuq!vZkH&$Sx$j@ujY5*NZFc-fUd!C26$<%e`v4=?p z8>q#=dQkCGKywamfbJf7hGjrv=yYQ|SgjJOOoeEzPT;ktqoh(X!kUuvyXYv$?mpoJ zI^9_8=uUB8ohYyjwa7{#!k(ak?}N|pWw;FDn*;mKc?j&%x~B|qH7K)-4yd@*KS6uM zOVx0|x_9_kJ%RgVbpCiG)l$Kr)2!9l2l>WkCF3e+nnM

Vb0e)@>)`&zvX#e6B_P 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%0A{y;4y?Tbwiqyj~p` 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 + entity?.metadata?.tags?.includes('recommended') ?? false, + }, + ]} +/> +``` + +This code will group all templates with the 'recommended' tag together at the +top of the page above any other templates not filtered by this swimlane or +others. + +You can also further customize swimlanes by passing in a `titleComponent` +instead of a `title` which will be a component to use as the header instead of +just the default `ContentHeader` with the `title` set as it's value. +![Grouped Templates](../../assets/software-templates/grouped-templates.png) diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index b1a2235288..4e093107e2 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -32,7 +32,6 @@ import { AlertDisplay, OAuthRequestDialog, SignInPage, - ContentHeader, } from '@backstage/core-components'; import { apiDocsPlugin, ApiExplorerPage } from '@backstage/plugin-api-docs'; import { @@ -180,11 +179,11 @@ const routes = ( path="/create" element={ , + title: 'Recommended', filter: entity => - entity?.metadata?.tags?.includes('recommended') || false, + entity?.metadata?.tags?.includes('recommended') ?? false, }, ]} /> diff --git a/plugins/scaffolder/api-report.md b/plugins/scaffolder/api-report.md index 164f9acf83..1ebeff2ff8 100644 --- a/plugins/scaffolder/api-report.md +++ b/plugins/scaffolder/api-report.md @@ -214,16 +214,17 @@ export const ScaffolderFieldExtensions: React_2.ComponentType; // @public (undocumented) export const ScaffolderPage: ({ TemplateCardComponent, - ExtraSwimlanes, + extraSwimlanes, }: { TemplateCardComponent?: | ComponentType<{ template: TemplateEntityV1beta2; }> | undefined; - ExtraSwimlanes?: + extraSwimlanes?: | { - title: ReactNode; + title?: string | undefined; + titleComponent?: ReactNode; filter: (entity: Entity) => boolean; }[] | undefined; @@ -248,7 +249,7 @@ export { scaffolderPlugin }; // @public (undocumented) export const TemplateList: ({ TemplateCardComponent, - Swimlane, + swimlane, }: TemplateListProps) => JSX.Element | null; // Warning: (ae-missing-release-tag) "TemplateListProps" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) @@ -260,8 +261,9 @@ export type TemplateListProps = { template: TemplateEntityV1beta2; }> | undefined; - Swimlane?: { - title: React_2.ReactNode; + swimlane?: { + title?: string; + titleComponent?: React_2.ReactNode; filter: (entity: Entity) => boolean; }; }; diff --git a/plugins/scaffolder/src/components/Router.tsx b/plugins/scaffolder/src/components/Router.tsx index 5d4e750777..7d12b02c38 100644 --- a/plugins/scaffolder/src/components/Router.tsx +++ b/plugins/scaffolder/src/components/Router.tsx @@ -34,15 +34,16 @@ type RouterProps = { TemplateCardComponent?: | ComponentType<{ template: TemplateEntityV1beta2 }> | undefined; - ExtraSwimlanes?: Array<{ - title: React.ReactNode; + extraSwimlanes?: Array<{ + title?: string; + titleComponent?: React.ReactNode; filter: (entity: Entity) => boolean; }>; }; export const Router = ({ TemplateCardComponent, - ExtraSwimlanes, + extraSwimlanes, }: RouterProps) => { const outlet = useOutlet(); @@ -73,7 +74,7 @@ export const Router = ({ element={ } /> diff --git a/plugins/scaffolder/src/components/ScaffolderPage/ScaffolderPage.tsx b/plugins/scaffolder/src/components/ScaffolderPage/ScaffolderPage.tsx index af03e01f0c..cfb12e4e53 100644 --- a/plugins/scaffolder/src/components/ScaffolderPage/ScaffolderPage.tsx +++ b/plugins/scaffolder/src/components/ScaffolderPage/ScaffolderPage.tsx @@ -51,18 +51,28 @@ export type ScaffolderPageProps = { TemplateCardComponent?: | ComponentType<{ template: TemplateEntityV1beta2 }> | undefined; - ExtraSwimlanes?: Array<{ - title: React.ReactNode; + extraSwimlanes?: Array<{ + title?: string; + titleComponent?: React.ReactNode; filter: (entity: Entity) => boolean; }>; }; export const ScaffolderPageContents = ({ TemplateCardComponent, - ExtraSwimlanes, + extraSwimlanes, }: ScaffolderPageProps) => { const styles = useStyles(); const registerComponentLink = useRouteRef(registerComponentRouteRef); + const otherTemplatesSwimlane = { + title: extraSwimlanes ? 'Other Templates' : 'Templates', + filter: (entity: Entity) => { + const filtered = (extraSwimlanes ?? []).map(swimlane => + swimlane.filter(entity), + ); + return !filtered.some(result => result === true); + }, + }; return ( @@ -100,14 +110,17 @@ export const ScaffolderPageContents = ({

- {ExtraSwimlanes && - ExtraSwimlanes.map(swimlane => ( + {extraSwimlanes && + extraSwimlanes.map(swimlane => ( ))} - +
@@ -117,12 +130,12 @@ export const ScaffolderPageContents = ({ export const ScaffolderPage = ({ TemplateCardComponent, - ExtraSwimlanes, + extraSwimlanes, }: ScaffolderPageProps) => ( ); diff --git a/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx b/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx index 939fe7f59c..a30655d6e8 100644 --- a/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx +++ b/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx @@ -35,84 +35,64 @@ export type TemplateListProps = { TemplateCardComponent?: | ComponentType<{ template: TemplateEntityV1beta2 }> | undefined; - Swimlane?: { - title: React.ReactNode; + swimlane?: { + title?: string; + titleComponent?: React.ReactNode; filter: (entity: Entity) => boolean; }; }; -type TemplateCardGridProps = { - Card: ComponentType<{ template: TemplateEntityV1beta2 }>; - entities: Entity[]; -}; -const TemplateCardGrid = ({ Card, entities }: TemplateCardGridProps) => { - return ( - - {entities && - entities?.length > 0 && - entities.map((template: Entity) => ( - - ))} - - ); -}; - export const TemplateList = ({ TemplateCardComponent, - Swimlane, + swimlane, }: TemplateListProps) => { const { loading, error, entities } = useEntityListProvider(); const Card = TemplateCardComponent || TemplateCard; - if (Swimlane === null || Swimlane === undefined) { - return ( - <> - {loading && } - - {error && ( - - {error.message} - - )} - - {!error && !loading && !entities.length && ( - - No templates found that match your filter. Learn more about{' '} - - adding templates - - . - - )} - - - - - - ); - } - - const filteredEntities = entities.filter((entity: Entity) => - Swimlane.filter(entity), + const maybeFilteredEntities = swimlane + ? entities.filter(e => swimlane.filter(e)) + : entities; + const title = swimlane ? ( + swimlane.titleComponent || + ) : ( + ); - if (filteredEntities.length === 0) { + if (swimlane && maybeFilteredEntities.length === 0) { return null; } - return ( - - {Swimlane.title} + <> {loading && } + {error && ( {error.message} )} - - + {!error && !loading && !entities.length && ( + + No templates found that match your filter. Learn more about{' '} + + adding templates + + . + + )} + + + {title} + + {maybeFilteredEntities && + maybeFilteredEntities?.length > 0 && + maybeFilteredEntities.map((template: Entity) => ( + + ))} + + + ); }; From f3bcd522168154d9c345b7e9ad5c45af88465e10 Mon Sep 17 00:00:00 2001 From: jrusso1020 Date: Sat, 27 Nov 2021 12:31:59 -0500 Subject: [PATCH 130/131] rename swimlane -> group Signed-off-by: jrusso1020 --- .changeset/witty-cats-tell.md | 14 ++++++++++- .../software-templates/configuration.md | 15 ++++++------ packages/app/src/App.tsx | 2 +- plugins/scaffolder/api-report.md | 8 +++---- plugins/scaffolder/src/components/Router.tsx | 9 +++---- .../ScaffolderPage/ScaffolderPage.tsx | 24 +++++++++---------- .../components/TemplateList/TemplateList.tsx | 14 +++++------ 7 files changed, 46 insertions(+), 40 deletions(-) diff --git a/.changeset/witty-cats-tell.md b/.changeset/witty-cats-tell.md index 55879b5fb5..82e33bc0a6 100644 --- a/.changeset/witty-cats-tell.md +++ b/.changeset/witty-cats-tell.md @@ -2,4 +2,16 @@ '@backstage/plugin-scaffolder': patch --- -Add swim lane filtering to the scaffolder page so that individuals can surface specific templates to end users ahead of others, or group templates together +Add group filtering to the scaffolder page so that individuals can surface specific templates to end users ahead of others, or group templates together. This can be accomplished by passing in a `groups` prop to the `ScaffolderPage` + +``` + + entity?.metadata?.tags?.includes('recommended') ?? false, + }, + ]} +/> +``` diff --git a/docs/features/software-templates/configuration.md b/docs/features/software-templates/configuration.md index 498bb41411..b57bb96818 100644 --- a/docs/features/software-templates/configuration.md +++ b/docs/features/software-templates/configuration.md @@ -58,12 +58,12 @@ RUN pip3 install cookiecutter Once you have more than a few software templates you may want to customize your `ScaffolderPage` by grouping and surfacing certain templates together. You can -accomplish this by creating `swimLanes` and passing them to your -`ScaffolderPage` like below +accomplish this by creating `groups` and passing them to your `ScaffolderPage` +like below ``` @@ -74,10 +74,9 @@ accomplish this by creating `swimLanes` and passing them to your ``` This code will group all templates with the 'recommended' tag together at the -top of the page above any other templates not filtered by this swimlane or -others. +top of the page above any other templates not filtered by this group or others. -You can also further customize swimlanes by passing in a `titleComponent` -instead of a `title` which will be a component to use as the header instead of -just the default `ContentHeader` with the `title` set as it's value. +You can also further customize groups by passing in a `titleComponent` instead +of a `title` which will be a component to use as the header instead of just the +default `ContentHeader` with the `title` set as it's value. ![Grouped Templates](../../assets/software-templates/grouped-templates.png) diff --git a/packages/app/src/App.tsx b/packages/app/src/App.tsx index 4e093107e2..fecde616ca 100644 --- a/packages/app/src/App.tsx +++ b/packages/app/src/App.tsx @@ -179,7 +179,7 @@ const routes = ( path="/create" element={ diff --git a/plugins/scaffolder/api-report.md b/plugins/scaffolder/api-report.md index 1ebeff2ff8..73fd8fae72 100644 --- a/plugins/scaffolder/api-report.md +++ b/plugins/scaffolder/api-report.md @@ -214,14 +214,14 @@ export const ScaffolderFieldExtensions: React_2.ComponentType; // @public (undocumented) export const ScaffolderPage: ({ TemplateCardComponent, - extraSwimlanes, + groups, }: { TemplateCardComponent?: | ComponentType<{ template: TemplateEntityV1beta2; }> | undefined; - extraSwimlanes?: + groups?: | { title?: string | undefined; titleComponent?: ReactNode; @@ -249,7 +249,7 @@ export { scaffolderPlugin }; // @public (undocumented) export const TemplateList: ({ TemplateCardComponent, - swimlane, + group, }: TemplateListProps) => JSX.Element | null; // Warning: (ae-missing-release-tag) "TemplateListProps" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal) @@ -261,7 +261,7 @@ export type TemplateListProps = { template: TemplateEntityV1beta2; }> | undefined; - swimlane?: { + group?: { title?: string; titleComponent?: React_2.ReactNode; filter: (entity: Entity) => boolean; diff --git a/plugins/scaffolder/src/components/Router.tsx b/plugins/scaffolder/src/components/Router.tsx index 7d12b02c38..e667c676f2 100644 --- a/plugins/scaffolder/src/components/Router.tsx +++ b/plugins/scaffolder/src/components/Router.tsx @@ -34,17 +34,14 @@ type RouterProps = { TemplateCardComponent?: | ComponentType<{ template: TemplateEntityV1beta2 }> | undefined; - extraSwimlanes?: Array<{ + groups?: Array<{ title?: string; titleComponent?: React.ReactNode; filter: (entity: Entity) => boolean; }>; }; -export const Router = ({ - TemplateCardComponent, - extraSwimlanes, -}: RouterProps) => { +export const Router = ({ TemplateCardComponent, groups }: RouterProps) => { const outlet = useOutlet(); const customFieldExtensions = useElementFilter(outlet, elements => @@ -74,7 +71,7 @@ export const Router = ({ element={ } /> diff --git a/plugins/scaffolder/src/components/ScaffolderPage/ScaffolderPage.tsx b/plugins/scaffolder/src/components/ScaffolderPage/ScaffolderPage.tsx index cfb12e4e53..aa45e56f5e 100644 --- a/plugins/scaffolder/src/components/ScaffolderPage/ScaffolderPage.tsx +++ b/plugins/scaffolder/src/components/ScaffolderPage/ScaffolderPage.tsx @@ -51,7 +51,7 @@ export type ScaffolderPageProps = { TemplateCardComponent?: | ComponentType<{ template: TemplateEntityV1beta2 }> | undefined; - extraSwimlanes?: Array<{ + groups?: Array<{ title?: string; titleComponent?: React.ReactNode; filter: (entity: Entity) => boolean; @@ -60,16 +60,14 @@ export type ScaffolderPageProps = { export const ScaffolderPageContents = ({ TemplateCardComponent, - extraSwimlanes, + groups, }: ScaffolderPageProps) => { const styles = useStyles(); const registerComponentLink = useRouteRef(registerComponentRouteRef); - const otherTemplatesSwimlane = { - title: extraSwimlanes ? 'Other Templates' : 'Templates', + const otherTemplatesGroup = { + title: groups ? 'Other Templates' : 'Templates', filter: (entity: Entity) => { - const filtered = (extraSwimlanes ?? []).map(swimlane => - swimlane.filter(entity), - ); + const filtered = (groups ?? []).map(group => group.filter(entity)); return !filtered.some(result => result === true); }, }; @@ -110,16 +108,16 @@ export const ScaffolderPageContents = ({
- {extraSwimlanes && - extraSwimlanes.map(swimlane => ( + {groups && + groups.map(group => ( ))}
@@ -130,12 +128,12 @@ export const ScaffolderPageContents = ({ export const ScaffolderPage = ({ TemplateCardComponent, - extraSwimlanes, + groups, }: ScaffolderPageProps) => ( ); diff --git a/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx b/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx index a30655d6e8..9b66a0a9b6 100644 --- a/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx +++ b/plugins/scaffolder/src/components/TemplateList/TemplateList.tsx @@ -35,7 +35,7 @@ export type TemplateListProps = { TemplateCardComponent?: | ComponentType<{ template: TemplateEntityV1beta2 }> | undefined; - swimlane?: { + group?: { title?: string; titleComponent?: React.ReactNode; filter: (entity: Entity) => boolean; @@ -44,20 +44,20 @@ export type TemplateListProps = { export const TemplateList = ({ TemplateCardComponent, - swimlane, + group, }: TemplateListProps) => { const { loading, error, entities } = useEntityListProvider(); const Card = TemplateCardComponent || TemplateCard; - const maybeFilteredEntities = swimlane - ? entities.filter(e => swimlane.filter(e)) + const maybeFilteredEntities = group + ? entities.filter(e => group.filter(e)) : entities; - const title = swimlane ? ( - swimlane.titleComponent || + const title = group ? ( + group.titleComponent || ) : ( ); - if (swimlane && maybeFilteredEntities.length === 0) { + if (group && maybeFilteredEntities.length === 0) { return null; } return ( From 1505a8cd7016927c22c02b7c2364627463dcff09 Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Sun, 28 Nov 2021 13:27:55 +0100 Subject: [PATCH 131/131] scripts/api-extractor: fix package index descriptions Signed-off-by: Patrik Oldsberg --- scripts/api-extractor.ts | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/scripts/api-extractor.ts b/scripts/api-extractor.ts index 22eae267ee..8ca7743cf2 100644 --- a/scripts/api-extractor.ts +++ b/scripts/api-extractor.ts @@ -35,6 +35,7 @@ import { import { Program } from 'typescript'; import { DocNode, + DocSection, IDocNodeContainerParameters, TSDocTagSyntaxKind, } from '@microsoft/tsdoc'; @@ -50,6 +51,7 @@ import { DocHeading } from '@microsoft/api-documenter/lib/nodes/DocHeading'; import { CustomMarkdownEmitter } from '@microsoft/api-documenter/lib/markdown/CustomMarkdownEmitter'; import { IMarkdownEmitterContext } from '@microsoft/api-documenter/lib/markdown/MarkdownEmitter'; import { AstDeclaration } from '@microsoft/api-extractor/lib/analyzer/AstDeclaration'; +import { DocTableCell } from '@microsoft/api-documenter/lib/nodes/DocTableCell'; const tmpDir = resolvePath(__dirname, '../node_modules/.cache/api-extractor'); @@ -603,9 +605,18 @@ async function buildDocs({ }); for (const apiMember of apiModel.members) { + // This is a workaround for this check failing: https://github.com/microsoft/rushstack/blob/915aca8d8847b65981892f44f0544ccb00752792/apps/api-documenter/src/documenters/MarkdownDocumenter.ts#L991 + const description = new DocSection({ configuration }); + if (apiMember.tsdocComment !== undefined) { + this._appendAndMergeSection( + description, + apiMember.tsdocComment.summarySection, + ); + } + const row = new DocTableRow({ configuration }, [ this._createTitleCell(apiMember), - this._createDescriptionCell(apiMember), + new DocTableCell({ configuration }, description.nodes), ]); if (apiMember.kind === 'Package') {

_F-z0(W%YsM!FWn}e%=Id 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±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 ?cy|Zg{AcuUA8tKM;SAblm2;~15Ge{*RP4& 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 z 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