From 85cbc3bc553ccbf92555da0a6b248f584605567c Mon Sep 17 00:00:00 2001 From: Nevo David Date: Fri, 24 May 2024 19:20:24 +0700 Subject: [PATCH 01/36] feat: impersonate --- .../src/api/routes/users.controller.ts | 40 +++++- .../src/services/auth/auth.middleware.ts | 92 +++++++++----- .../src/components/layout/impersonate.tsx | 117 ++++++++++++++++++ .../src/components/layout/layout.settings.tsx | 2 + .../src/components/layout/user.context.tsx | 1 + .../organizations/organization.repository.ts | 71 +++++++++++ .../organizations/organization.service.ts | 4 + .../src/database/prisma/schema.prisma | 1 + .../database/prisma/users/users.repository.ts | 39 +++++- .../database/prisma/users/users.service.ts | 15 ++- .../react-shared-libraries/src/form/input.tsx | 2 +- 11 files changed, 345 insertions(+), 39 deletions(-) create mode 100644 apps/frontend/src/components/layout/impersonate.tsx diff --git a/apps/backend/src/api/routes/users.controller.ts b/apps/backend/src/api/routes/users.controller.ts index 20b6fcd2..a048b748 100644 --- a/apps/backend/src/api/routes/users.controller.ts +++ b/apps/backend/src/api/routes/users.controller.ts @@ -4,6 +4,7 @@ import { Get, HttpException, Post, + Query, Req, Res, } from '@nestjs/common'; @@ -12,7 +13,7 @@ import { Organization, User } from '@prisma/client'; import { SubscriptionService } from '@gitroom/nestjs-libraries/database/prisma/subscriptions/subscription.service'; import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request'; import { StripeService } from '@gitroom/nestjs-libraries/services/stripe.service'; -import { Response } from 'express'; +import { Response, Request } from 'express'; import { AuthService } from '@gitroom/backend/services/auth/auth.service'; import { OrganizationService } from '@gitroom/nestjs-libraries/database/prisma/organizations/organization.service'; import { CheckPolicies } from '@gitroom/backend/services/auth/permissions/permissions.ability'; @@ -39,7 +40,8 @@ export class UsersController { @Get('/self') async getSelf( @GetUserFromRequest() user: User, - @GetOrgFromRequest() organization: Organization + @GetOrgFromRequest() organization: Organization, + @Req() req: Request ) { if (!organization) { throw new HttpException('Organization not found', 401); @@ -56,6 +58,8 @@ export class UsersController { role: organization?.users[0]?.role, // @ts-ignore isLifetime: !!organization?.subscription?.isLifetime, + admin: !!user.isSuperAdmin, + impersonate: !!req.cookies.impersonate, }; } @@ -64,6 +68,38 @@ export class UsersController { return this._userService.getPersonal(user.id); } + @Get('/impersonate') + async getImpersonate( + @GetUserFromRequest() user: User, + @Query('name') name: string + ) { + if (!user.isSuperAdmin) { + throw new HttpException('Unauthorized', 401); + } + + return this._userService.getImpersonateUser(name); + } + + @Post('/impersonate') + async setImpersonate( + @GetUserFromRequest() user: User, + @Body('id') id: string, + @Res({ passthrough: true }) response: Response + ) { + if (!user.isSuperAdmin) { + throw new HttpException('Unauthorized', 401); + } + + response.cookie('impersonate', id, { + domain: + '.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname, + secure: true, + httpOnly: true, + sameSite: 'none', + expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 365), + }); + } + @Post('/personal') async changePersonal( @GetUserFromRequest() user: User, diff --git a/apps/backend/src/services/auth/auth.middleware.ts b/apps/backend/src/services/auth/auth.middleware.ts index d97f9396..d2040774 100644 --- a/apps/backend/src/services/auth/auth.middleware.ts +++ b/apps/backend/src/services/auth/auth.middleware.ts @@ -1,45 +1,71 @@ import { Injectable, NestMiddleware } from '@nestjs/common'; import { Request, Response, NextFunction } from 'express'; -import {AuthService} from "@gitroom/helpers/auth/auth.service"; -import {User} from '@prisma/client'; -import {OrganizationService} from "@gitroom/nestjs-libraries/database/prisma/organizations/organization.service"; +import { AuthService } from '@gitroom/helpers/auth/auth.service'; +import { User } from '@prisma/client'; +import { OrganizationService } from '@gitroom/nestjs-libraries/database/prisma/organizations/organization.service'; +import { UsersService } from '@gitroom/nestjs-libraries/database/prisma/users/users.service'; @Injectable() export class AuthMiddleware implements NestMiddleware { - constructor( - private _organizationService: OrganizationService, - ) { + constructor( + private _organizationService: OrganizationService, + private _userService: UsersService + ) {} + async use(req: Request, res: Response, next: NextFunction) { + const auth = req.headers.auth || req.cookies.auth; + if (!auth) { + throw new Error('Unauthorized'); } - async use(req: Request, res: Response, next: NextFunction) { - const auth = req.headers.auth || req.cookies.auth; - if (!auth) { - throw new Error('Unauthorized'); + try { + let user = AuthService.verifyJWT(auth) as User | null; + const orgHeader = req.cookies.showorg || req.headers.showorg; + + if (!user) { + throw new Error('Unauthorized'); + } + + if (user?.isSuperAdmin && req.cookies.impersonate) { + const loadImpersonate = await this._organizationService.getUserOrg( + req.cookies.impersonate + ); + + if (loadImpersonate) { + user = loadImpersonate.user; + user.isSuperAdmin = true; + delete user.password; + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + req.user = user; + + // @ts-ignore + loadImpersonate.organization.users = loadImpersonate.organization.users.filter(f => f.userId === user.id); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + req.org = loadImpersonate.organization; + next(); + return ; } - try { - const user = AuthService.verifyJWT(auth) as User | null; - const orgHeader = req.cookies.showorg || req.headers.showorg; + } - if (!user) { - throw new Error('Unauthorized'); - } + delete user.password; + const organization = ( + await this._organizationService.getOrgsByUserId(user.id) + ).filter((f) => !f.users[0].disabled); + const setOrg = + organization.find((org) => org.id === orgHeader) || organization[0]; - delete user.password; - const organization = (await this._organizationService.getOrgsByUserId(user.id)).filter(f => !f.users[0].disabled); - const setOrg = organization.find((org) => org.id === orgHeader) || organization[0]; + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + req.user = user; - - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - req.user = user; - - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-expect-error - req.org = setOrg; - } - catch (err) { - throw new Error('Unauthorized'); - } - console.log('Request...'); - next(); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-expect-error + req.org = setOrg; + } catch (err) { + throw new Error('Unauthorized'); } + console.log('Request...'); + next(); + } } diff --git a/apps/frontend/src/components/layout/impersonate.tsx b/apps/frontend/src/components/layout/impersonate.tsx new file mode 100644 index 00000000..b8252b78 --- /dev/null +++ b/apps/frontend/src/components/layout/impersonate.tsx @@ -0,0 +1,117 @@ +import { Input } from '@gitroom/react/form/input'; +import { useCallback, useMemo, useState } from 'react'; +import useSWR from 'swr'; +import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; +import { useUser } from '@gitroom/frontend/components/layout/user.context'; + +export const Impersonate = () => { + const fetch = useFetch(); + const [name, setName] = useState(''); + const user = useUser(); + + const load = useCallback(async () => { + if (!name) { + return []; + } + + const value = await (await fetch(`/user/impersonate?name=${name}`)).json(); + return value; + }, [name]); + + const stopImpersonating = useCallback(async () => { + await fetch(`/user/impersonate`, { + method: 'POST', + body: JSON.stringify({ id: '' }), + }); + + window.location.reload(); + }, []); + + const setUser = useCallback( + (userId: string) => async () => { + await fetch(`/user/impersonate`, { + method: 'POST', + body: JSON.stringify({ id: userId }), + }); + + window.location.reload(); + }, + [] + ); + + const { data } = useSWR(`/impersonate-${name}`, load, { + refreshWhenHidden: false, + revalidateOnMount: true, + revalidateOnReconnect: false, + revalidateOnFocus: false, + refreshWhenOffline: false, + revalidateIfStale: false, + refreshInterval: 0, + }); + + const mapData = useMemo(() => { + return data?.map( + (curr: any) => ({ + id: curr.id, + name: curr.user.name, + email: curr.user.email, + }), + [] + ); + }, [data]); + + return ( +
+
+
+
+ {user?.impersonate ? ( +
+
Currently Impersonating
+
+
+ X +
+
+
+ ) : ( + setName(e.target.value)} + /> + )} +
+ {!!data?.length && ( + <> +
setName('')} + /> +
+ {mapData?.map((user: any) => ( +
+ user: {user.id.split('-').at(-1)} - {user.name} -{' '} + {user.email} +
+ ))} +
+ + )} +
+
+
+ ); +}; diff --git a/apps/frontend/src/components/layout/layout.settings.tsx b/apps/frontend/src/components/layout/layout.settings.tsx index 0c8b0a5c..4ef4cac3 100644 --- a/apps/frontend/src/components/layout/layout.settings.tsx +++ b/apps/frontend/src/components/layout/layout.settings.tsx @@ -24,6 +24,7 @@ import { ShowLinkedinCompany } from '@gitroom/frontend/components/launches/helpe import { SettingsComponent } from '@gitroom/frontend/components/layout/settings.component'; import { Onboarding } from '@gitroom/frontend/components/onboarding/onboarding'; import { Support } from '@gitroom/frontend/components/layout/support'; +import { Impersonate } from '@gitroom/frontend/components/layout/impersonate'; dayjs.extend(utc); dayjs.extend(weekOfYear); @@ -55,6 +56,7 @@ export const LayoutSettings = ({ children }: { children: ReactNode }) => {
+ {user?.admin && }
diff --git a/apps/frontend/src/components/layout/user.context.tsx b/apps/frontend/src/components/layout/user.context.tsx index 146eb192..6dd4ff8b 100644 --- a/apps/frontend/src/components/layout/user.context.tsx +++ b/apps/frontend/src/components/layout/user.context.tsx @@ -15,6 +15,7 @@ export const UserContext = createContext< role: 'USER' | 'ADMIN' | 'SUPERADMIN'; totalChannels: number; isLifetime?: boolean; + impersonate: boolean; }) >(undefined); diff --git a/libraries/nestjs-libraries/src/database/prisma/organizations/organization.repository.ts b/libraries/nestjs-libraries/src/database/prisma/organizations/organization.repository.ts index 261b51f6..a3d208a2 100644 --- a/libraries/nestjs-libraries/src/database/prisma/organizations/organization.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/organizations/organization.repository.ts @@ -12,6 +12,77 @@ export class OrganizationRepository { private _user: PrismaRepository<'user'> ) {} + getUserOrg(id: string) { + return this._userOrg.model.userOrganization.findFirst({ + where: { + id, + }, + select: { + user: true, + organization: { + include: { + users: { + select: { + id: true, + disabled: true, + role: true, + userId: true, + }, + }, + subscription: { + select: { + subscriptionTier: true, + totalChannels: true, + isLifetime: true, + }, + }, + }, + }, + }, + }); + } + + getImpersonateUser(name: string) { + return this._userOrg.model.userOrganization.findMany({ + where: { + user: { + OR: [ + { + name: { + contains: name, + }, + }, + { + email: { + contains: name, + }, + }, + { + id: { + contains: name, + }, + }, + ], + }, + }, + select: { + id: true, + organization: { + select: { + id: true, + }, + }, + user: { + select: { + id: true, + name: true, + email: true, + }, + }, + }, + }); + } + async getOrgsByUserId(userId: string) { return this._organization.model.organization.findMany({ where: { diff --git a/libraries/nestjs-libraries/src/database/prisma/organizations/organization.service.ts b/libraries/nestjs-libraries/src/database/prisma/organizations/organization.service.ts index 315f3071..18c947fe 100644 --- a/libraries/nestjs-libraries/src/database/prisma/organizations/organization.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/organizations/organization.service.ts @@ -33,6 +33,10 @@ export class OrganizationService { return this._organizationRepository.getOrgById(id); } + getUserOrg(id: string) { + return this._organizationRepository.getUserOrg(id); + } + getOrgsByUserId(userId: string) { return this._organizationRepository.getOrgsByUserId(userId); } diff --git a/libraries/nestjs-libraries/src/database/prisma/schema.prisma b/libraries/nestjs-libraries/src/database/prisma/schema.prisma index 1a71c00a..18ca29d2 100644 --- a/libraries/nestjs-libraries/src/database/prisma/schema.prisma +++ b/libraries/nestjs-libraries/src/database/prisma/schema.prisma @@ -36,6 +36,7 @@ model User { providerName Provider name String? lastName String? + isSuperAdmin Boolean @default(false) bio String? audience Int @default(0) pictureId String? diff --git a/libraries/nestjs-libraries/src/database/prisma/users/users.repository.ts b/libraries/nestjs-libraries/src/database/prisma/users/users.repository.ts index eb4238ee..0c2d297c 100644 --- a/libraries/nestjs-libraries/src/database/prisma/users/users.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/users/users.repository.ts @@ -5,12 +5,49 @@ import { AuthService } from '@gitroom/helpers/auth/auth.service'; import { ItemsDto } from '@gitroom/nestjs-libraries/dtos/marketplace/items.dto'; import { allTagsOptions } from '@gitroom/nestjs-libraries/database/prisma/marketplace/tags.list'; import { UserDetailDto } from '@gitroom/nestjs-libraries/dtos/users/user.details.dto'; -import { NewConversationDto } from '@gitroom/nestjs-libraries/dtos/marketplace/new.conversation.dto'; @Injectable() export class UsersRepository { constructor(private _user: PrismaRepository<'user'>) {} + getImpersonateUser(name: string) { + return this._user.model.user.findMany({ + where: { + OR: [ + { + name: { + contains: name, + }, + }, + { + email: { + contains: name, + }, + }, + { + id: { + contains: name, + }, + }, + ], + }, + select: { + id: true, + name: true, + email: true, + }, + take: 10, + }); + } + + getUserById(id: string) { + return this._user.model.user.findFirst({ + where: { + id, + }, + }); + } + getUserByEmail(email: string) { return this._user.model.user.findFirst({ where: { diff --git a/libraries/nestjs-libraries/src/database/prisma/users/users.service.ts b/libraries/nestjs-libraries/src/database/prisma/users/users.service.ts index cac770fc..097582c2 100644 --- a/libraries/nestjs-libraries/src/database/prisma/users/users.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/users/users.service.ts @@ -3,16 +3,27 @@ import { UsersRepository } from '@gitroom/nestjs-libraries/database/prisma/users import { Provider } from '@prisma/client'; import { ItemsDto } from '@gitroom/nestjs-libraries/dtos/marketplace/items.dto'; import { UserDetailDto } from '@gitroom/nestjs-libraries/dtos/users/user.details.dto'; -import { NewConversationDto } from '@gitroom/nestjs-libraries/dtos/marketplace/new.conversation.dto'; +import { OrganizationRepository } from '@gitroom/nestjs-libraries/database/prisma/organizations/organization.repository'; @Injectable() export class UsersService { - constructor(private _usersRepository: UsersRepository) {} + constructor( + private _usersRepository: UsersRepository, + private _organizationRepository: OrganizationRepository + ) {} getUserByEmail(email: string) { return this._usersRepository.getUserByEmail(email); } + getUserById(id: string) { + return this._usersRepository.getUserById(id); + } + + getImpersonateUser(name: string) { + return this._organizationRepository.getImpersonateUser(name); + } + getUserByProvider(providerId: string, provider: Provider) { return this._usersRepository.getUserByProvider(providerId, provider); } diff --git a/libraries/react-shared-libraries/src/form/input.tsx b/libraries/react-shared-libraries/src/form/input.tsx index 66e7febd..4e788211 100644 --- a/libraries/react-shared-libraries/src/form/input.tsx +++ b/libraries/react-shared-libraries/src/form/input.tsx @@ -44,7 +44,7 @@ export const Input: FC< return (
-
{label}
+ {!!label && (
{label}
)}
Date: Fri, 24 May 2024 19:22:07 +0700 Subject: [PATCH 02/36] feat: openai fix --- libraries/nestjs-libraries/src/openai/openai.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/nestjs-libraries/src/openai/openai.service.ts b/libraries/nestjs-libraries/src/openai/openai.service.ts index 718e8185..eb559060 100644 --- a/libraries/nestjs-libraries/src/openai/openai.service.ts +++ b/libraries/nestjs-libraries/src/openai/openai.service.ts @@ -3,7 +3,7 @@ import OpenAI from 'openai'; import { shuffle } from 'lodash'; const openai = new OpenAI({ - apiKey: process.env.OPENAI_API_KEY, + apiKey: process.env.OPENAI_API_KEY || 'sk-proj-', }); @Injectable() From e51906d485b8d374d74245405bac81c38b83111c Mon Sep 17 00:00:00 2001 From: Nevo David Date: Sun, 26 May 2024 16:42:23 +0700 Subject: [PATCH 03/36] feat: more social media --- .env.example | 9 +- .../src/api/routes/integrations.controller.ts | 17 +- .../auth/permissions/permissions.service.ts | 2 +- apps/cron/src/cron.module.ts | 3 +- apps/cron/src/tasks/refresh.tokens.ts | 15 - .../public/icons/platforms/tiktok.png | Bin 0 -> 1416 bytes .../public/icons/platforms/youtube.png | Bin 0 -> 1566 bytes .../src/app/(site)/analytics/page.tsx | 4 +- .../src/app/(site)/billing/lifetime/page.tsx | 3 +- apps/frontend/src/app/(site)/billing/page.tsx | 4 +- .../integrations/social/[provider]/page.tsx | 3 +- .../frontend/src/app/(site)/launches/page.tsx | 4 +- .../src/app/(site)/marketplace/buyer/page.tsx | 3 +- .../src/app/(site)/marketplace/page.tsx | 4 +- .../app/(site)/marketplace/seller/page.tsx | 3 +- .../src/app/(site)/messages/[id]/page.tsx | 3 +- .../frontend/src/app/(site)/messages/page.tsx | 4 +- .../frontend/src/app/(site)/settings/page.tsx | 4 +- .../src/app/auth/forgot/[token]/page.tsx | 4 +- apps/frontend/src/app/auth/forgot/page.tsx | 4 +- apps/frontend/src/app/auth/login/page.tsx | 4 +- apps/frontend/src/app/auth/page.tsx | 4 +- .../src/components/billing/faq.component.tsx | 27 +- .../src/components/billing/lifetime.deal.tsx | 112 +++---- .../billing/main.billing.component.tsx | 14 +- .../src/components/launches/calendar.tsx | 5 +- .../helpers/use.custom.provider.function.ts | 24 +- .../launches/launches.component.tsx | 40 ++- .../facebook/facebook.continue.tsx | 18 +- .../instagram/instagram.continue.tsx | 16 +- .../providers/continue-provider/list.tsx | 2 +- .../launches/providers/show.all.providers.tsx | 5 +- .../providers/tiktok/tiktok.provider.tsx | 113 +++++++ .../providers/youtube/youtube.provider.tsx | 138 +++++++++ .../components/layout/continue.provider.tsx | 4 +- .../components/settings/teams.component.tsx | 2 +- .../integrations/integration.repository.ts | 31 +- .../integrations/integration.service.ts | 62 +++- .../database/prisma/posts/posts.repository.ts | 15 +- .../database/prisma/posts/posts.service.ts | 40 ++- .../src/database/prisma/schema.prisma | 4 + .../subscriptions/subscription.repository.ts | 1 + .../integrations/connect.integration.dto.ts | 6 +- .../src/dtos/posts/create.post.dto.ts | 2 + .../youtube.settings.dto.ts | 35 +++ .../src/integrations/integration.manager.ts | 4 + .../integrations/social/facebook.provider.ts | 87 +++--- .../integrations/social/instagram.provider.ts | 90 +++--- .../integrations/social/linkedin.provider.ts | 16 +- .../social/social.integrations.interface.ts | 4 +- .../integrations/social/tiktok.provider.ts | 288 ++++++++++++++++++ .../src/integrations/social/x.provider.ts | 7 +- .../integrations/social/youtube.provider.ts | 164 ++++++++++ .../src/services/stripe.service.ts | 4 +- package-lock.json | 178 ++++++++++- package.json | 1 + 56 files changed, 1374 insertions(+), 286 deletions(-) delete mode 100644 apps/cron/src/tasks/refresh.tokens.ts create mode 100644 apps/frontend/public/icons/platforms/tiktok.png create mode 100644 apps/frontend/public/icons/platforms/youtube.png create mode 100644 apps/frontend/src/components/launches/providers/tiktok/tiktok.provider.tsx create mode 100644 apps/frontend/src/components/launches/providers/youtube/youtube.provider.tsx create mode 100644 libraries/nestjs-libraries/src/dtos/posts/providers-settings/youtube.settings.dto.ts create mode 100644 libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts create mode 100644 libraries/nestjs-libraries/src/integrations/social/youtube.provider.ts diff --git a/.env.example b/.env.example index 775dfe87..aa9e7006 100644 --- a/.env.example +++ b/.env.example @@ -24,4 +24,11 @@ CLOUDFLARE_SECRET_ACCESS_KEY= CLOUDFLARE_BUCKETNAME= CLOUDFLARE_BUCKET_URL= CLOUDFLARE_REGION= -FEE_AMOUNT= \ No newline at end of file +FEE_AMOUNT= +OPENAI_API_KEY="" +FACEBOOK_APP_ID="" +FACEBOOK_APP_SECRET="" +YOUTUBE_CLIENT_ID="" +YOUTUBE_CLIENT_SECRET="" +TIKTOK_CLIENT_ID="" +TIKTOK_CLIENT_SECRET="" \ No newline at end of file diff --git a/apps/backend/src/api/routes/integrations.controller.ts b/apps/backend/src/api/routes/integrations.controller.ts index be30d674..aded60b2 100644 --- a/apps/backend/src/api/routes/integrations.controller.ts +++ b/apps/backend/src/api/routes/integrations.controller.ts @@ -49,6 +49,7 @@ export class IntegrationsController { picture: p.picture, identifier: p.providerIdentifier, inBetweenSteps: p.inBetweenSteps, + refreshNeeded: p.refreshNeeded, type: p.type, })), }; @@ -71,7 +72,10 @@ export class IntegrationsController { @Get('/social/:integration') @CheckPolicies([AuthorizationActions.Create, Sections.CHANNEL]) - async getIntegrationUrl(@Param('integration') integration: string) { + async getIntegrationUrl( + @Param('integration') integration: string, + @Query('refresh') refresh: string + ) { if ( !this._integrationManager .getAllowedSocialsIntegrations() @@ -83,7 +87,7 @@ export class IntegrationsController { const integrationProvider = this._integrationManager.getSocialIntegration(integration); const { codeVerifier, state, url } = - await integrationProvider.generateAuthUrl(); + await integrationProvider.generateAuthUrl(refresh); await ioRedis.set(`login:${state}`, codeVerifier, 'EX', 300); return { url }; @@ -170,7 +174,8 @@ export class IntegrationsController { token, '', undefined, - username + username, + false ); } @@ -207,6 +212,7 @@ export class IntegrationsController { } = await integrationProvider.authenticate({ code: body.code, codeVerifier: getCodeVerifier, + refresh: body.refresh, }); if (!id) { @@ -224,7 +230,8 @@ export class IntegrationsController { refreshToken, expiresIn, username, - integrationProvider.isBetweenSteps + integrationProvider.isBetweenSteps, + body.refresh ); } @@ -239,7 +246,7 @@ export class IntegrationsController { @Post('/instagram/:id') async saveInstagram( @Param('id') id: string, - @Body() body: { pageId: string, id: string }, + @Body() body: { pageId: string; id: string }, @GetOrgFromRequest() org: Organization ) { return this._integrationService.saveInstagram(org.id, id, body); diff --git a/apps/backend/src/services/auth/permissions/permissions.service.ts b/apps/backend/src/services/auth/permissions/permissions.service.ts index 54ccfcfc..7538dc9e 100644 --- a/apps/backend/src/services/auth/permissions/permissions.service.ts +++ b/apps/backend/src/services/auth/permissions/permissions.service.ts @@ -82,7 +82,7 @@ export class PermissionsService { if (section === Sections.CHANNEL) { const totalChannels = ( await this._integrationService.getIntegrationsList(orgId) - ).length; + ).filter(f => !f.refreshNeeded).length; if ( (options.channel && options.channel > totalChannels) || diff --git a/apps/cron/src/cron.module.ts b/apps/cron/src/cron.module.ts index 6b09d106..151f2f99 100644 --- a/apps/cron/src/cron.module.ts +++ b/apps/cron/src/cron.module.ts @@ -1,6 +1,5 @@ import { Module } from '@nestjs/common'; import { ScheduleModule } from '@nestjs/schedule'; -import { RefreshTokens } from '@gitroom/cron/tasks/refresh.tokens'; import { CheckStars } from '@gitroom/cron/tasks/check.stars'; import { DatabaseModule } from '@gitroom/nestjs-libraries/database/prisma/database.module'; import { BullMqModule } from '@gitroom/nestjs-libraries/bull-mq-transport/bull-mq.module'; @@ -16,6 +15,6 @@ import { SyncTrending } from '@gitroom/cron/tasks/sync.trending'; }), ], controllers: [], - providers: [RefreshTokens, CheckStars, SyncTrending], + providers: [CheckStars, SyncTrending], }) export class CronModule {} diff --git a/apps/cron/src/tasks/refresh.tokens.ts b/apps/cron/src/tasks/refresh.tokens.ts deleted file mode 100644 index 62ddbf00..00000000 --- a/apps/cron/src/tasks/refresh.tokens.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Injectable } from '@nestjs/common'; -import {Cron} from '@nestjs/schedule'; -import {IntegrationService} from "@gitroom/nestjs-libraries/database/prisma/integrations/integration.service"; - -@Injectable() -export class RefreshTokens { - constructor( - private _integrationService: IntegrationService, - ) { - } - @Cron('0 * * * *') - async refresh() { - await this._integrationService.refreshTokens(); - } -} \ No newline at end of file diff --git a/apps/frontend/public/icons/platforms/tiktok.png b/apps/frontend/public/icons/platforms/tiktok.png new file mode 100644 index 0000000000000000000000000000000000000000..fde2ea8c68b05d5d201350b411521beed84cbf3e GIT binary patch literal 1416 zcmV;31$X+1P)I!Q!9RA_c6(~X?3MvsJ}B0AZU~rw+9k%3E=@T%1aZT5G2GHKm&>tK?#dNb|py5Qo6`6?X35HJ`_{B zk!d@fsigm8Ue5i#^PS(E^*cua!fhZe*$s%7`apV{`apV{`apV{j6?)+j=u-xbRcqL z%TfxnuAa#86LE{7NWg}eckV2D_7Kcyw5dST2v!`RYVwr0#YjkxSeD6srtp^GLcdWa zxdpiLXHt4$KfeX)yB#ATAc&9(6e_Jb;NVP{I)(9@&cp>IVUxYh_%(D`FoW5;H!k%j zch!3EZl;&aB_1eAUw-w~OZcdGA-d{*Q>3SVIcHDGOOb#?qyt4QSy^5#49gaj>S~-` z0CGbc{5~1?^KNmj`Bb!m5&vHh5s`mH#Fmr8fOp@)@$h6K*;yF6gLD+`)2F!d(>|)NR?}cb zLDy-sB^o*eOv+wa)Ed16`-&MEi9kPJxopn{Q3wWVtynud4TQoPHT6385kD-xvC z6pAp()pYtB{jlXsXBCHd|H`qB>#-SB>cadZ+bKMCFa8fo{-Gi@o||gjwV}j_y0b2%DQ>jug@jN6h}621#4^ zEd7@)rLm!&6*d>I*`4iJsiukAg#^JwI2mc+WTc@}ew_lbj~>OKHJ=gmUt^`iL#eIR zKW17G2!dtNl| zqrTlkU8;+c^A-HyznqlIWkTGsrZ<)}mZCeg|p&DZ8+r?{5Lo(}OJL`t=Mi zZV?J@US!ENTFtM^PrSn2f<w%Jf+olKhW zK(nnM?oucuQ}^wa zv@M&Y|K1;E@U^RQhZ&T7f1T`!hFjQLpOlN_KPfwNrX&Xh!w}Eiy)CLkhPMdS@J zWpTJsJ`V@vylJ*H`t_JtW9La^%siQwHZ(~fH(<(sKO95$-HvK~Voi8PWc1VWP4=XC zLUaKHMDu!Ob47);H(lD5Wr-X4rrAa=W5HY|Qqq~`jqA$)$3 zH5)}n&Jh_oSN7zNohhU$9Tklduq>)=!p=YqU)24{p+G&- z{c!Cnt`9vriou4HOv8zx6t!lAE73sH1w;=kAum>mP_Mgb?5g@edYk${dYf(=kbePW W8)%@UvN_NI0000&`Cr=RA_3V! zMUm_r2jW&Ri!4Mp!jQyB!i0%3F)oBbB%`2-Gomg89f^^E8X;s6O%|C&{y6Wwy61c@ zs=9l6($n2F)34JZ^F1z9z4vb2^VK=`{HwAA$-u<>3bM`Tmhe8Kur>U>7GSS%oybAM z2c3w4*@5yByCz~lHyoH35+iMEm-k)}th@cA=vhnsSwYCG|K&2t?On4Mk6jZ1P${?! zlr#x5!x_i`W*Zcw{ng7TA{8SQXdqG25sB66_sKia$tP)_{uG%386aU8B!oGgJ2FFy-Z=@{ z^)ORn>OcXCFWxIDrPp3j96hT1=*QH7riPlE!mH-RrQ+(m?tY!C7~_a|kxEexMCSM2 zqfnD1b*)Ly|6OtHo9b@pn;bXz}<&)+T0Iz@I$N%O9$|48kf|7mvmv|@Et7cm7W zZJ2+_SQmUhi3BL|bq%$9jz}2_NfD`Nsfpj@9~*Xa?qh6)d52K_T#)J`7(!#^m?Up$ETBtlWY} z_VWU)9-^~`Q&FmqNqH3>ZX9z{QWTeJWI$%Fk7%7TLfJZ{I(3n1lDbTFfBb{umYWrz z8E9^%&RtVbXQpu9WWEd0$ac6iJ@HbQlY|u-1-v)7A;C^;oHp)*Iu zyT-l~ae=v$TcU&T5u)2yr_iOyIA7LviG#QymhX{m~D-=G9BC=a-r1*wuh621) z{OEn?Kd(?8`#y2|9Zb@h*bPXcSlRZP`$9z0rg6Cda|_fGfNtq99Qgu%_%N01jna%% zZo9_9iCn3`>PaP0m%%HgPG~Rvi{)eAK%cl1J^vTdoo0!N9kb_Ah1ITwXRC78fCOxv zoZNAszI_pW=ezjRC()~~;buUkxhRn&PzD!%B`k=D`bcZN2Wu9XIcjr?7u+W#5E1By z52J@3hnHW%z2X$`MA;~9e*cg*|X%AzY0%2MH-|#uE13BsE`deqx0=O)K*xKX+fHk zKG^o3eoLPC8TH3cPym;c?kIzFC$kH3*w78@?Q+A$l~-l&;~I2BceE2sfMs7o>ib=#F5z#! zMLF|J@}cA8`SV03ZWAUnT(+qs+v{fC$UPzwsI`zS2xgdp&*#{=XW`MGkiYslku!>e z*8=J*L0>b;1(1M|MAoufM>N2zuoqs$j(?B#%x|a{F7$a34q0hxOzI4U_0f6n<=>Dk zM|kW$Rd7&}0>Aw>x|>!gfBiE6;YJ-2lt?HJa?u(rQAmq^(FJJanx5*erw?1WnM;M; z=+`d}*A@`X=&Pjdu^$f@u00^?V7zSbL4O!}@NoSVj)R8lL=GCR6FF%3KNkhs3rEOb Q3;+NC07*qoM6N<$f&qZ+)&Kwi literal 0 HcmV?d00001 diff --git a/apps/frontend/src/app/(site)/analytics/page.tsx b/apps/frontend/src/app/(site)/analytics/page.tsx index 9d98beeb..16d5d8da 100644 --- a/apps/frontend/src/app/(site)/analytics/page.tsx +++ b/apps/frontend/src/app/(site)/analytics/page.tsx @@ -1,10 +1,12 @@ +import { isGeneral } from '@gitroom/react/helpers/is.general'; + export const dynamic = 'force-dynamic'; import {AnalyticsComponent} from "@gitroom/frontend/components/analytics/analytics.component"; import {Metadata} from "next"; export const metadata: Metadata = { - title: 'Gitroom Analytics', + title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Analytics`, description: '', } diff --git a/apps/frontend/src/app/(site)/billing/lifetime/page.tsx b/apps/frontend/src/app/(site)/billing/lifetime/page.tsx index 3d9aa7a8..8df7e829 100644 --- a/apps/frontend/src/app/(site)/billing/lifetime/page.tsx +++ b/apps/frontend/src/app/(site)/billing/lifetime/page.tsx @@ -3,9 +3,10 @@ import { LifetimeDeal } from '@gitroom/frontend/components/billing/lifetime.deal export const dynamic = 'force-dynamic'; import { Metadata } from 'next'; +import { isGeneral } from '@gitroom/react/helpers/is.general'; export const metadata: Metadata = { - title: 'Gitroom Lifetime deal', + title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Lifetime deal`, description: '', }; diff --git a/apps/frontend/src/app/(site)/billing/page.tsx b/apps/frontend/src/app/(site)/billing/page.tsx index a27a4fd4..d7a9722c 100644 --- a/apps/frontend/src/app/(site)/billing/page.tsx +++ b/apps/frontend/src/app/(site)/billing/page.tsx @@ -1,10 +1,12 @@ +import { isGeneral } from '@gitroom/react/helpers/is.general'; + export const dynamic = 'force-dynamic'; import { BillingComponent } from '@gitroom/frontend/components/billing/billing.component'; import { Metadata } from 'next'; export const metadata: Metadata = { - title: 'Gitroom Billing', + title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Billing`, description: '', }; diff --git a/apps/frontend/src/app/(site)/integrations/social/[provider]/page.tsx b/apps/frontend/src/app/(site)/integrations/social/[provider]/page.tsx index 536ad5b8..d2679c36 100644 --- a/apps/frontend/src/app/(site)/integrations/social/[provider]/page.tsx +++ b/apps/frontend/src/app/(site)/integrations/social/[provider]/page.tsx @@ -15,6 +15,7 @@ export default async function Page({ ...searchParams, state: searchParams.oauth_token || '', code: searchParams.oauth_verifier || '', + refresh: searchParams.refresh || '', }; } @@ -25,7 +26,7 @@ export default async function Page({ }) ).json(); - if (inBetweenSteps) { + if (inBetweenSteps && !searchParams.refresh) { return redirect(`/launches?added=${provider}&continue=${id}`); } diff --git a/apps/frontend/src/app/(site)/launches/page.tsx b/apps/frontend/src/app/(site)/launches/page.tsx index d91acb1d..2c3b5948 100644 --- a/apps/frontend/src/app/(site)/launches/page.tsx +++ b/apps/frontend/src/app/(site)/launches/page.tsx @@ -1,10 +1,12 @@ +import { isGeneral } from '@gitroom/react/helpers/is.general'; + export const dynamic = 'force-dynamic'; import {LaunchesComponent} from "@gitroom/frontend/components/launches/launches.component"; import {Metadata} from "next"; export const metadata: Metadata = { - title: 'Gitroom Launches', + title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Launches`, description: '', } diff --git a/apps/frontend/src/app/(site)/marketplace/buyer/page.tsx b/apps/frontend/src/app/(site)/marketplace/buyer/page.tsx index 3f09e89b..a67c2404 100644 --- a/apps/frontend/src/app/(site)/marketplace/buyer/page.tsx +++ b/apps/frontend/src/app/(site)/marketplace/buyer/page.tsx @@ -2,9 +2,10 @@ import { Buyer } from '@gitroom/frontend/components/marketplace/buyer'; export const dynamic = 'force-dynamic'; import { Metadata } from 'next'; +import { isGeneral } from '@gitroom/react/helpers/is.general'; export const metadata: Metadata = { - title: 'Gitroom Marketplace', + title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Marketplace`, description: '', }; export default async function Index({ diff --git a/apps/frontend/src/app/(site)/marketplace/page.tsx b/apps/frontend/src/app/(site)/marketplace/page.tsx index 665b9cd4..f6d3302a 100644 --- a/apps/frontend/src/app/(site)/marketplace/page.tsx +++ b/apps/frontend/src/app/(site)/marketplace/page.tsx @@ -1,10 +1,12 @@ +import { isGeneral } from '@gitroom/react/helpers/is.general'; + export const dynamic = 'force-dynamic'; import { Metadata } from 'next'; import { cookies } from 'next/headers'; import { redirect } from 'next/navigation'; export const metadata: Metadata = { - title: 'Gitroom Marketplace', + title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Marketplace`, description: '', }; export default async function Index({ diff --git a/apps/frontend/src/app/(site)/marketplace/seller/page.tsx b/apps/frontend/src/app/(site)/marketplace/seller/page.tsx index c9377f6a..dee662a4 100644 --- a/apps/frontend/src/app/(site)/marketplace/seller/page.tsx +++ b/apps/frontend/src/app/(site)/marketplace/seller/page.tsx @@ -2,9 +2,10 @@ import { Seller } from '@gitroom/frontend/components/marketplace/seller'; export const dynamic = 'force-dynamic'; import { Metadata } from 'next'; +import { isGeneral } from '@gitroom/react/helpers/is.general'; export const metadata: Metadata = { - title: 'Gitroom Marketplace', + title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Marketplace`, description: '', }; export default async function Index({ diff --git a/apps/frontend/src/app/(site)/messages/[id]/page.tsx b/apps/frontend/src/app/(site)/messages/[id]/page.tsx index f4d65941..a416877d 100644 --- a/apps/frontend/src/app/(site)/messages/[id]/page.tsx +++ b/apps/frontend/src/app/(site)/messages/[id]/page.tsx @@ -3,9 +3,10 @@ import { Messages } from '@gitroom/frontend/components/messages/messages'; export const dynamic = 'force-dynamic'; import { Metadata } from 'next'; +import { isGeneral } from '@gitroom/react/helpers/is.general'; export const metadata: Metadata = { - title: 'Gitroom Messages', + title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Messages`, description: '', }; diff --git a/apps/frontend/src/app/(site)/messages/page.tsx b/apps/frontend/src/app/(site)/messages/page.tsx index f089ccce..c0525d21 100644 --- a/apps/frontend/src/app/(site)/messages/page.tsx +++ b/apps/frontend/src/app/(site)/messages/page.tsx @@ -1,9 +1,11 @@ +import { isGeneral } from '@gitroom/react/helpers/is.general'; + export const dynamic = 'force-dynamic'; import {Metadata} from "next"; export const metadata: Metadata = { - title: 'Gitroom Messages', + title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Messages`, description: '', } diff --git a/apps/frontend/src/app/(site)/settings/page.tsx b/apps/frontend/src/app/(site)/settings/page.tsx index 9abcf79a..6979dfd2 100644 --- a/apps/frontend/src/app/(site)/settings/page.tsx +++ b/apps/frontend/src/app/(site)/settings/page.tsx @@ -1,3 +1,5 @@ +import { isGeneral } from '@gitroom/react/helpers/is.general'; + export const dynamic = 'force-dynamic'; import { SettingsComponent } from '@gitroom/frontend/components/settings/settings.component'; @@ -7,7 +9,7 @@ import { RedirectType } from 'next/dist/client/components/redirect'; import { Metadata } from 'next'; export const metadata: Metadata = { - title: 'Gitroom Settings', + title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Settings`, description: '', }; export default async function Index({ diff --git a/apps/frontend/src/app/auth/forgot/[token]/page.tsx b/apps/frontend/src/app/auth/forgot/[token]/page.tsx index 48c581fa..44f4ddd5 100644 --- a/apps/frontend/src/app/auth/forgot/[token]/page.tsx +++ b/apps/frontend/src/app/auth/forgot/[token]/page.tsx @@ -1,10 +1,12 @@ +import { isGeneral } from '@gitroom/react/helpers/is.general'; + export const dynamic = 'force-dynamic'; import { ForgotReturn } from '@gitroom/frontend/components/auth/forgot-return'; import { Metadata } from 'next'; export const metadata: Metadata = { - title: 'Gitroom Forgot Password', + title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Forgot Password`, description: '', }; export default async function Auth(params: { params: { token: string } }) { diff --git a/apps/frontend/src/app/auth/forgot/page.tsx b/apps/frontend/src/app/auth/forgot/page.tsx index 8fd78ab3..8518e18e 100644 --- a/apps/frontend/src/app/auth/forgot/page.tsx +++ b/apps/frontend/src/app/auth/forgot/page.tsx @@ -1,10 +1,12 @@ +import { isGeneral } from '@gitroom/react/helpers/is.general'; + export const dynamic = 'force-dynamic'; import {Forgot} from "@gitroom/frontend/components/auth/forgot"; import {Metadata} from "next"; export const metadata: Metadata = { - title: 'Gitroom Forgot Password', + title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Forgot Password`, description: '', }; diff --git a/apps/frontend/src/app/auth/login/page.tsx b/apps/frontend/src/app/auth/login/page.tsx index 36c26a87..eb40cada 100644 --- a/apps/frontend/src/app/auth/login/page.tsx +++ b/apps/frontend/src/app/auth/login/page.tsx @@ -1,10 +1,12 @@ +import { isGeneral } from '@gitroom/react/helpers/is.general'; + export const dynamic = 'force-dynamic'; import {Login} from "@gitroom/frontend/components/auth/login"; import {Metadata} from "next"; export const metadata: Metadata = { - title: 'Gitroom Login', + title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Login`, description: '', }; diff --git a/apps/frontend/src/app/auth/page.tsx b/apps/frontend/src/app/auth/page.tsx index 1a052183..756d3fa2 100644 --- a/apps/frontend/src/app/auth/page.tsx +++ b/apps/frontend/src/app/auth/page.tsx @@ -1,10 +1,12 @@ +import { isGeneral } from '@gitroom/react/helpers/is.general'; + export const dynamic = 'force-dynamic'; import { Register } from '@gitroom/frontend/components/auth/register'; import { Metadata } from 'next'; export const metadata: Metadata = { - title: 'Gitroom Register', + title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Register`, description: '', }; diff --git a/apps/frontend/src/components/billing/faq.component.tsx b/apps/frontend/src/components/billing/faq.component.tsx index 267cf73b..dc82aa97 100644 --- a/apps/frontend/src/components/billing/faq.component.tsx +++ b/apps/frontend/src/components/billing/faq.component.tsx @@ -1,11 +1,12 @@ import { FC, useCallback, useState } from 'react'; import clsx from 'clsx'; import interClass from '@gitroom/react/helpers/inter.font'; +import { isGeneral } from '@gitroom/react/helpers/is.general'; const list = [ { title: 'What are channels?', - description: `Gitroom allows you to schedule your posts between different channels. + description: `${isGeneral() ? 'Postiz' : 'Gitroom'} allows you to schedule your posts between different channels. A channel is a publishing platform where you can schedule your posts. For example, you can schedule your posts on Twitter, Linkedin, DEV and Hashnode`, }, @@ -13,31 +14,9 @@ For example, you can schedule your posts on Twitter, Linkedin, DEV and Hashnode` title: 'What are team members?', description: `If you have a team with multiple members, you can invite them to your workspace to collaborate on your posts and add their personal channels`, }, - { - title: 'What do I need to import content from channels?', - description: `Gitroom can help you schedule your launch, but you might write your content on other platforms such as Notion, Google Docs, etc. -You may experience problems copy your content with different formats or uploaded images. -That's why we have a feature to import your content from different platforms. -`, - }, - { - title: 'What can I find in the community features?', - description: `Gitroom is all about the community, You can enjoy features such as: exchanging posts with other members, -exchanging links as part of the "Gitroom Friends" and buy social media services from other members`, - }, { title: 'What is AI auto-complete?', - description: `We automate ChatGPT to help you write your social posts based on the articles you schedule`, - }, - { - title: 'Why would I want to become featured by Gitroom?', - description: `Gitroom will feature your posts on our social media platforms and our website to help you get more exposure and followers`, - }, - { - title: 'Can I get everything for free?', - description: `Gitroom is 100% open-source, you can deploy it on your own server and use it for free. -However, you might not be able to enjoy the community features Click here for the open-source -`, + description: `We automate ChatGPT to help you write your social posts and articles`, }, ]; diff --git a/apps/frontend/src/components/billing/lifetime.deal.tsx b/apps/frontend/src/components/billing/lifetime.deal.tsx index 3c25afcf..3a967037 100644 --- a/apps/frontend/src/components/billing/lifetime.deal.tsx +++ b/apps/frontend/src/components/billing/lifetime.deal.tsx @@ -54,7 +54,7 @@ export const LifetimeDeal = () => { const currentPricing = user?.tier; const channelsOr = currentPricing.channel; const list = []; - list.push(`${channelsOr} ${channelsOr === 1 ? 'channel' : 'channels'}`); + list.push(`${user.totalChannels} ${user.totalChannels === 1 ? 'channel' : 'channels'}`); list.push( `${ currentPricing.posts_per_month > 10000 @@ -66,20 +66,8 @@ export const LifetimeDeal = () => { list.push(`Unlimited team members`); } - if (currentPricing.import_from_channels) { - list.push(`Import content from channels (coming soon)`); - } - - if (currentPricing.community_features) { - list.push(`Community features (coming soon)`); - } - if (currentPricing.ai) { - list.push(`AI auto-complete (coming soon)`); - } - - if (currentPricing.featured_by_gitroom) { - list.push(`Become featured by Gitroom (coming soon)`); + list.push(`AI auto-complete`); } return list; @@ -104,22 +92,10 @@ export const LifetimeDeal = () => { list.push(`Unlimited team members`); } - if (currentPricing.import_from_channels) { - list.push(`Import content from channels (coming soon)`); - } - - if (currentPricing.community_features) { - list.push(`Community features (coming soon)`); - } - if (currentPricing.ai) { list.push(`AI auto-complete`); } - if (currentPricing.featured_by_gitroom) { - list.push(`Become featured by Gitroom (coming soon)`); - } - return list; }, [user, nextPackage]); @@ -136,7 +112,7 @@ export const LifetimeDeal = () => {
- Current Package: {user?.tier?.current} + Current Package: {user?.totalChannels > 8 ? 'EXTRA' : user?.tier?.current}
@@ -162,51 +138,55 @@ export const LifetimeDeal = () => {
- {user?.tier?.current !== 'PRO' && ( -
-
Next Package: {nextPackage}
+
+
+ Next Package:{' '} + {user?.tier?.current === 'PRO' ? 'EXTRA' : !user?.tier?.current ? 'FREE' : user?.tier?.current === 'STANDARD' ? 'PRO' : 'STANDARD'} +
-
- {nextFeature.map((feature) => ( -
-
- - - -
-
{feature}
-
- ))} - -
-
- setCode(e.target.value)} - /> -
+
+ {(user?.tier?.current === 'PRO' + ? [`${(user?.totalChannels || 0) + 5} channels`] + : nextFeature + ).map((feature) => ( +
- + + +
+
{feature}
+
+ ))} + +
+
+ setCode(e.target.value)} + /> +
+
+
- )} +
); }; diff --git a/apps/frontend/src/components/billing/main.billing.component.tsx b/apps/frontend/src/components/billing/main.billing.component.tsx index a30a56fe..e6d05177 100644 --- a/apps/frontend/src/components/billing/main.billing.component.tsx +++ b/apps/frontend/src/components/billing/main.billing.component.tsx @@ -104,20 +104,8 @@ export const Features: FC<{ list.push(`Unlimited team members`); } - if (currentPricing.import_from_channels) { - list.push(`Import content from channels (coming soon)`); - } - - if (currentPricing.community_features) { - list.push(`Community features (coming soon)`); - } - if (currentPricing.ai) { - list.push(`AI auto-complete (coming soon)`); - } - - if (currentPricing.featured_by_gitroom) { - list.push(`Become featured by Gitroom (coming soon)`); + list.push(`AI auto-complete`); } return list; diff --git a/apps/frontend/src/components/launches/calendar.tsx b/apps/frontend/src/components/launches/calendar.tsx index faa51302..b32e0580 100644 --- a/apps/frontend/src/components/launches/calendar.tsx +++ b/apps/frontend/src/components/launches/calendar.tsx @@ -274,7 +274,6 @@ const CalendarColumnRender: FC<{ day: number; hour: string }> = (props) => { })); const getIntegration = useCallback(async (post: Post & { integration: Integration }) => { - console.log('hello'); return ( await fetch( `/integrations/${post.integration.id}?order=${post.submittedForOrderId}`, @@ -345,7 +344,7 @@ const CalendarColumnRender: FC<{ day: number; hour: string }> = (props) => { title: ``, }); }, - [] + [integrations] ); const addModal = useCallback(() => { @@ -366,7 +365,7 @@ const CalendarColumnRender: FC<{ day: number; hour: string }> = (props) => { size: '80%', // title: `Adding posts for ${getDate.format('DD/MM/YYYY HH:mm')}`, }); - }, []); + }, [integrations]); const addProvider = useAddProvider(); diff --git a/apps/frontend/src/components/launches/helpers/use.custom.provider.function.ts b/apps/frontend/src/components/launches/helpers/use.custom.provider.function.ts index 8b903436..9e990aad 100644 --- a/apps/frontend/src/components/launches/helpers/use.custom.provider.function.ts +++ b/apps/frontend/src/components/launches/helpers/use.custom.provider.function.ts @@ -7,16 +7,20 @@ export const useCustomProviderFunction = () => { const fetch = useFetch(); const get = useCallback( async (funcName: string, customData?: any) => { - return ( - await fetch('/integrations/function', { - method: 'POST', - body: JSON.stringify({ - name: funcName, - id: integration?.id!, - data: customData, - }), - }) - ).json(); + const load = await fetch('/integrations/function', { + method: 'POST', + body: JSON.stringify({ + name: funcName, + id: integration?.id!, + data: customData, + }), + }); + + if (load.status !== 200 && load.status !== 201) { + throw new Error('Failed to fetch'); + } + + return load.json(); }, [integration] ); diff --git a/apps/frontend/src/components/launches/launches.component.tsx b/apps/frontend/src/components/launches/launches.component.tsx index 5069a909..534c9086 100644 --- a/apps/frontend/src/components/launches/launches.component.tsx +++ b/apps/frontend/src/components/launches/launches.component.tsx @@ -15,6 +15,7 @@ import { useUser } from '../layout/user.context'; import { Menu } from '@gitroom/frontend/components/launches/menu/menu'; import { GeneratorComponent } from '@gitroom/frontend/components/launches/generator/generator'; import { useRouter } from 'next/navigation'; +import { Integration } from '@prisma/client'; export const LaunchesComponent = () => { const fetch = useFetch(); @@ -60,9 +61,25 @@ export const LaunchesComponent = () => { } }, []); - const continueIntegration = useCallback((integration: any) => async () => { - router.push(`/launches?added=${integration.identifier}&continue=${integration.id}`); - }, []); + const continueIntegration = useCallback( + (integration: any) => async () => { + router.push( + `/launches?added=${integration.identifier}&continue=${integration.id}` + ); + }, + [] + ); + + const refreshChannel = useCallback( + (integration: Integration & {identifier: string}) => async () => { + const {url} = await (await fetch(`/integrations/social/${integration.identifier}?refresh=${integration.internalId}`, { + method: 'GET', + })).json(); + + window.location.href = url; + }, + [] + ); useEffect(() => { if (typeof window !== 'undefined' && window.opener) { @@ -87,6 +104,11 @@ export const LaunchesComponent = () => { )} {sortedIntegrations.map((integration) => (
@@ -96,8 +118,16 @@ export const LaunchesComponent = () => { integration.disabled && 'opacity-50' )} > - {integration.inBetweenSteps && ( -
+ {(integration.inBetweenSteps || + integration.refreshNeeded) && ( +
!
diff --git a/apps/frontend/src/components/launches/providers/continue-provider/facebook/facebook.continue.tsx b/apps/frontend/src/components/launches/providers/continue-provider/facebook/facebook.continue.tsx index d4f7879a..e51c5e6a 100644 --- a/apps/frontend/src/components/launches/providers/continue-provider/facebook/facebook.continue.tsx +++ b/apps/frontend/src/components/launches/providers/continue-provider/facebook/facebook.continue.tsx @@ -6,15 +6,23 @@ import { Button } from '@gitroom/react/form/button'; import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; import { useIntegration } from '@gitroom/frontend/components/launches/helpers/use.integration'; -export const FacebookContinue: FC<{closeModal: () => void, existingId: string[]}> = (props) => { +export const FacebookContinue: FC<{ + closeModal: () => void; + existingId: string[]; +}> = (props) => { const { closeModal, existingId } = props; const call = useCustomProviderFunction(); const { integration } = useIntegration(); const [page, setSelectedPage] = useState(null); const fetch = useFetch(); - const loadPages = useCallback(() => { - return call.get('pages'); + const loadPages = useCallback(async () => { + try { + const pages = await call.get('pages'); + return pages; + } catch (e) { + closeModal(); + } }, []); const setPage = useCallback( @@ -44,7 +52,9 @@ export const FacebookContinue: FC<{closeModal: () => void, existingId: string[]} }, [integration, page]); const filteredData = useMemo(() => { - return data?.filter((p: { id: string }) => !existingId.includes(p.id)) || []; + return ( + data?.filter((p: { id: string }) => !existingId.includes(p.id)) || [] + ); }, [data]); return ( diff --git a/apps/frontend/src/components/launches/providers/continue-provider/instagram/instagram.continue.tsx b/apps/frontend/src/components/launches/providers/continue-provider/instagram/instagram.continue.tsx index 71a7d1ce..7225635c 100644 --- a/apps/frontend/src/components/launches/providers/continue-provider/instagram/instagram.continue.tsx +++ b/apps/frontend/src/components/launches/providers/continue-provider/instagram/instagram.continue.tsx @@ -13,15 +13,23 @@ export const InstagramContinue: FC<{ const { closeModal, existingId } = props; const call = useCustomProviderFunction(); const { integration } = useIntegration(); - const [page, setSelectedPage] = useState(null); + const [page, setSelectedPage] = useState(null); const fetch = useFetch(); - const loadPages = useCallback(() => { - return call.get('pages'); + const loadPages = useCallback(async () => { + try { + const pages = await call.get('pages'); + return pages; + } catch (e) { + closeModal(); + } }, []); const setPage = useCallback( - (param: {id: string, pageId: string}) => () => { + (param: { id: string; pageId: string }) => () => { setSelectedPage(param); }, [] diff --git a/apps/frontend/src/components/launches/providers/continue-provider/list.tsx b/apps/frontend/src/components/launches/providers/continue-provider/list.tsx index 4c9f59d7..0bec9f55 100644 --- a/apps/frontend/src/components/launches/providers/continue-provider/list.tsx +++ b/apps/frontend/src/components/launches/providers/continue-provider/list.tsx @@ -3,5 +3,5 @@ import { FacebookContinue } from '@gitroom/frontend/components/launches/provider export const continueProviderList = { instagram: InstagramContinue, - facebook: FacebookContinue, + facebook: FacebookContinue } \ No newline at end of file diff --git a/apps/frontend/src/components/launches/providers/show.all.providers.tsx b/apps/frontend/src/components/launches/providers/show.all.providers.tsx index 85a62f5c..0df12fd5 100644 --- a/apps/frontend/src/components/launches/providers/show.all.providers.tsx +++ b/apps/frontend/src/components/launches/providers/show.all.providers.tsx @@ -8,6 +8,8 @@ import MediumProvider from "@gitroom/frontend/components/launches/providers/medi import HashnodeProvider from "@gitroom/frontend/components/launches/providers/hashnode/hashnode.provider"; import FacebookProvider from '@gitroom/frontend/components/launches/providers/facebook/facebook.provider'; import InstagramProvider from '@gitroom/frontend/components/launches/providers/instagram/instagram.provider'; +import YoutubeProvider from '@gitroom/frontend/components/launches/providers/youtube/youtube.provider'; +import TiktokProvider from '@gitroom/frontend/components/launches/providers/tiktok/tiktok.provider'; export const Providers = [ {identifier: 'devto', component: DevtoProvider}, @@ -18,10 +20,11 @@ export const Providers = [ {identifier: 'hashnode', component: HashnodeProvider}, {identifier: 'facebook', component: FacebookProvider}, {identifier: 'instagram', component: InstagramProvider}, + {identifier: 'youtube', component: YoutubeProvider}, + {identifier: 'tiktok', component: TiktokProvider}, ]; - export const ShowAllProviders: FC<{integrations: Integrations[], value: Array<{content: string, id?: string}>, selectedProvider?: Integrations}> = (props) => { const {integrations, value, selectedProvider} = props; return ( diff --git a/apps/frontend/src/components/launches/providers/tiktok/tiktok.provider.tsx b/apps/frontend/src/components/launches/providers/tiktok/tiktok.provider.tsx new file mode 100644 index 00000000..8aabc469 --- /dev/null +++ b/apps/frontend/src/components/launches/providers/tiktok/tiktok.provider.tsx @@ -0,0 +1,113 @@ +import { FC } from 'react'; +import { withProvider } from '@gitroom/frontend/components/launches/providers/high.order.provider'; +import { useIntegration } from '@gitroom/frontend/components/launches/helpers/use.integration'; +import { useFormatting } from '@gitroom/frontend/components/launches/helpers/use.formatting'; +import { useMediaDirectory } from '@gitroom/react/helpers/use.media.directory'; +import { + afterLinkedinCompanyPreventRemove, + linkedinCompanyPreventRemove, +} from '@gitroom/helpers/utils/linkedin.company.prevent.remove'; +import { VideoOrImage } from '@gitroom/react/helpers/video.or.image'; + +const TikTokPreview: FC = (props) => { + const { value: topValue, integration } = useIntegration(); + const mediaDir = useMediaDirectory(); + const newValues = useFormatting(topValue, { + removeMarkdown: true, + saveBreaklines: true, + beforeSpecialFunc: (text: string) => { + return linkedinCompanyPreventRemove(text); + }, + specialFunc: (text: string) => { + return afterLinkedinCompanyPreventRemove(text.slice(0, 280)); + }, + }); + + const [firstPost, ...morePosts] = newValues; + if (!firstPost) { + return null; + } + + return ( +
+
+
+ x +
+
+
{integration?.name}
+
+ CEO @ Gitroom +
+
1m
+
+
+
+
+
+        {!!firstPost?.images?.length && (
+          
+ {firstPost.images.map((image, index) => ( + + + + ))} +
+ )} +
+ {morePosts.map((p, index) => ( +
+
+ x +
+
+
{integration?.name}
+
+ CEO @ Gitroom +
+
+ {p.text} +
+ + {!!p?.images?.length && ( +
+ {p.images.map((image, index) => ( + +
+ +
+
+ ))} +
+ )} +
+
+ ))} +
+ ); +}; + +export default withProvider(null, TikTokPreview); diff --git a/apps/frontend/src/components/launches/providers/youtube/youtube.provider.tsx b/apps/frontend/src/components/launches/providers/youtube/youtube.provider.tsx new file mode 100644 index 00000000..75b90ded --- /dev/null +++ b/apps/frontend/src/components/launches/providers/youtube/youtube.provider.tsx @@ -0,0 +1,138 @@ +import { FC } from 'react'; +import { withProvider } from '@gitroom/frontend/components/launches/providers/high.order.provider'; +import { useIntegration } from '@gitroom/frontend/components/launches/helpers/use.integration'; +import { useFormatting } from '@gitroom/frontend/components/launches/helpers/use.formatting'; +import { useMediaDirectory } from '@gitroom/react/helpers/use.media.directory'; +import { + afterLinkedinCompanyPreventRemove, + linkedinCompanyPreventRemove, +} from '@gitroom/helpers/utils/linkedin.company.prevent.remove'; +import { VideoOrImage } from '@gitroom/react/helpers/video.or.image'; +import { YoutubeSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/youtube.settings.dto'; +import { useSettings } from '@gitroom/frontend/components/launches/helpers/use.values'; +import { Input } from '@gitroom/react/form/input'; +import { MediumTags } from '@gitroom/frontend/components/launches/providers/medium/medium.tags'; +import { MediaComponent } from '@gitroom/frontend/components/media/media.component'; + +const YoutubeSettings: FC = () => { + const { register, control } = useSettings(); + return ( +
+ + +
+ +
+
+ ); +}; +const YoutubePreview: FC = (props) => { + const { value: topValue, integration } = useIntegration(); + const mediaDir = useMediaDirectory(); + const newValues = useFormatting(topValue, { + removeMarkdown: true, + saveBreaklines: true, + beforeSpecialFunc: (text: string) => { + return linkedinCompanyPreventRemove(text); + }, + specialFunc: (text: string) => { + return afterLinkedinCompanyPreventRemove(text.slice(0, 280)); + }, + }); + + const [firstPost, ...morePosts] = newValues; + if (!firstPost) { + return null; + } + + return ( +
+
+
+ x +
+
+
{integration?.name}
+
+ CEO @ Gitroom +
+
1m
+
+
+
+
+
+        {!!firstPost?.images?.length && (
+          
+ {firstPost.images.map((image, index) => ( + + + + ))} +
+ )} +
+ {morePosts.map((p, index) => ( +
+
+ x +
+
+
{integration?.name}
+
+ CEO @ Gitroom +
+
+ {p.text} +
+ + {!!p?.images?.length && ( +
+ {p.images.map((image, index) => ( + +
+ +
+
+ ))} +
+ )} +
+
+ ))} +
+ ); +}; + +export default withProvider( + YoutubeSettings, + YoutubePreview, + YoutubeSettingsDto +); diff --git a/apps/frontend/src/components/layout/continue.provider.tsx b/apps/frontend/src/components/layout/continue.provider.tsx index be656d91..58bf5ecc 100644 --- a/apps/frontend/src/components/layout/continue.provider.tsx +++ b/apps/frontend/src/components/layout/continue.provider.tsx @@ -1,4 +1,4 @@ -import React, { FC, useCallback, useMemo } from 'react'; +import React, { FC, useCallback, useEffect, useMemo } from 'react'; import { useRouter, useSearchParams } from 'next/navigation'; import { TopTitle } from '@gitroom/frontend/components/launches/helpers/top.title.component'; import { continueProviderList } from '@gitroom/frontend/components/launches/providers/continue-provider/list'; @@ -38,7 +38,7 @@ export const ContinueProvider: FC = () => { if (!added) { return Null; } - return continueProviderList[added as keyof typeof continueProviderList]; + return continueProviderList[added as keyof typeof continueProviderList] || Null; }, [added]); if (!added || !continueId || !integrations) { diff --git a/apps/frontend/src/components/settings/teams.component.tsx b/apps/frontend/src/components/settings/teams.component.tsx index f1e710b9..49038e68 100644 --- a/apps/frontend/src/components/settings/teams.component.tsx +++ b/apps/frontend/src/components/settings/teams.component.tsx @@ -189,7 +189,7 @@ export const TeamsComponent = () => {

Team Members

Account Managers

- Invite your assistant or team member to manage your Gitroom account + Invite your assistant or team member to manage your account
diff --git a/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts b/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts index e7bd63fe..4c9677b6 100644 --- a/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/integrations/integration.repository.ts @@ -34,7 +34,8 @@ export class IntegrationRepository { refreshToken = '', expiresIn = 999999999, username?: string, - isBetweenSteps = false + isBetweenSteps = false, + refresh?: string ) { return this._integration.model.integration.upsert({ where: { @@ -57,15 +58,20 @@ export class IntegrationRepository { : {}), internalId, organizationId: org, + refreshNeeded: false, }, update: { type: type as any, + ...(!refresh + ? { + inBetweenSteps: isBetweenSteps, + } + : {}), name, - providerIdentifier: provider, - inBetweenSteps: isBetweenSteps, - token, picture, profile: username, + providerIdentifier: provider, + token, refreshToken, ...(expiresIn ? { tokenExpiration: new Date(Date.now() + expiresIn * 1000) } @@ -73,6 +79,7 @@ export class IntegrationRepository { internalId, organizationId: org, deletedAt: null, + refreshNeeded: false, }, }); } @@ -85,6 +92,19 @@ export class IntegrationRepository { }, inBetweenSteps: false, deletedAt: null, + refreshNeeded: false, + }, + }); + } + + refreshNeeded(org: string, id: string) { + return this._integration.model.integration.update({ + where: { + id, + organizationId: org, + }, + data: { + refreshNeeded: true, }, }); } @@ -104,7 +124,6 @@ export class IntegrationRepository { user: string, org: string ) { - console.log(id, order, user, org); const integration = await this._posts.model.post.findFirst({ where: { integrationId: id, @@ -204,7 +223,7 @@ export class IntegrationRepository { }, data: { internalId: makeId(10), - } + }, }); } diff --git a/libraries/nestjs-libraries/src/database/prisma/integrations/integration.service.ts b/libraries/nestjs-libraries/src/database/prisma/integrations/integration.service.ts index bf464f9c..d9ec0be0 100644 --- a/libraries/nestjs-libraries/src/database/prisma/integrations/integration.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/integrations/integration.service.ts @@ -3,12 +3,17 @@ import { IntegrationRepository } from '@gitroom/nestjs-libraries/database/prisma import { IntegrationManager } from '@gitroom/nestjs-libraries/integrations/integration.manager'; import { InstagramProvider } from '@gitroom/nestjs-libraries/integrations/social/instagram.provider'; import { FacebookProvider } from '@gitroom/nestjs-libraries/integrations/social/facebook.provider'; +import { SocialProvider } from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface'; +import { Integration, Organization } from '@prisma/client'; +import { NotificationService } from '@gitroom/nestjs-libraries/database/prisma/notifications/notification.service'; +import { YoutubeProvider } from '@gitroom/nestjs-libraries/integrations/social/youtube.provider'; @Injectable() export class IntegrationService { constructor( private _integrationRepository: IntegrationRepository, - private _integrationManager: IntegrationManager + private _integrationManager: IntegrationManager, + private _notificationService: NotificationService ) {} createOrUpdateIntegration( org: string, @@ -21,7 +26,8 @@ export class IntegrationService { refreshToken = '', expiresIn?: number, username?: string, - isBetweenSteps = false + isBetweenSteps = false, + refresh?: string ) { return this._integrationRepository.createOrUpdateIntegration( org, @@ -34,7 +40,8 @@ export class IntegrationService { refreshToken, expiresIn, username, - isBetweenSteps + isBetweenSteps, + refresh ); } @@ -55,6 +62,30 @@ export class IntegrationService { return this._integrationRepository.getIntegrationById(org, id); } + async refreshToken(provider: SocialProvider, refresh: string) { + try { + const { refreshToken, accessToken, expiresIn } = + await provider.refreshToken(refresh); + + if (!refreshToken || !accessToken || !expiresIn) { + return false; + } + + return { refreshToken, accessToken, expiresIn }; + } catch (e) { + return false; + } + } + + async informAboutRefreshError(orgId: string, integration: Integration) { + await this._notificationService.inAppNotification( + orgId, + `Could not refresh your ${integration.providerIdentifier} channel`, + `Could not refresh your ${integration.providerIdentifier} channel. Please go back to the system and connect it again ${process.env.FRONTEND_URL}/launches`, + true + ); + } + async refreshTokens() { const integrations = await this._integrationRepository.needsToBeRefreshed(); for (const integration of integrations) { @@ -62,8 +93,21 @@ export class IntegrationService { integration.providerIdentifier ); - const { refreshToken, accessToken, expiresIn } = - await provider.refreshToken(integration.refreshToken!); + const data = await this.refreshToken(provider, integration.refreshToken!); + + if (!data) { + await this.informAboutRefreshError( + integration.organizationId, + integration + ); + await this._integrationRepository.refreshNeeded( + integration.organizationId, + integration.id + ); + return; + } + + const { refreshToken, accessToken, expiresIn } = data; await this.createOrUpdateIntegration( integration.organizationId, @@ -117,7 +161,11 @@ export class IntegrationService { return this._integrationRepository.checkForDeletedOnceAndUpdate(org, page); } - async saveInstagram(org: string, id: string, data: { pageId: string, id: string }) { + async saveInstagram( + org: string, + id: string, + data: { pageId: string; id: string } + ) { const getIntegration = await this._integrationRepository.getIntegrationById( org, id @@ -141,6 +189,7 @@ export class IntegrationService { name: getIntegrationInformation.name, inBetweenSteps: false, token: getIntegrationInformation.access_token, + profile: getIntegrationInformation.username, }); return { success: true }; @@ -170,6 +219,7 @@ export class IntegrationService { name: getIntegrationInformation.name, inBetweenSteps: false, token: getIntegrationInformation.access_token, + profile: getIntegrationInformation.username, }); return { success: true }; diff --git a/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts b/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts index dc979553..2e250c6c 100644 --- a/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/posts/posts.repository.ts @@ -1,7 +1,7 @@ import { PrismaRepository } from '@gitroom/nestjs-libraries/database/prisma/prisma.service'; import { Injectable } from '@nestjs/common'; import { Post as PostBody } from '@gitroom/nestjs-libraries/dtos/posts/create.post.dto'; -import { APPROVED_SUBMIT_FOR_ORDER, Post } from '@prisma/client'; +import { APPROVED_SUBMIT_FOR_ORDER, Post, State } from '@prisma/client'; import { GetPostsDto } from '@gitroom/nestjs-libraries/dtos/posts/get.posts.dto'; import dayjs from 'dayjs'; import isoWeek from 'dayjs/plugin/isoWeek'; @@ -75,7 +75,7 @@ export class PostsRepository { }, { submittedForOrganizationId: orgId, - } + }, ], publishDate: { gte: startDate, @@ -163,6 +163,17 @@ export class PostsRepository { }); } + changeState(id: string, state: State) { + return this._post.model.post.update({ + where: { + id, + }, + data: { + state, + }, + }); + } + async changeDate(orgId: string, id: string, date: string) { return this._post.model.post.update({ where: { diff --git a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts index c7b0dcbb..941d41dd 100644 --- a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts @@ -89,6 +89,16 @@ export class PostsService { return; } + if (firstPost.integration?.refreshNeeded) { + await this._notificationService.inAppNotification( + firstPost.organizationId, + `We couldn't post to ${firstPost.integration?.providerIdentifier} for ${firstPost?.integration?.name}`, + `We couldn't post to ${firstPost.integration?.providerIdentifier} for ${firstPost?.integration?.name} because you need to reconnect it. Please enable it and try again.`, + true + ); + return; + } + if (firstPost.integration?.disabled) { await this._notificationService.inAppNotification( firstPost.organizationId, @@ -112,6 +122,13 @@ export class PostsService { ]); if (!finalPost?.postId || !finalPost?.releaseURL) { + await this._postRepository.changeState(firstPost.id, 'ERROR'); + await this._notificationService.inAppNotification( + firstPost.organizationId, + `Error posting on ${firstPost.integration?.providerIdentifier} for ${firstPost?.integration?.name}`, + `An error occurred while posting on ${firstPost.integration?.providerIdentifier}`, + true + ); return; } @@ -124,10 +141,11 @@ export class PostsService { }); } } catch (err: any) { + await this._postRepository.changeState(firstPost.id, 'ERROR'); await this._notificationService.inAppNotification( firstPost.organizationId, `Error posting on ${firstPost.integration?.providerIdentifier} for ${firstPost?.integration?.name}`, - `An error occurred while posting on ${firstPost.integration?.providerIdentifier}: ${err.message}`, + `An error occurred while posting on ${firstPost.integration?.providerIdentifier}`, true ); } @@ -159,10 +177,30 @@ export class PostsService { const getIntegration = this._integrationManager.getSocialIntegration( integration.providerIdentifier ); + if (!getIntegration) { return; } + if (dayjs(integration?.tokenExpiration).isBefore(dayjs())) { + const { accessToken, expiresIn, refreshToken } = + await getIntegration.refreshToken(integration.refreshToken!); + + await this._integrationService.createOrUpdateIntegration( + integration.organizationId, + integration.name, + integration.picture!, + 'social', + integration.internalId, + integration.providerIdentifier, + accessToken, + refreshToken, + expiresIn + ); + + integration.token = accessToken; + } + const newPosts = await this.updateTags(integration.organizationId, posts); const publishedPosts = await getIntegration.post( diff --git a/libraries/nestjs-libraries/src/database/prisma/schema.prisma b/libraries/nestjs-libraries/src/database/prisma/schema.prisma index e45014fc..01456f17 100644 --- a/libraries/nestjs-libraries/src/database/prisma/schema.prisma +++ b/libraries/nestjs-libraries/src/database/prisma/schema.prisma @@ -27,6 +27,7 @@ model Organization { Comments Comments[] notifications Notifications[] buyerOrganization MessagesGroup[] + usedCodes UsedCodes[] } model User { @@ -70,6 +71,8 @@ model User { model UsedCodes { id String @id @default(uuid()) code String + orgId String + organization Organization @relation(fields: [orgId], references: [id]) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt @@ -201,6 +204,7 @@ model Integration { updatedAt DateTime? @updatedAt orderItems OrderItems[] inBetweenSteps Boolean @default(false) + refreshNeeded Boolean @default(false) @@index([updatedAt]) @@index([deletedAt]) diff --git a/libraries/nestjs-libraries/src/database/prisma/subscriptions/subscription.repository.ts b/libraries/nestjs-libraries/src/database/prisma/subscriptions/subscription.repository.ts index c246c081..e2477a16 100644 --- a/libraries/nestjs-libraries/src/database/prisma/subscriptions/subscription.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/subscriptions/subscription.repository.ts @@ -159,6 +159,7 @@ export class SubscriptionRepository { await this._usedCodes.model.usedCodes.create({ data: { code, + orgId: findOrg.id, }, }); } diff --git a/libraries/nestjs-libraries/src/dtos/integrations/connect.integration.dto.ts b/libraries/nestjs-libraries/src/dtos/integrations/connect.integration.dto.ts index db2fb937..28bf4cb9 100644 --- a/libraries/nestjs-libraries/src/dtos/integrations/connect.integration.dto.ts +++ b/libraries/nestjs-libraries/src/dtos/integrations/connect.integration.dto.ts @@ -1,4 +1,4 @@ -import {IsDefined, IsString} from "class-validator"; +import { IsDefined, IsOptional, IsString } from 'class-validator'; export class ConnectIntegrationDto { @IsString() @@ -8,4 +8,8 @@ export class ConnectIntegrationDto { @IsString() @IsDefined() code: string; + + @IsString() + @IsOptional() + refresh?: string; } \ No newline at end of file diff --git a/libraries/nestjs-libraries/src/dtos/posts/create.post.dto.ts b/libraries/nestjs-libraries/src/dtos/posts/create.post.dto.ts index f4336dde..92777a35 100644 --- a/libraries/nestjs-libraries/src/dtos/posts/create.post.dto.ts +++ b/libraries/nestjs-libraries/src/dtos/posts/create.post.dto.ts @@ -8,6 +8,7 @@ import {AllProvidersSettings} from "@gitroom/nestjs-libraries/dtos/posts/provide import {MediumSettingsDto} from "@gitroom/nestjs-libraries/dtos/posts/providers-settings/medium.settings.dto"; import {HashnodeSettingsDto} from "@gitroom/nestjs-libraries/dtos/posts/providers-settings/hashnode.settings.dto"; import {RedditSettingsDto} from "@gitroom/nestjs-libraries/dtos/posts/providers-settings/reddit.dto"; +import { YoutubeSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/youtube.settings.dto'; export class EmptySettings {} export class Integration { @@ -60,6 +61,7 @@ export class Post { { value: MediumSettingsDto, name: 'medium' }, { value: HashnodeSettingsDto, name: 'hashnode' }, { value: RedditSettingsDto, name: 'reddit' }, + { value: YoutubeSettingsDto, name: 'youtube' }, ], }, }) diff --git a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/youtube.settings.dto.ts b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/youtube.settings.dto.ts new file mode 100644 index 00000000..27dbfd42 --- /dev/null +++ b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/youtube.settings.dto.ts @@ -0,0 +1,35 @@ +import { + ArrayMaxSize, + IsArray, + IsDefined, + IsOptional, + IsString, + MinLength, + ValidateNested, +} from 'class-validator'; +import { MediaDto } from '@gitroom/nestjs-libraries/dtos/media/media.dto'; +import { Type } from 'class-transformer'; + +export class YoutubeTagsSettings { + @IsString() + value: string; + + @IsString() + label: string; +} + +export class YoutubeSettingsDto { + @IsString() + @MinLength(2) + @IsDefined() + title: string; + + @IsOptional() + @ValidateNested() + @Type(() => MediaDto) + thumbnail?: MediaDto; + + @IsArray() + @IsOptional() + tags: YoutubeTagsSettings[]; +} diff --git a/libraries/nestjs-libraries/src/integrations/integration.manager.ts b/libraries/nestjs-libraries/src/integrations/integration.manager.ts index 7ff7f066..50b5c138 100644 --- a/libraries/nestjs-libraries/src/integrations/integration.manager.ts +++ b/libraries/nestjs-libraries/src/integrations/integration.manager.ts @@ -9,6 +9,8 @@ import { MediumProvider } from '@gitroom/nestjs-libraries/integrations/article/m import { ArticleProvider } from '@gitroom/nestjs-libraries/integrations/article/article.integrations.interface'; import { FacebookProvider } from '@gitroom/nestjs-libraries/integrations/social/facebook.provider'; import { InstagramProvider } from '@gitroom/nestjs-libraries/integrations/social/instagram.provider'; +import { YoutubeProvider } from '@gitroom/nestjs-libraries/integrations/social/youtube.provider'; +import { TiktokProvider } from '@gitroom/nestjs-libraries/integrations/social/tiktok.provider'; const socialIntegrationList = [ new XProvider(), @@ -16,6 +18,8 @@ const socialIntegrationList = [ new RedditProvider(), new FacebookProvider(), new InstagramProvider(), + new YoutubeProvider(), + new TiktokProvider(), ]; const articleIntegrationList = [ diff --git a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts index a4f9cf4f..a3fb41c7 100644 --- a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts @@ -5,6 +5,7 @@ import { SocialProvider, } from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; +import dayjs from 'dayjs'; export class FacebookProvider implements SocialProvider { identifier = 'facebook'; @@ -12,47 +13,25 @@ export class FacebookProvider implements SocialProvider { isBetweenSteps = true; async refreshToken(refresh_token: string): Promise { - const { access_token, expires_in, ...all } = await ( - await fetch( - 'https://graph.facebook.com/v19.0/oauth/access_token' + - '?grant_type=fb_exchange_token' + - `&client_id=${process.env.FACEBOOK_APP_ID}` + - `&client_secret=${process.env.FACEBOOK_APP_SECRET}` + - `&fb_exchange_token=${refresh_token}` - ) - ).json(); - - const { - id, - name, - picture: { - data: { url }, - }, - } = await ( - await fetch( - `https://graph.facebook.com/v19.0/me?fields=id,name,picture&access_token=${access_token}` - ) - ).json(); - return { - id, - name, - accessToken: access_token, - refreshToken: access_token, - expiresIn: expires_in, - picture: url, + refreshToken: '', + expiresIn: 0, + accessToken: '', + id: '', + name: '', + picture: '', username: '', }; } - async generateAuthUrl() { + async generateAuthUrl(refresh?: string) { const state = makeId(6); return { url: 'https://www.facebook.com/v19.0/dialog/oauth' + `?client_id=${process.env.FACEBOOK_APP_ID}` + `&redirect_uri=${encodeURIComponent( - `${process.env.FRONTEND_URL}/integrations/social/facebook` + `${process.env.FRONTEND_URL}/integrations/social/facebook${refresh ? `?refresh=${refresh}` : ''}` )}` + `&state=${state}` + '&scope=pages_show_list,business_management,pages_manage_posts,publish_video,pages_manage_engagement,pages_read_engagement', @@ -61,29 +40,51 @@ export class FacebookProvider implements SocialProvider { }; } - async authenticate(params: { code: string; codeVerifier: string }) { + async authenticate(params: { + code: string; + codeVerifier: string; + refresh?: string; + }) { const getAccessToken = await ( await fetch( - 'https://graph.facebook.com/v19.0/oauth/access_token' + + 'https://graph.facebook.com/v20.0/oauth/access_token' + `?client_id=${process.env.FACEBOOK_APP_ID}` + `&redirect_uri=${encodeURIComponent( - `${process.env.FRONTEND_URL}/integrations/social/facebook` + `${process.env.FRONTEND_URL}/integrations/social/facebook${ + params.refresh ? `?refresh=${params.refresh}` : '' + }` )}` + `&client_secret=${process.env.FACEBOOK_APP_SECRET}` + `&code=${params.code}` ) ).json(); - const { access_token, expires_in, ...all } = await ( + const { access_token } = await ( await fetch( - 'https://graph.facebook.com/v19.0/oauth/access_token' + + 'https://graph.facebook.com/v20.0/oauth/access_token' + '?grant_type=fb_exchange_token' + `&client_id=${process.env.FACEBOOK_APP_ID}` + `&client_secret=${process.env.FACEBOOK_APP_SECRET}` + - `&fb_exchange_token=${getAccessToken.access_token}` + `&fb_exchange_token=${getAccessToken.access_token}&fields=access_token,expires_in` ) ).json(); + if (params.refresh) { + const information = await this.fetchPageInformation( + access_token, + params.refresh + ); + return { + id: information.id, + name: information.name, + accessToken: information.access_token, + refreshToken: information.access_token, + expiresIn: dayjs().add(59, 'days').unix() - dayjs().unix(), + picture: information.picture, + username: information.username, + }; + } + const { id, name, @@ -101,7 +102,7 @@ export class FacebookProvider implements SocialProvider { name, accessToken: access_token, refreshToken: access_token, - expiresIn: expires_in, + expiresIn: dayjs().add(59, 'days').unix() - dayjs().unix(), picture: url, username: '', }; @@ -122,12 +123,13 @@ export class FacebookProvider implements SocialProvider { id, name, access_token, + username, picture: { data: { url }, }, } = await ( await fetch( - `https://graph.facebook.com/v20.0/${pageId}?fields=access_token,name,picture.type(large)&access_token=${accessToken}` + `https://graph.facebook.com/v20.0/${pageId}?fields=username,access_token,name,picture.type(large)&access_token=${accessToken}` ) ).json(); @@ -136,6 +138,7 @@ export class FacebookProvider implements SocialProvider { name, access_token, picture: url, + username, }; } @@ -148,7 +151,7 @@ export class FacebookProvider implements SocialProvider { let finalId = ''; let finalUrl = ''; - if ((firstPost?.media?.[0]?.path?.indexOf('mp4') || 0) > -1) { + if ((firstPost?.media?.[0]?.path?.indexOf('mp4') || -2) > -1) { const { id: videoId, permalink_url } = await ( await fetch( `https://graph.facebook.com/v20.0/${id}/videos?access_token=${accessToken}&fields=id,permalink_url`, @@ -193,7 +196,11 @@ export class FacebookProvider implements SocialProvider { }) ); - const { id: postId, permalink_url } = await ( + const { + id: postId, + permalink_url, + ...all + } = await ( await fetch( `https://graph.facebook.com/v20.0/${id}/feed?access_token=${accessToken}&fields=id,permalink_url`, { diff --git a/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts b/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts index 44a6f96c..9515792f 100644 --- a/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts @@ -6,6 +6,7 @@ import { } from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; import { timer } from '@gitroom/helpers/utils/timer'; +import dayjs from 'dayjs'; export class InstagramProvider implements SocialProvider { identifier = 'instagram'; @@ -13,57 +14,27 @@ export class InstagramProvider implements SocialProvider { isBetweenSteps = true; async refreshToken(refresh_token: string): Promise { - const { access_token, expires_in, ...all } = await ( - await fetch( - 'https://graph.facebook.com/v20.0/oauth/access_token' + - '?grant_type=fb_exchange_token' + - `&client_id=${process.env.FACEBOOK_APP_ID}` + - `&client_secret=${process.env.FACEBOOK_APP_SECRET}` + - `&fb_exchange_token=${refresh_token}` - ) - ).json(); - - const { - data: { - id, - name, - picture: { - data: { url }, - }, - }, - } = await ( - await fetch( - `https://graph.facebook.com/v20.0/me/accounts?fields=id,username,name,picture&access_token=${access_token}` - ) - ).json(); - - const { - instagram_business_account: { id: instagramId }, - } = await ( - await fetch( - `https://graph.facebook.com/v20.0/${id}?fields=instagram_business_account&access_token=${access_token}` - ) - ).json(); - return { - id: instagramId, - name, - accessToken: access_token, - refreshToken: access_token, - expiresIn: expires_in, - picture: url, + refreshToken: '', + expiresIn: 0, + accessToken: '', + id: '', + name: '', + picture: '', username: '', }; } - async generateAuthUrl() { + async generateAuthUrl(refresh?: string) { const state = makeId(6); return { url: 'https://www.facebook.com/v20.0/dialog/oauth' + `?client_id=${process.env.FACEBOOK_APP_ID}` + `&redirect_uri=${encodeURIComponent( - `${process.env.FRONTEND_URL}/integrations/social/instagram` + `${process.env.FRONTEND_URL}/integrations/social/instagram${ + refresh ? `?refresh=${refresh}` : '' + }` )}` + `&state=${state}` + `&scope=${encodeURIComponent( @@ -74,13 +45,19 @@ export class InstagramProvider implements SocialProvider { }; } - async authenticate(params: { code: string; codeVerifier: string }) { + async authenticate(params: { + code: string; + codeVerifier: string; + refresh: string; + }) { const getAccessToken = await ( await fetch( 'https://graph.facebook.com/v20.0/oauth/access_token' + `?client_id=${process.env.FACEBOOK_APP_ID}` + `&redirect_uri=${encodeURIComponent( - `${process.env.FRONTEND_URL}/integrations/social/instagram` + `${process.env.FRONTEND_URL}/integrations/social/instagram${ + params.refresh ? `?refresh=${params.refresh}` : '' + }` )}` + `&client_secret=${process.env.FACEBOOK_APP_SECRET}` + `&code=${params.code}` @@ -109,12 +86,30 @@ export class InstagramProvider implements SocialProvider { ) ).json(); + if (params.refresh) { + const findPage = (await this.pages(access_token)).find(p => p.id === params.refresh); + const information = await this.fetchPageInformation(access_token, { + id: params.refresh, + pageId: findPage?.pageId!, + }); + + return { + id: information.id, + name: information.name, + accessToken: information.access_token, + refreshToken: information.access_token, + expiresIn: dayjs().add(59, 'days').unix() - dayjs().unix(), + picture: information.picture, + username: information.username, + }; + } + return { id, name, accessToken: access_token, refreshToken: access_token, - expiresIn: expires_in, + expiresIn: dayjs().add(59, 'days').unix() - dayjs().unix(), picture: url, username: '', }; @@ -155,15 +150,15 @@ export class InstagramProvider implements SocialProvider { accessToken: string, data: { pageId: string; id: string } ) { - const { access_token } = await ( + const { access_token, ...all } = await ( await fetch( `https://graph.facebook.com/v20.0/${data.pageId}?fields=access_token,name,picture.type(large)&access_token=${accessToken}` ) ).json(); - const { id, name, profile_picture_url } = await ( + const { id, name, profile_picture_url, username } = await ( await fetch( - `https://graph.facebook.com/v20.0/${data.id}?fields=name,profile_picture_url&access_token=${accessToken}` + `https://graph.facebook.com/v20.0/${data.id}?fields=username,name,profile_picture_url&access_token=${accessToken}` ) ).json(); @@ -172,6 +167,7 @@ export class InstagramProvider implements SocialProvider { name, picture: profile_picture_url, access_token, + username, }; } @@ -303,7 +299,7 @@ export class InstagramProvider implements SocialProvider { } for (const post of theRest) { - const { id: commentId, ...all } = await ( + const { id: commentId } = await ( await fetch( `https://graph.facebook.com/v20.0/${containerIdGlobal}/comments?message=${encodeURIComponent( post.message diff --git a/libraries/nestjs-libraries/src/integrations/social/linkedin.provider.ts b/libraries/nestjs-libraries/src/integrations/social/linkedin.provider.ts index 22a701d8..44a4362e 100644 --- a/libraries/nestjs-libraries/src/integrations/social/linkedin.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/linkedin.provider.ts @@ -61,13 +61,15 @@ export class LinkedinProvider implements SocialProvider { }; } - async generateAuthUrl() { + async generateAuthUrl(refresh?: string) { const state = makeId(6); const codeVerifier = makeId(30); const url = `https://www.linkedin.com/oauth/v2/authorization?response_type=code&client_id=${ process.env.LINKEDIN_CLIENT_ID }&redirect_uri=${encodeURIComponent( - `${process.env.FRONTEND_URL}/integrations/social/linkedin` + `${process.env.FRONTEND_URL}/integrations/social/linkedin${ + refresh ? `?refresh=${refresh}` : '' + }` )}&state=${state}&scope=${encodeURIComponent( 'openid profile w_member_social r_basicprofile' )}`; @@ -78,13 +80,19 @@ export class LinkedinProvider implements SocialProvider { }; } - async authenticate(params: { code: string; codeVerifier: string }) { + async authenticate(params: { + code: string; + codeVerifier: string; + refresh?: string; + }) { const body = new URLSearchParams(); body.append('grant_type', 'authorization_code'); body.append('code', params.code); body.append( 'redirect_uri', - `${process.env.FRONTEND_URL}/integrations/social/linkedin` + `${process.env.FRONTEND_URL}/integrations/social/linkedin${ + params.refresh ? `?refresh=${params.refresh}` : '' + }` ); body.append('client_id', process.env.LINKEDIN_CLIENT_ID!); body.append('client_secret', process.env.LINKEDIN_CLIENT_SECRET!); diff --git a/libraries/nestjs-libraries/src/integrations/social/social.integrations.interface.ts b/libraries/nestjs-libraries/src/integrations/social/social.integrations.interface.ts index 711a609d..cd2b8ebc 100644 --- a/libraries/nestjs-libraries/src/integrations/social/social.integrations.interface.ts +++ b/libraries/nestjs-libraries/src/integrations/social/social.integrations.interface.ts @@ -1,7 +1,7 @@ export interface IAuthenticator { - authenticate(params: {code: string, codeVerifier: string}): Promise; + authenticate(params: {code: string, codeVerifier: string, refresh?: string}): Promise; refreshToken(refreshToken: string): Promise; - generateAuthUrl(): Promise; + generateAuthUrl(refresh?: string): Promise; } export type GenerateAuthUrlResponse = { diff --git a/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts b/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts new file mode 100644 index 00000000..540cae96 --- /dev/null +++ b/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts @@ -0,0 +1,288 @@ +import { + AuthTokenDetails, + PostDetails, + PostResponse, + SocialProvider, +} from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface'; +import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; +import dayjs from 'dayjs'; + +export class TiktokProvider implements SocialProvider { + identifier = 'tiktok'; + name = 'Tiktok'; + isBetweenSteps = false; + + async refreshToken(refresh_token: string): Promise { + return { + refreshToken: '', + expiresIn: 0, + accessToken: '', + id: '', + name: '', + picture: '', + username: '', + }; + } + + async generateAuthUrl(refresh?: string) { + const state = makeId(6); + console.log( + 'https://www.tiktok.com/v2/auth/authorize' + + `?client_key=${process.env.TIKTOK_CLIENT_ID}` + + `&redirect_uri=${encodeURIComponent( + `${ + process.env.NODE_ENV === 'development' || !process.env.NODE_ENV + ? 'https://redirectmeto.com/' + : '' + }${process.env.FRONTEND_URL}/integrations/social/tiktok${ + refresh ? `?refresh=${refresh}` : '' + }` + )}` + + `&state=${state}` + + `&response_type=code` + + `&scope=${encodeURIComponent( + 'user.info.basic,video.publish,video.upload' + )}` + ); + return { + url: + 'https://www.tiktok.com/v2/auth/authorize' + + `?client_key=${process.env.TIKTOK_CLIENT_ID}` + + `&redirect_uri=${encodeURIComponent( + `${ + process.env.NODE_ENV === 'development' || !process.env.NODE_ENV + ? 'https://redirectmeto.com/' + : '' + }${process.env.FRONTEND_URL}/integrations/social/tiktok${ + refresh ? `?refresh=${refresh}` : '' + }` + )}` + + `&state=${state}` + + `&response_type=code` + + `&scope=${encodeURIComponent( + 'user.info.basic,video.publish,video.upload' + )}`, + codeVerifier: makeId(10), + state, + }; + } + + async authenticate(params: { + code: string; + codeVerifier: string; + refresh?: string; + }) { + const getAccessToken = await ( + await fetch( + 'https://graph.facebook.com/v20.0/oauth/access_token' + + `?client_id=${process.env.FACEBOOK_APP_ID}` + + `&redirect_uri=${encodeURIComponent( + `${process.env.FRONTEND_URL}/integrations/social/facebook${ + params.refresh ? `?refresh=${params.refresh}` : '' + }` + )}` + + `&client_secret=${process.env.FACEBOOK_APP_SECRET}` + + `&code=${params.code}` + ) + ).json(); + + const { access_token } = await ( + await fetch( + 'https://graph.facebook.com/v20.0/oauth/access_token' + + '?grant_type=fb_exchange_token' + + `&client_id=${process.env.FACEBOOK_APP_ID}` + + `&client_secret=${process.env.FACEBOOK_APP_SECRET}` + + `&fb_exchange_token=${getAccessToken.access_token}&fields=access_token,expires_in` + ) + ).json(); + + if (params.refresh) { + const information = await this.fetchPageInformation( + access_token, + params.refresh + ); + return { + id: information.id, + name: information.name, + accessToken: information.access_token, + refreshToken: information.access_token, + expiresIn: dayjs().add(59, 'days').unix() - dayjs().unix(), + picture: information.picture, + username: information.username, + }; + } + + const { + id, + name, + picture: { + data: { url }, + }, + } = await ( + await fetch( + `https://graph.facebook.com/v19.0/me?fields=id,name,picture&access_token=${access_token}` + ) + ).json(); + + return { + id, + name, + accessToken: access_token, + refreshToken: access_token, + expiresIn: dayjs().add(59, 'days').unix() - dayjs().unix(), + picture: url, + username: '', + }; + } + + async pages(accessToken: string) { + const { data } = await ( + await fetch( + `https://graph.facebook.com/v20.0/me/accounts?fields=id,username,name,picture.type(large)&access_token=${accessToken}` + ) + ).json(); + + return data; + } + + async fetchPageInformation(accessToken: string, pageId: string) { + const { + id, + name, + access_token, + username, + picture: { + data: { url }, + }, + } = await ( + await fetch( + `https://graph.facebook.com/v20.0/${pageId}?fields=username,access_token,name,picture.type(large)&access_token=${accessToken}` + ) + ).json(); + + return { + id, + name, + access_token, + picture: url, + username, + }; + } + + async post( + id: string, + accessToken: string, + postDetails: PostDetails[] + ): Promise { + const [firstPost, ...comments] = postDetails; + + let finalId = ''; + let finalUrl = ''; + if ((firstPost?.media?.[0]?.path?.indexOf('mp4') || -2) > -1) { + const { id: videoId, permalink_url } = await ( + await fetch( + `https://graph.facebook.com/v20.0/${id}/videos?access_token=${accessToken}&fields=id,permalink_url`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + file_url: firstPost?.media?.[0]?.path!, + description: firstPost.message, + published: true, + }), + } + ) + ).json(); + + finalUrl = permalink_url; + finalId = videoId; + } else { + const uploadPhotos = !firstPost?.media?.length + ? [] + : await Promise.all( + firstPost.media.map(async (media) => { + const { id: photoId } = await ( + await fetch( + `https://graph.facebook.com/v20.0/${id}/photos?access_token=${accessToken}`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + url: media.url, + published: false, + }), + } + ) + ).json(); + + return { media_fbid: photoId }; + }) + ); + + const { + id: postId, + permalink_url, + ...all + } = await ( + await fetch( + `https://graph.facebook.com/v20.0/${id}/feed?access_token=${accessToken}&fields=id,permalink_url`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + ...(uploadPhotos?.length ? { attached_media: uploadPhotos } : {}), + message: firstPost.message, + published: true, + }), + } + ) + ).json(); + + finalUrl = permalink_url; + finalId = postId; + } + + const postsArray = []; + for (const comment of comments) { + const data = await ( + await fetch( + `https://graph.facebook.com/v20.0/${finalId}/comments?access_token=${accessToken}&fields=id,permalink_url`, + { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + ...(comment.media?.length + ? { attachment_url: comment.media[0].url } + : {}), + message: comment.message, + }), + } + ) + ).json(); + + postsArray.push({ + id: comment.id, + postId: data.id, + releaseURL: data.permalink_url, + status: 'success', + }); + } + return [ + { + id: firstPost.id, + postId: finalId, + releaseURL: finalUrl, + status: 'success', + }, + ...postsArray, + ]; + } +} diff --git a/libraries/nestjs-libraries/src/integrations/social/x.provider.ts b/libraries/nestjs-libraries/src/integrations/social/x.provider.ts index bf1a2e17..d866f1bb 100644 --- a/libraries/nestjs-libraries/src/integrations/social/x.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/x.provider.ts @@ -47,14 +47,16 @@ export class XProvider implements SocialProvider { }; } - async generateAuthUrl() { + async generateAuthUrl(refresh?: string) { const client = new TwitterApi({ appKey: process.env.X_API_KEY!, appSecret: process.env.X_API_SECRET!, }); const { url, oauth_token, oauth_token_secret } = await client.generateAuthLink( - process.env.FRONTEND_URL + '/integrations/social/x', + process.env.FRONTEND_URL + `/integrations/social/x${ + refresh ? `?refresh=${refresh}` : '' + }`, { authAccessType: 'write', linkMode: 'authenticate', @@ -78,6 +80,7 @@ export class XProvider implements SocialProvider { accessToken: oauth_token, accessSecret: oauth_token_secret, }); + const { accessToken, client, accessSecret } = await startingClient.login( code ); diff --git a/libraries/nestjs-libraries/src/integrations/social/youtube.provider.ts b/libraries/nestjs-libraries/src/integrations/social/youtube.provider.ts new file mode 100644 index 00000000..9fff423c --- /dev/null +++ b/libraries/nestjs-libraries/src/integrations/social/youtube.provider.ts @@ -0,0 +1,164 @@ +import { + AuthTokenDetails, + PostDetails, + PostResponse, + SocialProvider, +} from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface'; +import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; +import { google } from 'googleapis'; +import { OAuth2Client } from 'google-auth-library/build/src/auth/oauth2client'; +import * as console from 'node:console'; +import axios from 'axios'; +import { YoutubeSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/youtube.settings.dto'; + +const clientAndYoutube = () => { + const client = new google.auth.OAuth2({ + clientId: process.env.YOUTUBE_CLIENT_ID, + clientSecret: process.env.YOUTUBE_CLIENT_SECRET, + redirectUri: `${process.env.FRONTEND_URL}/integrations/social/youtube`, + }); + + const youtube = (newClient: OAuth2Client) => + google.youtube({ + version: 'v3', + auth: newClient, + }); + + const oauth2 = (newClient: OAuth2Client) => + google.oauth2({ + version: 'v2', + auth: newClient, + }); + + return { client, youtube, oauth2 }; +}; + +export class YoutubeProvider implements SocialProvider { + identifier = 'youtube'; + name = 'Youtube'; + isBetweenSteps = false; + + async refreshToken(refresh_token: string): Promise { + const { client, oauth2 } = clientAndYoutube(); + client.setCredentials({ refresh_token }); + const { credentials } = await client.refreshAccessToken(); + const user = oauth2(client); + const expiryDate = new Date(credentials.expiry_date!); + const unixTimestamp = + Math.floor(expiryDate.getTime() / 1000) - + Math.floor(new Date().getTime() / 1000); + + const { data } = await user.userinfo.get(); + + return { + accessToken: credentials.access_token!, + expiresIn: unixTimestamp!, + refreshToken: credentials.refresh_token!, + id: data.id!, + name: data.name!, + picture: data.picture!, + username: '', + }; + } + + async generateAuthUrl(refresh?: string) { + const state = makeId(6); + const { client } = clientAndYoutube(); + return { + url: client.generateAuthUrl({ + access_type: 'offline', + prompt: 'consent', + state, + redirect_uri: `${process.env.FRONTEND_URL}/integrations/social/youtube`, + scope: [ + 'https://www.googleapis.com/auth/userinfo.profile', + 'https://www.googleapis.com/auth/userinfo.email', + 'https://www.googleapis.com/auth/youtube', + 'https://www.googleapis.com/auth/youtube.force-ssl', + 'https://www.googleapis.com/auth/youtube.readonly', + 'https://www.googleapis.com/auth/youtube.upload', + 'https://www.googleapis.com/auth/youtubepartner', + ], + }), + codeVerifier: makeId(10), + state, + }; + } + + async authenticate(params: { + code: string; + codeVerifier: string; + refresh?: string; + }) { + const { client, oauth2 } = clientAndYoutube(); + const { tokens } = await client.getToken(params.code); + client.setCredentials(tokens); + const user = oauth2(client); + const { data } = await user.userinfo.get(); + + const expiryDate = new Date(tokens.expiry_date!); + const unixTimestamp = + Math.floor(expiryDate.getTime() / 1000) - + Math.floor(new Date().getTime() / 1000); + + return { + accessToken: tokens.access_token!, + expiresIn: unixTimestamp, + refreshToken: tokens.refresh_token!, + id: data.id!, + name: data.name!, + picture: data.picture!, + username: '', + }; + } + + async post( + id: string, + accessToken: string, + postDetails: PostDetails[] + ): Promise { + const [firstPost, ...comments] = postDetails; + + const { client, youtube } = clientAndYoutube(); + client.setCredentials({ access_token: accessToken }); + const youtubeClient = youtube(client); + + const { settings }: { settings: YoutubeSettingsDto } = firstPost; + + const response = await axios({ + url: firstPost?.media?.[0]?.url, + method: 'GET', + responseType: 'stream', + }); + + try { + const all = await youtubeClient.videos.insert({ + part: ['id', 'snippet', 'status'], + notifySubscribers: true, + requestBody: { + snippet: { + title: settings.title, + description: firstPost?.message, + tags: settings.tags.map((p) => p.label), + thumbnails: { + default: { + url: settings?.thumbnail?.path, + }, + }, + }, + status: { + privacyStatus: 'public', + }, + }, + media: { + body: response.data, + }, + }); + + console.log(all); + } catch (err) { + console.log(err); + } + return []; + } +} diff --git a/libraries/nestjs-libraries/src/services/stripe.service.ts b/libraries/nestjs-libraries/src/services/stripe.service.ts index a40ab775..a56da1c1 100644 --- a/libraries/nestjs-libraries/src/services/stripe.service.ts +++ b/libraries/nestjs-libraries/src/services/stripe.service.ts @@ -533,10 +533,11 @@ export class StripeService { const nextPackage = !getCurrentSubscription ? 'STANDARD' : 'PRO'; const findPricing = pricing[nextPackage]; + await this._subscriptionService.createOrUpdateSubscription( makeId(10), organizationId, - findPricing.channel!, + getCurrentSubscription?.subscriptionTier === 'PRO' ? (getCurrentSubscription.totalChannels + 5) : findPricing.channel!, nextPackage, 'MONTHLY', null, @@ -546,6 +547,7 @@ export class StripeService { return { success: true, }; + } catch (err) { console.log(err); return { diff --git a/package-lock.json b/package-lock.json index 875a1adb..5d4cad91 100644 --- a/package-lock.json +++ b/package-lock.json @@ -57,6 +57,7 @@ "cookie-parser": "^1.4.6", "copy-to-clipboard": "^3.3.3", "dayjs": "^1.11.10", + "googleapis": "^137.1.0", "ioredis": "^5.3.2", "json-to-graphql-query": "^2.2.5", "jsonwebtoken": "^9.0.2", @@ -15408,7 +15409,6 @@ "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "dev": true, "funding": [ { "type": "github", @@ -15487,6 +15487,14 @@ "node": "*" } }, + "node_modules/bignumber.js": { + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", + "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", + "engines": { + "node": "*" + } + }, "node_modules/bin-check": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz", @@ -20775,12 +20783,73 @@ "node": ">=10" } }, + "node_modules/gaxios": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-6.6.0.tgz", + "integrity": "sha512-bpOZVQV5gthH/jVCSuYuokRo2bTKOcuBiVWpjmTn6C5Agl5zclGfTljuGsQZxwwDBkli+YhZhP4TdlqTnhOezQ==", + "dependencies": { + "extend": "^3.0.2", + "https-proxy-agent": "^7.0.1", + "is-stream": "^2.0.0", + "node-fetch": "^2.6.9", + "uuid": "^9.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/gaxios/node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/gaxios/node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/gaxios/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/gcd": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/gcd/-/gcd-0.0.1.tgz", "integrity": "sha512-VNx3UEGr+ILJTiMs1+xc5SX1cMgJCrXezKPa003APUWNqQqaF6n25W8VcR7nHN6yRWbvvUTwCpZCFJeWC2kXlw==", "dev": true }, + "node_modules/gcp-metadata": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-6.1.0.tgz", + "integrity": "sha512-Jh/AIwwgaxan+7ZUUmRLCjtchyDiqh4KjBJ5tW3plBZb5iL/BPcso8A5DlzeD9qlw0duCamnNdpFjxwaT0KyKg==", + "dependencies": { + "gaxios": "^6.0.0", + "json-bigint": "^1.0.0" + }, + "engines": { + "node": ">=14" + } + }, "node_modules/generic-pool": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/generic-pool/-/generic-pool-3.9.0.tgz", @@ -21013,6 +21082,69 @@ "node": ">= 6" } }, + "node_modules/google-auth-library": { + "version": "9.10.0", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-9.10.0.tgz", + "integrity": "sha512-ol+oSa5NbcGdDqA+gZ3G3mev59OHBZksBTxY/tYwjtcp1H/scAFwJfSQU9/1RALoyZ7FslNbke8j4i3ipwlyuQ==", + "dependencies": { + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "gaxios": "^6.1.1", + "gcp-metadata": "^6.1.0", + "gtoken": "^7.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/google-auth-library/node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/google-auth-library/node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/googleapis": { + "version": "137.1.0", + "resolved": "https://registry.npmjs.org/googleapis/-/googleapis-137.1.0.tgz", + "integrity": "sha512-2L7SzN0FLHyQtFmyIxrcXhgust77067pkkduqkbIpDuj9JzVnByxsRrcRfUMFQam3rQkWW2B0f1i40IwKDWIVQ==", + "dependencies": { + "google-auth-library": "^9.0.0", + "googleapis-common": "^7.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/googleapis-common": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/googleapis-common/-/googleapis-common-7.2.0.tgz", + "integrity": "sha512-/fhDZEJZvOV3X5jmD+fKxMqma5q2Q9nZNSF3kn1F18tpxmA86BcTxAGBQdM0N89Z3bEaIs+HVznSmFJEAmMTjA==", + "dependencies": { + "extend": "^3.0.2", + "gaxios": "^6.0.3", + "google-auth-library": "^9.7.0", + "qs": "^6.7.0", + "url-template": "^2.0.8", + "uuid": "^9.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/gopd": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", @@ -21097,6 +21229,37 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/gtoken": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-7.1.0.tgz", + "integrity": "sha512-pCcEwRi+TKpMlxAQObHDQ56KawURgyAf6jtIY046fJ5tIv3zDe/LEIubckAO8fj6JnAxLdmWkUfNyulQ2iKdEw==", + "dependencies": { + "gaxios": "^6.0.0", + "jws": "^4.0.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/gtoken/node_modules/jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/gtoken/node_modules/jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", + "dependencies": { + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" + } + }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -25996,6 +26159,14 @@ "node": ">=4" } }, + "node_modules/json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "dependencies": { + "bignumber.js": "^9.0.0" + } + }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", @@ -39139,6 +39310,11 @@ "requires-port": "^1.0.0" } }, + "node_modules/url-template": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/url-template/-/url-template-2.0.8.tgz", + "integrity": "sha512-XdVKMF4SJ0nP/O7XIPB0JwAEuT9lDIYnNsK8yGVe43y0AWoKeJNdv3ZNWh7ksJ6KqQFjOO6ox/VEitLnaVNufw==" + }, "node_modules/use-composed-ref": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", diff --git a/package.json b/package.json index 4d33679a..fd5e051a 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ "cookie-parser": "^1.4.6", "copy-to-clipboard": "^3.3.3", "dayjs": "^1.11.10", + "googleapis": "^137.1.0", "ioredis": "^5.3.2", "json-to-graphql-query": "^2.2.5", "jsonwebtoken": "^9.0.2", From d2ba83d0b15efec7a614acd6713f2ff123dd132c Mon Sep 17 00:00:00 2001 From: Nevo David Date: Mon, 27 May 2024 11:25:35 +0700 Subject: [PATCH 04/36] feat: more channels --- .../components/launches/add.edit.model.tsx | 44 +++++++++++++- .../components/launches/helpers/use.values.ts | 44 +++++++++++--- .../providers/high.order.provider.tsx | 10 +++- .../instagram/instagram.provider.tsx | 2 +- .../providers/youtube/youtube.provider.tsx | 6 +- .../src/components/media/media.component.tsx | 59 ++++++++++++------- 6 files changed, 133 insertions(+), 32 deletions(-) diff --git a/apps/frontend/src/components/launches/add.edit.model.tsx b/apps/frontend/src/components/launches/add.edit.model.tsx index 1417b187..4e6b7c88 100644 --- a/apps/frontend/src/components/launches/add.edit.model.tsx +++ b/apps/frontend/src/components/launches/add.edit.model.tsx @@ -45,6 +45,7 @@ import { PostToOrganization, } from '@gitroom/frontend/components/launches/post.to.organization'; import { Submitted } from '@gitroom/frontend/components/launches/submitted'; +import { capitalize } from 'lodash'; export const AddEditModal: FC<{ date: dayjs.Dayjs; @@ -241,6 +242,7 @@ export const AddEditModal: FC<{ } const values = getValues(); + const allKeys = Object.keys(values).map((v) => ({ integration: integrations.find((p) => p.id === v), value: values[v].posts, @@ -248,9 +250,46 @@ export const AddEditModal: FC<{ group: existingData?.group, trigger: values[v].trigger, settings: values[v].settings(), + firstCommentRequirements: values[v].firstCommentRequirements, + maximumMediaRequirements: values[v].maximumMediaRequirements, + minimumMediaRequirements: values[v].minimumMediaRequirements, })); for (const key of allKeys) { + // @ts-ignore + const images = key?.value[0].image; + if ( + (images?.length || 0) > (key.maximumMediaRequirements || 0) || + (images?.length || 0) < (key.minimumMediaRequirements || 0) + ) { + toaster.show( + `The amount of ${capitalize(key?.integration?.identifier)} media attached supposed to be ${ + key.maximumMediaRequirements === key.minimumMediaRequirements + ? key.minimumMediaRequirements + : `between ${key.minimumMediaRequirements} to ${key.maximumMediaRequirements}` + }`, + 'warning' + ); + return; + } + + if ( + key.firstCommentRequirements && + !images?.every((p: any) => + key.firstCommentRequirements === 'video' + ? p.name.includes('mp4') + : !p.name.includes('mp4') + ) + ) { + toaster.show( + `${capitalize(key?.integration?.identifier?.toUpperCase())} media should be a ${ + key.firstCommentRequirements === 'video' ? 'video' : 'image' + }`, + 'warning' + ); + return; + } + if (key.value.some((p) => !p.content || p.content.length < 6)) { setShowError(true); return; @@ -346,7 +385,10 @@ export const AddEditModal: FC<{ onChange={setSelectedIntegrations} /> )} -
+
{!existingData.integration && !showHide.hideTopEditor ? ( <>
You are in global editing mode
diff --git a/apps/frontend/src/components/launches/helpers/use.values.ts b/apps/frontend/src/components/launches/helpers/use.values.ts index 34ab1a50..0334285f 100644 --- a/apps/frontend/src/components/launches/helpers/use.values.ts +++ b/apps/frontend/src/components/launches/helpers/use.values.ts @@ -1,11 +1,28 @@ -import {useEffect, useMemo} from 'react'; -import {useForm, useFormContext} from 'react-hook-form'; -import {classValidatorResolver} from "@hookform/resolvers/class-validator"; +import { useEffect, useMemo } from 'react'; +import { useForm, useFormContext } from 'react-hook-form'; +import { classValidatorResolver } from '@hookform/resolvers/class-validator'; const finalInformation = {} as { - [key: string]: { posts: Array<{id?: string, content: string, media?: Array}>; settings: () => object; trigger: () => Promise; isValid: boolean }; + [key: string]: { + posts: Array<{ id?: string; content: string; media?: Array }>; + settings: () => object; + trigger: () => Promise; + isValid: boolean; + firstCommentRequirements?: 'video' | 'image'; + minimumMediaRequirements?: number; + maximumMediaRequirements?: number; + }; }; -export const useValues = (initialValues: object, integration: string, identifier: string, value: Array<{id?: string, content: string, media?: Array}>, dto: any) => { +export const useValues = ( + initialValues: object, + integration: string, + identifier: string, + value: Array<{ id?: string; content: string; media?: Array }>, + dto: any, + firstCommentRequirements?: 'video' | 'image', + minimumMediaRequirements?: number, + maximumMediaRequirements?: number +) => { const resolver = useMemo(() => { return classValidatorResolver(dto); }, [integration]); @@ -18,15 +35,28 @@ export const useValues = (initialValues: object, integration: string, identifier }); const getValues = useMemo(() => { - return () => ({...form.getValues(), __type: identifier}); + return () => ({ ...form.getValues(), __type: identifier }); }, [form, integration]); - finalInformation[integration]= finalInformation[integration] || {}; + finalInformation[integration] = finalInformation[integration] || {}; finalInformation[integration].posts = value; finalInformation[integration].isValid = form.formState.isValid; finalInformation[integration].settings = getValues; finalInformation[integration].trigger = form.trigger; + if (firstCommentRequirements) { + finalInformation[integration].firstCommentRequirements = + firstCommentRequirements; + } + if (minimumMediaRequirements) { + finalInformation[integration].minimumMediaRequirements = + minimumMediaRequirements; + } + if (maximumMediaRequirements) { + finalInformation[integration].maximumMediaRequirements = + maximumMediaRequirements; + } + useEffect(() => { return () => { delete finalInformation[integration]; diff --git a/apps/frontend/src/components/launches/providers/high.order.provider.tsx b/apps/frontend/src/components/launches/providers/high.order.provider.tsx index dc1d93b1..0ad00ab1 100644 --- a/apps/frontend/src/components/launches/providers/high.order.provider.tsx +++ b/apps/frontend/src/components/launches/providers/high.order.provider.tsx @@ -66,7 +66,10 @@ export const EditorWrapper: FC<{ children: ReactNode }> = ({ children }) => { export const withProvider = ( SettingsComponent: FC | null, PreviewComponent: FC, - dto?: any + dto?: any, + firstCommentRequirements?: 'video' | 'image', + minimumMediaRequirements?: number, + maximumMediaRequirements?: number, ) => { return (props: { identifier: string; @@ -117,7 +120,10 @@ export const withProvider = ( props.id, props.identifier, editInPlace ? InPlaceValue : props.value, - dto + dto, + firstCommentRequirements, + minimumMediaRequirements, + maximumMediaRequirements ); // change editor value diff --git a/apps/frontend/src/components/launches/providers/instagram/instagram.provider.tsx b/apps/frontend/src/components/launches/providers/instagram/instagram.provider.tsx index 4d2a0106..42f14098 100644 --- a/apps/frontend/src/components/launches/providers/instagram/instagram.provider.tsx +++ b/apps/frontend/src/components/launches/providers/instagram/instagram.provider.tsx @@ -109,4 +109,4 @@ const InstagramPreview: FC = (props) => { ); }; -export default withProvider(null, InstagramPreview); +export default withProvider(null, InstagramPreview, undefined, undefined, 1, 10); diff --git a/apps/frontend/src/components/launches/providers/youtube/youtube.provider.tsx b/apps/frontend/src/components/launches/providers/youtube/youtube.provider.tsx index 75b90ded..f925d7eb 100644 --- a/apps/frontend/src/components/launches/providers/youtube/youtube.provider.tsx +++ b/apps/frontend/src/components/launches/providers/youtube/youtube.provider.tsx @@ -22,6 +22,7 @@ const YoutubeSettings: FC = () => {
{ export default withProvider( YoutubeSettings, YoutubePreview, - YoutubeSettingsDto + YoutubeSettingsDto, + 'video', + 1, + 1 ); diff --git a/apps/frontend/src/components/media/media.component.tsx b/apps/frontend/src/components/media/media.component.tsx index aebed26b..b2507d33 100644 --- a/apps/frontend/src/components/media/media.component.tsx +++ b/apps/frontend/src/components/media/media.component.tsx @@ -50,9 +50,10 @@ export const showMediaBox = ( export const MediaBox: FC<{ setMedia: (params: { id: string; path: string }) => void; + type?: 'image' | 'video'; closeModal: () => void; }> = (props) => { - const { setMedia, closeModal } = props; + const { setMedia, type, closeModal } = props; const [pages, setPages] = useState(0); const [mediaList, setListMedia] = useState([]); const fetch = useFetch(); @@ -140,7 +141,13 @@ export const MediaBox: FC<{
)} - {mediaList.map((media) => ( -
- {media.path.indexOf('mp4') > -1 ? ( - - ) : ( - - )} -
- ))} + {mediaList + .filter((f) => { + if (type === 'video') { + return f.path.indexOf('mp4') > -1; + } else if (type === 'image') { + return f.path.indexOf('mp4') === -1; + } + return true; + }) + .map((media) => ( +
+ {media.path.indexOf('mp4') > -1 ? ( + + ) : ( + + )} +
+ ))}
@@ -340,8 +356,9 @@ export const MediaComponent: FC<{ onChange: (event: { target: { name: string; value?: { id: string; path: string } }; }) => void; + type?: 'image' | 'video'; }> = (props) => { - const { name, label, description, onChange, value } = props; + const { name, type, label, description, onChange, value } = props; const { getValues } = useSettings(); useEffect(() => { const settings = getValues()[props.name]; @@ -369,7 +386,9 @@ export const MediaComponent: FC<{ return (
- {modal && } + {modal && ( + + )}
{label}
{description}
{!!currentMedia && ( From beb4d0ef6e4b7b82492cf0e6eb597a6205fdbc0c Mon Sep 17 00:00:00 2001 From: Nevo David Date: Mon, 27 May 2024 11:42:32 +0700 Subject: [PATCH 05/36] feat: gap --- .../components/launches/providers/youtube/youtube.provider.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/frontend/src/components/launches/providers/youtube/youtube.provider.tsx b/apps/frontend/src/components/launches/providers/youtube/youtube.provider.tsx index f925d7eb..c4377bab 100644 --- a/apps/frontend/src/components/launches/providers/youtube/youtube.provider.tsx +++ b/apps/frontend/src/components/launches/providers/youtube/youtube.provider.tsx @@ -108,7 +108,7 @@ const YoutubePreview: FC = (props) => {
{!!p?.images?.length && ( -
+
{p.images.map((image, index) => ( Date: Mon, 27 May 2024 16:40:57 +0700 Subject: [PATCH 06/36] feat: logout --- .../src/api/routes/users.controller.ts | 35 +++++++++++++++++++ .../components/layout/logout.component.tsx | 19 ++++++++++ .../components/layout/settings.component.tsx | 2 ++ 3 files changed, 56 insertions(+) create mode 100644 apps/frontend/src/components/layout/logout.component.tsx diff --git a/apps/backend/src/api/routes/users.controller.ts b/apps/backend/src/api/routes/users.controller.ts index a048b748..f8623ad1 100644 --- a/apps/backend/src/api/routes/users.controller.ts +++ b/apps/backend/src/api/routes/users.controller.ts @@ -172,4 +172,39 @@ export class UsersController { response.status(200).send(); } + + @Post('/logout') + logout(@Res({ passthrough: true }) response: Response) { + response.cookie('auth', '', { + domain: + '.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname, + secure: true, + httpOnly: true, + maxAge: -1, + expires: new Date(0), + sameSite: 'none', + }); + + response.cookie('showorg', '', { + domain: + '.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname, + secure: true, + httpOnly: true, + maxAge: -1, + expires: new Date(0), + sameSite: 'none', + }); + + response.cookie('impersonate', '', { + domain: + '.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname, + secure: true, + httpOnly: true, + maxAge: -1, + expires: new Date(0), + sameSite: 'none', + }); + + response.status(200).send(); + } } diff --git a/apps/frontend/src/components/layout/logout.component.tsx b/apps/frontend/src/components/layout/logout.component.tsx new file mode 100644 index 00000000..5ff59b78 --- /dev/null +++ b/apps/frontend/src/components/layout/logout.component.tsx @@ -0,0 +1,19 @@ +import { isGeneral } from '@gitroom/react/helpers/is.general'; +import { useCallback } from 'react'; +import { deleteDialog } from '@gitroom/react/helpers/delete.dialog'; +import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; + +export const LogoutComponent = () => { + const fetch = useFetch(); + const logout = useCallback(async () => { + if (await deleteDialog('Are you sure you want to logout?', 'Yes logout')) { + await fetch('/user/logout', { + method: 'POST', + }); + + window.location.href = '/'; + } + }, []); + + return
Logout from {isGeneral() ? 'Postiz' : 'Gitroom'}
; +}; diff --git a/apps/frontend/src/components/layout/settings.component.tsx b/apps/frontend/src/components/layout/settings.component.tsx index 090b7652..eb694f27 100644 --- a/apps/frontend/src/components/layout/settings.component.tsx +++ b/apps/frontend/src/components/layout/settings.component.tsx @@ -14,6 +14,7 @@ import clsx from 'clsx'; import { TeamsComponent } from '@gitroom/frontend/components/settings/teams.component'; import { isGeneral } from '@gitroom/react/helpers/is.general'; import { useUser } from '@gitroom/frontend/components/layout/user.context'; +import { LogoutComponent } from '@gitroom/frontend/components/layout/logout.component'; export const SettingsPopup: FC<{ getRef?: Ref }> = (props) => { const { getRef } = props; @@ -187,6 +188,7 @@ export const SettingsPopup: FC<{ getRef?: Ref }> = (props) => {
)} {!!user?.tier?.team_members && isGeneral() && } +
From 6eac29789ce94deb70de07c40e346096767b9af6 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Tue, 28 May 2024 23:14:04 +0700 Subject: [PATCH 07/36] Feat: version --- .../src/integrations/social/facebook.provider.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts index a3fb41c7..37d6a6db 100644 --- a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts @@ -28,7 +28,7 @@ export class FacebookProvider implements SocialProvider { const state = makeId(6); return { url: - 'https://www.facebook.com/v19.0/dialog/oauth' + + 'https://www.facebook.com/v20.0/dialog/oauth' + `?client_id=${process.env.FACEBOOK_APP_ID}` + `&redirect_uri=${encodeURIComponent( `${process.env.FRONTEND_URL}/integrations/social/facebook${refresh ? `?refresh=${refresh}` : ''}` @@ -93,7 +93,7 @@ export class FacebookProvider implements SocialProvider { }, } = await ( await fetch( - `https://graph.facebook.com/v19.0/me?fields=id,name,picture&access_token=${access_token}` + `https://graph.facebook.com/v20.0/me?fields=id,name,picture&access_token=${access_token}` ) ).json(); From 7d3302e3b84d9623cfd18328296b2031bf8bb2f1 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Wed, 29 May 2024 21:40:10 +0700 Subject: [PATCH 08/36] feat: pinterest --- .../src/api/routes/posts.controller.ts | 1 + .../public/icons/platforms/pinterest.png | Bin 0 -> 1745 bytes apps/frontend/public/postiz-text.svg | 6 + apps/frontend/public/postiz.svg | 6 + .../components/launches/add.edit.model.tsx | 4 +- .../providers/pinterest/pinterest.board.tsx | 47 ++++ .../pinterest/pinterest.provider.tsx | 135 +++++++++++ .../launches/providers/show.all.providers.tsx | 2 + .../src/components/layout/layout.settings.tsx | 7 +- .../src/dtos/posts/create.post.dto.ts | 2 + .../all.providers.settings.ts | 6 +- .../providers-settings/dev.to.settings.dto.ts | 4 +- ...ettings.ts => dev.to.tags.settings.dto.ts} | 2 +- .../posts/providers-settings/pinterest.dto.ts | 32 +++ .../youtube.settings.dto.ts | 1 - .../src/integrations/integration.manager.ts | 2 + .../integrations/social/instagram.provider.ts | 4 +- .../integrations/social/pinterest.provider.ts | 222 ++++++++++++++++++ .../src/form/color.picker.tsx | 68 ++++++ package-lock.json | 10 + package.json | 1 + 21 files changed, 549 insertions(+), 13 deletions(-) create mode 100644 apps/frontend/public/icons/platforms/pinterest.png create mode 100644 apps/frontend/public/postiz-text.svg create mode 100644 apps/frontend/public/postiz.svg create mode 100644 apps/frontend/src/components/launches/providers/pinterest/pinterest.board.tsx create mode 100644 apps/frontend/src/components/launches/providers/pinterest/pinterest.provider.tsx rename libraries/nestjs-libraries/src/dtos/posts/providers-settings/{dev.to.tags.settings.ts => dev.to.tags.settings.dto.ts} (77%) create mode 100644 libraries/nestjs-libraries/src/dtos/posts/providers-settings/pinterest.dto.ts create mode 100644 libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts create mode 100644 libraries/react-shared-libraries/src/form/color.picker.tsx diff --git a/apps/backend/src/api/routes/posts.controller.ts b/apps/backend/src/api/routes/posts.controller.ts index 7ad68fda..8814a6b0 100644 --- a/apps/backend/src/api/routes/posts.controller.ts +++ b/apps/backend/src/api/routes/posts.controller.ts @@ -87,6 +87,7 @@ export class PostsController { @GetOrgFromRequest() org: Organization, @Body() body: CreatePostDto ) { + console.log(JSON.stringify(body, null, 2)); return this._postsService.createPost(org.id, body); } diff --git a/apps/frontend/public/icons/platforms/pinterest.png b/apps/frontend/public/icons/platforms/pinterest.png new file mode 100644 index 0000000000000000000000000000000000000000..eadb872fda2dfee1e0b793204bf284c284dfce9b GIT binary patch literal 1745 zcmV;?1}^!DP)8uIdjE9S+2PXAU|pYN`-4g zt~6XDa;4#_A!5#kQmt$hDKt*rd5I4xED)vJ$I=ne8e7K^fWM-KIiLC@p=C?(*Vkc| zmxI=%$Hz(Z_7QD6L#*pOwjITw3?Yj*qXa|*N+rRNEd0thslESRD!_6wY^v8Ylztl`>WC$tBKons`aW}ihR+E%3Tgi%No}%imJ3x4|Cf?n{+YfFh(s}?x zgb)R~TMP1H7A5plb0 zd`eb_3BZ{7mJD{sWAsK8N)95tpaCppkh=boQ~&hDkZx`qXJ-Qn4+f{4^_ z{GLnHcHbsY4hVr#Hp_NA%-VCOXgYI@FSH$_`p$KE6lsL87}|f3^!RvIy=hRjejP|} zrg{2WD~Dj?QUZ(WGqRD^*Lk<24Jpe2sQ%hImjC7#So5acrEGBnjk_O12K;$-#(Fw& zCSxvH<=Q4!0x3BWhXgen?sm!gn_tEv1ZcFfS+euT2+JK4!KF(OW^T#_P(X6^%idaYIv>RxRG<{UAZOU2a#1o)ZUY!C^$yA<+StSBiWj4du z(Mi;M*+pxIKtn^`b%_fX(P?`|o&Kr?c_zFiQ%^($kcvdIW77n~$jmzNc;0pIo;Zn0 z<=J(>#D{U6yDG3JqG*p7q9-B}!T9kLnXy%I9lq+h00?O?6}gnNMy1lc(|UNu9S+pg zAp<^_EZ%hi)T|OICXVv-gi&Vw{_pSmlSEVN~4uRsWi5lr1tjpG(P@F z&i7|FZpNU@vrR=cR*s4R5-BXwI?nCAeUvS7-z7Sg=G?B`48Hst_Cyr3axRM=+{DtK z?!*YXOZB&ZxPzV-p2v^@yrRffmrPKa6=80T^yZW&?;{l%B0V~WziwepHwiHC;w!Xo z*^0oTkPfl<_ZT5SL-;eF2APe8)X*>^t*>XszUnGMD?Xk>LfbaoPyLQF4?P50QV0ns z(F2`E5&rCISH&9d?&j!ix6<{*uSk!K=B#mIF(NJdId=1xIs3@NNZ~K|;Q>nYt|d*2 z@T!%rOK<$hF*J&f#~-Elncq|O^{*1Tp%JYdCfm<4`j59rTNgQ*+)nVll=Wi zsZex`Xys7$q4Is=WE&24$#(mHLGeUzT&*ua*Au_QD&SHp1|`T^3iAW~M53pU(IZC? za&}$m!zcj}fl5wgMgyOBt13;K&-Qi&ON(5KOB?-B{&g-Wd9%l zC)VGM!2G`k`THpTM5H7+FhKkFw-D<(kCge}uVx#?7mWaD9F-`^4P7Wo^b=2fq$J=f n`m1}5$d!g`M6NVkHAMakpNmkQVe30700000NkvXXu0mjff@n>f literal 0 HcmV?d00001 diff --git a/apps/frontend/public/postiz-text.svg b/apps/frontend/public/postiz-text.svg new file mode 100644 index 00000000..26c46d62 --- /dev/null +++ b/apps/frontend/public/postiz-text.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/frontend/public/postiz.svg b/apps/frontend/public/postiz.svg new file mode 100644 index 00000000..d2495e61 --- /dev/null +++ b/apps/frontend/public/postiz.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/apps/frontend/src/components/launches/add.edit.model.tsx b/apps/frontend/src/components/launches/add.edit.model.tsx index 4e6b7c88..a88f1e88 100644 --- a/apps/frontend/src/components/launches/add.edit.model.tsx +++ b/apps/frontend/src/components/launches/add.edit.model.tsx @@ -259,12 +259,12 @@ export const AddEditModal: FC<{ // @ts-ignore const images = key?.value[0].image; if ( - (images?.length || 0) > (key.maximumMediaRequirements || 0) || + (images?.length || 0) > (key.maximumMediaRequirements || 100000) || (images?.length || 0) < (key.minimumMediaRequirements || 0) ) { toaster.show( `The amount of ${capitalize(key?.integration?.identifier)} media attached supposed to be ${ - key.maximumMediaRequirements === key.minimumMediaRequirements + (key.maximumMediaRequirements === key.minimumMediaRequirements) || !key.maximumMediaRequirements ? key.minimumMediaRequirements : `between ${key.minimumMediaRequirements} to ${key.maximumMediaRequirements}` }`, diff --git a/apps/frontend/src/components/launches/providers/pinterest/pinterest.board.tsx b/apps/frontend/src/components/launches/providers/pinterest/pinterest.board.tsx new file mode 100644 index 00000000..40047435 --- /dev/null +++ b/apps/frontend/src/components/launches/providers/pinterest/pinterest.board.tsx @@ -0,0 +1,47 @@ +import { FC, useEffect, useState } from 'react'; +import { useCustomProviderFunction } from '@gitroom/frontend/components/launches/helpers/use.custom.provider.function'; +import { Select } from '@gitroom/react/form/select'; +import { useSettings } from '@gitroom/frontend/components/launches/helpers/use.values'; + +export const PinterestBoard: FC<{ + name: string; + onChange: (event: { target: { value: string; name: string } }) => void; +}> = (props) => { + const { onChange, name } = props; + const customFunc = useCustomProviderFunction(); + const [orgs, setOrgs] = useState(); + const { getValues } = useSettings(); + const [currentMedia, setCurrentMedia] = useState(); + + const onChangeInner = (event: { target: { value: string, name: string } }) => { + setCurrentMedia(event.target.value); + onChange(event); + }; + + useEffect(() => { + customFunc.get('boards').then((data) => setOrgs(data)); + const settings = getValues()[props.name]; + if (settings) { + setCurrentMedia(settings); + } + }, []); + + if (!orgs) { + return null; + } + + if (!orgs.length) { + return 'No boards found, you have to create a board first'; + } + + return ( + + ); +}; diff --git a/apps/frontend/src/components/launches/providers/pinterest/pinterest.provider.tsx b/apps/frontend/src/components/launches/providers/pinterest/pinterest.provider.tsx new file mode 100644 index 00000000..b883e18c --- /dev/null +++ b/apps/frontend/src/components/launches/providers/pinterest/pinterest.provider.tsx @@ -0,0 +1,135 @@ +import { FC } from 'react'; +import { withProvider } from '@gitroom/frontend/components/launches/providers/high.order.provider'; +import { useIntegration } from '@gitroom/frontend/components/launches/helpers/use.integration'; +import { useFormatting } from '@gitroom/frontend/components/launches/helpers/use.formatting'; +import { useMediaDirectory } from '@gitroom/react/helpers/use.media.directory'; +import { + afterLinkedinCompanyPreventRemove, + linkedinCompanyPreventRemove, +} from '@gitroom/helpers/utils/linkedin.company.prevent.remove'; +import { VideoOrImage } from '@gitroom/react/helpers/video.or.image'; +import { useSettings } from '@gitroom/frontend/components/launches/helpers/use.values'; +import { PinterestBoard } from '@gitroom/frontend/components/launches/providers/pinterest/pinterest.board'; +import { PinterestSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/pinterest.dto'; +import { Input } from '@gitroom/react/form/input'; +import { ColorPicker } from '@gitroom/react/form/color.picker'; + +const PinterestSettings: FC = () => { + const { register, control } = useSettings(); + return ( +
+ + + + +
+ ); +}; +const PinterestPreview: FC = (props) => { + const { value: topValue, integration } = useIntegration(); + const mediaDir = useMediaDirectory(); + const newValues = useFormatting(topValue, { + removeMarkdown: true, + saveBreaklines: true, + beforeSpecialFunc: (text: string) => { + return linkedinCompanyPreventRemove(text); + }, + specialFunc: (text: string) => { + return afterLinkedinCompanyPreventRemove(text.slice(0, 280)); + }, + }); + + const [firstPost, ...morePosts] = newValues; + if (!firstPost) { + return null; + } + + return ( +
+
+
+ x +
+
+
{integration?.name}
+
+ CEO @ Gitroom +
+
1m
+
+
+
+ {morePosts.map((p, index) => ( +
+
+ x +
+
+
{integration?.name}
+
+ CEO @ Gitroom +
+
+ {p.text} +
+ + {!!p?.images?.length && ( +
+ {p.images.map((image, index) => ( + +
+ +
+
+ ))} +
+ )} +
+
+ ))} +
+ ); +}; + +export default withProvider( + PinterestSettings, + PinterestPreview, + PinterestSettingsDto, + undefined, + 1 +); diff --git a/apps/frontend/src/components/launches/providers/show.all.providers.tsx b/apps/frontend/src/components/launches/providers/show.all.providers.tsx index 0df12fd5..a4996015 100644 --- a/apps/frontend/src/components/launches/providers/show.all.providers.tsx +++ b/apps/frontend/src/components/launches/providers/show.all.providers.tsx @@ -10,6 +10,7 @@ import FacebookProvider from '@gitroom/frontend/components/launches/providers/fa import InstagramProvider from '@gitroom/frontend/components/launches/providers/instagram/instagram.provider'; import YoutubeProvider from '@gitroom/frontend/components/launches/providers/youtube/youtube.provider'; import TiktokProvider from '@gitroom/frontend/components/launches/providers/tiktok/tiktok.provider'; +import PinterestProvider from '@gitroom/frontend/components/launches/providers/pinterest/pinterest.provider'; export const Providers = [ {identifier: 'devto', component: DevtoProvider}, @@ -22,6 +23,7 @@ export const Providers = [ {identifier: 'instagram', component: InstagramProvider}, {identifier: 'youtube', component: YoutubeProvider}, {identifier: 'tiktok', component: TiktokProvider}, + {identifier: 'pinterest', component: PinterestProvider}, ]; diff --git a/apps/frontend/src/components/layout/layout.settings.tsx b/apps/frontend/src/components/layout/layout.settings.tsx index 3a8751d1..e2ff36a8 100644 --- a/apps/frontend/src/components/layout/layout.settings.tsx +++ b/apps/frontend/src/components/layout/layout.settings.tsx @@ -27,6 +27,7 @@ import { Support } from '@gitroom/frontend/components/layout/support'; import { ContinueProvider } from '@gitroom/frontend/components/layout/continue.provider'; import { isGeneral } from '@gitroom/react/helpers/is.general'; import { Impersonate } from '@gitroom/frontend/components/layout/impersonate'; +import clsx from 'clsx'; dayjs.extend(utc); dayjs.extend(weekOfYear); @@ -62,10 +63,10 @@ export const LayoutSettings = ({ children }: { children: ReactNode }) => { {user?.admin && }
-
- Logo +
+ Logo
-
{isGeneral() ? 'Postiz' : 'Gitroom'}
+
{isGeneral() ? : 'Gitroom'}
{user?.orgId ? :
}
diff --git a/libraries/nestjs-libraries/src/dtos/posts/create.post.dto.ts b/libraries/nestjs-libraries/src/dtos/posts/create.post.dto.ts index 92777a35..c314c473 100644 --- a/libraries/nestjs-libraries/src/dtos/posts/create.post.dto.ts +++ b/libraries/nestjs-libraries/src/dtos/posts/create.post.dto.ts @@ -9,6 +9,7 @@ import {MediumSettingsDto} from "@gitroom/nestjs-libraries/dtos/posts/providers- import {HashnodeSettingsDto} from "@gitroom/nestjs-libraries/dtos/posts/providers-settings/hashnode.settings.dto"; import {RedditSettingsDto} from "@gitroom/nestjs-libraries/dtos/posts/providers-settings/reddit.dto"; import { YoutubeSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/youtube.settings.dto'; +import { PinterestSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/pinterest.dto'; export class EmptySettings {} export class Integration { @@ -62,6 +63,7 @@ export class Post { { value: HashnodeSettingsDto, name: 'hashnode' }, { value: RedditSettingsDto, name: 'reddit' }, { value: YoutubeSettingsDto, name: 'youtube' }, + { value: PinterestSettingsDto, name: 'pinterest' }, ], }, }) diff --git a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/all.providers.settings.ts b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/all.providers.settings.ts index 8801f4d9..042e3ad7 100644 --- a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/all.providers.settings.ts +++ b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/all.providers.settings.ts @@ -2,9 +2,13 @@ import { DevToSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers import { MediumSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/medium.settings.dto'; import { HashnodeSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/hashnode.settings.dto'; import { RedditSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/reddit.dto'; +import { PinterestSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/pinterest.dto'; +import { YoutubeSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/youtube.settings.dto'; export type AllProvidersSettings = | DevToSettingsDto | MediumSettingsDto | HashnodeSettingsDto - | RedditSettingsDto; + | RedditSettingsDto + | YoutubeSettingsDto + | PinterestSettingsDto; diff --git a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/dev.to.settings.dto.ts b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/dev.to.settings.dto.ts index 9cf51fa1..deb048d9 100644 --- a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/dev.to.settings.dto.ts +++ b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/dev.to.settings.dto.ts @@ -11,7 +11,7 @@ import { } from 'class-validator'; import { MediaDto } from '@gitroom/nestjs-libraries/dtos/media/media.dto'; import { Type } from 'class-transformer'; -import { DevToTagsSettings } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/dev.to.tags.settings'; +import { DevToTagsSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/dev.to.tags.settings.dto'; export class DevToSettingsDto { @IsString() @@ -42,5 +42,5 @@ export class DevToSettingsDto { @IsArray() @ArrayMaxSize(4) @IsOptional() - tags: DevToTagsSettings[]; + tags: DevToTagsSettingsDto[]; } diff --git a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/dev.to.tags.settings.ts b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/dev.to.tags.settings.dto.ts similarity index 77% rename from libraries/nestjs-libraries/src/dtos/posts/providers-settings/dev.to.tags.settings.ts rename to libraries/nestjs-libraries/src/dtos/posts/providers-settings/dev.to.tags.settings.dto.ts index f71b241e..688fb284 100644 --- a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/dev.to.tags.settings.ts +++ b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/dev.to.tags.settings.dto.ts @@ -1,6 +1,6 @@ import {IsNumber, IsString} from "class-validator"; -export class DevToTagsSettings { +export class DevToTagsSettingsDto { @IsNumber() value: number; diff --git a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/pinterest.dto.ts b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/pinterest.dto.ts new file mode 100644 index 00000000..7f3ff938 --- /dev/null +++ b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/pinterest.dto.ts @@ -0,0 +1,32 @@ +import { IsDefined, IsOptional, IsString, IsUrl, MinLength, ValidateNested } from 'class-validator'; +import { Type } from 'class-transformer'; + +export class PinterestSettingsDto { + @IsString() + @IsOptional() + title: string; + + @IsString() + @IsOptional() + description: string; + + @IsString() + @IsOptional() + @IsUrl() + link: string; + + @IsString() + @IsOptional() + dominant_color: string; + + @IsDefined({ + message: 'Board is required' + }) + @IsString({ + message: 'Board is required' + }) + @MinLength(1, { + message: 'Board is required' + }) + board: string; +} diff --git a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/youtube.settings.dto.ts b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/youtube.settings.dto.ts index 27dbfd42..d4fd7c67 100644 --- a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/youtube.settings.dto.ts +++ b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/youtube.settings.dto.ts @@ -1,5 +1,4 @@ import { - ArrayMaxSize, IsArray, IsDefined, IsOptional, diff --git a/libraries/nestjs-libraries/src/integrations/integration.manager.ts b/libraries/nestjs-libraries/src/integrations/integration.manager.ts index 50b5c138..efa47538 100644 --- a/libraries/nestjs-libraries/src/integrations/integration.manager.ts +++ b/libraries/nestjs-libraries/src/integrations/integration.manager.ts @@ -11,6 +11,7 @@ import { FacebookProvider } from '@gitroom/nestjs-libraries/integrations/social/ import { InstagramProvider } from '@gitroom/nestjs-libraries/integrations/social/instagram.provider'; import { YoutubeProvider } from '@gitroom/nestjs-libraries/integrations/social/youtube.provider'; import { TiktokProvider } from '@gitroom/nestjs-libraries/integrations/social/tiktok.provider'; +import { PinterestProvider } from '@gitroom/nestjs-libraries/integrations/social/pinterest.provider'; const socialIntegrationList = [ new XProvider(), @@ -20,6 +21,7 @@ const socialIntegrationList = [ new InstagramProvider(), new YoutubeProvider(), new TiktokProvider(), + new PinterestProvider() ]; const articleIntegrationList = [ diff --git a/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts b/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts index 9515792f..8f11cca8 100644 --- a/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts @@ -219,7 +219,7 @@ export class InstagramProvider implements SocialProvider { let containerIdGlobal = ''; let linkGlobal = ''; if (medias.length === 1) { - const { id: mediaId, ...all } = await ( + const { id: mediaId } = await ( await fetch( `https://graph.facebook.com/v20.0/${id}/media_publish?creation_id=${medias[0]}&access_token=${accessToken}&field=id`, { @@ -228,8 +228,6 @@ export class InstagramProvider implements SocialProvider { ) ).json(); - console.log(all); - containerIdGlobal = mediaId; const { permalink } = await ( diff --git a/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts b/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts new file mode 100644 index 00000000..3708702f --- /dev/null +++ b/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts @@ -0,0 +1,222 @@ +import { + AuthTokenDetails, + PostDetails, + PostResponse, + SocialProvider, +} from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface'; +import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; +import { timer } from '@gitroom/helpers/utils/timer'; +import dayjs from 'dayjs'; +import { PinterestSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/pinterest.dto'; +import axios from 'axios'; +import FormData from 'form-data'; +const form = new FormData(); + +export class PinterestProvider implements SocialProvider { + identifier = 'pinterest'; + name = 'Pinterest'; + isBetweenSteps = false; + + async refreshToken(refresh_token: string): Promise { + return { + refreshToken: '', + expiresIn: 0, + accessToken: '', + id: '', + name: '', + picture: '', + username: '', + }; + } + + async generateAuthUrl(refresh?: string) { + const state = makeId(6); + return { + url: `https://www.pinterest.com/oauth/?client_id=${ + process.env.PINTEREST_CLIENT_ID + }&redirect_uri=${encodeURIComponent( + `${process.env.FRONTEND_URL}/integrations/social/pinterest${ + refresh ? `?refresh=${refresh}` : '' + }` + )}&response_type=code&scope=${encodeURIComponent( + 'boards:read,boards:write,pins:read,pins:write,user_accounts:read' + )}&state=${state}`, + codeVerifier: makeId(10), + state, + }; + } + + async authenticate(params: { + code: string; + codeVerifier: string; + refresh: string; + }) { + const { access_token, refresh_token, expires_in } = await ( + await fetch('https://api-sandbox.pinterest.com/v5/oauth/token', { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + Authorization: `Basic ${Buffer.from( + `${process.env.PINTEREST_CLIENT_ID}:${process.env.PINTEREST_CLIENT_SECRET}` + ).toString('base64')}`, + }, + body: new URLSearchParams({ + grant_type: 'authorization_code', + code: params.code, + redirect_uri: `${process.env.FRONTEND_URL}/integrations/social/pinterest`, + }), + }) + ).json(); + + const { id, profile_image, username } = await ( + await fetch('https://api-sandbox.pinterest.com/v5/user_account', { + method: 'GET', + headers: { + Authorization: `Bearer ${access_token}`, + }, + }) + ).json(); + + return { + id: id, + name: username, + accessToken: access_token, + refreshToken: refresh_token, + expiresIn: expires_in, + picture: profile_image, + username, + }; + } + + async boards(accessToken: string) { + const { items } = await ( + await fetch('https://api-sandbox.pinterest.com/v5/boards', { + method: 'GET', + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }) + ).json(); + + return ( + items?.map((item: any) => ({ + name: item.name, + id: item.id, + })) || [] + ); + } + + async post( + id: string, + accessToken: string, + postDetails: PostDetails[] + ): Promise { + let mediaId = ''; + if ((postDetails?.[0]?.media?.[0]?.path?.indexOf('mp4') || -1) > -1) { + const { upload_url, media_id, upload_parameters } = await ( + await fetch('https://api-sandbox.pinterest.com/v5/media', { + method: 'POST', + body: JSON.stringify({ + media_type: 'video', + }), + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${accessToken}`, + }, + }) + ).json(); + + console.log(media_id, upload_url); + + try { + const { data } = await axios({ + url: postDetails?.[0]?.media?.[0]?.url, + method: 'GET', + responseType: 'stream', + }); + + const p = await ( + await fetch(upload_url, { + method: 'PUT', + body: data.buffer, + headers: { + Authorization: `Bearer ${accessToken}`, + ...upload_parameters, + }, + }) + ).json(); + + console.log(p); + } catch (err) { + console.log(err); + } + + mediaId = media_id; + } + + const mapImages = postDetails?.[0]?.media?.map((m) => ({ + url: m.url, + })); + + console.log('1'); + + try { + const { + id: pId, + link, + ...all + } = await ( + await fetch('https://api-sandbox.pinterest.com/v5/pins', { + method: 'POST', + headers: { + Authorization: `Bearer ${accessToken}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + ...(postDetails?.[0]?.settings.link + ? { link: postDetails?.[0]?.settings.link } + : {}), + ...(postDetails?.[0]?.settings.title + ? { title: postDetails?.[0]?.settings.title } + : {}), + ...(postDetails?.[0]?.settings.description + ? { title: postDetails?.[0]?.settings.description } + : {}), + ...(postDetails?.[0]?.settings.dominant_color + ? { title: postDetails?.[0]?.settings.dominant_color } + : {}), + board_id: postDetails?.[0]?.settings.board, + media_source: mediaId + ? { + source_type: 'video', + media_id: mediaId, + } + : mapImages?.length === 1 + ? { + source_type: 'image_url', + url: mapImages?.[0]?.url, + } + : { + source_type: 'multiple_image_urls', + items: mapImages, + }, + }), + }) + ).json(); + + console.log(all); + + return [ + { + id, + postId: pId, + releaseURL: link, + status: 'success', + }, + ]; + } catch (err) { + console.log(err); + return []; + } + } +} diff --git a/libraries/react-shared-libraries/src/form/color.picker.tsx b/libraries/react-shared-libraries/src/form/color.picker.tsx new file mode 100644 index 00000000..da05c09f --- /dev/null +++ b/libraries/react-shared-libraries/src/form/color.picker.tsx @@ -0,0 +1,68 @@ +import { FC, useCallback, useState } from 'react'; +import { Button } from './button'; +import { HexColorPicker } from 'react-colorful'; +import { useFormContext } from 'react-hook-form'; +import interClass from '../helpers/inter.font'; + +export const ColorPicker: FC<{ + name: string; + label: string; + enabled: boolean; + canBeCancelled: boolean; +}> = (props) => { + const { name, label, enabled, canBeCancelled } = props; + const form = useFormContext(); + const [enabledState, setEnabledState] = useState(enabled); + const color = form.register(name); + const watch = form.watch(name); + + const enable = useCallback(async () => { + await color.onChange({ target: { name, value: '#FFFFFF' } }); + setEnabledState(true); + }, []); + + const cancel = useCallback(async () => { + await color.onChange({ target: { name, value: '' } }); + setEnabledState(false); + }, []); + + if (!enabledState) { + return ( +
+ +
+ ); + } + + return ( +
+
+ {!!label &&
{label}
} +
+ {canBeCancelled && ( +
+ +
+ )} +
+
+ color.onChange({ target: { name, value } })} + /> +
+
+
+
+
+
{watch}
+
+
+
+ ); +}; diff --git a/package-lock.json b/package-lock.json index 5d4cad91..7020d979 100644 --- a/package-lock.json +++ b/package-lock.json @@ -70,6 +70,7 @@ "openai": "^4.47.1", "prisma-paginate": "^5.2.1", "react": "18.2.0", + "react-colorful": "^5.6.1", "react-dnd": "^16.0.1", "react-dnd-html5-backend": "^16.0.1", "react-dom": "18.2.0", @@ -33283,6 +33284,15 @@ "node": ">=0.10.0" } }, + "node_modules/react-colorful": { + "version": "5.6.1", + "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz", + "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==", + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, "node_modules/react-dnd": { "version": "16.0.1", "resolved": "https://registry.npmjs.org/react-dnd/-/react-dnd-16.0.1.tgz", diff --git a/package.json b/package.json index fd5e051a..b59a51dc 100644 --- a/package.json +++ b/package.json @@ -74,6 +74,7 @@ "openai": "^4.47.1", "prisma-paginate": "^5.2.1", "react": "18.2.0", + "react-colorful": "^5.6.1", "react-dnd": "^16.0.1", "react-dnd-html5-backend": "^16.0.1", "react-dom": "18.2.0", From 4e9c1817199fc6e39113798d02ad7cc71236a2bd Mon Sep 17 00:00:00 2001 From: Nevo David Date: Thu, 30 May 2024 20:04:07 +0700 Subject: [PATCH 09/36] feat: social media --- .../components/launches/add.edit.model.tsx | 44 +++----------- .../components/launches/helpers/use.values.ts | 22 ++----- .../providers/high.order.provider.tsx | 8 +-- .../instagram/instagram.provider.tsx | 8 ++- .../pinterest/pinterest.provider.tsx | 45 +++++++++++++- .../src/components/media/media.component.tsx | 10 +++- .../posts/providers-settings/pinterest.dto.ts | 3 +- .../integrations/social/facebook.provider.ts | 2 +- .../integrations/social/pinterest.provider.ts | 59 ++++++++++--------- 9 files changed, 106 insertions(+), 95 deletions(-) diff --git a/apps/frontend/src/components/launches/add.edit.model.tsx b/apps/frontend/src/components/launches/add.edit.model.tsx index a88f1e88..c3de52f1 100644 --- a/apps/frontend/src/components/launches/add.edit.model.tsx +++ b/apps/frontend/src/components/launches/add.edit.model.tsx @@ -250,44 +250,16 @@ export const AddEditModal: FC<{ group: existingData?.group, trigger: values[v].trigger, settings: values[v].settings(), - firstCommentRequirements: values[v].firstCommentRequirements, - maximumMediaRequirements: values[v].maximumMediaRequirements, - minimumMediaRequirements: values[v].minimumMediaRequirements, + checkValidity: values[v].checkValidity })); for (const key of allKeys) { - // @ts-ignore - const images = key?.value[0].image; - if ( - (images?.length || 0) > (key.maximumMediaRequirements || 100000) || - (images?.length || 0) < (key.minimumMediaRequirements || 0) - ) { - toaster.show( - `The amount of ${capitalize(key?.integration?.identifier)} media attached supposed to be ${ - (key.maximumMediaRequirements === key.minimumMediaRequirements) || !key.maximumMediaRequirements - ? key.minimumMediaRequirements - : `between ${key.minimumMediaRequirements} to ${key.maximumMediaRequirements}` - }`, - 'warning' - ); - return; - } - - if ( - key.firstCommentRequirements && - !images?.every((p: any) => - key.firstCommentRequirements === 'video' - ? p.name.includes('mp4') - : !p.name.includes('mp4') - ) - ) { - toaster.show( - `${capitalize(key?.integration?.identifier?.toUpperCase())} media should be a ${ - key.firstCommentRequirements === 'video' ? 'video' : 'image' - }`, - 'warning' - ); - return; + if (key.checkValidity) { + const check = await key.checkValidity(key?.value.map((p: any) => p.image || {path: ''})); + if (typeof check === 'string') { + toaster.show(check, 'warning'); + return; + } } if (key.value.some((p) => !p.content || p.content.length < 6)) { @@ -322,7 +294,7 @@ export const AddEditModal: FC<{ ); modal.closeAll(); }, - [postFor, dateState, value, integrations, existingData] + [postFor, dateState, value, integrations, existingData, selectedIntegrations] ); const getPostsMarketplace = useCallback(async () => { diff --git a/apps/frontend/src/components/launches/helpers/use.values.ts b/apps/frontend/src/components/launches/helpers/use.values.ts index 0334285f..f3e18309 100644 --- a/apps/frontend/src/components/launches/helpers/use.values.ts +++ b/apps/frontend/src/components/launches/helpers/use.values.ts @@ -8,9 +8,7 @@ const finalInformation = {} as { settings: () => object; trigger: () => Promise; isValid: boolean; - firstCommentRequirements?: 'video' | 'image'; - minimumMediaRequirements?: number; - maximumMediaRequirements?: number; + checkValidity?: (value: Array>) => Promise; }; }; export const useValues = ( @@ -19,9 +17,7 @@ export const useValues = ( identifier: string, value: Array<{ id?: string; content: string; media?: Array }>, dto: any, - firstCommentRequirements?: 'video' | 'image', - minimumMediaRequirements?: number, - maximumMediaRequirements?: number + checkValidity?: (value: Array>) => Promise, ) => { const resolver = useMemo(() => { return classValidatorResolver(dto); @@ -44,17 +40,9 @@ export const useValues = ( finalInformation[integration].settings = getValues; finalInformation[integration].trigger = form.trigger; - if (firstCommentRequirements) { - finalInformation[integration].firstCommentRequirements = - firstCommentRequirements; - } - if (minimumMediaRequirements) { - finalInformation[integration].minimumMediaRequirements = - minimumMediaRequirements; - } - if (maximumMediaRequirements) { - finalInformation[integration].maximumMediaRequirements = - maximumMediaRequirements; + if (checkValidity) { + finalInformation[integration].checkValidity = + checkValidity; } useEffect(() => { diff --git a/apps/frontend/src/components/launches/providers/high.order.provider.tsx b/apps/frontend/src/components/launches/providers/high.order.provider.tsx index 0ad00ab1..b9b6520e 100644 --- a/apps/frontend/src/components/launches/providers/high.order.provider.tsx +++ b/apps/frontend/src/components/launches/providers/high.order.provider.tsx @@ -67,9 +67,7 @@ export const withProvider = ( SettingsComponent: FC | null, PreviewComponent: FC, dto?: any, - firstCommentRequirements?: 'video' | 'image', - minimumMediaRequirements?: number, - maximumMediaRequirements?: number, + checkValidity?: (value: Array>) => Promise ) => { return (props: { identifier: string; @@ -121,9 +119,7 @@ export const withProvider = ( props.identifier, editInPlace ? InPlaceValue : props.value, dto, - firstCommentRequirements, - minimumMediaRequirements, - maximumMediaRequirements + checkValidity ); // change editor value diff --git a/apps/frontend/src/components/launches/providers/instagram/instagram.provider.tsx b/apps/frontend/src/components/launches/providers/instagram/instagram.provider.tsx index 42f14098..f6d8351d 100644 --- a/apps/frontend/src/components/launches/providers/instagram/instagram.provider.tsx +++ b/apps/frontend/src/components/launches/providers/instagram/instagram.provider.tsx @@ -109,4 +109,10 @@ const InstagramPreview: FC = (props) => { ); }; -export default withProvider(null, InstagramPreview, undefined, undefined, 1, 10); +export default withProvider(null, InstagramPreview, undefined, async ([firstPost, ...otherPosts]) => { + if (!firstPost.length) { + return 'Instagram should have at least one media'; + } + + return true; +}); diff --git a/apps/frontend/src/components/launches/providers/pinterest/pinterest.provider.tsx b/apps/frontend/src/components/launches/providers/pinterest/pinterest.provider.tsx index b883e18c..7d94d5b2 100644 --- a/apps/frontend/src/components/launches/providers/pinterest/pinterest.provider.tsx +++ b/apps/frontend/src/components/launches/providers/pinterest/pinterest.provider.tsx @@ -130,6 +130,47 @@ export default withProvider( PinterestSettings, PinterestPreview, PinterestSettingsDto, - undefined, - 1 + async ([firstItem, ...otherItems]) => { + const isMp4 = firstItem.find((item) => item.path.indexOf('mp4') > -1); + const isPicture = firstItem.find((item) => item.path.indexOf('mp4') === -1); + + if (firstItem.length === 0) { + return 'Pinterest requires at least one media'; + } + + if (isMp4 && firstItem.length !== 2 && !isPicture) { + return 'If posting a video to Pinterest you have to also include a cover image as second media'; + } + + if (isMp4 && firstItem.length > 2) { + return 'If posting a video to Pinterest you can only have two media items'; + } + + if (otherItems.length) { + return 'Pinterest can only have one post'; + } + + if (firstItem.length > 1 && firstItem.every(p => p.path.indexOf('mp4') == -1)) { + const loadAll: Array<{width: number, height: number}> = await Promise.all(firstItem.map(p => { + return new Promise((resolve, reject) => { + const url = new Image(); + url.onload = function() { + // @ts-ignore + resolve({width: this.width, height: this.height}); + } + url.src = p.path; + }); + })) as any; + + const checkAllTheSameWidthHeight = loadAll.every((p, i, arr) => { + return p.width === arr[0].width && p.height === arr[0].height; + }); + + if (!checkAllTheSameWidthHeight) { + return 'Pinterest requires all images to have the same width and height'; + } + } + + return true; + } ); diff --git a/apps/frontend/src/components/media/media.component.tsx b/apps/frontend/src/components/media/media.component.tsx index b2507d33..e2698b0e 100644 --- a/apps/frontend/src/components/media/media.component.tsx +++ b/apps/frontend/src/components/media/media.component.tsx @@ -12,6 +12,7 @@ import { TopTitle } from '@gitroom/frontend/components/launches/helpers/top.titl import clsx from 'clsx'; import interClass from '@gitroom/react/helpers/inter.font'; import { VideoFrame } from '@gitroom/react/helpers/video.frame'; +import { useToaster } from '@gitroom/react/toaster/toaster'; const showModalEmitter = new EventEmitter(); export const ShowMediaBoxModal: FC = () => { @@ -58,6 +59,7 @@ export const MediaBox: FC<{ const [mediaList, setListMedia] = useState([]); const fetch = useFetch(); const mediaDirectory = useMediaDirectory(); + const toaster = useToaster(); const loadMedia = useCallback(async () => { return (await fetch('/media')).json(); @@ -69,8 +71,10 @@ export const MediaBox: FC<{ if ( !file?.target?.files?.length || file?.target?.files?.[0]?.size > maxFileSize - ) + ) { + toaster.show('Maximum file size 10mb', 'warning'); return; + } const formData = new FormData(); formData.append('file', file?.target?.files?.[0]); const data = await ( @@ -226,7 +230,7 @@ export const MediaBox: FC<{ .map((media) => (
{media.path.indexOf('mp4') > -1 ? ( @@ -319,7 +323,7 @@ export const MultiMediaComponent: FC<{ {!!currentMedia && currentMedia.map((media, index) => ( <> -
+
window.open(mediaDirectory.set(media.path))} > diff --git a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/pinterest.dto.ts b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/pinterest.dto.ts index 7f3ff938..2fe75778 100644 --- a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/pinterest.dto.ts +++ b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/pinterest.dto.ts @@ -1,5 +1,4 @@ -import { IsDefined, IsOptional, IsString, IsUrl, MinLength, ValidateNested } from 'class-validator'; -import { Type } from 'class-transformer'; +import { IsDefined, IsOptional, IsString, IsUrl, MinLength } from 'class-validator'; export class PinterestSettingsDto { @IsString() diff --git a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts index 37d6a6db..8785dc08 100644 --- a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts @@ -34,7 +34,7 @@ export class FacebookProvider implements SocialProvider { `${process.env.FRONTEND_URL}/integrations/social/facebook${refresh ? `?refresh=${refresh}` : ''}` )}` + `&state=${state}` + - '&scope=pages_show_list,business_management,pages_manage_posts,publish_video,pages_manage_engagement,pages_read_engagement', + '&scope=pages_show_list,business_management,pages_manage_posts,pages_manage_engagement,pages_read_engagement', codeVerifier: makeId(10), state, }; diff --git a/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts b/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts index 3708702f..36ad8673 100644 --- a/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts @@ -5,12 +5,10 @@ import { SocialProvider, } from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; -import { timer } from '@gitroom/helpers/utils/timer'; -import dayjs from 'dayjs'; import { PinterestSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/pinterest.dto'; import axios from 'axios'; import FormData from 'form-data'; -const form = new FormData(); +import { timer } from '@gitroom/helpers/utils/timer'; export class PinterestProvider implements SocialProvider { identifier = 'pinterest'; @@ -126,29 +124,40 @@ export class PinterestProvider implements SocialProvider { }) ).json(); - console.log(media_id, upload_url); - - try { - const { data } = await axios({ - url: postDetails?.[0]?.media?.[0]?.url, - method: 'GET', + const { data, status } = await axios.get( + postDetails?.[0]?.media?.[0]?.url!, + { responseType: 'stream', - }); + } + ); - const p = await ( - await fetch(upload_url, { - method: 'PUT', - body: data.buffer, - headers: { - Authorization: `Bearer ${accessToken}`, - ...upload_parameters, - }, - }) + const formData = Object.keys(upload_parameters) + .filter((f) => f) + .reduce((acc, key) => { + acc.append(key, upload_parameters[key]); + return acc; + }, new FormData()); + + formData.append('file', data); + await axios.post(upload_url, formData); + + let statusCode = ''; + while (statusCode !== 'succeeded') { + console.log('trying'); + const mediafile = await ( + await fetch( + 'https://api-sandbox.pinterest.com/v5/media/' + media_id, + { + method: 'GET', + headers: { + Authorization: `Bearer ${accessToken}`, + }, + } + ) ).json(); - console.log(p); - } catch (err) { - console.log(err); + await timer(3000); + statusCode = mediafile.status; } mediaId = media_id; @@ -158,8 +167,6 @@ export class PinterestProvider implements SocialProvider { url: m.url, })); - console.log('1'); - try { const { id: pId, @@ -188,7 +195,7 @@ export class PinterestProvider implements SocialProvider { board_id: postDetails?.[0]?.settings.board, media_source: mediaId ? { - source_type: 'video', + source_type: 'video_id', media_id: mediaId, } : mapImages?.length === 1 @@ -204,8 +211,6 @@ export class PinterestProvider implements SocialProvider { }) ).json(); - console.log(all); - return [ { id, From 72d834bf78e0a04a8d113b183c2b34035833bd49 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Thu, 30 May 2024 22:33:59 +0700 Subject: [PATCH 10/36] Feat: change --- apps/frontend/src/components/launches/add.edit.model.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/frontend/src/components/launches/add.edit.model.tsx b/apps/frontend/src/components/launches/add.edit.model.tsx index c3de52f1..b911eb6c 100644 --- a/apps/frontend/src/components/launches/add.edit.model.tsx +++ b/apps/frontend/src/components/launches/add.edit.model.tsx @@ -262,6 +262,7 @@ export const AddEditModal: FC<{ } } + if (key.value.some((p) => !p.content || p.content.length < 6)) { setShowError(true); return; From cdcfeb18ae415c5d95f7ca50cea4889f10fa9529 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Thu, 30 May 2024 22:55:21 +0700 Subject: [PATCH 11/36] feat: fix youtube --- .../providers/youtube/youtube.provider.tsx | 14 +++++++++++--- apps/frontend/tsconfig.tsbuildinfo | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/apps/frontend/src/components/launches/providers/youtube/youtube.provider.tsx b/apps/frontend/src/components/launches/providers/youtube/youtube.provider.tsx index c4377bab..dcdb76d1 100644 --- a/apps/frontend/src/components/launches/providers/youtube/youtube.provider.tsx +++ b/apps/frontend/src/components/launches/providers/youtube/youtube.provider.tsx @@ -136,7 +136,15 @@ export default withProvider( YoutubeSettings, YoutubePreview, YoutubeSettingsDto, - 'video', - 1, - 1 + async (items) => { + if (items.length === 1) { + return 'Youtube items should be one'; + } + + if (items[0].length !== 1) { + return 'You need one item'; + } + + return true; + } ); diff --git a/apps/frontend/tsconfig.tsbuildinfo b/apps/frontend/tsconfig.tsbuildinfo index c127accd..184fe997 100644 --- a/apps/frontend/tsconfig.tsbuildinfo +++ b/apps/frontend/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","./index.d.ts","../../node_modules/next/dist/styled-jsx/types/css.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/next/dist/styled-jsx/types/index.d.ts","../../node_modules/next/dist/styled-jsx/types/macro.d.ts","../../node_modules/next/dist/styled-jsx/types/style.d.ts","../../node_modules/next/dist/styled-jsx/types/global.d.ts","../../node_modules/next/dist/shared/lib/amp.d.ts","../../node_modules/next/amp.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/next/dist/server/get-page-files.d.ts","../../node_modules/@types/react/canary.d.ts","../../node_modules/@types/react/experimental.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/react-dom/canary.d.ts","../../node_modules/@types/react-dom/experimental.d.ts","../../node_modules/next/dist/compiled/webpack/webpack.d.ts","../../node_modules/next/dist/server/config.d.ts","../../node_modules/next/dist/lib/load-custom-routes.d.ts","../../node_modules/next/dist/shared/lib/image-config.d.ts","../../node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","../../node_modules/next/dist/server/body-streams.d.ts","../../node_modules/next/dist/server/future/route-kind.d.ts","../../node_modules/next/dist/server/future/route-definitions/route-definition.d.ts","../../node_modules/next/dist/server/future/route-matches/route-match.d.ts","../../node_modules/next/dist/client/components/app-router-headers.d.ts","../../node_modules/next/dist/server/request-meta.d.ts","../../node_modules/next/dist/server/config-shared.d.ts","../../node_modules/next/dist/server/base-http/index.d.ts","../../node_modules/next/dist/server/api-utils/index.d.ts","../../node_modules/next/dist/server/node-environment.d.ts","../../node_modules/next/dist/server/require-hook.d.ts","../../node_modules/next/dist/server/node-polyfill-crypto.d.ts","../../node_modules/next/dist/build/analysis/get-page-static-info.d.ts","../../node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","../../node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","../../node_modules/next/dist/server/lib/revalidate.d.ts","../../node_modules/next/dist/server/render-result.d.ts","../../node_modules/next/dist/server/future/helpers/i18n-provider.d.ts","../../node_modules/next/dist/server/web/next-url.d.ts","../../node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts","../../node_modules/next/dist/server/web/spec-extension/cookies.d.ts","../../node_modules/next/dist/server/web/spec-extension/request.d.ts","../../node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","../../node_modules/next/dist/server/web/spec-extension/response.d.ts","../../node_modules/next/dist/server/web/types.d.ts","../../node_modules/next/dist/lib/setup-exception-listeners.d.ts","../../node_modules/next/dist/lib/constants.d.ts","../../node_modules/next/dist/build/index.d.ts","../../node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","../../node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","../../node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","../../node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","../../node_modules/next/dist/server/base-http/node.d.ts","../../node_modules/next/dist/server/font-utils.d.ts","../../node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","../../node_modules/next/dist/server/future/route-modules/route-module.d.ts","../../node_modules/next/dist/server/load-components.d.ts","../../node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","../../node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","../../node_modules/next/dist/server/future/route-definitions/locale-route-definition.d.ts","../../node_modules/next/dist/server/future/route-definitions/pages-route-definition.d.ts","../../node_modules/next/dist/shared/lib/mitt.d.ts","../../node_modules/next/dist/client/with-router.d.ts","../../node_modules/next/dist/client/router.d.ts","../../node_modules/next/dist/client/route-loader.d.ts","../../node_modules/next/dist/client/page-loader.d.ts","../../node_modules/next/dist/shared/lib/bloom-filter.d.ts","../../node_modules/next/dist/shared/lib/router/router.d.ts","../../node_modules/next/dist/shared/lib/router-context.shared-runtime.d.ts","../../node_modules/next/dist/shared/lib/loadable-context.shared-runtime.d.ts","../../node_modules/next/dist/shared/lib/loadable.shared-runtime.d.ts","../../node_modules/next/dist/shared/lib/image-config-context.shared-runtime.d.ts","../../node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.d.ts","../../node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.d.ts","../../node_modules/next/dist/server/future/route-definitions/app-page-route-definition.d.ts","../../node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","../../node_modules/next/dist/shared/lib/constants.d.ts","../../node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts","../../node_modules/next/dist/build/webpack/loaders/next-app-loader.d.ts","../../node_modules/next/dist/server/lib/app-dir-module.d.ts","../../node_modules/next/dist/server/response-cache/types.d.ts","../../node_modules/next/dist/server/response-cache/index.d.ts","../../node_modules/next/dist/server/lib/incremental-cache/index.d.ts","../../node_modules/next/dist/client/components/hooks-server-context.d.ts","../../node_modules/next/dist/client/components/static-generation-async-storage.external.d.ts","../../node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.d.ts","../../node_modules/next/dist/server/async-storage/draft-mode-provider.d.ts","../../node_modules/next/dist/server/web/spec-extension/adapters/headers.d.ts","../../node_modules/next/dist/client/components/request-async-storage.external.d.ts","../../node_modules/next/dist/server/app-render/create-error-handler.d.ts","../../node_modules/next/dist/server/app-render/app-render.d.ts","../../node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts","../../node_modules/next/dist/shared/lib/amp-context.shared-runtime.d.ts","../../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/entrypoints.d.ts","../../node_modules/next/dist/server/future/route-modules/app-page/module.compiled.d.ts","../../node_modules/next/dist/client/components/error-boundary.d.ts","../../node_modules/next/dist/client/components/router-reducer/create-initial-router-state.d.ts","../../node_modules/next/dist/client/components/app-router.d.ts","../../node_modules/next/dist/client/components/layout-router.d.ts","../../node_modules/next/dist/client/components/render-from-template-context.d.ts","../../node_modules/next/dist/client/components/action-async-storage.external.d.ts","../../node_modules/next/dist/build/webpack/plugins/app-build-manifest-plugin.d.ts","../../node_modules/next/dist/build/utils.d.ts","../../node_modules/next/dist/client/components/static-generation-bailout.d.ts","../../node_modules/next/dist/client/components/static-generation-searchparams-bailout-provider.d.ts","../../node_modules/next/dist/client/components/searchparams-bailout-proxy.d.ts","../../node_modules/next/dist/client/components/not-found-boundary.d.ts","../../node_modules/next/dist/server/app-render/rsc/preloads.d.ts","../../node_modules/next/dist/server/app-render/rsc/taint.d.ts","../../node_modules/next/dist/server/app-render/entry-base.d.ts","../../node_modules/next/dist/build/templates/app-page.d.ts","../../node_modules/next/dist/server/future/route-modules/app-page/module.d.ts","../../node_modules/next/dist/server/app-render/types.d.ts","../../node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","../../node_modules/next/dist/client/components/router-reducer/router-reducer-types.d.ts","../../node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts","../../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/entrypoints.d.ts","../../node_modules/next/dist/server/future/route-modules/pages/module.compiled.d.ts","../../node_modules/next/dist/build/templates/pages.d.ts","../../node_modules/next/dist/server/future/route-modules/pages/module.d.ts","../../node_modules/next/dist/server/render.d.ts","../../node_modules/next/dist/server/future/route-definitions/pages-api-route-definition.d.ts","../../node_modules/next/dist/server/future/route-matches/pages-api-route-match.d.ts","../../node_modules/next/dist/server/future/route-matchers/route-matcher.d.ts","../../node_modules/next/dist/server/future/route-matcher-providers/route-matcher-provider.d.ts","../../node_modules/next/dist/server/future/route-matcher-managers/route-matcher-manager.d.ts","../../node_modules/next/dist/server/future/normalizers/normalizer.d.ts","../../node_modules/next/dist/server/future/normalizers/locale-route-normalizer.d.ts","../../node_modules/next/dist/server/future/normalizers/request/pathname-normalizer.d.ts","../../node_modules/next/dist/server/future/normalizers/request/suffix.d.ts","../../node_modules/next/dist/server/future/normalizers/request/rsc.d.ts","../../node_modules/next/dist/server/future/normalizers/request/prefix.d.ts","../../node_modules/next/dist/server/future/normalizers/request/postponed.d.ts","../../node_modules/next/dist/server/future/normalizers/request/prefetch-rsc.d.ts","../../node_modules/next/dist/server/future/normalizers/request/next-data.d.ts","../../node_modules/next/dist/server/base-server.d.ts","../../node_modules/next/dist/server/image-optimizer.d.ts","../../node_modules/next/dist/server/next-server.d.ts","../../node_modules/next/dist/lib/coalesced-function.d.ts","../../node_modules/next/dist/trace/types.d.ts","../../node_modules/next/dist/trace/trace.d.ts","../../node_modules/next/dist/trace/shared.d.ts","../../node_modules/next/dist/trace/index.d.ts","../../node_modules/next/dist/build/load-jsconfig.d.ts","../../node_modules/next/dist/build/webpack-config.d.ts","../../node_modules/next/dist/build/webpack/plugins/define-env-plugin.d.ts","../../node_modules/next/dist/build/swc/index.d.ts","../../node_modules/next/dist/server/dev/parse-version-info.d.ts","../../node_modules/next/dist/server/dev/hot-reloader-types.d.ts","../../node_modules/next/dist/telemetry/storage.d.ts","../../node_modules/next/dist/server/lib/types.d.ts","../../node_modules/next/dist/server/lib/router-utils/types.d.ts","../../node_modules/next/dist/server/lib/render-server.d.ts","../../node_modules/next/dist/server/lib/router-server.d.ts","../../node_modules/next/dist/shared/lib/router/utils/path-match.d.ts","../../node_modules/next/dist/server/lib/router-utils/filesystem.d.ts","../../node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.d.ts","../../node_modules/next/dist/server/lib/dev-bundler-service.d.ts","../../node_modules/next/dist/server/dev/static-paths-worker.d.ts","../../node_modules/next/dist/server/dev/next-dev-server.d.ts","../../node_modules/next/dist/server/next.d.ts","../../node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts","../../node_modules/next/dist/lib/metadata/types/extra-types.d.ts","../../node_modules/next/dist/lib/metadata/types/metadata-types.d.ts","../../node_modules/next/dist/lib/metadata/types/manifest-types.d.ts","../../node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts","../../node_modules/next/dist/lib/metadata/types/twitter-types.d.ts","../../node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts","../../node_modules/next/types/index.d.ts","../../node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts","../../node_modules/@next/env/dist/index.d.ts","../../node_modules/next/dist/shared/lib/utils.d.ts","../../node_modules/next/dist/pages/_app.d.ts","../../node_modules/next/app.d.ts","../../node_modules/next/dist/server/web/spec-extension/unstable-cache.d.ts","../../node_modules/next/dist/server/web/spec-extension/revalidate-path.d.ts","../../node_modules/next/dist/server/web/spec-extension/revalidate-tag.d.ts","../../node_modules/next/dist/server/web/spec-extension/unstable-no-store.d.ts","../../node_modules/next/cache.d.ts","../../node_modules/next/dist/shared/lib/runtime-config.external.d.ts","../../node_modules/next/config.d.ts","../../node_modules/next/dist/pages/_document.d.ts","../../node_modules/next/document.d.ts","../../node_modules/next/dist/shared/lib/dynamic.d.ts","../../node_modules/next/dynamic.d.ts","../../node_modules/next/dist/pages/_error.d.ts","../../node_modules/next/error.d.ts","../../node_modules/next/dist/shared/lib/head.d.ts","../../node_modules/next/head.d.ts","../../node_modules/next/dist/shared/lib/get-img-props.d.ts","../../node_modules/next/dist/client/image-component.d.ts","../../node_modules/next/dist/shared/lib/image-external.d.ts","../../node_modules/next/image.d.ts","../../node_modules/next/dist/client/link.d.ts","../../node_modules/next/link.d.ts","../../node_modules/next/dist/client/components/redirect-status-code.d.ts","../../node_modules/next/dist/client/components/redirect.d.ts","../../node_modules/next/dist/client/components/not-found.d.ts","../../node_modules/next/dist/client/components/navigation.d.ts","../../node_modules/next/navigation.d.ts","../../node_modules/next/router.d.ts","../../node_modules/next/dist/client/script.d.ts","../../node_modules/next/script.d.ts","../../node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","../../node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts","../../node_modules/next/dist/server/web/spec-extension/image-response.d.ts","../../node_modules/next/dist/compiled/@vercel/og/satori/index.d.ts","../../node_modules/next/dist/compiled/@vercel/og/emoji/index.d.ts","../../node_modules/next/dist/compiled/@vercel/og/types.d.ts","../../node_modules/next/server.d.ts","../../node_modules/next/types/global.d.ts","../../node_modules/next/types/compiled.d.ts","../../node_modules/next/index.d.ts","../../node_modules/next/image-types/global.d.ts","./next-env.d.ts","../../node_modules/tslib/tslib.d.ts","../../libraries/helpers/src/utils/custom.fetch.func.ts","../../libraries/helpers/src/subdomain/all.two.level.subdomain.ts","../../libraries/helpers/src/subdomain/subdomain.management.ts","../../libraries/react-shared-libraries/src/helpers/is.general.tsx","./src/middleware.ts","./src/components/analytics/stars.and.forks.interface.ts","../../node_modules/reflect-metadata/index.d.ts","../../node_modules/dayjs/locale/types.d.ts","../../node_modules/dayjs/locale/index.d.ts","../../node_modules/dayjs/index.d.ts","../../node_modules/swr/dist/_internal/index.d.ts","../../node_modules/swr/dist/core/index.d.ts","../../libraries/helpers/src/utils/custom.fetch.tsx","../../node_modules/@prisma/client/runtime/library.d.ts","../../node_modules/.prisma/client/index.d.ts","../../node_modules/.prisma/client/default.d.ts","../../node_modules/@prisma/client/default.d.ts","./src/components/launches/calendar.context.tsx","./src/components/launches/helpers/use.integration.ts","./src/components/launches/helpers/use.custom.provider.function.ts","../../node_modules/@types/remove-markdown/index.d.ts","./src/components/launches/helpers/use.formatting.ts","../../node_modules/react-hook-form/dist/constants.d.ts","../../node_modules/react-hook-form/dist/utils/createsubject.d.ts","../../node_modules/react-hook-form/dist/types/events.d.ts","../../node_modules/react-hook-form/dist/types/path/common.d.ts","../../node_modules/react-hook-form/dist/types/path/eager.d.ts","../../node_modules/react-hook-form/dist/types/path/index.d.ts","../../node_modules/react-hook-form/dist/types/fieldarray.d.ts","../../node_modules/react-hook-form/dist/types/resolvers.d.ts","../../node_modules/react-hook-form/dist/types/form.d.ts","../../node_modules/react-hook-form/dist/types/utils.d.ts","../../node_modules/react-hook-form/dist/types/fields.d.ts","../../node_modules/react-hook-form/dist/types/errors.d.ts","../../node_modules/react-hook-form/dist/types/validator.d.ts","../../node_modules/react-hook-form/dist/types/controller.d.ts","../../node_modules/react-hook-form/dist/types/index.d.ts","../../node_modules/react-hook-form/dist/controller.d.ts","../../node_modules/react-hook-form/dist/form.d.ts","../../node_modules/react-hook-form/dist/logic/appenderrors.d.ts","../../node_modules/react-hook-form/dist/logic/index.d.ts","../../node_modules/react-hook-form/dist/usecontroller.d.ts","../../node_modules/react-hook-form/dist/usefieldarray.d.ts","../../node_modules/react-hook-form/dist/useform.d.ts","../../node_modules/react-hook-form/dist/useformcontext.d.ts","../../node_modules/react-hook-form/dist/useformstate.d.ts","../../node_modules/react-hook-form/dist/usewatch.d.ts","../../node_modules/react-hook-form/dist/utils/get.d.ts","../../node_modules/react-hook-form/dist/utils/set.d.ts","../../node_modules/react-hook-form/dist/utils/index.d.ts","../../node_modules/react-hook-form/dist/index.d.ts","../../node_modules/class-validator/types/validation/validationerror.d.ts","../../node_modules/class-validator/types/validation/validatoroptions.d.ts","../../node_modules/class-validator/types/validation-schema/validationschema.d.ts","../../node_modules/class-validator/types/container.d.ts","../../node_modules/class-validator/types/validation/validationarguments.d.ts","../../node_modules/class-validator/types/decorator/validationoptions.d.ts","../../node_modules/class-validator/types/decorator/common/allow.d.ts","../../node_modules/class-validator/types/decorator/common/isdefined.d.ts","../../node_modules/class-validator/types/decorator/common/isoptional.d.ts","../../node_modules/class-validator/types/decorator/common/validate.d.ts","../../node_modules/class-validator/types/validation/validatorconstraintinterface.d.ts","../../node_modules/class-validator/types/decorator/common/validateby.d.ts","../../node_modules/class-validator/types/decorator/common/validateif.d.ts","../../node_modules/class-validator/types/decorator/common/validatenested.d.ts","../../node_modules/class-validator/types/decorator/common/validatepromise.d.ts","../../node_modules/class-validator/types/decorator/common/islatlong.d.ts","../../node_modules/class-validator/types/decorator/common/islatitude.d.ts","../../node_modules/class-validator/types/decorator/common/islongitude.d.ts","../../node_modules/class-validator/types/decorator/common/equals.d.ts","../../node_modules/class-validator/types/decorator/common/notequals.d.ts","../../node_modules/class-validator/types/decorator/common/isempty.d.ts","../../node_modules/class-validator/types/decorator/common/isnotempty.d.ts","../../node_modules/class-validator/types/decorator/common/isin.d.ts","../../node_modules/class-validator/types/decorator/common/isnotin.d.ts","../../node_modules/class-validator/types/decorator/number/isdivisibleby.d.ts","../../node_modules/class-validator/types/decorator/number/ispositive.d.ts","../../node_modules/class-validator/types/decorator/number/isnegative.d.ts","../../node_modules/class-validator/types/decorator/number/max.d.ts","../../node_modules/class-validator/types/decorator/number/min.d.ts","../../node_modules/class-validator/types/decorator/date/mindate.d.ts","../../node_modules/class-validator/types/decorator/date/maxdate.d.ts","../../node_modules/class-validator/types/decorator/string/contains.d.ts","../../node_modules/class-validator/types/decorator/string/notcontains.d.ts","../../node_modules/@types/validator/lib/isboolean.d.ts","../../node_modules/@types/validator/lib/isemail.d.ts","../../node_modules/@types/validator/lib/isfqdn.d.ts","../../node_modules/@types/validator/lib/isiban.d.ts","../../node_modules/@types/validator/lib/isiso31661alpha2.d.ts","../../node_modules/@types/validator/lib/isiso4217.d.ts","../../node_modules/@types/validator/lib/isiso6391.d.ts","../../node_modules/@types/validator/lib/istaxid.d.ts","../../node_modules/@types/validator/lib/isurl.d.ts","../../node_modules/@types/validator/index.d.ts","../../node_modules/class-validator/types/decorator/string/isalpha.d.ts","../../node_modules/class-validator/types/decorator/string/isalphanumeric.d.ts","../../node_modules/class-validator/types/decorator/string/isdecimal.d.ts","../../node_modules/class-validator/types/decorator/string/isascii.d.ts","../../node_modules/class-validator/types/decorator/string/isbase64.d.ts","../../node_modules/class-validator/types/decorator/string/isbytelength.d.ts","../../node_modules/class-validator/types/decorator/string/iscreditcard.d.ts","../../node_modules/class-validator/types/decorator/string/iscurrency.d.ts","../../node_modules/class-validator/types/decorator/string/isemail.d.ts","../../node_modules/class-validator/types/decorator/string/isfqdn.d.ts","../../node_modules/class-validator/types/decorator/string/isfullwidth.d.ts","../../node_modules/class-validator/types/decorator/string/ishalfwidth.d.ts","../../node_modules/class-validator/types/decorator/string/isvariablewidth.d.ts","../../node_modules/class-validator/types/decorator/string/ishexcolor.d.ts","../../node_modules/class-validator/types/decorator/string/ishexadecimal.d.ts","../../node_modules/class-validator/types/decorator/string/ismacaddress.d.ts","../../node_modules/class-validator/types/decorator/string/isip.d.ts","../../node_modules/class-validator/types/decorator/string/isport.d.ts","../../node_modules/class-validator/types/decorator/string/isisbn.d.ts","../../node_modules/class-validator/types/decorator/string/isisin.d.ts","../../node_modules/class-validator/types/decorator/string/isiso8601.d.ts","../../node_modules/class-validator/types/decorator/string/isjson.d.ts","../../node_modules/class-validator/types/decorator/string/isjwt.d.ts","../../node_modules/class-validator/types/decorator/string/islowercase.d.ts","../../node_modules/class-validator/types/decorator/string/ismobilephone.d.ts","../../node_modules/class-validator/types/decorator/string/isiso31661alpha2.d.ts","../../node_modules/class-validator/types/decorator/string/isiso31661alpha3.d.ts","../../node_modules/class-validator/types/decorator/string/ismongoid.d.ts","../../node_modules/class-validator/types/decorator/string/ismultibyte.d.ts","../../node_modules/class-validator/types/decorator/string/issurrogatepair.d.ts","../../node_modules/class-validator/types/decorator/string/isurl.d.ts","../../node_modules/class-validator/types/decorator/string/isuuid.d.ts","../../node_modules/class-validator/types/decorator/string/isfirebasepushid.d.ts","../../node_modules/class-validator/types/decorator/string/isuppercase.d.ts","../../node_modules/class-validator/types/decorator/string/length.d.ts","../../node_modules/class-validator/types/decorator/string/maxlength.d.ts","../../node_modules/class-validator/types/decorator/string/minlength.d.ts","../../node_modules/class-validator/types/decorator/string/matches.d.ts","../../node_modules/libphonenumber-js/types.d.cts","../../node_modules/libphonenumber-js/max/index.d.cts","../../node_modules/class-validator/types/decorator/string/isphonenumber.d.ts","../../node_modules/class-validator/types/decorator/string/ismilitarytime.d.ts","../../node_modules/class-validator/types/decorator/string/ishash.d.ts","../../node_modules/class-validator/types/decorator/string/isissn.d.ts","../../node_modules/class-validator/types/decorator/string/isdatestring.d.ts","../../node_modules/class-validator/types/decorator/string/isbooleanstring.d.ts","../../node_modules/class-validator/types/decorator/string/isnumberstring.d.ts","../../node_modules/class-validator/types/decorator/string/isbase32.d.ts","../../node_modules/class-validator/types/decorator/string/isbic.d.ts","../../node_modules/class-validator/types/decorator/string/isbtcaddress.d.ts","../../node_modules/class-validator/types/decorator/string/isdatauri.d.ts","../../node_modules/class-validator/types/decorator/string/isean.d.ts","../../node_modules/class-validator/types/decorator/string/isethereumaddress.d.ts","../../node_modules/class-validator/types/decorator/string/ishsl.d.ts","../../node_modules/class-validator/types/decorator/string/isiban.d.ts","../../node_modules/class-validator/types/decorator/string/isidentitycard.d.ts","../../node_modules/class-validator/types/decorator/string/isisrc.d.ts","../../node_modules/class-validator/types/decorator/string/islocale.d.ts","../../node_modules/class-validator/types/decorator/string/ismagneturi.d.ts","../../node_modules/class-validator/types/decorator/string/ismimetype.d.ts","../../node_modules/class-validator/types/decorator/string/isoctal.d.ts","../../node_modules/class-validator/types/decorator/string/ispassportnumber.d.ts","../../node_modules/class-validator/types/decorator/string/ispostalcode.d.ts","../../node_modules/class-validator/types/decorator/string/isrfc3339.d.ts","../../node_modules/class-validator/types/decorator/string/isrgbcolor.d.ts","../../node_modules/class-validator/types/decorator/string/issemver.d.ts","../../node_modules/class-validator/types/decorator/string/isstrongpassword.d.ts","../../node_modules/class-validator/types/decorator/string/istimezone.d.ts","../../node_modules/class-validator/types/decorator/string/isbase58.d.ts","../../node_modules/class-validator/types/decorator/string/is-tax-id.d.ts","../../node_modules/class-validator/types/decorator/string/is-iso4217-currency-code.d.ts","../../node_modules/class-validator/types/decorator/typechecker/isboolean.d.ts","../../node_modules/class-validator/types/decorator/typechecker/isdate.d.ts","../../node_modules/class-validator/types/decorator/typechecker/isnumber.d.ts","../../node_modules/class-validator/types/decorator/typechecker/isenum.d.ts","../../node_modules/class-validator/types/decorator/typechecker/isint.d.ts","../../node_modules/class-validator/types/decorator/typechecker/isstring.d.ts","../../node_modules/class-validator/types/decorator/typechecker/isarray.d.ts","../../node_modules/class-validator/types/decorator/typechecker/isobject.d.ts","../../node_modules/class-validator/types/decorator/array/arraycontains.d.ts","../../node_modules/class-validator/types/decorator/array/arraynotcontains.d.ts","../../node_modules/class-validator/types/decorator/array/arraynotempty.d.ts","../../node_modules/class-validator/types/decorator/array/arrayminsize.d.ts","../../node_modules/class-validator/types/decorator/array/arraymaxsize.d.ts","../../node_modules/class-validator/types/decorator/array/arrayunique.d.ts","../../node_modules/class-validator/types/decorator/object/isnotemptyobject.d.ts","../../node_modules/class-validator/types/decorator/object/isinstance.d.ts","../../node_modules/class-validator/types/decorator/decorators.d.ts","../../node_modules/class-validator/types/validation/validationtypes.d.ts","../../node_modules/class-validator/types/validation/validator.d.ts","../../node_modules/class-validator/types/register-decorator.d.ts","../../node_modules/class-validator/types/metadata/validationmetadataargs.d.ts","../../node_modules/class-validator/types/metadata/validationmetadata.d.ts","../../node_modules/class-validator/types/metadata/constraintmetadata.d.ts","../../node_modules/class-validator/types/metadata/metadatastorage.d.ts","../../node_modules/class-validator/types/index.d.ts","../../node_modules/class-transformer/types/interfaces/decorator-options/expose-options.interface.d.ts","../../node_modules/class-transformer/types/interfaces/decorator-options/exclude-options.interface.d.ts","../../node_modules/class-transformer/types/interfaces/decorator-options/transform-options.interface.d.ts","../../node_modules/class-transformer/types/interfaces/decorator-options/type-discriminator-descriptor.interface.d.ts","../../node_modules/class-transformer/types/interfaces/decorator-options/type-options.interface.d.ts","../../node_modules/class-transformer/types/interfaces/metadata/exclude-metadata.interface.d.ts","../../node_modules/class-transformer/types/interfaces/metadata/expose-metadata.interface.d.ts","../../node_modules/class-transformer/types/enums/transformation-type.enum.d.ts","../../node_modules/class-transformer/types/enums/index.d.ts","../../node_modules/class-transformer/types/interfaces/target-map.interface.d.ts","../../node_modules/class-transformer/types/interfaces/class-transformer-options.interface.d.ts","../../node_modules/class-transformer/types/interfaces/metadata/transform-fn-params.interface.d.ts","../../node_modules/class-transformer/types/interfaces/metadata/transform-metadata.interface.d.ts","../../node_modules/class-transformer/types/interfaces/metadata/type-metadata.interface.d.ts","../../node_modules/class-transformer/types/interfaces/class-constructor.type.d.ts","../../node_modules/class-transformer/types/interfaces/type-help-options.interface.d.ts","../../node_modules/class-transformer/types/interfaces/index.d.ts","../../node_modules/class-transformer/types/classtransformer.d.ts","../../node_modules/class-transformer/types/decorators/exclude.decorator.d.ts","../../node_modules/class-transformer/types/decorators/expose.decorator.d.ts","../../node_modules/class-transformer/types/decorators/transform-instance-to-instance.decorator.d.ts","../../node_modules/class-transformer/types/decorators/transform-instance-to-plain.decorator.d.ts","../../node_modules/class-transformer/types/decorators/transform-plain-to-instance.decorator.d.ts","../../node_modules/class-transformer/types/decorators/transform.decorator.d.ts","../../node_modules/class-transformer/types/decorators/type.decorator.d.ts","../../node_modules/class-transformer/types/decorators/index.d.ts","../../node_modules/class-transformer/types/index.d.ts","../../node_modules/@hookform/resolvers/class-validator/dist/types.d.ts","../../node_modules/@hookform/resolvers/class-validator/dist/class-validator.d.ts","../../node_modules/@hookform/resolvers/class-validator/dist/index.d.ts","./src/components/launches/helpers/use.values.ts","../../node_modules/next/dist/compiled/@next/font/dist/types.d.ts","../../node_modules/next/dist/compiled/@next/font/dist/google/index.d.ts","../../node_modules/next/font/google/index.d.ts","../../libraries/react-shared-libraries/src/helpers/inter.font.ts","../../node_modules/sweetalert2/sweetalert2.d.ts","../../libraries/react-shared-libraries/src/helpers/delete.dialog.tsx","./src/components/layout/layout.context.tsx","./src/app/layout.tsx","../../node_modules/clsx/clsx.d.ts","../../libraries/nestjs-libraries/src/database/prisma/subscriptions/pricing.ts","./src/components/layout/user.context.tsx","./src/components/layout/top.menu.tsx","./src/components/layout/title.tsx","../../node_modules/@mantine/utils/lib/create-polymorphic-component/create-polymorphic-component.d.ts","../../node_modules/@mantine/utils/lib/create-scoped-keydown-handler/create-scoped-keydown-handler.d.ts","../../node_modules/@mantine/utils/lib/get-context-item-index/get-context-item-index.d.ts","../../node_modules/@mantine/utils/lib/find-element-ancestor/find-element-ancestor.d.ts","../../node_modules/@mantine/utils/lib/create-safe-context/create-safe-context.d.ts","../../node_modules/@mantine/utils/lib/pack-sx/pack-sx.d.ts","../../node_modules/@mantine/utils/lib/get-safe-id/get-safe-id.d.ts","../../node_modules/@mantine/utils/lib/close-on-escape/close-on-escape.d.ts","../../node_modules/@mantine/utils/lib/create-event-handler/create-event-handler.d.ts","../../node_modules/@mantine/utils/lib/noop/noop.d.ts","../../node_modules/@mantine/utils/lib/keys/keys.d.ts","../../node_modules/@mantine/utils/lib/use-hovered/use-hovered.d.ts","../../node_modules/@mantine/utils/lib/group-options/group-options.d.ts","../../node_modules/@mantine/utils/lib/create-use-external-events/create-use-external-events.d.ts","../../node_modules/@mantine/utils/lib/is-element/is-element.d.ts","../../node_modules/@mantine/utils/lib/forwardrefwithstaticcomponents.d.ts","../../node_modules/@mantine/utils/lib/index.d.ts","../../node_modules/@mantine/styles/node_modules/clsx/clsx.d.ts","../../node_modules/@mantine/styles/lib/theme/types/colorscheme.d.ts","../../node_modules/@mantine/styles/lib/theme/types/tuple.d.ts","../../node_modules/@mantine/styles/lib/theme/types/mantinecolor.d.ts","../../node_modules/@mantine/styles/lib/theme/types/mantinesize.d.ts","../../node_modules/@mantine/styles/lib/theme/types/mantinestylesystem.d.ts","../../node_modules/@mantine/styles/lib/theme/types/deeppartial.d.ts","../../node_modules/@mantine/styles/lib/theme/types/mantinegradient.d.ts","../../node_modules/@mantine/styles/lib/theme/functions/fns/variant/variant.d.ts","../../node_modules/@emotion/utils/types/index.d.ts","../../node_modules/@emotion/cache/types/index.d.ts","../../node_modules/@mantine/styles/node_modules/csstype/index.d.ts","../../node_modules/@mantine/styles/lib/tss/types/css-object.d.ts","../../node_modules/@mantine/styles/lib/tss/types/css.d.ts","../../node_modules/@mantine/styles/lib/tss/types/selectors.d.ts","../../node_modules/@mantine/styles/lib/tss/types/index.d.ts","../../node_modules/@mantine/styles/lib/tss/create-styles.d.ts","../../node_modules/@emotion/serialize/types/index.d.ts","../../node_modules/@emotion/react/types/jsx-namespace.d.ts","../../node_modules/@emotion/react/types/helper.d.ts","../../node_modules/@emotion/react/types/theming.d.ts","../../node_modules/@emotion/react/types/index.d.ts","../../node_modules/@mantine/styles/lib/tss/global.d.ts","../../node_modules/@mantine/styles/lib/tss/use-css.d.ts","../../node_modules/@mantine/styles/lib/tss/use-emotion-cache.d.ts","../../node_modules/@mantine/styles/lib/tss/default-emotion-cache.d.ts","../../node_modules/@mantine/styles/lib/tss/index.d.ts","../../node_modules/@mantine/styles/lib/theme/types/mantinetheme.d.ts","../../node_modules/@mantine/styles/lib/theme/types/defaultprops.d.ts","../../node_modules/@mantine/styles/lib/theme/types/mantineshadow.d.ts","../../node_modules/@mantine/styles/lib/theme/types/index.d.ts","../../node_modules/@mantine/styles/lib/theme/utils/get-default-z-index/get-default-z-index.d.ts","../../node_modules/@mantine/styles/lib/theme/utils/filter-props/filter-props.d.ts","../../node_modules/@mantine/styles/lib/theme/utils/index.d.ts","../../node_modules/@mantine/styles/lib/theme/default-theme.d.ts","../../node_modules/@mantine/styles/lib/theme/mantineprovider.d.ts","../../node_modules/@mantine/styles/lib/theme/colorschemeprovider.d.ts","../../node_modules/@mantine/styles/lib/theme/globalstyles.d.ts","../../node_modules/@mantine/styles/lib/theme/normalizecss.d.ts","../../node_modules/@mantine/styles/lib/theme/index.d.ts","../../node_modules/@mantine/styles/lib/index.d.ts","../../node_modules/@mantine/core/lib/accordion/accordion.types.d.ts","../../node_modules/@mantine/core/lib/accordion/accordionprovider.d.ts","../../node_modules/@mantine/core/lib/accordion/accordionitem/accordionitem.styles.d.ts","../../node_modules/@mantine/core/lib/accordion/accordionitem/accordionitem.d.ts","../../node_modules/@mantine/core/lib/accordion/accordioncontrol/accordioncontrol.styles.d.ts","../../node_modules/@mantine/core/lib/accordion/accordioncontrol/accordioncontrol.d.ts","../../node_modules/@mantine/core/lib/accordion/accordionpanel/accordionpanel.styles.d.ts","../../node_modules/@mantine/core/lib/accordion/accordionpanel/accordionpanel.d.ts","../../node_modules/@mantine/core/lib/accordion/accordion.d.ts","../../node_modules/@mantine/core/lib/accordion/chevronicon.d.ts","../../node_modules/@mantine/core/lib/accordion/index.d.ts","../../node_modules/@mantine/core/lib/actionicon/actionicon.styles.d.ts","../../node_modules/@mantine/core/lib/loader/loader.d.ts","../../node_modules/@mantine/core/lib/loader/index.d.ts","../../node_modules/@mantine/core/lib/actionicon/actionicon.d.ts","../../node_modules/@mantine/core/lib/actionicon/index.d.ts","../../node_modules/@mantine/core/lib/affix/affix.d.ts","../../node_modules/@mantine/core/lib/affix/index.d.ts","../../node_modules/@mantine/core/lib/alert/alert.styles.d.ts","../../node_modules/@mantine/core/lib/alert/alert.d.ts","../../node_modules/@mantine/core/lib/alert/index.d.ts","../../node_modules/@mantine/core/lib/text/text.d.ts","../../node_modules/@mantine/core/lib/anchor/anchor.d.ts","../../node_modules/@mantine/core/lib/anchor/index.d.ts","../../node_modules/@mantine/core/lib/appshell/horizontalsection/horizontalsection.styles.d.ts","../../node_modules/@mantine/core/lib/appshell/horizontalsection/horizontalsection.d.ts","../../node_modules/@mantine/core/lib/appshell/horizontalsection/section/section.d.ts","../../node_modules/@mantine/core/lib/appshell/navbar/navbar.d.ts","../../node_modules/@mantine/core/lib/appshell/verticalsection/verticalsection.styles.d.ts","../../node_modules/@mantine/core/lib/appshell/verticalsection/verticalsection.d.ts","../../node_modules/@mantine/core/lib/appshell/header/header.d.ts","../../node_modules/@mantine/core/lib/appshell/aside/aside.d.ts","../../node_modules/@mantine/core/lib/appshell/footer/footer.d.ts","../../node_modules/@mantine/core/lib/appshell/appshell.styles.d.ts","../../node_modules/@mantine/core/lib/appshell/appshell.d.ts","../../node_modules/@mantine/core/lib/appshell/index.d.ts","../../node_modules/@mantine/core/lib/aspectratio/aspectratio.d.ts","../../node_modules/@mantine/core/lib/aspectratio/aspectratio.styles.d.ts","../../node_modules/@mantine/core/lib/aspectratio/index.d.ts","../../node_modules/@mantine/core/lib/input/inputlabel/inputlabel.styles.d.ts","../../node_modules/@mantine/core/lib/input/inputlabel/inputlabel.d.ts","../../node_modules/@mantine/core/lib/input/inputerror/inputerror.styles.d.ts","../../node_modules/@mantine/core/lib/input/inputerror/inputerror.d.ts","../../node_modules/@mantine/core/lib/input/inputdescription/inputdescription.styles.d.ts","../../node_modules/@mantine/core/lib/input/inputdescription/inputdescription.d.ts","../../node_modules/@mantine/core/lib/input/inputwrapper/inputwrapper.styles.d.ts","../../node_modules/@mantine/core/lib/input/inputwrapper/inputwrapper.d.ts","../../node_modules/@mantine/core/lib/input/inputplaceholder/inputplaceholder.d.ts","../../node_modules/@mantine/core/lib/input/input.styles.d.ts","../../node_modules/@mantine/core/lib/input/input.d.ts","../../node_modules/@mantine/core/lib/input/use-input-props.d.ts","../../node_modules/@mantine/core/lib/input/index.d.ts","../../node_modules/@mantine/core/lib/transition/transitions.d.ts","../../node_modules/@mantine/core/lib/transition/transition.d.ts","../../node_modules/@mantine/core/lib/transition/groupedtransition.d.ts","../../node_modules/@mantine/core/lib/transition/index.d.ts","../../node_modules/@mantine/core/lib/select/selectitems/selectitems.styles.d.ts","../../node_modules/@mantine/core/lib/select/selectitems/selectitems.d.ts","../../node_modules/@mantine/core/lib/select/selectpopover/selectpopover.styles.d.ts","../../node_modules/@mantine/core/lib/floating/use-delayed-hover.d.ts","../../node_modules/@mantine/core/lib/floating/use-floating-auto-update.d.ts","../../node_modules/@mantine/core/lib/floating/types.d.ts","../../node_modules/@mantine/core/lib/floating/get-floating-position/get-floating-position.d.ts","../../node_modules/@mantine/core/lib/floating/floatingarrow/floatingarrow.d.ts","../../node_modules/@mantine/core/lib/floating/index.d.ts","../../node_modules/@mantine/core/lib/popover/popoverdropdown/popoverdropdown.styles.d.ts","../../node_modules/@mantine/core/lib/popover/popover.types.d.ts","../../node_modules/@mantine/core/lib/popover/popoverdropdown/popoverdropdown.d.ts","../../node_modules/@mantine/core/lib/popover/popovertarget/popovertarget.d.ts","../../node_modules/@mantine/core/lib/popover/popover.d.ts","../../node_modules/@mantine/core/lib/popover/index.d.ts","../../node_modules/@mantine/core/lib/select/selectpopover/selectpopover.d.ts","../../node_modules/@mantine/core/lib/select/types.d.ts","../../node_modules/@mantine/core/lib/select/select.d.ts","../../node_modules/@mantine/core/lib/select/selectrightsection/chevronicon.d.ts","../../node_modules/@mantine/core/lib/select/defaultitem/defaultitem.d.ts","../../node_modules/@mantine/core/lib/select/index.d.ts","../../node_modules/@mantine/core/lib/autocomplete/autocomplete.d.ts","../../node_modules/@mantine/core/lib/autocomplete/index.d.ts","../../node_modules/@mantine/core/lib/avatar/avatargroup/avatargroup.d.ts","../../node_modules/@mantine/core/lib/avatar/avatar.styles.d.ts","../../node_modules/@mantine/core/lib/avatar/avatar.d.ts","../../node_modules/@mantine/core/lib/avatar/index.d.ts","../../node_modules/@mantine/core/lib/backgroundimage/backgroundimage.d.ts","../../node_modules/@mantine/core/lib/backgroundimage/index.d.ts","../../node_modules/@mantine/core/lib/badge/badge.styles.d.ts","../../node_modules/@mantine/core/lib/badge/badge.d.ts","../../node_modules/@mantine/core/lib/badge/index.d.ts","../../node_modules/@mantine/core/lib/blockquote/blockquote.styles.d.ts","../../node_modules/@mantine/core/lib/blockquote/blockquote.d.ts","../../node_modules/@mantine/core/lib/blockquote/index.d.ts","../../node_modules/@mantine/core/lib/box/box.d.ts","../../node_modules/@mantine/core/lib/box/style-system-props/extract-system-styles/extract-system-styles.d.ts","../../node_modules/@mantine/core/lib/box/style-system-props/get-responsive-value/get-responsive-value.d.ts","../../node_modules/@mantine/core/lib/box/style-system-props/value-getters/get-color-value.d.ts","../../node_modules/@mantine/core/lib/box/style-system-props/value-getters/get-default-value.d.ts","../../node_modules/@mantine/core/lib/box/style-system-props/value-getters/get-font-size-value.d.ts","../../node_modules/@mantine/core/lib/box/style-system-props/value-getters/get-spacing-value.d.ts","../../node_modules/@mantine/core/lib/box/style-system-props/value-getters/value-getters.d.ts","../../node_modules/@mantine/core/lib/box/style-system-props/system-props/system-props.d.ts","../../node_modules/@mantine/core/lib/box/style-system-props/get-system-styles/get-system-styles.d.ts","../../node_modules/@mantine/core/lib/box/index.d.ts","../../node_modules/@mantine/core/lib/breadcrumbs/breadcrumbs.styles.d.ts","../../node_modules/@mantine/core/lib/breadcrumbs/breadcrumbs.d.ts","../../node_modules/@mantine/core/lib/breadcrumbs/index.d.ts","../../node_modules/@mantine/core/lib/burger/burger.styles.d.ts","../../node_modules/@mantine/core/lib/burger/burger.d.ts","../../node_modules/@mantine/core/lib/burger/index.d.ts","../../node_modules/@mantine/core/lib/button/buttongroup/buttongroup.styles.d.ts","../../node_modules/@mantine/core/lib/button/buttongroup/buttongroup.d.ts","../../node_modules/@mantine/core/lib/button/button.styles.d.ts","../../node_modules/@mantine/core/lib/button/button.d.ts","../../node_modules/@mantine/core/lib/button/index.d.ts","../../node_modules/@mantine/core/lib/paper/paper.styles.d.ts","../../node_modules/@mantine/core/lib/paper/paper.d.ts","../../node_modules/@mantine/core/lib/card/cardsection/cardsection.d.ts","../../node_modules/@mantine/core/lib/card/card.d.ts","../../node_modules/@mantine/core/lib/card/index.d.ts","../../node_modules/@mantine/core/lib/center/center.d.ts","../../node_modules/@mantine/core/lib/center/index.d.ts","../../node_modules/@mantine/core/lib/inlineinput/inlineinput.styles.d.ts","../../node_modules/@mantine/core/lib/inlineinput/inlineinput.d.ts","../../node_modules/@mantine/core/lib/inlineinput/index.d.ts","../../node_modules/@mantine/core/lib/checkbox/checkboxgroup/checkboxgroup.d.ts","../../node_modules/@mantine/core/lib/checkbox/checkbox.styles.d.ts","../../node_modules/@mantine/core/lib/checkbox/checkbox.d.ts","../../node_modules/@mantine/core/lib/checkbox/checkboxicon.d.ts","../../node_modules/@mantine/core/lib/checkbox/index.d.ts","../../node_modules/@mantine/core/lib/group/group.styles.d.ts","../../node_modules/@mantine/core/lib/group/group.d.ts","../../node_modules/@mantine/core/lib/group/index.d.ts","../../node_modules/@mantine/core/lib/chip/chipgroup/chipgroup.d.ts","../../node_modules/@mantine/core/lib/chip/chip.styles.d.ts","../../node_modules/@mantine/core/lib/chip/chip.d.ts","../../node_modules/@mantine/core/lib/chip/index.d.ts","../../node_modules/@mantine/core/lib/closebutton/closebutton.d.ts","../../node_modules/@mantine/core/lib/closebutton/index.d.ts","../../node_modules/@mantine/core/lib/code/code.styles.d.ts","../../node_modules/@mantine/core/lib/code/code.d.ts","../../node_modules/@mantine/core/lib/code/index.d.ts","../../node_modules/@mantine/core/lib/collapse/collapse.d.ts","../../node_modules/@mantine/core/lib/collapse/index.d.ts","../../node_modules/@mantine/core/lib/colorpicker/thumb/thumb.styles.d.ts","../../node_modules/@mantine/core/lib/colorpicker/thumb/thumb.d.ts","../../node_modules/@mantine/core/lib/colorpicker/colorslider/colorslider.styles.d.ts","../../node_modules/@mantine/core/lib/colorpicker/colorslider/colorslider.d.ts","../../node_modules/@mantine/core/lib/colorpicker/types.d.ts","../../node_modules/@mantine/core/lib/colorpicker/saturation/saturation.styles.d.ts","../../node_modules/@mantine/core/lib/colorpicker/saturation/saturation.d.ts","../../node_modules/@mantine/core/lib/colorpicker/swatches/swatches.styles.d.ts","../../node_modules/@mantine/core/lib/colorpicker/swatches/swatches.d.ts","../../node_modules/@mantine/core/lib/colorpicker/colorpicker.styles.d.ts","../../node_modules/@mantine/core/lib/colorpicker/colorpicker.d.ts","../../node_modules/@mantine/core/lib/colorinput/colorinput.d.ts","../../node_modules/@mantine/core/lib/colorinput/index.d.ts","../../node_modules/@mantine/core/lib/colorpicker/hueslider/hueslider.d.ts","../../node_modules/@mantine/core/lib/colorpicker/alphaslider/alphaslider.d.ts","../../node_modules/@mantine/core/lib/colorpicker/index.d.ts","../../node_modules/@mantine/core/lib/colorswatch/colorswatch.styles.d.ts","../../node_modules/@mantine/core/lib/colorswatch/colorswatch.d.ts","../../node_modules/@mantine/core/lib/colorswatch/index.d.ts","../../node_modules/@mantine/core/lib/container/container.d.ts","../../node_modules/@mantine/core/lib/container/container.styles.d.ts","../../node_modules/@mantine/core/lib/container/index.d.ts","../../node_modules/@mantine/core/lib/copybutton/copybutton.d.ts","../../node_modules/@mantine/core/lib/copybutton/index.d.ts","../../node_modules/@mantine/core/lib/paper/index.d.ts","../../node_modules/@mantine/core/lib/dialog/dialog.styles.d.ts","../../node_modules/@mantine/core/lib/dialog/dialog.d.ts","../../node_modules/@mantine/core/lib/dialog/index.d.ts","../../node_modules/@mantine/core/lib/divider/divider.d.ts","../../node_modules/@mantine/core/lib/divider/divider.styles.d.ts","../../node_modules/@mantine/core/lib/divider/index.d.ts","../../node_modules/@mantine/core/lib/drawer/drawer.styles.d.ts","../../node_modules/@mantine/core/lib/drawer/drawer.d.ts","../../node_modules/@mantine/core/lib/drawer/index.d.ts","../../node_modules/@mantine/core/lib/filebutton/filebutton.d.ts","../../node_modules/@mantine/core/lib/filebutton/index.d.ts","../../node_modules/@mantine/core/lib/fileinput/fileinput.styles.d.ts","../../node_modules/@mantine/core/lib/fileinput/fileinput.d.ts","../../node_modules/@mantine/core/lib/fileinput/index.d.ts","../../node_modules/@mantine/core/lib/flex/flex.d.ts","../../node_modules/@mantine/core/lib/flex/flex-props.d.ts","../../node_modules/@mantine/core/lib/flex/index.d.ts","../../node_modules/@mantine/core/lib/focustrap/focustrap.d.ts","../../node_modules/@mantine/core/lib/focustrap/index.d.ts","../../node_modules/@mantine/core/lib/grid/col/col.styles.d.ts","../../node_modules/@mantine/core/lib/grid/col/col.d.ts","../../node_modules/@mantine/core/lib/grid/grid.d.ts","../../node_modules/@mantine/core/lib/grid/grid.styles.d.ts","../../node_modules/@mantine/core/lib/grid/index.d.ts","../../node_modules/@mantine/core/lib/highlight/highlight.d.ts","../../node_modules/@mantine/core/lib/highlight/index.d.ts","../../node_modules/@mantine/core/lib/hovercard/hovercarddropdown/hovercarddropdown.d.ts","../../node_modules/@mantine/core/lib/hovercard/hovercardtarget/hovercardtarget.d.ts","../../node_modules/@mantine/core/lib/hovercard/hovercard.d.ts","../../node_modules/@mantine/core/lib/hovercard/index.d.ts","../../node_modules/@mantine/core/lib/image/image.styles.d.ts","../../node_modules/@mantine/core/lib/image/image.d.ts","../../node_modules/@mantine/core/lib/image/index.d.ts","../../node_modules/@mantine/core/lib/indicator/indicator.types.d.ts","../../node_modules/@mantine/core/lib/indicator/indicator.styles.d.ts","../../node_modules/@mantine/core/lib/indicator/indicator.d.ts","../../node_modules/@mantine/core/lib/indicator/index.d.ts","../../node_modules/@mantine/core/lib/inputbase/inputbase.d.ts","../../node_modules/@mantine/core/lib/inputbase/index.d.ts","../../node_modules/@mantine/core/lib/jsoninput/validate-json/validate-json.d.ts","../../node_modules/@mantine/core/lib/textinput/textinput.d.ts","../../node_modules/@mantine/core/lib/textarea/textarea.d.ts","../../node_modules/@mantine/core/lib/textarea/index.d.ts","../../node_modules/@mantine/core/lib/textinput/index.d.ts","../../node_modules/@mantine/core/lib/jsoninput/jsoninput.d.ts","../../node_modules/@mantine/core/lib/jsoninput/jsoninput.styles.d.ts","../../node_modules/@mantine/core/lib/jsoninput/index.d.ts","../../node_modules/@mantine/core/lib/kbd/kbd.d.ts","../../node_modules/@mantine/core/lib/kbd/index.d.ts","../../node_modules/@mantine/core/lib/list/list.styles.d.ts","../../node_modules/@mantine/core/lib/list/listitem/listitem.styles.d.ts","../../node_modules/@mantine/core/lib/list/listitem/listitem.d.ts","../../node_modules/@mantine/core/lib/list/list.d.ts","../../node_modules/@mantine/core/lib/list/index.d.ts","../../node_modules/@mantine/core/lib/loadingoverlay/loadingoverlay.d.ts","../../node_modules/@mantine/core/lib/loadingoverlay/index.d.ts","../../node_modules/@mantine/core/lib/mark/mark.d.ts","../../node_modules/@mantine/core/lib/mark/mark.styles.d.ts","../../node_modules/@mantine/core/lib/mark/index.d.ts","../../node_modules/@mantine/core/lib/mediaquery/mediaquery.d.ts","../../node_modules/@mantine/core/lib/mediaquery/mediaquery.styles.d.ts","../../node_modules/@mantine/core/lib/mediaquery/index.d.ts","../../node_modules/@mantine/core/lib/menu/menudivider/menudivider.styles.d.ts","../../node_modules/@mantine/core/lib/menu/menudivider/menudivider.d.ts","../../node_modules/@mantine/core/lib/menu/menudropdown/menudropdown.d.ts","../../node_modules/@mantine/core/lib/menu/menuitem/menuitem.styles.d.ts","../../node_modules/@mantine/core/lib/menu/menuitem/menuitem.d.ts","../../node_modules/@mantine/core/lib/menu/menulabel/menulabel.styles.d.ts","../../node_modules/@mantine/core/lib/menu/menulabel/menulabel.d.ts","../../node_modules/@mantine/core/lib/menu/menu.types.d.ts","../../node_modules/@mantine/core/lib/menu/menutarget/menutarget.d.ts","../../node_modules/@mantine/core/lib/menu/menu.d.ts","../../node_modules/@mantine/core/lib/menu/index.d.ts","../../node_modules/@mantine/core/lib/modal/modal.styles.d.ts","../../node_modules/@mantine/core/lib/modal/modal.d.ts","../../node_modules/@mantine/core/lib/modal/index.d.ts","../../node_modules/@mantine/core/lib/multiselect/defaultvalue/defaultvalue.styles.d.ts","../../node_modules/@mantine/core/lib/multiselect/defaultvalue/defaultvalue.d.ts","../../node_modules/@mantine/core/lib/multiselect/multiselect.styles.d.ts","../../node_modules/@mantine/core/lib/multiselect/multiselect.d.ts","../../node_modules/@mantine/core/lib/multiselect/index.d.ts","../../node_modules/@mantine/core/lib/nativeselect/nativeselect.d.ts","../../node_modules/@mantine/core/lib/nativeselect/index.d.ts","../../node_modules/@mantine/core/lib/navlink/navlink.styles.d.ts","../../node_modules/@mantine/core/lib/navlink/navlink.d.ts","../../node_modules/@mantine/core/lib/navlink/index.d.ts","../../node_modules/@mantine/core/lib/notification/notification.styles.d.ts","../../node_modules/@mantine/core/lib/notification/notification.d.ts","../../node_modules/@mantine/core/lib/notification/index.d.ts","../../node_modules/@mantine/core/lib/numberinput/numberinput.styles.d.ts","../../node_modules/@mantine/core/lib/numberinput/numberinput.d.ts","../../node_modules/@mantine/core/lib/numberinput/index.d.ts","../../node_modules/@mantine/core/lib/overlay/overlay.styles.d.ts","../../node_modules/@mantine/core/lib/overlay/overlay.d.ts","../../node_modules/@mantine/core/lib/overlay/index.d.ts","../../node_modules/@mantine/core/lib/pagination/defaultitem/defaultitem.d.ts","../../node_modules/@mantine/core/lib/pagination/pagination.styles.d.ts","../../node_modules/@mantine/core/lib/pagination/pagination.d.ts","../../node_modules/@mantine/core/lib/pagination/index.d.ts","../../node_modules/@mantine/core/lib/passwordinput/passwordinput.styles.d.ts","../../node_modules/@mantine/core/lib/passwordinput/passwordinput.d.ts","../../node_modules/@mantine/core/lib/passwordinput/index.d.ts","../../node_modules/@mantine/core/lib/portal/portal.d.ts","../../node_modules/@mantine/core/lib/portal/optionalportal.d.ts","../../node_modules/@mantine/core/lib/portal/index.d.ts","../../node_modules/@mantine/core/lib/progress/progress.styles.d.ts","../../node_modules/@mantine/core/lib/progress/progress.d.ts","../../node_modules/@mantine/core/lib/progress/index.d.ts","../../node_modules/@mantine/core/lib/radio/radiogroup/radiogroup.d.ts","../../node_modules/@mantine/core/lib/radio/radio.styles.d.ts","../../node_modules/@mantine/core/lib/radio/radio.d.ts","../../node_modules/@mantine/core/lib/radio/index.d.ts","../../node_modules/@mantine/core/lib/rating/ratingitem/ratingitem.styles.d.ts","../../node_modules/@mantine/core/lib/rating/ratingitem/ratingitem.d.ts","../../node_modules/@mantine/core/lib/rating/rating.styles.d.ts","../../node_modules/@mantine/core/lib/rating/rating.d.ts","../../node_modules/@mantine/core/lib/rating/starsymbol/staricon.d.ts","../../node_modules/@mantine/core/lib/rating/index.d.ts","../../node_modules/@mantine/core/lib/ringprogress/ringprogress.styles.d.ts","../../node_modules/@mantine/core/lib/ringprogress/ringprogress.d.ts","../../node_modules/@mantine/core/lib/ringprogress/index.d.ts","../../node_modules/@mantine/core/lib/scrollarea/scrollarea.styles.d.ts","../../node_modules/@mantine/core/lib/scrollarea/scrollarea.d.ts","../../node_modules/@mantine/core/lib/scrollarea/index.d.ts","../../node_modules/@mantine/core/lib/segmentedcontrol/segmentedcontrol.styles.d.ts","../../node_modules/@mantine/core/lib/segmentedcontrol/segmentedcontrol.d.ts","../../node_modules/@mantine/core/lib/segmentedcontrol/index.d.ts","../../node_modules/@mantine/core/lib/simplegrid/simplegrid.styles.d.ts","../../node_modules/@mantine/core/lib/simplegrid/simplegrid.d.ts","../../node_modules/@mantine/core/lib/simplegrid/get-sorted-breakpoints/get-sorted-breakpoints.d.ts","../../node_modules/@mantine/core/lib/simplegrid/index.d.ts","../../node_modules/@mantine/core/lib/skeleton/skeleton.styles.d.ts","../../node_modules/@mantine/core/lib/skeleton/skeleton.d.ts","../../node_modules/@mantine/core/lib/skeleton/index.d.ts","../../node_modules/@mantine/core/lib/slider/thumb/thumb.styles.d.ts","../../node_modules/@mantine/core/lib/slider/thumb/thumb.d.ts","../../node_modules/@mantine/core/lib/slider/marks/marks.styles.d.ts","../../node_modules/@mantine/core/lib/slider/marks/marks.d.ts","../../node_modules/@mantine/core/lib/slider/track/track.styles.d.ts","../../node_modules/@mantine/core/lib/slider/track/track.d.ts","../../node_modules/@mantine/core/lib/slider/sliderroot/sliderroot.styles.d.ts","../../node_modules/@mantine/core/lib/slider/sliderroot/sliderroot.d.ts","../../node_modules/@mantine/core/lib/slider/slider/slider.d.ts","../../node_modules/@mantine/core/lib/slider/rangeslider/rangeslider.d.ts","../../node_modules/@mantine/core/lib/slider/index.d.ts","../../node_modules/@mantine/core/lib/space/space.d.ts","../../node_modules/@mantine/core/lib/space/index.d.ts","../../node_modules/@mantine/core/lib/spoiler/spoiler.styles.d.ts","../../node_modules/@mantine/core/lib/spoiler/spoiler.d.ts","../../node_modules/@mantine/core/lib/spoiler/index.d.ts","../../node_modules/@mantine/core/lib/stack/stack.styles.d.ts","../../node_modules/@mantine/core/lib/stack/stack.d.ts","../../node_modules/@mantine/core/lib/stack/index.d.ts","../../node_modules/@mantine/core/lib/stepper/step/step.styles.d.ts","../../node_modules/@mantine/core/lib/stepper/step/step.d.ts","../../node_modules/@mantine/core/lib/stepper/stepcompleted/stepcompleted.d.ts","../../node_modules/@mantine/core/lib/stepper/stepper.styles.d.ts","../../node_modules/@mantine/core/lib/stepper/stepper.d.ts","../../node_modules/@mantine/core/lib/stepper/index.d.ts","../../node_modules/@mantine/core/lib/switch/switchgroup/switchgroup.d.ts","../../node_modules/@mantine/core/lib/switch/switch.styles.d.ts","../../node_modules/@mantine/core/lib/switch/switch.d.ts","../../node_modules/@mantine/core/lib/switch/index.d.ts","../../node_modules/@mantine/core/lib/table/table.styles.d.ts","../../node_modules/@mantine/core/lib/table/table.d.ts","../../node_modules/@mantine/core/lib/table/index.d.ts","../../node_modules/@mantine/core/lib/tabs/tabs.types.d.ts","../../node_modules/@mantine/core/lib/tabs/tabslist/tabslist.styles.d.ts","../../node_modules/@mantine/core/lib/tabs/tabslist/tabslist.d.ts","../../node_modules/@mantine/core/lib/tabs/tabspanel/tabspanel.styles.d.ts","../../node_modules/@mantine/core/lib/tabs/tabspanel/tabspanel.d.ts","../../node_modules/@mantine/core/lib/tabs/tab/tab.styles.d.ts","../../node_modules/@mantine/core/lib/tabs/tab/tab.d.ts","../../node_modules/@mantine/core/lib/tabs/tabsprovider.d.ts","../../node_modules/@mantine/core/lib/tabs/tabs.styles.d.ts","../../node_modules/@mantine/core/lib/tabs/tabs.d.ts","../../node_modules/@mantine/core/lib/tabs/index.d.ts","../../node_modules/@mantine/core/lib/text/text.styles.d.ts","../../node_modules/@mantine/core/lib/text/index.d.ts","../../node_modules/@mantine/core/lib/themeicon/themeicon.styles.d.ts","../../node_modules/@mantine/core/lib/themeicon/themeicon.d.ts","../../node_modules/@mantine/core/lib/themeicon/index.d.ts","../../node_modules/@mantine/core/lib/timeline/timelineitem/timelineitem.styles.d.ts","../../node_modules/@mantine/core/lib/timeline/timelineitem/timelineitem.d.ts","../../node_modules/@mantine/core/lib/timeline/timeline.d.ts","../../node_modules/@mantine/core/lib/timeline/index.d.ts","../../node_modules/@mantine/core/lib/title/title.styles.d.ts","../../node_modules/@mantine/core/lib/title/title.d.ts","../../node_modules/@mantine/core/lib/title/index.d.ts","../../node_modules/@mantine/core/lib/tooltip/tooltipgroup/tooltipgroup.d.ts","../../node_modules/@mantine/core/lib/tooltip/tooltip.styles.d.ts","../../node_modules/@mantine/core/lib/tooltip/tooltip.types.d.ts","../../node_modules/@mantine/core/lib/tooltip/tooltipfloating/tooltipfloating.d.ts","../../node_modules/@mantine/core/lib/tooltip/tooltip.d.ts","../../node_modules/@mantine/core/lib/tooltip/index.d.ts","../../node_modules/@mantine/core/lib/transferlist/types.d.ts","../../node_modules/@mantine/core/lib/transferlist/renderlist/renderlist.styles.d.ts","../../node_modules/@mantine/core/lib/transferlist/renderlist/renderlist.d.ts","../../node_modules/@mantine/core/lib/transferlist/use-selection-state/use-selection-state.d.ts","../../node_modules/@mantine/core/lib/transferlist/transferlist.d.ts","../../node_modules/@mantine/core/lib/transferlist/index.d.ts","../../node_modules/@mantine/core/lib/typographystylesprovider/typographystylesprovider.d.ts","../../node_modules/@mantine/core/lib/typographystylesprovider/index.d.ts","../../node_modules/@mantine/core/lib/unstyledbutton/unstyledbutton.d.ts","../../node_modules/@mantine/core/lib/unstyledbutton/index.d.ts","../../node_modules/@mantine/core/lib/index.d.ts","../../node_modules/@mantine/modals/lib/confirmmodal.d.ts","../../node_modules/@mantine/modals/lib/context.d.ts","../../node_modules/@mantine/modals/lib/modalsprovider.d.ts","../../node_modules/@mantine/modals/lib/use-modals/use-modals.d.ts","../../node_modules/@mantine/modals/lib/events.d.ts","../../node_modules/@mantine/modals/lib/index.d.ts","../../libraries/react-shared-libraries/src/helpers/mantine.wrapper.tsx","../../node_modules/react-tooltip/dist/react-tooltip.d.ts","./src/components/layout/top.tip.tsx","../../node_modules/react-loading/index.d.ts","../../libraries/react-shared-libraries/src/form/button.tsx","../../libraries/react-shared-libraries/src/helpers/use.media.directory.ts","./src/components/launches/helpers/top.title.component.tsx","./src/components/media/media.component.tsx","../../libraries/react-shared-libraries/src/toaster/toaster.tsx","../../node_modules/@types/unist/index.d.ts","../../node_modules/@types/hast/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/estree-jsx/index.d.ts","../../node_modules/@types/mdast/index.d.ts","../../node_modules/micromark-util-types/index.d.ts","../../node_modules/mdast-util-from-markdown/lib/index.d.ts","../../node_modules/mdast-util-from-markdown/index.d.ts","../../node_modules/mdast-util-to-markdown/lib/types.d.ts","../../node_modules/mdast-util-to-markdown/lib/index.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/blockquote.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/break.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/code.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/definition.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/emphasis.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/heading.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/html.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/image.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/image-reference.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/inline-code.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/link.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/link-reference.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/list.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/list-item.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/paragraph.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/root.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/strong.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/text.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/thematic-break.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/index.d.ts","../../node_modules/mdast-util-to-markdown/index.d.ts","../../node_modules/mdast-util-mdx-expression/lib/index.d.ts","../../node_modules/mdast-util-mdx-expression/index.d.ts","../../node_modules/mdast-util-mdx-jsx/lib/index.d.ts","../../node_modules/mdast-util-mdx-jsx/index.d.ts","../../node_modules/mdast-util-mdxjs-esm/lib/index.d.ts","../../node_modules/mdast-util-mdxjs-esm/index.d.ts","../../node_modules/property-information/lib/util/info.d.ts","../../node_modules/property-information/lib/util/schema.d.ts","../../node_modules/property-information/lib/find.d.ts","../../node_modules/property-information/lib/hast-to-react.d.ts","../../node_modules/property-information/lib/normalize.d.ts","../../node_modules/property-information/index.d.ts","../../node_modules/hast-util-to-jsx-runtime/lib/components.d.ts","../../node_modules/hast-util-to-jsx-runtime/lib/index.d.ts","../../node_modules/hast-util-to-jsx-runtime/index.d.ts","../../node_modules/vfile-message/lib/index.d.ts","../../node_modules/vfile-message/index.d.ts","../../node_modules/vfile/lib/index.d.ts","../../node_modules/vfile/index.d.ts","../../node_modules/mdast-util-to-hast/lib/state.d.ts","../../node_modules/mdast-util-to-hast/lib/footer.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/blockquote.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/break.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/code.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/delete.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/emphasis.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/footnote-reference.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/heading.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/html.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/image-reference.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/image.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/inline-code.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/link-reference.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/link.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/list-item.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/list.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/paragraph.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/root.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/strong.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/table.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/table-cell.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/table-row.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/text.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/thematic-break.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/index.d.ts","../../node_modules/mdast-util-to-hast/lib/index.d.ts","../../node_modules/mdast-util-to-hast/index.d.ts","../../node_modules/unified/lib/callable-instance.d.ts","../../node_modules/trough/lib/index.d.ts","../../node_modules/trough/index.d.ts","../../node_modules/unified/lib/index.d.ts","../../node_modules/unified/index.d.ts","../../node_modules/remark-rehype/lib/index.d.ts","../../node_modules/remark-rehype/index.d.ts","../../node_modules/unist-util-is/lib/index.d.ts","../../node_modules/unist-util-is/index.d.ts","../../node_modules/unist-util-visit-parents/lib/index.d.ts","../../node_modules/unist-util-visit-parents/index.d.ts","../../node_modules/unist-util-visit/lib/index.d.ts","../../node_modules/unist-util-visit/index.d.ts","../../node_modules/react-markdown/lib/index.d.ts","../../node_modules/react-markdown/index.d.ts","../../node_modules/rehype-rewrite/lib/index.d.ts","../../node_modules/@uiw/react-markdown-preview/lib/props.d.ts","../../node_modules/@uiw/react-markdown-preview/lib/index.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/bold.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/code.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/comment.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/divider.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/fullscreen.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/group.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/hr.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/image.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/italic.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/link.d.ts","../../node_modules/@uiw/react-md-editor/lib/utils/markdownutils.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/list.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/preview.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/quote.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/strikethrough.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/title.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/title1.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/title2.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/title3.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/title4.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/title5.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/title6.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/table.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/issue.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/help.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/index.d.ts","../../node_modules/@uiw/react-markdown-preview/nohighlight.d.ts","../../node_modules/@types/react/jsx-runtime.d.ts","../../node_modules/@uiw/react-md-editor/lib/components/textarea/textarea.d.ts","../../node_modules/@uiw/react-md-editor/lib/components/textarea/index.nohighlight.d.ts","../../node_modules/@uiw/react-md-editor/lib/types.d.ts","../../node_modules/@uiw/react-md-editor/lib/context.d.ts","../../node_modules/@uiw/react-md-editor/lib/editor.d.ts","../../node_modules/@uiw/react-md-editor/lib/utils/inserttextatposition.d.ts","../../node_modules/@uiw/react-md-editor/lib/index.d.ts","./src/components/post-url-selector/post.url.selector.tsx","./src/components/layout/organization.selector.tsx","../../node_modules/@uidotdev/usehooks/index.d.ts","./src/components/notifications/notification.component.tsx","../../node_modules/dayjs/plugin/utc.d.ts","../../node_modules/dayjs/plugin/weekofyear.d.ts","../../node_modules/dayjs/plugin/isoweek.d.ts","../../node_modules/dayjs/plugin/isbetween.d.ts","../../libraries/react-shared-libraries/src/form/input.tsx","./src/components/launches/helpers/linkedin.component.tsx","../../libraries/react-shared-libraries/src/form/textarea.tsx","../../libraries/nestjs-libraries/src/dtos/media/media.dto.ts","../../libraries/nestjs-libraries/src/dtos/users/user.details.dto.ts","../../node_modules/@types/lodash/common/common.d.ts","../../node_modules/@types/lodash/common/array.d.ts","../../node_modules/@types/lodash/common/collection.d.ts","../../node_modules/@types/lodash/common/date.d.ts","../../node_modules/@types/lodash/common/function.d.ts","../../node_modules/@types/lodash/common/lang.d.ts","../../node_modules/@types/lodash/common/math.d.ts","../../node_modules/@types/lodash/common/number.d.ts","../../node_modules/@types/lodash/common/object.d.ts","../../node_modules/@types/lodash/common/seq.d.ts","../../node_modules/@types/lodash/common/string.d.ts","../../node_modules/@types/lodash/common/util.d.ts","../../node_modules/@types/lodash/index.d.ts","../../libraries/react-shared-libraries/src/form/select.tsx","../../libraries/react-shared-libraries/src/form/checkbox.tsx","../../libraries/nestjs-libraries/src/dtos/settings/add.team.member.dto.ts","../../node_modules/copy-to-clipboard/index.d.ts","./src/components/settings/teams.component.tsx","./src/components/layout/settings.component.tsx","./src/components/settings/github.component.tsx","./src/components/onboarding/github.onboarding.tsx","../../node_modules/@mantine/hooks/lib/utils/assign-ref/assign-ref.d.ts","../../node_modules/@mantine/hooks/lib/utils/clamp/clamp.d.ts","../../node_modules/@mantine/hooks/lib/utils/lower-first/lower-first.d.ts","../../node_modules/@mantine/hooks/lib/utils/random-id/random-id.d.ts","../../node_modules/@mantine/hooks/lib/utils/range/range.d.ts","../../node_modules/@mantine/hooks/lib/utils/shallow-equal/shallow-equal.d.ts","../../node_modules/@mantine/hooks/lib/utils/upper-first/upper-first.d.ts","../../node_modules/@mantine/hooks/lib/utils/index.d.ts","../../node_modules/@mantine/hooks/lib/use-click-outside/use-click-outside.d.ts","../../node_modules/@mantine/hooks/lib/use-clipboard/use-clipboard.d.ts","../../node_modules/@mantine/hooks/lib/use-media-query/use-media-query.d.ts","../../node_modules/@mantine/hooks/lib/use-color-scheme/use-color-scheme.d.ts","../../node_modules/@mantine/hooks/lib/use-counter/use-counter.d.ts","../../node_modules/@mantine/hooks/lib/use-debounced-state/use-debounced-state.d.ts","../../node_modules/@mantine/hooks/lib/use-debounced-value/use-debounced-value.d.ts","../../node_modules/@mantine/hooks/lib/use-document-title/use-document-title.d.ts","../../node_modules/@mantine/hooks/lib/use-document-visibility/use-document-visibility.d.ts","../../node_modules/@mantine/hooks/lib/use-focus-return/use-focus-return.d.ts","../../node_modules/@mantine/hooks/lib/use-did-update/use-did-update.d.ts","../../node_modules/@mantine/hooks/lib/use-focus-trap/use-focus-trap.d.ts","../../node_modules/@mantine/hooks/lib/use-force-update/use-force-update.d.ts","../../node_modules/@mantine/hooks/lib/use-id/use-id.d.ts","../../node_modules/@mantine/hooks/lib/use-idle/use-idle.d.ts","../../node_modules/@mantine/hooks/lib/use-interval/use-interval.d.ts","../../node_modules/@mantine/hooks/lib/use-isomorphic-effect/use-isomorphic-effect.d.ts","../../node_modules/@mantine/hooks/lib/use-list-state/use-list-state.d.ts","../../node_modules/@mantine/hooks/lib/use-local-storage/create-storage.d.ts","../../node_modules/@mantine/hooks/lib/use-local-storage/use-local-storage.d.ts","../../node_modules/@mantine/hooks/lib/use-session-storage/use-session-storage.d.ts","../../node_modules/@mantine/hooks/lib/use-merged-ref/use-merged-ref.d.ts","../../node_modules/@mantine/hooks/lib/use-mouse/use-mouse.d.ts","../../node_modules/@mantine/hooks/lib/use-move/use-move.d.ts","../../node_modules/@mantine/hooks/lib/use-pagination/use-pagination.d.ts","../../node_modules/@mantine/hooks/lib/use-queue/use-queue.d.ts","../../node_modules/@mantine/hooks/lib/use-page-leave/use-page-leave.d.ts","../../node_modules/@mantine/hooks/lib/use-reduced-motion/use-reduced-motion.d.ts","../../node_modules/@mantine/hooks/lib/use-scroll-into-view/use-scroll-into-view.d.ts","../../node_modules/@mantine/hooks/lib/use-resize-observer/use-resize-observer.d.ts","../../node_modules/@mantine/hooks/lib/use-scroll-lock/use-scroll-lock.d.ts","../../node_modules/@mantine/hooks/lib/use-shallow-effect/use-shallow-effect.d.ts","../../node_modules/@mantine/hooks/lib/use-toggle/use-toggle.d.ts","../../node_modules/@mantine/hooks/lib/use-uncontrolled/use-uncontrolled.d.ts","../../node_modules/@mantine/hooks/lib/use-viewport-size/use-viewport-size.d.ts","../../node_modules/@mantine/hooks/lib/use-window-event/use-window-event.d.ts","../../node_modules/@mantine/hooks/lib/use-window-scroll/use-window-scroll.d.ts","../../node_modules/@mantine/hooks/lib/use-intersection/use-intersection.d.ts","../../node_modules/@mantine/hooks/lib/use-hash/use-hash.d.ts","../../node_modules/@mantine/hooks/lib/use-hotkeys/parse-hotkey.d.ts","../../node_modules/@mantine/hooks/lib/use-hotkeys/use-hotkeys.d.ts","../../node_modules/@mantine/hooks/lib/use-fullscreen/use-fullscreen.d.ts","../../node_modules/@mantine/hooks/lib/use-logger/use-logger.d.ts","../../node_modules/@mantine/hooks/lib/use-hover/use-hover.d.ts","../../node_modules/@mantine/hooks/lib/use-validated-state/use-validated-state.d.ts","../../node_modules/@mantine/hooks/lib/use-os/use-os.d.ts","../../node_modules/@mantine/hooks/lib/use-set-state/use-set-state.d.ts","../../node_modules/@mantine/hooks/lib/use-input-state/use-input-state.d.ts","../../node_modules/@mantine/hooks/lib/use-event-listener/use-event-listener.d.ts","../../node_modules/@mantine/hooks/lib/use-disclosure/use-disclosure.d.ts","../../node_modules/@mantine/hooks/lib/use-focus-within/use-focus-within.d.ts","../../node_modules/@mantine/hooks/lib/use-network/use-network.d.ts","../../node_modules/@mantine/hooks/lib/use-timeout/use-timeout.d.ts","../../node_modules/@mantine/hooks/lib/use-text-selection/use-text-selection.d.ts","../../node_modules/@mantine/hooks/lib/use-previous/use-previous.d.ts","../../node_modules/@mantine/hooks/lib/use-favicon/use-favicon.d.ts","../../node_modules/@mantine/hooks/lib/use-eye-dropper/use-eye-dropper.d.ts","../../node_modules/@mantine/hooks/lib/index.d.ts","./src/components/launches/menu/menu.tsx","../../libraries/nestjs-libraries/src/dtos/integrations/api.key.dto.ts","./src/components/launches/add.provider.component.tsx","./src/components/onboarding/connect.channels.tsx","./src/components/onboarding/onboarding.tsx","./src/components/layout/layout.settings.tsx","./src/app/(site)/layout.tsx","../../node_modules/chart.js/dist/core/core.config.d.ts","../../node_modules/chart.js/dist/types/utils.d.ts","../../node_modules/chart.js/dist/types/basic.d.ts","../../node_modules/chart.js/dist/core/core.adapters.d.ts","../../node_modules/chart.js/dist/types/geometric.d.ts","../../node_modules/chart.js/dist/types/animation.d.ts","../../node_modules/chart.js/dist/core/core.element.d.ts","../../node_modules/chart.js/dist/elements/element.point.d.ts","../../node_modules/chart.js/dist/helpers/helpers.easing.d.ts","../../node_modules/chart.js/dist/types/color.d.ts","../../node_modules/chart.js/dist/types/layout.d.ts","../../node_modules/chart.js/dist/plugins/plugin.colors.d.ts","../../node_modules/chart.js/dist/elements/element.arc.d.ts","../../node_modules/chart.js/dist/types/index.d.ts","../../node_modules/chart.js/dist/core/core.plugins.d.ts","../../node_modules/chart.js/dist/core/core.defaults.d.ts","../../node_modules/chart.js/dist/core/core.typedregistry.d.ts","../../node_modules/chart.js/dist/core/core.scale.d.ts","../../node_modules/chart.js/dist/core/core.registry.d.ts","../../node_modules/chart.js/dist/core/core.controller.d.ts","../../node_modules/chart.js/dist/core/core.datasetcontroller.d.ts","../../node_modules/chart.js/dist/controllers/controller.bar.d.ts","../../node_modules/chart.js/dist/controllers/controller.bubble.d.ts","../../node_modules/chart.js/dist/controllers/controller.doughnut.d.ts","../../node_modules/chart.js/dist/controllers/controller.line.d.ts","../../node_modules/chart.js/dist/controllers/controller.polararea.d.ts","../../node_modules/chart.js/dist/controllers/controller.pie.d.ts","../../node_modules/chart.js/dist/controllers/controller.radar.d.ts","../../node_modules/chart.js/dist/controllers/controller.scatter.d.ts","../../node_modules/chart.js/dist/controllers/index.d.ts","../../node_modules/chart.js/dist/core/core.animation.d.ts","../../node_modules/chart.js/dist/core/core.animations.d.ts","../../node_modules/chart.js/dist/core/core.animator.d.ts","../../node_modules/chart.js/dist/core/core.interaction.d.ts","../../node_modules/chart.js/dist/core/core.layouts.d.ts","../../node_modules/chart.js/dist/core/core.ticks.d.ts","../../node_modules/chart.js/dist/core/index.d.ts","../../node_modules/chart.js/dist/helpers/helpers.segment.d.ts","../../node_modules/chart.js/dist/elements/element.line.d.ts","../../node_modules/chart.js/dist/elements/element.bar.d.ts","../../node_modules/chart.js/dist/elements/index.d.ts","../../node_modules/chart.js/dist/platform/platform.base.d.ts","../../node_modules/chart.js/dist/platform/platform.basic.d.ts","../../node_modules/chart.js/dist/platform/platform.dom.d.ts","../../node_modules/chart.js/dist/platform/index.d.ts","../../node_modules/chart.js/dist/plugins/plugin.decimation.d.ts","../../node_modules/chart.js/dist/plugins/plugin.filler/index.d.ts","../../node_modules/chart.js/dist/plugins/plugin.legend.d.ts","../../node_modules/chart.js/dist/plugins/plugin.subtitle.d.ts","../../node_modules/chart.js/dist/plugins/plugin.title.d.ts","../../node_modules/chart.js/dist/helpers/helpers.core.d.ts","../../node_modules/chart.js/dist/plugins/plugin.tooltip.d.ts","../../node_modules/chart.js/dist/plugins/index.d.ts","../../node_modules/chart.js/dist/scales/scale.category.d.ts","../../node_modules/chart.js/dist/scales/scale.linearbase.d.ts","../../node_modules/chart.js/dist/scales/scale.linear.d.ts","../../node_modules/chart.js/dist/scales/scale.logarithmic.d.ts","../../node_modules/chart.js/dist/scales/scale.radiallinear.d.ts","../../node_modules/chart.js/dist/scales/scale.time.d.ts","../../node_modules/chart.js/dist/scales/scale.timeseries.d.ts","../../node_modules/chart.js/dist/scales/index.d.ts","../../node_modules/chart.js/dist/index.d.ts","../../node_modules/chart.js/dist/types.d.ts","../../node_modules/chart.js/auto/auto.d.ts","./src/components/analytics/chart.tsx","../../libraries/react-shared-libraries/src/helpers/utc.date.render.tsx","./src/components/analytics/stars.and.forks.tsx","./src/components/analytics/stars.table.component.tsx","./src/components/layout/loading.tsx","./src/components/analytics/analytics.component.tsx","./src/app/(site)/analytics/page.tsx","../../libraries/react-shared-libraries/src/form/slider.tsx","../../libraries/react-shared-libraries/src/form/track.tsx","../../node_modules/use-debounce/dist/usedebouncedcallback.d.ts","../../node_modules/use-debounce/dist/usedebounce.d.ts","../../node_modules/use-debounce/dist/usethrottledcallback.d.ts","../../node_modules/use-debounce/dist/index.d.ts","./src/components/billing/faq.component.tsx","./src/components/billing/main.billing.component.tsx","./src/components/billing/billing.component.tsx","./src/app/(site)/billing/page.tsx","./src/components/billing/lifetime.deal.tsx","./src/app/(site)/billing/lifetime/page.tsx","./src/app/(site)/err/page.tsx","../../node_modules/next/dist/client/components/draft-mode.d.ts","../../node_modules/next/dist/client/components/headers.d.ts","../../node_modules/next/headers.d.ts","../../libraries/helpers/src/utils/internal.fetch.ts","./src/app/(site)/integrations/social/[provider]/page.tsx","../../libraries/react-shared-libraries/src/helpers/use.prevent.window.unload.tsx","./src/components/launches/helpers/use.hide.top.editor.tsx","./src/components/launches/helpers/use.move.to.integration.tsx","./src/components/launches/helpers/use.existing.data.tsx","./src/components/launches/helpers/new.image.component.tsx","./src/components/launches/helpers/use.expend.tsx","./src/components/launches/helpers/pick.platform.component.tsx","./src/components/launches/up.down.arrow.tsx","../../node_modules/array-move/index.d.ts","./src/components/launches/providers/high.order.provider.tsx","../../libraries/nestjs-libraries/src/dtos/posts/providers-settings/dev.to.tags.settings.ts","../../libraries/nestjs-libraries/src/dtos/posts/providers-settings/dev.to.settings.dto.ts","./src/components/launches/providers/devto/select.organization.tsx","../../node_modules/react-tag-autocomplete/dist/types.d.ts","./src/components/launches/providers/devto/devto.tags.tsx","../../node_modules/next/dist/compiled/@next/font/dist/local/index.d.ts","../../node_modules/next/font/local/index.d.ts","../../libraries/react-shared-libraries/src/form/canonical.tsx","./src/components/launches/providers/devto/devto.provider.tsx","./src/components/launches/providers/x/x.provider.tsx","../../libraries/helpers/src/utils/linkedin.company.prevent.remove.ts","./src/components/launches/providers/linkedin/linkedin.provider.tsx","./src/components/launches/providers/reddit/subreddit.tsx","../../libraries/nestjs-libraries/src/dtos/posts/providers-settings/reddit.dto.ts","./src/components/launches/providers/reddit/reddit.provider.tsx","./src/components/launches/providers/medium/medium.publications.tsx","./src/components/launches/providers/medium/medium.tags.tsx","../../libraries/nestjs-libraries/src/dtos/posts/providers-settings/medium.settings.dto.ts","./src/components/launches/providers/medium/medium.provider.tsx","./src/components/launches/providers/hashnode/hashnode.publications.tsx","./src/components/launches/providers/hashnode/hashnode.tags.tsx","../../libraries/nestjs-libraries/src/dtos/posts/providers-settings/hashnode.settings.dto.ts","./src/components/launches/providers/hashnode/hashnode.provider.tsx","./src/components/launches/providers/show.all.providers.tsx","./src/components/launches/providers.options.tsx","../../node_modules/@types/uuid/index.d.ts","../../node_modules/@mantine/dates/lib/types.d.ts","../../node_modules/@mantine/dates/lib/utils/get-end-of-week/get-end-of-week.d.ts","../../node_modules/@mantine/dates/lib/utils/get-month-days/get-month-days.d.ts","../../node_modules/@mantine/dates/lib/utils/get-months-names/get-months-names.d.ts","../../node_modules/@mantine/dates/lib/utils/get-start-of-week/get-start-of-week.d.ts","../../node_modules/@mantine/dates/lib/utils/get-weekdays-names/get-weekdays-names.d.ts","../../node_modules/@mantine/dates/lib/utils/get-years-range/get-years-range.d.ts","../../node_modules/@mantine/dates/lib/utils/is-same-date/is-same-date.d.ts","../../node_modules/@mantine/dates/lib/utils/is-same-month/is-same-month.d.ts","../../node_modules/@mantine/dates/lib/utils/index.d.ts","../../node_modules/@mantine/dates/lib/components/month/day/day.styles.d.ts","../../node_modules/@mantine/dates/lib/components/month/day/day.d.ts","../../node_modules/@mantine/dates/lib/components/month/types.d.ts","../../node_modules/@mantine/dates/lib/components/month/month.styles.d.ts","../../node_modules/@mantine/dates/lib/components/month/month.d.ts","../../node_modules/@mantine/dates/lib/components/month/index.d.ts","../../node_modules/@mantine/dates/lib/components/calendarbase/calendarheader/calendarheader.styles.d.ts","../../node_modules/@mantine/dates/lib/components/calendarbase/calendarheader/calendarheader.d.ts","../../node_modules/@mantine/dates/lib/components/calendarbase/yearpicker/yearpicker.styles.d.ts","../../node_modules/@mantine/dates/lib/components/calendarbase/yearpicker/yearpicker.d.ts","../../node_modules/@mantine/dates/lib/components/calendarbase/monthpicker/monthpicker.styles.d.ts","../../node_modules/@mantine/dates/lib/components/calendarbase/monthpicker/monthpicker.d.ts","../../node_modules/@mantine/dates/lib/components/calendarbase/monthslist/monthslist.d.ts","../../node_modules/@mantine/dates/lib/components/calendarbase/calendarbase.styles.d.ts","../../node_modules/@mantine/dates/lib/components/calendarbase/calendarbase.d.ts","../../node_modules/@mantine/dates/lib/components/calendar/calendar.d.ts","../../node_modules/@mantine/dates/lib/components/calendar/index.d.ts","../../node_modules/@mantine/dates/lib/components/datepickerbase/datepickerbase.styles.d.ts","../../node_modules/@mantine/dates/lib/components/datepickerbase/datepickerbase.d.ts","../../node_modules/@mantine/dates/lib/components/datepicker/datepicker.d.ts","../../node_modules/@mantine/dates/lib/components/datepicker/index.d.ts","../../node_modules/@mantine/dates/lib/components/daterangepicker/daterangepicker.d.ts","../../node_modules/@mantine/dates/lib/components/daterangepicker/index.d.ts","../../node_modules/@mantine/dates/lib/components/rangecalendar/rangecalendar.d.ts","../../node_modules/@mantine/dates/lib/components/rangecalendar/index.d.ts","../../node_modules/@mantine/dates/lib/components/timeinput/timeinput.styles.d.ts","../../node_modules/@mantine/dates/lib/components/timeinput/timeinput.d.ts","../../node_modules/@mantine/dates/lib/components/timeinput/index.d.ts","../../node_modules/@mantine/dates/lib/components/timerangeinput/timerangeinput.styles.d.ts","../../node_modules/@mantine/dates/lib/components/timerangeinput/timerangeinput.d.ts","../../node_modules/@mantine/dates/lib/components/timerangeinput/index.d.ts","../../node_modules/@mantine/dates/lib/components/calendarbase/index.d.ts","../../node_modules/@mantine/dates/lib/components/datepickerbase/index.d.ts","../../node_modules/@mantine/dates/lib/index.d.ts","./src/components/launches/helpers/date.picker.tsx","../../libraries/react-shared-libraries/src/form/custom.select.tsx","./src/components/launches/post.to.organization.tsx","./src/components/launches/submitted.tsx","./src/components/launches/add.edit.model.tsx","../../node_modules/dnd-core/dist/interfaces.d.ts","../../node_modules/dnd-core/dist/createdragdropmanager.d.ts","../../node_modules/dnd-core/dist/index.d.ts","../../node_modules/react-dnd/dist/core/dndcontext.d.ts","../../node_modules/react-dnd/dist/core/dndprovider.d.ts","../../node_modules/react-dnd/dist/types/options.d.ts","../../node_modules/react-dnd/dist/types/connectors.d.ts","../../node_modules/react-dnd/dist/types/monitors.d.ts","../../node_modules/react-dnd/dist/types/index.d.ts","../../node_modules/react-dnd/dist/core/dragpreviewimage.d.ts","../../node_modules/react-dnd/dist/core/index.d.ts","../../node_modules/react-dnd/dist/hooks/types.d.ts","../../node_modules/react-dnd/dist/hooks/usedrag/usedrag.d.ts","../../node_modules/react-dnd/dist/hooks/usedrag/index.d.ts","../../node_modules/react-dnd/dist/hooks/usedragdropmanager.d.ts","../../node_modules/react-dnd/dist/hooks/usedraglayer.d.ts","../../node_modules/react-dnd/dist/hooks/usedrop/usedrop.d.ts","../../node_modules/react-dnd/dist/hooks/usedrop/index.d.ts","../../node_modules/react-dnd/dist/hooks/index.d.ts","../../node_modules/react-dnd/dist/index.d.ts","../../node_modules/react-dnd-html5-backend/dist/getemptyimage.d.ts","../../node_modules/react-dnd-html5-backend/dist/nativetypes.d.ts","../../node_modules/react-dnd-html5-backend/dist/types.d.ts","../../node_modules/react-dnd-html5-backend/dist/index.d.ts","./src/components/launches/helpers/dnd.provider.tsx","./src/components/launches/comments/comment.component.tsx","./src/components/marketplace/marketplace.provider.tsx","./src/components/marketplace/preview.popup.dynamic.tsx","./src/components/marketplace/special.message.tsx","./src/components/launches/calendar.tsx","./src/components/launches/filters.tsx","../../libraries/nestjs-libraries/src/dtos/generator/generator.dto.ts","./src/components/launches/generator/generator.tsx","./src/components/launches/launches.component.tsx","./src/app/(site)/launches/page.tsx","./src/components/marketplace/buyer.seller.tsx","./src/app/(site)/marketplace/layout.tsx","./src/app/(site)/marketplace/page.tsx","../../libraries/nestjs-libraries/src/database/prisma/marketplace/tags.list.ts","../../libraries/nestjs-libraries/src/dtos/marketplace/new.conversation.dto.ts","./src/components/marketplace/order.list.tsx","./src/components/marketplace/buyer.tsx","./src/app/(site)/marketplace/buyer/page.tsx","../../libraries/nestjs-libraries/src/services/stripe.country.list.ts","./src/components/marketplace/seller.tsx","./src/app/(site)/marketplace/seller/page.tsx","./src/components/messages/layout.tsx","./src/app/(site)/messages/layout.tsx","./src/app/(site)/messages/page.tsx","../../libraries/nestjs-libraries/src/dtos/messages/add.message.ts","../../libraries/nestjs-libraries/src/services/make.is.ts","../../libraries/react-shared-libraries/src/form/total.tsx","../../node_modules/yup/node_modules/type-fest/source/primitive.d.ts","../../node_modules/yup/node_modules/type-fest/source/typed-array.d.ts","../../node_modules/yup/node_modules/type-fest/source/basic.d.ts","../../node_modules/yup/node_modules/type-fest/source/observable-like.d.ts","../../node_modules/yup/node_modules/type-fest/source/internal.d.ts","../../node_modules/yup/node_modules/type-fest/source/except.d.ts","../../node_modules/yup/node_modules/type-fest/source/simplify.d.ts","../../node_modules/yup/node_modules/type-fest/source/writable.d.ts","../../node_modules/yup/node_modules/type-fest/source/mutable.d.ts","../../node_modules/yup/node_modules/type-fest/source/merge.d.ts","../../node_modules/yup/node_modules/type-fest/source/merge-exclusive.d.ts","../../node_modules/yup/node_modules/type-fest/source/require-at-least-one.d.ts","../../node_modules/yup/node_modules/type-fest/source/require-exactly-one.d.ts","../../node_modules/yup/node_modules/type-fest/source/require-all-or-none.d.ts","../../node_modules/yup/node_modules/type-fest/source/remove-index-signature.d.ts","../../node_modules/yup/node_modules/type-fest/source/partial-deep.d.ts","../../node_modules/yup/node_modules/type-fest/source/partial-on-undefined-deep.d.ts","../../node_modules/yup/node_modules/type-fest/source/readonly-deep.d.ts","../../node_modules/yup/node_modules/type-fest/source/literal-union.d.ts","../../node_modules/yup/node_modules/type-fest/source/promisable.d.ts","../../node_modules/yup/node_modules/type-fest/source/opaque.d.ts","../../node_modules/yup/node_modules/type-fest/source/invariant-of.d.ts","../../node_modules/yup/node_modules/type-fest/source/set-optional.d.ts","../../node_modules/yup/node_modules/type-fest/source/set-required.d.ts","../../node_modules/yup/node_modules/type-fest/source/set-non-nullable.d.ts","../../node_modules/yup/node_modules/type-fest/source/value-of.d.ts","../../node_modules/yup/node_modules/type-fest/source/promise-value.d.ts","../../node_modules/yup/node_modules/type-fest/source/async-return-type.d.ts","../../node_modules/yup/node_modules/type-fest/source/conditional-keys.d.ts","../../node_modules/yup/node_modules/type-fest/source/conditional-except.d.ts","../../node_modules/yup/node_modules/type-fest/source/conditional-pick.d.ts","../../node_modules/yup/node_modules/type-fest/source/union-to-intersection.d.ts","../../node_modules/yup/node_modules/type-fest/source/stringified.d.ts","../../node_modules/yup/node_modules/type-fest/source/fixed-length-array.d.ts","../../node_modules/yup/node_modules/type-fest/source/multidimensional-array.d.ts","../../node_modules/yup/node_modules/type-fest/source/multidimensional-readonly-array.d.ts","../../node_modules/yup/node_modules/type-fest/source/iterable-element.d.ts","../../node_modules/yup/node_modules/type-fest/source/entry.d.ts","../../node_modules/yup/node_modules/type-fest/source/entries.d.ts","../../node_modules/yup/node_modules/type-fest/source/set-return-type.d.ts","../../node_modules/yup/node_modules/type-fest/source/asyncify.d.ts","../../node_modules/yup/node_modules/type-fest/source/numeric.d.ts","../../node_modules/yup/node_modules/type-fest/source/jsonify.d.ts","../../node_modules/yup/node_modules/type-fest/source/schema.d.ts","../../node_modules/yup/node_modules/type-fest/source/literal-to-primitive.d.ts","../../node_modules/yup/node_modules/type-fest/source/string-key-of.d.ts","../../node_modules/yup/node_modules/type-fest/source/exact.d.ts","../../node_modules/yup/node_modules/type-fest/source/readonly-tuple.d.ts","../../node_modules/yup/node_modules/type-fest/source/optional-keys-of.d.ts","../../node_modules/yup/node_modules/type-fest/source/has-optional-keys.d.ts","../../node_modules/yup/node_modules/type-fest/source/required-keys-of.d.ts","../../node_modules/yup/node_modules/type-fest/source/has-required-keys.d.ts","../../node_modules/yup/node_modules/type-fest/source/spread.d.ts","../../node_modules/yup/node_modules/type-fest/source/split.d.ts","../../node_modules/yup/node_modules/type-fest/source/camel-case.d.ts","../../node_modules/yup/node_modules/type-fest/source/camel-cased-properties.d.ts","../../node_modules/yup/node_modules/type-fest/source/camel-cased-properties-deep.d.ts","../../node_modules/yup/node_modules/type-fest/source/delimiter-case.d.ts","../../node_modules/yup/node_modules/type-fest/source/kebab-case.d.ts","../../node_modules/yup/node_modules/type-fest/source/delimiter-cased-properties.d.ts","../../node_modules/yup/node_modules/type-fest/source/kebab-cased-properties.d.ts","../../node_modules/yup/node_modules/type-fest/source/delimiter-cased-properties-deep.d.ts","../../node_modules/yup/node_modules/type-fest/source/kebab-cased-properties-deep.d.ts","../../node_modules/yup/node_modules/type-fest/source/pascal-case.d.ts","../../node_modules/yup/node_modules/type-fest/source/pascal-cased-properties.d.ts","../../node_modules/yup/node_modules/type-fest/source/pascal-cased-properties-deep.d.ts","../../node_modules/yup/node_modules/type-fest/source/snake-case.d.ts","../../node_modules/yup/node_modules/type-fest/source/snake-cased-properties.d.ts","../../node_modules/yup/node_modules/type-fest/source/snake-cased-properties-deep.d.ts","../../node_modules/yup/node_modules/type-fest/source/includes.d.ts","../../node_modules/yup/node_modules/type-fest/source/screaming-snake-case.d.ts","../../node_modules/yup/node_modules/type-fest/source/join.d.ts","../../node_modules/yup/node_modules/type-fest/source/trim.d.ts","../../node_modules/yup/node_modules/type-fest/source/replace.d.ts","../../node_modules/yup/node_modules/type-fest/source/get.d.ts","../../node_modules/yup/node_modules/type-fest/source/last-array-element.d.ts","../../node_modules/yup/node_modules/type-fest/source/package-json.d.ts","../../node_modules/yup/node_modules/type-fest/source/tsconfig-json.d.ts","../../node_modules/yup/node_modules/type-fest/index.d.ts","../../node_modules/yup/index.d.ts","../../node_modules/@hookform/resolvers/yup/dist/yup.d.ts","../../node_modules/@hookform/resolvers/yup/dist/index.d.ts","./src/components/marketplace/order.top.actions.tsx","../../libraries/react-shared-libraries/src/helpers/use.is.visible.tsx","./src/components/messages/messages.tsx","./src/app/(site)/messages/[id]/page.tsx","./src/components/settings/settings.component.tsx","./src/app/(site)/settings/page.tsx","./src/app/auth/layout.tsx","../../libraries/nestjs-libraries/src/dtos/auth/create.org.user.dto.ts","./src/app/auth/providers/github.provider.tsx","./src/components/auth/register.tsx","./src/app/auth/page.tsx","../../libraries/nestjs-libraries/src/dtos/auth/forgot.password.dto.ts","./src/components/auth/forgot.tsx","./src/app/auth/forgot/page.tsx","../../libraries/nestjs-libraries/src/dtos/auth/forgot-return.password.dto.ts","./src/components/auth/forgot-return.tsx","./src/app/auth/forgot/[token]/page.tsx","../../libraries/nestjs-libraries/src/dtos/auth/login.user.dto.ts","./src/components/auth/login.tsx","./src/app/auth/login/page.tsx","./src/components/marketplace/marketplace.tsx","../../node_modules/@nx/next/src/utils/types.d.ts","../../node_modules/@nx/next/src/utils/generate-globs.d.ts","../../node_modules/@types/node/ts4.8/fs.d.ts","../../node_modules/nx/src/generators/tree.d.ts","../../node_modules/nx/src/command-line/release/utils/git.d.ts","../../node_modules/nx/src/config/project-graph.d.ts","../../node_modules/nx/src/command-line/release/config/config.d.ts","../../node_modules/nx/src/command-line/release/config/filter-release-groups.d.ts","../../node_modules/nx/src/command-line/release/utils/shared.d.ts","../../node_modules/nx/src/command-line/release/utils/github.d.ts","../../node_modules/nx/release/changelog-renderer/index.d.ts","../../node_modules/nx/src/utils/package-manager.d.ts","../../node_modules/nx/src/config/nx-json.d.ts","../../node_modules/nx/src/config/workspace-json-project-json.d.ts","../../node_modules/nx/src/config/task-graph.d.ts","../../node_modules/nx/src/utils/package-json.d.ts","../../node_modules/nx/src/utils/nx-plugin.deprecated.d.ts","../../node_modules/nx/src/project-graph/project-graph-builder.d.ts","../../node_modules/nx/src/utils/nx-plugin.d.ts","../../node_modules/nx/src/plugins/target-defaults/target-defaults-plugin.d.ts","../../node_modules/nx/src/project-graph/utils/project-configuration-utils.d.ts","../../node_modules/nx/src/daemon/client/client.d.ts","../../node_modules/nx/src/native/index.d.ts","../../node_modules/nx/src/hasher/task-hasher.d.ts","../../node_modules/enquirer/index.d.ts","../../node_modules/nx/src/utils/params.d.ts","../../node_modules/nx/src/config/misc-interfaces.d.ts","../../node_modules/nx/src/config/workspaces.d.ts","../../node_modules/nx/src/config/configuration.d.ts","../../node_modules/nx/src/utils/logger.d.ts","../../node_modules/nx/node_modules/chalk/index.d.ts","../../node_modules/@types/yargs-parser/index.d.ts","../../node_modules/@types/yargs/index.d.ts","../../node_modules/nx/src/utils/command-line-utils.d.ts","../../node_modules/nx/src/tasks-runner/tasks-runner.d.ts","../../node_modules/nx/src/utils/output.d.ts","../../node_modules/nx/src/command-line/run/run.d.ts","../../node_modules/nx/src/generators/utils/nx-json.d.ts","../../node_modules/nx/src/generators/utils/project-configuration.d.ts","../../node_modules/nx/src/generators/utils/glob.d.ts","../../node_modules/nx/node_modules/jsonc-parser/lib/umd/main.d.ts","../../node_modules/nx/src/utils/json.d.ts","../../node_modules/nx/src/generators/utils/json.d.ts","../../node_modules/nx/src/utils/fileutils.d.ts","../../node_modules/nx/src/utils/strip-indents.d.ts","../../node_modules/nx/src/utils/path.d.ts","../../node_modules/nx/src/utils/workspace-root.d.ts","../../node_modules/nx/src/utils/app-root.d.ts","../../node_modules/nx/src/project-graph/operators.d.ts","../../node_modules/nx/src/project-graph/project-graph.d.ts","../../node_modules/nx/src/tasks-runner/utils.d.ts","../../node_modules/nx/src/tasks-runner/life-cycle.d.ts","../../node_modules/nx/src/tasks-runner/default-tasks-runner.d.ts","../../node_modules/nx/src/hasher/file-hasher.d.ts","../../node_modules/nx/src/utils/cache-directory.d.ts","../../node_modules/nx/src/project-graph/file-map-utils.d.ts","../../node_modules/nx/src/devkit-exports.d.ts","../../node_modules/@nx/devkit/src/generators/format-files.d.ts","../../node_modules/@nx/devkit/src/generators/generate-files.d.ts","../../node_modules/typescript/lib/typescript.d.ts","../../node_modules/@nx/devkit/src/generators/to-js.d.ts","../../node_modules/@nx/devkit/src/generators/update-ts-configs-to-js.d.ts","../../node_modules/@nx/devkit/src/generators/run-tasks-in-serial.d.ts","../../node_modules/@nx/devkit/src/generators/visit-not-ignored-files.d.ts","../../node_modules/@nx/devkit/src/executors/parse-target-string.d.ts","../../node_modules/@nx/devkit/src/executors/read-target-options.d.ts","../../node_modules/@nx/devkit/src/utils/package-json.d.ts","../../node_modules/@nx/devkit/src/tasks/install-packages-task.d.ts","../../node_modules/@nx/devkit/src/utils/names.d.ts","../../node_modules/@nx/devkit/src/utils/get-workspace-layout.d.ts","../../node_modules/@nx/devkit/src/utils/string-change.d.ts","../../node_modules/@nx/devkit/src/utils/offset-from-root.d.ts","../../node_modules/@nx/devkit/src/utils/invoke-nx-generator.d.ts","../../node_modules/@nx/devkit/src/utils/convert-nx-executor.d.ts","../../node_modules/@nx/devkit/src/utils/move-dir.d.ts","../../node_modules/@nx/devkit/public-api.d.ts","../../node_modules/@nx/devkit/index.d.ts","../../node_modules/@nx/devkit/src/generators/project-name-and-root-utils.d.ts","../../node_modules/@nx/eslint/src/generators/utils/linter.d.ts","../../node_modules/@nx/eslint/src/generators/lint-project/lint-project.d.ts","../../node_modules/@nx/eslint/src/generators/init/init.d.ts","../../node_modules/@types/eslint/helpers.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/eslint/index.d.ts","../../node_modules/@nx/eslint/src/utils/rules-requiring-type-checking.d.ts","../../node_modules/@nx/eslint/index.d.ts","../../node_modules/@nx/react/src/utils/lint.d.ts","../../node_modules/@nx/react/src/utils/dependencies.d.ts","../../node_modules/@nx/react/src/utils/styled.d.ts","../../node_modules/@nx/react/src/utils/assertion.d.ts","../../node_modules/@nx/react/src/utils/versions.d.ts","../../node_modules/@nx/react/typings/style.d.ts","../../node_modules/@nx/react/src/generators/application/schema.d.ts","../../node_modules/@nx/react/src/generators/application/application.d.ts","../../node_modules/@nx/react/src/generators/component/schema.d.ts","../../node_modules/@nx/react/src/generators/component/component.d.ts","../../node_modules/@nx/react/src/generators/hook/schema.d.ts","../../node_modules/@nx/react/src/generators/hook/hook.d.ts","../../node_modules/@nx/react/src/generators/component-cypress-spec/component-cypress-spec.d.ts","../../node_modules/@nx/react/src/generators/component-story/component-story.d.ts","../../node_modules/@nx/react/src/generators/library/schema.d.ts","../../node_modules/@nx/react/src/generators/library/library.d.ts","../../node_modules/@nx/react/src/generators/init/schema.d.ts","../../node_modules/@nx/react/src/generators/init/init.d.ts","../../node_modules/@nx/react/src/generators/redux/schema.d.ts","../../node_modules/@nx/react/src/generators/redux/redux.d.ts","../../node_modules/@nx/react/src/generators/stories/stories.d.ts","../../node_modules/@nx/react/src/generators/storybook-configuration/schema.d.ts","../../node_modules/@nx/react/src/generators/storybook-configuration/configuration.d.ts","../../node_modules/@nx/react/src/generators/host/schema.d.ts","../../node_modules/@nx/react/src/generators/host/host.d.ts","../../node_modules/@nx/react/src/generators/remote/schema.d.ts","../../node_modules/@nx/react/src/generators/remote/remote.d.ts","../../node_modules/@nx/react/src/generators/cypress-component-configuration/schema.d.ts","../../node_modules/@nx/react/src/generators/cypress-component-configuration/cypress-component-configuration.d.ts","../../node_modules/@nx/react/src/generators/component-test/schema.d.ts","../../node_modules/@nx/react/src/generators/component-test/component-test.d.ts","../../node_modules/@nx/react/src/generators/setup-tailwind/schema.d.ts","../../node_modules/@nx/react/src/generators/setup-tailwind/setup-tailwind.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/schema-utils/declarations/validationerror.d.ts","../../node_modules/schema-utils/node_modules/ajv/lib/ajv.d.ts","../../node_modules/schema-utils/declarations/validate.d.ts","../../node_modules/schema-utils/declarations/index.d.ts","../../node_modules/tapable/tapable.d.ts","../../node_modules/webpack/types.d.ts","../../node_modules/@nx/webpack/src/generators/configuration/schema.d.ts","../../node_modules/@nx/webpack/src/generators/configuration/configuration.d.ts","../../node_modules/copy-webpack-plugin/node_modules/schema-utils/declarations/validationerror.d.ts","../../node_modules/uri-js/dist/es5/uri.all.d.ts","../../node_modules/ajv/dist/compile/codegen/code.d.ts","../../node_modules/ajv/dist/compile/codegen/scope.d.ts","../../node_modules/ajv/dist/compile/codegen/index.d.ts","../../node_modules/ajv/dist/compile/rules.d.ts","../../node_modules/ajv/dist/compile/util.d.ts","../../node_modules/ajv/dist/compile/validate/subschema.d.ts","../../node_modules/ajv/dist/compile/errors.d.ts","../../node_modules/ajv/dist/compile/validate/index.d.ts","../../node_modules/ajv/dist/compile/validate/datatype.d.ts","../../node_modules/ajv/dist/vocabularies/applicator/additionalitems.d.ts","../../node_modules/ajv/dist/vocabularies/applicator/items2020.d.ts","../../node_modules/ajv/dist/vocabularies/applicator/contains.d.ts","../../node_modules/ajv/dist/vocabularies/applicator/dependencies.d.ts","../../node_modules/ajv/dist/vocabularies/applicator/propertynames.d.ts","../../node_modules/ajv/dist/vocabularies/applicator/additionalproperties.d.ts","../../node_modules/ajv/dist/vocabularies/applicator/not.d.ts","../../node_modules/ajv/dist/vocabularies/applicator/anyof.d.ts","../../node_modules/ajv/dist/vocabularies/applicator/oneof.d.ts","../../node_modules/ajv/dist/vocabularies/applicator/if.d.ts","../../node_modules/ajv/dist/vocabularies/applicator/index.d.ts","../../node_modules/ajv/dist/vocabularies/validation/limitnumber.d.ts","../../node_modules/ajv/dist/vocabularies/validation/multipleof.d.ts","../../node_modules/ajv/dist/vocabularies/validation/pattern.d.ts","../../node_modules/ajv/dist/vocabularies/validation/required.d.ts","../../node_modules/ajv/dist/vocabularies/validation/uniqueitems.d.ts","../../node_modules/ajv/dist/vocabularies/validation/const.d.ts","../../node_modules/ajv/dist/vocabularies/validation/enum.d.ts","../../node_modules/ajv/dist/vocabularies/validation/index.d.ts","../../node_modules/ajv/dist/vocabularies/format/format.d.ts","../../node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedproperties.d.ts","../../node_modules/ajv/dist/vocabularies/unevaluated/unevaluateditems.d.ts","../../node_modules/ajv/dist/vocabularies/validation/dependentrequired.d.ts","../../node_modules/ajv/dist/vocabularies/discriminator/types.d.ts","../../node_modules/ajv/dist/vocabularies/discriminator/index.d.ts","../../node_modules/ajv/dist/vocabularies/errors.d.ts","../../node_modules/ajv/dist/types/json-schema.d.ts","../../node_modules/ajv/dist/types/jtd-schema.d.ts","../../node_modules/ajv/dist/runtime/validation_error.d.ts","../../node_modules/ajv/dist/compile/ref_error.d.ts","../../node_modules/ajv/dist/core.d.ts","../../node_modules/ajv/dist/compile/resolve.d.ts","../../node_modules/ajv/dist/compile/index.d.ts","../../node_modules/ajv/dist/types/index.d.ts","../../node_modules/ajv/dist/ajv.d.ts","../../node_modules/copy-webpack-plugin/node_modules/schema-utils/declarations/validate.d.ts","../../node_modules/@nodelib/fs.stat/out/types/index.d.ts","../../node_modules/@nodelib/fs.stat/out/adapters/fs.d.ts","../../node_modules/@nodelib/fs.stat/out/settings.d.ts","../../node_modules/@nodelib/fs.stat/out/providers/async.d.ts","../../node_modules/@nodelib/fs.stat/out/index.d.ts","../../node_modules/@nodelib/fs.scandir/out/types/index.d.ts","../../node_modules/@nodelib/fs.scandir/out/adapters/fs.d.ts","../../node_modules/@nodelib/fs.scandir/out/settings.d.ts","../../node_modules/@nodelib/fs.scandir/out/providers/async.d.ts","../../node_modules/@nodelib/fs.scandir/out/index.d.ts","../../node_modules/@nodelib/fs.walk/out/types/index.d.ts","../../node_modules/@nodelib/fs.walk/out/settings.d.ts","../../node_modules/@nodelib/fs.walk/out/readers/reader.d.ts","../../node_modules/@nodelib/fs.walk/out/readers/async.d.ts","../../node_modules/@nodelib/fs.walk/out/providers/async.d.ts","../../node_modules/@nodelib/fs.walk/out/index.d.ts","../../node_modules/fast-glob/out/types/index.d.ts","../../node_modules/fast-glob/out/settings.d.ts","../../node_modules/fast-glob/out/managers/tasks.d.ts","../../node_modules/fast-glob/out/index.d.ts","../../node_modules/copy-webpack-plugin/node_modules/globby/index.d.ts","../../node_modules/copy-webpack-plugin/types/index.d.ts","../../node_modules/@nx/js/src/utils/assets/assets.d.ts","../../node_modules/@nx/webpack/src/executors/webpack/schema.d.ts","../../node_modules/@nx/webpack/src/utils/create-copy-plugin.d.ts","../../node_modules/@nx/webpack/src/utils/config.d.ts","../../node_modules/@nx/webpack/src/generators/init/schema.d.ts","../../node_modules/@nx/webpack/src/generators/init/init.d.ts","../../node_modules/@nx/webpack/src/executors/dev-server/schema.d.ts","../../node_modules/@nx/webpack/src/executors/dev-server/dev-server.impl.d.ts","../../node_modules/@nx/webpack/src/executors/webpack/lib/normalize-options.d.ts","../../node_modules/@nx/webpack/src/executors/webpack/webpack.impl.d.ts","../../node_modules/@nx/webpack/src/utils/get-css-module-local-ident.d.ts","../../node_modules/@nx/webpack/src/plugins/nx-webpack-plugin/nx-webpack-plugin-options.d.ts","../../node_modules/@nx/webpack/src/utils/with-nx.d.ts","../../node_modules/@nx/webpack/src/utils/with-web.d.ts","../../node_modules/@nx/webpack/src/utils/module-federation/models/index.d.ts","../../node_modules/@nx/webpack/src/utils/module-federation/share.d.ts","../../node_modules/@nx/webpack/src/utils/module-federation/remotes.d.ts","../../node_modules/@nx/webpack/src/utils/module-federation/dependencies.d.ts","../../node_modules/@nx/webpack/src/utils/module-federation/package-json.d.ts","../../node_modules/@nx/webpack/src/utils/module-federation/public-api.d.ts","../../node_modules/@nx/webpack/src/plugins/nx-webpack-plugin/nx-webpack-plugin.d.ts","../../node_modules/@nx/webpack/src/plugins/nx-typescript-webpack-plugin/nx-tsconfig-paths-webpack-plugin.d.ts","../../node_modules/@nx/webpack/index.d.ts","../../node_modules/@nx/react/plugins/with-react.d.ts","../../node_modules/@nx/react/plugins/nx-react-webpack-plugin/nx-react-webpack-plugin.d.ts","../../node_modules/@nx/react/index.d.ts","../../node_modules/@nx/next/src/generators/application/schema.d.ts","../../node_modules/@nx/next/src/generators/application/application.d.ts","../../node_modules/@nx/next/src/generators/component/component.d.ts","../../node_modules/@nx/next/src/generators/library/schema.d.ts","../../node_modules/@nx/next/src/generators/library/library.d.ts","../../node_modules/@nx/next/src/generators/page/schema.d.ts","../../node_modules/@nx/next/src/generators/page/page.d.ts","../../node_modules/@nx/next/src/utils/config.d.ts","../../node_modules/@nx/next/plugins/with-nx.d.ts","../../node_modules/@nx/next/src/utils/compose-plugins.d.ts","../../node_modules/@nx/next/index.d.ts","./next.config.js","./postcss.config.js","../../node_modules/@nx/react/tailwind.d.ts","../../node_modules/tailwindcss/types/generated/corepluginlist.d.ts","../../node_modules/tailwindcss/types/generated/colors.d.ts","../../node_modules/tailwindcss/types/config.d.ts","../../node_modules/tailwind-scrollbar/src/index.d.ts","./tailwind.config.js","../../node_modules/@jest/expect-utils/build/index.d.ts","../../node_modules/jest-matcher-utils/node_modules/chalk/index.d.ts","../../node_modules/@sinclair/typebox/typebox.d.ts","../../node_modules/@jest/schemas/build/index.d.ts","../../node_modules/jest-diff/node_modules/pretty-format/build/index.d.ts","../../node_modules/jest-diff/build/index.d.ts","../../node_modules/jest-matcher-utils/build/index.d.ts","../../node_modules/expect/build/index.d.ts","../../node_modules/@types/jest/node_modules/pretty-format/build/index.d.ts","../../node_modules/@types/jest/index.d.ts"],"fileInfos":[{"version":"f33e5332b24c3773e930e212cbb8b6867c8ba3ec4492064ea78e55a524d57450","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","26f2f787e82c4222710f3b676b4d83eb5ad0a72fa7b746f03449e7a026ce5073","9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4",{"version":"21e41a76098aa7a191028256e52a726baafd45a925ea5cf0222eb430c96c1d83","affectsGlobalScope":true},{"version":"138fb588d26538783b78d1e3b2c2cc12d55840b97bf5e08bca7f7a174fbe2f17","affectsGlobalScope":true},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true},{"version":"e0275cd0e42990dc3a16f0b7c8bca3efe87f1c8ad404f80c6db1c7c0b828c59f","affectsGlobalScope":true},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"49ed889be54031e1044af0ad2c603d627b8bda8b50c1a68435fe85583901d072","affectsGlobalScope":true},{"version":"e93d098658ce4f0c8a0779e6cab91d0259efb88a318137f686ad76f8410ca270","affectsGlobalScope":true},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"ec0104fee478075cb5171e5f4e3f23add8e02d845ae0165bfa3f1099241fa2aa","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"acae90d417bee324b1372813b5a00829d31c7eb670d299cd7f8f9a648ac05688","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"13f6e6380c78e15e140243dc4be2fa546c287c6d61f4729bc2dd7cf449605471","affectsGlobalScope":true},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"415c9f8b3e499f42a77345f9393737ba658908ba13cc527cd0e6db2dde4811a9","0990a7576222f248f0a3b888adcb7389f957928ce2afb1cd5128169086ff4d29",{"version":"0bd5e7096c7bc02bf70b2cc017fc45ef489cb19bd2f32a71af39ff5787f1b56a","affectsGlobalScope":true},"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda",{"version":"2998fbabd664cde4173f5fc9f2e4d1f9599fb2d6755275ce75c5f637388d9dfc","affectsGlobalScope":true},"cc69795d9954ee4ad57545b10c7bf1a7260d990231b1685c147ea71a6faa265c","8bc6c94ff4f2af1f4023b7bb2379b08d3d7dd80c698c9f0b07431ea16101f05f","1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","57194e1f007f3f2cbef26fa299d4c6b21f4623a2eddc63dfeef79e38e187a36e","0f6666b58e9276ac3a38fdc80993d19208442d6027ab885580d93aec76b4ef00","05fd364b8ef02fb1e174fbac8b825bdb1e5a36a016997c8e421f5fab0a6da0a0","7e771891adaa85b690266bc37bd6eb43bc57eecc4b54693ead36467e7369952a","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"f749812878fecfa53cfc13b36e5d35086fb6377983a9df44175da83ccc23af1f","affectsGlobalScope":true},"7d2e3fea24c712c99c03ad8f556abedbfe105f87f1be10b95dbd409d24bc05a3",{"version":"211e3f15fbced4ab4be19f49ffa990b9ff20d749d33b65ff753be691e7616239","affectsGlobalScope":true},"3719525a8f6ab731e3dfd585d9f87df55ec7d50d461df84f74eb4d68bb165244","5a94487653355b56018122d92392beb2e5f4a6c63ba5cef83bbe1c99775ef713",{"version":"d5135ad93b33adcce80b18f8065087934cdc1730d63db58562edcf017e1aad9b","affectsGlobalScope":true},"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","e596c9bb2f29a2699fdd4ae89139612652245192f67f45617c5a4b20832aaae9","bb9c4ffa5e6290c6980b63c815cdd1625876dadb2efaf77edbe82984be93e55e","1cdcfc1f624d6c08aa12c73935f6e13f095919cd99edf95752951796eb225729","4eaff3d8e10676fd7913d8c108890e71c688e1e7d52f6d1d55c39514f493dc47","14b5aa23c5d0ae1907bc696ac7b6915d88f7d85799cc0dc2dcf98fbce2c5a67c","5c439dafdc09abe4d6c260a96b822fa0ba5be7203c71a63ab1f1423cd9e838ea",{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true},{"version":"00dee7cdca8b8420c47ea4a31a34b8e8294013ebc4f463fd941e867e7bf05029","affectsGlobalScope":true},"3256f3cccd578f9e7fe3a28096c505634bebcee8afb738ffa99368e536ca3a0b","1c84b46267610a34028edfd0d035509341751262bac1062857f3c8df7aff7153","7f138842074d0a40681775af008c8452093b68c383c94de31759e853c6d06b5c","a3d541d303ee505053f5dcbf9fafb65cac3d5631037501cd616195863a6c5740","8d3c583a07e0c37e876908c2d5da575019f689df8d9fa4c081d99119d53dba22","2c828a5405191d006115ab34e191b8474bc6c86ffdc401d1a9864b1b6e088a58",{"version":"e630e5528e899219ae319e83bef54bf3bcb91b01d76861ecf881e8e614b167f0","affectsGlobalScope":true},"bcebb922784739bdb34c18ee51095d25a92b560c78ccd2eaacd6bd00f7443d83","7ee6ed878c4528215c82b664fe0cfe80e8b4da6c0d4cc80869367868774db8b1","b0973c3cbcdc59b37bf477731d468696ecaf442593ec51bab497a613a580fe30",{"version":"4989e92ba5b69b182d2caaea6295af52b7dc73a4f7a2e336a676722884e7139d","affectsGlobalScope":true},{"version":"0715e4cd28ad471b2a93f3e552ff51a3ae423417a01a10aa1d3bc7c6b95059d6","affectsGlobalScope":true},"5153a2fd150e46ce57bb3f8db1318d33f6ad3261ed70ceeff92281c0608c74a3","210d54cd652ec0fec8c8916e4af59bb341065576ecda039842f9ffb2e908507c","36b03690b628eab08703d63f04eaa89c5df202e5f1edf3989f13ad389cd2c091","0effadd232a20498b11308058e334d3339cc5bf8c4c858393e38d9d4c0013dcf","25846d43937c672bab7e8195f3d881f93495df712ee901860effc109918938cc","4f3fdeba4e28e21aa719c081b8dc8f91d47e12e773389b9d35679c08151c9d37","1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","69ee23dd0d215b09907ad30d23f88b7790c93329d1faf31d7835552a10cf7cbf","44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","23b89798789dffbd437c0c423f5d02d11f9736aea73d6abf16db4f812ff36eda","f69ff39996a61a0dd10f4bce73272b52e8024a4d58b13ab32bf4712909d0a2b7",{"version":"3c4ba1dd9b12ffa284b565063108f2f031d150ea15b8fafbdc17f5d2a07251f3","affectsGlobalScope":true},"e10177274a35a9d07c825615340b2fcde2f610f53f3fb40269fd196b4288dda6","1422cd9e705adcc09088fda85a900c2b70e3ad36ea85846f68bd1a884cdf4e2b","3c13ef48634e7b5012fcf7e8fce7496352c2d779a7201389ca96a2a81ee4314d","5d0a25ec910fa36595f85a67ac992d7a53dd4064a1ba6aea1c9f14ab73a023f2",{"version":"a73ae8c0e62103bb9e21bb6538700881bf135b9a8b125b857ec68edfa0da4ed3","affectsGlobalScope":true},{"version":"e1c1b2fbe236bf7ee3e342eeae7e20efb8988a0ac7da1cbbfa2c1f66b76c3423","affectsGlobalScope":true},"868831cab82b65dfe1d68180e898af1f2101e89ba9b754d1db6fb8cc2fac1921","0fe8985a28f82c450a04a6edf1279d7181c0893f37da7d2a27f8efd4fd5edb03","e59a892d87e72733e2a9ca21611b9beb52977be2696c7ba4b216cbbb9a48f5aa",{"version":"52120bb7e4583612225bdf08e7c12559548170f11e660d33a33623bae9bbdbba","affectsGlobalScope":true},"8a300fa9b698845a1f9c41ecbe2c5966634582a8e2020d51abcace9b55aa959e",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"a6dd3dba8e665ac43d279e0fdf5219edda0eed69b5e9a5061f46cd6a65c4f7a1","8caa5c86be1b793cd5f599e27ecb34252c41e011980f7d61ae4989a149ff6ccc","481231c1fc9d8efbceb62a6265af69d5cd5a49676df9c4214ecb5b81f0077a75","3303f49a2c7c25d8b5dbe0f93be5dccbb62dbea43bca9565c35c4737934dc2a4","4355c807c60f6b8a69ee3307c5f9adde7d8303172bcfa4805fa804511a6c3ce2","893288d87a9dd809619f7daf641ba9114d01275364856483b40186ba411dac40","bb7a61dd55dc4b9422d13da3a6bb9cc5e89be888ef23bbcf6558aa9726b89a1c","db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","cfe4ef4710c3786b6e23dae7c086c70b4f4835a2e4d77b75d39f9046106e83d3","cbea99888785d49bb630dcbb1613c73727f2b5a2cf02e1abcaab7bcf8d6bf3c5","98817124fd6c4f60e0b935978c207309459fb71ab112cf514f26f333bf30830e","a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","2dad084c67e649f0f354739ec7df7c7df0779a28a4f55c97c6b6883ae850d1ce","fa5bbc7ab4130dd8cdc55ea294ec39f76f2bc507a0f75f4f873e38631a836ca7","df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5","cf86de1054b843e484a3c9300d62fbc8c97e77f168bbffb131d560ca0474d4a8","a28e69b82de8008d23b88974aeb6fba7195d126c947d0da43c16e6bc2f719f9f","528637e771ee2e808390d46a591eaef375fa4b9c99b03749e22b1d2e868b1b7c","e54a8a1852a418d2e9cf8b9c88e6f48b102fc941718941267eefa3c9df80ee91","fc46f093d1b754a8e3e34a071a1dd402f42003927676757a9a10c6f1d195a35b","b7b3258e8d47333721f9d4c287361d773f8fa88e52d1148812485d9fc06d2577","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","a9af0e608929aaf9ce96bd7a7b99c9360636c31d73670e4af09a09950df97841","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","87eaecac33864ecec8972b1773c5d897f0f589deb7ac8fe0dcdf4b721b06e28d","47e5af2a841356a961f815e7c55d72554db0c11b4cba4d0caab91f8717846a94","4c91cc1ab59b55d880877ccf1999ded0bb2ebc8e3a597c622962d65bf0e76be8","fa1ea09d3e073252eccff2f6630a4ce5633cc2ff963ba672dd8fd6783108ea83","f5f541902bf7ae0512a177295de9b6bcd6809ea38307a2c0a18bfca72212f368","e8da637cbd6ed1cf6c36e9424f6bcee4515ca2c677534d4006cbd9a05f930f0c","ca1b882a105a1972f82cc58e3be491e7d750a1eb074ffd13b198269f57ed9e1b","c9d71f340f1a4576cd2a572f73a54dc7212161fa172dfe3dea64ac627c8fcb50","3867ca0e9757cc41e04248574f4f07b8f9e3c0c2a796a5eb091c65bfd2fc8bdb","6c66f6f7d9ff019a644ff50dd013e6bf59be4bf389092948437efa6b77dc8f9a","4e10622f89fea7b05dd9b52fb65e1e2b5cbd96d4cca3d9e1a60bb7f8a9cb86a1","ef2d1bd01d144d426b72db3744e7a6b6bb518a639d5c9c8d86438fb75a3b1934","b9750fe7235da7d8bf75cb171bf067b7350380c74271d3f80f49aea7466b55b5","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","ef22951dfe1a4c8e973e177332c30903cec14844f3ad05d3785988f6daba9bd6","df8081a998c857194468fd082636f037bc56384c1f667531a99aa7022be2f95e","ac60bbee0d4235643cc52b57768b22de8c257c12bd8c2039860540cab1fa1d82","973b59a17aaa817eb205baf6c132b83475a5c0a44e8294a472af7793b1817e89","ada39cbb2748ab2873b7835c90c8d4620723aedf323550e8489f08220e477c7f","6e5f5cee603d67ee1ba6120815497909b73399842254fc1e77a0d5cdc51d8c9c","f79e0681538ef94c273a46bb1a073b4fe9fdc93ef7f40cc2c3abd683b85f51fc","70f3814c457f54a7efe2d9ce9d2686de9250bb42eb7f4c539bd2280a42e52d33","17ace83a5bea3f1da7e0aef7aab0f52bca22619e243537a83a89352a611b837d","ef61792acbfa8c27c9bd113f02731e66229f7d3a169e3c1993b508134f1a58e0","6cf2d240d4e449ccfee82aff7ce0fd1890c1b6d4f144ec003aa51f7f70f68935","f6404e7837b96da3ea4d38c4f1a3812c96c9dcdf264e93d5bdb199f983a3ef4b","c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5","65a15fc47900787c0bd18b603afb98d33ede930bed1798fc984d5ebb78b26cf9","9d202701f6e0744adb6314d03d2eb8fc994798fc83d91b691b75b07626a69801","de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d","c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5","1dc574e42493e8bf9bb37be44d9e38c5bd7bbc04f884e5e58b4d69636cb192b3",{"version":"9deab571c42ed535c17054f35da5b735d93dc454d83c9a5330ecc7a4fb184e9e","affectsGlobalScope":true},{"version":"db01d18853469bcb5601b9fc9826931cc84cc1a1944b33cad76fd6f1e3d8c544","affectsGlobalScope":true},"6b8e8c0331a0c2e9fb53b8b0d346e44a8db8c788dae727a2c52f4cf3bd857f0d",{"version":"903e299a28282fa7b714586e28409ed73c3b63f5365519776bf78e8cf173db36","affectsGlobalScope":true},"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e","f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b",{"version":"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa","affectsGlobalScope":true},"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6","dd3900b24a6a8745efeb7ad27629c0f8a626470ac229c1d73f1fe29d67e44dca","ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441","106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c","ec29be0737d39268696edcec4f5e97ce26f449fa9b7afc2f0f99a86def34a418","a3ab6d3eb668c3951fcbcaf27fa84f274218f68a9e85e2fa5407fe7d3486f7b2","ec6cba1c02c675e4dd173251b156792e8d3b0c816af6d6ad93f1a55d674591aa","763ee3998716d599321e34b7f7e93a8e57bef751206325226ebf088bf75ea460","e15d3c84d5077bb4a3adee4c791022967b764dc41cb8fa3cfa44d4379b2c95f5","78244a2a8ab1080e0dd8fc3633c204c9a4be61611d19912f4b157f7ef7367049","e1fc1a1045db5aa09366be2b330e4ce391550041fc3e925f60998ca0b647aa97","fccc5d7a6334dda19af6f663cc6f5f4e6bddbf2bda1aabb42406dda36da4029e","d23518a5f155f1a3e07214baf0295687507122ae2e6e9bd5e772551ebd4b3157","ed24912bd7a2b952cf1ff2f174bd5286c0f7d8a11376f083c03d4c76faae4134","3556cfbab7b43da96d15a442ddbb970e1f2fc97876d055b6555d86d7ac57dae5","437751e0352c6e924ddf30e90849f1d9eb00ca78c94d58d6a37202ec84eb8393","48e8af7fdb2677a44522fd185d8c87deff4d36ee701ea003c6c780b1407a1397","606e6f841ba9667de5d83ca458449f0ed8c511ba635f753eaa731e532dea98c7","d860ce4d43c27a105290c6fdf75e13df0d40e3a4e079a3c47620255b0e396c64","b064dd7dd6aa5efef7e0cc056fed33fc773ea39d1e43452ee18a81d516fb762c","2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","13283350547389802aa35d9f2188effaeac805499169a06ef5cd77ce2a0bd63f","680793958f6a70a44c8d9ae7d46b7a385361c69ac29dcab3ed761edce1c14ab8","6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","baeffe1b7d836196d497eb755699718deb729a2033078a018f037a14ecaeb9a7","9e6dbb5a1fc4840716e8b987f228652770b5c20b43b63332a90647ea5549d9b6","78244335c377ad261b6054029ec49197a97da17fb3ff8b8007a7e419d2b914d0","e53932e64841d2e1ef11175f7ec863ae9f8b06496850d7a81457892721c86a91","438c7513b1df91dcef49b13cd7a1c4720f91a36e88c1df731661608b7c055f10","ad444a874f011d3a797f1a41579dbfcc6b246623f49c20009f60e211dbd5315e","361e2b13c6765d7f85bb7600b48fde782b90c7c41105b7dab1f6e7871071ba20","950a320b88226a8d422ea2f33d44bbadc246dc97c37bf508a1fd3e153070c8ea","f1068c719ad8ec4580366eae164a82899af9126eed0452a3a2fde776f9eaf840","5fa139523e35fd907f3dd6c2e38ef2066687b27ed88e2680783e05662355ac04","9c250db4bab4f78fad08be7f4e43e962cc143e0f78763831653549ceb477344a","db7c948e2e69559324be7628cb63296ec8986d60f26173f9e324aeb8a2fe23d8","9385cdc09850950bc9b59cca445a3ceb6fcca32b54e7b626e746912e489e535e","0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a","d6786782daa690925e139faad965b2d1745f71380c26861717f10525790566d9","63a8e96f65a22604eae82737e409d1536e69a467bb738bec505f4f97cce9d878","3fd78152a7031315478f159c6a5872c712ece6f01212c78ea82aef21cb0726e2","50481f43195ec7a4da5d95c00ccaf4cc2d31a92073a256367a0cedf6a595a50e","cda4052f66b1e6cb7cf1fdfd96335d1627aa24a3b8b82ba4a9f873ec3a7bcde8","996d95990f57766b5cbbc1e4efd48125e664e1db177f919ef07e7226445bc58a","af8f233f11498dddebf06c57d03a568bf39f0cab2407151797ba18984fb3009d","fd933f824347f9edd919618a76cdb6a0c0085c538115d9a287fa0c7f59957ab3","6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","6a1aa3e55bdc50503956c5cd09ae4cd72e3072692d742816f65c66ca14f4dfdd","ab75cfd9c4f93ffd601f7ca1753d6a9d953bbedfbd7a5b3f0436ac8a1de60dfa","28ebfca21bccf412dbb83a1095ee63eaa65dfc31d06f436f3b5f24bfe3ede7fa","b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647","bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","1364f64d2fb03bbb514edc42224abd576c064f89be6a990136774ecdd881a1da","c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23","950fb67a59be4c2dbe69a5786292e60a5cb0e8612e0e223537784c731af55db1","e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","07ca44e8d8288e69afdec7a31fa408ce6ab90d4f3d620006701d5544646da6aa","70246ad95ad8a22bdfe806cb5d383a26c0c6e58e7207ab9c431f1cb175aca657","f00f3aa5d64ff46e600648b55a79dcd1333458f7a10da2ed594d9f0a44b76d0b","772d8d5eb158b6c92412c03228bd9902ccb1457d7a705b8129814a5d1a6308fc","4e4475fba4ed93a72f167b061cd94a2e171b82695c56de9899275e880e06ba41","97c5f5d580ab2e4decd0a3135204050f9b97cd7908c5a8fbc041eadede79b2fa","49b2375c586882c3ac7f57eba86680ff9742a8d8cb2fe25fe54d1b9673690d41","802e797bcab5663b2c9f63f51bdf67eff7c41bc64c0fd65e6da3e7941359e2f7","b9e436138dd3a36272c6026e07bb8a105d8e102992f5419636c6a81f31f4ee6e","b33ac7d8d7d1bfc8cc06c75d1ee186d21577ab2026f482e29babe32b10b26512","df002733439dc68e41174e1a869390977d81318f51a38c724d8394a676562cc7","6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f","05c97cddbaf99978f83d96de2d8af86aded9332592f08ce4a284d72d0952c391","71bc9bc7afa31a36fb61f66a668b44ee0e7c9ed0f2f364ca0185ffff8bc8f174","bbc183d2d69f4b59fd4dd8799ffdf4eb91173d1c4ad71cce91a3811c021bf80c","7b6ff760c8a240b40dab6e4419b989f06a5b782f4710d2967e67c695ef3e93c4","8dbc4134a4b3623fc476be5f36de35c40f2768e2e3d9ed437e0d5f1c4cd850f6","d5563f7b039981b4f1b011936b7d0dcdd96824c721842ff74881c54f2f634284","88469ceaabef1fb73fc8fbbb61e1fdf0901a656344a099e465ce6eaf78c540fb","3e4b580564f57a8495e7a598c33c98ecd673cff0106223416cdc8fcd66410c88","f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072","2299a804d7bf5bb667a4cae0dde72052ff22eb6530e9c0cf61e23206f386f9ec","94404c4a878fe291e7578a2a80264c6f18e9f1933fbb57e48f0eb368672e389c","5c1b7f03aa88be854bc15810bfd5bd5a1943c5a7620e1c53eddd2a013996343e","f416c9c3eee9d47ff49132c34f96b9180e50485d435d5748f0e8b72521d28d2e","b4a49b80b0c625e4c7a9d6fcd95cd7d6a94ca6116b056d144de0cf70c03e4697","60a86278bd85866c81bc8e48d23659279b7a2d5231b06799498455586f7c8138","01aa917531e116485beca44a14970834687b857757159769c16b228eb1e49c5f","fbcde1fdade133b4a976480c0d4c692e030306f53909d7765dfef98436dec777","4f1ce48766482ed4c19da9b1103f87690abb7ba0a2885a9816c852bfad6881a1","187a6fdbdecb972510b7555f3caacb44b58415da8d5825d03a583c4b73fde4cf","ebffa210a9d55dea12119af0b19cf269fc7b80f60d0378d8877205d546d8c16a","28b57ddc587f2fe1f4e178eef2f073466b814e452ab79e730c1fc7959e9ff0ef","741067675daa6d4334a2dc80a4452ca3850e89d5852e330db7cb2b5f867173b1","a1c8542ed1189091dd39e732e4390882a9bcd15c0ca093f6e9483eba4e37573f","131b1475d2045f20fb9f43b7aa6b7cb51f25250b5e4c6a1d4aa3cf4dd1a68793","3a17f09634c50cce884721f54fd9e7b98e03ac505889c560876291fcf8a09e90","32531dfbb0cdc4525296648f53b2b5c39b64282791e2a8c765712e49e6461046","0ce1b2237c1c3df49748d61568160d780d7b26693bd9feb3acb0744a152cd86d","e489985388e2c71d3542612685b4a7db326922b57ac880f299da7026a4e8a117","76264a4df0b7c78b7b12dfaedc05d9f1016f27be1f3d0836417686ff6757f659",{"version":"272692898cec41af73cb5b65f4197a7076007aecd30c81514d32fdb933483335","affectsGlobalScope":true},"fd1b9d883b9446f1e1da1e1033a6a98995c25fbf3c10818a78960e2f2917d10c","19252079538942a69be1645e153f7dbbc1ef56b4f983c633bf31fe26aeac32cd","bc11f3ac00ac060462597add171220aed628c393f2782ac75dd29ff1e0db871c","1640728521f6ab040fc4a85edd2557193839d0cd0e41c02004fc8d415363d4e2","65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","ec9fd890d681789cb0aa9efbc50b1e0afe76fbf3c49c3ac50ff80e90e29c6bcb","5fbd292aa08208ae99bf06d5da63321fdc768ee43a7a104980963100a3841752","9eac5a6beea91cfb119688bf44a5688b129b804ede186e5e2413572a534c21bb","e81bf06c0600517d8f04cc5de398c28738bfdf04c91fb42ad835bfe6b0d63a23","363996fe13c513a7793aa28ffb05b5d0230db2b3d21b7bfaf21f79e4cde54b4e","b7fff2d004c5879cae335db8f954eb1d61242d9f2d28515e67902032723caeab","5f3dc10ae646f375776b4e028d2bed039a93eebbba105694d8b910feebbe8b9c","7f6c48cacd08c1b1e29737b8221b7661e6b855767f8778f9a181fa2f74c09d21","4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","15959543f93f27e8e2b1a012fe28e14b682034757e2d7a6c1f02f87107fc731e","a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","4e828bf688597c32905215785730cbdb603b54e284d472a23fc0195c6d4aeee8","a3f41ed1b4f2fc3049394b945a68ae4fdefd49fa1739c32f149d32c0545d67f5","4da80db9ed5a1a20fd5bfce863dd178b8928bcaf4a3d75e8657bcae32e572ede","47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","f72ee46ae3f73e6c5ff0da682177251d80500dd423bfd50286124cd0ca11e160","898b714aad9cfd0e546d1ad2c031571de7622bd0f9606a499bee193cf5e7cf0c","d707fb7ca32930495019a4c85500385f6850c785ee0987a1b6bcad6ade95235e","fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7","5d26aae738fa3efc87c24f6e5ec07c54694e6bcf431cc38d3da7576d6bb35bd6","cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","db036c56f79186da50af66511d37d9fe77fa6793381927292d17f81f787bb195","bc6a6780c3b6e23bcb4bc9558d7cdbd3dfe32f1a9b457a0c1d651085cb6f7c0a","cd0c5af42811a4a56a0f77856cfa6c170278e9522888db715b11f176df3ff1f2","68f81dad9e8d7b7aa15f35607a70c8b68798cf579ac44bd85325b8e2f1fb3600","1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450","1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","94fd3ce628bd94a2caf431e8d85901dbe3a64ab52c0bd1dbe498f63ca18789f7","5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","c0eeaaa67c85c3bb6c52b629ebbfd3b2292dc67e8c0ffda2fc6cd2f78dc471e6","4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872","27be6622e2922a1b412eb057faa854831b95db9db5035c3f6d4b677b902ab3b7","2470a2412a59c6177cd4408dd7edb099ca7ace68c0187f54187dfee56dc9c5aa","c2008605e78208cfa9cd70bd29856b72dda7ad89df5dc895920f8e10bcb9cd0a","ec61ebac4d71c4698318673efbb5c481a6c4d374da8d285f6557541a5bd318d0",{"version":"16fd66ae997b2f01c972531239da90fbf8ab4022bb145b9587ef746f6cecde5a","affectsGlobalScope":true},{"version":"fc8fbee8f73bf5ffd6ba08ba1c554d6f714c49cae5b5e984afd545ab1b7abe06","affectsGlobalScope":true},"3586f5ea3cc27083a17bd5c9059ede9421d587286d5a47f4341a4c2d00e4fa91","521fc35a732f1a19f5d52024c2c22e257aa63258554968f7806a823be2f82b03","b789bf89eb19c777ed1e956dbad0925ca795701552d22e68fd130a032008b9f9","9269d492817e359123ac64c8205e5d05dab63d71a3a7a229e68b5d9a0e8150bf","7a1971efcba559ea9002ada4c4e3c925004fb67a755300d53b5edf9399354900","d5ae953e9968946b809d277b5afb33a98fcebf7b05c0858584988f044719723a","6cffd9d5a03d319f1807048977bbda1ca26dec3dfbb04c042095ce70f2bc258d","1ea8148bca907ccf52233df6f6ec35f7bc7119da1a8d1fb9b4dfaea9ec869ffb",{"version":"7fa2bd3fa311382508952c523d765ea24b3b145ff221e5c3c45016e4436a7680","signature":"2f8baa2f9578da485926c487b4105f92877db49e3542098bcdefeec20ebdd678"},{"version":"988a79ff23e45865fe352fc46714fe1a5d5e675cf9ae18fc2463df27cb8a74a5","signature":"4ac3d8570573b85e700a3f42808f57dc29472230587ff8c50e75c3fc9c046916"},"75ee56c6066763d4b384fb7bdea6ce440416bf3749eceeb0a9c54e35f4545d51",{"version":"8d6d51a5118d000ed3bfe6e1dd1335bebfff3fef23cd2af2f84a24d30f90cc90","affectsGlobalScope":true},{"version":"73a0ee6395819b063df4b148211985f2e1442945c1a057204cf4cf6281760dc3","affectsGlobalScope":true},"d05d8c67116dceafc62e691c47ac89f8f10cf7313cd1b2fb4fe801c2bf1bb1a7","ccff6a039925da0bbddce77e8fe06865bb4bc144f8ca2f729b4390015044183b","3b2ef670d9fbaeba57e90f83a6e0bb6496cb6f7c40e0e4ea3f69a3c24ba8849e","eadb96cb45ec069f56044da0acb0e7971cf35727ac36f43cb7e6937e6de78568","83e3d3af2151c83d76018ae8e895709262c8dc1cd3a337d3ba13698f58009a71","5c572ee0ef0f072e79f06e5186c23c5dc03228ca30295c05c890400c969817c9","3b82f1b01c9a8fa59c54cf55a0437d4d96757e1eea8d451496a12efd02b30188","9619101e844a1ef1de0b33b4d0a42c41052f825e36abe4741cba2ef5d612d59e","51ebca098538b252953b1ef83c165f25b52271bfb6049cd09d197dddd4cd43c5","8634861bf891d090b4a3f90733703bb8628f1753f88b993f7693cbd57021d60a","495f3e1254a9f5cc7b124798b7d9c480e6aa1a97628a160cb172573178eda734","35bb8c511ad945d8c6c3ba5079b51785c0a2b7a99c3716e3de32051003c722c8","49ee6b7e5464a4279427241477a668b9ab134952f9e3b20a8daeb5aae4d59e01","e29b9dd7309feed4205b6acbd637d7e37f722efc91ef945fb3eceae970c1a685","91b4ce96f6ad631a0a6920eb0ab928159ff01a439ae0e266ecdc9ea83126a195","e3448881d526bfca052d5f9224cc772f61d9fc84d0c52eb7154b13bd4db9d8b2","e348f128032c4807ad9359a1fff29fcbc5f551c81be807bfa86db5a45649b7ba","0fba40d7d3d779a84c39aed52884def98a8cd032242c7eb86bd6dc0989759c3a","ad4d2c881a46db2a93346d760aa4e5e9f7d79a87e4b443055f5416b10dbe748c","c2fc483dea0580d1266c1500f17e49a739ca6cfe408691da638ddc211dfffad0","7c31a2b77ae042fb1f057c21367e730f364849ae8fa1d72f5a9936cef963a8b2","650d4007870fee41b86182e7965c6fb80283388d0ba8882ce664cc311a2840b5","1371cc469a4a618042f5230e95e6476dd6dc33ad75a65cf407c079fe4fcc619e","c16c3b97930e8fbf05022024f049d51c998dd5eb6509047e1f841777968e85c1","b512c143a2d01012a851fdf2d739f29a313e398b88ac363526fb2adddbabcf95","535b2fc8c89091c20124fe144699bb4a96d5db4418a1594a9a0a6a863b2195ae","13409a75ad9472934934afaff70eeeb16e84a3667522d1e6794f15a0db648829","3068cf3437f485ccac6ddc86c475e61bc487452852510d95c83f6bad6dab9a66","21575cdeaca6a2c2a0beb8c2ecbc981d9deb95f879f82dc7d6e325fe8737b5ba","832c2f78ec29728aca9c84998182993b8b27fff904e7622e73194d6d34154a0c","faba53dda443d501f30e2d92ed33a8d11f88b420b0e2f03c5d7d62ebe9e7c389","3eb7d541136cd8b66020417086e4f481fb1ae0e2b916846d43cbf0b540371954","9ff4b9f562c6b70f750ca1c7a88d460442f55007843531f233ab827c102ac855","4f4cbbada4295ab9497999bec19bd2eea1ede9212eb5b4d0d6e529df533c5a4b","cf81fae6e5447acb74958bc8353b0d50b6700d4b3a220c9e483f42ca7a7041aa","92f6f02b25b107a282f27fde90a78cbd46e21f38c0d7fc1b67aea3fff35f083e","479eec32bca85c1ff313f799b894c6bb304fdab394b50296e6efe4304d9f00aa","27c37f4535447fb3191a4c1bd9a5fcab1922bec4e730f13bace2cfa25f8d7367","3e9b3266a6b9e5b3e9a293c27fd670871753ab46314ce3eca898d2bcf58eb604","e52d722c69692f64401aa2dacea731cf600086b1878ed59e476d68dae094d9aa","e91e51fff687b8298cc417e946cbf5a771c2d02a6b5b7fe154593926cf3d1a8e","039bd8d1e0d151570b66e75ee152877fb0e2f42eca43718632ac195e6884be34","89fb1e22c3c98cbb86dc3e5949012bdae217f2b5d768a2cc74e1c4b413c25ad2","cb5eaaa2a079305b1c5344af739b29c479746f7a7aefffc7175d23d8b7c8dbb0","0d72f576807bb4f6f682bc705e06eb3e730139b018e8c026e3187f3f389ce2e9","56749bf8b557c4c76181b2fd87e41bde2b67843303ae2eabb299623897d704d6","5a6fbec8c8e62c37e9685a91a6ef0f6ecaddb1ee90f7b2c2b71b454b40a0d9a6","e7435f2f56c50688250f3b6ef99d8f3a1443f4e3d65b4526dfb31dfd4ba532f8","6fc56a681a637069675b2e11b4aa105efe146f7a88876f23537e9ea139297cf9","33b7f4106cf45ae7ccbb95acd551e9a5cd3c27f598d48216bda84213b8ae0c7e","176d6f604b228f727afb8e96fd6ff78c7ca38102e07acfb86a0034d8f8a2064a","c5079a23a0200a682ec3db25bc789d6cee4275b676a86ec1a3964d919b977e6a","8bcb884d06860a129dbffa3500d51116d9d1040bb3bf1c9762eb2f1e7fd5c85c","e55c0f31407e1e4eee10994001a4f570e1817897a707655f0bbe4d4a66920e9e","a37c2194c586faa8979f50a5c5ca165b0903d31ee62a9fe65e4494aa099712c0","6602339ddc9cd7e54261bda0e70fb356d9cdc10e3ec7feb5fa28982f8a4d9e34","7ffaa736b8a04b0b8af66092da536f71ef13a5ef0428c7711f32b94b68f7c8c8","7b4930d666bbe5d10a19fcc8f60cfa392d3ad3383b7f61e979881d2c251bc895","46342f04405a2be3fbfb5e38fe3411325769f14482b8cd48077f2d14b64abcfb","8fa675c4f44e6020328cf85fdf25419300f35d591b4f56f56e00f9d52b6fbb3b","ba98f23160cfa6b47ee8072b8f54201f21a1ee9addc2ef461ebadf559fe5c43a","45a4591b53459e21217dc9803367a651e5a1c30358a015f27de0b3e719db816b","9ef22bee37885193b9fae7f4cad9502542c12c7fe16afe61e826cdd822643d84","b0451895b894c102eed19d50bd5fcb3afd116097f77a7d83625624fafcca8939","bce17120b679ff4f1be70f5fe5c56044e07ed45f1e555db6486c6ded8e1da1c8","7590477bfa2e309e677ff7f31cb466f377fcd0e10a72950439c3203175309958","3f9ebd554335d2c4c4e7dc67af342d37dc8f2938afa64605d8a93236022cc8a5","1c077c9f6c0bc02a36207994a6e92a8fbf72d017c4567f640b52bf32984d2392","600b42323925b32902b17563654405968aa12ee39e665f83987b7759224cc317","32c8f85f6b4e145537dfe61b94ddd98b47dbdd1d37dc4b7042a8d969cd63a1aa","2426ed0e9982c3d734a6896b697adf5ae93d634b73eb15b48da8106634f6d911","057431f69d565fb44c246f9f64eac09cf309a9af7afb97e588ebef19cc33c779","960d026ca8bf27a8f7a3920ee50438b50ec913d635aa92542ca07558f9c59eca","14aaa5b8938496377d38e90d2b6f8cb1eabf8fe1ffb86e29233ab14977afd178","252eb4750d0439d1674ad0dc30d2a2a3e4655e08ad9e58a7e236b21e78d1d540","e344b4a389bb2dfa98f144f3f195387a02b6bdb69deed4a96d16cc283c567778","c6cdcd12d577032b84eed1de4d2de2ae343463701a25961b202cff93989439fb","2f4f96af192dc44a12bf238bcc08ebac498c9073f459740f6497fe0f8e1a432c","c5b3da7e2ecd5968f723282aba49d8d1a2e178d0afe48998dad93f81e2724091","efd2860dc74358ffa01d3de4c8fa2f966ae52c13c12b41ad931c078151b36601","09acacae732e3cc67a6415026cfae979ebe900905500147a629837b790a366b3","72154a9d896b0a0aed69fd2a58aa5aa8ab526078a65ff92f0d3c2237e9992610","99236ea5c4c583082975823fd19bcce6a44963c5c894e20384bc72e7eccf9b03","f6688a02946a3f7490aa9e26d76d1c97a388e42e77388cbab010b69982c86e9e","b027979b9e4e83be23db2d81e01d973b91fefe677feb93823486a83762f65012","533c6f9f1e29abb7ae71178f20ed8f2db65d8662b6e46b3535afb332b7eaf84b","2d2ec3235e01474f45a68f28cf826c2f5228b79f7d474d12ca3604cdcfdac80c","6dd249868034c0434e170ba6e0451d67a0c98e5a74fd57a7999174ee22a0fa7b","9716553c72caf4ff992be810e650707924ec6962f6812bd3fbdb9ac3544fd38f","506bc8f4d2d639bebb120e18d3752ddeee11321fd1070ad2ce05612753c628d6","053c51bbc32db54be396654ab5ecd03a66118d64102ac9e22e950059bc862a5e","1977f62a560f3b0fc824281fd027a97ce06c4b2d47b408f3a439c29f1e9f7e10","627570f2487bd8d899dd4f36ecb20fe0eb2f8c379eff297e24caba0c985a6c43","0f6e0b1a1deb1ab297103955c8cd3797d18f0f7f7d30048ae73ba7c9fb5a1d89","0a051f254f9a16cdde942571baab358018386830fed9bdfff42478e38ba641ce","17269f8dfc30c4846ab7d8b5d3c97ac76f50f33de96f996b9bf974d817ed025b","9e82194af3a7d314ccbc64bb94bfb62f4bfea047db3422a7f6c5caf2d06540a9","083d6f3547ccbf25dfa37b950c50bee6691ed5c42107f038cc324dbca1e173ae","952a9eab21103b79b7a6cca8ad970c3872883aa71273f540285cad360c35da40","8ba48776335db39e0329018c04486907069f3d7ee06ce8b1a6134b7d745271cc","e6d5809e52ed7ef1860d1c483e005d1f71bab36772ef0fd80d5df6db1da0e815","893e5cfbae9ed690b75b8b2118b140665e08d182ed8531e1363ec050905e6cb2","6ae7c7ada66314a0c3acfbf6f6edf379a12106d8d6a1a15bd35bd803908f2c31","e4b1e912737472765e6d2264b8721995f86a463a1225f5e2a27f783ecc013a7b","97146bbe9e6b1aab070510a45976faaf37724c747a42d08563aeae7ba0334b4f","c40d552bd2a4644b0617ec2f0f1c58618a25d098d2d4aa7c65fb446f3c305b54","09e64dea2925f3a0ef972d7c11e7fa75fec4c0824e9383db23eacf17b368532f","424ddba00938bb9ae68138f1d03c669f43556fc3e9448ed676866c864ca3f1d6","a0fe12181346c8404aab9d9a938360133b770a0c08b75a2fce967d77ca4b543f","3cc6eb7935ff45d7628b93bb6aaf1a32e8cb3b24287f9e75694b607484b377b3","ced02e78a2e10f89f4d70440d0a8de952a5946623519c54747bc84214d644bac","efd463021ccc91579ed8ae62584176baab2cd407c555c69214152480531a2072","29647c3b79320cfeecb5862e1f79220e059b26db2be52ea256df9cf9203fb401","e8cdefd2dc293cb4866ee8f04368e7001884650bb0f43357c4fe044cc2e1674f","582a3578ebba9238eb0c5d30b4d231356d3e8116fea497119920208fb48ccf85","185eae4a1e8a54e38f36cd6681cfa54c975a2fc3bc2ba6a39bf8163fac85188d","0c0a02625cf59a0c7be595ccc270904042bea523518299b754c705f76d2a6919","c44fc1bbdb5d1c8025073cb7c5eab553aa02c069235a1fc4613cd096d578ab80","cee72255e129896f0240ceb58c22e207b83d2cc81d8446190d1b4ef9b507ccd6","3b54670e11a8d3512f87e46645aa9c83ae93afead4a302299a192ac5458aa586","c2fc4d3a130e9dc0e40f7e7d192ef2494a39c37da88b5454c8adf143623e5979","2e693158fc1eedba3a5766e032d3620c0e9c8ad0418e4769be8a0f103fdb52cd","516275ccf3e66dc391533afd4d326c44dd750345b68bb573fc592e4e4b74545f","07c342622568693847f6cb898679402dd19740f815fd43bec996daf24a1e2b85","97a9a666237c856414a5e728d6319ddafa5004c3e551ab6188499d37326addcb","a8aa39794fafe452870fad67667a073125440adc0ea0aad2fd202fd497f730f8","89968316b7069339433bd42d53fe56df98b6990783dfe00c9513fb4bd01c2a1c","a4096686f982f6977433ee9759ecbef49da29d7e6a5d8278f0fbc7b9f70fce12","62e62a477c56cda719013606616dd856cfdc37c60448d0feb53654860d3113bb","207c107dd2bd23fa9febac2fe05c7c72cdac02c3f57003ab2e1c6794a6db0c05","55133e906c4ddabecdfcbc6a2efd4536a3ac47a8fa0a3fe6d0b918cac882e0d4","2147f8d114cf58c05106c3dccea9924d069c69508b5980ed4011d2b648af2ffe","2eb4012a758b9a7ba9121951d7c4b9f103fe2fc626f13bec3e29037bb9420dc6","fe61f001bd4bd0a374daa75a2ba6d1bb12c849060a607593a3d9a44e6b1df590","cfe8221c909ad721b3da6080570553dea2f0e729afbdbcf2c141252cf22f39b5","34e89249b6d840032b9acdec61d136877f84f2cd3e3980355b8a18f119809956","6f36ff8f8a898184277e7c6e3bf6126f91c7a8b6a841f5b5e6cb415cfc34820e","4b6378c9b1b3a2521316c96f5c777e32a1b14d05b034ccd223499e26de8a379c","07be5ae9bf5a51f3d98ffcfacf7de2fe4842a7e5016f741e9fad165bb929be93","cb1b37eda1afc730d2909a0f62cac4a256276d5e62fea36db1473981a5a65ab1","195f855b39c8a6e50eb1f37d8f794fbd98e41199dffbc98bf629506b6def73d7","471386a0a7e4eb88c260bdde4c627e634a772bf22f830c4ec1dad823154fd6f5","108314a60f3cb2454f2d889c1fb8b3826795399e5d92e87b2918f14d70c01e69","d75cc838286d6b1260f0968557cd5f28495d7341c02ac93989fb5096deddfb47","d531dc11bb3a8a577bd9ff83e12638098bfc9e0856b25852b91aac70b0887f2a","19968b998a2ab7dfd39de0c942fc738b2b610895843fec25477bc393687babd8","c0e6319f0839d76beed6e37b45ec4bb80b394d836db308ae9db4dea0fe8a9297","1a7b11be5c442dab3f4af9faf20402798fddf1d3c904f7b310f05d91423ba870","079d3f1ddcaf6c0ff28cfc7851b0ce79fcd694b3590afa6b8efa6d1656216924","2c817fa37b3d2aa72f01ce4d3f93413a7fbdecafe1b9fb7bd7baaa1bbd46eb08","682203aed293a0986cc2fccc6321d862742b48d7359118ac8f36b290d28920d2","7406d75a4761b34ce126f099eafe6643b929522e9696e5db5043f4e5c74a9e40","7e9c4e62351e3af1e5e49e88ebb1384467c9cd7a03c132a3b96842ccdc8045c4","ea1f9c60a912065c08e0876bd9500e8fa194738855effb4c7962f1bfb9b1da86","903f34c920e699dacbc483780b45d1f1edcb1ebf4b585a999ece78e403bb2db3","100ebfd0470433805c43be5ae377b7a15f56b5d7181c314c21789c4fe9789595","12533f60d36d03d3cf48d91dc0b1d585f530e4c9818a4d695f672f2901a74a86","21d9968dad7a7f021080167d874b718197a60535418e240389d0b651dd8110e7","2ef7349b243bce723d67901991d5ad0dfc534da994af61c7c172a99ff599e135","fa103f65225a4b42576ae02d17604b02330aea35b8aaf889a8423d38c18fa253","1b9173f64a1eaee88fa0c66ab4af8474e3c9741e0b0bd1d83bfca6f0574b6025","1b212f0159d984162b3e567678e377f522d7bee4d02ada1cc770549c51087170","46bd71615bdf9bfa8499b9cfce52da03507f7140c93866805d04155fa19caa1b","86cb49eb242fe19c5572f58624354ffb8743ff0f4522428ebcabc9d54a837c73","fc2fb9f11e930479d03430ee5b6588c3788695372b0ab42599f3ec7e78c0f6d5","bb1e5cf70d99c277c9f1fe7a216b527dd6bd2f26b307a8ab65d24248fb3319f5","817547eacf93922e22570ba411f23e9164544dead83e379c7ae9c1cfc700c2cf","a728478cb11ab09a46e664c0782610d7dd5c9db3f9a249f002c92918ca0308f7","9e91ef9c3e057d6d9df8bcbfbba0207e83ef9ab98aa302cf9223e81e32fdfe8d","66d30ef7f307f95b3f9c4f97e6c1a5e4c462703de03f2f81aca8a1a2f8739dbd","293ca178fd6c23ed33050052c6544c9d630f9d3b11d42c36aa86218472129243","90a4be0e17ba5824558c38c93894e7f480b3adf5edd1fe04877ab56c56111595","fadd55cddab059940934df39ce2689d37110cfe37cc6775f06b0e8decf3092d7","91324fe0902334523537221b6c0bef83901761cfd3bd1f140c9036fa6710fa2b","b4f3b4e20e2193179481ab325b8bd0871b986e1e8a8ed2961ce020c2dba7c02d","41744c67366a0482db029a21f0df4b52cd6f1c85cbc426b981b83b378ccb6e65","c3f3cf7561dd31867635c22f3c47c8491af4cfa3758c53e822a136828fc24e5d","a88ddea30fae38aa071a43b43205312dc5ff86f9e21d85ba26b14690dc19d95e","b5b2d0510e5455234016bbbaba3839ca21adbc715d1b9c3d6dede7d411a28545","5515f17f45c6aafe6459afa3318bba040cb466a8d91617041566808a5fd77a44","4df1f0c17953b0450aa988c9930061f8861b114e1649e1a16cfd70c5cbdf8d83","441104b363d80fe57eb79a50d495e0b7e3ebeb45a5f0d1a4067d71ef75e8fbfa","b6e995b5ef6661f5636ff738e67e4ec90150768ef119ad74b473c404304408a1","5d470930bf6142d7cbda81c157869024527dc7911ba55d90b8387ef6e1585aa1","074483fdbf20b30bd450e54e6892e96ea093430c313e61be5fdfe51588baa2d6","b7e6a6a3495301360edb9e1474702db73d18be7803b3f5c6c05571212acccd16","aa7527285c94043f21baf6e337bc60a92c20b6efaa90859473f6476954ac5f79","dd3be6d9dcd79e46d192175a756546630f2dc89dab28073823c936557b977f26","8d0566152618a1da6536c75a5659c139522d67c63a9ae27e8228d76ab0420584","ba06bf784edafe0db0e2bd1f6ecf3465b81f6b1819871bf190a0e0137b5b7f18","a0500233cb989bcb78f5f1a81f51eabc06b5c39e3042c560a7489f022f1f55a3","220508b3fb6b773f49d8fb0765b04f90ef15caacf0f3d260e3412ed38f71ef09","1ad113089ad5c188fec4c9a339cb53d1bcbb65682407d6937557bb23a6e1d4e5","e56427c055602078cbf0e58e815960541136388f4fc62554813575508def98b6","1f58b0676a80db38df1ce19d15360c20ce9e983b35298a5d0b4aa4eb4fb67e0f","3d67e7eb73c6955ee27f1d845cae88923f75c8b0830d4b5440eea2339958e8ec","11fec302d58b56033ab07290a3abc29e9908e29d504db9468544b15c4cd7670d","c66d6817c931633650edf19a8644eea61aeeb84190c7219911cefa8ddea8bd9a","ab1359707e4fc610c5f37f1488063af65cda3badca6b692d44b95e8380e0f6c2","37deda160549729287645b3769cf126b0a17e7e2218737352676705a01d5957e","d80ffdd55e7f4bc69cde66933582b8592d3736d3b0d1d8cc63995a7b2bcca579","c9b71952b2178e8737b63079dba30e1b29872240b122905cbaba756cb60b32f5","b596585338b0d870f0e19e6b6bcbf024f76328f2c4f4e59745714e38ee9b0582","e6717fc103dfa1635947bf2b41161b5e4f2fabbcaf555754cc1b4340ec4ca587","c36186d7bdf1f525b7685ee5bf639e4b157b1e803a70c25f234d4762496f771f","026726932a4964341ab8544f12b912c8dfaa388d2936b71cc3eca0cffb49cc1d","83188d037c81bd27076218934ba9e1742ddb69cd8cc64cdb8a554078de38eb12","7d82f2d6a89f07c46c7e3e9071ab890124f95931d9c999ba8f865fa6ef6cbf72","4fc523037d14d9bb6ddb586621a93dd05b6c6d8d59919a40c436ca3ac29d9716","91fb6333bddb60dfec52d50fadfca0576f6ce68db9b418636d81e84b5cb462ea","7749116fd6f1080b735d584ab6a83e0c23024f42a2c8fc7ed12691b3c42b45de","e68bfa73e3ae561ebe341c0f9d42c8710d7db291e405360c2050c974165bcda1","1fda98ad2c74bae7877e332fc412303a5182fff2181ded847983027ed606b4fa","fe93c474ab38ac02e30e3af073412b4f92b740152cf3a751fdaee8cbea982341","0e6c1523481666b62fea2fc616d7c0be5ca1ab1c46a3ef5575a3c84e4de659c7","1e00b8bf9e3766c958218cd6144ffe08418286f89ff44ba5a2cc830c03dd22c7","a45e90f0217b9bceb78bd7c4338aa7a62b57a5200f6e29cab3158a071e33d53d",{"version":"6ebbe57a6c93856003f66c6fb54648a23299fc583a0c435f64b9cd7d4da64191","affectsGlobalScope":true},"d2b9861e7bdec290206bca5c61f48cb564f147f60fc1f0317f109b8791888615",{"version":"51d19cf6dd988cf25671f70d44e0cc8cbb577af707baaead70520c8eef34a0f2","signature":"c689d5c82a309dd22dfa47ebf791065dab774ae390a260b45a64b9e838fb40fc"},"e1160a8bdbd434fa1a07d7e73ff190960dd7f6990590027a3421e79e4cfbede7","791b7d18616176562896692cdeff84662d2b2ffe3fc33fce2ce338eaa8a8288e",{"version":"ee47f1e292889eb8b207d015a46d0d522f5a76b7c5296ac4324f2e283a00720e","signature":"0e16da9bc6656e406f222f0302490108d90bb193c87975b49c1ddeb70f9414db"},{"version":"ceed6c50e64b97f89d4047b5403d1fa7eacd6346b9c749f6ad7d22290242e3ee","signature":"85de2c5a93458409da378f5f312cf27f1f21b433217cb78c4079b526c94a894e"},{"version":"e5b28c58471cf1bda078c3dccab0965fef1faf620502f133cffb21b41c1e16bf","signature":"d3e51f645ef9a2457bea648478a817320bfbaa83d24f57cd0ed249f891828636"},"5340bbe4a404c70141165b2bb66b86ffb4d60a92be7508d0bf2c47668148eb6d","be2fd0c4a84a321079e3df8235a338177c613f8e6ad9eedb2e15d4bfdfd24b47","8f3d788e9f36da0712716b272870b06ad22c9dae8032ee0543a3f0f881a26f7a","1f420b81f613bd16733d048d6e828215b5e9191a64a20c9ff77a049fa75445d7","2a3b9bae621cfa8135b622bbc53b52cb7ba79d974ac4abe1003dab671c9352f7","eda7d437ae26e88e2d22d33d43b60ca69d418fe66045c9230cf79ac3f441a32a","e59afc33c7f94c61db082674f0cf1b0cd862e38cb51e93b312728400b0af95b9","b3828dcce5209e5b76fcd1a60b3c52c84735f56df7513a5d4412743771e62180","40b5c23e347e635cbf9f45cd03c58a68c501eba858ef3ea0358aee1e773ad2f9","04252db2f0c0f10a15bc819d1515c9939bfefa0210ee6d4a40847b08a427dec1","311f919487e8c40f67cba3784a9af8c2adfb79eb01bd8bc821cc07a565c0b148","71f7d6d1311209d26fc8336af08ff0353f0d8666dacd42e11178b9a8e6c55835","e7c641103dcec91a04dae4501bd74b105e106c1b8de28424882c3b1b7cee200b","4e70bbddb199aee939358c9a60931670082e768151ee3cf7fa05b04474341814","088358ebbc20cc651cc64f748206745b75bb1ac6a6571636a0d6020277375a79","8b07aa9f1a21859f840756e74ac33ae76392ab22313328484d4a191d1d098707","9855b7084a814cc618371d5389aff0c6605fb9221ff0b6c5e675a6fe6cdab9f7","c44d170308a86077ff837408c8d9c321ec61d5159f981b542e00af8054d2390f","1552a249535ba9306d1ce112428864d06af27f6c50f24fb75b46fcc562927b0a","59a6bb02d8b49f12fe01238dbaca499f1a1aa3d3ac2ac6f1d351ff59d0b5e080","5b14aaf663a0b8765f7dae3fce4adfcde6565215e72763eefdea7c223ba34995","b412ac3be6678bbc27058e17b2df63c5f9fd62c4b894d3851ccb10149c8d06d3","4bba4f0eb0c6199d82234f61fe5199879763756574713488595556251db20c50","bc176f0b0af87b8b38415db1274477c1936d96f4a1963a8b262e11a0bd74a363","81fdced220b7871158736c5d3760b3e7b5ce733bd9f2e581d5337d4bec081f2f","5988a006c63d1f252e53c769ff61202a664785ce4b6db475aa1b5ef829c40537","1ccce9d8ae7d65311733d005c012f7ce386e00a33994a48ac0b25583a7c76246","531cd80e4dba2620d86844a50e7d21b89436e56a14e66d6774e99b3759ac69ad","c83a76ad0bf69b0176042adfc65f8c6be7dd1141b66cfa20954520315dcf2c1a","5b1d4ebd62d975c7d3826202f8fac290bac0bae6e04d9e84d1707d7047e108df","22e4e3f0bc6ee46712e2533401c2a81a67ec3752cd86902c8a72db6cbe0e8a17","a3db1b06c287a664be4a5841f1a22246ef8c977169e84440704a70af34f4d0e5","90941c7eaa340348b54864722768b8489aa467876b52eeac712d43e92a125c86","975699767bb6b53a89f0bc1e759d22c07fa380682f87e47723cc0a15b1e5a09c","d5f26cf5a887c017990a71b4d97ca1b2bc63f2280c35e1d78c4cf919d85ae1af","74fe0b69c88fa28f23f5bf424c3019316b83fd6aa28e385180c3b48fc33af91c","c8459c432571ea13d18cdec09ed6fae9286dafc21a590d39fcb01698fb71c540","83e56d3337e1a6dbafdbe5a2502a84c330b1a328ed2860d689b2ded82b1f5c95","f186de91b1c50640e4d2bef41307ee06446d7ec76f787d4384ef808981025546","4886055af73784b27ea115b68763c1c0c30df8528ba50e7d1d3e0922c6e7d8e3","5e494aab922be4d32b26044c232b411feabcb9854d93ee82d56e79e5dcb48289","9cd6c2e0cb9949ee4f30f6302f0e59eca1dfaccd80f409bd61103f3a0f7b4295","3e670947b62651df1db828871a52a2cacb5cc23466c4060b4fb2de363ab7a01e","b05b23a0dc3dd90ed70d08845741ff463747cd539b331c5db7b7a249084d40ee","5be20831424f2ec3540853d3eb5741b10a5c40310ae0e8da196e518c912f29a7","71ce195a37abaeec965397ff586a8df51cf1061a2132a58b1d96f18061e08179","ef7229fe12c32f8a424017fa29e14b7c2927445ea606a922509fb8a1753ce236","187a9d8baf5677aad3b2d8e1c8c9adc0982ad9d9a2d8b9acfd3f779c964c466d","170f1219502b007cb173f10bb872cf397724f4c178a93a5d623ff04e30f14c63","3533374d0f9c64f4da2a7c12b12bb771000b91a2442ad551a332f266976f38fc","19d6bb75afaf19057fda9eea52f5e9b2904ad5ce074208e26a85a0a2ef02967f","0bd97515b730f06b3ad1d47e4ce48c938be1478bab653f3f543ae0b79906d198","197eedcb38339cc32c11d7730af7918a711455425cfadc0694a4ca5122eef269","a1d12dd95673359c47d355ba3ed5bbccf03a328c17dc89e14a8fcf9a97ea630b","dde8f168911f7381fea4c6a02a6195efe737fab17a9e529cda14cf75d213e64d","540f05e10a191e5f9ec2e98246fd9c4eb3e7a67db62727745eebc8ae33139c6f","713982b68291d8f31e689c96b1087d207ab1fca555516c68cb926ee9d4166a55","1bd60c1d8b798f2048cea93a93ddfa0909ac9b291f69deb3f0212bee2c4d5668","c0e6e062c3de2922dcaef1f5ede860e6261952597fcd7bdb9fb026cd6318bf86","8e4aa38228958772601e484fb67a17d895bbaf96ccd955683a92c3ea2ddb9008","38fc598403537c00848ed3351ba6e0c65965bd27f690fc01fcff21f4e9d27f1f","4179abc33d2184fee36504293aca04c5becd85ffbdd8256501e622f25a5776c3","bd8ebc99bcd31dd5bfbe3ae4f5b01fcf6d84425814d5169ae9d67323b00fbc83","f36f1888ca11a5ba157e06691e2bd5f813cf3a7fbe4f7d1eab73ca400ca194e4","ab345f367dea65a93fb572ea981d655b62be0cdbf65b28181d94bed66239d39b","cbc34423d552fdafcdae85854eb2269985cf94e9e8a8eefc2db5aba12e1a489e","a1cc012a1564f57f1fb78b689a443028efc86e2c50a8519cf14b9ac1f4ae0348","363296a883eb63974a8698bfccfb256ba8121ce0f9d3c8de912f2d2146737cfd","8dc41a1b2f84762049f27a94680a4bc120721fe06e397b369d2272b24dabcc5c","8b467fc313cee9fdf0f0c0dc0eb807472ec36a281dd844fe42aba7c7d274031d","782c2df0df4867357f3f083bded3eda44c13b3514d15017dfc78d2ebaf9ae276","e88b5b07b5c608a0f90c8da4966e90e3525613ab2732f381692bcfcc82002250","108a8327d3ae431c67d32cee2a9dbc69515cd0a797ce37637220c8c1e7cc3c59","76c5280b3e3d2ca72f8dbd12caa422414e688fd15b7d5f94a7b85874328f22f5","b23a73c176df3d745018066ec401477a2453e329bfacdc6990efb287fc86600c","50ceee7efc7b0ccc442027d2a88b154bd61ee1638423ad6384ab06097b3a1365","382b47aaca003ecac050864a116d375219d976c0e754893d8b6f512d4642f3bc","4eba19668b3a41814475ab55fb548eeae1b4dc5f4bb6867900b9fc2a6e54d1dc","f9ab58bb3c0f3e842a995edba6b222ae0d23e45bcaaea3d6f0561730f77ccb83","23558dc88cb96c231b77df151f99d25c5aec3e23b90f7d1abf3ec64cf3912c45","7928c0bf1e1cc09958e655590cc957dc4de2c57dc1841a90f5dea0b54cb14287","19705721a7e0e58cc2aea1e651f399df8868147705d8b75f436dc713885e7b77","7068a539fe4985654b67931fa23fd347010a2acc2c55ea6804906ec0ba215b24","8458301216f8b0edacedbd9bf4ed8d3c095d106b0dc89aef3f7d389777deb95f","5943ebb2c311af40cfed6bc4085d77a99815c4031bfccebd110a5c871c105c39","981b11b0b968b287b9314d62ce98f047df8c681401a0b7d980f860272e04b6af","a5b9e2f0d914124330c1bb33526ef5f37ede0a7b9efed33604fdc43bbc1d1e4d","b5a89eabf223770e33f91e450dd941ff088860e702b3c2dab32d84276dff0124","f642a8ccc5e5e51a274e83b33db0a58b0c29f7f76e367d60ec0ef753fc13ff71","7290fc12693cc4aee5c622e093d58fe2a87f24320109726734980095d2836cb0","086fa8f261577d811fc12ecb844013bfa2448d384e85687f8ed6d1eab50f9068","fec47f073b2fb33d111f1a5d0e4a4086825621077cb7d97b9cc7d70c71a8b4da","bdf2d64887b3310970ae8f82b3d3e252ee73021e68c1560c4100029cdd32d8b5","f2abc2de1390b39d10064755008f2780fbc4ca94d0c8220584f90f52d2a31c84","e27641c172fe5a41f19f32fc60ee3f6cd33cebd05478546711a0d5525e71c29a","b1f5c52932dde792df712a5e5bd3a0054e9bbfac25b75f64a7c9c560ef74769b","bded3e53c82923f398e79f13b4613c63c793ddfedb77dcc96ef2d4e5b7affb0a","199d5c90f2bfb449bfde1102db2987040dc196fa50236493be6e097880bb9a10","7f91c76025569a18f649b4f1457bdb2f37ea3f9095b3e8c258eba4be975b9dfd","dca5d1958e94212961875f29688f7aa2b759318e8e82b81691b9014e91793ac1","df3d1e02bf2ea886e1e19ff8c84cb0dd62fcfdc7594a23e9ca275bfc7a1a6929","866d209769bcdb53349b09f931ed7d3a6b9b4209517be447d05b79c7fb6dcee6","05b8bff7bf92fe6bc6186dd8242e6df53a12dd103f898235a595d9e4463d9299","af265239c6e9460640eae520e03f3c8c58a41e28214b73c758a14325e8c3873f","146198c8110714217f3a229c3d45db4de9abb408dd8cbb7d82dda5f41335fe26","a85874659715bff86a4f36163bd952d76fe964d60e920e724ba5a60bc4297cdf","daaf387669df2f89c1d517103111e82a0a7e1819a5c80e37917eb5c277459b97","b195cca0e1068e7bcb6196fc10730e8ffed7b9b8534ff9b2357f6803c32f390c","35f14910024494183c839fbb4006987eec028d511956909b9cc036b3f6534fb9","60c762939809e2c449e833f7f250d94f5a3e3f40ab9f13aad770c5c4358e3957","f736a4385419f05d6f79516a795e19ac3feed5faba15976beb00845a2512b5fe","106879c585e7d8217075b046fd720c250eed48464237827a52b52a97c331c22a","7b030ec60a2d65462d63662f0fcfd5928d699088bbb8b0e365627867d1a241ba","feac3eceef704a8c1233c06a48c6b876d4c3a4c39907a3b186460a9ab3e43547","4967b141cfb63143d2ed7bac0786f16d3b5cdbc141314349885ea6f574aaa807","8f88f12e68e94560cfa20456bec799a9addec6b5d1e17d5f69745fe053a6617e","c2d6040e9b54304965070dcb505152af8c0780a8fa6137441f32808a40293b66","6290d5f115e312dfafba88e6b5fdfa53f92d295580f186456a998b0c28ac0213","4e735513c891b43fbc6b6e5f6faea5cb367a120a9b41d2fb0e4485c63317da4b","af156aeb421bdd3268323bed89f14552c0e49c27f3af2710e8232f59db75695d","9842dc467389a949aae5414f159f3eb183eb86f0f70cd09be9380850a9a27bb7","647a9474f10624fa95a211a862084d02c8fc4e649dbc273d43e922d352d98ee6","509dbcf811ae625a026366aee55e5406b967672b4f125ccaffbe6a7a115e9b97","aadbccac3cc723ffe52ea862d54716080a8006e73649eccacfa5017d7a79b689","15fefce4c9ef47e53cd58a2e31c95c222a961da76d68f1bc67e5896ffc337237","ea02a9f9bc4963f021b599c172bd7c0c99978fcf9d3f4758b33302383855570d","7d4b9b998d3b90fb16576ecc6a0a4d509a30e3b7ddc1ae1aaef44bbf3f14db37","1869fc6926fb320d2ca95db2aa1add90a3e7cfebfcebedbb9d96617790537858","acbc7d0cf29def24a0c0208834067fb17143ad5fecf8749ad9b59b4acfdaf8b3","f283828ab153c81f3cbbbc5806cfb23fb1bbf7676c98f3d7337e02eb0a976ce6","372b08b99acf26f408df1a500c00edbc75f7bc76f632f0f1ccd1a64df04c1f26","e2e7d8d43f5ef2933fe9c6f858c94846d029eab5e9743645bfd07eb500445739","54bb61cfe4e3924c24e85ddda2707860950727aa9c7ff83476b9d18fee2a6aeb","125c53a5b5efd439b624dace6bc5cfe180246608edc4c16866a27ff1d7a78a63","5ece699cfddcb302026598710291f8a5a5d35a0a3f9c3b1377a71ffa22703fba","345de0d1c592b44db63ceed1f63dc41448d495dc1c86bb701eebccef13d59524","f490696d4982968b781337e5e16c3315935e8154561ae53fec5f867a2724a2cf","c3f2de2a31ea838e9edb87387e471e2cdc730671532d189cdb98960c8fd03211","37fdb8a2ed967950bed780b6d41ae769b342224ca19ce05fe8901805e3ece7d7","73e00b559b3f7b06eefe741f6f90c1041dcbd8f613e78665f39dacf6394e5d36","1787a588fafb08317552703339858b8dc1a4ff1a1d48d67b1ac5e3f70a542c3e","1b1062d7de0216e8a3a90802b97fc8b49918566ab71fa8f2799f169cc445a9c5","b134ccb28bb50740d975a28aab4e343de0aa3237991a3c706869d33b75b0777d","3cf87c6b59b29e44b45709bbf5d0a6681d68bbc740889ded2fe98383e0a55966","55668481052c746ee6c8e7fa7d131c55535f4c0ee8e6d10cbc8d0e3172aab65b","8a9756e1ff6ea9a823e1ad243e00d1b5c276b7bd67eec6497fc998cced477453","f214b8793bdbb7f815b206b2b847d0df65e0c761b4c9befbc7a7296ce83caf2c","f8823a11491370686c64157bddf82244f2c951f50e5e2dfc480fd60a6867e20d","46601649638c07ebccd45967bd970fe65ec4016ccd39eff20f15977da08257c9","a1e04c37eba1d3459a4ceaa449b0e8150def9208b53a2abd21ce3db889dca511","369b64f8020b09d25402e1032b992c352a5b1ccf7d74425b3cc2f5a113b041b9","f4185b338bb0ec604525395ebfed2d82f7657c34adcc99358f68fbb8f709f914","71f10a0c080c1ee4128370a3787911ee8543b178395519608bb05225482c4ebc","7d7ba4a044ef26036a2ac2e33040b2ec3c0d4cad918f72b06cc92f351a8184e4","654c45b1e0229ffc32ddfaa2f7a13240c8adfb8d245f6936837f8665f855ed7c","0bdbe4302b3d1079d6d1763662714519c475306b7b31b2edf5add65f67c7b826","483d3cde79a0a88584bc57f7f7521b80a65266a7fd07e82c31bad6adef29b1fe","90641e705d325de027109ca2d8268d5ae36f981acf113a414269c989ed0fa64f","f68cb4c74f0da0b793701c3a13e2e34537e56e4a3887d8ce3a73839b267efd03","5e5d9b22097160878951c9d421495cd5d56322d6670028fc8e76449ab2ca458d","a74b866bd293199b23e14108f3e56844d33787b2c703a532a93b656eb3f8932f","32a1804b990d2be79cc2368ce3bac2c63ca8b214b8a0aa56bcf87af4b2986209","b02d3275eaa38322f535a6689a722b912fd12fadc32602de713ab0c8307456a6","dee852f23b837922af727b7c710eaebb4ae014a7247db12b2c869c7b51cdd095","341d3e3b491dc7dce2e152c9ba1ed406e9437ca795b40d32145408ebe5d03462","8ab578c53ae8b6428db026a3c917be84db558d8041665a2be2af45208001d5db","8cf5e44edfa5d118b87d9c429b6f6480e44ae4146f1ce122be01cf1903d4b3b4","6fd6f9b2e99d4f156d97f632711e5305531bd293a3af9a8364ccc22a31385f15","2bf0564348cf6d5f332fece3c7e82d137a79d8643f5d89dbc20a51d437a49219","707c0465b632b25d3eee2f90be0878ba1db509b498faf24e3b3d77a7c014b337","5f3f82ed90760a5dfcea0d4d966b9da7fd3f95eb52aa20aa9c86b079def0e0de","33eaed797c50c21969e9822c291e891148153af64bba58c3c24d40469ed90509","9f1dfba33d8b2ea22aecd17efb3357720be9cf6e8e8b02528413f51cd6839e98","e7818cea10297d43f5f9f3a32e045eb884e24bd0e8cad121f0007e63aa528506","2e31d2696ee03a2766d9437a3cb06eb4fe0e9eb771665c84ed55d9ae099857cb","d542ac292805bf51b52ea1d57a86ca80e3eaed48f70c23d317d9cfbd983060e4","b56db6051baefb06c0469e892c41faa038f2567f64bf4a9368dfde64943b3d78","494156051cdb8d5503456454fe32e77361c231a3d904fc82431b2846bbd21134","6c3596c8cef330a66ec4d440da06243bf60410f9ede80b1714725346ee733fda","c43e320301589efa8355fceffaa3a74cf40d3d702ca312df55009c071ff56f25","bdb17b1a2e8ee934bba0a5b48886093852a8bc58b96467846a881c407116a002","23701acf3248c20ce61b59077e02f7fd5d16f3644eb387651989d361e60657af","745b3ccd3245bfc046dd279449fc85aefe8e92cc0b48c85728d1717b41e978d1","926298aa640e4265691b5c0f904e272c0f5848a48dfd6bbcba73dd219db066ab","11803bc0d16d5dc2d70acb442d2463294496a65696ad90ce4c997ab8816e529a","cdd2087e4f6360cd69309116f37d5e9832658cf00b39a9979c653276973ab5f5","95c0eb4ca11cbc7bc6aa90b5d09d845d4dec30baa1e0c6eb5eb5b1a570cb7cba","a75f736c816e34cda164a56f72aa1f8e7acf11a2b38dcdaa48b3a351065655d0","002eb28bc5f6f5ab3644332ed1c5cac44df406438d5113618f74c7bd9fdb9614","7423f7f5a98a1c44c087acd71a762d24b0f37c13d75b37f6fa26d0a3432f2d3e","76d36e3fe4d05668e3435789c3b8264bcf20af697e431a506450aa31af353ed4","67420c3747fd6f672d2f3c5fb37a7f86b816d16cbef3a048b2bc712cf96b2b9b","5e6f76936bc479cd12c6035e8af7db4cfb2236cb60e5073d9227db6c7dea960d","e1d8dc6d0e63fb42e257e4f3b1848ae9d87597ab6d42973382e4cf9ea1f2a5df","2775279e20122dbec5ab643205c2de54796481366d6fef23cd426aff3a775359","0f150330a95a7655340acfb6080b98eee2e7aabbb7621c12aba648ce96926499","5f54ccbb384fc83e442597b0bac56c2c33ab6f0d4272222403e74dda474e9329","74b4e492a5e50fc36ada0afcb28a6fd503ac6e56c32100fb0a3c67d2b039eaf2","c3906faaf1ef469a8c6bdb06d887ee72ef3efa3db90f13244fce8ad5151b6f29","ee0fc65dac0f1c8219b190992d8172f7f8d6c993f243a3b602d849726656d88f","d06fe49a2691f85081f2b7af3996418803fedb123c03a8ebb3c03c61aecbf5c8","b99ee43bfc44a2b1cc1f25119e12a45138f1129362cc896e2bd2b402845bf4f2","f64ec1d4f417e37db6a77b57d83890eaae4bc9f34bd6511a708ce7a996a3d55b","dab2b4105c3bfae9b075229c4dfa21fb3d1731366d4a3521f96aabf189d221dc","7d605d744a2357bf5b5894540e914005894b0c45121fc26a5db8becce77fd07a","ce528699f9a274347204b96ff2a6c45f7dd8daa1b64dff97813b7ed45f5ee66a","3613862537943cfed17d84ca8bce035c4b940027a9a0fc7d1f7150bfb0c5fd17","a0fa9812d4eae4d59a3b093c51de49c71e09e3b25fe9ca43773574737f75a157","bf634e01493c3f8d202f5768b6e39afd8ee37d2eb71cb17e0ea071d3e7c590a0","98c767e6e3e19e7138820d3c47e22c9abbf2e866f76cddc21107c0ef50d07a78","16390ff08b2c73c75ea19745d9312d4e468d9bb51961b04f60c998b90b3b928b","089696957b4c25dc7daac0989f7111f648803fc0502089333b62fac51bd2a924","04da2226a824c6f2e65c8d384e6a3f2c9764b1f6f403de9d2cc14b0805fe0f67","33720ae3aaad9176f2c0a9566f1de86ae383755460d0c8b2a2edbaaf4de43427","0548d2ec85b0b13a13221c4655e6c06aaf7418ebc97ade0aa587c2343ce6547b","6e2de5b0aebd9239eb9716ec2e0cb81ac4995325ce355b466999961029844ff5","d08c8749fe18ac1a6dbcf2bb91ceb7ccbb8cde5cb5e999bc0a741d61ba71f117","d9e43f6f76557c54fc1463bb650146837f49c6f2d0d822197198060110503bd2","d4deca71cf2889a5f7512760d0f08ea7d9e0bedd46100b828d07612a7f3e670b","975aabee6dcae41913b2564aa604561f22f7ab975cc2c01f6c3ffd27c294a552","5250574802683496a4f8fde6e133c702a392d53a444f5d1664587b86f0273639","7a9ba9476a31287e6647152529fae42347a862a5cd6368104e9e246202a91199","4e855b277502658b22e5aea161f3e09eebd53d5430698844af5c13a9ecd72c03","e1bb34d2a2efcfb67c19d05fb8db0e0a5de1cee68236d4ed4a6f9e6aa865a896","8c514d50eea9e613dc787aa529e1ce54874996c2157b92aed232598f2c50b3c0","88d801e4c8fff045839f47cb0ab33852ed850d7726ab82434fb5a44fd8cd2556","d8c3c3d023dfc947dd1056b21e6ac9bf074e95cc5ae68ad9df72a72077010d41","89e1166774ae1f891ec008e9589d1cf6c4c80c134b50f04c80b3c3e0ed3110f0","01e8936c8014e13c1bc211501fcc6e2d81d3923a22e9a19df18f1508965f449c","d102abc0b927801711a39a4d750776a6a0f5a91512d3570aa4cf622fa8cb3175","3d96ceeaebd16cc773a45faf1b9d3e147f1164d4a29caef7a0a0d5520f2fcb90","412c366af77e4023affa3739690ff5c76305bf50c4a0cbebb8a841c0bd7405bd","7f28cdeb367b7eec78e8a8c7b29a0ddfcd0c5861af3e4d4f9ff99fd35b4f5e9e","484d6e6f4e5fe43cf335058a3305e1afd98ad33b414c996f54571b336224b861","cb6efa14d1326c3d525e5597f840f6729d8f521fd85eb2697f8bf13068ec39b3","4b5f0d2a2af68a38dac59eecd5bc04fa48b247b7aaabd06166ed5ff64b897f43","4f95388cc4b8be42d2b39cb5c6c2a59bc7a5d5667248ddec118af922147c0ccb","2f428eecc597fb515969310b76daa01446eb02782656c617340b8aafeb4d97fc","afda8791c56ae66561c81e5c190911360e45491229ebfc46b2b863ee76a056dc","f52871ba2399dd4a87ec341bb238df010fab729cae37e583f4441f6634536ec5","20d7e7f98ada30849b09c3fa63d65622d40cb5acb0fb5b89b42376b554347988","0380612a956a6cdc2d6825f5c0bd3b00d76fd4f79e81e9e4fc9a1664b4fc22f2","2261f4647954aa335d81550054804db3b8c91a474cabf5585d86fe31937c067f","a1a9bc250b4ca1caad3f0de69498aabe2c01eded0be4f779f0a0a7c5a58c4077","c05c1981d2a1cb6d90922e61855ce3fc2d2e6db99df7b00ea58bd4c85bf0065b","283bdeabcba8258fb064ee12c8bb973fb6e024519cf1e5eb8c0f0349914f7b4a","5027737776525e26636313d9904a35b73147f2aff691a68052bff8f1e29b8510","59cd6dd4c5bdc99f36cbe0f0a469d47324adb8886ba518e50321da36ba9b0fe0","d974e4e8586aba636795ec9c8036c5fe8cd6321df28f7da4163a3b7af82197e3","a94337bc12b3d22667aa7e8f60551a1cf08b2e7b91dd8647de86e0c64e116dbf","9ba2e8c857c714e1be0db2a7e7173b2954606adb5552e616827346ea23ef1d05","57d04023254dc1fedddc1c55cf4f4c8be97c7b3e707d3f5a46c1256d4a3e615a","6de407959ab3bb5cde719891a4d7c6e00641a3b8f56a829340fc39ac5038acac","15dc1f1cfd32a0c720c99a72351a036c0272224ac0f41d10db10e7631bdf70df","d4ec31b0b60f89f055c40fcc5a768eb1435739c5bdb6181af596015dbe74a010","6867757137f9e2ebee7b508fc6a80fa9db0fd6d4793a444b80bfe99e768d258d","0e5d11cf8de3373b0e90ec6b6d8bb1aec9c516b7d48d8a56a572ba6f1b99962c","48a0e9632011de6d7737e1935c385638a19734a5257db668803e5737be641187","de8d8f3568cdce2b58ffd72af94cab625a680ad6582fd3c7167534ccef8e21fa","e83100a75dfb09a0e6b73ea26587deac836ab698689c59a39e9f91675d45d23f","9b123f2d39794362627d10e5ed91f72e972c1634af69f062d48c414bc9f66352","80a240a5891743d3674d97ca81290d585999f7c20678a0782d46548e326b2ac8","836c5266411f7f089248e84dfc1efea381e5411f8fa1860bec265e455e53bdfc","ee65d2d9b264f96bced10be5a548c009b9206c4e38cf8dcf2f62ff15b9c61ed6","7bdf7ae40b23d7d1341ba3c31823650631f867c1bb26f8c8228b680b579d3210","4dea89d7bd826440c16eca419f071bd7939ead4de6ebd17a8e57c779763c0c81","30e3290af779003d361e84c767916bc427a28a3858f73ee2efa76d48742793a3","69704cf1ccef472d78c190ffd29ce8b4452096ad5d71c41b4e1884391ff1b41e","3238a82685fc10a634a42266c3c41851cacba8803c97ea2113a61e4c95a7d1d7","7ed017437c45e65a50aa0b6cdff35add289106cc3239904ef3939e562976cb74","723f068a6f2ccad1305cdd179c2d3ba18e630c4e64d4c514de16f7af21149eac","239e71982bc438f297eb9def85629416225aa0d064ad9aee813dafd72cd152cd","869eb1844a7da0600c54553b8791525a62384b4c35b685ab19280cd50a528af7","5d4b2816f2e11781ab76a816955d4a160da778f295eb6cc17dfc0a8c7c14dfbf","0e950fa619fef178131fcff760f73e79db08187916cb8b64ab8945dd305a9c86","889cbbb50bc2d837f260e9094855a51fbb2096c5b6e60771f5bf1bde759b0529","e65218e979d3e7436269533ad6d17c66909aff8cfd869626cd8a5406b32f7f77","8f54a339b2c59a424cb7bbb8c1c25e481223f59392cb2e2ac722ad5054360ece","40fa0f2cecdfd021d8fe883a62caed86fa01da0abadab8b33c111f3a27f68cf3","7c1bd4784dea91c4d227b38c0b0f54e8744b3ddd9c1252eb14e72aa80e7f0d31","afa23eb99b264e6fd3bd49f9a9a2253d3e7ca72eb108aff4bc60c558d7621df5","bbbe319e8c4aa5e0f3bd17029839373abe2c6607db78c0d8076d43293581a78e","ce6bd901aa23d85f3f7115052ecbecbbee154d964abbd8e183a376ddf733990b","d78555a429403d2a1bfd2b5fa2bbbc13c7bbbca8c96368df2e322bd3ac8621cf","0f8679f0a77354915e3c3189eb61ddca10f5ccb101ab168b71782f2321b1273f","e997c118c2d5f6614c2d25320f29dc40dfcad163f56a701a2bc66eb80b32e6de","017351e1932f166f8f2d0c321dc157ee0e6dde15a30be910e3202c26cf606fb6","c83124bd4a3e5af897815af6b17ce8c9c5ebc62b309f0d5a14e916a843a19a7c","0c7285553c36ef69db118be778a000e24589b9101388e2f94339436acca2f268","d99d54c79b387d4178c6a12b09f57f9a853071ee504867e8c7030001f4bfea96","8609e917555f5be55b22967053bf3e38af2e5a765ff472884a775e368d83f2b2","65b908159bbe65097f92df403b01c4148f92aa18685841a0b8ab7c080c0cac21","246d6c93e32370c61e6a32a5b77df0c02987b454acf92fa17fbc127845de73eb","d8006e69eb4d592a40c5c1c112c8a8ef79dcee716f62d1fca8b41d0f90e5a1af","f187fd1bcbcb4e75c95a9c6e4027ae939439a661c0a37760ee39a5dcb41581ab","2292025dedc92d914c16bf233817bba165c7cc3f7575180bc05b283ecde2b781","ab3736f4d0149f337e95f3778e3bbc68914d3aa115cc0b285b302eafd73820cb","7d32a99d3073ebb61cdafd257c75b1d96757fa162db9e4aef51a594677b3c0ef","a4fec4b172622accd106504e64bed22bc9d60d4e5b3c6b3c9d00bd5574d60742","d03fca025fdd6877616d05653b6e8afc83cf6d27ad5c3c655f34efee15fe0f20","5efa480484e1bd38f84c55f91b58ec87a97f0125ff79db04676d2e57021a0dea","13e3b762d0a5c4370158b6b41207634c4b68784c13124c3345858b05cdecc11e","9f51695eddfcff9bf64dedb40cfd15044a2dcec4a149e5155d54c2e5bd07cbd0","76d82360626a25ebe0df6e5dd9434839f6cd1a2482f3c4e5dc9623b3d844b4f9","ec6498a9b1416845a9f964aeb71a56aa2977e98fa05759b84549404702aace35","71cd46cdf95730e6c9cea42e320cdfbfbf9cdd6b536bf9c96a6573153dea525e","bea348e50cb3e2c152c477b3d5cd0a94c2bfac2429fd1341b77ba57f0afdcae7","b8a4c26cde9f4f2e1ca8366db86ee72e716de45aa848eb5d15f8b09d47de6883","2d06b46d89444546d248874643a14e6afa9ca1400d3bacfa8c40031113935efa","8a61ddc3a411dc254efc9338acb987cfb620d9931d3ef3b3714d9061b32d2f3d","8f692d99f64adb2616d31409f12ca1e592f1fec9348ae35593fa3a16011351aa","07b690c40f08e018d07c453e4c88980765a4b4fad2c33b9121018c995951c9f9","f2fce8e09abe41eb2a2bf7c2cc35c1b341781fc28041a4f9ad90f5717e76d81b","2f3ac2abfb723643239aca6e6588e3d04a0870b0111fc4587860cdc053320090","9066d1b547a57485e8430191efb300c43b10685ceadfd5b258bbf06b3a1059df","6599c13c1c0d89f913b71c19ad323bed2ef94a8b472efe56cc0c63524d2d4547","41c163b384a5a67ffa85807addfa811c6e10189b3fac8478e00b3217188c0668","89ac02755a0c3a79aeae98b49725d597a245b753be90782ef2ec12730063f0c0","500921f96372879891f2ca5fd26f0e8de76d674b6bdb3800fc40eef5d26d1020","aefe6e20afb6461abc8abd42aefdbe22e9e50832e34b0f81e4568b00dbc74c49","18a0e300d7656ff1a95f53f0255e1281d4aa7909f6386dcf54c711778ee29acf","6d6e3cac4556668afc3773f11174b8cd4012295c3c35173e68cf2412312c76ea","2ba6ba26009f322d8f58e996c736aa9faf8457b739f2c69466eb3679fe7809ab","a6cfc043b9ee3136e49764d00ff297e79a45651adfe24c785ba227b88ea3bd71","a1ec8813c39e3dbd31361b0b3ca6926620251e9b9fec212cdf21c8f39f9b421f","d0ec900bbc8795c26c2eb4f6d831eff15568ec15083b5a63e5454cc9cbc83df6","af9d1e15bf118f6128db740554179800732e520a3f769a5ce4d69afefae511ee","9d6dc5653490ea7f28804a8f44aed9ace566a0280e97a621be9d1526df0cd359","7ea08edb2459d84a47e96b5e7b5ba8023c146cec209fa013acce93811c859349","6469ad8d46ffa793a564cc64efe3198e3134f730ab886760f5a5c93db3ebf053","e7aebccd51d863f0a0c08c5413f5b50c2fa92c7ecfe55ee828a40b8aa7e1813d","bde5a3d2f40f34d1c65e06031866faa316900665d8ef3584b4b162f0ae16ef65","e86e2618407de82d749c2464d6f912edd294109e058c45afe2fcd01e9e510ea8","0005a70db269659a53ed47a6545088425c45950d2410a09382d4a0fea75f4e79","a2e9b6faa5f72da2b4d7da630f41b60ddd4a936088e6b0c6ec24eb788cd36581","8dbdf722d1eee21282b71cc022e28d878f12c9b7dba4bc7c8e9e62c66bb986b9","dac4785d570436a1301aab1ece1cb37cb40be0dffc38a57e4c52a8ecd6a2e6c2","0e6f1f253598baa6649dc18cdb7ba52b6162906bc12b0f5b2a6671738efce0cf","300af52063a4fb9ef784acbe43f706af0abe5c883277e51e890ab3bf550bef02","7f5103c6727c21e83a00bd0e4a9b8f89ee5c893ac33066ffee9ee1f413faeca7","138b5d9a9940b2db33385617be7defda257ba0b5db5faee07f4cb209ae0fc471","3aa57a29b3e6e028c8df2d1e21491250fc8f13a28c53d27a02c5a1c5066771b1","f45effd310e153e583eb7acf0338dcb701dcd295028452146906677913dae935","2974bd7b4bc22c0eb63120f8d5697b6ada33e15e6ad58459b6ad3d9cacfe3618","cad274da74d07f9bc1d59f7979c3b39fbc8cea194a157db27f10cee5573b8801","996c853d12f565d3487c52ebaef0f7e91083be69ef838f81a2ae0d29e980df33","8cec8ecdd8ff9e3eaacdb028b53f138d410053f0ac300eec482ed5b7607caaec","ffe8e39fef48ebbe9758c36e333ecffffa9b904d18b917aaac8ff92e12628ee9","e9e3212f307326f1d441a700e64888cc07a30a95b82305fd8e287ac0216bcbb3","398bdd92a15a28edb7b5f0492201b360ebf539b0e20668d10990e2c52e978d43","bb10718decbf5af0f88b68bb7db836abff15f339f4d5d2eb340d69894ea1ba75","8045d5ba265e9bd655f5f041bd71f72b1c08cf51cc90765b234b5a71e56270bd","51da6318429b800f8ea7f932bb480ada6a4dcf565368f414b4d8ad65b72bde52","b4e6ce2c69fb887ded9037be96360068836aa5f040f3747f3c76b6960e65adad","4b5c967fded3dea8d67cd52a512032fc9a2c7feb898f309265f841fca1ec4762","f08da4cd6fbf446b5ae2b19d17307bbb31bbba46e6efc87f878d2834efa9b1fa","1242f5819e80eaa0a92910fdd2985943f68f678ddaa4867bd19df2dd48479561","e1fb87fb8865038ad2a728446be4a40b01b41851220ce56c91a7a77567083b66","5b4d3cb81d4693091c9040e455f408bf5ac863ec6d62d91dd15959feec9ae8eb","6195f21a5b7ae86b882f9cf78a316cc4cc5419e94ef0196b3b0646c42a4b0711","243eccd59e9ab1891bd60b80d8a9560b978ea7e052b64db7745c7e33ab9a4b32","bd8f93c76e69d06150e9ae31f8b778386d803a173afe759445ec4d642dbf2df7","f5369490fd4657232ee4e47714910203a4f238e6bbb1067890c9a3605101f73d","64c2db487063c5e85682c59853f60d8f599916348e9982c1c6290c057876b1e2","f9524d1d2324a7579670fb8f457d2f68e1e80a92ec90a7521ff864ff18a7876c","e70e85886b231efa91c41feb93d160a2162aea727268fd85a50db42504bead7c","8653a7809126736e3850156ba6f4444d1961e375d88a3945403da0a24ce03176","6ddfc50353b2d013675c5b05d2f9bac01ffcb1bf5f245a50f796d9fe37513225","78d858aa78fa34523982503ca58ad11f625874fcb2ed470d9ef15f99734fa61f","5f99110b8f3cba92e6071634583fc34fe5caacc49b746ea1d64998102396e106","bd4a68b7d50f02dd3159130bff9ba5756e7ac9d88790331c8623064312636e6d","fcc1404a08af56811291dcf6105b26c0e39587b8814c16deaa0e20027df3a1df","d409f2b4ac0bd8b103255d56bf1dd0bcdeb0d0cfe001f0e85e8bcdc2a02562e9","01d3407d9af088aad85c2bfd02171e5956e05f43d0007f119e047aa452718e35","8ae4cebdbe05164d1e9ae76c21d58f55e64de4db51d2811c849f813308e75ac4","63a3b217124c65f3b088e2de2a29fcf4f17e8ac0104eedee4275b077436bad91","32c7889a413b45b8d5683b9dace4f5184dbe14843a6049b760bdc15672b82f62","c0f0812d23d92787fa903bb3f3055c546e45b49e0a45c44b7a53d6232915cc85","02a3bffb91065bbb281d1f036cdca26329ed4db9a2061c93d8b7416e6f8fb71e","5774da9d3e6e29aee5b77dc6ff9adf43c33676430978f370dddccba9928377da","deb8990e5ddf23f1cdcee8bc99a5157cfa6c3985c9ea10fd6f3dfcf66684fdf9","a474580adf96ed8be4221036cfdff906b692c81075f1aaca64faf688a93b2517","252b0567f719b113d4d1640436c952f728655326787de844cc092365c73c9503","1e9ea265777aca136db6c42bce6b35afe534df56f63943b35fe9a147bc0ff3b2","dc57d102a5e03e30134c377d4cabdd701d609a21d491e72e45ba7720ee9ed4bd","90cb406c4415512efd7d80823e53d17d76a80d3ee1042b1f88167798fcb7a7a9","50d5f657807f868a1191281927aaad7115c53d864a0ed4fa9c7c7a17ed6f97b1","2fd7f0dc7f9eb7d983b5c2b657ed6f8199fe398380ce550348a402d475f7a8dc","d71ae839ab74d280be20729f69b251073585e32d9974e96e0534720254541ab9","9becedcfd497162235699a60e66758eb93903bd36d57f004ad7d64afe66a24cc","2e7b29eeaaea0a9a1f75ab399391d04b7314689589b5c6f964bddef44c0ef99d","50e4a0750cc2e71fe648c3c5ab37569cf907f53e4192234688a27639cad9a45f","3f41f29e2d89c323ee3059a2c93c2bddcb083cf255b7f203382215bd33e75ce7","34813350d7834f5c9a3695b5ada5cbfa0145ff5b8628d293c8c3ffd859f92dcf","2a77af568201387b02b9ec32b9d274e21e5f773607f1e63acf05865b25d1f51d","1673d43e587229fe516a07ad033101f3ca80b09bf95bd38716ee05ee33a1851c","8c17f60c20302a2fea8030702ede66e47d9be87a75eae111142cbc96bdf3434d","50f10f4f47478b23424046fd5f26bbe07070ebb3d7e632d62acd0ca9faae6eaf","ec28986e53f82a573c45f621dc00016bc8da18c3167c4b47012352a8b5a507d1","1d2f5a0d8f20ccd9a16e57eeda9b63701260061b9193823bfcbe16f828aa0602","b6d25224fe0f23250b4ac41eb159a385140163a4aca16a7cf52bb7ddc0b047fa","05cd5e0ca79531e518bd8f30c28808d708b3dfb83a8f3b86286b6d2ffd805986","f3db54330eb9d04afd39fa704903278172d5d22a9fccecd875c25a48f9bfb2da","a3d13450b7f211aaf02eca1acb2dd6b563e5e1f506d913ab5fe37362193142cf","376e4978875322ca023d312129c4eac85dd40a5949c17875a34652442d60faf4","9907acd58231ec43dfbc27cff0ed5a5018bc0be7b98e1149424ca29419d9a55f","980676ecb6851a6de00c89ea9562707876f5884ccf83ffc41a69117c644c8663","fab4b41c9112a72d811c8e7d4bd7f31234d96fb58ea720e1ffeabf36024067a0","186a559fe4d0c0adcba4b7caf2869db35af47bb8759e07585967f8452abe79be","78b663aae6b3a9e935bb467eef41628efad258fd82d2d51d1a07658c823276bd","8136040db8dca72044f3661cbe613dc43c3eaf635a814569e5a727f5101e8261","edfd56e00c88ea408851012390143f4896ccc8ced77cbeddd32d9e0f24e3a418","7198c60296fc65bb3f082f0d5c233721d817e73c635846f7004930a1d8183c15","40753d3499c0aa6334abdf0f99db38151f35f56313074ebffdd580c77ea0fc07","ff1c47c6c1e6f3629c09a471f0b2c548af3ed079f6b65fe90192d2e73c55af96","0fdee06202861dd0449bb160a6391d8bf3b32ef03891775a084330e43d50164b","95a0da91cf0f0a01b719d2d2f5c48f1809d99e480062c8e953b6c706ae448cd6","f6a47e3cc69c2f48b97cd453e0ad623751e5aa049e8a73de5ae6503c9da6e8ca","f9caa6e3e92b79b3cd0396e8ee030d1b128a73b741d070b4c36572c3fe0aa430","d1ab4a5f161c852e0757285b6def92c1d5155d71bb5a21073b4a6454d88a6fa5","35f269b460c45214e4fb7412afe334c2594631992bc4cd3232810271f964febb","961476c13adc969c85226918b678d62d3a5322dc7fd7c95f3256ab2006191fd2","633bd8afc6d2384d286a29ae372c6c98bd466171b16444432bc6ca756ff85165","48ef96606b4fa9c51a443c197d6de60571c80e1deed08c546c0f83c7f91c4e7b","cd1e925230c2957f3953e5b546016f0c006f6eb869299016569f12c88724fed7","9185ef0d2c9298325ff43d7fba4376a7f4f63cbbeff2cd6de58d6e0302e488ef","42c55276ef95724d893d9aacb9e55545259751bf460247cc800e79203e44844f","4f1d0f8126f2651161007a70a1e765013397e19a25a69fb22070c1cdf35a2eb6","2a91efc64428ac9a7fdb313efc4ffbf7e3154649ef0c7f714bf972ff14367a24","bad43263afb8c55abeb6aaa3e2e0fded47f04c5d6f6ddac261e81269f72d4567","4b62ffdd5e7ae39caa0e5196ff2736ded384c6a49b57fb6c0edfbfb1abe9885f","d14eef072c56ab4e98961e67b45ec5a5f8aa84708f703d65ed9850b1d1856939","96828db794d4886dc5138f8d2312d6bac583a617455d02785a6e95947e442a9f","1799148c18784803ae0ad156ee32e2eb2288396e519aca97f51517b6339e3937","a9bbb291c241313b548b12cec9736ace59b23193e18eea938fa8991109f3aa7d","d37a7077ef913a3402aa51a445fe052608db50530f6fd50450fe3523f1ac5910","c44dc3134ba82a17e6959119777e9da3de6b3513a5e9b32cc814f066741410a6","21dab28b88030774adf1108f3953170f9c0cc1059025a557dff18d1091257d25","27db4f565f974f1d299be4fd2435189ae207b42bccf39bea2e58911cc89297ec","ca33a8dd3b61ef200b947cf33da0fb3dff1e7416d086f637058d0f7dd1b9e67e","c13391437e20d60e52f7b891cbe8ec7ad6857fa89e58514d41b5ef09c40e7b2d","ea8282bd6ec2bc85ecc4913905507b3b36c4d42d21a2ff25e50ed96af476a865","fc2b43fc81ebec9aca80d833a56d2850307c39f05a3c12478af8bee0ab9a0a61","e798b23d14839f231fb15514abbf9cebfdbab490478113b4f9bd1e1967b0ff4e","783d99a4a0d83acc488992025afa42a8874c4021c1ab10c036e16eefda5a2110","aa39613a7eb31234ba82307f71a685e960195500e4711f84d6de9d78935cf93e","0fe8576818d9c3047025b6abeaf31c75c141d6dcb835ca577f21bb8a03b3d536","89121c1bf2990f5219bfd802a3e7fc557de447c62058d6af68d6b6348d64499a","79b4369233a12c6fa4a07301ecb7085802c98f3a77cf9ab97eee27e1656f82e6","ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","5d08a179b846f5ee674624b349ebebe2121c455e3a265dc93da4e8d9e89722b4","1af1f2c02132bafa25c4c4b7c415e0a59ba959d6db6bd1800a43fb5d943e3f77","6ed78c0dd85bba4f0f286f8dea1bf8a65632cf671133f621125e34f5d63c57b5","8c50d5e8aaae8af1362963b1bdebdab08e4749bfb833c02e0ae9c20dd8419411","8840ac63b448062ed3c171c343493b988cbba758d3a4625f99052eb3a22a7fb9","d1fa26fa13ee8d9fffffce8e839feddc77d863597f2ac18d208c6966b3314f57","01e12c80ec3b6e60769389683fb87c47535a34a038977cd4ff9486c061a3a53d","a1b8d849266b3da0edb3705570fc7b34bd53c788afbd9d981fdcc44e73e89757","32b41b7a40546ed6eb38c7e51c721d006129cdf3bd9433149e4f9c5a0239638a","5143ac65b70252c4dce46785efdd41edf551abac29552bff7d2e3c559bd44c8b","c4115f1e5c67644a394ae1aa1439d6dc8fb08e9bb6a58cfd42d64b467f418f05","614eebb8e3a89f0b7445e23327bdc37dc426fd870a3b6b96e0de774869f19395","ab4267d371387f8be164f1743a5d2c844b8ec5b5fbefa1d9674eee34904eb221","e2dbbc9fac1688b3ca7a7a2fb98649b58ecc017576c7d745e10b27d7fbdb1fc3","69b96da62577eab48668dd4cbe9567f6f94f157c05507c6da7a8ea0bd9da63a2","3692f683fb4f3ec5b0eba15431cd90e37e891702e21ab1387461dbe89252c07c","bae0af9b71bebd58beeb607e048fa06ff5a976e0dd757f346f242cb50b5f4f13","e8951674626aedee6be73ff6bd659945032655453e8877fb484931f2254007cc","6b1a03729280176509798e8b295ae9abcf4fa71a58e7187ed9f10379d405840e","830e13e8e62f8bfcb291edaecb85641fe4dfe9608b3a0c0f8759c3ac966e95f4","53d7651005902b904b28ff9d97dac4061d5a6eadce2a2b96731e64168e9313be","f89599bbfa52914cc6ea40b837871a3cea4b86fb841fa05df1ea8aba868dc074","9533ab81da567cbf24762de21a1d41ce9fa41eb1f3cf5b906967c907974f0ee9","84fe919f192f518f05f0ddcc91b1b93b01eca8b9a9c791f502c93a82a2bcfce0","edb778e757329c6966494edab61f8ecfd2b747ef143da47bf23af148a465aeff","dd896a01076bff523df123124d67f4e6bfb29da9cb87c17ed2fddaed547bd888","e41be8943835ad083a4f8a558bd2a89b7fe39619ed99f1880187c75e231d033e","a598dc895431672aa781c14e7a2f898e26730ce06e9cc5009d39fe103b950061","13d6ded2bd2b0910e09aca1f2378fcf8b6861eb672c559655368a98ab81dc860","985d310b29f50ce5d4b4666cf2e5a06e841f3e37d1d507bd14186c78649aa3dd","94ccc6a0d45b112387e38bd01ef5851cd561575fa2164cc708a1714b7fb5d71f","61937e4027635e7f12746b58d1e3bb7145114697a555bfe912aca9bc34415367","1ab840e4672a64e3c705a9163142e2b79b898db88b3c18400e37dbe88a58fa60","48516730c1cf1b72cac2da04481983cfe61359101d8563314457ecb059b102a9","f1226c85c75dba57bf83b0df3fcf20af9c8d8a6f1043f33a637425bc41abda85","f2d80ce361931836b85db164e993b2770538c0ca2c13119dcbcdbc8962e2fdaf","a38fbe9176d15bbdfc75bec1e64c8adee2fdc1a3c9c65c1fb15d66ce764cc881","7a819c7133551418f5dcdbf7038879edcf2392baefde8296389f5c3c20cec2e7","a458446a6e4ef3db8be5f214f42490acd6d2bebc9c15c397077b0aae75da6a74","0413281c480cbe10fc6de715e912bf05688c53024884c57d0433981c06e5eb7d","6f27bc22042d5504aa2bf1ca4a0e4d415c96e69df45cf8f3e34d6794d8bd4618","0220ba3013de8eb3022af6c8881e48e5b9ea57fa5f045d4d40caa81cbab5c8b1","36c0840683680e9f4c2fc4157bbc8ff283cd147d729a27043a35238c39182530","5c5d901a999dfe64746ef4244618ae0628ac8afdb07975e3d5ed66e33c767ed0","85d08536e6cd9787f82261674e7d566421a84d286679db1503432a6ccf9e9625","113976386a1fd6065bb91eb0ec5958245c42548019f6da49f85bcbd50324cb8a","a1e9b1740facf44f7331b0f80223320656fce7a0781fee36fbd82e8fe73dcfec","1a46cc5a0c51fa06ed1acc1f9ee45e2ce889d4b3db45fae9068973461d3cf99c","33b8dcfdbd807bec327291afc1ef01ba79fa8d9ed1d9196701b549b257102c5b","447d006ae3eb00f96af15c77999273d2521d1b5b8744df62cd7c5e5e03973049","4c859bc41e4be5d0a51714c06a7f59cc9e4115c628d383aed57a592089d3fc54","c6658e3d10486947e1678aab34dab37183fd950bd17e1d0390dbc07faa5630c0","2261d69ccc41c056cbf5cc5674f1f931b6dfc57bae6eab762037b1821b7f92a3","46efaa5e9c4b1da7ce2f586b913db6144595cf927ffc6c8288ad1c76c6dec5ce","e05e23ad9282ace300cc99478ac578fb19f8b0d38f094378ef9208dc8ab66d28","573a3eda38e40e776cdae17c671cea3b58dfb19a1094831369cdf3feed84e746","9bbabb3c3efcb1e9ddf68fe90f695063ea43d0f0bc5baf28f9baca3633eeeb7a","eab4499baf0ff71ba110254dd694308e078544222dbf6ff60b9a68bac0592027","1d15d2f8888f3c02798ae4fe2fb8ad395bf4c5a4b84a16095c4c432cc78bc407","e54520d1663e6ac2fb38e157e23aa9b9616bd6a1ceb54a6b7a69f8ca892ac2e4","a7b1b8bb7b2b5a98057433bd52cb19ebbc411d7df10e8736946da5dad2d9600e","de9b48332e7d27cd5b2e39d0b6d52856da89923b3f8f3999d5bc72b2ec41c931","bbb4d08cd8441d17d28dbaa02fa9b15071ebb92649f7e7db196d1044cb1903e3","9ed08d9ed11d4f0cea817d3e6bd3065028e64e5be7e1974ffba0c87008f7d5ac","21fed563e62d6aab7c461407dbcee685b9e1b976c2aa41bd4dbebc0a1aab90a0","5d64102c5282174a0c61746fd6e593edaf45ca6f09cfc6908e4e96ed1a28772d","50939a03a6cb09ee9d3803053c034a564f15a2aa97f0210cdf34fd93fbab6efa","626c63121530f17f3c7d10e608e034a1f12c91012d8e6a4e0bdfa334c6efee13","0b38217d5c3a30483640ada208f6b5e469d6d66ac8380e80517e870ebbc7f8dc","8f016fe26950ee2d9f7167d35eb3bf882eaf94df817239b0c7e004fa1e63dd4b","7a00ad6a0f72353e2c94bef6e6b94345450980f44ef66893bfed6a84e43e00b4","bbad2d7fd3649826108302c952065b1914a886bedb94469e66d945f07b06ada5","f5622423ee5642dcf2b92d71b37967b458e8df3cf90b468675ff9fddaa532a0f","b7e708f140db732cc3fb369905dd2f472f8952635a3711a04a792d885d19c6a5","8b059dcecc0229f1390bbe27e321b843f02927538b1e0fb09ec149902fa53ce5","17d3f26684a88e7651e52ecce18b292bab01a9241670fadd6bb76910022fb492","dc4aae103a0c812121d9db1f7a5ea98231801ed405bf577d1c9c46a893177e36","106d3f40907ba68d2ad8ce143a68358bad476e1cc4a5c710c11c7dbaac878308","46e8d2193f476a7a7de3cdd24743a2eafd009175159fe8494f0e3001a0e681be","e924774b42ff4558194d6531a3c368aef7b257e52cf001f01f7eda4655d1a125","c93dceadb06e3cb565421474fa7feb4ce94592637df7c9d7034cb27644b2ca59","10f97da752d7aea1734a2098f7537fca63165dd48882ce3d08ef2aed4ac47667","60b93ce0381b11434394616a5db9762950a0501d748998c6932150bb249e0394","a4ead38d64e1720c52f26457738484a61cd50be51abfd2bfc234c951fb79d20c","1a82e5569808c2987a9d6882e5b910beacb0165b6d18656540170038d6b8661e","6b243d0f6cf1786f6e3b10a99db080a977cc27e6f49bcff2b6264cf0339063d5","ef12df927e5deeaa09efeaf9f79336fa33745a4b3d745a8a35f43ea587bbcf40","083609ca47c047c6802bd40e974346a9509ef28367bb07769dbcead77cc7359f","364918fa15f9021675fe091510ed8f1ef91d63be82ca07712c9f93b45c3e4a1f","3a2d62eeb42c8163cb300e447b124824ed0aaf1a504ae23ded431b7adb4a7fd8","c149ee8abaf2e327ae1b1b13859d259737cd35fee5bbb121aab6f9cadc827ee7","bf410b9cc911130a2f21e248afa1842a0cc2a6cb050520fb10e506c15c057de9","8da4afb6ca42ff0156e197a891aca4e8a6543ea93a90f3f7e4b952754bd1c63b","2e5238237af8045f44b9fa37cd47d426ab4390e617d01903621edc027c063210","cbd4075ce6fcd6e0244bc7cc7360420587d2c0d8372a2ab575282f12bb7a46b0","ac16fdbf246bf367fc231c19fb94101e3efd9c74817b70f7ba4593cab32bd9c2","bb6a9d75841861a379f09b6fc93e91169150334c94b04685957f231fb15d66e0","9cabeef76be51ac88d39b3fcec019a387435ac858488fa85f2319d0382bf25d7","343290f60021964a328b67924aa5b7bbee23b36468db3942d28da0a98bc8e86e","a927ce038209a0c252e6691b753edcd56652eec82c26e297cef7a7284817ebc8","a4b8805d87725578e689817c9aa1d4228d6d8abe7bbb5c92177c58b418e558f5","ef7e56454801054b97199fbb7e864df8750e7f47550050515d245d326f6492ee","b5240871f20ae98dcf86fae457a65d00e01075cdc4bf88fde71a8f56d5de0be5","c2b10ae77b33d72f60f9dbe35a11fb192995e0eeb34257ec7b790bbfbf8696a8","3acc2fc6a6f5219ba426a0f64300e01bdb69b990be43b88dead3743d8cb09cce","d894562d706ad1f3e3452f1812727f44d29d747227758e0a8dd7ff8f49e84604","0741de99de521f8fad680ca890986ba4e3de433da520e2b3bac6c05f5796d7c9","a8d187f851914bdec74d5050886b87614ffd818f2e192f20f7ea8c3bc49a017d","a19a8afbeaddb7908d0fabcde122cd6a4fb5555977bb73a05b66c787d13646dc","60256034815ad6b2894c01a60c2116e1209736cf5e7809f6dadd6647bf28b401","bd27bff2c0db599571e93e5446a5ddddf417a208ae49b532bae1399042f9733d","eead54a97c73988c813f277a86f141a8c54e81c5d8d5212af15803cc6c3dcaae","e5c5b2eb8ba2453b1a922bbef66b48ae540dcc98ce6d88a1a4d963a841bfd635","58027d81d586f19b27a5cf1345262a7558488404cba8098580188cbe04b48ee8","3b3f15d622a1f0bff3ae232606fdae05207fd8becb71d08ccc94fe2edb859d8c","bfcd3a12b870e8ded92e27270b1d70e7c490eab817fd52adecc9adbc74eae5fb","7f207637a308bce68816dc692e8580ae0f397aa713a4824a961e829c0af2a591","d96d0e8529f8dabdeb311338eac0728f1ba3a024b5198ccbf3a158db50aae1df","e37bf5783f448bcd2c329c87eea7f96d361e60d87521500cc13ecdaec8fc6f86","42b4e4c35a493f5f9f0d47b99391d71308ba4acbe49a2ccc841ddaeb2d946e01","2879a055439b6c0c0132a1467120a0f85b56b5d735c973ad235acd958b1b5345","d731bd44a07da38eba12567491596b35a0243b720c37b39ad559086327c8e41c","f426a41b0afa8ff53b18dc5c00fc2ddffee16fa0c8fe8e541e4c8002f18fd932","88563e190ee37b0067a61513a8fd9f210436b4917c40a95d8819ed5100f78a93","041749570f5dbdf9aad27ad5411021631a5db10d84530a2d9b91133b0431a439","8c652706fec90b666ec7de314a29db2da7824ebb196a7fb484bdd270ce8fc1a1","96e64288af3b3d8350baf8b1af14b47ca112d541b4a06a1aa197b613c34a8f25","035dcf078dd5b3bdbabb07d0fdb93df90b9a19760c8f7ec035bcf00389e3a2c7",{"version":"6d73ea016e0ab70ed8e014cfd7bf721c19ceea8b06b4ba81fd5ba91b1fa0afea","signature":"a77c81d81edf694804d3f5c5ff2aaad6724642697609f2a2fc8aedc9433cf632"},"6fa646ec60ebc09a72a0685cf404f398aa507d645ee60f7eba28dad360a627b7","1cca0673d11fb2a7fbb2b674db6f2f500e75d103bd2ee393a79c0f68199fe9a8","5ca90fe5d6d32c23cb5534520e55d77f202f863a790a0a55652d6a3334dc958b","c868f50837eedd81fa9f61bd42de6665f74e7eb7a459135c6a14ac33ddc86798","da1de218850a5710c84587f9ceecac7106c62f92a75a121cb1106fca10aed46b","9ff194a196707954313c197ff74831edf396ee89f6b6e50cd5fe9e07b8d7d46b","2081363e701e5aa935f0a0531644845225eeaf90b2b97984b65f07cd1860083a","9539cbc03c187bd7e18444b079fef119005e2504c8c531664dd78ddcc0d0a69e","158867501bd563c0066c7837022156e514a2ec88437c47335605644dcd764160","61f974ca753e29a0f5328038d0cdc4a02823e192a6462b5193d3621e556c71dc","00bfabe714e576be5f011217c515f730563c64da019956e4cd866e2df427425b","f21718759f3eb4cf082d32086dd3946005ceb77e7d832a867c229fcdf0d3e6ca","b8442e9db28157344d1bc5d8a5a256f1692de213f0c0ddeb84359834015a008c","458111fc89d11d2151277c822dfdc1a28fa5b6b2493cf942e37d4cd0a6ee5f22","da2b6356b84a40111aaecb18304ea4e4fcb43d70efb1c13ca7d7a906445ee0d3","187119ff4f9553676a884e296089e131e8cc01691c546273b1d0089c3533ce42","febf0b2de54781102b00f61653b21377390a048fbf5262718c91860d11ff34a6","6f294731b495c65ecf46a5694f0082954b961cf05463bea823f8014098eaffa0","0aaef8cded245bf5036a7a40b65622dd6c4da71f7a35343112edbe112b348a1e","00baffbe8a2f2e4875367479489b5d43b5fc1429ecb4a4cc98cfc3009095f52a","68a0d0c508e1b6d8d23a519a8a0a3303dc5baa4849ca049f21e5bad41945e3fc","3c92b6dfd43cc1c2485d9eba5ff0b74a19bb8725b692773ef1d66dac48cda4bd","b03afe4bec768ae333582915146f48b161e567a81b5ebc31c4d78af089770ac9","df996e25faa505f85aeb294d15ebe61b399cf1d1e49959cdfaf2cc0815c203f9","4f6a12044ee6f458db11964153830abbc499e73d065c51c329ec97407f4b13dd",{"version":"cf70401efd3a3724f5dab9ee65d410adf834848ff6a6a9adf4233682c660ba90","signature":"97c5163dcaf908f176463e320a3a8b0c18c633f038fab64f3defb34e02558d77"},"63d722f645a149d7075289268eaf8072bd235861a933295d199d13f4a8bf7b85","c14eb044a35776d1f435adb967d731092e8ef35cdc00808f831a3e7d2e0fe8e7","2c8381a3a5a1663aa1723b31f3718dda9a359ad8eef9342b79f553de106b7ead","e4a760ce786e70168898b5fa51b880498b914d3f2b9f92fdb6f27a36d5c47cd7",{"version":"55d4724fbc31fc414ac9593c8491c6afec01bc5f2cb6a9d2c86635c5936baec3","signature":"bd0bc1f9eeae099434316eaad45d2e08bf108ed7805ab17215583f76c29a64d9"},{"version":"bc3ec7280efedb98099a25f27ec99fe7f55792d558e00d763e219a0b9b0a3676","signature":"5505892d6181fe8efa3854ea90f2c70295e8a30683fb249160064595578bfade"},{"version":"036197218b934e2fc0f7a9a305189db3b77fe23f85b59b7a20d8121659048a8c","signature":"3da6f419a593aca567e4b803eb1bc646bd87760823680c89e47b64f4c5ae9d90"},"713faafa5f0c9bad3df980a8276fd639f88d8984f78f7064414a544bdc899c89","f4a45a1dc15b23057a8e6d8332735b22e218fa8651a052505a48123e912c919e","74240832859d68a0211296b55c8c47b18e37e36872142157fccd0a12b6df4228","487a95422c87284c5f27e07917e2cb8cd3ecac8f73c171ebf9e5388930d4074b","dcb180cd664f848da2c40f98ee75e84989e9d9f46b513fd331fa4999971c182b","83d83ce5d0a00b88ede49cdce3743654a4ed831d4b87e7511a0b4844cd9252f9","d93846e922ddd54f9dcef91e0d742007aaf3c01bd511e5aaa019ac2c02c4cea9","b13790bdee7d658643d9c3760bb29b1ac4476f0e02e9a4dbf568eab4af4d45c6","8edd6813078607889eb0255789e86d0c78015e7e07047a5c7e4640b60e5d1698","ad5e6aa2c0f4a105f9582458ecf597550bbca3115f08a291b19272ba38ed1fa1","962b4d565f8bc76fb0005ee3475bc41cfd3164e12d85ccab683f5d087c40edae","69dd472a6f506ab72b0b8f7107288b349dcaf76f30b829639c74f70cbc71011f","d64a3f0853a570b529d33949dccd64dd6a6f8e9a6869c39aa8cddef77ad0259d","9d8db6c5bcc844074d04b47d99039824237d90458124aef5390ec2e50ef95be5","e95cedc21ce1e44567ca69520c3fa03e45be7b4179e9c8d2e074232b8fb0b35d","399777df73e6232a296fc530b8c818323ade7259b03bec7ea51375b281f7294e","cfe0fca98caccf52574306b086998c8a2f4d0421ee5c846a0e6ea7b62c45641a","3dc41e9e459a6f6753d69aedf535a5b8d0fa389f25eb0e581727ff64560d8bd9","6d9a5833ec3d30bd5e1ff9cddf367f2d2fdc8ee9c33c1e3c7e6f83698286b0cb","ca9a6449ffb4ad480984c051c2fbb26087f40a2fb93fbe03052fb3d81c44876b","276ef457a9533ca700bdd152c88cfd1ebf2b468da7c535d9b4fcde96d9869f19","6ed7cc71d4668957e00e622ec36718d7de93f8b2bdb764bdeb97d23dc463ef06","354cc5f6ed65fe2ff6fb8b117716eff61275ecb04e637e8e9798dc3222154f14","eaa8c81f283dc48bb0b8b92153ee6dbf174876c1bba8efc4b7290d55bcacac22","263134d9d5993987860b8bd7af82ded88d0330f50426600de4500d734a6beaa8","91995cdf6c87cec05800fe23c9f5c64813d9da6f2354c937846b7a0fd108f3ff","74ca3a03364fb54682fb819dfcd4a63e670568ec9b4df5d09769db45c1680e18","d933cad0f39747f0fed38aadcfd4ca802f0eef4b527df83cc9cff5189112b781","731c01a62efb53a0c035c6a6ed2560ce38fb1ca5f0119dcdb0478a3a9ebc383f","8fa23010dd0eb237cfc5fe5ed2e563b2ed43489d86f47040b1f5a9768e32a46f","0ef2100bc184930946445c56b81e236abb8077b45f11c2c92a47364ead71b180","15393b714f4382482d53a01b520315bf707f17e7f681a6ca02c33cdd45971707","ad2ed280e2a994ccdb9f5e1021c7cc27fbb4344bcea7dff819c7e3486b48f149","fd2caaf40cb9b030fe1c79f6fb1190341c1228d1ed15bd30fc32accc5319c0fa","08ab867725d9790c6e9fb013d090966def2173af60a5d30a76c38b0aa9b18d3c","a8130959b07c47acc95267ef0a210c1ab3a695ea6a08dcc3325b19d51feb784d","cbc5b438e0924aad73db3ec355f6ae45bf4d9cea16dc55d14224b6691eb9a087","fa444bae13b23585468e8667cfc5524c6b33795692b8e7ab44043b898edbcdf0","64b265dd0389ed54f025e9f961e3a2876215fabf5f18692d78c57680fd654766","bc5f1bf18a897551a1534f22b2d78c5dc0351ba327cb84c212b94e772fd0dcb0","0601b30571203b3b772322fcda631ab43d17fb291d93b33ed32bb303f0cc8629","d6aaaa2d95f5d1f8329890aa7651c7faeede0944f8bf631b748617af508e7322","9821b950ecfaa879470f8777fb5d6477c4cbf51535e75a5481f580984bdf1b00","b0b4b43979a1ee3fcdc7a171f4458c9829e44e0dc34825ab0b8ad17678108a9c","4cf4a3d33ef2ab41bba5ba8353320534225bcc41298e352195b48f3b1dd590bb","ffa855a79e5b306c7fc0a414254c4308d4ae57f4aabccadcaa0bd82f7303a531","384f891f87bc77e37de7db9da407ee6f1aac6f3545e6ab7232fc8c959ef7c277","bb1ce1a985572c648669df6786f442e78a1486d9f9d068c7f31c13a03295e9a2","39e52f6556dfd29ebe4c27cc80dff0e1f39bc4aee15e9f2d7e2566d6305ae489","6dc3b7c621df1de66372c10590c577cc78b2b8f400d6b73760deab45e900f37d","7e55401a9cdeb3430f7d39930197bcb4f5a26a778925794e16cd19fe0901d587","885903bddb50b3d8f51b74f7088ad1c84e6ea683ae02f3f028cba1af8fa2eeeb","0c34144b009aeaa19ac1fde4e284c2bc5ca1dae79c8115d76143c98f194e346f","0abd847eeba0f4a32c3a14ce064ed9f97d8b6e82be0b1d87ee1df579a888a1db","bc27229d3ead574431746469ac795fe2d26f92d8c17bfd32c6b7d5a87ac21d40","f8925927267624cfd3003adb6535eab4000cec22aa6378b0b50b83c2c29635a8","390b4860dfe218d4159bf8334e36e2bb902402dc92b1ab6908a53c629baf8282","517e3aabfb7fc44c564cbd78a3cc8b009e7908059b38d96191ce12906a7938c6","018e52c3085d5195498e639d0c604eb5a52a5ff4eeba1381f6fb8ecae14d2c0f","79e2b7c326f5597657beec5b7fde02230212c4e90387fa2ee786c2706c98381b","2344010e666a4f71021b4daeddb495a7006cc37193052f37ac3ffd4057347f1a","9883753dbf22048978896802ffa68c45979fcf1a733c2d2c8d5b0af20fafefbd","140f114921466842827a6e6b9bb2e685660265f32704824842e781cc6db89d6a","5ac147fb256db95d00eed0057967e11ce2b7760e46ef1cf465688ea24b6e336b","67387497dc8e8acbbac133f3103df013b78df3382f0d85cb9b167bce6a26568f","bdf63cc7d7c3224a7f977dbf8346a25f1a86427daa299d6ea1a99f6bec5f0bc9","98f3725dbf74d12fb1c50978818b432e968d49ba2f91112dabfab75c469acce6","80431fb9470a6b829e9e996f0014eee28a7e70c94e75316a0706e1805a4f4381","63ad607fdea8710ba2bd8e50ef9351e0b4d2e10a56fcbd4bbee65a7872df0cfd","b711f81f835ed5445d3b220e4a9d821a089aa080b359317a65373048e272a173",{"version":"26dd49b8298c11279e648d3e1a6dd86828fe63c5353650359a22a10dcbc5c377","signature":"6ece38049e1dd43d3ad95f00077c5202b2c3a216b981fe4ea43ebd5015263d98"},"788efc045d0ab68b910c158584bdbb04a0ec95132a3bca09a17cb01ce339a852","091b3a857e84b218279c14b678c25ec67b6fc99b8e974c1d6fcb65b7943a820d","63f6312a4be1ec344baa7c5cdb831587ed5f737f35df2baa2d3db1d180b983ec","74c3a57d874889e2f042b89b9688716af704cb2366d757ead586988f6cc9a625","5ebf4476be92f000f00cb9fb79d69babe6f6ac2a39efdb04a8f370e110003e19","1ca88c3785d49effd915f565f3297e32a33ea969d3407e1fbb333b84562c7595","1a4cfb737223d523387f7afee7219fd2016f1d73ef885e9cb42183c911d07b4d","392b17a6ba3f687f19ba207f17841c99306701cc2882f3615a3b426686d854e6","2a9f82af6c7cf1e002d17153e10d758f685d085864f6c5f7d2b775ebcd6b2fc9","f65b6f12e264b6e22dcf888bc0c239aab27c1d1fa6560af64bcd450f864abab7","ecbac26c0c765e1da3e748a35ededfa4c7ed87f48399919cd952ae8bc32a1339","9c88eebb75b82b4ccb9412c7e3035e40e188ea3d7dcb010ff87986b7ff629555","154f87edab104ff00f36e95b36d01e014a4d74ac4fc219e124e2bf2627099267","30844ce073bb46b6908f55273063915629cd795bf7d83638bcb71e1507a494bb","4bf7c467d3655157dd0959deafeeaa9167f90382cec1845b8557dd34a9e5b0ed","baf557e659cefe8b9ce949735e8cf813f2daee3044324ed740cab7e143559f7a","b02604b3eb025af58b4c07c7ffce6d28a03948286cb5c4d5cdc46ffe21549524","ebd09f4071c53a42a09a20feb0b144b1f485f10a7d6190aba91c1714977d689f","345bf134b7c00954c1db3e011f029c066877a32256569c9d91b6ceb5bcca054c","2a1f7be668e3a95cdb683c6f755631bf19de9705c6d6c1c9e4ebc67e9db916d7","357acfb6822f15161214eb9e1848c767182750b67f9c2c6ac0fab52ce300ddbb","55ffe6de790f0199135425d8565d29e7719bf0e24582ec96765880b9e9b022d7","646d66c423da6f036ecfda81da6f7d60a4748ddb0c58c85d261bb5c8e541cef2","9c1435b5d22bb56aa077d9bd74729cd748eca5e245dac9d1d98a98248a53bbd9","24bf4c3ab312b32e6f114adc2f4ce858a8a28af76abcbdc46a4a40655933f152","3b355d5bc20b716079980a0ed2d400180a15368db05888b3b858f90ae3ceac14","ff2c4a40bbde08390837443555b9ae201af54b527baf151555310782bd7bb8ef","0e9998684ca02c028170441f4c006e1caf425f9a9c3814cf8765a0002773fe30","1e647f80259d61974c8d0a89d9e3fd22416975c257d76f4f32d6ff38b9157f21","31e9f9b81179cdce4ee1cd1d6a427dc0c5fd15064307df8cad58237b0d96385b","7ba73e6476144ac4587b18bcc70349d2a8e7cede4e780815b53a057ca71f764d","fba690fc44b5c1db29fb472830df4cea1374642935a02c6302730bff37752498","2515daf0e2b05ec5a90349ea839cc1fad8e67135665747cd5f72b7b3d2ad49c3","7b4a756bb59248aeb831709239014a9850837727c2d6ec053f54eeaee95dda39","cde91ca23d14021aca53adba5977bebf7f72e4f18bbdcd2c6a689482c77dba07","191878041be6dae0b75974d1d28d55ae82a2896d5eb5004eb039e964e8140c00","7f4272fd567d065c1f5614ae3bed61b3dee47845267be0e41dd24f901985bf0f","0fe6cb0ec82fea8bb694d8335f8d470c8843600a277cf02d7dbfb84002666e8a","e43159089587768cc9e4b325488c546cec950602173b04a4f6cb9a615c4fc3b9","f3ebf0a71fb9e0d708c607d6448edae7a7893162532b560b3f361f48bacdbfca","053ed027d6ab656c53ee8dfc3fe842beff2a831831591f7f446c0ea1632f606e","79c5c3441a6786ce4804528aa560836e45cf855af4f25d6ca40f598cd6f1979a","bf235a40a595fe4c1c72ff72b50a9881a7279c4063029fc88e49237542797935","25627620692594a49b01a7192416e59a0fd94717c4f5c2800a3cdde58e28b39f","00f9b95c0741094ef69f8befa268077fb5dae5192149d99af5c7abf4cd20d5e5","89536ffee2ff5d49cd4c898a854a92a3d0812394f4ab6e1d48f9fb658f4abe48","0085bc39713819715d49b27bb64767dff1829179b0914ef0d4e1a852770f0136","9c6c451215eae6ae4ee0ebf8433f9d90494df7dba87718478c050bf5551da18f","a12d1a8f1b6e34597b9aef2757fdf4505362189c75b7f15266604a80bcffb42e","193f77fd99a5798127915516363958d227df9cb82e23f5890aa668409c1e6360","d8dc0c576c79c5069f4e87b0a15088e952043cb3df0ec487f81e6b98b174e503","84b69e8d4be7b1736536d1ab8c72c48318bbe6c677dab53a2d51058f9e68df71","97d3c4bd2a49a56f2cb63bb76c5880afe5c76098dcbb5598cd14e96bf572cb86","a493cd942f29c45c9befb1cf2f3e9a757300e1fa6b5a20cf939bf563c31f46a1","5300527e32de6eab286e5b70c3cca475380320a142ad54f234a34daadfc7bb1c","7476dbc814b46489fff760fd1f3d64248aedbf17e86fda8883c9bd0482d8bf73","8520b3f4c2c698bcef9c71d418a11c7cbe90d7b6d7deaed251a97ee5ef6b2068","8afc3d51f8ace0b6b9e89a2f7d8a6dffaca41d91733d235dea7c28364a3081a1","01cd58f2842ffec94a7cd86881fb5595df4b08399b99e817d2c25c2fb973fe09","d49f5458be59a10cc60ad003bebafa22eb37e15492020b2be9ca07055b6c8b10","0aa491d56a8011fcf95247f81cc4e09b40cfd5a96e80221038347da3931e8ba6","814971944c21b19105949c552a7dd5b35235a17a2eb8092b809e2fcaa54ea4e4","70f1528dd7d2131386fdcf6223ac1c56f2d7726c7977bd5eddcdfd22cd24f7f6","87f41340a0cac5b54e499b3ea6e6d0cb2e7abb9abf5feaedc6c4cc608cdfdc54","d0a8b3701edaddb7db2935bb134439272b46201384579eb0b53d66e4ac83bbfc","7849c2e4caee1cb71890ceab95b767c68f7110eae9e3e976dac8248702276218","48ab9dbacb1cdaccc607f645fdc23b9e6e877f7dcf62135bacb2cf21f36a0bd1","15f9fd84c200e445e52b230b7fc3d2c546366538a3491006d046f7e5896c22eb","24a51f4e4cb62e4c5a21cb31492f462f65e2404861d7ca0d2a097e11556365ec","7feb97852491c09adc671870da6e04043ce1bbc4854486bca1d4e664b75a2eb7","d544eb58913c74e4e413b5995cb3386d2d94dd052961be16bee78a4c90ff5c70","d4c52334defb0295961ec9f4baa900c17d94d10f59a85e9d71842886f6eed0a8","c53ebc098992203b886a39c1f1f51c1ca276ce675820ca3c3dc445a0e43ed00f","9e4a1e7678c287702463f92e489f3145b7d3765630b1a13c051dcf1e88446576","023b31d5a92a0e18497fc87f270b630ee8b2ccb08727ce5a94e8c34ed2c0441f","18f89b5aea0838b270633ab90fc93770d17e7029547d39d9abd7385d8b2cbf69","16f10dc2ee120d2d66fd55b11bcefc6f4e71467e038201ff14136dfaabcfbc2d","f2dcdf4b4bae8b355171c53b9e73a85d8e13509a44da69e3c3740826d395be69","7bbffc57d4a9d4a90db9ac537fde4b84afa05fdfe409f01d8013d38e727ecfc6","610177473b22fd1a5d4008fe49dbe14bc28f98c0989d3cb1d7caceeb868e4d6d",{"version":"817c320db72c80e5641ec1e131cb9885667768945ad256754f923c30f0b2bc4b","signature":"f07d8770e5bdc3bf9a170a1835b9f9bb37827fcdbef713035241beebb9aafd29"},"b43dbecdc2ef87becc7faa982d88cd9b0776aa32b021fbc89ead348028dc9e7b","afca9ee7b70704d56936dd3e527781983eb1dac30f5de956058bb45100db5414",{"version":"191736240b98f7e380453e4804a70ae794315be8d54ab8919ad5b4217b0234f1","signature":"b6b8c5763aed31b5a3eacb89ed14d18f6e639a79f81a4ec7d99bb6fa7176ae24"},{"version":"f819aa9419e953ecbdc4f8dd6c5685ca4dae3c6de8cb13c63f1114cce3350820","signature":"e63cd019fe003ac33024735df1997b741471e9721f5456c6cc3b202d8953f05c"},"96d3358722ad807e5ae61f4898899a3d02d61759ed2200cb1ab02d686cd84bc0","3026abd48e5e312f2328629ede6e0f770d21c3cd32cee705c450e589d015ee09","4a8bae6576783c910147d19ec6bef24fd2a24e83acbbb2043a60eec7134738e6","7663d2c19ce5ef8288c790edba3d45af54e58c84f1b37b1249f6d49d962f3d91","12bae4c8c1b1232b2a8dc626eb28c66d481233589b5ea735ffa99beae6cd1c89","dd9b4a891cfbd1a2e9187df5dfa86e9c47f7b38bc4d485c10109550e69cb1819","c1613da3811d845b8f349b457bad5923121abd1471b2405e94d04064c39ff0c1","9fbf43492355a568b974ad5ac55df6815ddfbe164e87fe6985d31e0e1517bbab","8b1700387b37a1d79b7daea019c77e5c4e49d00ac9fddc35bae495189dfab9ab","89079688fdc15440ef25bf4fbe5741f604cd408f82930f30b8eb255db77678db","1a7712e703d2c52a4053a765e8a4a4d4b93f224226d3ae4cd7d3c47cb08b0b0c","29252d86459a379622b2ab398929677616987c3c4fa8486d4e7962934e5e03f4","4ffd81222a72aef3d980a5f0dc8e454d1c723e3e5f89bd0bad1e1dec08dc5a51","4015422e737fc40b3a1d3ed4ed16c3b4a8c8711092f23b596833f73bc1bccb2d","93b851cde18c33da9f43afcd72cc1d86d5543a2905ea0ee31fdfb0632cd60ac5","d240fc86dad75fde9e5d75a578f4d025efd2e1ca49f6b2c9e1dd17e5c21cfe7a","d3bf06320b7df025ca8059482facfde5eed73c11e57d1a5dda306b343d21e6d5","fd09d8e3c4f4899800065dca0b722266ed54a35a58d40973f2036bfaa80ef332","57bea92a28efe7a5573ee533abc2189f740a5ee00418f3d89ee9a585c722c950","481d913110e1abdfc4ceb40ad598379cdfed4cc7226a1db36bd4b38ab59528b3","5945d8a7684ba5e3adc50eeef8d5c21b5735cca180257689ae95b0ddc6d04726","8f6c5ed472c91dc2d8b6d5d4b18617c611239a0d0d0ad15fb6205aec62e369ca","0b960be5d075602748b6ebaa52abd1a14216d4dbd3f6374e998f3a0f80299a3a","ae24273c4805280386f1936aa8a8899dc8812266dd11a485e06c7b2be453aeb0","9acceab4ecd1a6c957682fa626fb59914b891ceabcee6b372f1b756c0066749e","13ccd083cafec1d4fc0470b0faa8b89ebfbca34c5092bd806980f34ba7d01de5","781d2d2bff517b1c1d55826a4255e068791b34ec5dea08f22986404efc55ac86","0eaaf5fa84d281af9f78f7d5c1f35bf46c9bf16aac860592c6166f5640caffa4","1af9017e016bf8be526853b79ae605819d672ce887d58a1e3abe879ff2540846","36565e15613ed488fac721bf04baf1c3c9003ad05ddb11dc77c81267269c253d","c8d00b98df4d4f7d89fe665eaff712fe9c8a98ff27418bd72683b07b56a5e7fb","6029fed53087c94656821546cd272a90d1bbec1b5861e9dbdd5d8eec95889d5d","9c8f7cae582e4126ea024c260b1e41058ca1812edac2fd61fb675e166cb04852","afdf621da38a6eb13fa3820211b10fbb897a0be95e41b11a42d10a39b27e4008","2664ce356771fca599a9e10e51a8830d718e60e98f0b2a79103551dd48d5f8c1","88d2c3ccfb80cc5e9dc27e55e41dcafc2c35e51fb25d98980abf15e6cb497c6e","8401da63d4853bb8dfe629820014836e078375d63da23a18fef4e05e624d44e2","9b5f6b1424dc4253ac5007bc403237df7a0875a64a83e0c8f0f80d0aee67d0d7","ad6b385d0783852323905485d33e788e8d2609a70b8e38da1e0b7c53d1ff4cbf","bfdf63b4a8c21ce0154e83d232bae170eecda71f2a19cf8d5bba738f67c4bbbc","b4a402888a9e1d9e69e2b044bf1914fac1fad3362fdfa5c45cc47adba5733e5b","7d2b7fe4adb76d8253f20e4dbdce044f1cdfab4902ec33c3604585f553883f7d","8c4799337d5031e3813cbec776986396dd66d46259cc840bf896a4f3d52a2e25","99b65d6d0dc095d4cd635196b3318c07e843ac78e01d6cd399ee0da1a2f1d105","48c900d15a180d44deba3ed3f90149681d66da5174dd0d3bfc4cc8145865da61","1a989983fbefecaf4c0b57a13414bd1966bd8a77191541ef19efd2f0f08c6eb4","4e2e4e1d06fea7d362b31fc03c7c4aa5529beba98c374e5d0fde0ad1c5824098","ef78600c601e5f490601a41d68a1f36a63728f7e2d668240b63c55b054f0fb83","2f736296dc8ceebf2b0cdcaf39c6bb8f93cb4c08db97aa59e3018507773738a8","24e81417e5b83d558f2dcaac16bf2c88412f6c92019cfc086fb7245025745985","24ae29796b8dedd3fd6ccf345e33d0aecc67db071fb08babab196b8bc8694762","75c22d6cee948de50e8b4520a0b49622a9903749c0a3639869b2d12d4dfdcd3e","3414fa57857ee0a1fd4865cf8579babb445d3d7ae908854b07b95eb463e2c08b","723eee055d3e75f9395faa6d49bd00327dd0469790699eb90d1a4ce7e13412fb","2b3bd6d1c258a16229a41b198d42fad2808a933522db2c39e31cb07527763ac0","914a12d2eb2c9bbf8a0b79eeb86718a2206319bd636579c63dbffc4fcc25b4c8","6c36c26e0c57c5b225942b676e0efb5038b21512f4354199aa2693370f48fb07","b781824a29b92a7334a13cfa14b972879ab201b2b02d0535f9a74f59b5054824","96f7276365f42722b4d53de68809c5ab03a7751e4c0c9e28e5cd5569668380f8","5538e8d5035198ba7c14658264d667154653eba8a131ab819b932629874c38c6","87e15704705abc4f47a2ea7d9fea5d10fc008bfecc2019519ecde40dee268216","aa719402e1977d994b6a712f9e1f4f8b2d5c76b33e156c0790cf5ae13d35fd22","a15f8374196d9ee63cac4d0fe0887351b20d34ece403e0a53a68d12e5ead768a","79f5c8cf6f0c81f350c5154316fc66955fb35b2f373d8d75d0ad5e89cd8af7bc","eac9f12c2dd1e7c32115b9a36bd7997c8ae0f8cbfcd7904ac4c5aad63abdc3d7","0c15975cbed83a26cc9f567b6473e7e11e30275fb4a7e8052d62a783a51db349","253df3a3d66ea874d2b8b09d8cb4ecc20f06ae1ed2fcb52bb1d51aecd382aef3","af6403cd5325191ce78ed824f3ba34d83c5c6cf7ee02eb300266d3dfa2d02dd7","b47234ade5888bd24e2b1b33474c7cab140238a5b0f77d4d2004fa57692d1c87","4a2682e4bab581c543d0573ff87fe6b42116ce526b889409364ea2e27216fc3c","c312b7fd6ddb358c22785e789bd89ea5b18db552a82ca2f2c7cd4ef77d0b1a3a","99292d3680f8a29a14e327e0f12f9c5d9684f06a99cd3ecdcfe63baeb086527a","9eccef41fe0a9dd67b61a4875122ed8ddced8938a618f521f1e4f36cfd239ce1","19b56f50aa2a120ad9bf725b685f0e6812a1eba5b28744c0ec1381dcdf79dc1d","68eaf3c91c6a751e915081374b44fa408b89c999d7e3b5d408590c4751e6100c","274a0c60e48052c077735ed771380e92d9a733b6589387cbd27a4f21305dff22","765ae88f2716d9476e2c8dca6bedfbd7de33555d62a48c6cab2659aad1b956e7","bf5c6ee6137569c9d42c04d93bb9382d61b9a1e66ee5fbe4f8085fc82a7e01a7","6149158e3d839dc57041f116d9dfa66b0733973988794bbd957e52ad9db93242","03b10aa3b6c1df1df826e91abc606c1d7a6c5998224bda77a69af234a334781a","953469c9cfde374e8af60232aea3ef3e2393deaa31c79e4816662c32b4f97607","2ea8ce9b32f38b415405d5905c83c2528668ab0e056a3a1bf124d413f42bdad5","f6b757b116587a11694b84cab6a3691e027e7783050e16061dbb3d40ba29f295","3b9ec43b6306185caf2d73ed0459decb96bc4906aec054c38c2d83240b731bff","21f2f387dcded57538a043fd676c7a50e380c57456ccddb44c07b9b2f1bdfe85","390d2f67646bea7901a66fbcbce19e61286252e7ecd728bfffca1732a974e3ca","325f762bb27b5d66b375ec92c90c5dc827ced17171d260aab2b224497f9f6e6f","d39ca48594ac338bda70bf6189fe27e469b4d4c2ab1d49fe67cbf577b604f19e","e257cebe3b6f833c807bd759ae539b46f8446cde636b99899183678116901484","f1be135bbd8af0e16342c22a0a796c47ca5655c754976026a52aff13b360bd46","f82ea7ce3e7dc66d2ed4e7c8fa7d6fac2dcfb33e249a46a63311dcdd467e04fc","2cf84edb5635844129afdb601cf5684c5a56400d210751243a681cd04b57c1d9","c610cd8509928c67c5e3f9de30905cd1ede08208563cf789ca3dd9ee3a484927","414526d9290a176733f3a5eb959383c03b2fcd506978fb5ffc26788f201c970a","b526e8dcac876944abce9efd72b5ebc6b789d84870575842be8450c6d3c74c4a","65602b6521d79c38b911ab142fa8833b1460878d976c54b63b3cf2f3b86d7c00","d0fde7c862376189423d11930ca69a7cad0c017ffdec17c776d0d607ada8b4a3","4caa87fd9f69e1e15a1a57349948539b57041970086da342f7bd42ece1353c3a","db8ba14996f88e34f4af93b6816944c6ea5d4b703244abc61de67cfe7f488ce5","a3a51b4200f61ddf427f81fc42cb11936911d53714ad9a8b2677d32a548aad3e","81171f0b7b97b3bf0e8cd9fa599f23c7cd8e43f3c34f0c197b53cb5f4f55a25c","f722e6f337828933c52512cae32a8d9c9bb3e8409fbd39b4ab556d9f2e629b30","c9cce0fdbf1e23604904ca1a552ab26492aaf119f351775f0b6eb451301410fc","8f56bab88834bb5ff5d14063c0c7bcebebb9cab6893749605ea2ab0f8d0a879b","74690a0a01465cec515784e0a9059d286276148cc62208a4eb85566b6890e962","afd4f7197d02aeeb6bf1107176f99c0f1d6559cadbbec5c71c2b95f89e177912","619d880e788c5066831a64d18108a59acc6a5c06b2331fa0472c9480154d8746","ff0824d9a6582f789ced75948e309ad517a2b7aba097e0cc3cf8b7555dd5c790","a3d4e893a96bf59fcda0d99da5fe737e807f8d1e4226418fb94c547bdc441026","b5c09e3d2f3887fe27b1824c9106ab5e5c6ba50bd67e91fd68139445e730df35","21cafd7a40b56b799977e4c31dba190ecfe6bb1e5d6b56b0ee346194c7773924","294c0200eb9f9f0b08f8c70c2c4e5d6fd8bf0d0ba19e850d147f723d7a33501a","b386e7b1fa1dca4a5ce1cb4ba97cf7288da377bddc7a0da1b3099c2cbe071067","e5c813d1eda908a823a49b560fb85aacb5e1c867132bf3758571128baba3ebee","914b10e122c91947fe38a9b88ab2902d1df81c1dd49ecc425a33afdf6b6b2351","9c2c9478e7485707c691989d4b84ed94eb0401628236472904bfc9cd728d1905","64de3cd96e6596d4f61910deba38419edec94a0d6d13bda4ebc943f1bea4a994","f78ede5e5ce6416ca20e86759e64c5c3b43164a8b4e85e4cf2711684817580e2","443f657370bc64f29f99fbd73234420a85f1201105ee2d51804a34c361867729","b05ae0376910614fb447f038c63344d8a4763c62dd61b061f78d367fb5f6cdaa","1f378706b174b4ed60890b197041d4ccfe7ef32381e29affaa3e90476f60b371","043601290983f441c827ba8a9e586f45754b777c00394d475174e4c04f53b803",{"version":"156b0a745ba30989874120e5499ce23b5983e630c81bab0a7ff5949ddf491710","signature":"514e9babca1e9ad576179ec66bfacbb117159f99c6ed464664ca184010bfe2c1"},"0ca039c00e3c49a9d5d2f479878f94834af1331be8603e3f3211381a8f6509d4","eed3a11b31e4b9c5d9c6f8e6bcdabca1c15a7d13a2bcb57dc4da64d41098fb89","913b2c024042a6b82710c48060f92c12ed5f13e1a5c83cc6abd435508baf1039","868f9af4454f4f662ecc6c751005476fc71da63360939a7ed7c8c4586898f1f4","d5667d0bac13684c27f0024b6831e2e4e988e2664358cd9175b4233a3c5693a5","62e9cbf9f133aa7fef0ef920efbe15504288236a9af50d424ced2cb790dd3bd3","d54b6bcd59717880eedd6d3e9c67e8e3f584b3ce3798fd0d59b1b12db416755b","765340988b7755af980438b2a5b5bb51c58371a5b08a03946bc6cf39e210821e","133b27cb2dc74b8f61f2162bf474f5c0cd61f9d4ce78a372badc219afca1a16b","da78357f8267dd27eaaf2b6d946152c00b166521d222376b685d0bbab9ae2d0e","c3aab2a54638a94ea045af0bd08a7ae4272a0a789fc4a30e983bb0b3df54dd5d",{"version":"ad28ea67bbe63fcf2c94768ae1dfa7966e786ed411f58b4915225ed8d7c65d9c","signature":"5bb558ca5ce5513a05505471cc27b9f4337a52b3f4c33ef94b1de788f8396fb4"},{"version":"173b6ba8119feb33e6ad75426e8753b99c5aa07505bebffc570a312b0f2f9d90","signature":"d6b45318035c204ac1de353cda2ad86df27d4edf5b257e1806c00308f5a418a2"},"fcb01b0da1c068ea2930aedc241bc7887800866d0ee5c5c66a9dbbfa5805d10e","1ed0d8545f0540e43a3863d927f97c8d034feebf13f515052c290a93bb1dcb51","0c7d68ea508126a520d1482b73232c833fd1dd7e7a52fe4a33a6c768f9eb4766","d14565fbdcbb6e6fb0ed34add85bdc6119591a08459c6540028e3b128b03dbb6","9e0241e712585635da3135ba8df5efa22bb99ec958fc22e60f3bb69337a5634a","42c9185d8b580f053cceca9a16f405d2c3e151a04d3ba190459839be23484538","1e65d7f6304e4f3c70d3ab5fa17289eded7074421016667e42431f46be056450","cd51ceafea7762ad639afb3ca5b68e1e4ffeaacaa402d7ef2cae17016e29e098","1b8357b3fef5be61b5de6d6a4805a534d68fe3e040c11f1944e27d4aec85936a","4a15fc59b27b65b9894952048be2afc561865ec37606cd0f5e929ee4a102233b",{"version":"744e7c636288493667d553c8f8ebd666ccbc0e715df445a4a7c4a48812f20544","affectsGlobalScope":true},"c05dcfbd5bd0abcefa3ad7d2931424d4d8090bc55bbe4f5c8acb8d2ca5886b2e","326da4aebf555d54b995854ff8f3432f63ba067be354fa16c6e1f50daa0667de","90748076a143bbeb455f8d5e8ad1cc451424c4856d41410e491268a496165256","76e3f3a30c533bf20840d4185ce2d143dc18ca955b64400ac09670a89d388198","144dfcee38ebc38aae93a85bc47211c9268d529b099127b74d61242ec5c17f35","2cf38989b23031694f04308b6797877534a49818b2f5257f4a5d824e7ea82a5a","f981ffdbd651f67db134479a5352dac96648ca195f981284e79dc0a1dbc53fd5","e4ace1cf5316aa7720e58c8dd511ba86bab1c981336996fb694fa64b8231d5f0","a1c85a61ff2b66291676ab84ae03c1b1ff7139ffde1942173f6aee8dc4ee357b","f35a727758da36dd885a70dd13a74d9167691aaff662d50eaaf66ed591957702","116205156fb819f2afe33f9c6378ea11b6123fa3090f858211c23f667fff75da","8fe68442c15f8952b8816fa4e7e6bd8d5c45542832206bd7bcf3ebdc77d1c3f3","3add9402f56a60e9b379593f69729831ac0fc9eae604b6fafde5fa86d2f8a4b9","cc28c8b188905e790de427f3cd00b96734c9c662fb849d68ff9d5f0327165c0d","da2aa652d2bf03cc042e2ff31e4194f4f18f042b8344dcb2568f761daaf7869f","03ed68319c97cd4ce8f1c4ded110d9b40b8a283c3242b9fe934ccfa834e45572","de2b56099545de410af72a7e430ead88894e43e4f959de29663d4d0ba464944d","eec9e706eef30b4f1c6ff674738d3fca572829b7fa1715f37742863dabb3d2f2","cec67731fce8577b0a90aa67ef0522ddb9f1fd681bece50cdcb80a833b4ed06f","a14679c24962a81ef24b6f4e95bbc31601551f150d91af2dc0bce51f7961f223","3f4d43bb3f61d173a4646c19557e090a06e9a2ec9415313a6d84af388df64923","18b86125c67d99150f54225df07349ddd07acde086b55f3eeac1c34c81e424d8","d5a5025f04e7a3264ecfa3030ca9a3cb0353450f1915a26d5b84f596240a11cd","03f4449c691dd9c51e42efd51155b63c8b89a5f56b5cf3015062e2f818be8959","23b213ec3af677b3d33ec17d9526a88d5f226506e1b50e28ce4090fb7e4050a8","f0abf96437a6e57b9751a792ba2ebb765729a40d0d573f7f6800b305691b1afb","7d30aee3d35e64b4f49c235d17a09e7a7ce2961bebb3996ee1db5aa192f3feba","eb1625bab70cfed00931a1e09ecb7834b61a666b0011913b0ec24a8e219023ef","1a923815c127b27f7f375c143bb0d9313ccf3c66478d5d2965375eeb7da72a4c","4f92df9d64e5413d4b34020ae6b382edda84347daec97099e7c008a9d5c0910b","fcc438e50c00c9e865d9c1777627d3fdc1e13a4078c996fb4b04e67e462648c8","d0f07efa072420758194c452edb3f04f8eabc01cd4b3884a23e7274d4e2a7b69","7086cca41a87b3bf52c6abfc37cda0a0ec86bb7e8e5ef166b07976abec73fa5e","4571a6886b4414403eacdd1b4cdbd854453626900ece196a173e15fb2b795155","c122227064c2ebf6a5bd2800383181395b56bb71fd6683d5e92add550302e45f","60f476f1c4de44a08d6a566c6f1e1b7de6cbe53d9153c9cc2284ca0022e21fba","84315d5153613eeb4b34990fb3bc3a1261879a06812ee7ae481141e30876d8dc","4f0781ec008bb24dc1923285d25d648ea48fb5a3c36d0786e2ee82eb00eff426","8fefaef4be2d484cdfc35a1b514ee7e7bb51680ef998fb9f651f532c0b169e6b","8be5c5be3dbf0003a628f99ad870e31bebc2364c28ea3b96231089a94e09f7a6","6626bbc69c25a92f6d32e6d2f25038f156b4c2380cbf29a420f7084fb1d2f7d7","f351eaa598ba2046e3078e5480a7533be7051e4db9212bb40f4eeb84279aa24d","5126032fe6e999f333827ee8e67f7ca1d5f3d6418025878aa5ebf13b499c2024","4ce53edb8fb1d2f8b2f6814084b773cdf5846f49bf5a426fbe4029327bda95bf","1edc9192dfc277c60b92525cdfa1980e1bfd161ae77286c96777d10db36be73c","1573cae51ae8a5b889ec55ecb58e88978fe251fd3962efa5c4fdb69ce00b23ba","75a7db3b7ddf0ca49651629bb665e0294fda8d19ba04fddc8a14d32bb35eb248","f2d1ac34b05bb6ce326ea1702befb0216363f1d5eccdd1b4b0b2f5a7e953ed8a","789665f0cd78bc675a31140d8f133ec6a482d753a514012fe1bb7f86d0a21040","bb30fb0534dceb2e41a884c1e4e2bb7a0c668dadd148092bba9ff15aafb94790","6ef829366514e4a8f75ce55fa390ebe080810b347e6f4a87bbeecb41e612c079","8f313aa8055158f08bd75e3a57161fa473a50884c20142f3318f89f19bfc0373","e789eb929b46299187312a01ff71905222f67907e546e491952c384b6f956a63","a0147b607f8c88a5433a5313cdc10443c6a45ed430e1b0a335a413dc2b099fd5","a86492d82baf906c071536e8de073e601eaa5deed138c2d9c42d471d72395d7e","6b1071c06abcbe1c9f60638d570fdbfe944b6768f95d9f28ebc06c7eec9b4087","92eb8a98444729aa61be5e6e489602363d763da27d1bcfdf89356c1d360484da","1285ddb279c6d0bc5fe46162a893855078ae5b708d804cd93bfc4a23d1e903d9","d729b8b400507b9b51ff40d11e012379dbf0acd6e2f66bf596a3bc59444d9bf1","fc3ee92b81a6188a545cba5c15dc7c5d38ee0aaca3d8adc29af419d9bdb1fdb9","a14371dc39f95c27264f8eb02ce2f80fd84ac693a2750983ac422877f0ae586d","755bcc456b4dd032244b51a8b4fe68ee3b2d2e463cf795f3fde970bb3f269fb1","c00b402135ef36fb09d59519e34d03445fd6541c09e68b189abb64151f211b12","e08e58ac493a27b29ceee80da90bb31ec64341b520907d480df6244cdbec01f8","c0fe2b1135ca803efa203408c953e1e12645b8065e1a4c1336ad8bb11ea1101b","f3dedc92d06e0fdc43e76c2e1acca21759dd63d2572c9ec78a5188249965d944","25b1108faedaf2043a97a76218240b1b537459bbca5ae9e2207c236c40dcfdef","a1d1e49ccd2ac07ed8a49a3f98dfd2f7357cf03649b9e348b58b97bb75116f18","7ad042f7d744ccfbcf6398216203c7712f01359d6fd4348c8bd8df8164e98096","0e0b8353d6d7f7cc3344adbabf3866e64f2f2813b23477254ba51f69e8fdf0eb","8e7653c13989dca094412bc4de20d5c449457fc92735546331d5e9cdd79ac16e","189dedb255e41c8556d0d61d7f1c18506501896354d0925cbd47060bcddccab1","48f0819c2e14214770232f1ab0058125bafdde1d04c4be84339d5533098bf60a","2641aff32336e35a5b702aa2d870a0891da29dc1c19ae48602678e2050614041","e133066d15e9e860ca96220a548dee28640039a8ac33a9130d0f83c814a78605","64c32c74b6fa2c6da88310137850d7632c5095adc1e339ab721d12cbad1b6faf","679c01bfe897d40b483d31e12b21c0894e7cf218487d437c7ef32cc2c43b57ec","6a57f4c75f135396f93cf407d8a38baf7ab5feee1aeb46dd86cba7aab9c4c509","13548d8236b26fc8e7fb42a1fe34ebcd152796f37ad66f5174fa643da3808d8f","9e1b0fc325046f3773a14b36ff3ec938d4ae81733664a89e97cbccc07e208655","f83f3dd32f8d2a6813c05e51017a61070aabc611a500240653076f84cd958d2b","63e44efb6aa207195909f9cc21096b718714eeba48f000f6f10c6bb9bddec8bf",{"version":"629768e891d33df865cd7d332d4d29e1f4797f80f5cee51cf101633b75a01be5","signature":"e778f31924057a1e66410cbc0437e81dce28f3cc07cde725a62e29509222ffa8"},"97c286377417077f8c5153240757cf4e9d4182ee076fb6d332c38a2eb7919d7a","df1991e1e095d4d8d01bb67580161ea137ed899fa313266f35556e477b9cac5e","6763f6f34721945c942ecf981c77feb4871e7b4730efa62339dd162bf6c400b4","d92311993d06a1e66d66b5fa129242c93c9bbcf007a9cd2bb46363ef6a37fa9c","843eae995c53f5c9f3c775cac86a74f054ffaf24be94e6bf2d9f6b9984f0df59","f11ef757740606c81314c0e0b7d23967f4ed239301d82ff64493ccbc5f3fdb7a","0e85cc63598264f659acf13d41f2342329e3b473fe8192c3b1b00684beeb5ea4","7c740e795a732772dba480cab292fa3655567564f34c290ba0015647a24f7b8f","2c7fa8c3d05c6180781f82d595bfa5f2b83e7606c900abefd68ed3b9762ff9d3","525db2640121085383d74b98217dfaf7ca342b3572ab73276cc2335a4dab6855","0d9b9776ed9786850020e7b9af76dff18e9657f936899c5edcdc76227a9d45ab","d1030300716052fe8c1b26a7dca4c6af6f669f465a840a6fbba02ed92c0ef898","57dd2ba4dde84cf1b5df22287087b1191a1ed8d6e72e69038e2fa8395a5bbf50","c9c24309df7684c0e9dcb163a332038ce7a7a66de6a15761013bfd2bc56b996a","7e1bcff162493f43514cbd2945b9ece08533575c1f47fc8f705566153f22fd58","7f1d06ffd0d8f6448365716cbc61e9f2d4e2d5e86c45ca9096cac85ddfcc29a1","149e6e66905c22d3ebd3c00b9ebbeacb342a1b4919a829ff7d65a9a329645881","7a0dc452c532ae34602747602b23189e65fa2535c82e9f17a9b618606a78bd26","33c18291895cf06a317440ad43c7b59b128537eff762ab9cca7efa0d5252457c","e42e9c9f14170a13fcec3dad710f6908366b76f364bf01e45b35bd749c022952","9d10739930fe527a0d2d99aa04a46b5c2c12ad36fd35a91fc699622886e17629","96690126b763aa0e2be9a6012f9575ddbb522d6deb31a7dde92c38e5ba650417","671a771b771346fcbd6b079e438459d3c021b4eb0bfc69bca23893028796900d","ad082dfa6e56bf6cdce310293fce70d6c622edbb587af09503a82a82595e3a5f","b019113fb3930581d5368dda8ce5f2954323e221df2bc9c801163f17c3c7126c","5b1856504bb04b8058150cc6e037bf62c23e7812797c1da5b583f8b00d4a7907","f5ee6cfd920a880ebed2fb7726f9c303a9290096e4a222a7a8fbb4593499a917","90fee5b4533335522b5f200340f85a41d42f337d86833a421c7888f514adf76b","3d0a689e5e465b187f0c1f1251057d8d90def6488982c2e6bcec16c02e3d5b69","58edbfb2c27d0e5bd4501cb95330e024a2dcb552b109d688e3b6bf33dd887505","b94873c1c4bbfe937efe5ec3dda5795898f6f79ff553e64ec7ca752cd9669559","433ae6866baaaf0b92615edb7d6e3a4ec6773dbf7b2d3db459094df8433e5419","874a08ac8589a6332ebae59df471f20c4f9d4e9c92bde2c145aa8d7e3ede125b","6a676a9dfd634b292aa4e624c1f334bebc3ea3f2ae470128bf53972f7f87876e","9f6386167ba6360d4b826ee7cb6f31d4ce93460ffc9332eb7e5bf9abecb52446","db75acf6de0c718aea14c5bf6530052f3459ef24848af96c12914291222dcb91","faea5d2939af602935e385c532f01641c0fb9153be8ea910462cb48d2736e372","9ee30c0bb4c33c75de1007c4a5473606ed3cbe857720b81f1aa096b8482fd8cf","9de432d749f81acacf8ed0d155f2e6a53a05a55ab29d68c8b06aa29d203caf31","95dd6bd71241da4791371fcd705819f5831ce0ff291ce0ae2ffff9a4e4754484","9d7ab67e9d5745e744001d6740df0318af32aa1d35e9bfc4cb43e9dbc54fd060","a4ceae3d4ec2e3a9768880af915fc8a8016ab6b09a80b49934643da669cf1e3f","1fafbad08f66f029625d24d33e401e90d7323e891f9299c640c2a13c69d6784c","6d3ebeefb0d567b72b2f0dac1e132f3e37fb647301ed2eaf0a4f418f9e0ceb3b","eb3b4dbe298331ed19a02a03bcccfc6c98e7e2f4812302851e9d193468f50fe7","354fad7d281830c7ee96c050352db11825f9ea41cf68c1c0724c452255523fd0","0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","bae8d023ef6b23df7da26f51cea44321f95817c190342a36882e93b80d07a960","5d30d04a14ed8527ac5d654dc345a4db11b593334c11a65efb6e4facc5484a0e","74a23cda64c2c884828599295012614c2c5b94d0a62f54556cdb9941a3eb76b9","71c922781e30a244ec7efc860c6c472536dcf6d09019a65d25a4c11a277b6ed1","35950a0e199bb15c91571fd9920d84edec85c4ee388527ee436a13b3b17b6cc3","b8bc705ba453106222eb9120292a5d9cf8ee4a601b4edcfd29bbc6c64b6c0110","e8129ab3c90d5ed6fe8baeb9cc5ca73802c76a6d8a0ed0acee8acb0f6773f2f5","bc4e5ca842c8fa20be22d83ce52cd7353da85191ed6a985bb042f6608c0bcb44","803a135e2ba3754c85a35669eded8c93aa2085753bc5355eaf82eb9eff5d83a9","06c179a5025fef9432eaf716e55cd080020d2710cd98bb0c3d4340e8c866ab59","82b6a50a83f4ed953a1713c486e87bfc5f20e4e77a72d4bac21ab323de6f5a32","ad8105b336fb5161e5299d4a93e314ac7237503bd4e70662a49b544d1a73b734","4a2eb8a189ad7548308ec2319f145fee86f08a4c3310561b9a6d1e04d4546901","821be7f22abd4069c16c1275199a5b3d79bc7a6ad1acd3ba22f1101b6647120f","5f04db9c2b12b5ac35f594d20bfd7941339b714961b62bcec76da6f7014373ef","192b1545fa45a35e565cbcfda34bd2907cac55844eaaa918aa13910f414a3ce0","c6a696a222e7cf897ffcc73f4d729094e01ba7b8c8c2812aea4460829455a3f2","f8e8f88cce9e56861d53c0c1e549e6ca12f82450c43bffba28c6c74faad93ff2","564a98433a68bc529866dbfb4535e9042d14eb210f346629f2648a7b214821d6","547cc9ef548f0444d633dc192ab59f0855c9767e607a6b82515fa478c436f5f3","68873ec52ab60d0b652f98a8566395070f31dd55bb7787f6cb705eeddb839449","73c41d2f53bae191ea753294e4aca067e21dfe4620a64dd06d5b52fafa083c16","a97180dfbda0da255bc90f679ca73d6c1a78b2155a7d971c8960b6cfd626e1cd","c7bc549d52c6e7f0ade19f2dc26625d97e80d43db09b755ebd4c944ab6248f75","b7d031367476b41306c9a441b9e535d5b8fcd619a0ab054a38b7f1d52cc47f6f","6a044de990a34c342df41b3cb528171b5e7d83ed52409509f9eab60c3862e818","ae14c10372a0a0188bea6b022499b8445581de2af1e24468f53848ddf2f96289","0891e9437ef7a839bf73a3a3387aeb1446293f577b9cccc1c15e38eb115d8091","b426147fec725961d1305b25b26dbf99e5c419de98b5728974a8a44fc5959181","554aa4c889f50708f8f7bfadc6c594957719354538cf9fc2718238e3479312bf","053f9ffa7c45eacbb4366a917d7b6fe25dca5490aee9b6de79f9b6b6204f910b","6eb3618527aa3ff049cf419cc780498a7106782d3819f7830d72a0a3ed1a81f7","75527855e817cf6f9db77c296134d452ca78a5d900fcb8d4e5b9ed48b51a7049","2883d05af1392c47d693f16da6758ac28f27520d6ebf1f5ca888aeda8855994c","71aefa55d5687c9e73e354bab7bb20bf5a875e49471b9ed7d62ea3fbf981148d","2b753e807024d2e99b6f85990416c33ac70c5e6ead8d129c9011f4251c916a1a","e400712a9c3161746cd82bd43fc3fddbd79f8f00727b8897f9b1be45bb735357","587f7431e1a0dfc74794fb9b12ba0619e5edd2de3783c3f67c1da81a5fcdb262","eef5c88f931331ae33f833781619a63ca7a356044099dd7ed064e8a4bc3bb18a","162d9b3e1b9692ba0496a6040d51f8332999836a45a5590dfa935b4f249cc37c","79828882be0a8435a3ec4bb4ddaaeee13715d3ef8e10c3074274882358520c42","e35ae53562febe4ca2aed9b77feac4d477603afc7d4dbcd1af969abbe90e5c36","4dcb37a44ae7ebd5acd3e5c5cf94f7f935278f32d6d0b3b9b821b13353edaf76","1b805478cd5cf07246a5688d9ba425f272f42ea71c5950ec41a185677310376b","55a0ec9b3809f2338cde743c716154c4013f2a331dc999ff2e814fcba53db455","89b02261025f0a90f12aee0734d53506064fce74ef810e7008f361496bf4dd11","69aec4cefffc71f4cbee1aa965a9f47a85595b5bf6e5c3d6620340e88e23993f","2bf92d52d124fe4594744ee1e8a66d2f7c0f75587d38edbb3f11e5104b430008","9788ef1cfe93d6d1bae945b932f70d38bd425c94d626462d66b3d0741cdc9a90","8615d2d0bd7dd2aa10d54b11d9317e8a2cbc8f1b82cc7776460a179bc661f656",{"version":"64d4b35c5456adf258d2cf56c341e203a073253f229ef3208fc0d5020253b241","affectsGlobalScope":true},"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","044851e9685b94a0c56bfd7f499b8be4c281e7dc024d1a715a5f9a4598bbf337","00eb9c5a1558c626108d601dd1098d289d93dc7909abd0c50da4f131c7f936ea","9d38599e6d9bdeb1cc3f812040653be9b72e053706a38630ef5ea6fe184f356a","c29ddb35c74f1e433d06427371886bd20c5c71592816614801d983089add7b23","f85ca05459fbcd4b943713896d921dcb8ffa544143f050650bf7228d2de3cb4c","ffc001e75e4b5d0a3db0ff2f0fe828ed956b4b79717e379c995b0b5a552d1890","b236aeba8fece5e4eda5ca3c58201c5ce00414d7f778017171f68ca9f5e64e31","c18efe40bf3764de507d0fa5e752c2060a1ba9cd997d75bbb0971399dc17253d","a7226fb453535e55425a63dce833967e73c220c74cdb88ca37152cf8bb48f351","aa5c28ae7e24cda833cc82ff246692abf18b492af6c3021fe440fc8141582cbf","a5015b425508680a0fc155b65f2c95cd2b8944646b203575385130074e09e3ac","96eaf46c63a12b0474edd3b096cdc0c07cae78ce304d322169657d5c21fb5526","d02d6b9244ff55b3f3de9bc3f1ba0d6acae1841675907c773ace14d5b2a5fee8","25099fd6f77393cfe7b4da0ea649d7470c9b75903d025328932f772cef7a1014","c9eedcd882a329c9e3a4980f1d4985019029429e08e1e0431c8d31f147da79bc","82913ce15fdc9fde3bfa1fcf3dc7d46c55c90230b8df1eb8f6bfd1464c51fa83","33fd349e90d47d203d8fd135d7a18e50924eb50e5cc479b6bfe7052244d0c0d9","2a20da0b105ff983e1018c7be4c3a32b8969904f0201cf992804aac55e8aa313","6006710196391753bae60a65df59cb4a45dd86496df51c0c3ec69135e40e1871","18d5a903b769dd0dcd439f1f8b7511ea0dd3812e9dd2b4c21109621a1013a79c","96f97d1f86d1642658d6fc7351f3b5a47fef657d278e888437b811b0c84772fd","8543ec3e4f66c9ee44de035bbfc8a125d3484b43726893ae06216885c1b6af1c","04ccd5aa42114aee2aa1b1b8273ff9de5c10436549d45789908e61b8a0d820c4","e0eddf45c79cd6ea9c17831c9a429e8d758e324be7042ddf2b0c160fb33c416c","459a1492083bf3c572cc08154e9941a1a9794b283fba9a249d6ce54c344f5cc2","f2a66014ec8375d83268c77e325c894591de09dc31507de1279cd3ad1c8ff376","37dc3ef63a04645623bceac6afc918fd8a9c789509006d5c1249070422915421","20629ddb2e46ff73cabc2d6cec20e6125387592ad8e61d0c4405647bbc2dcd5a","f20187cd57e32b865d9c2525976de9d469ad2f0049638b91c31b6dd7dde319bc","36b07143acf040a9458aa1049f4b30f54c1d3090f0a7494ed12c37ccd763fa79","2ce9ac274b82478aa1cafca6de9a9d1244bc7f40355f3bc88f57f610b1953bd3","48d2f9ffa9f8e3b7f780cca1006ec42ab435e8490f4b5f960b97cf997d6d92ec","21c3e262bd4548906544485c3d61c8b7efffb3fb613df4a58deb6c29a8448b25","3d3f87284a15bd748f6a999a5b0a7b1812a0447f33cb0f227bbf105f60833809","64cdf82ea41b4d76d033100a061897f1c86477cdf43b4165e88301e425f2a3c4","3ba9bcdc8503a114cf6b505916524a9dbc9a491307112cd08e3ab13d4734de6a","8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","dee5d387e2e6f3015cbf91fc0c13ed6f016f9c5c1f2ad9c62602f4fd398fa83a","67f129ed8b372622ff36b8b10e39d03e09e363a5ff7821105f92f085b8d1ccba","1b831600aabe1c065830d303d087189e1ccfc93a0ef1882eb58a336ec1ce9f2f","75f191b59fe7ce72d1d7d11d0f329a193843f54af93182fc5a65c37d0a82c85a","cd74c8275483d3fe0d07a9b4bba28845a8a611f0aa399e961dbd40e5d46dd9ad","82900e1055abedb522b1c2fb580502e9b247b57ab43785b19009bcffa35c7295","154e8bf4a35b6561164de436fd5799b99de1aacf61acbc93c0221002504fa3c9","9dd175cfb2d553c91a631b7b9aaed8cd7693332462195600ed1f7bc1a7fcc319","dee5d387e2e6f3015cbf91fc0c13ed6f016f9c5c1f2ad9c62602f4fd398fa83a","9f3c5498245c38c9016a369795ec5ef1768d09db63643c8dba9656e5ab294825","2d225e7bda2871c066a7079c88174340950fb604f624f2586d3ea27bb9e5f4ff","6a785f84e63234035e511817dd48ada756d984dd8f9344e56eb8b2bdcd8fd001","c1422d016f7df2ccd3594c06f2923199acd09898f2c42f50ea8159f1f856f618","d48084248e3fc241d87852210cabf78f2aed6ce3ea3e2bdaf070e99531c71de2","0eb6152d37c84d6119295493dfcc20c331c6fda1304a513d159cdaa599dcb78b","237df26f8c326ca00cd9d2deb40214a079749062156386b6d75bdcecc6988a6b","cd44995ee13d5d23df17a10213fed7b483fabfd5ea08f267ab52c07ce0b6b4da","58ce1486f851942bd2d3056b399079bc9cb978ec933fe9833ea417e33eab676e","7557d4d7f19f94341f4413575a3453ba7f6039c9591015bcf4282a8e75414043","a3b2cc16f3ce2d882eca44e1066f57a24751545f2a5e4a153d4de31b4cac9bb5","ac2b3b377d3068bfb6e1cb8889c99098f2c875955e2325315991882a74d92cc8","8deb39d89095469957f73bd194d11f01d9894b8c1f1e27fbf3f6e8122576b336","a38a9c41f433b608a0d37e645a31eecf7233ef3d3fffeb626988d3219f80e32f","8e1428dcba6a984489863935049893631170a37f9584c0479f06e1a5b1f04332","1fce9ecb87a2d3898941c60df617e52e50fb0c03c9b7b2ba8381972448327285","5ef0597b8238443908b2c4bf69149ed3894ac0ddd0515ac583d38c7595b151f1","ac52b775a80badff5f4ac329c5725a26bd5aaadd57afa7ad9e98b4844767312a","6ae5b4a63010c82bf2522b4ecfc29ffe6a8b0c5eea6b2b35120077e9ac54d7a1","dd7109c49f416f218915921d44f0f28975df78e04e437c62e1e1eb3be5e18a35","eee181112e420b345fc78422a6cc32385ede3d27e2eaf8b8c4ad8b2c29e3e52e","25fbe57c8ee3079e2201fe580578fab4f3a78881c98865b7c96233af00bf9624","62cc8477858487b4c4de7d7ae5e745a8ce0015c1592f398b63ee05d6e64ca295","cc2a9ec3cb10e4c0b8738b02c31798fad312d21ef20b6a2f5be1d077e9f5409d","4b4fadcda7d34034737598c07e2dca5d7e1e633cb3ba8dd4d2e6a7782b30b296","360fdc8829a51c5428636f1f83e7db36fef6c5a15ed4411b582d00a1c2bd6e97","1cf0d15e6ab1ecabbf329b906ae8543e6b8955133b7f6655f04d433e3a0597ab","7c9f98fe812643141502b30fb2b5ec56d16aaf94f98580276ae37b7924dd44a4","b3547893f24f59d0a644c52f55901b15a3fa1a115bc5ea9a582911469b9348b7","596e5b88b6ca8399076afcc22af6e6e0c4700c7cd1f420a78d637c3fb44a885e","adddf736e08132c7059ee572b128fdacb1c2650ace80d0f582e93d097ed4fbaf","d4cad9dc13e9c5348637170ddd5d95f7ed5fdfc856ddca40234fa55518bc99a6","d70675ba7ba7d02e52b7070a369957a70827e4b2bca2c1680c38a832e87b61fd","3be71f4ce8988a01e2f5368bdd58e1d60236baf511e4510ee9291c7b3729a27e","423d2ccc38e369a7527988d682fafc40267bcd6688a7473e59c5eea20a29b64f","2f9fde0868ed030277c678b435f63fcf03d27c04301299580a4017963cc04ce6","6b6ed4aa017eb6867cef27257379cfe3e16caf628aceae3f0163dbafcaf891ff","25f1159094dc0bf3a71313a74e0885426af21c5d6564a254004f2cadf9c5b052","cde493e09daad4bb29922fe633f760be9f0e8e2f39cdca999cce3b8690b5e13a","3d7f9eb12aface876f7b535cc89dcd416daf77f0b3573333f16ec0a70bcf902a","b83139ae818dd20f365118f9999335ca4cd84ae518348619adc5728e7e0372d5","c3d608cc3e97d22d1d9589262865d5d786c3ee7b0a2ae9716be08634b79b9a8c","62d26d8ba4fa15ab425c1b57a050ed76c5b0ecbffaa53f182110aa3a02405a07","87a4f46dabe0e415e3d38633e4b2295e9a2673ae841886c90a1ff3e66defb367","1a81526753a454468403c6473b7504c297bd4ee9aa8557f4ebf4092db7712fde","813012c29722611e2115e0caaf9901967ebe218069d67381a6931461bfda2099","46324183533e34fad2461b51174132e8e0e4b3ac1ceb5032e4952992739d1eab","d3fa0530dfb1df408f0abd76486de39def69ca47683d4a3529b2d22fce27c693","d9be977c415df16e4defe4995caeca96e637eeef9d216d0d90cdba6fc617e97e","98e0c2b48d855a844099123e8ec20fe383ecd1c5877f3895b048656befe268d0","ff53802a97b7d11ab3c4395aa052baa14cd12d2b1ed236b520a833fdd2a15003","fce9262f840a74118112caf685b725e1cc86cd2b0927311511113d90d87cc61e","d7a7cac49af2a3bfc208fe68831fbfa569864f74a7f31cc3a607f641e6c583fd","9a80e3322d08274f0e41b77923c91fe67b2c8a5134a5278c2cb60a330441554e","2460af41191009298d931c592fb6d4151beea320f1f25b73605e2211e53e4e88","2f87ea988d84d1c617afdeba9d151435473ab24cd5fc456510c8db26d8bd1581","b7336c1c536e3deaedbda956739c6250ac2d0dd171730c42cb57b10368f38a14","6fb67d664aaab2f1d1ad4613b58548aecb4b4703b9e4c5dba6b865b31bd14722","4414644199b1a047b4234965e07d189781a92b578707c79c3933918d67cd9d85","04a4b38c6a1682059eac00e7d0948d99c46642b57003d61d0fe9ccc9df442887","f12ea658b060da1752c65ae4f1e4c248587f6cd4cb4acabbf79a110b6b02ff75","011b2857871a878d5eae463bedc4b3dd14755dc3a67d5d10f8fbb7823d119294","e175549fe57dbff5cd68c1a5ccf33717584d7db9afb8ec216fd2c0daa3b06931","ea68c312e1eb9b48f7064a8dda348594769ba8f9c8596315827c559734a60205","6ddb5fb4476ca702ecff9e5ff0295cde6ce138d71f817da65e118a2a3c534106","6dfff2e65f10158f5a868e642a2e74d2d1bd76f15291552f389f2b8c829a9a86","eb8b0f7424dfee5358cccc6e8f42ddee87e80e9683a10baccaf72287f68d5940","ad9bd8d00b2bfa966a5edb7ab7d9fd7f279937832ce3036dda205ee4cab95fe1","15f7172b1d430bb13e602dadb2342df306f6c52426a2963816357ed8784cd4b5","5e79dd14055a6106d658329e24a9030304023c680bca86b877829e95c68f8e60","2c17e10bc926706da86b72d3420e92dc69d37a99e91ebb28d65a7d340dd9ac4a","ca786387b50329e80d00d79ab9f704d8ac3d8b68be26c3a30194a2dff4221448","6c745adb009a15d106cf629f5da8d974e45235b73d046a6d3455c1309a684163","4357f3465cc3d5a848fe1dcbb30ae1d95657da44e165213895b7bfaca21ac370","e19929fc2ebad3278bdac78001631aa266774b455c2fc068e99460733c09af8a","e91c1bd6e00781ea1244d30abbdf1f631614c49c92597780db06ed6510d40671","d7ca3c7f6d18f7edd625ba5f7b22bd9fba0c60da79eb01efbfdfc294ae315af0","d25556148ec066b173563bb07bab37f541db45201103befec136d0db0f2e025c","53d8ae40f67d0a10993e27bd27c96fa95bccf4475a3f752fe40121afc534c41b","3d7936b56d7c286e6550a2bbfb6fdedc9ff6f4c521494fc16b4c2bf15ecd9c53","f580b06b85f6e917d5880880a78a4bf292603f707bbfe6a955be05cba441f53b","fc1cae7c51cd4348869686b9ac3282bcbea64e73bb69287c5617068f28ba9386","ff8c198b840235bb14dfedac3f2f919af5af5c650b1aea9a599b0a41f12ecea6","eae083813e6770f0e1b99ed23547a0ccdcd16ef237fa758cd7c7de1c687aff6a","ed26221635c99e6d40f967e385d6cdc4ceca94e0100b4c9ba95ef8a80fcb86e7","6a423b9ffbfff4715fdbbd1ba7bc7cb6551a686e0e769071d0e3a1946984319a","86014c681010506f75516a27561403fc44198336ef163fcc7a3228e174bff45b","72d1c17138fae5758747b43974facca6bf1fe5ae5ad2852c1bce64ddcbceab1d","6f46ef7f7238b39efc227189b54f99c967099a30a17ba78d90af26610c57746f","4a72cec63796098be18f9ac3dd1c316f77ab6ac48f44396f3eb0f0bac8cf319d","27a856ac0a35c8783e486e6d417adb03378c1e19e602e86a33bd16603c0bea17","c5928a95ea514f946d2d5fa8d08d55515d8afab25cb36d413c2c5e4aabb42cb5","3bb1600b952d785b9b28745398acf00093ea8a27a8b17d0f97a19176f9f02b08","c0f96e7af436837438c375a8389e449e7de66b424170587997a7e064ac82903d","a163a673ab1c646f84e596a3acb160b251286dd6fe0040e70fbbe06aa0d054ef","787dfe85e3df00873ec0452370d6d140b966e965755d5b6da62f2e0d6b24df66","c67fc3f5c1e0807d0da3b13674337bb7e46fb9a05933d69a8b0c9507c9be8e45","8c0b404becb3d7bdce5ff4a8e8da19d67a898051fb2dd9eef18976571ad17783","6273a64a8e9e8e086351220585add4570014fd3c0fe17a15a6c0953936fea8b1","f8557f6887f2edeac914edecd9ed1aa939e86604ac950d72521f9de60b75ecd8","f57c1eddd4a1614e91aa14aecfb44dff395d80652ce26539d2baf8e18e5361b4","5aff3115425b2156dd900d27df60d5c13881c3450a9edad475ede28b16b01f32","b3eeeccf7e068a3797d81df6d27a5a64b1ec56bb20faf99863d68d61d0bb4101","9998e7178f6ca55019e1f056825d2258e5c2d67b7f13ed50a3447b22d339e0b7","d6c01d3aa3df0e637e13619d40844cb7a3cefe93cb61f4b3cfe558fe8ae9394c",{"version":"7aebc0c4b33a03970db1cacd940721f42095abc713886d56f6c2cd3cf8fe7780","signature":"cc0c0a7e95e9d02f412bfae281f62e9e109cce06c2ea677e855e415f39143b7c"},"6947674aa4f96573d01ef8a50dd8a8a717a56874c2b103afbe14dbb017df7ac7","0da6540b88fe4b3706d468a9387e506408c8acc889a71fb3c3be3f8da5ff6b99","a96467b5253a791d1e3d2d3dbf7643340d4b6c6891edd95902d64ab7f8040f2a","01374379f82be05d25c08d2f30779fa4a4c41895a18b93b33f14aeef51768692","8e59152220eb6d209371f0c6c4347a2350d8a6be6f4821bb2de8263519c89a8f","14b217c8691536bbcbfdbb9b130c329819cc33b7748a5b4bade531db75910e8b","957f9bead11de03e1aa0f14d22a05b95706f78724c7ecca6a71dea94dc0dc13b","cdcc132f207d097d7d3aa75615ab9a2e71d6a478162dde8b67f88ea19f3e54de","0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","c085e9aa62d1ae1375794c1fb927a445fa105fed891a7e24edbb1c3300f7384a","f315e1e65a1f80992f0509e84e4ae2df15ecd9ef73df975f7c98813b71e4c8da","5b9586e9b0b6322e5bfbd2c29bd3b8e21ab9d871f82346cb71020e3d84bae73e","3e70a7e67c2cb16f8cd49097360c0309fe9d1e3210ff9222e9dac1f8df9d4fb6","ab68d2a3e3e8767c3fba8f80de099a1cfc18c0de79e42cb02ae66e22dfe14a66","d96cc6598148bf1a98fb2e8dcf01c63a4b3558bdaec6ef35e087fd0562eb40ec","5b9586e9b0b6322e5bfbd2c29bd3b8e21ab9d871f82346cb71020e3d84bae73e",{"version":"5ab630d466ac55baa6d32820378098404fc18ba9da6f7bc5df30c5dbb1cffae8","affectsGlobalScope":true}],"root":[46,318,324,325,[337,339],341,540,547,548,[551,553],993,997,998,1131,1132,1134,1140,[1161,1164],1231,[1233,1237],1302,[1304,1308],[1315,1321],1326,[1328,1334],1336,1339,1341,1345,1346,1348,1349,[1351,1353],[1355,1357],[1359,1361],1407,[1409,1411],[1436,1442],[1444,1449],[1452,1454],[1456,1460],1546,[1548,1552],[1554,1556],1558,1559,1561,1562,[1564,1566],1801,1802,1808],"options":{"allowJs":true,"allowSyntheticDefaultImports":true,"declaration":false,"emitDecoratorMetadata":true,"esModuleInterop":true,"experimentalDecorators":true,"importHelpers":true,"jsx":1,"module":99,"noPropertyAccessFromIndexSignature":false,"rootDir":"../..","skipDefaultLibCheck":true,"skipLibCheck":true,"sourceMap":true,"strict":true,"strictPropertyInitialization":false,"target":2},"fileIdsList":[[76,105,317,1569],[46,76,105,316,317,1569],[46,76,105,317,319,1569,1798,1800],[46,76,85,105,317,319,1569],[46,76,105,316,317,319,1307,1569],[46,76,105,316,317,319,1319,1569],[46,76,105,316,317,319,1317,1569],[46,76,105,316,317,319,1569],[46,76,105,303,317,319,1325,1569],[46,76,105,316,317,319,1445,1569],[46,76,105,317,319,1236,1569],[46,76,105,316,317,319,1453,1569],[46,52,76,105,317,319,1447,1569],[46,76,105,303,316,317,319,1324,1569],[46,76,105,316,317,319,1456,1569],[46,76,105,316,317,319,1548,1569],[46,52,76,105,317,319,1458,1569],[46,76,105,300,303,316,317,319,1325,1550,1569],[46,76,105,316,317,319,1561,1569],[46,76,105,316,317,319,1558,1569],[46,52,76,105,317,319,1569],[46,76,105,316,317,319,1564,1569],[46,76,105,316,317,319,1555,1569],[46,52,76,105,317,319,332,544,1569],[46,52,76,105,317,319,543,544,547,1569],[46,52,76,105,317,319,331,332,1304,1305,1306,1569],[46,52,76,105,317,319,325,329,1301,1569],[46,76,105,317,319,1569],[46,52,76,105,317,319,325,549,1302,1303,1569],[46,52,76,105,298,303,317,319,329,331,332,544,549,994,995,1303,1569],[46,52,76,105,298,317,319,332,370,539,995,1139,1560,1569],[46,52,76,105,298,317,319,332,370,539,995,1139,1557,1569],[46,52,76,105,298,317,319,332,370,539,544,995,1139,1554,1563,1569],[46,52,76,105,298,303,317,319,332,370,539,544,995,1139,1306,1553,1554,1569],[46,52,76,105,317,319,331,332,1306,1316,1569],[46,52,76,105,317,319,544,549,1569],[46,52,76,105,303,317,319,331,332,550,551,995,999,1139,1569],[46,52,76,105,303,317,319,329,331,332,336,544,546,549,550,551,994,995,999,1156,1309,1310,1314,1315,1569],[46,52,76,105,317,319,329,331,332,337,540,546,549,990,995,997,998,999,1130,1131,1327,1328,1329,1330,1331,1332,1333,1334,1335,1361,1362,1407,1409,1410,1569],[46,52,76,105,303,317,319,332,370,539,990,995,997,1139,1232,1569],[46,52,76,105,303,317,319,326,329,331,332,336,1569],[46,52,76,105,317,319,329,331,332,336,337,338,549,551,990,999,1133,1233,1330,1411,1431,1436,1437,1440,1569],[46,52,76,105,317,319,329,332,544,546,549,551,990,995,997,1139,1141,1569],[46,52,76,105,317,319,329,337,1569],[46,52,76,105,303,317,319,329,332,370,539,546,549,551,990,995,1131,1139,1157,1235,1443,1569],[46,52,76,105,317,319,329,995,1230,1406,1569],[46,52,76,105,317,319,1431,1435,1569],[46,52,75,76,105,317,319,329,332,339,995,997,1130,1139,1569],[46,52,76,105,317,319,998,1130,1569],[46,52,76,105,296,317,319,337,546,549,1329,1569],[46,52,76,105,317,319,332,338,1569],[46,52,76,105,317,319,336,1569],[46,52,75,76,105,317,319,1569],[46,52,76,105,317,319,340,1569],[46,52,76,105,317,319,370,539,1569],[46,52,76,105,296,317,319,331,332,337,549,551,1156,1231,1233,1306,1441,1442,1444,1569],[46,52,76,105,317,319,332,544,546,999,1230,1569],[46,52,76,105,317,319,370,1408,1569],[46,52,76,105,317,319,329,337,338,1333,1360,1569],[46,52,76,105,317,319,338,540,549,996,998,1130,1139,1336,1338,1339,1341,1343,1344,1569],[46,52,76,105,317,319,339,540,544,1340,1569],[46,52,76,105,317,319,339,540,1157,1569],[46,52,76,105,317,319,338,540,543,549,996,998,1130,1139,1336,1344,1356,1357,1358,1569],[46,52,76,105,116,117,118,317,319,338,370,540,546,549,995,998,1130,1131,1140,1328,1329,1330,1331,1334,1335,1569],[46,52,76,105,317,319,338,341,996,1336,1347,1569],[46,52,76,105,317,319,338,540,544,549,1130,1139,1336,1343,1344,1352,1353,1354,1569],[46,52,76,105,317,319,540,544,1340,1569],[46,52,76,105,317,319,338,341,370,540,544,546,549,995,996,1130,1336,1349,1350,1569],[46,52,76,105,317,319,338,339,370,540,549,995,998,1139,1157,1314,1344,1569],[46,52,76,105,317,319,337,1345,1346,1348,1351,1355,1359,1569],[46,52,76,105,317,319,338,341,549,996,1336,1343,1569],[46,52,76,105,317,319,332,546,995,1569],[46,52,76,105,317,319,549,1569],[46,52,76,105,317,319,323,332,546,1569],[46,52,76,105,296,298,317,319,329,331,332,551,552,553,991,993,998,999,1131,1132,1134,1135,1136,1137,1138,1140,1162,1235,1569],[46,76,105,317,319,994,1569],[46,52,76,105,317,319,331,332,551,1569],[46,52,76,105,317,319,323,331,332,370,539,549,551,990,995,998,999,1139,1141,1143,1161,1569],[46,52,76,105,303,317,319,552,1569],[46,52,76,105,298,303,317,319,323,549,551,1569],[46,76,105,317,319,992,1569],[46,52,76,105,317,319,336,550,1569],[46,52,76,105,298,303,317,319,549,1569],[46,52,76,105,303,317,319,331,332,370,539,544,549,990,995,997,1141,1156,1158,1450,1451,1452,1569],[46,52,76,105,317,319,331,332,1569],[46,52,76,105,317,319,331,332,370,546,551,990,995,997,999,1139,1408,1438,1463,1543,1545,1569],[46,52,76,105,317,319,326,334,1360,1569],[46,52,76,105,317,319,331,332,990,995,1139,1157,1309,1314,1450,1452,1453,1455,1569],[46,52,76,105,288,317,319,329,331,332,336,338,340,546,551,990,995,1156,1438,1439,1569],[46,52,75,76,105,317,319,331,332,336,540,544,549,995,996,997,1569],[46,52,76,105,303,317,319,331,332,549,551,995,1438,1569],[46,52,76,105,303,317,319,329,331,332,370,539,544,549,551,1141,1156,1438,1440,1461,1462,1546,1547,1569],[46,52,76,105,317,319,331,332,544,549,994,1133,1569],[46,52,76,105,296,317,319,331,332,549,551,1156,1231,1233,1569],[46,52,76,105,317,319,331,332,1163,1569],[46,52,76,105,303,317,319,323,549,990,995,1162,1164,1234,1569],[46,52,75,76,105,317,319,329,331,332,340,549,997,1130,1569],[46,52,76,105,296,317,319,332,544,546,995,999,1139,1569],[46,52,76,105,303,317,319,323,331,332,551,1161,1163,1306,1569],[46,52,76,105,317,319,331,332,370,539,544,546,551,990,995,997,999,1139,1156,1157,1158,1159,1160,1569],[46,76,105,313,317,319,320,322,323,1569],[46,76,85,105,317,319,1569,1803,1807],[46,76,105,317,319,321,1569],[46,52,76,105,317,319,320,1569],[46,76,105,317,319,320,1324,1569],[46,76,105,317,319,336,509,1569],[46,76,105,317,319,509,1462,1569],[46,76,105,317,319,509,1569],[46,76,105,317,319,509,536,1142,1337,1569],[46,76,105,317,319,509,536,1142,1569],[46,76,105,317,319,509,1142,1569],[46,52,76,105,317,319,549,994,1569],[46,52,76,105,317,319,329,370,544,549,1131,1569],[46,52,76,105,296,317,319,370,549,1569],[46,52,76,105,317,319,370,544,549,1569],[46,52,76,105,317,319,354,370,544,549,1569],[46,52,76,105,317,319,984,1569],[46,76,105,317,319,545,1569],[46,76,105,317,319,543,1569],[46,52,76,105,317,319,984,990,1569],[46,52,76,105,317,319,329,1135,1569],[46,52,75,76,105,317,319,549,1569],[46,76,105,317,334,1569],[46,76,105,317,333,1569],[46,76,105,317,580,1569],[46,52,76,105,317,1569],[46,52,76,105,317,581,588,589,590,591,1569],[46,52,76,105,317,588,592,1569],[46,52,76,105,317,590,592,1569],[46,49,76,105,317,580,1569],[46,76,105,317,1569],[46,76,105,317,537,1569],[46,76,105,317,537,538,1569],[46,76,105,317,370,509,536,1569],[46,76,105,317,1544,1569],[46,76,105,317,370,1543,1569],[46,76,105,317,1569,1811],[46,52,76,105,317,611,612,613,615,617,619,1569],[46,76,105,317,611,1569],[46,52,76,105,317,611,616,1569],[46,76,105,317,611,612,1569],[46,52,76,105,317,611,614,1569],[46,52,76,105,317,611,618,1569],[46,52,76,105,317,611,612,620,1569],[46,76,105,317,612,615,617,619,620,621,1569],[46,52,76,105,317,570,611,623,625,1569],[46,76,105,317,623,626,1569],[46,52,76,105,317,611,1569],[46,76,105,317,628,1569],[46,52,76,105,317,611,630,1569],[46,76,105,317,630,631,1569],[46,52,76,105,317,570,633,1569],[46,76,105,317,634,1569],[46,52,76,105,317,611,645,1569],[46,52,76,105,317,570,637,638,1569],[46,52,76,105,317,641,1569],[46,52,76,105,317,611,636,1569],[46,52,76,105,317,570,611,1569],[46,76,105,317,639,642,643,644,645,646,1569],[46,52,76,105,317,611,640,1569],[46,76,105,317,648,649,1569],[46,52,76,105,317,611,663,685,688,1569],[46,76,105,317,689,1569],[46,52,76,105,317,570,611,691,692,1569],[46,76,105,317,692,693,1569],[46,76,105,317,695,1569],[46,52,76,105,317,570,611,697,1569],[46,76,105,317,697,698,1569],[46,52,76,105,317,611,700,1569],[46,76,105,317,700,701,1569],[46,76,105,317,703,704,705,710,711,712,1569],[46,76,105,317,611,711,1569],[46,76,105,317,705,710,1569],[46,76,105,317,706,707,708,709,1569],[46,52,76,105,317,611,714,1569],[46,76,105,317,715,1569],[46,52,76,105,317,611,717,1569],[46,76,105,317,717,718,1569],[46,52,76,105,317,570,611,625,721,722,1569],[46,52,76,105,317,611,720,1569],[46,76,105,317,720,721,722,723,1569],[46,52,76,105,317,570,611,726,727,1569],[46,76,105,317,727,728,1569],[46,76,105,317,730,1569],[46,52,76,105,317,570,611,734,735,736,1569],[46,52,76,105,317,611,663,1569],[46,76,105,317,735,736,737,738,1569],[46,52,76,105,317,570,611,743,744,1569],[46,52,76,105,317,611,742,1569],[46,76,105,317,743,744,745,1569],[46,52,76,105,317,570,626,1569],[46,76,105,317,747,1569],[46,52,76,105,317,611,749,1569],[46,76,105,317,749,750,1569],[46,76,105,317,752,1569],[46,52,76,105,317,611,663,667,682,764,1569],[46,76,105,317,765,1569],[46,52,76,105,317,757,1569],[46,52,76,105,317,611,755,757,758,760,762,763,1569],[46,52,76,105,317,611,755,756,1569],[46,76,105,317,763,764,767,768,1569],[46,52,76,105,317,611,755,758,759,1569],[46,52,76,105,317,611,761,1569],[46,52,76,105,317,611,754,1569],[46,52,76,105,317,570,611,770,1569],[46,76,105,317,770,771,1569],[46,76,105,317,773,774,1569],[46,76,105,317,776,1569],[46,52,76,105,317,611,667,778,779,1569],[46,76,105,317,779,780,1569],[46,76,105,317,782,783,1569],[46,52,76,105,317,611,667,785,1569],[46,76,105,317,785,786,1569],[46,76,105,317,788,1569],[46,52,76,105,317,611,663,790,1569],[46,76,105,317,791,1569],[46,76,105,317,713,1569],[46,76,105,317,793,794,1569],[46,52,76,105,317,673,1569],[46,76,105,317,673,1569],[46,76,105,317,671,672,673,674,675,1569],[46,76,105,317,796,1569],[46,52,76,105,317,611,798,1569],[46,52,76,105,317,570,611,799,1569],[46,76,105,317,798,799,800,801,1569],[46,52,76,105,317,611,740,1569],[46,76,105,317,740,741,1569],[46,52,76,105,317,570,611,633,1569],[46,76,105,317,803,1569],[46,52,76,105,317,611,682,805,806,1569],[46,52,76,105,317,682,1569],[46,76,105,317,805,806,807,1569],[46,52,76,105,317,611,809,1569],[46,76,105,317,809,810,1569],[46,76,105,317,570,611,622,625,627,629,632,635,647,650,663,667,682,688,690,694,696,699,702,713,716,719,724,729,731,739,742,746,748,751,753,766,769,772,775,777,778,781,784,787,789,792,795,797,802,804,808,811,815,817,821,822,825,827,832,834,837,840,851,854,859,861,864,867,870,873,877,880,883,886,890,896,899,902,905,909,912,923,925,928,931,937,941,944,955,957,960,964,967,973,979,981,983,1569],[46,76,105,317,813,814,1569],[46,52,76,105,317,611,812,813,1569],[46,52,76,105,317,611,812,1569],[46,76,105,317,733,1569],[46,52,76,105,317,611,732,1569],[46,76,105,317,652,654,656,658,660,661,662,1569],[46,52,76,105,317,570,611,652,654,656,658,659,660,1569],[46,52,76,105,317,611,655,1569],[46,52,76,105,317,611,653,1569],[46,52,76,105,317,611,651,1569],[46,52,76,105,317,611,652,654,656,657,1569],[46,52,76,105,317,611,658,661,1569],[46,76,105,317,816,1569],[46,52,76,105,317,570,611,663,1569],[46,76,105,317,818,823,824,1569],[46,52,76,105,317,611,821,822,1569],[46,76,105,317,826,1569],[46,76,105,317,828,830,831,1569],[46,52,76,105,317,570,611,828,830,1569],[46,52,76,105,317,611,829,1569],[46,76,105,317,611,828,1569],[46,76,105,317,624,1569],[46,76,105,317,833,1569],[46,52,76,105,317,611,625,1569],[46,76,105,317,835,836,1569],[46,76,105,317,838,839,1569],[46,76,105,317,842,843,845,847,849,850,1569],[46,52,76,105,317,570,611,682,842,843,845,847,848,849,1569],[46,52,76,105,317,611,841,1569],[46,52,76,105,317,570,611,844,1569],[46,52,76,105,317,611,846,1569],[46,76,105,317,852,853,1569],[46,52,76,105,317,611,667,852,1569],[46,52,76,105,317,611,663,855,1569],[46,76,105,317,856,857,858,1569],[46,52,76,105,317,611,684,685,856,857,1569],[46,76,105,317,860,1569],[46,52,76,105,317,611,663,684,1569],[46,76,105,317,862,863,1569],[46,52,76,105,317,570,611,862,1569],[46,76,105,317,865,866,1569],[46,52,76,105,317,611,865,1569],[46,76,105,317,868,869,1569],[46,52,76,105,317,611,663,822,868,1569],[46,76,105,317,872,1569],[46,52,76,105,317,570,611,871,1569],[46,76,105,317,874,875,876,1569],[46,52,76,105,317,611,741,874,875,1569],[46,76,105,317,725,726,1569],[46,52,76,105,317,570,611,725,1569],[46,76,105,317,878,879,1569],[46,52,76,105,317,611,822,878,1569],[46,76,105,317,678,679,680,681,1569],[46,52,76,105,317,611,667,676,678,679,680,1569],[46,52,76,105,317,611,677,1569],[46,76,105,317,881,882,1569],[46,52,76,105,317,881,1569],[46,76,105,317,884,885,1569],[46,52,76,105,317,611,884,1569],[46,76,105,317,887,888,889,1569],[46,52,76,105,317,570,611,734,887,888,1569],[46,76,105,317,894,895,1569],[46,52,76,105,317,611,892,893,1569],[46,52,76,105,317,611,891,1569],[46,76,105,317,898,1569],[46,52,76,105,317,611,897,1569],[46,76,105,317,900,901,1569],[46,52,76,105,317,570,611,900,1569],[46,76,105,317,903,904,1569],[46,52,76,105,317,611,903,1569],[46,76,105,317,684,685,686,687,1569],[46,52,76,105,317,611,667,684,1569],[46,52,76,105,317,611,668,684,1569],[46,52,76,105,317,611,667,670,682,1569],[46,52,76,105,317,663,669,683,1569],[46,76,105,317,906,907,908,1569],[46,52,76,105,317,611,906,1569],[46,76,105,317,910,911,1569],[46,52,76,105,317,611,910,1569],[46,76,105,317,592,611,1569],[46,76,105,317,921,922,1569],[46,52,76,105,317,611,915,1569],[46,52,76,105,317,611,667,914,916,918,920,1569],[46,52,76,105,317,611,919,1569],[46,52,76,105,317,611,667,913,1569],[46,52,76,105,317,611,916,917,1569],[46,76,105,317,924,1569],[46,76,105,317,926,927,1569],[46,52,76,105,317,611,926,1569],[46,76,105,317,929,930,1569],[46,52,76,105,317,611,929,1569],[46,76,105,317,932,933,935,936,1569],[46,52,76,105,317,611,932,1569],[46,52,76,105,317,570,611,933,934,935,1569],[46,76,105,317,938,939,940,1569],[46,52,76,105,317,570,611,734,938,939,1569],[46,76,105,317,942,943,1569],[46,52,76,105,317,611,942,1569],[46,76,105,317,945,947,949,951,954,1569],[46,52,76,105,317,611,950,1569],[46,76,105,317,611,945,1569],[46,52,76,105,317,570,611,945,947,949,951,952,953,1569],[46,52,76,105,317,611,945,946,1569],[46,52,76,105,317,611,948,1569],[46,52,76,105,317,611,945,954,1569],[46,76,105,317,633,956,1569],[46,76,105,317,820,1569],[46,52,76,105,317,611,663,819,1569],[46,76,105,317,819,1569],[46,76,105,317,958,959,1569],[46,52,76,105,317,611,958,1569],[46,76,105,317,962,963,1569],[46,52,76,105,317,570,611,962,1569],[46,52,76,105,317,611,961,1569],[46,76,105,317,965,966,1569],[46,52,76,105,317,611,957,965,1569],[46,52,76,105,317,611,966,1569],[46,76,105,317,968,969,970,971,972,1569],[46,76,105,317,570,667,676,968,970,971,1569],[46,52,76,105,317,611,676,969,1569],[46,52,76,105,317,970,1569],[46,76,105,317,974,978,1569],[46,52,76,105,317,611,974,975,1569],[46,52,76,105,317,611,974,976,977,1569],[46,52,76,105,317,664,1569],[46,76,105,317,664,665,666,1569],[46,76,105,317,980,1569],[46,76,105,317,982,1569],[46,52,76,105,317,1387,1569],[46,76,105,317,1388,1569],[46,52,76,105,317,984,1378,1382,1384,1385,1386,1569],[46,76,105,317,984,1569],[46,52,76,105,317,984,1379,1569],[46,76,105,317,1387,1569],[46,52,76,105,317,984,1380,1383,1569],[46,52,76,105,317,984,1378,1380,1569],[46,52,76,105,317,984,1380,1381,1569],[46,52,76,105,317,1363,1387,1391,1569],[46,76,105,317,1392,1569],[46,52,76,105,317,984,1387,1390,1569],[46,76,105,317,1391,1569],[46,76,105,317,1394,1569],[46,52,76,105,317,984,1373,1569],[46,76,105,317,1375,1376,1377,1569],[46,52,76,105,317,984,1363,1374,1375,1376,1569],[46,76,105,317,1396,1569],[46,76,105,317,1398,1399,1569],[46,52,76,105,317,984,1398,1569],[46,76,105,317,1401,1402,1569],[46,52,76,105,317,984,1401,1569],[46,76,105,317,1372,1378,1389,1393,1395,1397,1400,1403,1404,1405,1569],[46,76,105,317,1363,1569],[46,76,105,317,1364,1365,1366,1367,1368,1369,1370,1371,1569],[46,76,105,317,1172,1173,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1192,1193,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1213,1214,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1569],[46,76,105,317,1175,1569],[46,76,105,317,1212,1569],[46,76,105,317,1191,1569],[46,76,105,317,1165,1166,1167,1168,1169,1170,1171,1569],[46,52,76,105,317,984,986,1569],[46,52,76,105,317,984,985,1569],[46,76,105,317,986,1569],[46,76,105,317,986,987,988,989,1569],[46,52,76,105,317,986,1569],[46,76,105,317,571,597,610,1569],[46,52,76,105,317,601,1569],[46,76,105,317,601,1569],[46,76,105,317,601,604,605,606,607,608,609,1569],[46,52,76,105,317,581,601,611,1569],[46,52,76,105,317,576,597,598,1569],[46,76,105,317,572,573,574,575,576,578,598,599,600,1569],[46,76,105,317,573,1569],[46,76,105,317,575,1569],[46,52,76,105,317,574,575,1569],[46,52,76,105,317,572,574,575,577,578,579,597,1569],[46,76,105,317,602,603,1569],[46,76,105,317,586,610,1569],[46,76,105,317,581,1569],[46,52,76,105,317,592,601,1569],[46,76,105,317,581,586,587,592,593,594,595,596,1569],[46,76,105,317,582,1569],[46,76,105,317,583,1569],[46,76,105,317,583,584,585,1569],[46,76,105,317,581,586,1569],[46,76,105,317,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,1569],[46,76,105,317,1569,1746,1747],[46,76,105,317,1569,1747,1748,1749,1750],[46,76,105,112,317,1569,1747,1749],[46,76,105,317,1569,1746,1748],[46,76,105,112,317,1569],[46,76,105,112,317,1569,1742],[46,76,105,317,1569,1742,1743,1744,1745],[46,76,105,317,1569,1742,1744],[46,76,105,317,1569,1743],[46,76,93,105,112,317,1569,1751,1752,1753,1756],[46,76,105,317,1569,1752,1753,1755],[46,75,76,105,112,317,1569,1751,1752,1753,1754],[46,76,105,317,1569,1753],[46,76,105,317,1569,1751,1752],[46,76,105,112,317,1569,1751],[46,76,105,317,1569,1623,1642],[46,76,105,317,1569,1624,1625,1627,1628,1629,1630,1631,1632,1633,1634,1635,1636,1637,1638,1639,1640,1641],[46,76,105,317,1569,1572,1603,1623],[46,76,105,317,1569,1593,1603],[46,76,105,317,1569,1570],[46,76,105,317,1569,1570,1580],[46,76,105,317,1569,1593],[46,76,105,317,1569,1570,1626],[46,76,105,317,1569,1570,1578],[46,76,105,317,1569,1570,1593],[46,76,105,317,1569,1645,1646,1647,1651],[46,76,105,317,1569,1643],[46,76,105,317,1569,1643,1645],[46,76,105,317,1569,1650],[46,76,105,317,1567,1568,1569,1791,1792,1794,1796,1798,1799],[46,76,105,316,317,1569,1643,1797],[46,76,105,317,1569,1643,1790],[46,76,105,317,1569,1644,1652,1789],[46,76,105,317,1569,1643,1789],[46,76,105,317,1569,1643,1793],[46,76,105,317,1569,1643,1795],[46,76,105,317,1569,1789],[46,76,105,316,317,1569,1797],[46,76,105,316,317,1567,1569,1692],[46,76,105,317,1569,1653,1655,1656,1657,1658,1660,1662,1664,1665,1666,1668,1670,1672,1673,1675,1677,1679,1681,1683,1685,1787,1788],[46,76,105,317,1569,1692],[46,76,105,317,1569,1692,1786],[46,76,105,317,1569,1643,1659],[46,76,105,317,1569,1644,1652,1658],[46,76,105,317,1569,1626,1643],[46,76,105,317,1569,1643,1682],[46,76,105,317,1569,1643,1661],[46,76,105,317,1569,1658],[46,76,105,317,1569,1643,1680],[46,76,105,317,1569,1643,1663],[46,76,105,317,1569,1643,1676],[46,76,105,317,1569,1643,1669],[46,76,105,317,1569,1643,1667],[46,76,105,317,1569,1643,1671],[46,76,105,317,1569,1643,1659,1678],[46,76,105,317,1569,1644,1652,1658,1659],[46,76,105,317,1569,1643,1684],[46,76,105,317,1569,1643,1674],[46,76,105,317,1569,1652],[46,76,105,317,1569,1654],[46,76,105,317,1569,1694,1765,1766,1767,1769,1770,1771,1772,1773,1774,1776,1777,1783,1784,1785],[46,76,105,317,1569,1643,1770],[46,76,105,317,1569,1765],[46,76,105,317,1569,1764],[46,76,105,317,1569,1643,1765],[46,76,105,317,1569,1643,1693],[46,76,105,317,1569,1643,1768],[46,76,105,317,1569,1643,1764],[46,76,105,317,1569,1692,1775],[46,76,105,317,1569,1643,1692,1765],[46,76,105,317,1569,1763,1765],[46,76,105,317,1569,1643,1778],[46,76,105,317,1569,1778,1779,1780,1781,1782],[46,76,105,317,1569,1778],[46,76,105,317,1569,1767,1775],[46,76,105,317,1569,1765,1767],[46,76,105,317,335,1569],[46,76,105,317,1002,1003,1569,1648,1649],[46,76,105,317,1002,1003,1569],[46,76,105,317,1000,1569],[46,76,105,317,1569,1813,1816],[46,76,105,317,1569,1812],[46,76,105,317,1144,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1569],[46,76,105,317,1144,1145,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1569],[46,76,105,317,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1569],[46,76,105,317,1144,1145,1146,1148,1149,1150,1151,1152,1153,1154,1155,1156,1569],[46,76,105,317,1144,1145,1146,1147,1149,1150,1151,1152,1153,1154,1155,1156,1569],[46,76,105,317,1144,1145,1146,1147,1148,1150,1151,1152,1153,1154,1155,1156,1569],[46,76,105,317,1144,1145,1146,1147,1148,1149,1151,1152,1153,1154,1155,1156,1569],[46,76,105,317,1144,1145,1146,1147,1148,1149,1150,1152,1153,1154,1155,1156,1569],[46,76,105,317,1144,1145,1146,1147,1148,1149,1150,1151,1153,1154,1155,1156,1569],[46,76,105,317,1144,1145,1146,1147,1148,1149,1150,1151,1152,1154,1155,1156,1569],[46,76,105,317,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1155,1156,1569],[46,76,105,317,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1156,1569],[46,76,105,317,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1569],[46,59,76,105,317,1569],[46,62,76,105,317,1569],[46,63,68,76,96,105,317,1569],[46,64,75,76,83,93,104,105,317,1569],[46,64,65,75,76,83,105,317,1569],[46,66,76,105,317,1569],[46,67,68,76,84,105,317,1569],[46,68,76,93,101,105,317,1569],[46,69,71,75,76,83,105,317,1569],[46,70,76,105,317,1569],[46,71,72,76,105,317,1569],[46,75,76,105,317,1569],[46,73,75,76,105,317,1569],[46,75,76,77,93,104,105,317,1569],[46,75,76,77,90,93,96,105,317,1569],[46,76,105,109,317,1569],[46,71,75,76,78,83,93,104,105,317,1569],[46,75,76,78,79,83,93,101,104,105,317,1569],[46,76,78,80,93,101,104,105,317,1569],[46,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,317,1569],[46,75,76,81,105,317,1569],[46,76,82,104,105,317,1569],[46,71,75,76,83,93,105,317,1569],[46,76,84,105,317,1569],[46,76,85,105,317,1569],[46,62,76,86,105,317,1569],[46,76,87,103,105,109,317,1569],[46,76,88,105,317,1569],[46,76,89,105,317,1569],[46,75,76,90,91,105,317,1569],[46,76,90,92,105,107,317,1569],[46,63,75,76,93,94,95,96,105,317,1569],[46,63,76,93,95,105,317,1569],[46,76,93,94,105,317,1569],[46,76,96,105,317,1569],[46,76,97,105,317,1569],[46,75,76,99,100,105,317,1569],[46,76,99,100,105,317,1569],[46,68,76,83,93,101,105,317,1569],[46,76,102,105,317,1569],[46,76,83,103,105,317,1569],[46,63,76,78,89,104,105,317,1569],[46,68,76,105,317,1569],[46,76,93,105,106,317,1569],[46,76,105,107,317,1569],[46,76,105,108,317,1569],[46,63,68,75,76,77,86,93,104,105,107,109,317,1569],[46,76,93,105,110,317,1569],[46,52,76,105,116,117,118,317,1569],[46,52,76,105,116,117,317,1569],[46,52,56,76,105,115,272,312,317,992,1569],[46,52,56,76,105,114,272,312,317,992,1569],[46,48,49,50,51,76,105,317,1569],[46,76,105,317,404,405,406,407,408,409,410,411,412,1569],[46,76,105,317,1569,1598],[46,52,76,105,317,1094,1569],[46,52,76,105,317,1082,1092,1093,1569],[46,76,105,317,1121,1569],[46,52,76,105,317,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1127,1569],[46,76,105,317,1106,1121,1569],[46,52,76,105,317,1121,1123,1124,1126,1127,1569],[46,52,76,105,317,1123,1126,1569],[46,49,52,76,105,317,1121,1126,1569],[46,52,76,105,317,1095,1126,1127,1569],[46,76,105,317,1101,1106,1121,1126,1127,1128,1129,1569],[46,52,76,105,317,1121,1122,1125,1127,1569],[46,76,105,317,1569,1699,1700,1704,1731,1732,1734,1735,1736,1738,1739],[46,76,105,317,1569,1697,1698],[46,76,105,317,1569,1697],[46,76,105,317,1569,1699,1739],[46,76,105,317,1569,1699,1700,1736,1737,1739],[46,76,105,317,1569,1739],[46,76,105,317,1569,1696,1739,1740],[46,76,105,317,1569,1699,1700,1738,1739],[46,76,105,317,1569,1699,1700,1702,1703,1738,1739],[46,76,105,317,1569,1699,1700,1701,1738,1739],[46,76,105,317,1569,1699,1700,1704,1731,1732,1733,1734,1735,1738,1739],[46,76,105,317,1569,1696,1699,1700,1704,1736,1738],[46,76,105,317,1569,1704,1739],[46,76,105,317,1569,1706,1707,1708,1709,1710,1711,1712,1713,1714,1715,1739],[46,76,105,317,1569,1729,1739],[46,76,105,317,1569,1705,1716,1724,1725,1726,1727,1728,1730],[46,76,105,317,1569,1709,1739],[46,76,105,317,1569,1717,1718,1719,1720,1721,1722,1723,1739],[46,76,105,317,1300,1569],[46,76,105,317,1258,1569],[46,76,105,317,1257,1258,1569],[46,76,105,317,1261,1569],[46,76,105,317,1259,1260,1261,1262,1263,1264,1265,1266,1569],[46,76,105,317,1240,1251,1569],[46,76,105,317,1257,1268,1569],[46,76,105,317,1238,1251,1252,1253,1256,1569],[46,76,105,317,1255,1257,1569],[46,76,105,317,1240,1242,1243,1569],[46,76,105,317,1244,1251,1257,1569],[46,76,105,317,1257,1569],[46,76,105,317,1251,1257,1569],[46,76,105,317,1244,1254,1255,1258,1569],[46,76,105,317,1240,1244,1251,1300,1569],[46,76,105,317,1253,1569],[46,76,105,317,1241,1244,1252,1253,1255,1256,1257,1258,1268,1269,1270,1271,1272,1273,1569],[46,76,105,317,1244,1251,1569],[46,76,105,317,1240,1244,1569],[46,76,105,317,1240,1244,1245,1275,1569],[46,76,105,317,1245,1250,1276,1277,1569],[46,76,105,317,1245,1276,1569],[46,76,105,317,1267,1274,1278,1282,1290,1298,1569],[46,76,105,317,1279,1280,1281,1569],[46,76,105,317,1238,1257,1569],[46,76,105,317,1279,1569],[46,76,105,317,1257,1279,1569],[46,76,105,317,1249,1283,1284,1285,1286,1287,1289,1569],[46,76,105,317,1240,1244,1251,1569],[46,76,105,317,1240,1244,1300,1569],[46,76,105,317,1240,1244,1251,1257,1269,1271,1279,1288,1569],[46,76,105,317,1291,1293,1294,1295,1296,1297,1569],[46,76,105,317,1255,1569],[46,76,105,317,1292,1569],[46,76,105,317,1292,1300,1569],[46,76,105,317,1241,1255,1569],[46,76,105,317,1296,1569],[46,76,105,317,1251,1299,1569],[46,76,105,317,1239,1240,1241,1242,1243,1244,1245,1246,1247,1248,1249,1250,1569],[46,76,105,317,1242,1569],[46,76,105,317,526,1569],[46,76,105,317,528,529,530,531,532,533,534,1569],[46,76,105,317,517,1569],[46,76,105,317,518,526,527,535,1569],[46,76,105,317,519,1569],[46,76,105,317,513,1569],[46,76,105,317,510,511,512,513,514,515,516,519,520,521,522,523,524,525,1569],[46,76,105,317,518,520,1569],[46,76,105,317,521,526,1569],[46,76,105,317,376,1569],[46,76,105,317,375,376,381,1569],[46,76,105,317,377,378,379,380,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,1569],[46,76,105,317,376,413,1569],[46,76,105,317,376,453,1569],[46,76,105,317,375,1569],[46,76,105,317,371,372,373,374,375,376,381,501,502,503,504,508,1569],[46,76,105,317,381,1569],[46,76,105,317,373,506,507,1569],[46,76,105,317,375,505,1569],[46,76,105,317,376,381,1569],[46,76,105,317,371,372,1569],[46,76,104,105,317,1569,1761],[46,76,105,317,1569,1649,1695,1740],[46,76,105,317,1569,1649,1741],[46,76,105,317,1569,1692,1741,1762],[46,76,105,317,328,1569],[46,76,105,317,327,1569],[46,76,105,317,329,1135,1136,1137,1569],[46,76,105,317,329,1135,1136,1138,1569],[46,76,105,317,329,1136,1137,1138,1569],[46,76,105,317,329,1135,1137,1138,1569],[46,76,105,317,1412,1569],[46,76,105,317,1412,1413,1569],[46,76,105,317,1569,1809,1815],[46,76,105,112,317,1569,1758,1759,1760],[46,76,105,317,1569,1758,1759],[46,76,105,317,1569,1758],[46,76,105,112,317,1569,1757],[46,76,105,317,1043,1044,1569],[46,76,105,317,1001,1032,1034,1036,1077,1569],[46,76,105,317,1000,1001,1002,1003,1032,1034,1036,1042,1043,1077,1569],[46,76,105,317,1569,1813],[46,76,105,317,1569,1597,1814],[46,76,105,317,452,1569],[46,76,105,317,1005,1006,1569],[46,76,105,317,1000,1004,1005,1007,1032,1034,1036,1077,1569],[46,76,105,317,1001,1003,1004,1031,1032,1034,1036,1077,1569],[46,76,105,317,1007,1030,1032,1034,1569],[46,76,105,317,1000,1001,1003,1004,1007,1030,1032,1033,1034,1036,1077,1569],[46,76,105,317,1000,1007,1030,1034,1569],[46,76,105,317,1001,1003,1004,1032,1034,1035,1036,1077,1569],[46,76,105,317,1007,1030,1034,1036,1569],[46,76,105,317,1001,1004,1032,1034,1036,1050,1051,1075,1076,1077,1569],[46,76,105,317,1001,1032,1034,1036,1050,1077,1569],[46,76,105,317,1001,1004,1032,1034,1036,1050,1077,1569],[46,76,105,317,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1569],[46,76,105,317,1001,1004,1032,1034,1036,1049,1051,1077,1569],[46,76,105,317,1008,1009,1029,1569],[46,76,105,317,1004,1008,1032,1034,1036,1077,1569],[46,76,105,317,1004,1032,1034,1036,1077,1569],[46,76,105,317,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1569],[46,76,105,317,1000,1004,1030,1032,1034,1036,1077,1569],[46,57,76,105,317,1569],[46,76,105,276,317,1569],[46,76,105,278,279,280,281,317,1569],[46,76,105,283,317,1569],[46,76,105,121,130,137,272,317,1569],[46,76,105,121,128,132,139,150,317,1569],[46,76,105,130,317,1569],[46,76,105,130,249,317,1569],[46,76,105,183,198,213,315,317,1569],[46,76,105,221,317,1569],[46,76,105,113,121,130,134,138,150,186,205,215,272,317,1569],[46,76,105,121,130,136,170,180,246,247,315,317,1569],[46,76,105,136,315,317,1569],[46,76,105,130,180,181,315,317,1569],[46,76,105,130,136,170,315,317,1569],[46,76,105,315,317,1569],[46,76,105,136,137,315,317,1569],[46,62,76,105,112,317,1569],[46,52,76,105,199,200,218,219,317,1569],[46,76,105,190,317,1569],[46,52,76,105,115,317,1569],[46,76,105,189,191,317,1322,1569],[46,52,76,105,199,216,317,1569],[46,76,105,195,219,300,301,317,1569],[46,76,105,144,299,317,1569],[46,62,76,105,112,144,189,190,191,317,1569],[46,52,76,105,216,219,317,1569],[46,76,105,216,218,317,1569],[46,76,105,216,217,219,317,1569],[46,62,76,105,112,131,139,186,187,317,1569],[46,76,105,206,317,1569],[46,52,76,105,122,293,317,1569],[46,52,76,104,105,112,317,1569],[46,52,76,105,136,168,317,1569],[46,52,76,105,136,317,1569],[46,76,105,166,171,317,1569],[46,52,76,105,167,275,317,1569],[46,76,105,317,541,1569],[46,52,56,76,78,105,112,114,115,272,310,311,317,992,1569],[46,76,105,272,317,1569],[46,76,105,120,317,1569],[46,76,105,265,266,267,268,269,270,317,1569],[46,76,105,267,317,1569],[46,52,76,105,273,275,317,1569],[46,52,76,105,275,317,1569],[46,76,78,105,112,131,275,317,1569],[46,76,78,105,112,129,139,140,158,188,192,193,215,216,317,1569],[46,76,105,187,188,192,199,201,202,203,204,207,208,209,210,211,212,315,317,1569],[46,52,76,89,105,112,130,158,160,162,186,215,272,315,317,1569],[46,76,78,105,112,131,132,144,145,189,317,1569],[46,76,78,105,112,130,132,317,1569],[46,76,78,93,105,112,129,131,132,317,1569],[46,76,78,89,104,105,112,120,122,129,130,131,132,136,139,140,141,151,152,154,157,158,160,161,162,185,186,216,224,226,229,231,234,236,237,238,272,317,1569],[46,76,78,93,105,112,317,1569],[46,76,105,121,122,123,129,272,275,315,317,1569],[46,76,78,93,104,105,112,126,248,250,251,315,317,1569],[46,76,89,104,105,112,126,129,131,148,152,154,155,156,160,186,229,239,241,246,261,262,317,1569],[46,76,105,130,134,186,317,1569],[46,76,105,129,130,317,1569],[46,76,105,141,230,317,1569],[46,76,105,232,317,1569],[46,76,105,230,317,1569],[46,76,105,232,235,317,1569],[46,76,105,232,233,317,1569],[46,76,105,125,126,317,1569],[46,76,105,125,163,317,1569],[46,76,105,125,317,1569],[46,76,105,127,141,228,317,1569],[46,76,105,227,317,1569],[46,76,105,126,127,317,1569],[46,76,105,127,225,317,1569],[46,76,105,126,317,1569],[46,76,105,215,317,1569],[46,76,78,105,112,129,140,159,178,183,194,197,214,216,317,1569],[46,76,105,172,173,174,175,176,177,195,196,219,273,317,1569],[46,76,105,223,317,1569],[46,76,78,105,112,129,140,159,164,220,222,224,272,275,317,1569],[46,76,78,104,105,112,122,129,130,185,317,1569],[46,76,105,182,317,1569],[46,76,78,105,112,254,260,317,1569],[46,76,105,151,185,275,317,1569],[46,76,105,246,255,261,264,317,1569],[46,76,78,105,134,246,254,256,317,1569],[46,76,105,121,130,151,161,258,317,1569],[46,76,78,105,112,130,136,161,242,252,253,257,258,259,317,1569],[46,76,105,113,158,159,272,275,317,1569],[46,76,78,89,104,105,112,127,129,131,134,138,139,140,148,151,152,154,155,156,157,160,185,186,226,239,240,275,317,1569],[46,76,78,105,112,129,130,134,241,263,317,1569],[46,76,78,105,112,131,139,317,1569],[46,52,76,78,89,105,112,120,122,129,132,140,157,158,160,162,223,272,275,317,1569],[46,76,78,89,104,105,112,124,127,128,131,317,1569],[46,76,105,125,184,317,1569],[46,76,78,105,112,125,139,140,317,1569],[46,76,78,105,112,130,141,317,1569],[46,76,78,105,112,317,1569],[46,76,105,144,317,1569],[46,76,105,143,317,1569],[46,76,105,145,317,1569],[46,76,105,130,142,144,148,317,1569],[46,76,105,130,142,144,317,1569],[46,76,78,105,112,124,130,131,145,146,147,317,1569],[46,52,76,105,216,217,218,317,1569],[46,76,105,179,317,1569],[46,52,76,105,122,317,1569],[46,52,76,105,154,317,1569],[46,52,76,105,113,157,162,272,275,317,1569],[46,76,105,122,293,294,317,1569],[46,52,76,105,171,317,1569],[46,52,76,89,104,105,112,120,165,167,169,170,275,317,1569],[46,76,105,131,136,154,317,1569],[46,76,89,105,112,317,1569],[46,76,105,153,317,1569],[46,52,76,78,89,105,112,120,171,180,272,273,274,317,1569],[46,47,52,53,54,55,76,105,114,115,272,312,317,992,1569],[46,76,105,243,244,245,317,1569],[46,76,105,243,317,1569],[46,76,105,285,317,1569],[46,76,105,287,317,1569],[46,76,105,289,317,1569],[46,76,105,317,542,1569],[46,76,105,317,1342,1569],[46,76,105,291,317,1569],[46,76,105,317,1323,1569],[46,76,105,295,1569],[46,76,105,295,317,1569],[46,56,58,76,105,272,277,282,284,286,288,290,292,296,298,303,304,306,313,314,315,317,1569],[46,76,105,297,317,1569],[46,76,105,302,317,1569],[46,76,105,167,317,1569],[46,76,105,305,317,1569],[46,62,76,105,145,146,147,148,307,308,309,312,317,1569],[46,52,56,76,78,80,89,105,112,114,115,116,118,120,132,264,271,275,312,317,992,1569],[46,76,105,317,1569,1571,1572,1576],[46,76,105,317,1569,1579,1623],[46,76,105,317,1569,1572,1573],[46,76,105,317,1569,1571,1575],[46,76,105,317,1569,1570,1571,1572,1574],[46,76,105,317,1569,1580,1581,1592,1593],[46,76,105,317,1569,1579],[46,76,105,317,1569,1572,1579,1580,1581,1590,1592],[46,76,105,317,1569,1577,1578,1580],[46,76,105,317,1569,1579,1580],[46,64,76,105,112,317,1569,1572,1579,1581,1587,1590],[46,76,105,317,1569,1570,1572,1578,1579,1580,1581,1584,1585,1590,1593,1594,1595,1596,1602,1603,1605,1606,1608,1609,1610,1611,1612,1614,1615,1616,1617,1619,1620,1621,1622],[46,76,105,317,1569,1570,1608],[46,76,105,317,1569,1570,1579],[46,76,105,317,1569,1570,1580,1604],[46,76,105,112,317,1569,1572,1579,1580,1581,1588,1589],[46,76,105,317,1569,1580,1585],[46,76,105,317,1569,1572,1580,1589],[46,76,105,317,1569,1572],[46,76,105,317,1569,1572,1585],[46,76,105,317,1569,1572,1580,1587],[46,76,105,317,1569,1572,1579,1580,1585,1586],[46,76,105,317,1569,1601,1618],[46,76,105,317,1569,1581,1601],[46,76,105,317,1569,1572,1579,1581,1588,1590,1600],[46,76,105,317,1569,1572,1580,1581,1593],[46,76,105,317,1569,1613],[46,76,105,317,1569,1572,1579,1599],[46,76,105,112,317,1569,1608],[46,76,105,317,1569,1607],[46,76,105,317,1569,1572,1579,1580,1582,1583,1584],[46,76,105,317,1569,1572,1580,1585],[46,76,105,317,1569,1597,1601],[46,76,105,317,1569,1580],[46,76,105,317,1569,1579,1580,1591],[46,76,105,317,1037,1038,1039,1040,1041,1569],[46,76,105,317,1037,1038,1569],[46,76,105,317,1037,1569],[46,76,105,317,1414,1432,1433,1434,1569],[46,52,76,105,317,1414,1569],[46,52,76,105,317,1420,1569],[46,76,105,317,1415,1416,1421,1569],[46,76,105,317,1423,1425,1426,1427,1429,1569],[46,76,105,317,1414,1420,1569],[46,76,105,317,1424,1569],[46,76,105,317,1420,1423,1569],[46,76,105,317,1414,1569],[46,76,105,317,1420,1569],[46,76,105,317,1428,1569],[46,76,105,317,1420,1422,1430,1569],[46,52,76,105,317,1417,1569],[46,76,105,317,1417,1418,1419,1569],[46,52,76,105,317,356,1569],[46,76,105,317,356,357,358,360,361,362,363,364,365,366,369,1569],[46,76,105,317,356,1569],[46,76,105,317,359,1569],[46,52,76,105,317,354,356,1569],[46,76,105,317,351,352,354,1569],[46,76,105,317,347,350,352,354,1569],[46,76,105,317,351,354,1569],[46,52,76,105,317,342,343,344,347,348,349,351,352,353,354,1569],[46,76,105,317,344,347,348,349,350,351,352,353,354,355,1569],[46,76,105,317,351,1569],[46,76,105,317,345,351,352,1569],[46,76,105,317,345,346,1569],[46,76,105,317,350,352,353,1569],[46,76,105,317,350,1569],[46,76,105,317,342,347,352,353,1569],[46,76,105,317,367,368,1569],[46,76,105,317,1045,1091,1569],[46,76,105,317,1001,1032,1034,1036,1045,1077,1082,1084,1090,1569],[46,52,56,76,105,114,115,272,312,317,1569],[46,76,105,317,1001,1032,1034,1036,1077,1082,1569],[46,76,105,317,1077,1083,1569],[46,76,105,317,1001,1004,1032,1034,1036,1049,1077,1082,1569],[46,76,105,317,1569,1689],[46,76,105,317,1569,1649,1687,1688],[46,76,105,317,1569,1649,1689],[46,76,105,317,545,1569],[46,52,76,105,317,330,1569],[46,76,105,317,1569,1806],[46,76,105,317,1569,1804,1805],[46,76,105,317,1079,1569],[46,76,105,317,1049,1081,1569],[46,76,105,317,1000,1049,1078,1080,1082,1569],[46,76,105,317,1085,1569],[46,76,105,317,1086,1087,1569],[46,76,105,317,1000,1086,1569],[46,76,105,317,1086,1088,1089,1569],[46,76,105,317,1000,1086,1088,1569],[46,76,105,317,1311,1312,1313,1569],[46,76,105,317,1311,1569],[46,76,105,317,1046,1569],[46,76,105,317,1048,1569],[46,76,105,317,1000,1047,1049,1569],[46,63,76,78,83,101,105,107,317,1002,1003,1569,1687,1689,1690,1691],[46,76,105,317,1542,1569],[46,76,105,317,1464,1465,1466,1467,1469,1470,1471,1472,1473,1474,1475,1476,1477,1478,1479,1480,1481,1482,1483,1484,1485,1486,1487,1488,1489,1490,1491,1492,1493,1494,1495,1496,1497,1498,1499,1500,1501,1502,1503,1504,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1569],[46,76,105,317,1490,1569],[46,76,105,317,1490,1503,1569],[46,76,105,317,1468,1517,1569],[46,76,105,317,1518,1569],[46,76,105,317,1469,1492,1569],[46,76,105,317,1492,1569],[46,76,105,317,1468,1569],[46,76,105,317,1521,1569],[46,76,105,317,1501,1569],[46,76,105,317,1468,1509,1517,1569],[46,76,105,317,1512,1569],[46,76,105,317,1514,1569],[46,76,105,317,1464,1569],[46,76,105,317,1484,1569],[46,76,105,317,1465,1466,1505,1569],[46,76,105,317,1525,1569],[46,76,105,317,1523,1569],[46,76,105,317,1469,1470,1569],[46,76,105,317,1471,1569],[46,76,105,317,1482,1569],[46,76,105,317,1468,1473,1569],[46,76,105,317,1527,1569],[46,76,105,317,1469,1569],[46,76,105,317,1521,1530,1533,1569],[46,76,105,317,1469,1470,1514,1569],[316],[52,316],[52],[52,336],[52,334,336,550],[52,329,1130],[313],[52,354]],"referencedMap":[[46,1],[318,2],[1801,3],[1802,4],[1308,5],[1320,6],[1318,7],[1321,8],[1326,9],[1446,10],[1237,11],[1454,12],[1448,13],[1449,14],[1457,15],[1549,16],[1459,17],[1460,8],[1551,18],[1562,19],[1559,20],[1552,21],[1565,22],[1556,23],[1554,24],[548,25],[1307,26],[1302,27],[325,28],[1304,29],[1305,30],[1561,31],[1558,32],[1564,33],[1555,34],[1317,35],[1315,36],[1319,37],[1316,38],[1411,39],[1233,40],[337,41],[1441,42],[1437,43],[1442,44],[1444,45],[1407,46],[1436,47],[1140,48],[1331,49],[1333,50],[997,21],[339,51],[1330,52],[1332,53],[341,54],[1328,53],[338,44],[1329,53],[540,55],[1445,56],[1231,57],[1409,58],[1361,59],[1345,60],[1341,61],[1339,62],[1359,63],[1356,62],[1357,61],[1336,64],[1348,65],[1355,66],[1352,62],[1353,67],[1351,68],[1349,69],[1360,70],[1346,71],[1410,72],[1334,73],[547,74],[1236,75],[1306,76],[1132,77],[1162,78],[553,79],[552,80],[993,81],[551,82],[1447,83],[1453,84],[1438,52],[1566,28],[1452,85],[1546,86],[1439,87],[1456,88],[1440,89],[998,90],[1458,91],[1548,92],[1134,93],[1234,94],[1164,95],[1235,96],[1131,97],[1163,98],[1550,99],[1161,100],[324,101],[1808,102],[321,28],[322,103],[320,28],[332,104],[1325,105],[1347,28],[1450,28],[550,28],[1553,106],[1560,107],[1557,108],[1563,106],[1443,108],[1232,108],[1451,108],[1142,108],[1461,108],[1338,109],[1337,108],[1358,110],[1354,108],[1350,110],[1159,108],[1143,111],[1462,28],[1455,28],[995,112],[1344,113],[1158,114],[1408,115],[1139,115],[1157,116],[1309,73],[1141,115],[1463,115],[1310,117],[546,118],[544,119],[323,28],[991,120],[1547,21],[996,21],[1327,21],[1303,121],[999,122],[335,123],[334,124],[581,125],[590,126],[592,127],[589,128],[591,129],[588,130],[580,131],[538,132],[539,133],[537,134],[1545,135],[1544,136],[1809,131],[1812,137],[620,138],[612,139],[617,140],[616,141],[615,142],[614,141],[619,143],[618,141],[613,144],[621,126],[622,145],[626,146],[623,139],[627,147],[628,148],[629,149],[631,150],[630,139],[632,151],[634,152],[635,153],[646,154],[645,139],[643,155],[644,156],[642,156],[637,157],[636,148],[638,158],[647,159],[639,155],[641,160],[640,148],[648,148],[649,139],[650,161],[689,162],[690,163],[693,164],[692,139],[691,148],[694,165],[695,158],[696,166],[698,167],[697,139],[699,168],[701,169],[700,139],[702,170],[703,158],[713,171],[704,139],[705,139],[712,172],[711,173],[706,139],[707,131],[708,139],[709,139],[710,174],[715,175],[714,139],[716,176],[718,177],[717,139],[719,178],[723,179],[722,139],[721,180],[720,139],[724,181],[728,182],[727,158],[729,183],[730,158],[731,184],[737,185],[736,139],[735,186],[738,126],[739,187],[745,188],[744,139],[743,189],[746,190],[747,191],[748,192],[750,193],[749,139],[751,194],[752,148],[753,195],[765,196],[766,197],[768,198],[764,199],[763,139],[757,200],[756,139],[767,198],[769,201],[760,202],[759,139],[762,203],[761,139],[755,204],[754,139],[758,131],[771,205],[770,139],[772,206],[773,148],[774,139],[775,207],[776,126],[777,208],[780,209],[779,139],[781,210],[782,148],[783,139],[784,211],[786,212],[785,148],[787,213],[788,126],[789,214],[791,215],[790,139],[792,216],[794,217],[793,148],[795,218],[675,219],[674,220],[676,221],[673,131],[671,131],[672,126],[796,126],[797,222],[799,223],[798,148],[800,224],[801,148],[802,225],[741,226],[740,148],[742,227],[803,228],[804,229],[807,230],[805,231],[806,231],[808,232],[810,233],[809,139],[811,234],[984,235],[815,236],[814,237],[813,238],[812,131],[734,239],[733,240],[732,139],[663,241],[661,242],[660,139],[656,243],[655,139],[654,244],[653,139],[652,245],[651,139],[659,148],[658,246],[657,139],[662,247],[817,248],[816,249],[825,250],[823,251],[824,139],[818,131],[827,252],[826,148],[832,253],[831,254],[828,139],[830,255],[829,256],[625,257],[624,148],[834,258],[833,259],[837,260],[835,148],[836,139],[840,261],[838,148],[839,139],[851,262],[850,263],[848,131],[842,264],[841,139],[843,148],[845,265],[844,139],[847,266],[846,139],[849,126],[854,267],[853,268],[852,148],[856,269],[855,139],[859,270],[858,271],[857,139],[861,272],[860,273],[864,274],[863,275],[862,139],[867,276],[866,277],[865,139],[870,278],[869,279],[868,139],[873,280],[872,281],[871,148],[874,126],[877,282],[876,283],[875,139],[778,284],[726,285],[725,139],[880,286],[879,287],[878,139],[682,288],[681,289],[678,290],[679,148],[677,139],[680,126],[883,291],[882,292],[881,126],[886,293],[885,294],[884,139],[890,295],[889,296],[888,139],[887,186],[896,297],[894,298],[893,139],[892,299],[891,139],[895,126],[899,300],[898,301],[897,139],[902,302],[901,303],[900,139],[905,304],[904,305],[903,139],[687,126],[688,306],[685,307],[669,308],[668,139],[683,309],[670,139],[686,148],[684,310],[908,139],[909,311],[907,312],[906,139],[912,313],[911,314],[910,315],[923,316],[916,317],[915,139],[922,318],[921,318],[920,319],[919,139],[914,320],[913,139],[918,321],[917,139],[925,322],[924,148],[928,323],[927,324],[926,139],[931,325],[930,326],[929,148],[937,327],[933,328],[932,139],[934,126],[936,329],[935,139],[941,330],[940,331],[939,139],[938,186],[944,332],[943,333],[942,139],[955,334],[951,335],[950,336],[954,337],[953,336],[945,139],[947,338],[946,336],[949,339],[948,336],[952,340],[957,341],[633,158],[956,148],[821,342],[820,343],[822,344],[819,186],[960,345],[959,346],[958,139],[964,347],[963,348],[962,349],[961,139],[967,350],[966,351],[965,352],[973,353],[972,354],[969,139],[970,355],[971,356],[968,126],[979,357],[976,358],[975,139],[978,359],[974,148],[977,131],[666,360],[667,361],[665,360],[664,126],[981,362],[980,148],[983,363],[982,158],[1388,364],[1389,365],[1387,366],[1386,367],[1380,368],[1379,367],[1404,369],[1384,370],[1383,367],[1385,371],[1382,372],[1381,367],[1392,373],[1393,374],[1391,375],[1390,367],[1405,376],[1394,373],[1395,377],[1374,378],[1373,367],[1378,379],[1377,380],[1376,367],[1375,131],[1397,381],[1396,364],[1400,382],[1399,383],[1398,367],[1403,384],[1402,385],[1401,367],[1406,386],[1363,131],[1364,387],[1365,387],[1366,131],[1367,387],[1368,387],[1369,131],[1372,388],[1370,131],[1371,131],[1230,389],[1173,126],[1174,131],[1176,390],[1177,131],[1178,131],[1179,131],[1183,126],[1222,131],[1180,131],[1181,131],[1221,126],[1229,131],[1228,131],[1182,131],[1184,131],[1223,126],[1185,131],[1214,131],[1211,131],[1212,126],[1213,391],[1216,126],[1186,131],[1187,131],[1220,126],[1210,131],[1188,131],[1189,126],[1190,126],[1191,131],[1192,392],[1215,131],[1175,131],[1194,126],[1195,126],[1196,126],[1224,131],[1218,131],[1199,131],[1197,131],[1227,131],[1198,131],[1200,390],[1202,126],[1201,126],[1203,126],[1193,392],[1219,131],[1204,126],[1226,131],[1225,131],[1205,131],[1206,131],[1217,131],[1207,131],[1208,131],[1209,131],[1165,126],[1166,131],[1172,393],[1167,131],[1168,131],[1169,131],[1170,131],[1171,131],[985,394],[986,395],[989,396],[990,397],[987,398],[988,396],[611,399],[607,400],[605,401],[579,400],[608,400],[610,402],[606,403],[609,126],[572,131],[577,131],[599,404],[601,405],[574,406],[578,131],[600,407],[575,131],[576,408],[598,409],[573,131],[603,131],[602,131],[604,410],[587,411],[596,412],[593,413],[597,414],[583,415],[584,416],[586,417],[585,131],[594,418],[595,412],[571,131],[582,131],[561,126],[562,131],[554,126],[558,126],[555,126],[567,131],[557,131],[569,126],[556,131],[560,131],[566,131],[570,419],[568,126],[564,131],[563,131],[559,131],[565,126],[274,131],[1748,420],[1751,421],[1750,422],[1749,423],[1747,424],[1743,425],[1746,426],[1745,427],[1744,428],[1742,424],[1757,429],[1756,430],[1755,431],[1754,432],[1753,433],[1752,434],[1643,435],[1642,436],[1631,437],[1632,438],[1624,439],[1625,439],[1644,440],[1629,441],[1627,442],[1628,439],[1630,439],[1634,443],[1640,441],[1636,439],[1639,441],[1641,439],[1635,131],[1638,131],[1633,444],[1637,131],[1652,445],[1647,446],[1646,447],[1645,131],[1651,448],[1764,131],[1800,449],[1798,450],[1791,451],[1790,452],[1792,453],[1794,454],[1793,452],[1796,455],[1795,456],[1799,457],[1797,458],[1568,131],[1567,131],[1789,459],[1788,460],[1787,461],[1660,462],[1659,463],[1665,464],[1666,464],[1683,465],[1682,131],[1662,466],[1661,467],[1681,468],[1680,131],[1664,469],[1663,131],[1677,470],[1676,463],[1670,471],[1669,131],[1668,472],[1667,463],[1672,473],[1671,131],[1679,474],[1678,475],[1684,131],[1685,476],[1673,446],[1675,477],[1674,478],[1656,131],[1654,131],[1653,448],[1655,479],[1657,131],[1803,131],[1658,131],[1786,480],[1771,481],[1770,131],[1772,482],[1765,483],[1773,484],[1694,485],[1693,131],[1769,486],[1768,131],[1785,460],[1775,487],[1784,488],[1767,489],[1766,490],[1774,131],[1781,491],[1778,460],[1782,131],[1783,492],[1780,493],[1779,491],[1776,494],[1777,495],[336,496],[333,131],[1811,131],[1648,131],[1650,497],[1003,498],[1002,131],[1001,499],[1818,500],[1817,501],[1649,131],[1145,502],[1146,503],[1144,504],[1147,505],[1148,506],[1149,507],[1150,508],[1151,509],[1152,510],[1153,511],[1154,512],[1155,513],[1156,514],[1004,499],[59,515],[60,515],[62,516],[63,517],[64,518],[65,519],[66,520],[67,521],[68,522],[69,523],[70,524],[71,525],[72,525],[74,526],[73,527],[75,526],[76,528],[77,529],[61,530],[111,131],[78,531],[79,532],[80,533],[112,534],[81,535],[82,536],[83,537],[84,538],[85,539],[86,540],[87,541],[88,542],[89,543],[90,544],[91,544],[92,545],[93,546],[95,547],[94,548],[96,549],[97,550],[98,131],[99,551],[100,552],[101,553],[102,554],[1569,528],[103,555],[104,556],[105,557],[106,558],[107,559],[108,560],[109,561],[110,562],[50,131],[117,563],[118,564],[116,126],[114,565],[115,566],[48,131],[52,567],[1123,126],[340,131],[51,131],[1000,131],[1362,131],[413,568],[404,131],[405,131],[406,131],[407,131],[408,131],[409,131],[410,131],[411,131],[412,131],[1598,131],[1599,569],[1133,126],[1095,570],[1094,571],[1122,570],[1096,572],[1097,572],[1098,572],[1099,572],[1100,572],[1101,572],[1120,572],[1102,572],[1103,572],[1121,573],[1119,572],[1104,572],[1105,572],[1107,574],[1108,572],[1109,572],[1110,572],[1118,572],[1111,572],[1112,572],[1113,572],[1114,572],[1115,572],[1116,572],[1117,572],[1125,575],[1124,576],[1127,577],[1128,578],[1130,579],[1126,580],[1129,131],[1106,572],[1740,581],[1697,131],[1699,582],[1698,583],[1703,584],[1738,585],[1735,586],[1737,587],[1700,586],[1701,588],[1705,588],[1704,589],[1702,590],[1736,591],[1734,586],[1739,592],[1732,131],[1733,131],[1706,593],[1711,586],[1713,586],[1708,586],[1709,593],[1715,586],[1716,594],[1707,586],[1712,586],[1714,586],[1710,586],[1730,595],[1729,586],[1731,596],[1725,586],[1727,586],[1726,586],[1722,586],[1728,597],[1723,586],[1724,598],[1717,586],[1718,586],[1719,586],[1720,586],[1721,586],[1335,131],[1686,131],[1301,599],[1259,600],[1260,600],[1261,601],[1262,600],[1264,602],[1263,600],[1265,600],[1266,600],[1267,603],[1241,604],[1268,131],[1269,131],[1270,605],[1238,131],[1257,606],[1258,607],[1253,131],[1244,608],[1271,609],[1272,610],[1252,611],[1256,612],[1255,613],[1273,131],[1254,614],[1274,615],[1250,616],[1277,617],[1276,618],[1245,616],[1278,619],[1288,604],[1246,131],[1275,620],[1299,621],[1282,622],[1279,623],[1280,624],[1281,625],[1290,626],[1249,599],[1283,131],[1284,131],[1285,627],[1286,131],[1287,628],[1289,629],[1298,630],[1291,631],[1293,632],[1292,631],[1294,631],[1295,633],[1296,634],[1297,635],[1300,636],[1243,604],[1240,131],[1247,131],[1242,131],[1251,637],[1248,638],[1239,131],[527,639],[528,639],[529,639],[535,640],[530,639],[531,639],[532,639],[533,639],[534,639],[518,641],[517,131],[536,642],[524,131],[520,643],[511,131],[510,131],[512,131],[513,639],[514,644],[526,645],[515,639],[516,639],[521,646],[522,647],[523,639],[519,131],[525,131],[374,131],[493,648],[497,648],[496,648],[494,648],[495,648],[498,648],[377,648],[389,648],[378,648],[391,648],[393,648],[387,648],[386,648],[388,648],[392,648],[394,648],[379,648],[390,648],[380,648],[382,649],[383,648],[384,648],[385,648],[401,648],[400,648],[501,650],[395,648],[397,648],[396,648],[398,648],[399,648],[500,648],[499,648],[402,648],[484,648],[483,648],[414,651],[415,651],[417,648],[461,648],[482,648],[418,651],[462,648],[459,648],[463,648],[419,648],[420,648],[421,651],[464,648],[458,651],[416,651],[465,648],[422,651],[466,648],[446,648],[423,651],[424,648],[425,648],[456,651],[428,648],[427,648],[467,648],[468,648],[469,651],[430,648],[432,648],[433,648],[439,648],[440,648],[434,651],[470,648],[457,651],[435,648],[436,648],[471,648],[437,648],[429,651],[472,648],[455,648],[473,648],[438,651],[441,648],[442,648],[460,651],[474,648],[475,648],[454,652],[431,648],[476,651],[477,648],[478,648],[479,648],[480,651],[443,648],[481,648],[447,648],[444,651],[445,651],[426,648],[448,648],[451,648],[449,648],[450,648],[403,648],[491,648],[485,648],[486,648],[488,648],[489,648],[487,648],[492,648],[490,648],[376,653],[509,654],[507,655],[508,656],[506,657],[505,648],[504,658],[373,131],[375,131],[371,131],[502,131],[503,659],[381,653],[372,131],[549,131],[1160,131],[1762,660],[1741,661],[1695,662],[1763,663],[49,131],[329,664],[328,665],[327,131],[1138,666],[1137,667],[1135,668],[1136,669],[1413,670],[1414,671],[1412,131],[1591,526],[1816,672],[1761,673],[1760,674],[1759,675],[1758,676],[1045,677],[1043,678],[1044,679],[1814,680],[1813,501],[1815,681],[1810,131],[453,682],[452,131],[1007,683],[1006,684],[1032,685],[1031,686],[1034,687],[1033,688],[1036,689],[1035,690],[1077,691],[1051,692],[1052,693],[1053,693],[1054,693],[1055,693],[1056,693],[1057,693],[1058,693],[1059,693],[1060,693],[1061,693],[1075,694],[1062,693],[1063,693],[1064,693],[1065,693],[1066,693],[1067,693],[1068,693],[1069,693],[1071,693],[1072,693],[1070,693],[1073,693],[1074,693],[1076,693],[1050,695],[1030,696],[1010,697],[1011,697],[1012,697],[1013,697],[1014,697],[1015,697],[1016,698],[1018,697],[1017,697],[1029,699],[1019,697],[1021,697],[1020,697],[1023,697],[1022,697],[1024,697],[1025,697],[1026,697],[1027,697],[1028,697],[1009,697],[1008,700],[1005,131],[58,701],[277,702],[282,703],[284,704],[136,705],[151,706],[247,707],[250,708],[214,709],[222,710],[206,711],[248,712],[137,713],[181,131],[182,714],[205,131],[249,715],[158,716],[138,717],[162,716],[152,716],[123,716],[204,718],[128,131],[201,719],[1322,720],[199,721],[1323,722],[187,131],[202,723],[302,724],[210,126],[301,131],[299,131],[300,725],[203,126],[192,726],[200,727],[217,728],[218,729],[209,131],[188,730],[207,731],[208,126],[294,732],[297,733],[169,734],[168,735],[167,736],[305,126],[166,737],[143,131],[308,131],[542,738],[1342,738],[541,131],[311,131],[310,126],[312,739],[119,131],[242,131],[150,740],[121,741],[265,131],[266,131],[268,131],[271,742],[267,131],[269,743],[270,743],[149,131],[276,737],[285,744],[289,745],[132,746],[194,747],[193,131],[213,748],[211,131],[212,131],[216,749],[190,750],[131,751],[156,752],[239,753],[124,754],[130,755],[120,707],[252,756],[263,757],[251,131],[262,758],[157,131],[141,759],[231,760],[230,131],[238,761],[232,762],[236,763],[237,764],[235,762],[234,764],[233,762],[178,765],[163,765],[225,766],[164,766],[126,767],[125,131],[229,768],[228,769],[227,770],[226,771],[127,772],[198,773],[215,774],[197,775],[221,776],[223,777],[220,775],[159,772],[113,131],[240,778],[183,779],[261,780],[186,781],[256,782],[139,131],[257,783],[259,784],[260,785],[255,131],[254,754],[160,786],[241,787],[264,788],[133,131],[135,131],[140,789],[224,790],[129,791],[134,131],[185,792],[184,793],[142,794],[191,795],[189,796],[144,797],[146,798],[309,131],[145,799],[147,800],[279,131],[280,131],[278,131],[281,131],[307,131],[148,801],[196,126],[57,131],[219,802],[170,131],[180,803],[287,126],[293,804],[177,126],[291,126],[176,805],[273,806],[175,804],[122,131],[295,807],[173,126],[174,126],[165,131],[179,131],[172,808],[171,809],[161,810],[155,811],[258,131],[154,812],[153,131],[283,131],[195,126],[275,813],[47,131],[56,814],[53,126],[54,131],[55,131],[253,557],[246,815],[245,131],[244,816],[243,131],[286,817],[288,818],[290,819],[543,820],[1343,821],[292,822],[1324,823],[317,824],[296,825],[316,826],[298,827],[303,828],[304,829],[306,830],[313,831],[315,131],[314,424],[272,832],[1597,131],[1607,131],[1577,833],[1573,834],[1574,835],[1571,131],[1576,836],[1575,837],[1603,838],[1595,839],[1593,840],[1579,841],[1572,842],[1581,131],[1580,839],[1594,842],[1588,843],[1623,844],[1570,424],[1606,439],[1609,845],[1604,846],[1605,847],[1620,131],[1590,848],[1589,131],[1586,849],[1622,850],[1615,851],[1584,852],[1616,853],[1587,854],[1619,855],[1618,856],[1601,857],[1617,858],[1614,859],[1621,131],[1600,860],[1610,861],[1608,862],[1596,131],[1585,863],[1583,864],[1602,865],[1582,866],[1578,131],[1592,867],[1612,131],[1611,131],[1613,131],[1042,868],[1039,869],[1040,131],[1041,131],[1037,131],[1038,870],[1432,131],[1435,871],[1433,131],[1434,131],[1415,872],[1416,872],[1421,873],[1422,874],[1430,875],[1423,876],[1425,877],[1424,878],[1426,879],[1427,880],[1429,881],[1428,878],[1431,882],[1418,883],[1420,884],[1419,879],[1417,131],[342,131],[357,885],[358,885],[370,886],[359,887],[360,888],[355,889],[353,890],[344,131],[348,891],[352,892],[350,893],[356,894],[345,895],[346,896],[347,897],[349,898],[351,899],[354,900],[361,887],[362,887],[363,887],[364,885],[365,887],[366,887],[343,887],[367,131],[369,901],[368,887],[994,126],[1092,902],[1091,903],[1340,126],[992,904],[326,131],[1093,905],[1084,906],[1083,907],[1690,908],[1689,909],[1687,910],[1688,131],[545,911],[330,126],[331,912],[1807,913],[1806,914],[1805,131],[1804,131],[1691,131],[1080,915],[1079,131],[319,131],[44,131],[45,131],[8,131],[10,131],[9,131],[2,131],[11,131],[12,131],[13,131],[14,131],[15,131],[16,131],[17,131],[18,131],[3,131],[4,131],[19,131],[23,131],[20,131],[21,131],[22,131],[24,131],[25,131],[26,131],[5,131],[27,131],[28,131],[29,131],[30,131],[6,131],[34,131],[31,131],[32,131],[33,131],[35,131],[7,131],[36,131],[41,131],[42,131],[37,131],[38,131],[39,131],[40,131],[1,131],[43,131],[1626,131],[1082,916],[1078,131],[1081,917],[1086,918],[1085,499],[1088,919],[1087,920],[1090,921],[1089,922],[1696,131],[1314,923],[1312,924],[1311,131],[1313,924],[1047,925],[1046,499],[1049,926],[1048,927],[1692,928],[1543,929],[1542,930],[1491,931],[1504,932],[1466,131],[1518,933],[1520,934],[1519,934],[1493,935],[1492,131],[1494,936],[1521,937],[1525,938],[1523,938],[1502,939],[1501,131],[1510,937],[1469,937],[1497,131],[1538,940],[1513,941],[1515,942],[1533,937],[1468,943],[1485,944],[1500,131],[1535,131],[1506,945],[1522,938],[1526,946],[1524,947],[1539,131],[1508,131],[1482,943],[1474,131],[1473,948],[1498,937],[1499,937],[1472,949],[1505,131],[1467,131],[1484,131],[1512,131],[1540,950],[1479,937],[1480,951],[1527,934],[1529,952],[1528,952],[1464,131],[1483,131],[1490,131],[1481,937],[1511,131],[1478,131],[1537,131],[1477,131],[1475,953],[1476,131],[1514,131],[1507,131],[1534,954],[1488,948],[1486,948],[1487,948],[1503,131],[1470,131],[1530,938],[1532,946],[1531,947],[1517,131],[1516,955],[1509,131],[1496,131],[1536,131],[1541,131],[1465,131],[1495,131],[1489,131],[1471,948]],"exportedModulesMap":[[46,1],[318,2],[1801,956],[1802,4],[1308,5],[1320,957],[1318,7],[1321,8],[1326,9],[1446,10],[1237,11],[1454,12],[1448,13],[1449,14],[1457,15],[1549,16],[1459,17],[1460,8],[1551,18],[1562,19],[1559,20],[1552,21],[1565,22],[1556,23],[1554,24],[548,25],[1307,26],[1302,27],[325,28],[1304,29],[1305,30],[1561,31],[1558,32],[1564,33],[1555,34],[1317,35],[1315,36],[1319,958],[1316,959],[1411,39],[1233,40],[337,41],[1441,42],[1437,43],[1442,44],[1444,45],[1407,46],[1436,47],[1140,48],[1331,49],[1333,50],[997,21],[339,51],[1330,52],[1332,53],[341,54],[1328,53],[338,44],[1329,53],[540,55],[1445,56],[1231,57],[1409,58],[1361,59],[1345,60],[1341,61],[1339,62],[1359,63],[1356,62],[1357,61],[1336,64],[1348,65],[1355,66],[1352,62],[1353,67],[1351,68],[1349,69],[1360,70],[1346,71],[1410,72],[1334,73],[547,958],[1236,75],[1306,76],[1132,77],[1162,958],[553,79],[552,958],[993,81],[551,960],[1447,83],[1453,84],[1438,52],[1566,28],[1452,85],[1546,86],[1439,87],[1456,958],[1440,89],[998,90],[1458,91],[1548,92],[1134,93],[1234,94],[1164,958],[1235,958],[1131,961],[1163,958],[1550,958],[1161,100],[324,962],[1808,102],[321,28],[322,103],[320,28],[332,104],[1325,105],[1347,28],[1450,28],[1553,106],[1560,107],[1557,108],[1563,106],[1232,108],[1451,108],[1142,108],[1461,108],[1338,109],[1337,108],[1358,110],[1354,108],[1350,110],[1159,108],[1143,111],[1462,28],[995,112],[1344,113],[1158,114],[1408,115],[1139,115],[1157,963],[1309,73],[1141,115],[1463,115],[1310,117],[546,118],[544,119],[991,120],[1547,21],[996,21],[1327,21],[1303,121],[999,122],[335,123],[334,124],[581,125],[590,126],[592,127],[589,128],[591,129],[588,130],[580,131],[538,132],[539,133],[537,134],[1545,135],[1544,136],[1809,131],[1812,137],[620,138],[612,139],[617,140],[616,141],[615,142],[614,141],[619,143],[618,141],[613,144],[621,126],[622,145],[626,146],[623,139],[627,147],[628,148],[629,149],[631,150],[630,139],[632,151],[634,152],[635,153],[646,154],[645,139],[643,155],[644,156],[642,156],[637,157],[636,148],[638,158],[647,159],[639,155],[641,160],[640,148],[648,148],[649,139],[650,161],[689,162],[690,163],[693,164],[692,139],[691,148],[694,165],[695,158],[696,166],[698,167],[697,139],[699,168],[701,169],[700,139],[702,170],[703,158],[713,171],[704,139],[705,139],[712,172],[711,173],[706,139],[707,131],[708,139],[709,139],[710,174],[715,175],[714,139],[716,176],[718,177],[717,139],[719,178],[723,179],[722,139],[721,180],[720,139],[724,181],[728,182],[727,158],[729,183],[730,158],[731,184],[737,185],[736,139],[735,186],[738,126],[739,187],[745,188],[744,139],[743,189],[746,190],[747,191],[748,192],[750,193],[749,139],[751,194],[752,148],[753,195],[765,196],[766,197],[768,198],[764,199],[763,139],[757,200],[756,139],[767,198],[769,201],[760,202],[759,139],[762,203],[761,139],[755,204],[754,139],[758,131],[771,205],[770,139],[772,206],[773,148],[774,139],[775,207],[776,126],[777,208],[780,209],[779,139],[781,210],[782,148],[783,139],[784,211],[786,212],[785,148],[787,213],[788,126],[789,214],[791,215],[790,139],[792,216],[794,217],[793,148],[795,218],[675,219],[674,220],[676,221],[673,131],[671,131],[672,126],[796,126],[797,222],[799,223],[798,148],[800,224],[801,148],[802,225],[741,226],[740,148],[742,227],[803,228],[804,229],[807,230],[805,231],[806,231],[808,232],[810,233],[809,139],[811,234],[984,235],[815,236],[814,237],[813,238],[812,131],[734,239],[733,240],[732,139],[663,241],[661,242],[660,139],[656,243],[655,139],[654,244],[653,139],[652,245],[651,139],[659,148],[658,246],[657,139],[662,247],[817,248],[816,249],[825,250],[823,251],[824,139],[818,131],[827,252],[826,148],[832,253],[831,254],[828,139],[830,255],[829,256],[625,257],[624,148],[834,258],[833,259],[837,260],[835,148],[836,139],[840,261],[838,148],[839,139],[851,262],[850,263],[848,131],[842,264],[841,139],[843,148],[845,265],[844,139],[847,266],[846,139],[849,126],[854,267],[853,268],[852,148],[856,269],[855,139],[859,270],[858,271],[857,139],[861,272],[860,273],[864,274],[863,275],[862,139],[867,276],[866,277],[865,139],[870,278],[869,279],[868,139],[873,280],[872,281],[871,148],[874,126],[877,282],[876,283],[875,139],[778,284],[726,285],[725,139],[880,286],[879,287],[878,139],[682,288],[681,289],[678,290],[679,148],[677,139],[680,126],[883,291],[882,292],[881,126],[886,293],[885,294],[884,139],[890,295],[889,296],[888,139],[887,186],[896,297],[894,298],[893,139],[892,299],[891,139],[895,126],[899,300],[898,301],[897,139],[902,302],[901,303],[900,139],[905,304],[904,305],[903,139],[687,126],[688,306],[685,307],[669,308],[668,139],[683,309],[670,139],[686,148],[684,310],[908,139],[909,311],[907,312],[906,139],[912,313],[911,314],[910,315],[923,316],[916,317],[915,139],[922,318],[921,318],[920,319],[919,139],[914,320],[913,139],[918,321],[917,139],[925,322],[924,148],[928,323],[927,324],[926,139],[931,325],[930,326],[929,148],[937,327],[933,328],[932,139],[934,126],[936,329],[935,139],[941,330],[940,331],[939,139],[938,186],[944,332],[943,333],[942,139],[955,334],[951,335],[950,336],[954,337],[953,336],[945,139],[947,338],[946,336],[949,339],[948,336],[952,340],[957,341],[633,158],[956,148],[821,342],[820,343],[822,344],[819,186],[960,345],[959,346],[958,139],[964,347],[963,348],[962,349],[961,139],[967,350],[966,351],[965,352],[973,353],[972,354],[969,139],[970,355],[971,356],[968,126],[979,357],[976,358],[975,139],[978,359],[974,148],[977,131],[666,360],[667,361],[665,360],[664,126],[981,362],[980,148],[983,363],[982,158],[1388,364],[1389,365],[1387,366],[1386,367],[1380,368],[1379,367],[1404,369],[1384,370],[1383,367],[1385,371],[1382,372],[1381,367],[1392,373],[1393,374],[1391,375],[1390,367],[1405,376],[1394,373],[1395,377],[1374,378],[1373,367],[1378,379],[1377,380],[1376,367],[1375,131],[1397,381],[1396,364],[1400,382],[1399,383],[1398,367],[1403,384],[1402,385],[1401,367],[1406,386],[1363,131],[1364,387],[1365,387],[1366,131],[1367,387],[1368,387],[1369,131],[1372,388],[1370,131],[1371,131],[1230,389],[1173,126],[1174,131],[1176,390],[1177,131],[1178,131],[1179,131],[1183,126],[1222,131],[1180,131],[1181,131],[1221,126],[1229,131],[1228,131],[1182,131],[1184,131],[1223,126],[1185,131],[1214,131],[1211,131],[1212,126],[1213,391],[1216,126],[1186,131],[1187,131],[1220,126],[1210,131],[1188,131],[1189,126],[1190,126],[1191,131],[1192,392],[1215,131],[1175,131],[1194,126],[1195,126],[1196,126],[1224,131],[1218,131],[1199,131],[1197,131],[1227,131],[1198,131],[1200,390],[1202,126],[1201,126],[1203,126],[1193,392],[1219,131],[1204,126],[1226,131],[1225,131],[1205,131],[1206,131],[1217,131],[1207,131],[1208,131],[1209,131],[1165,126],[1166,131],[1172,393],[1167,131],[1168,131],[1169,131],[1170,131],[1171,131],[985,394],[986,395],[989,396],[990,397],[987,398],[988,396],[611,399],[607,400],[605,401],[579,400],[608,400],[610,402],[606,403],[609,126],[572,131],[577,131],[599,404],[601,405],[574,406],[578,131],[600,407],[575,131],[576,408],[598,409],[573,131],[603,131],[602,131],[604,410],[587,411],[596,412],[593,413],[597,414],[583,415],[584,416],[586,417],[585,131],[594,418],[595,412],[571,131],[582,131],[561,126],[562,131],[554,126],[558,126],[555,126],[567,131],[557,131],[569,126],[556,131],[560,131],[566,131],[570,419],[568,126],[564,131],[563,131],[559,131],[565,126],[274,131],[1748,420],[1751,421],[1750,422],[1749,423],[1747,424],[1743,425],[1746,426],[1745,427],[1744,428],[1742,424],[1757,429],[1756,430],[1755,431],[1754,432],[1753,433],[1752,434],[1643,435],[1642,436],[1631,437],[1632,438],[1624,439],[1625,439],[1644,440],[1629,441],[1627,442],[1628,439],[1630,439],[1634,443],[1640,441],[1636,439],[1639,441],[1641,439],[1635,131],[1638,131],[1633,444],[1637,131],[1652,445],[1647,446],[1646,447],[1645,131],[1651,448],[1764,131],[1800,449],[1798,450],[1791,451],[1790,452],[1792,453],[1794,454],[1793,452],[1796,455],[1795,456],[1799,457],[1797,458],[1568,131],[1567,131],[1789,459],[1788,460],[1787,461],[1660,462],[1659,463],[1665,464],[1666,464],[1683,465],[1682,131],[1662,466],[1661,467],[1681,468],[1680,131],[1664,469],[1663,131],[1677,470],[1676,463],[1670,471],[1669,131],[1668,472],[1667,463],[1672,473],[1671,131],[1679,474],[1678,475],[1684,131],[1685,476],[1673,446],[1675,477],[1674,478],[1656,131],[1654,131],[1653,448],[1655,479],[1657,131],[1803,131],[1658,131],[1786,480],[1771,481],[1770,131],[1772,482],[1765,483],[1773,484],[1694,485],[1693,131],[1769,486],[1768,131],[1785,460],[1775,487],[1784,488],[1767,489],[1766,490],[1774,131],[1781,491],[1778,460],[1782,131],[1783,492],[1780,493],[1779,491],[1776,494],[1777,495],[336,496],[333,131],[1811,131],[1648,131],[1650,497],[1003,498],[1002,131],[1001,499],[1818,500],[1817,501],[1649,131],[1145,502],[1146,503],[1144,504],[1147,505],[1148,506],[1149,507],[1150,508],[1151,509],[1152,510],[1153,511],[1154,512],[1155,513],[1156,514],[1004,499],[59,515],[60,515],[62,516],[63,517],[64,518],[65,519],[66,520],[67,521],[68,522],[69,523],[70,524],[71,525],[72,525],[74,526],[73,527],[75,526],[76,528],[77,529],[61,530],[111,131],[78,531],[79,532],[80,533],[112,534],[81,535],[82,536],[83,537],[84,538],[85,539],[86,540],[87,541],[88,542],[89,543],[90,544],[91,544],[92,545],[93,546],[95,547],[94,548],[96,549],[97,550],[98,131],[99,551],[100,552],[101,553],[102,554],[1569,528],[103,555],[104,556],[105,557],[106,558],[107,559],[108,560],[109,561],[110,562],[50,131],[117,563],[118,564],[116,126],[114,565],[115,566],[48,131],[52,567],[1123,126],[340,131],[51,131],[1000,131],[1362,131],[413,568],[404,131],[405,131],[406,131],[407,131],[408,131],[409,131],[410,131],[411,131],[412,131],[1598,131],[1599,569],[1133,126],[1095,570],[1094,571],[1122,570],[1096,572],[1097,572],[1098,572],[1099,572],[1100,572],[1101,572],[1120,572],[1102,572],[1103,572],[1121,573],[1119,572],[1104,572],[1105,572],[1107,574],[1108,572],[1109,572],[1110,572],[1118,572],[1111,572],[1112,572],[1113,572],[1114,572],[1115,572],[1116,572],[1117,572],[1125,575],[1124,576],[1127,577],[1128,578],[1130,579],[1126,580],[1129,131],[1106,572],[1740,581],[1697,131],[1699,582],[1698,583],[1703,584],[1738,585],[1735,586],[1737,587],[1700,586],[1701,588],[1705,588],[1704,589],[1702,590],[1736,591],[1734,586],[1739,592],[1732,131],[1733,131],[1706,593],[1711,586],[1713,586],[1708,586],[1709,593],[1715,586],[1716,594],[1707,586],[1712,586],[1714,586],[1710,586],[1730,595],[1729,586],[1731,596],[1725,586],[1727,586],[1726,586],[1722,586],[1728,597],[1723,586],[1724,598],[1717,586],[1718,586],[1719,586],[1720,586],[1721,586],[1335,131],[1686,131],[1301,599],[1259,600],[1260,600],[1261,601],[1262,600],[1264,602],[1263,600],[1265,600],[1266,600],[1267,603],[1241,604],[1268,131],[1269,131],[1270,605],[1238,131],[1257,606],[1258,607],[1253,131],[1244,608],[1271,609],[1272,610],[1252,611],[1256,612],[1255,613],[1273,131],[1254,614],[1274,615],[1250,616],[1277,617],[1276,618],[1245,616],[1278,619],[1288,604],[1246,131],[1275,620],[1299,621],[1282,622],[1279,623],[1280,624],[1281,625],[1290,626],[1249,599],[1283,131],[1284,131],[1285,627],[1286,131],[1287,628],[1289,629],[1298,630],[1291,631],[1293,632],[1292,631],[1294,631],[1295,633],[1296,634],[1297,635],[1300,636],[1243,604],[1240,131],[1247,131],[1242,131],[1251,637],[1248,638],[1239,131],[527,639],[528,639],[529,639],[535,640],[530,639],[531,639],[532,639],[533,639],[534,639],[518,641],[517,131],[536,642],[524,131],[520,643],[511,131],[510,131],[512,131],[513,639],[514,644],[526,645],[515,639],[516,639],[521,646],[522,647],[523,639],[519,131],[525,131],[374,131],[493,648],[497,648],[496,648],[494,648],[495,648],[498,648],[377,648],[389,648],[378,648],[391,648],[393,648],[387,648],[386,648],[388,648],[392,648],[394,648],[379,648],[390,648],[380,648],[382,649],[383,648],[384,648],[385,648],[401,648],[400,648],[501,650],[395,648],[397,648],[396,648],[398,648],[399,648],[500,648],[499,648],[402,648],[484,648],[483,648],[414,651],[415,651],[417,648],[461,648],[482,648],[418,651],[462,648],[459,648],[463,648],[419,648],[420,648],[421,651],[464,648],[458,651],[416,651],[465,648],[422,651],[466,648],[446,648],[423,651],[424,648],[425,648],[456,651],[428,648],[427,648],[467,648],[468,648],[469,651],[430,648],[432,648],[433,648],[439,648],[440,648],[434,651],[470,648],[457,651],[435,648],[436,648],[471,648],[437,648],[429,651],[472,648],[455,648],[473,648],[438,651],[441,648],[442,648],[460,651],[474,648],[475,648],[454,652],[431,648],[476,651],[477,648],[478,648],[479,648],[480,651],[443,648],[481,648],[447,648],[444,651],[445,651],[426,648],[448,648],[451,648],[449,648],[450,648],[403,648],[491,648],[485,648],[486,648],[488,648],[489,648],[487,648],[492,648],[490,648],[376,653],[509,654],[507,655],[508,656],[506,657],[505,648],[504,658],[373,131],[375,131],[371,131],[502,131],[503,659],[381,653],[372,131],[549,131],[1160,131],[1762,660],[1741,661],[1695,662],[1763,663],[49,131],[329,664],[328,665],[327,131],[1138,666],[1137,667],[1135,668],[1136,669],[1413,670],[1414,671],[1412,131],[1591,526],[1816,672],[1761,673],[1760,674],[1759,675],[1758,676],[1045,677],[1043,678],[1044,679],[1814,680],[1813,501],[1815,681],[1810,131],[453,682],[452,131],[1007,683],[1006,684],[1032,685],[1031,686],[1034,687],[1033,688],[1036,689],[1035,690],[1077,691],[1051,692],[1052,693],[1053,693],[1054,693],[1055,693],[1056,693],[1057,693],[1058,693],[1059,693],[1060,693],[1061,693],[1075,694],[1062,693],[1063,693],[1064,693],[1065,693],[1066,693],[1067,693],[1068,693],[1069,693],[1071,693],[1072,693],[1070,693],[1073,693],[1074,693],[1076,693],[1050,695],[1030,696],[1010,697],[1011,697],[1012,697],[1013,697],[1014,697],[1015,697],[1016,698],[1018,697],[1017,697],[1029,699],[1019,697],[1021,697],[1020,697],[1023,697],[1022,697],[1024,697],[1025,697],[1026,697],[1027,697],[1028,697],[1009,697],[1008,700],[1005,131],[58,701],[277,702],[282,703],[284,704],[136,705],[151,706],[247,707],[250,708],[214,709],[222,710],[206,711],[248,712],[137,713],[181,131],[182,714],[205,131],[249,715],[158,716],[138,717],[162,716],[152,716],[123,716],[204,718],[128,131],[201,719],[1322,720],[199,721],[1323,722],[187,131],[202,723],[302,724],[210,126],[301,131],[299,131],[300,725],[203,126],[192,726],[200,727],[217,728],[218,729],[209,131],[188,730],[207,731],[208,126],[294,732],[297,733],[169,734],[168,735],[167,736],[305,126],[166,737],[143,131],[308,131],[542,738],[1342,738],[541,131],[311,131],[310,126],[312,739],[119,131],[242,131],[150,740],[121,741],[265,131],[266,131],[268,131],[271,742],[267,131],[269,743],[270,743],[149,131],[276,737],[285,744],[289,745],[132,746],[194,747],[193,131],[213,748],[211,131],[212,131],[216,749],[190,750],[131,751],[156,752],[239,753],[124,754],[130,755],[120,707],[252,756],[263,757],[251,131],[262,758],[157,131],[141,759],[231,760],[230,131],[238,761],[232,762],[236,763],[237,764],[235,762],[234,764],[233,762],[178,765],[163,765],[225,766],[164,766],[126,767],[125,131],[229,768],[228,769],[227,770],[226,771],[127,772],[198,773],[215,774],[197,775],[221,776],[223,777],[220,775],[159,772],[113,131],[240,778],[183,779],[261,780],[186,781],[256,782],[139,131],[257,783],[259,784],[260,785],[255,131],[254,754],[160,786],[241,787],[264,788],[133,131],[135,131],[140,789],[224,790],[129,791],[134,131],[185,792],[184,793],[142,794],[191,795],[189,796],[144,797],[146,798],[309,131],[145,799],[147,800],[279,131],[280,131],[278,131],[281,131],[307,131],[148,801],[196,126],[57,131],[219,802],[170,131],[180,803],[287,126],[293,804],[177,126],[291,126],[176,805],[273,806],[175,804],[122,131],[295,807],[173,126],[174,126],[165,131],[179,131],[172,808],[171,809],[161,810],[155,811],[258,131],[154,812],[153,131],[283,131],[195,126],[275,813],[47,131],[56,814],[53,126],[54,131],[55,131],[253,557],[246,815],[245,131],[244,816],[243,131],[286,817],[288,818],[290,819],[543,820],[1343,821],[292,822],[1324,823],[317,824],[296,825],[316,826],[298,827],[303,828],[304,829],[306,830],[313,831],[315,131],[314,424],[272,832],[1597,131],[1607,131],[1577,833],[1573,834],[1574,835],[1571,131],[1576,836],[1575,837],[1603,838],[1595,839],[1593,840],[1579,841],[1572,842],[1581,131],[1580,839],[1594,842],[1588,843],[1623,844],[1570,424],[1606,439],[1609,845],[1604,846],[1605,847],[1620,131],[1590,848],[1589,131],[1586,849],[1622,850],[1615,851],[1584,852],[1616,853],[1587,854],[1619,855],[1618,856],[1601,857],[1617,858],[1614,859],[1621,131],[1600,860],[1610,861],[1608,862],[1596,131],[1585,863],[1583,864],[1602,865],[1582,866],[1578,131],[1592,867],[1612,131],[1611,131],[1613,131],[1042,868],[1039,869],[1040,131],[1041,131],[1037,131],[1038,870],[1432,131],[1435,871],[1433,131],[1434,131],[1415,872],[1416,872],[1421,873],[1422,874],[1430,875],[1423,876],[1425,877],[1424,878],[1426,879],[1427,880],[1429,881],[1428,878],[1431,882],[1418,883],[1420,884],[1419,879],[1417,131],[342,131],[357,885],[358,885],[370,886],[359,887],[360,888],[355,889],[353,890],[344,131],[348,891],[352,892],[350,893],[356,894],[345,895],[346,896],[347,897],[349,898],[351,899],[354,900],[361,887],[362,887],[363,887],[364,885],[365,887],[366,887],[343,887],[367,131],[369,901],[368,887],[994,126],[1092,902],[1091,903],[1340,126],[992,904],[326,131],[1093,905],[1084,906],[1083,907],[1690,908],[1689,909],[1687,910],[1688,131],[545,911],[330,126],[331,912],[1807,913],[1806,914],[1805,131],[1804,131],[1691,131],[1080,915],[1079,131],[319,131],[44,131],[45,131],[8,131],[10,131],[9,131],[2,131],[11,131],[12,131],[13,131],[14,131],[15,131],[16,131],[17,131],[18,131],[3,131],[4,131],[19,131],[23,131],[20,131],[21,131],[22,131],[24,131],[25,131],[26,131],[5,131],[27,131],[28,131],[29,131],[30,131],[6,131],[34,131],[31,131],[32,131],[33,131],[35,131],[7,131],[36,131],[41,131],[42,131],[37,131],[38,131],[39,131],[40,131],[1,131],[43,131],[1626,131],[1082,916],[1078,131],[1081,917],[1086,918],[1085,499],[1088,919],[1087,920],[1090,921],[1089,922],[1696,131],[1314,923],[1312,924],[1311,131],[1313,924],[1047,925],[1046,499],[1049,926],[1048,927],[1692,928],[1543,929],[1542,930],[1491,931],[1504,932],[1466,131],[1518,933],[1520,934],[1519,934],[1493,935],[1492,131],[1494,936],[1521,937],[1525,938],[1523,938],[1502,939],[1501,131],[1510,937],[1469,937],[1497,131],[1538,940],[1513,941],[1515,942],[1533,937],[1468,943],[1485,944],[1500,131],[1535,131],[1506,945],[1522,938],[1526,946],[1524,947],[1539,131],[1508,131],[1482,943],[1474,131],[1473,948],[1498,937],[1499,937],[1472,949],[1505,131],[1467,131],[1484,131],[1512,131],[1540,950],[1479,937],[1480,951],[1527,934],[1529,952],[1528,952],[1464,131],[1483,131],[1490,131],[1481,937],[1511,131],[1478,131],[1537,131],[1477,131],[1475,953],[1476,131],[1514,131],[1507,131],[1534,954],[1488,948],[1486,948],[1487,948],[1503,131],[1470,131],[1530,938],[1532,946],[1531,947],[1517,131],[1516,955],[1509,131],[1496,131],[1536,131],[1541,131],[1465,131],[1495,131],[1489,131],[1471,948]],"semanticDiagnosticsPerFile":[46,318,1801,1802,1308,1320,1318,1321,1326,1446,1237,1454,1448,1449,1457,1549,1459,1460,1551,1562,1559,1552,1565,1556,1554,548,1307,1302,325,1304,1305,1561,1558,1564,1555,1317,1315,1319,1316,1411,1233,337,1441,1437,1442,1444,1407,1436,1140,1331,1333,997,339,1330,1332,341,1328,338,1329,540,1445,1231,1409,1361,1345,1341,1339,1359,1356,1357,1336,1348,1355,1352,1353,1351,1349,1360,1346,1410,1334,547,1236,1306,1132,1162,553,552,993,551,1447,1453,1438,1566,1452,1546,1439,1456,1440,998,1458,1548,1134,1234,1164,1235,1131,1163,1550,1161,324,1808,321,322,320,332,1325,1347,1450,550,1553,1560,1557,1563,1443,1232,1451,1142,1461,1338,1337,1358,1354,1350,1159,1143,1462,1455,995,1344,1158,1408,1139,1157,1309,1141,1463,1310,546,544,323,991,1547,996,1327,1303,999,335,334,581,590,592,589,591,588,580,538,539,537,1545,1544,1809,1812,620,612,617,616,615,614,619,618,613,621,622,626,623,627,628,629,631,630,632,634,635,646,645,643,644,642,637,636,638,647,639,641,640,648,649,650,689,690,693,692,691,694,695,696,698,697,699,701,700,702,703,713,704,705,712,711,706,707,708,709,710,715,714,716,718,717,719,723,722,721,720,724,728,727,729,730,731,737,736,735,738,739,745,744,743,746,747,748,750,749,751,752,753,765,766,768,764,763,757,756,767,769,760,759,762,761,755,754,758,771,770,772,773,774,775,776,777,780,779,781,782,783,784,786,785,787,788,789,791,790,792,794,793,795,675,674,676,673,671,672,796,797,799,798,800,801,802,741,740,742,803,804,807,805,806,808,810,809,811,984,815,814,813,812,734,733,732,663,661,660,656,655,654,653,652,651,659,658,657,662,817,816,825,823,824,818,827,826,832,831,828,830,829,625,624,834,833,837,835,836,840,838,839,851,850,848,842,841,843,845,844,847,846,849,854,853,852,856,855,859,858,857,861,860,864,863,862,867,866,865,870,869,868,873,872,871,874,877,876,875,778,726,725,880,879,878,682,681,678,679,677,680,883,882,881,886,885,884,890,889,888,887,896,894,893,892,891,895,899,898,897,902,901,900,905,904,903,687,688,685,669,668,683,670,686,684,908,909,907,906,912,911,910,923,916,915,922,921,920,919,914,913,918,917,925,924,928,927,926,931,930,929,937,933,932,934,936,935,941,940,939,938,944,943,942,955,951,950,954,953,945,947,946,949,948,952,957,633,956,821,820,822,819,960,959,958,964,963,962,961,967,966,965,973,972,969,970,971,968,979,976,975,978,974,977,666,667,665,664,981,980,983,982,1388,1389,1387,1386,1380,1379,1404,1384,1383,1385,1382,1381,1392,1393,1391,1390,1405,1394,1395,1374,1373,1378,1377,1376,1375,1397,1396,1400,1399,1398,1403,1402,1401,1406,1363,1364,1365,1366,1367,1368,1369,1372,1370,1371,1230,1173,1174,1176,1177,1178,1179,1183,1222,1180,1181,1221,1229,1228,1182,1184,1223,1185,1214,1211,1212,1213,1216,1186,1187,1220,1210,1188,1189,1190,1191,1192,1215,1175,1194,1195,1196,1224,1218,1199,1197,1227,1198,1200,1202,1201,1203,1193,1219,1204,1226,1225,1205,1206,1217,1207,1208,1209,1165,1166,1172,1167,1168,1169,1170,1171,985,986,989,990,987,988,611,607,605,579,608,610,606,609,572,577,599,601,574,578,600,575,576,598,573,603,602,604,587,596,593,597,583,584,586,585,594,595,571,582,561,562,554,558,555,567,557,569,556,560,566,570,568,564,563,559,565,274,1748,1751,1750,1749,1747,1743,1746,1745,1744,1742,1757,1756,1755,1754,1753,1752,1643,1642,1631,1632,1624,1625,1644,1629,1627,1628,1630,1634,1640,1636,1639,1641,1635,1638,1633,1637,1652,1647,1646,1645,1651,1764,1800,1798,1791,1790,1792,1794,1793,1796,1795,1799,1797,1568,1567,1789,1788,1787,1660,1659,1665,1666,1683,1682,1662,1661,1681,1680,1664,1663,1677,1676,1670,1669,1668,1667,1672,1671,1679,1678,1684,1685,1673,1675,1674,1656,1654,1653,1655,1657,1803,1658,1786,1771,1770,1772,1765,1773,1694,1693,1769,1768,1785,1775,1784,1767,1766,1774,1781,1778,1782,1783,1780,1779,1776,1777,336,333,1811,1648,1650,1003,1002,1001,1818,1817,1649,1145,1146,1144,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1004,59,60,62,63,64,65,66,67,68,69,70,71,72,74,73,75,76,77,61,111,78,79,80,112,81,82,83,84,85,86,87,88,89,90,91,92,93,95,94,96,97,98,99,100,101,102,1569,103,104,105,106,107,108,109,110,50,117,118,116,114,115,48,52,1123,340,51,1000,1362,413,404,405,406,407,408,409,410,411,412,1598,1599,1133,1095,1094,1122,1096,1097,1098,1099,1100,1101,1120,1102,1103,1121,1119,1104,1105,1107,1108,1109,1110,1118,1111,1112,1113,1114,1115,1116,1117,1125,1124,1127,1128,1130,1126,1129,1106,1740,1697,1699,1698,1703,1738,1735,1737,1700,1701,1705,1704,1702,1736,1734,1739,1732,1733,1706,1711,1713,1708,1709,1715,1716,1707,1712,1714,1710,1730,1729,1731,1725,1727,1726,1722,1728,1723,1724,1717,1718,1719,1720,1721,1335,1686,1301,1259,1260,1261,1262,1264,1263,1265,1266,1267,1241,1268,1269,1270,1238,1257,1258,1253,1244,1271,1272,1252,1256,1255,1273,1254,1274,1250,1277,1276,1245,1278,1288,1246,1275,1299,1282,1279,1280,1281,1290,1249,1283,1284,1285,1286,1287,1289,1298,1291,1293,1292,1294,1295,1296,1297,1300,1243,1240,1247,1242,1251,1248,1239,527,528,529,535,530,531,532,533,534,518,517,536,524,520,511,510,512,513,514,526,515,516,521,522,523,519,525,374,493,497,496,494,495,498,377,389,378,391,393,387,386,388,392,394,379,390,380,382,383,384,385,401,400,501,395,397,396,398,399,500,499,402,484,483,414,415,417,461,482,418,462,459,463,419,420,421,464,458,416,465,422,466,446,423,424,425,456,428,427,467,468,469,430,432,433,439,440,434,470,457,435,436,471,437,429,472,455,473,438,441,442,460,474,475,454,431,476,477,478,479,480,443,481,447,444,445,426,448,451,449,450,403,491,485,486,488,489,487,492,490,376,509,507,508,506,505,504,373,375,371,502,503,381,372,549,1160,1762,1741,1695,1763,49,329,328,327,1138,1137,1135,1136,1413,1414,1412,1591,1816,1761,1760,1759,1758,1045,1043,1044,1814,1813,1815,1810,453,452,1007,1006,1032,1031,1034,1033,1036,1035,1077,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1075,1062,1063,1064,1065,1066,1067,1068,1069,1071,1072,1070,1073,1074,1076,1050,1030,1010,1011,1012,1013,1014,1015,1016,1018,1017,1029,1019,1021,1020,1023,1022,1024,1025,1026,1027,1028,1009,1008,1005,58,277,282,284,136,151,247,250,214,222,206,248,137,181,182,205,249,158,138,162,152,123,204,128,201,1322,199,1323,187,202,302,210,301,299,300,203,192,200,217,218,209,188,207,208,294,297,169,168,167,305,166,143,308,542,1342,541,311,310,312,119,242,150,121,265,266,268,271,267,269,270,149,276,285,289,132,194,193,213,211,212,216,190,131,156,239,124,130,120,252,263,251,262,157,141,231,230,238,232,236,237,235,234,233,178,163,225,164,126,125,229,228,227,226,127,198,215,197,221,223,220,159,113,240,183,261,186,256,139,257,259,260,255,254,160,241,264,133,135,140,224,129,134,185,184,142,191,189,144,146,309,145,147,279,280,278,281,307,148,196,57,219,170,180,287,293,177,291,176,273,175,122,295,173,174,165,179,172,171,161,155,258,154,153,283,195,275,47,56,53,54,55,253,246,245,244,243,286,288,290,543,1343,292,1324,317,296,316,298,303,304,306,313,315,314,272,1597,1607,1577,1573,1574,1571,1576,1575,1603,1595,1593,1579,1572,1581,1580,1594,1588,1623,1570,1606,1609,1604,1605,1620,1590,1589,1586,1622,1615,1584,1616,1587,1619,1618,1601,1617,1614,1621,1600,1610,1608,1596,1585,1583,1602,1582,1578,1592,1612,1611,1613,1042,1039,1040,1041,1037,1038,1432,1435,1433,1434,1415,1416,1421,1422,1430,1423,1425,1424,1426,1427,1429,1428,1431,1418,1420,1419,1417,342,357,358,370,359,360,355,353,344,348,352,350,356,345,346,347,349,351,354,361,362,363,364,365,366,343,367,369,368,994,1092,1091,1340,992,326,1093,1084,1083,1690,1689,1687,1688,545,330,331,1807,1806,1805,1804,1691,1080,1079,319,44,45,8,10,9,2,11,12,13,14,15,16,17,18,3,4,19,23,20,21,22,24,25,26,5,27,28,29,30,6,34,31,32,33,35,7,36,41,42,37,38,39,40,1,43,1626,1082,1078,1081,1086,1085,1088,1087,1090,1089,1696,1314,1312,1311,1313,1047,1046,1049,1048,1692,1543,1542,1491,1504,1466,1518,1520,1519,1493,1492,1494,1521,1525,1523,1502,1501,1510,1469,1497,1538,1513,1515,1533,1468,1485,1500,1535,1506,1522,1526,1524,1539,1508,1482,1474,1473,1498,1499,1472,1505,1467,1484,1512,1540,1479,1480,1527,1529,1528,1464,1483,1490,1481,1511,1478,1537,1477,1475,1476,1514,1507,1534,1488,1486,1487,1503,1470,1530,1532,1531,1517,1516,1509,1496,1536,1541,1465,1495,1489,1471],"affectedFilesPendingEmit":[1801,1802,1308,1320,1318,1321,1326,1446,1237,1454,1448,1449,1457,1549,1459,1460,1551,1562,1559,1552,1565,1556,1554,548,1307,1302,325,1304,1305,1561,1558,1564,1555,1317,1315,1319,1316,1411,1233,337,1441,1437,1442,1444,1407,1436,1140,1331,1333,997,339,1330,1332,341,1328,338,1329,540,1445,1231,1409,1361,1345,1341,1339,1359,1356,1357,1336,1348,1355,1352,1353,1351,1349,1360,1346,1410,1334,547,1236,1306,1132,1162,553,552,993,551,1447,1453,1438,1566,1452,1546,1439,1456,1440,998,1458,1548,1134,1234,1164,1235,1131,1163,1550,1161,324,1808,321,322,320,332,1325,1347,1450,550,1553,1560,1557,1563,1443,1232,1451,1142,1461,1338,1337,1358,1354,1350,1159,1143,1462,1455,995,1344,1158,1408,1139,1157,1309,1141,1463,1310,546,544,323,991,1547,996,1327,1303,999]},"version":"5.3.3"} \ No newline at end of file +{"program":{"fileNames":["../../node_modules/typescript/lib/lib.es5.d.ts","../../node_modules/typescript/lib/lib.es2015.d.ts","../../node_modules/typescript/lib/lib.es2016.d.ts","../../node_modules/typescript/lib/lib.es2017.d.ts","../../node_modules/typescript/lib/lib.es2018.d.ts","../../node_modules/typescript/lib/lib.es2019.d.ts","../../node_modules/typescript/lib/lib.es2020.d.ts","../../node_modules/typescript/lib/lib.dom.d.ts","../../node_modules/typescript/lib/lib.es2015.core.d.ts","../../node_modules/typescript/lib/lib.es2015.collection.d.ts","../../node_modules/typescript/lib/lib.es2015.generator.d.ts","../../node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../node_modules/typescript/lib/lib.es2015.promise.d.ts","../../node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../node_modules/typescript/lib/lib.es2017.date.d.ts","../../node_modules/typescript/lib/lib.es2017.object.d.ts","../../node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2017.string.d.ts","../../node_modules/typescript/lib/lib.es2017.intl.d.ts","../../node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../node_modules/typescript/lib/lib.es2018.intl.d.ts","../../node_modules/typescript/lib/lib.es2018.promise.d.ts","../../node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../node_modules/typescript/lib/lib.es2019.array.d.ts","../../node_modules/typescript/lib/lib.es2019.object.d.ts","../../node_modules/typescript/lib/lib.es2019.string.d.ts","../../node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../node_modules/typescript/lib/lib.es2019.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../node_modules/typescript/lib/lib.es2020.date.d.ts","../../node_modules/typescript/lib/lib.es2020.promise.d.ts","../../node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../node_modules/typescript/lib/lib.es2020.string.d.ts","../../node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../node_modules/typescript/lib/lib.es2020.intl.d.ts","../../node_modules/typescript/lib/lib.es2020.number.d.ts","../../node_modules/typescript/lib/lib.esnext.intl.d.ts","../../node_modules/typescript/lib/lib.decorators.d.ts","../../node_modules/typescript/lib/lib.decorators.legacy.d.ts","./index.d.ts","../../node_modules/next/dist/styled-jsx/types/css.d.ts","../../node_modules/@types/react/global.d.ts","../../node_modules/csstype/index.d.ts","../../node_modules/@types/prop-types/index.d.ts","../../node_modules/@types/scheduler/tracing.d.ts","../../node_modules/@types/react/index.d.ts","../../node_modules/next/dist/styled-jsx/types/index.d.ts","../../node_modules/next/dist/styled-jsx/types/macro.d.ts","../../node_modules/next/dist/styled-jsx/types/style.d.ts","../../node_modules/next/dist/styled-jsx/types/global.d.ts","../../node_modules/next/dist/shared/lib/amp.d.ts","../../node_modules/next/amp.d.ts","../../node_modules/@types/node/assert.d.ts","../../node_modules/@types/node/assert/strict.d.ts","../../node_modules/@types/node/globals.d.ts","../../node_modules/@types/node/async_hooks.d.ts","../../node_modules/@types/node/buffer.d.ts","../../node_modules/@types/node/child_process.d.ts","../../node_modules/@types/node/cluster.d.ts","../../node_modules/@types/node/console.d.ts","../../node_modules/@types/node/constants.d.ts","../../node_modules/@types/node/crypto.d.ts","../../node_modules/@types/node/dgram.d.ts","../../node_modules/@types/node/diagnostics_channel.d.ts","../../node_modules/@types/node/dns.d.ts","../../node_modules/@types/node/dns/promises.d.ts","../../node_modules/@types/node/domain.d.ts","../../node_modules/@types/node/dom-events.d.ts","../../node_modules/@types/node/events.d.ts","../../node_modules/@types/node/fs.d.ts","../../node_modules/@types/node/fs/promises.d.ts","../../node_modules/@types/node/http.d.ts","../../node_modules/@types/node/http2.d.ts","../../node_modules/@types/node/https.d.ts","../../node_modules/@types/node/inspector.d.ts","../../node_modules/@types/node/module.d.ts","../../node_modules/@types/node/net.d.ts","../../node_modules/@types/node/os.d.ts","../../node_modules/@types/node/path.d.ts","../../node_modules/@types/node/perf_hooks.d.ts","../../node_modules/@types/node/process.d.ts","../../node_modules/@types/node/punycode.d.ts","../../node_modules/@types/node/querystring.d.ts","../../node_modules/@types/node/readline.d.ts","../../node_modules/@types/node/readline/promises.d.ts","../../node_modules/@types/node/repl.d.ts","../../node_modules/@types/node/stream.d.ts","../../node_modules/@types/node/stream/promises.d.ts","../../node_modules/@types/node/stream/consumers.d.ts","../../node_modules/@types/node/stream/web.d.ts","../../node_modules/@types/node/string_decoder.d.ts","../../node_modules/@types/node/test.d.ts","../../node_modules/@types/node/timers.d.ts","../../node_modules/@types/node/timers/promises.d.ts","../../node_modules/@types/node/tls.d.ts","../../node_modules/@types/node/trace_events.d.ts","../../node_modules/@types/node/tty.d.ts","../../node_modules/@types/node/url.d.ts","../../node_modules/@types/node/util.d.ts","../../node_modules/@types/node/v8.d.ts","../../node_modules/@types/node/vm.d.ts","../../node_modules/@types/node/wasi.d.ts","../../node_modules/@types/node/worker_threads.d.ts","../../node_modules/@types/node/zlib.d.ts","../../node_modules/@types/node/globals.global.d.ts","../../node_modules/@types/node/index.d.ts","../../node_modules/next/dist/server/get-page-files.d.ts","../../node_modules/@types/react/canary.d.ts","../../node_modules/@types/react/experimental.d.ts","../../node_modules/@types/react-dom/index.d.ts","../../node_modules/@types/react-dom/canary.d.ts","../../node_modules/@types/react-dom/experimental.d.ts","../../node_modules/next/dist/compiled/webpack/webpack.d.ts","../../node_modules/next/dist/server/config.d.ts","../../node_modules/next/dist/lib/load-custom-routes.d.ts","../../node_modules/next/dist/shared/lib/image-config.d.ts","../../node_modules/next/dist/build/webpack/plugins/subresource-integrity-plugin.d.ts","../../node_modules/next/dist/server/body-streams.d.ts","../../node_modules/next/dist/server/future/route-kind.d.ts","../../node_modules/next/dist/server/future/route-definitions/route-definition.d.ts","../../node_modules/next/dist/server/future/route-matches/route-match.d.ts","../../node_modules/next/dist/client/components/app-router-headers.d.ts","../../node_modules/next/dist/server/request-meta.d.ts","../../node_modules/next/dist/server/config-shared.d.ts","../../node_modules/next/dist/server/base-http/index.d.ts","../../node_modules/next/dist/server/api-utils/index.d.ts","../../node_modules/next/dist/server/node-environment.d.ts","../../node_modules/next/dist/server/require-hook.d.ts","../../node_modules/next/dist/server/node-polyfill-crypto.d.ts","../../node_modules/next/dist/build/analysis/get-page-static-info.d.ts","../../node_modules/next/dist/build/webpack/loaders/get-module-build-info.d.ts","../../node_modules/next/dist/build/webpack/plugins/middleware-plugin.d.ts","../../node_modules/next/dist/server/lib/revalidate.d.ts","../../node_modules/next/dist/server/render-result.d.ts","../../node_modules/next/dist/server/future/helpers/i18n-provider.d.ts","../../node_modules/next/dist/server/web/next-url.d.ts","../../node_modules/next/dist/compiled/@edge-runtime/cookies/index.d.ts","../../node_modules/next/dist/server/web/spec-extension/cookies.d.ts","../../node_modules/next/dist/server/web/spec-extension/request.d.ts","../../node_modules/next/dist/server/web/spec-extension/fetch-event.d.ts","../../node_modules/next/dist/server/web/spec-extension/response.d.ts","../../node_modules/next/dist/server/web/types.d.ts","../../node_modules/next/dist/lib/setup-exception-listeners.d.ts","../../node_modules/next/dist/lib/constants.d.ts","../../node_modules/next/dist/build/index.d.ts","../../node_modules/next/dist/build/webpack/plugins/pages-manifest-plugin.d.ts","../../node_modules/next/dist/shared/lib/router/utils/route-regex.d.ts","../../node_modules/next/dist/shared/lib/router/utils/route-matcher.d.ts","../../node_modules/next/dist/shared/lib/router/utils/parse-url.d.ts","../../node_modules/next/dist/server/base-http/node.d.ts","../../node_modules/next/dist/server/font-utils.d.ts","../../node_modules/next/dist/build/webpack/plugins/flight-manifest-plugin.d.ts","../../node_modules/next/dist/server/future/route-modules/route-module.d.ts","../../node_modules/next/dist/server/load-components.d.ts","../../node_modules/next/dist/shared/lib/router/utils/middleware-route-matcher.d.ts","../../node_modules/next/dist/build/webpack/plugins/next-font-manifest-plugin.d.ts","../../node_modules/next/dist/server/future/route-definitions/locale-route-definition.d.ts","../../node_modules/next/dist/server/future/route-definitions/pages-route-definition.d.ts","../../node_modules/next/dist/shared/lib/mitt.d.ts","../../node_modules/next/dist/client/with-router.d.ts","../../node_modules/next/dist/client/router.d.ts","../../node_modules/next/dist/client/route-loader.d.ts","../../node_modules/next/dist/client/page-loader.d.ts","../../node_modules/next/dist/shared/lib/bloom-filter.d.ts","../../node_modules/next/dist/shared/lib/router/router.d.ts","../../node_modules/next/dist/shared/lib/router-context.shared-runtime.d.ts","../../node_modules/next/dist/shared/lib/loadable-context.shared-runtime.d.ts","../../node_modules/next/dist/shared/lib/loadable.shared-runtime.d.ts","../../node_modules/next/dist/shared/lib/image-config-context.shared-runtime.d.ts","../../node_modules/next/dist/shared/lib/hooks-client-context.shared-runtime.d.ts","../../node_modules/next/dist/shared/lib/head-manager-context.shared-runtime.d.ts","../../node_modules/next/dist/server/future/route-definitions/app-page-route-definition.d.ts","../../node_modules/next/dist/shared/lib/modern-browserslist-target.d.ts","../../node_modules/next/dist/shared/lib/constants.d.ts","../../node_modules/next/dist/build/webpack/loaders/metadata/types.d.ts","../../node_modules/next/dist/build/webpack/loaders/next-app-loader.d.ts","../../node_modules/next/dist/server/lib/app-dir-module.d.ts","../../node_modules/next/dist/server/response-cache/types.d.ts","../../node_modules/next/dist/server/response-cache/index.d.ts","../../node_modules/next/dist/server/lib/incremental-cache/index.d.ts","../../node_modules/next/dist/client/components/hooks-server-context.d.ts","../../node_modules/next/dist/client/components/static-generation-async-storage.external.d.ts","../../node_modules/next/dist/server/web/spec-extension/adapters/request-cookies.d.ts","../../node_modules/next/dist/server/async-storage/draft-mode-provider.d.ts","../../node_modules/next/dist/server/web/spec-extension/adapters/headers.d.ts","../../node_modules/next/dist/client/components/request-async-storage.external.d.ts","../../node_modules/next/dist/server/app-render/create-error-handler.d.ts","../../node_modules/next/dist/server/app-render/app-render.d.ts","../../node_modules/next/dist/shared/lib/server-inserted-html.shared-runtime.d.ts","../../node_modules/next/dist/shared/lib/amp-context.shared-runtime.d.ts","../../node_modules/next/dist/server/future/route-modules/app-page/vendored/contexts/entrypoints.d.ts","../../node_modules/next/dist/server/future/route-modules/app-page/module.compiled.d.ts","../../node_modules/next/dist/client/components/error-boundary.d.ts","../../node_modules/next/dist/client/components/router-reducer/create-initial-router-state.d.ts","../../node_modules/next/dist/client/components/app-router.d.ts","../../node_modules/next/dist/client/components/layout-router.d.ts","../../node_modules/next/dist/client/components/render-from-template-context.d.ts","../../node_modules/next/dist/client/components/action-async-storage.external.d.ts","../../node_modules/next/dist/build/webpack/plugins/app-build-manifest-plugin.d.ts","../../node_modules/next/dist/build/utils.d.ts","../../node_modules/next/dist/client/components/static-generation-bailout.d.ts","../../node_modules/next/dist/client/components/static-generation-searchparams-bailout-provider.d.ts","../../node_modules/next/dist/client/components/searchparams-bailout-proxy.d.ts","../../node_modules/next/dist/client/components/not-found-boundary.d.ts","../../node_modules/next/dist/server/app-render/rsc/preloads.d.ts","../../node_modules/next/dist/server/app-render/rsc/taint.d.ts","../../node_modules/next/dist/server/app-render/entry-base.d.ts","../../node_modules/next/dist/build/templates/app-page.d.ts","../../node_modules/next/dist/server/future/route-modules/app-page/module.d.ts","../../node_modules/next/dist/server/app-render/types.d.ts","../../node_modules/next/dist/client/components/router-reducer/fetch-server-response.d.ts","../../node_modules/next/dist/client/components/router-reducer/router-reducer-types.d.ts","../../node_modules/next/dist/shared/lib/app-router-context.shared-runtime.d.ts","../../node_modules/next/dist/server/future/route-modules/pages/vendored/contexts/entrypoints.d.ts","../../node_modules/next/dist/server/future/route-modules/pages/module.compiled.d.ts","../../node_modules/next/dist/build/templates/pages.d.ts","../../node_modules/next/dist/server/future/route-modules/pages/module.d.ts","../../node_modules/next/dist/server/render.d.ts","../../node_modules/next/dist/server/future/route-definitions/pages-api-route-definition.d.ts","../../node_modules/next/dist/server/future/route-matches/pages-api-route-match.d.ts","../../node_modules/next/dist/server/future/route-matchers/route-matcher.d.ts","../../node_modules/next/dist/server/future/route-matcher-providers/route-matcher-provider.d.ts","../../node_modules/next/dist/server/future/route-matcher-managers/route-matcher-manager.d.ts","../../node_modules/next/dist/server/future/normalizers/normalizer.d.ts","../../node_modules/next/dist/server/future/normalizers/locale-route-normalizer.d.ts","../../node_modules/next/dist/server/future/normalizers/request/pathname-normalizer.d.ts","../../node_modules/next/dist/server/future/normalizers/request/suffix.d.ts","../../node_modules/next/dist/server/future/normalizers/request/rsc.d.ts","../../node_modules/next/dist/server/future/normalizers/request/prefix.d.ts","../../node_modules/next/dist/server/future/normalizers/request/postponed.d.ts","../../node_modules/next/dist/server/future/normalizers/request/prefetch-rsc.d.ts","../../node_modules/next/dist/server/future/normalizers/request/next-data.d.ts","../../node_modules/next/dist/server/base-server.d.ts","../../node_modules/next/dist/server/image-optimizer.d.ts","../../node_modules/next/dist/server/next-server.d.ts","../../node_modules/next/dist/lib/coalesced-function.d.ts","../../node_modules/next/dist/trace/types.d.ts","../../node_modules/next/dist/trace/trace.d.ts","../../node_modules/next/dist/trace/shared.d.ts","../../node_modules/next/dist/trace/index.d.ts","../../node_modules/next/dist/build/load-jsconfig.d.ts","../../node_modules/next/dist/build/webpack-config.d.ts","../../node_modules/next/dist/build/webpack/plugins/define-env-plugin.d.ts","../../node_modules/next/dist/build/swc/index.d.ts","../../node_modules/next/dist/server/dev/parse-version-info.d.ts","../../node_modules/next/dist/server/dev/hot-reloader-types.d.ts","../../node_modules/next/dist/telemetry/storage.d.ts","../../node_modules/next/dist/server/lib/types.d.ts","../../node_modules/next/dist/server/lib/router-utils/types.d.ts","../../node_modules/next/dist/server/lib/render-server.d.ts","../../node_modules/next/dist/server/lib/router-server.d.ts","../../node_modules/next/dist/shared/lib/router/utils/path-match.d.ts","../../node_modules/next/dist/server/lib/router-utils/filesystem.d.ts","../../node_modules/next/dist/server/lib/router-utils/setup-dev-bundler.d.ts","../../node_modules/next/dist/server/lib/dev-bundler-service.d.ts","../../node_modules/next/dist/server/dev/static-paths-worker.d.ts","../../node_modules/next/dist/server/dev/next-dev-server.d.ts","../../node_modules/next/dist/server/next.d.ts","../../node_modules/next/dist/lib/metadata/types/alternative-urls-types.d.ts","../../node_modules/next/dist/lib/metadata/types/extra-types.d.ts","../../node_modules/next/dist/lib/metadata/types/metadata-types.d.ts","../../node_modules/next/dist/lib/metadata/types/manifest-types.d.ts","../../node_modules/next/dist/lib/metadata/types/opengraph-types.d.ts","../../node_modules/next/dist/lib/metadata/types/twitter-types.d.ts","../../node_modules/next/dist/lib/metadata/types/metadata-interface.d.ts","../../node_modules/next/types/index.d.ts","../../node_modules/next/dist/shared/lib/html-context.shared-runtime.d.ts","../../node_modules/@next/env/dist/index.d.ts","../../node_modules/next/dist/shared/lib/utils.d.ts","../../node_modules/next/dist/pages/_app.d.ts","../../node_modules/next/app.d.ts","../../node_modules/next/dist/server/web/spec-extension/unstable-cache.d.ts","../../node_modules/next/dist/server/web/spec-extension/revalidate-path.d.ts","../../node_modules/next/dist/server/web/spec-extension/revalidate-tag.d.ts","../../node_modules/next/dist/server/web/spec-extension/unstable-no-store.d.ts","../../node_modules/next/cache.d.ts","../../node_modules/next/dist/shared/lib/runtime-config.external.d.ts","../../node_modules/next/config.d.ts","../../node_modules/next/dist/pages/_document.d.ts","../../node_modules/next/document.d.ts","../../node_modules/next/dist/shared/lib/dynamic.d.ts","../../node_modules/next/dynamic.d.ts","../../node_modules/next/dist/pages/_error.d.ts","../../node_modules/next/error.d.ts","../../node_modules/next/dist/shared/lib/head.d.ts","../../node_modules/next/head.d.ts","../../node_modules/next/dist/shared/lib/get-img-props.d.ts","../../node_modules/next/dist/client/image-component.d.ts","../../node_modules/next/dist/shared/lib/image-external.d.ts","../../node_modules/next/image.d.ts","../../node_modules/next/dist/client/link.d.ts","../../node_modules/next/link.d.ts","../../node_modules/next/dist/client/components/redirect-status-code.d.ts","../../node_modules/next/dist/client/components/redirect.d.ts","../../node_modules/next/dist/client/components/not-found.d.ts","../../node_modules/next/dist/client/components/navigation.d.ts","../../node_modules/next/navigation.d.ts","../../node_modules/next/router.d.ts","../../node_modules/next/dist/client/script.d.ts","../../node_modules/next/script.d.ts","../../node_modules/next/dist/server/web/spec-extension/user-agent.d.ts","../../node_modules/next/dist/compiled/@edge-runtime/primitives/url.d.ts","../../node_modules/next/dist/server/web/spec-extension/image-response.d.ts","../../node_modules/next/dist/compiled/@vercel/og/satori/index.d.ts","../../node_modules/next/dist/compiled/@vercel/og/emoji/index.d.ts","../../node_modules/next/dist/compiled/@vercel/og/types.d.ts","../../node_modules/next/server.d.ts","../../node_modules/next/types/global.d.ts","../../node_modules/next/types/compiled.d.ts","../../node_modules/next/index.d.ts","../../node_modules/next/image-types/global.d.ts","./next-env.d.ts","../../node_modules/tslib/tslib.d.ts","../../libraries/helpers/src/utils/custom.fetch.func.ts","../../libraries/helpers/src/subdomain/all.two.level.subdomain.ts","../../libraries/helpers/src/subdomain/subdomain.management.ts","../../libraries/react-shared-libraries/src/helpers/is.general.tsx","./src/middleware.ts","./src/components/analytics/stars.and.forks.interface.ts","../../node_modules/reflect-metadata/index.d.ts","../../node_modules/dayjs/locale/types.d.ts","../../node_modules/dayjs/locale/index.d.ts","../../node_modules/dayjs/index.d.ts","../../node_modules/swr/dist/_internal/index.d.ts","../../node_modules/swr/dist/core/index.d.ts","../../libraries/helpers/src/utils/custom.fetch.tsx","../../node_modules/@prisma/client/runtime/library.d.ts","../../node_modules/.prisma/client/index.d.ts","../../node_modules/.prisma/client/default.d.ts","../../node_modules/@prisma/client/default.d.ts","./src/components/launches/calendar.context.tsx","./src/components/launches/helpers/use.integration.ts","./src/components/launches/helpers/use.custom.provider.function.ts","../../node_modules/@types/remove-markdown/index.d.ts","./src/components/launches/helpers/use.formatting.ts","../../node_modules/react-hook-form/dist/constants.d.ts","../../node_modules/react-hook-form/dist/utils/createsubject.d.ts","../../node_modules/react-hook-form/dist/types/events.d.ts","../../node_modules/react-hook-form/dist/types/path/common.d.ts","../../node_modules/react-hook-form/dist/types/path/eager.d.ts","../../node_modules/react-hook-form/dist/types/path/index.d.ts","../../node_modules/react-hook-form/dist/types/fieldarray.d.ts","../../node_modules/react-hook-form/dist/types/resolvers.d.ts","../../node_modules/react-hook-form/dist/types/form.d.ts","../../node_modules/react-hook-form/dist/types/utils.d.ts","../../node_modules/react-hook-form/dist/types/fields.d.ts","../../node_modules/react-hook-form/dist/types/errors.d.ts","../../node_modules/react-hook-form/dist/types/validator.d.ts","../../node_modules/react-hook-form/dist/types/controller.d.ts","../../node_modules/react-hook-form/dist/types/index.d.ts","../../node_modules/react-hook-form/dist/controller.d.ts","../../node_modules/react-hook-form/dist/form.d.ts","../../node_modules/react-hook-form/dist/logic/appenderrors.d.ts","../../node_modules/react-hook-form/dist/logic/index.d.ts","../../node_modules/react-hook-form/dist/usecontroller.d.ts","../../node_modules/react-hook-form/dist/usefieldarray.d.ts","../../node_modules/react-hook-form/dist/useform.d.ts","../../node_modules/react-hook-form/dist/useformcontext.d.ts","../../node_modules/react-hook-form/dist/useformstate.d.ts","../../node_modules/react-hook-form/dist/usewatch.d.ts","../../node_modules/react-hook-form/dist/utils/get.d.ts","../../node_modules/react-hook-form/dist/utils/set.d.ts","../../node_modules/react-hook-form/dist/utils/index.d.ts","../../node_modules/react-hook-form/dist/index.d.ts","../../node_modules/class-validator/types/validation/validationerror.d.ts","../../node_modules/class-validator/types/validation/validatoroptions.d.ts","../../node_modules/class-validator/types/validation-schema/validationschema.d.ts","../../node_modules/class-validator/types/container.d.ts","../../node_modules/class-validator/types/validation/validationarguments.d.ts","../../node_modules/class-validator/types/decorator/validationoptions.d.ts","../../node_modules/class-validator/types/decorator/common/allow.d.ts","../../node_modules/class-validator/types/decorator/common/isdefined.d.ts","../../node_modules/class-validator/types/decorator/common/isoptional.d.ts","../../node_modules/class-validator/types/decorator/common/validate.d.ts","../../node_modules/class-validator/types/validation/validatorconstraintinterface.d.ts","../../node_modules/class-validator/types/decorator/common/validateby.d.ts","../../node_modules/class-validator/types/decorator/common/validateif.d.ts","../../node_modules/class-validator/types/decorator/common/validatenested.d.ts","../../node_modules/class-validator/types/decorator/common/validatepromise.d.ts","../../node_modules/class-validator/types/decorator/common/islatlong.d.ts","../../node_modules/class-validator/types/decorator/common/islatitude.d.ts","../../node_modules/class-validator/types/decorator/common/islongitude.d.ts","../../node_modules/class-validator/types/decorator/common/equals.d.ts","../../node_modules/class-validator/types/decorator/common/notequals.d.ts","../../node_modules/class-validator/types/decorator/common/isempty.d.ts","../../node_modules/class-validator/types/decorator/common/isnotempty.d.ts","../../node_modules/class-validator/types/decorator/common/isin.d.ts","../../node_modules/class-validator/types/decorator/common/isnotin.d.ts","../../node_modules/class-validator/types/decorator/number/isdivisibleby.d.ts","../../node_modules/class-validator/types/decorator/number/ispositive.d.ts","../../node_modules/class-validator/types/decorator/number/isnegative.d.ts","../../node_modules/class-validator/types/decorator/number/max.d.ts","../../node_modules/class-validator/types/decorator/number/min.d.ts","../../node_modules/class-validator/types/decorator/date/mindate.d.ts","../../node_modules/class-validator/types/decorator/date/maxdate.d.ts","../../node_modules/class-validator/types/decorator/string/contains.d.ts","../../node_modules/class-validator/types/decorator/string/notcontains.d.ts","../../node_modules/@types/validator/lib/isboolean.d.ts","../../node_modules/@types/validator/lib/isemail.d.ts","../../node_modules/@types/validator/lib/isfqdn.d.ts","../../node_modules/@types/validator/lib/isiban.d.ts","../../node_modules/@types/validator/lib/isiso31661alpha2.d.ts","../../node_modules/@types/validator/lib/isiso4217.d.ts","../../node_modules/@types/validator/lib/isiso6391.d.ts","../../node_modules/@types/validator/lib/istaxid.d.ts","../../node_modules/@types/validator/lib/isurl.d.ts","../../node_modules/@types/validator/index.d.ts","../../node_modules/class-validator/types/decorator/string/isalpha.d.ts","../../node_modules/class-validator/types/decorator/string/isalphanumeric.d.ts","../../node_modules/class-validator/types/decorator/string/isdecimal.d.ts","../../node_modules/class-validator/types/decorator/string/isascii.d.ts","../../node_modules/class-validator/types/decorator/string/isbase64.d.ts","../../node_modules/class-validator/types/decorator/string/isbytelength.d.ts","../../node_modules/class-validator/types/decorator/string/iscreditcard.d.ts","../../node_modules/class-validator/types/decorator/string/iscurrency.d.ts","../../node_modules/class-validator/types/decorator/string/isemail.d.ts","../../node_modules/class-validator/types/decorator/string/isfqdn.d.ts","../../node_modules/class-validator/types/decorator/string/isfullwidth.d.ts","../../node_modules/class-validator/types/decorator/string/ishalfwidth.d.ts","../../node_modules/class-validator/types/decorator/string/isvariablewidth.d.ts","../../node_modules/class-validator/types/decorator/string/ishexcolor.d.ts","../../node_modules/class-validator/types/decorator/string/ishexadecimal.d.ts","../../node_modules/class-validator/types/decorator/string/ismacaddress.d.ts","../../node_modules/class-validator/types/decorator/string/isip.d.ts","../../node_modules/class-validator/types/decorator/string/isport.d.ts","../../node_modules/class-validator/types/decorator/string/isisbn.d.ts","../../node_modules/class-validator/types/decorator/string/isisin.d.ts","../../node_modules/class-validator/types/decorator/string/isiso8601.d.ts","../../node_modules/class-validator/types/decorator/string/isjson.d.ts","../../node_modules/class-validator/types/decorator/string/isjwt.d.ts","../../node_modules/class-validator/types/decorator/string/islowercase.d.ts","../../node_modules/class-validator/types/decorator/string/ismobilephone.d.ts","../../node_modules/class-validator/types/decorator/string/isiso31661alpha2.d.ts","../../node_modules/class-validator/types/decorator/string/isiso31661alpha3.d.ts","../../node_modules/class-validator/types/decorator/string/ismongoid.d.ts","../../node_modules/class-validator/types/decorator/string/ismultibyte.d.ts","../../node_modules/class-validator/types/decorator/string/issurrogatepair.d.ts","../../node_modules/class-validator/types/decorator/string/isurl.d.ts","../../node_modules/class-validator/types/decorator/string/isuuid.d.ts","../../node_modules/class-validator/types/decorator/string/isfirebasepushid.d.ts","../../node_modules/class-validator/types/decorator/string/isuppercase.d.ts","../../node_modules/class-validator/types/decorator/string/length.d.ts","../../node_modules/class-validator/types/decorator/string/maxlength.d.ts","../../node_modules/class-validator/types/decorator/string/minlength.d.ts","../../node_modules/class-validator/types/decorator/string/matches.d.ts","../../node_modules/libphonenumber-js/types.d.cts","../../node_modules/libphonenumber-js/max/index.d.cts","../../node_modules/class-validator/types/decorator/string/isphonenumber.d.ts","../../node_modules/class-validator/types/decorator/string/ismilitarytime.d.ts","../../node_modules/class-validator/types/decorator/string/ishash.d.ts","../../node_modules/class-validator/types/decorator/string/isissn.d.ts","../../node_modules/class-validator/types/decorator/string/isdatestring.d.ts","../../node_modules/class-validator/types/decorator/string/isbooleanstring.d.ts","../../node_modules/class-validator/types/decorator/string/isnumberstring.d.ts","../../node_modules/class-validator/types/decorator/string/isbase32.d.ts","../../node_modules/class-validator/types/decorator/string/isbic.d.ts","../../node_modules/class-validator/types/decorator/string/isbtcaddress.d.ts","../../node_modules/class-validator/types/decorator/string/isdatauri.d.ts","../../node_modules/class-validator/types/decorator/string/isean.d.ts","../../node_modules/class-validator/types/decorator/string/isethereumaddress.d.ts","../../node_modules/class-validator/types/decorator/string/ishsl.d.ts","../../node_modules/class-validator/types/decorator/string/isiban.d.ts","../../node_modules/class-validator/types/decorator/string/isidentitycard.d.ts","../../node_modules/class-validator/types/decorator/string/isisrc.d.ts","../../node_modules/class-validator/types/decorator/string/islocale.d.ts","../../node_modules/class-validator/types/decorator/string/ismagneturi.d.ts","../../node_modules/class-validator/types/decorator/string/ismimetype.d.ts","../../node_modules/class-validator/types/decorator/string/isoctal.d.ts","../../node_modules/class-validator/types/decorator/string/ispassportnumber.d.ts","../../node_modules/class-validator/types/decorator/string/ispostalcode.d.ts","../../node_modules/class-validator/types/decorator/string/isrfc3339.d.ts","../../node_modules/class-validator/types/decorator/string/isrgbcolor.d.ts","../../node_modules/class-validator/types/decorator/string/issemver.d.ts","../../node_modules/class-validator/types/decorator/string/isstrongpassword.d.ts","../../node_modules/class-validator/types/decorator/string/istimezone.d.ts","../../node_modules/class-validator/types/decorator/string/isbase58.d.ts","../../node_modules/class-validator/types/decorator/string/is-tax-id.d.ts","../../node_modules/class-validator/types/decorator/string/is-iso4217-currency-code.d.ts","../../node_modules/class-validator/types/decorator/typechecker/isboolean.d.ts","../../node_modules/class-validator/types/decorator/typechecker/isdate.d.ts","../../node_modules/class-validator/types/decorator/typechecker/isnumber.d.ts","../../node_modules/class-validator/types/decorator/typechecker/isenum.d.ts","../../node_modules/class-validator/types/decorator/typechecker/isint.d.ts","../../node_modules/class-validator/types/decorator/typechecker/isstring.d.ts","../../node_modules/class-validator/types/decorator/typechecker/isarray.d.ts","../../node_modules/class-validator/types/decorator/typechecker/isobject.d.ts","../../node_modules/class-validator/types/decorator/array/arraycontains.d.ts","../../node_modules/class-validator/types/decorator/array/arraynotcontains.d.ts","../../node_modules/class-validator/types/decorator/array/arraynotempty.d.ts","../../node_modules/class-validator/types/decorator/array/arrayminsize.d.ts","../../node_modules/class-validator/types/decorator/array/arraymaxsize.d.ts","../../node_modules/class-validator/types/decorator/array/arrayunique.d.ts","../../node_modules/class-validator/types/decorator/object/isnotemptyobject.d.ts","../../node_modules/class-validator/types/decorator/object/isinstance.d.ts","../../node_modules/class-validator/types/decorator/decorators.d.ts","../../node_modules/class-validator/types/validation/validationtypes.d.ts","../../node_modules/class-validator/types/validation/validator.d.ts","../../node_modules/class-validator/types/register-decorator.d.ts","../../node_modules/class-validator/types/metadata/validationmetadataargs.d.ts","../../node_modules/class-validator/types/metadata/validationmetadata.d.ts","../../node_modules/class-validator/types/metadata/constraintmetadata.d.ts","../../node_modules/class-validator/types/metadata/metadatastorage.d.ts","../../node_modules/class-validator/types/index.d.ts","../../node_modules/class-transformer/types/interfaces/decorator-options/expose-options.interface.d.ts","../../node_modules/class-transformer/types/interfaces/decorator-options/exclude-options.interface.d.ts","../../node_modules/class-transformer/types/interfaces/decorator-options/transform-options.interface.d.ts","../../node_modules/class-transformer/types/interfaces/decorator-options/type-discriminator-descriptor.interface.d.ts","../../node_modules/class-transformer/types/interfaces/decorator-options/type-options.interface.d.ts","../../node_modules/class-transformer/types/interfaces/metadata/exclude-metadata.interface.d.ts","../../node_modules/class-transformer/types/interfaces/metadata/expose-metadata.interface.d.ts","../../node_modules/class-transformer/types/enums/transformation-type.enum.d.ts","../../node_modules/class-transformer/types/enums/index.d.ts","../../node_modules/class-transformer/types/interfaces/target-map.interface.d.ts","../../node_modules/class-transformer/types/interfaces/class-transformer-options.interface.d.ts","../../node_modules/class-transformer/types/interfaces/metadata/transform-fn-params.interface.d.ts","../../node_modules/class-transformer/types/interfaces/metadata/transform-metadata.interface.d.ts","../../node_modules/class-transformer/types/interfaces/metadata/type-metadata.interface.d.ts","../../node_modules/class-transformer/types/interfaces/class-constructor.type.d.ts","../../node_modules/class-transformer/types/interfaces/type-help-options.interface.d.ts","../../node_modules/class-transformer/types/interfaces/index.d.ts","../../node_modules/class-transformer/types/classtransformer.d.ts","../../node_modules/class-transformer/types/decorators/exclude.decorator.d.ts","../../node_modules/class-transformer/types/decorators/expose.decorator.d.ts","../../node_modules/class-transformer/types/decorators/transform-instance-to-instance.decorator.d.ts","../../node_modules/class-transformer/types/decorators/transform-instance-to-plain.decorator.d.ts","../../node_modules/class-transformer/types/decorators/transform-plain-to-instance.decorator.d.ts","../../node_modules/class-transformer/types/decorators/transform.decorator.d.ts","../../node_modules/class-transformer/types/decorators/type.decorator.d.ts","../../node_modules/class-transformer/types/decorators/index.d.ts","../../node_modules/class-transformer/types/index.d.ts","../../node_modules/@hookform/resolvers/class-validator/dist/types.d.ts","../../node_modules/@hookform/resolvers/class-validator/dist/class-validator.d.ts","../../node_modules/@hookform/resolvers/class-validator/dist/index.d.ts","./src/components/launches/helpers/use.values.ts","../../node_modules/next/dist/compiled/@next/font/dist/types.d.ts","../../node_modules/next/dist/compiled/@next/font/dist/google/index.d.ts","../../node_modules/next/font/google/index.d.ts","../../libraries/react-shared-libraries/src/helpers/inter.font.ts","../../node_modules/sweetalert2/sweetalert2.d.ts","../../libraries/react-shared-libraries/src/helpers/delete.dialog.tsx","./src/components/layout/layout.context.tsx","./src/app/layout.tsx","../../node_modules/clsx/clsx.d.ts","../../libraries/nestjs-libraries/src/database/prisma/subscriptions/pricing.ts","./src/components/layout/user.context.tsx","./src/components/layout/top.menu.tsx","./src/components/layout/title.tsx","../../node_modules/@mantine/utils/lib/create-polymorphic-component/create-polymorphic-component.d.ts","../../node_modules/@mantine/utils/lib/create-scoped-keydown-handler/create-scoped-keydown-handler.d.ts","../../node_modules/@mantine/utils/lib/get-context-item-index/get-context-item-index.d.ts","../../node_modules/@mantine/utils/lib/find-element-ancestor/find-element-ancestor.d.ts","../../node_modules/@mantine/utils/lib/create-safe-context/create-safe-context.d.ts","../../node_modules/@mantine/utils/lib/pack-sx/pack-sx.d.ts","../../node_modules/@mantine/utils/lib/get-safe-id/get-safe-id.d.ts","../../node_modules/@mantine/utils/lib/close-on-escape/close-on-escape.d.ts","../../node_modules/@mantine/utils/lib/create-event-handler/create-event-handler.d.ts","../../node_modules/@mantine/utils/lib/noop/noop.d.ts","../../node_modules/@mantine/utils/lib/keys/keys.d.ts","../../node_modules/@mantine/utils/lib/use-hovered/use-hovered.d.ts","../../node_modules/@mantine/utils/lib/group-options/group-options.d.ts","../../node_modules/@mantine/utils/lib/create-use-external-events/create-use-external-events.d.ts","../../node_modules/@mantine/utils/lib/is-element/is-element.d.ts","../../node_modules/@mantine/utils/lib/forwardrefwithstaticcomponents.d.ts","../../node_modules/@mantine/utils/lib/index.d.ts","../../node_modules/@mantine/styles/node_modules/clsx/clsx.d.ts","../../node_modules/@mantine/styles/lib/theme/types/colorscheme.d.ts","../../node_modules/@mantine/styles/lib/theme/types/tuple.d.ts","../../node_modules/@mantine/styles/lib/theme/types/mantinecolor.d.ts","../../node_modules/@mantine/styles/lib/theme/types/mantinesize.d.ts","../../node_modules/@mantine/styles/lib/theme/types/mantinestylesystem.d.ts","../../node_modules/@mantine/styles/lib/theme/types/deeppartial.d.ts","../../node_modules/@mantine/styles/lib/theme/types/mantinegradient.d.ts","../../node_modules/@mantine/styles/lib/theme/functions/fns/variant/variant.d.ts","../../node_modules/@emotion/utils/types/index.d.ts","../../node_modules/@emotion/cache/types/index.d.ts","../../node_modules/@mantine/styles/node_modules/csstype/index.d.ts","../../node_modules/@mantine/styles/lib/tss/types/css-object.d.ts","../../node_modules/@mantine/styles/lib/tss/types/css.d.ts","../../node_modules/@mantine/styles/lib/tss/types/selectors.d.ts","../../node_modules/@mantine/styles/lib/tss/types/index.d.ts","../../node_modules/@mantine/styles/lib/tss/create-styles.d.ts","../../node_modules/@emotion/serialize/types/index.d.ts","../../node_modules/@emotion/react/types/jsx-namespace.d.ts","../../node_modules/@emotion/react/types/helper.d.ts","../../node_modules/@emotion/react/types/theming.d.ts","../../node_modules/@emotion/react/types/index.d.ts","../../node_modules/@mantine/styles/lib/tss/global.d.ts","../../node_modules/@mantine/styles/lib/tss/use-css.d.ts","../../node_modules/@mantine/styles/lib/tss/use-emotion-cache.d.ts","../../node_modules/@mantine/styles/lib/tss/default-emotion-cache.d.ts","../../node_modules/@mantine/styles/lib/tss/index.d.ts","../../node_modules/@mantine/styles/lib/theme/types/mantinetheme.d.ts","../../node_modules/@mantine/styles/lib/theme/types/defaultprops.d.ts","../../node_modules/@mantine/styles/lib/theme/types/mantineshadow.d.ts","../../node_modules/@mantine/styles/lib/theme/types/index.d.ts","../../node_modules/@mantine/styles/lib/theme/utils/get-default-z-index/get-default-z-index.d.ts","../../node_modules/@mantine/styles/lib/theme/utils/filter-props/filter-props.d.ts","../../node_modules/@mantine/styles/lib/theme/utils/index.d.ts","../../node_modules/@mantine/styles/lib/theme/default-theme.d.ts","../../node_modules/@mantine/styles/lib/theme/mantineprovider.d.ts","../../node_modules/@mantine/styles/lib/theme/colorschemeprovider.d.ts","../../node_modules/@mantine/styles/lib/theme/globalstyles.d.ts","../../node_modules/@mantine/styles/lib/theme/normalizecss.d.ts","../../node_modules/@mantine/styles/lib/theme/index.d.ts","../../node_modules/@mantine/styles/lib/index.d.ts","../../node_modules/@mantine/core/lib/accordion/accordion.types.d.ts","../../node_modules/@mantine/core/lib/accordion/accordionprovider.d.ts","../../node_modules/@mantine/core/lib/accordion/accordionitem/accordionitem.styles.d.ts","../../node_modules/@mantine/core/lib/accordion/accordionitem/accordionitem.d.ts","../../node_modules/@mantine/core/lib/accordion/accordioncontrol/accordioncontrol.styles.d.ts","../../node_modules/@mantine/core/lib/accordion/accordioncontrol/accordioncontrol.d.ts","../../node_modules/@mantine/core/lib/accordion/accordionpanel/accordionpanel.styles.d.ts","../../node_modules/@mantine/core/lib/accordion/accordionpanel/accordionpanel.d.ts","../../node_modules/@mantine/core/lib/accordion/accordion.d.ts","../../node_modules/@mantine/core/lib/accordion/chevronicon.d.ts","../../node_modules/@mantine/core/lib/accordion/index.d.ts","../../node_modules/@mantine/core/lib/actionicon/actionicon.styles.d.ts","../../node_modules/@mantine/core/lib/loader/loader.d.ts","../../node_modules/@mantine/core/lib/loader/index.d.ts","../../node_modules/@mantine/core/lib/actionicon/actionicon.d.ts","../../node_modules/@mantine/core/lib/actionicon/index.d.ts","../../node_modules/@mantine/core/lib/affix/affix.d.ts","../../node_modules/@mantine/core/lib/affix/index.d.ts","../../node_modules/@mantine/core/lib/alert/alert.styles.d.ts","../../node_modules/@mantine/core/lib/alert/alert.d.ts","../../node_modules/@mantine/core/lib/alert/index.d.ts","../../node_modules/@mantine/core/lib/text/text.d.ts","../../node_modules/@mantine/core/lib/anchor/anchor.d.ts","../../node_modules/@mantine/core/lib/anchor/index.d.ts","../../node_modules/@mantine/core/lib/appshell/horizontalsection/horizontalsection.styles.d.ts","../../node_modules/@mantine/core/lib/appshell/horizontalsection/horizontalsection.d.ts","../../node_modules/@mantine/core/lib/appshell/horizontalsection/section/section.d.ts","../../node_modules/@mantine/core/lib/appshell/navbar/navbar.d.ts","../../node_modules/@mantine/core/lib/appshell/verticalsection/verticalsection.styles.d.ts","../../node_modules/@mantine/core/lib/appshell/verticalsection/verticalsection.d.ts","../../node_modules/@mantine/core/lib/appshell/header/header.d.ts","../../node_modules/@mantine/core/lib/appshell/aside/aside.d.ts","../../node_modules/@mantine/core/lib/appshell/footer/footer.d.ts","../../node_modules/@mantine/core/lib/appshell/appshell.styles.d.ts","../../node_modules/@mantine/core/lib/appshell/appshell.d.ts","../../node_modules/@mantine/core/lib/appshell/index.d.ts","../../node_modules/@mantine/core/lib/aspectratio/aspectratio.d.ts","../../node_modules/@mantine/core/lib/aspectratio/aspectratio.styles.d.ts","../../node_modules/@mantine/core/lib/aspectratio/index.d.ts","../../node_modules/@mantine/core/lib/input/inputlabel/inputlabel.styles.d.ts","../../node_modules/@mantine/core/lib/input/inputlabel/inputlabel.d.ts","../../node_modules/@mantine/core/lib/input/inputerror/inputerror.styles.d.ts","../../node_modules/@mantine/core/lib/input/inputerror/inputerror.d.ts","../../node_modules/@mantine/core/lib/input/inputdescription/inputdescription.styles.d.ts","../../node_modules/@mantine/core/lib/input/inputdescription/inputdescription.d.ts","../../node_modules/@mantine/core/lib/input/inputwrapper/inputwrapper.styles.d.ts","../../node_modules/@mantine/core/lib/input/inputwrapper/inputwrapper.d.ts","../../node_modules/@mantine/core/lib/input/inputplaceholder/inputplaceholder.d.ts","../../node_modules/@mantine/core/lib/input/input.styles.d.ts","../../node_modules/@mantine/core/lib/input/input.d.ts","../../node_modules/@mantine/core/lib/input/use-input-props.d.ts","../../node_modules/@mantine/core/lib/input/index.d.ts","../../node_modules/@mantine/core/lib/transition/transitions.d.ts","../../node_modules/@mantine/core/lib/transition/transition.d.ts","../../node_modules/@mantine/core/lib/transition/groupedtransition.d.ts","../../node_modules/@mantine/core/lib/transition/index.d.ts","../../node_modules/@mantine/core/lib/select/selectitems/selectitems.styles.d.ts","../../node_modules/@mantine/core/lib/select/selectitems/selectitems.d.ts","../../node_modules/@mantine/core/lib/select/selectpopover/selectpopover.styles.d.ts","../../node_modules/@mantine/core/lib/floating/use-delayed-hover.d.ts","../../node_modules/@mantine/core/lib/floating/use-floating-auto-update.d.ts","../../node_modules/@mantine/core/lib/floating/types.d.ts","../../node_modules/@mantine/core/lib/floating/get-floating-position/get-floating-position.d.ts","../../node_modules/@mantine/core/lib/floating/floatingarrow/floatingarrow.d.ts","../../node_modules/@mantine/core/lib/floating/index.d.ts","../../node_modules/@mantine/core/lib/popover/popoverdropdown/popoverdropdown.styles.d.ts","../../node_modules/@mantine/core/lib/popover/popover.types.d.ts","../../node_modules/@mantine/core/lib/popover/popoverdropdown/popoverdropdown.d.ts","../../node_modules/@mantine/core/lib/popover/popovertarget/popovertarget.d.ts","../../node_modules/@mantine/core/lib/popover/popover.d.ts","../../node_modules/@mantine/core/lib/popover/index.d.ts","../../node_modules/@mantine/core/lib/select/selectpopover/selectpopover.d.ts","../../node_modules/@mantine/core/lib/select/types.d.ts","../../node_modules/@mantine/core/lib/select/select.d.ts","../../node_modules/@mantine/core/lib/select/selectrightsection/chevronicon.d.ts","../../node_modules/@mantine/core/lib/select/defaultitem/defaultitem.d.ts","../../node_modules/@mantine/core/lib/select/index.d.ts","../../node_modules/@mantine/core/lib/autocomplete/autocomplete.d.ts","../../node_modules/@mantine/core/lib/autocomplete/index.d.ts","../../node_modules/@mantine/core/lib/avatar/avatargroup/avatargroup.d.ts","../../node_modules/@mantine/core/lib/avatar/avatar.styles.d.ts","../../node_modules/@mantine/core/lib/avatar/avatar.d.ts","../../node_modules/@mantine/core/lib/avatar/index.d.ts","../../node_modules/@mantine/core/lib/backgroundimage/backgroundimage.d.ts","../../node_modules/@mantine/core/lib/backgroundimage/index.d.ts","../../node_modules/@mantine/core/lib/badge/badge.styles.d.ts","../../node_modules/@mantine/core/lib/badge/badge.d.ts","../../node_modules/@mantine/core/lib/badge/index.d.ts","../../node_modules/@mantine/core/lib/blockquote/blockquote.styles.d.ts","../../node_modules/@mantine/core/lib/blockquote/blockquote.d.ts","../../node_modules/@mantine/core/lib/blockquote/index.d.ts","../../node_modules/@mantine/core/lib/box/box.d.ts","../../node_modules/@mantine/core/lib/box/style-system-props/extract-system-styles/extract-system-styles.d.ts","../../node_modules/@mantine/core/lib/box/style-system-props/get-responsive-value/get-responsive-value.d.ts","../../node_modules/@mantine/core/lib/box/style-system-props/value-getters/get-color-value.d.ts","../../node_modules/@mantine/core/lib/box/style-system-props/value-getters/get-default-value.d.ts","../../node_modules/@mantine/core/lib/box/style-system-props/value-getters/get-font-size-value.d.ts","../../node_modules/@mantine/core/lib/box/style-system-props/value-getters/get-spacing-value.d.ts","../../node_modules/@mantine/core/lib/box/style-system-props/value-getters/value-getters.d.ts","../../node_modules/@mantine/core/lib/box/style-system-props/system-props/system-props.d.ts","../../node_modules/@mantine/core/lib/box/style-system-props/get-system-styles/get-system-styles.d.ts","../../node_modules/@mantine/core/lib/box/index.d.ts","../../node_modules/@mantine/core/lib/breadcrumbs/breadcrumbs.styles.d.ts","../../node_modules/@mantine/core/lib/breadcrumbs/breadcrumbs.d.ts","../../node_modules/@mantine/core/lib/breadcrumbs/index.d.ts","../../node_modules/@mantine/core/lib/burger/burger.styles.d.ts","../../node_modules/@mantine/core/lib/burger/burger.d.ts","../../node_modules/@mantine/core/lib/burger/index.d.ts","../../node_modules/@mantine/core/lib/button/buttongroup/buttongroup.styles.d.ts","../../node_modules/@mantine/core/lib/button/buttongroup/buttongroup.d.ts","../../node_modules/@mantine/core/lib/button/button.styles.d.ts","../../node_modules/@mantine/core/lib/button/button.d.ts","../../node_modules/@mantine/core/lib/button/index.d.ts","../../node_modules/@mantine/core/lib/paper/paper.styles.d.ts","../../node_modules/@mantine/core/lib/paper/paper.d.ts","../../node_modules/@mantine/core/lib/card/cardsection/cardsection.d.ts","../../node_modules/@mantine/core/lib/card/card.d.ts","../../node_modules/@mantine/core/lib/card/index.d.ts","../../node_modules/@mantine/core/lib/center/center.d.ts","../../node_modules/@mantine/core/lib/center/index.d.ts","../../node_modules/@mantine/core/lib/inlineinput/inlineinput.styles.d.ts","../../node_modules/@mantine/core/lib/inlineinput/inlineinput.d.ts","../../node_modules/@mantine/core/lib/inlineinput/index.d.ts","../../node_modules/@mantine/core/lib/checkbox/checkboxgroup/checkboxgroup.d.ts","../../node_modules/@mantine/core/lib/checkbox/checkbox.styles.d.ts","../../node_modules/@mantine/core/lib/checkbox/checkbox.d.ts","../../node_modules/@mantine/core/lib/checkbox/checkboxicon.d.ts","../../node_modules/@mantine/core/lib/checkbox/index.d.ts","../../node_modules/@mantine/core/lib/group/group.styles.d.ts","../../node_modules/@mantine/core/lib/group/group.d.ts","../../node_modules/@mantine/core/lib/group/index.d.ts","../../node_modules/@mantine/core/lib/chip/chipgroup/chipgroup.d.ts","../../node_modules/@mantine/core/lib/chip/chip.styles.d.ts","../../node_modules/@mantine/core/lib/chip/chip.d.ts","../../node_modules/@mantine/core/lib/chip/index.d.ts","../../node_modules/@mantine/core/lib/closebutton/closebutton.d.ts","../../node_modules/@mantine/core/lib/closebutton/index.d.ts","../../node_modules/@mantine/core/lib/code/code.styles.d.ts","../../node_modules/@mantine/core/lib/code/code.d.ts","../../node_modules/@mantine/core/lib/code/index.d.ts","../../node_modules/@mantine/core/lib/collapse/collapse.d.ts","../../node_modules/@mantine/core/lib/collapse/index.d.ts","../../node_modules/@mantine/core/lib/colorpicker/thumb/thumb.styles.d.ts","../../node_modules/@mantine/core/lib/colorpicker/thumb/thumb.d.ts","../../node_modules/@mantine/core/lib/colorpicker/colorslider/colorslider.styles.d.ts","../../node_modules/@mantine/core/lib/colorpicker/colorslider/colorslider.d.ts","../../node_modules/@mantine/core/lib/colorpicker/types.d.ts","../../node_modules/@mantine/core/lib/colorpicker/saturation/saturation.styles.d.ts","../../node_modules/@mantine/core/lib/colorpicker/saturation/saturation.d.ts","../../node_modules/@mantine/core/lib/colorpicker/swatches/swatches.styles.d.ts","../../node_modules/@mantine/core/lib/colorpicker/swatches/swatches.d.ts","../../node_modules/@mantine/core/lib/colorpicker/colorpicker.styles.d.ts","../../node_modules/@mantine/core/lib/colorpicker/colorpicker.d.ts","../../node_modules/@mantine/core/lib/colorinput/colorinput.d.ts","../../node_modules/@mantine/core/lib/colorinput/index.d.ts","../../node_modules/@mantine/core/lib/colorpicker/hueslider/hueslider.d.ts","../../node_modules/@mantine/core/lib/colorpicker/alphaslider/alphaslider.d.ts","../../node_modules/@mantine/core/lib/colorpicker/index.d.ts","../../node_modules/@mantine/core/lib/colorswatch/colorswatch.styles.d.ts","../../node_modules/@mantine/core/lib/colorswatch/colorswatch.d.ts","../../node_modules/@mantine/core/lib/colorswatch/index.d.ts","../../node_modules/@mantine/core/lib/container/container.d.ts","../../node_modules/@mantine/core/lib/container/container.styles.d.ts","../../node_modules/@mantine/core/lib/container/index.d.ts","../../node_modules/@mantine/core/lib/copybutton/copybutton.d.ts","../../node_modules/@mantine/core/lib/copybutton/index.d.ts","../../node_modules/@mantine/core/lib/paper/index.d.ts","../../node_modules/@mantine/core/lib/dialog/dialog.styles.d.ts","../../node_modules/@mantine/core/lib/dialog/dialog.d.ts","../../node_modules/@mantine/core/lib/dialog/index.d.ts","../../node_modules/@mantine/core/lib/divider/divider.d.ts","../../node_modules/@mantine/core/lib/divider/divider.styles.d.ts","../../node_modules/@mantine/core/lib/divider/index.d.ts","../../node_modules/@mantine/core/lib/drawer/drawer.styles.d.ts","../../node_modules/@mantine/core/lib/drawer/drawer.d.ts","../../node_modules/@mantine/core/lib/drawer/index.d.ts","../../node_modules/@mantine/core/lib/filebutton/filebutton.d.ts","../../node_modules/@mantine/core/lib/filebutton/index.d.ts","../../node_modules/@mantine/core/lib/fileinput/fileinput.styles.d.ts","../../node_modules/@mantine/core/lib/fileinput/fileinput.d.ts","../../node_modules/@mantine/core/lib/fileinput/index.d.ts","../../node_modules/@mantine/core/lib/flex/flex.d.ts","../../node_modules/@mantine/core/lib/flex/flex-props.d.ts","../../node_modules/@mantine/core/lib/flex/index.d.ts","../../node_modules/@mantine/core/lib/focustrap/focustrap.d.ts","../../node_modules/@mantine/core/lib/focustrap/index.d.ts","../../node_modules/@mantine/core/lib/grid/col/col.styles.d.ts","../../node_modules/@mantine/core/lib/grid/col/col.d.ts","../../node_modules/@mantine/core/lib/grid/grid.d.ts","../../node_modules/@mantine/core/lib/grid/grid.styles.d.ts","../../node_modules/@mantine/core/lib/grid/index.d.ts","../../node_modules/@mantine/core/lib/highlight/highlight.d.ts","../../node_modules/@mantine/core/lib/highlight/index.d.ts","../../node_modules/@mantine/core/lib/hovercard/hovercarddropdown/hovercarddropdown.d.ts","../../node_modules/@mantine/core/lib/hovercard/hovercardtarget/hovercardtarget.d.ts","../../node_modules/@mantine/core/lib/hovercard/hovercard.d.ts","../../node_modules/@mantine/core/lib/hovercard/index.d.ts","../../node_modules/@mantine/core/lib/image/image.styles.d.ts","../../node_modules/@mantine/core/lib/image/image.d.ts","../../node_modules/@mantine/core/lib/image/index.d.ts","../../node_modules/@mantine/core/lib/indicator/indicator.types.d.ts","../../node_modules/@mantine/core/lib/indicator/indicator.styles.d.ts","../../node_modules/@mantine/core/lib/indicator/indicator.d.ts","../../node_modules/@mantine/core/lib/indicator/index.d.ts","../../node_modules/@mantine/core/lib/inputbase/inputbase.d.ts","../../node_modules/@mantine/core/lib/inputbase/index.d.ts","../../node_modules/@mantine/core/lib/jsoninput/validate-json/validate-json.d.ts","../../node_modules/@mantine/core/lib/textinput/textinput.d.ts","../../node_modules/@mantine/core/lib/textarea/textarea.d.ts","../../node_modules/@mantine/core/lib/textarea/index.d.ts","../../node_modules/@mantine/core/lib/textinput/index.d.ts","../../node_modules/@mantine/core/lib/jsoninput/jsoninput.d.ts","../../node_modules/@mantine/core/lib/jsoninput/jsoninput.styles.d.ts","../../node_modules/@mantine/core/lib/jsoninput/index.d.ts","../../node_modules/@mantine/core/lib/kbd/kbd.d.ts","../../node_modules/@mantine/core/lib/kbd/index.d.ts","../../node_modules/@mantine/core/lib/list/list.styles.d.ts","../../node_modules/@mantine/core/lib/list/listitem/listitem.styles.d.ts","../../node_modules/@mantine/core/lib/list/listitem/listitem.d.ts","../../node_modules/@mantine/core/lib/list/list.d.ts","../../node_modules/@mantine/core/lib/list/index.d.ts","../../node_modules/@mantine/core/lib/loadingoverlay/loadingoverlay.d.ts","../../node_modules/@mantine/core/lib/loadingoverlay/index.d.ts","../../node_modules/@mantine/core/lib/mark/mark.d.ts","../../node_modules/@mantine/core/lib/mark/mark.styles.d.ts","../../node_modules/@mantine/core/lib/mark/index.d.ts","../../node_modules/@mantine/core/lib/mediaquery/mediaquery.d.ts","../../node_modules/@mantine/core/lib/mediaquery/mediaquery.styles.d.ts","../../node_modules/@mantine/core/lib/mediaquery/index.d.ts","../../node_modules/@mantine/core/lib/menu/menudivider/menudivider.styles.d.ts","../../node_modules/@mantine/core/lib/menu/menudivider/menudivider.d.ts","../../node_modules/@mantine/core/lib/menu/menudropdown/menudropdown.d.ts","../../node_modules/@mantine/core/lib/menu/menuitem/menuitem.styles.d.ts","../../node_modules/@mantine/core/lib/menu/menuitem/menuitem.d.ts","../../node_modules/@mantine/core/lib/menu/menulabel/menulabel.styles.d.ts","../../node_modules/@mantine/core/lib/menu/menulabel/menulabel.d.ts","../../node_modules/@mantine/core/lib/menu/menu.types.d.ts","../../node_modules/@mantine/core/lib/menu/menutarget/menutarget.d.ts","../../node_modules/@mantine/core/lib/menu/menu.d.ts","../../node_modules/@mantine/core/lib/menu/index.d.ts","../../node_modules/@mantine/core/lib/modal/modal.styles.d.ts","../../node_modules/@mantine/core/lib/modal/modal.d.ts","../../node_modules/@mantine/core/lib/modal/index.d.ts","../../node_modules/@mantine/core/lib/multiselect/defaultvalue/defaultvalue.styles.d.ts","../../node_modules/@mantine/core/lib/multiselect/defaultvalue/defaultvalue.d.ts","../../node_modules/@mantine/core/lib/multiselect/multiselect.styles.d.ts","../../node_modules/@mantine/core/lib/multiselect/multiselect.d.ts","../../node_modules/@mantine/core/lib/multiselect/index.d.ts","../../node_modules/@mantine/core/lib/nativeselect/nativeselect.d.ts","../../node_modules/@mantine/core/lib/nativeselect/index.d.ts","../../node_modules/@mantine/core/lib/navlink/navlink.styles.d.ts","../../node_modules/@mantine/core/lib/navlink/navlink.d.ts","../../node_modules/@mantine/core/lib/navlink/index.d.ts","../../node_modules/@mantine/core/lib/notification/notification.styles.d.ts","../../node_modules/@mantine/core/lib/notification/notification.d.ts","../../node_modules/@mantine/core/lib/notification/index.d.ts","../../node_modules/@mantine/core/lib/numberinput/numberinput.styles.d.ts","../../node_modules/@mantine/core/lib/numberinput/numberinput.d.ts","../../node_modules/@mantine/core/lib/numberinput/index.d.ts","../../node_modules/@mantine/core/lib/overlay/overlay.styles.d.ts","../../node_modules/@mantine/core/lib/overlay/overlay.d.ts","../../node_modules/@mantine/core/lib/overlay/index.d.ts","../../node_modules/@mantine/core/lib/pagination/defaultitem/defaultitem.d.ts","../../node_modules/@mantine/core/lib/pagination/pagination.styles.d.ts","../../node_modules/@mantine/core/lib/pagination/pagination.d.ts","../../node_modules/@mantine/core/lib/pagination/index.d.ts","../../node_modules/@mantine/core/lib/passwordinput/passwordinput.styles.d.ts","../../node_modules/@mantine/core/lib/passwordinput/passwordinput.d.ts","../../node_modules/@mantine/core/lib/passwordinput/index.d.ts","../../node_modules/@mantine/core/lib/portal/portal.d.ts","../../node_modules/@mantine/core/lib/portal/optionalportal.d.ts","../../node_modules/@mantine/core/lib/portal/index.d.ts","../../node_modules/@mantine/core/lib/progress/progress.styles.d.ts","../../node_modules/@mantine/core/lib/progress/progress.d.ts","../../node_modules/@mantine/core/lib/progress/index.d.ts","../../node_modules/@mantine/core/lib/radio/radiogroup/radiogroup.d.ts","../../node_modules/@mantine/core/lib/radio/radio.styles.d.ts","../../node_modules/@mantine/core/lib/radio/radio.d.ts","../../node_modules/@mantine/core/lib/radio/index.d.ts","../../node_modules/@mantine/core/lib/rating/ratingitem/ratingitem.styles.d.ts","../../node_modules/@mantine/core/lib/rating/ratingitem/ratingitem.d.ts","../../node_modules/@mantine/core/lib/rating/rating.styles.d.ts","../../node_modules/@mantine/core/lib/rating/rating.d.ts","../../node_modules/@mantine/core/lib/rating/starsymbol/staricon.d.ts","../../node_modules/@mantine/core/lib/rating/index.d.ts","../../node_modules/@mantine/core/lib/ringprogress/ringprogress.styles.d.ts","../../node_modules/@mantine/core/lib/ringprogress/ringprogress.d.ts","../../node_modules/@mantine/core/lib/ringprogress/index.d.ts","../../node_modules/@mantine/core/lib/scrollarea/scrollarea.styles.d.ts","../../node_modules/@mantine/core/lib/scrollarea/scrollarea.d.ts","../../node_modules/@mantine/core/lib/scrollarea/index.d.ts","../../node_modules/@mantine/core/lib/segmentedcontrol/segmentedcontrol.styles.d.ts","../../node_modules/@mantine/core/lib/segmentedcontrol/segmentedcontrol.d.ts","../../node_modules/@mantine/core/lib/segmentedcontrol/index.d.ts","../../node_modules/@mantine/core/lib/simplegrid/simplegrid.styles.d.ts","../../node_modules/@mantine/core/lib/simplegrid/simplegrid.d.ts","../../node_modules/@mantine/core/lib/simplegrid/get-sorted-breakpoints/get-sorted-breakpoints.d.ts","../../node_modules/@mantine/core/lib/simplegrid/index.d.ts","../../node_modules/@mantine/core/lib/skeleton/skeleton.styles.d.ts","../../node_modules/@mantine/core/lib/skeleton/skeleton.d.ts","../../node_modules/@mantine/core/lib/skeleton/index.d.ts","../../node_modules/@mantine/core/lib/slider/thumb/thumb.styles.d.ts","../../node_modules/@mantine/core/lib/slider/thumb/thumb.d.ts","../../node_modules/@mantine/core/lib/slider/marks/marks.styles.d.ts","../../node_modules/@mantine/core/lib/slider/marks/marks.d.ts","../../node_modules/@mantine/core/lib/slider/track/track.styles.d.ts","../../node_modules/@mantine/core/lib/slider/track/track.d.ts","../../node_modules/@mantine/core/lib/slider/sliderroot/sliderroot.styles.d.ts","../../node_modules/@mantine/core/lib/slider/sliderroot/sliderroot.d.ts","../../node_modules/@mantine/core/lib/slider/slider/slider.d.ts","../../node_modules/@mantine/core/lib/slider/rangeslider/rangeslider.d.ts","../../node_modules/@mantine/core/lib/slider/index.d.ts","../../node_modules/@mantine/core/lib/space/space.d.ts","../../node_modules/@mantine/core/lib/space/index.d.ts","../../node_modules/@mantine/core/lib/spoiler/spoiler.styles.d.ts","../../node_modules/@mantine/core/lib/spoiler/spoiler.d.ts","../../node_modules/@mantine/core/lib/spoiler/index.d.ts","../../node_modules/@mantine/core/lib/stack/stack.styles.d.ts","../../node_modules/@mantine/core/lib/stack/stack.d.ts","../../node_modules/@mantine/core/lib/stack/index.d.ts","../../node_modules/@mantine/core/lib/stepper/step/step.styles.d.ts","../../node_modules/@mantine/core/lib/stepper/step/step.d.ts","../../node_modules/@mantine/core/lib/stepper/stepcompleted/stepcompleted.d.ts","../../node_modules/@mantine/core/lib/stepper/stepper.styles.d.ts","../../node_modules/@mantine/core/lib/stepper/stepper.d.ts","../../node_modules/@mantine/core/lib/stepper/index.d.ts","../../node_modules/@mantine/core/lib/switch/switchgroup/switchgroup.d.ts","../../node_modules/@mantine/core/lib/switch/switch.styles.d.ts","../../node_modules/@mantine/core/lib/switch/switch.d.ts","../../node_modules/@mantine/core/lib/switch/index.d.ts","../../node_modules/@mantine/core/lib/table/table.styles.d.ts","../../node_modules/@mantine/core/lib/table/table.d.ts","../../node_modules/@mantine/core/lib/table/index.d.ts","../../node_modules/@mantine/core/lib/tabs/tabs.types.d.ts","../../node_modules/@mantine/core/lib/tabs/tabslist/tabslist.styles.d.ts","../../node_modules/@mantine/core/lib/tabs/tabslist/tabslist.d.ts","../../node_modules/@mantine/core/lib/tabs/tabspanel/tabspanel.styles.d.ts","../../node_modules/@mantine/core/lib/tabs/tabspanel/tabspanel.d.ts","../../node_modules/@mantine/core/lib/tabs/tab/tab.styles.d.ts","../../node_modules/@mantine/core/lib/tabs/tab/tab.d.ts","../../node_modules/@mantine/core/lib/tabs/tabsprovider.d.ts","../../node_modules/@mantine/core/lib/tabs/tabs.styles.d.ts","../../node_modules/@mantine/core/lib/tabs/tabs.d.ts","../../node_modules/@mantine/core/lib/tabs/index.d.ts","../../node_modules/@mantine/core/lib/text/text.styles.d.ts","../../node_modules/@mantine/core/lib/text/index.d.ts","../../node_modules/@mantine/core/lib/themeicon/themeicon.styles.d.ts","../../node_modules/@mantine/core/lib/themeicon/themeicon.d.ts","../../node_modules/@mantine/core/lib/themeicon/index.d.ts","../../node_modules/@mantine/core/lib/timeline/timelineitem/timelineitem.styles.d.ts","../../node_modules/@mantine/core/lib/timeline/timelineitem/timelineitem.d.ts","../../node_modules/@mantine/core/lib/timeline/timeline.d.ts","../../node_modules/@mantine/core/lib/timeline/index.d.ts","../../node_modules/@mantine/core/lib/title/title.styles.d.ts","../../node_modules/@mantine/core/lib/title/title.d.ts","../../node_modules/@mantine/core/lib/title/index.d.ts","../../node_modules/@mantine/core/lib/tooltip/tooltipgroup/tooltipgroup.d.ts","../../node_modules/@mantine/core/lib/tooltip/tooltip.styles.d.ts","../../node_modules/@mantine/core/lib/tooltip/tooltip.types.d.ts","../../node_modules/@mantine/core/lib/tooltip/tooltipfloating/tooltipfloating.d.ts","../../node_modules/@mantine/core/lib/tooltip/tooltip.d.ts","../../node_modules/@mantine/core/lib/tooltip/index.d.ts","../../node_modules/@mantine/core/lib/transferlist/types.d.ts","../../node_modules/@mantine/core/lib/transferlist/renderlist/renderlist.styles.d.ts","../../node_modules/@mantine/core/lib/transferlist/renderlist/renderlist.d.ts","../../node_modules/@mantine/core/lib/transferlist/use-selection-state/use-selection-state.d.ts","../../node_modules/@mantine/core/lib/transferlist/transferlist.d.ts","../../node_modules/@mantine/core/lib/transferlist/index.d.ts","../../node_modules/@mantine/core/lib/typographystylesprovider/typographystylesprovider.d.ts","../../node_modules/@mantine/core/lib/typographystylesprovider/index.d.ts","../../node_modules/@mantine/core/lib/unstyledbutton/unstyledbutton.d.ts","../../node_modules/@mantine/core/lib/unstyledbutton/index.d.ts","../../node_modules/@mantine/core/lib/index.d.ts","../../node_modules/@mantine/modals/lib/confirmmodal.d.ts","../../node_modules/@mantine/modals/lib/context.d.ts","../../node_modules/@mantine/modals/lib/modalsprovider.d.ts","../../node_modules/@mantine/modals/lib/use-modals/use-modals.d.ts","../../node_modules/@mantine/modals/lib/events.d.ts","../../node_modules/@mantine/modals/lib/index.d.ts","../../libraries/react-shared-libraries/src/helpers/mantine.wrapper.tsx","../../node_modules/react-tooltip/dist/react-tooltip.d.ts","./src/components/layout/top.tip.tsx","../../node_modules/react-loading/index.d.ts","../../libraries/react-shared-libraries/src/form/button.tsx","../../libraries/react-shared-libraries/src/helpers/use.media.directory.ts","./src/components/launches/helpers/top.title.component.tsx","../../libraries/react-shared-libraries/src/helpers/video.frame.tsx","../../libraries/react-shared-libraries/src/toaster/toaster.tsx","./src/components/media/media.component.tsx","../../node_modules/@types/unist/index.d.ts","../../node_modules/@types/hast/index.d.ts","../../node_modules/@types/estree/index.d.ts","../../node_modules/@types/estree-jsx/index.d.ts","../../node_modules/@types/mdast/index.d.ts","../../node_modules/micromark-util-types/index.d.ts","../../node_modules/mdast-util-from-markdown/lib/index.d.ts","../../node_modules/mdast-util-from-markdown/index.d.ts","../../node_modules/mdast-util-to-markdown/lib/types.d.ts","../../node_modules/mdast-util-to-markdown/lib/index.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/blockquote.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/break.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/code.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/definition.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/emphasis.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/heading.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/html.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/image.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/image-reference.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/inline-code.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/link.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/link-reference.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/list.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/list-item.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/paragraph.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/root.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/strong.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/text.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/thematic-break.d.ts","../../node_modules/mdast-util-to-markdown/lib/handle/index.d.ts","../../node_modules/mdast-util-to-markdown/index.d.ts","../../node_modules/mdast-util-mdx-expression/lib/index.d.ts","../../node_modules/mdast-util-mdx-expression/index.d.ts","../../node_modules/mdast-util-mdx-jsx/lib/index.d.ts","../../node_modules/mdast-util-mdx-jsx/index.d.ts","../../node_modules/mdast-util-mdxjs-esm/lib/index.d.ts","../../node_modules/mdast-util-mdxjs-esm/index.d.ts","../../node_modules/property-information/lib/util/info.d.ts","../../node_modules/property-information/lib/util/schema.d.ts","../../node_modules/property-information/lib/find.d.ts","../../node_modules/property-information/lib/hast-to-react.d.ts","../../node_modules/property-information/lib/normalize.d.ts","../../node_modules/property-information/index.d.ts","../../node_modules/hast-util-to-jsx-runtime/lib/components.d.ts","../../node_modules/hast-util-to-jsx-runtime/lib/index.d.ts","../../node_modules/hast-util-to-jsx-runtime/index.d.ts","../../node_modules/vfile-message/lib/index.d.ts","../../node_modules/vfile-message/index.d.ts","../../node_modules/vfile/lib/index.d.ts","../../node_modules/vfile/index.d.ts","../../node_modules/mdast-util-to-hast/lib/state.d.ts","../../node_modules/mdast-util-to-hast/lib/footer.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/blockquote.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/break.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/code.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/delete.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/emphasis.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/footnote-reference.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/heading.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/html.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/image-reference.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/image.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/inline-code.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/link-reference.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/link.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/list-item.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/list.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/paragraph.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/root.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/strong.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/table.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/table-cell.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/table-row.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/text.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/thematic-break.d.ts","../../node_modules/mdast-util-to-hast/lib/handlers/index.d.ts","../../node_modules/mdast-util-to-hast/lib/index.d.ts","../../node_modules/mdast-util-to-hast/index.d.ts","../../node_modules/unified/lib/callable-instance.d.ts","../../node_modules/trough/lib/index.d.ts","../../node_modules/trough/index.d.ts","../../node_modules/unified/lib/index.d.ts","../../node_modules/unified/index.d.ts","../../node_modules/remark-rehype/lib/index.d.ts","../../node_modules/remark-rehype/index.d.ts","../../node_modules/unist-util-is/lib/index.d.ts","../../node_modules/unist-util-is/index.d.ts","../../node_modules/unist-util-visit-parents/lib/index.d.ts","../../node_modules/unist-util-visit-parents/index.d.ts","../../node_modules/unist-util-visit/lib/index.d.ts","../../node_modules/unist-util-visit/index.d.ts","../../node_modules/react-markdown/lib/index.d.ts","../../node_modules/react-markdown/index.d.ts","../../node_modules/rehype-rewrite/lib/index.d.ts","../../node_modules/@uiw/react-markdown-preview/lib/props.d.ts","../../node_modules/@uiw/react-markdown-preview/lib/index.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/bold.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/code.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/comment.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/divider.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/fullscreen.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/group.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/hr.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/image.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/italic.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/link.d.ts","../../node_modules/@uiw/react-md-editor/lib/utils/markdownutils.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/list.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/preview.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/quote.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/strikethrough.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/title.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/title1.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/title2.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/title3.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/title4.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/title5.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/title6.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/table.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/issue.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/help.d.ts","../../node_modules/@uiw/react-md-editor/lib/commands/index.d.ts","../../node_modules/@uiw/react-markdown-preview/nohighlight.d.ts","../../node_modules/@types/react/jsx-runtime.d.ts","../../node_modules/@uiw/react-md-editor/lib/components/textarea/textarea.d.ts","../../node_modules/@uiw/react-md-editor/lib/components/textarea/index.nohighlight.d.ts","../../node_modules/@uiw/react-md-editor/lib/types.d.ts","../../node_modules/@uiw/react-md-editor/lib/context.d.ts","../../node_modules/@uiw/react-md-editor/lib/editor.d.ts","../../node_modules/@uiw/react-md-editor/lib/utils/inserttextatposition.d.ts","../../node_modules/@uiw/react-md-editor/lib/index.d.ts","./src/components/post-url-selector/post.url.selector.tsx","./src/components/layout/organization.selector.tsx","../../node_modules/@uidotdev/usehooks/index.d.ts","./src/components/notifications/notification.component.tsx","../../node_modules/dayjs/plugin/utc.d.ts","../../node_modules/dayjs/plugin/weekofyear.d.ts","../../node_modules/dayjs/plugin/isoweek.d.ts","../../node_modules/dayjs/plugin/isbetween.d.ts","../../libraries/react-shared-libraries/src/form/input.tsx","./src/components/launches/helpers/linkedin.component.tsx","../../libraries/react-shared-libraries/src/form/textarea.tsx","../../libraries/nestjs-libraries/src/dtos/media/media.dto.ts","../../libraries/nestjs-libraries/src/dtos/users/user.details.dto.ts","../../node_modules/@types/lodash/common/common.d.ts","../../node_modules/@types/lodash/common/array.d.ts","../../node_modules/@types/lodash/common/collection.d.ts","../../node_modules/@types/lodash/common/date.d.ts","../../node_modules/@types/lodash/common/function.d.ts","../../node_modules/@types/lodash/common/lang.d.ts","../../node_modules/@types/lodash/common/math.d.ts","../../node_modules/@types/lodash/common/number.d.ts","../../node_modules/@types/lodash/common/object.d.ts","../../node_modules/@types/lodash/common/seq.d.ts","../../node_modules/@types/lodash/common/string.d.ts","../../node_modules/@types/lodash/common/util.d.ts","../../node_modules/@types/lodash/index.d.ts","../../libraries/react-shared-libraries/src/form/select.tsx","../../libraries/react-shared-libraries/src/form/checkbox.tsx","../../libraries/nestjs-libraries/src/dtos/settings/add.team.member.dto.ts","../../node_modules/copy-to-clipboard/index.d.ts","./src/components/settings/teams.component.tsx","./src/components/layout/logout.component.tsx","./src/components/layout/settings.component.tsx","./src/components/settings/github.component.tsx","./src/components/onboarding/github.onboarding.tsx","../../node_modules/@mantine/hooks/lib/utils/assign-ref/assign-ref.d.ts","../../node_modules/@mantine/hooks/lib/utils/clamp/clamp.d.ts","../../node_modules/@mantine/hooks/lib/utils/lower-first/lower-first.d.ts","../../node_modules/@mantine/hooks/lib/utils/random-id/random-id.d.ts","../../node_modules/@mantine/hooks/lib/utils/range/range.d.ts","../../node_modules/@mantine/hooks/lib/utils/shallow-equal/shallow-equal.d.ts","../../node_modules/@mantine/hooks/lib/utils/upper-first/upper-first.d.ts","../../node_modules/@mantine/hooks/lib/utils/index.d.ts","../../node_modules/@mantine/hooks/lib/use-click-outside/use-click-outside.d.ts","../../node_modules/@mantine/hooks/lib/use-clipboard/use-clipboard.d.ts","../../node_modules/@mantine/hooks/lib/use-media-query/use-media-query.d.ts","../../node_modules/@mantine/hooks/lib/use-color-scheme/use-color-scheme.d.ts","../../node_modules/@mantine/hooks/lib/use-counter/use-counter.d.ts","../../node_modules/@mantine/hooks/lib/use-debounced-state/use-debounced-state.d.ts","../../node_modules/@mantine/hooks/lib/use-debounced-value/use-debounced-value.d.ts","../../node_modules/@mantine/hooks/lib/use-document-title/use-document-title.d.ts","../../node_modules/@mantine/hooks/lib/use-document-visibility/use-document-visibility.d.ts","../../node_modules/@mantine/hooks/lib/use-focus-return/use-focus-return.d.ts","../../node_modules/@mantine/hooks/lib/use-did-update/use-did-update.d.ts","../../node_modules/@mantine/hooks/lib/use-focus-trap/use-focus-trap.d.ts","../../node_modules/@mantine/hooks/lib/use-force-update/use-force-update.d.ts","../../node_modules/@mantine/hooks/lib/use-id/use-id.d.ts","../../node_modules/@mantine/hooks/lib/use-idle/use-idle.d.ts","../../node_modules/@mantine/hooks/lib/use-interval/use-interval.d.ts","../../node_modules/@mantine/hooks/lib/use-isomorphic-effect/use-isomorphic-effect.d.ts","../../node_modules/@mantine/hooks/lib/use-list-state/use-list-state.d.ts","../../node_modules/@mantine/hooks/lib/use-local-storage/create-storage.d.ts","../../node_modules/@mantine/hooks/lib/use-local-storage/use-local-storage.d.ts","../../node_modules/@mantine/hooks/lib/use-session-storage/use-session-storage.d.ts","../../node_modules/@mantine/hooks/lib/use-merged-ref/use-merged-ref.d.ts","../../node_modules/@mantine/hooks/lib/use-mouse/use-mouse.d.ts","../../node_modules/@mantine/hooks/lib/use-move/use-move.d.ts","../../node_modules/@mantine/hooks/lib/use-pagination/use-pagination.d.ts","../../node_modules/@mantine/hooks/lib/use-queue/use-queue.d.ts","../../node_modules/@mantine/hooks/lib/use-page-leave/use-page-leave.d.ts","../../node_modules/@mantine/hooks/lib/use-reduced-motion/use-reduced-motion.d.ts","../../node_modules/@mantine/hooks/lib/use-scroll-into-view/use-scroll-into-view.d.ts","../../node_modules/@mantine/hooks/lib/use-resize-observer/use-resize-observer.d.ts","../../node_modules/@mantine/hooks/lib/use-scroll-lock/use-scroll-lock.d.ts","../../node_modules/@mantine/hooks/lib/use-shallow-effect/use-shallow-effect.d.ts","../../node_modules/@mantine/hooks/lib/use-toggle/use-toggle.d.ts","../../node_modules/@mantine/hooks/lib/use-uncontrolled/use-uncontrolled.d.ts","../../node_modules/@mantine/hooks/lib/use-viewport-size/use-viewport-size.d.ts","../../node_modules/@mantine/hooks/lib/use-window-event/use-window-event.d.ts","../../node_modules/@mantine/hooks/lib/use-window-scroll/use-window-scroll.d.ts","../../node_modules/@mantine/hooks/lib/use-intersection/use-intersection.d.ts","../../node_modules/@mantine/hooks/lib/use-hash/use-hash.d.ts","../../node_modules/@mantine/hooks/lib/use-hotkeys/parse-hotkey.d.ts","../../node_modules/@mantine/hooks/lib/use-hotkeys/use-hotkeys.d.ts","../../node_modules/@mantine/hooks/lib/use-fullscreen/use-fullscreen.d.ts","../../node_modules/@mantine/hooks/lib/use-logger/use-logger.d.ts","../../node_modules/@mantine/hooks/lib/use-hover/use-hover.d.ts","../../node_modules/@mantine/hooks/lib/use-validated-state/use-validated-state.d.ts","../../node_modules/@mantine/hooks/lib/use-os/use-os.d.ts","../../node_modules/@mantine/hooks/lib/use-set-state/use-set-state.d.ts","../../node_modules/@mantine/hooks/lib/use-input-state/use-input-state.d.ts","../../node_modules/@mantine/hooks/lib/use-event-listener/use-event-listener.d.ts","../../node_modules/@mantine/hooks/lib/use-disclosure/use-disclosure.d.ts","../../node_modules/@mantine/hooks/lib/use-focus-within/use-focus-within.d.ts","../../node_modules/@mantine/hooks/lib/use-network/use-network.d.ts","../../node_modules/@mantine/hooks/lib/use-timeout/use-timeout.d.ts","../../node_modules/@mantine/hooks/lib/use-text-selection/use-text-selection.d.ts","../../node_modules/@mantine/hooks/lib/use-previous/use-previous.d.ts","../../node_modules/@mantine/hooks/lib/use-favicon/use-favicon.d.ts","../../node_modules/@mantine/hooks/lib/use-eye-dropper/use-eye-dropper.d.ts","../../node_modules/@mantine/hooks/lib/index.d.ts","./src/components/launches/menu/menu.tsx","../../libraries/nestjs-libraries/src/dtos/integrations/api.key.dto.ts","./src/components/launches/add.provider.component.tsx","./src/components/onboarding/connect.channels.tsx","../../libraries/react-shared-libraries/src/form/slider.tsx","../../libraries/nestjs-libraries/src/database/prisma/marketplace/tags.list.ts","../../libraries/nestjs-libraries/src/dtos/marketplace/new.conversation.dto.ts","./src/components/marketplace/order.list.tsx","./src/components/marketplace/buyer.tsx","../../node_modules/use-debounce/dist/usedebouncedcallback.d.ts","../../node_modules/use-debounce/dist/usedebounce.d.ts","../../node_modules/use-debounce/dist/usethrottledcallback.d.ts","../../node_modules/use-debounce/dist/index.d.ts","../../libraries/nestjs-libraries/src/services/stripe.country.list.ts","./src/components/marketplace/seller.tsx","./src/components/onboarding/onboarding.tsx","./src/components/layout/support.tsx","./src/components/launches/providers/continue-provider/instagram/instagram.continue.tsx","./src/components/launches/providers/continue-provider/facebook/facebook.continue.tsx","./src/components/launches/providers/continue-provider/list.tsx","./src/components/layout/continue.provider.tsx","./src/components/layout/impersonate.tsx","./src/components/layout/layout.settings.tsx","./src/app/(site)/layout.tsx","../../node_modules/chart.js/dist/core/core.config.d.ts","../../node_modules/chart.js/dist/types/utils.d.ts","../../node_modules/chart.js/dist/types/basic.d.ts","../../node_modules/chart.js/dist/core/core.adapters.d.ts","../../node_modules/chart.js/dist/types/geometric.d.ts","../../node_modules/chart.js/dist/types/animation.d.ts","../../node_modules/chart.js/dist/core/core.element.d.ts","../../node_modules/chart.js/dist/elements/element.point.d.ts","../../node_modules/chart.js/dist/helpers/helpers.easing.d.ts","../../node_modules/chart.js/dist/types/color.d.ts","../../node_modules/chart.js/dist/types/layout.d.ts","../../node_modules/chart.js/dist/plugins/plugin.colors.d.ts","../../node_modules/chart.js/dist/elements/element.arc.d.ts","../../node_modules/chart.js/dist/types/index.d.ts","../../node_modules/chart.js/dist/core/core.plugins.d.ts","../../node_modules/chart.js/dist/core/core.defaults.d.ts","../../node_modules/chart.js/dist/core/core.typedregistry.d.ts","../../node_modules/chart.js/dist/core/core.scale.d.ts","../../node_modules/chart.js/dist/core/core.registry.d.ts","../../node_modules/chart.js/dist/core/core.controller.d.ts","../../node_modules/chart.js/dist/core/core.datasetcontroller.d.ts","../../node_modules/chart.js/dist/controllers/controller.bar.d.ts","../../node_modules/chart.js/dist/controllers/controller.bubble.d.ts","../../node_modules/chart.js/dist/controllers/controller.doughnut.d.ts","../../node_modules/chart.js/dist/controllers/controller.line.d.ts","../../node_modules/chart.js/dist/controllers/controller.polararea.d.ts","../../node_modules/chart.js/dist/controllers/controller.pie.d.ts","../../node_modules/chart.js/dist/controllers/controller.radar.d.ts","../../node_modules/chart.js/dist/controllers/controller.scatter.d.ts","../../node_modules/chart.js/dist/controllers/index.d.ts","../../node_modules/chart.js/dist/core/core.animation.d.ts","../../node_modules/chart.js/dist/core/core.animations.d.ts","../../node_modules/chart.js/dist/core/core.animator.d.ts","../../node_modules/chart.js/dist/core/core.interaction.d.ts","../../node_modules/chart.js/dist/core/core.layouts.d.ts","../../node_modules/chart.js/dist/core/core.ticks.d.ts","../../node_modules/chart.js/dist/core/index.d.ts","../../node_modules/chart.js/dist/helpers/helpers.segment.d.ts","../../node_modules/chart.js/dist/elements/element.line.d.ts","../../node_modules/chart.js/dist/elements/element.bar.d.ts","../../node_modules/chart.js/dist/elements/index.d.ts","../../node_modules/chart.js/dist/platform/platform.base.d.ts","../../node_modules/chart.js/dist/platform/platform.basic.d.ts","../../node_modules/chart.js/dist/platform/platform.dom.d.ts","../../node_modules/chart.js/dist/platform/index.d.ts","../../node_modules/chart.js/dist/plugins/plugin.decimation.d.ts","../../node_modules/chart.js/dist/plugins/plugin.filler/index.d.ts","../../node_modules/chart.js/dist/plugins/plugin.legend.d.ts","../../node_modules/chart.js/dist/plugins/plugin.subtitle.d.ts","../../node_modules/chart.js/dist/plugins/plugin.title.d.ts","../../node_modules/chart.js/dist/helpers/helpers.core.d.ts","../../node_modules/chart.js/dist/plugins/plugin.tooltip.d.ts","../../node_modules/chart.js/dist/plugins/index.d.ts","../../node_modules/chart.js/dist/scales/scale.category.d.ts","../../node_modules/chart.js/dist/scales/scale.linearbase.d.ts","../../node_modules/chart.js/dist/scales/scale.linear.d.ts","../../node_modules/chart.js/dist/scales/scale.logarithmic.d.ts","../../node_modules/chart.js/dist/scales/scale.radiallinear.d.ts","../../node_modules/chart.js/dist/scales/scale.time.d.ts","../../node_modules/chart.js/dist/scales/scale.timeseries.d.ts","../../node_modules/chart.js/dist/scales/index.d.ts","../../node_modules/chart.js/dist/index.d.ts","../../node_modules/chart.js/dist/types.d.ts","../../node_modules/chart.js/auto/auto.d.ts","./src/components/analytics/chart.tsx","../../libraries/react-shared-libraries/src/helpers/utc.date.render.tsx","./src/components/analytics/stars.and.forks.tsx","./src/components/analytics/stars.table.component.tsx","./src/components/layout/loading.tsx","./src/components/analytics/analytics.component.tsx","./src/app/(site)/analytics/page.tsx","../../libraries/react-shared-libraries/src/form/track.tsx","./src/components/billing/faq.component.tsx","./src/components/billing/main.billing.component.tsx","./src/components/billing/billing.component.tsx","./src/app/(site)/billing/page.tsx","./src/components/billing/lifetime.deal.tsx","./src/app/(site)/billing/lifetime/page.tsx","./src/app/(site)/err/page.tsx","../../node_modules/next/dist/client/components/draft-mode.d.ts","../../node_modules/next/dist/client/components/headers.d.ts","../../node_modules/next/headers.d.ts","../../libraries/helpers/src/utils/internal.fetch.ts","./src/app/(site)/integrations/social/[provider]/page.tsx","../../libraries/react-shared-libraries/src/helpers/use.prevent.window.unload.tsx","./src/components/launches/helpers/use.hide.top.editor.tsx","./src/components/launches/helpers/use.move.to.integration.tsx","./src/components/launches/helpers/use.existing.data.tsx","./src/components/launches/helpers/new.image.component.tsx","./src/components/launches/helpers/use.expend.tsx","./src/components/launches/helpers/pick.platform.component.tsx","./src/components/launches/up.down.arrow.tsx","../../node_modules/array-move/index.d.ts","./src/components/launches/providers/high.order.provider.tsx","../../libraries/nestjs-libraries/src/dtos/posts/providers-settings/dev.to.tags.settings.dto.ts","../../libraries/nestjs-libraries/src/dtos/posts/providers-settings/dev.to.settings.dto.ts","./src/components/launches/providers/devto/select.organization.tsx","../../node_modules/react-tag-autocomplete/dist/types.d.ts","./src/components/launches/providers/devto/devto.tags.tsx","../../node_modules/next/dist/compiled/@next/font/dist/local/index.d.ts","../../node_modules/next/font/local/index.d.ts","../../libraries/react-shared-libraries/src/form/canonical.tsx","./src/components/launches/providers/devto/devto.provider.tsx","../../libraries/react-shared-libraries/src/helpers/video.or.image.tsx","./src/components/launches/providers/x/x.provider.tsx","../../libraries/helpers/src/utils/linkedin.company.prevent.remove.ts","./src/components/launches/providers/linkedin/linkedin.provider.tsx","./src/components/launches/providers/reddit/subreddit.tsx","../../libraries/nestjs-libraries/src/dtos/posts/providers-settings/reddit.dto.ts","./src/components/launches/providers/reddit/reddit.provider.tsx","./src/components/launches/providers/medium/medium.publications.tsx","./src/components/launches/providers/medium/medium.tags.tsx","../../libraries/nestjs-libraries/src/dtos/posts/providers-settings/medium.settings.dto.ts","./src/components/launches/providers/medium/medium.provider.tsx","./src/components/launches/providers/hashnode/hashnode.publications.tsx","./src/components/launches/providers/hashnode/hashnode.tags.tsx","../../libraries/nestjs-libraries/src/dtos/posts/providers-settings/hashnode.settings.dto.ts","./src/components/launches/providers/hashnode/hashnode.provider.tsx","./src/components/launches/providers/facebook/facebook.provider.tsx","./src/components/launches/providers/instagram/instagram.provider.tsx","../../libraries/nestjs-libraries/src/dtos/posts/providers-settings/youtube.settings.dto.ts","./src/components/launches/providers/youtube/youtube.provider.tsx","./src/components/launches/providers/tiktok/tiktok.provider.tsx","./src/components/launches/providers/pinterest/pinterest.board.tsx","../../libraries/nestjs-libraries/src/dtos/posts/providers-settings/pinterest.dto.ts","../../node_modules/react-colorful/dist/types.d.ts","../../node_modules/react-colorful/dist/components/hexcolorpicker.d.ts","../../node_modules/react-colorful/dist/components/hexalphacolorpicker.d.ts","../../node_modules/react-colorful/dist/components/hslacolorpicker.d.ts","../../node_modules/react-colorful/dist/components/hslastringcolorpicker.d.ts","../../node_modules/react-colorful/dist/components/hslcolorpicker.d.ts","../../node_modules/react-colorful/dist/components/hslstringcolorpicker.d.ts","../../node_modules/react-colorful/dist/components/hsvacolorpicker.d.ts","../../node_modules/react-colorful/dist/components/hsvastringcolorpicker.d.ts","../../node_modules/react-colorful/dist/components/hsvcolorpicker.d.ts","../../node_modules/react-colorful/dist/components/hsvstringcolorpicker.d.ts","../../node_modules/react-colorful/dist/components/rgbacolorpicker.d.ts","../../node_modules/react-colorful/dist/components/rgbastringcolorpicker.d.ts","../../node_modules/react-colorful/dist/components/rgbcolorpicker.d.ts","../../node_modules/react-colorful/dist/components/rgbstringcolorpicker.d.ts","../../node_modules/react-colorful/dist/components/hexcolorinput.d.ts","../../node_modules/react-colorful/dist/utils/nonce.d.ts","../../node_modules/react-colorful/dist/index.d.ts","../../libraries/react-shared-libraries/src/form/color.picker.tsx","./src/components/launches/providers/pinterest/pinterest.provider.tsx","./src/components/launches/providers/show.all.providers.tsx","./src/components/launches/providers.options.tsx","../../node_modules/@types/uuid/index.d.ts","../../node_modules/@mantine/dates/lib/types.d.ts","../../node_modules/@mantine/dates/lib/utils/get-end-of-week/get-end-of-week.d.ts","../../node_modules/@mantine/dates/lib/utils/get-month-days/get-month-days.d.ts","../../node_modules/@mantine/dates/lib/utils/get-months-names/get-months-names.d.ts","../../node_modules/@mantine/dates/lib/utils/get-start-of-week/get-start-of-week.d.ts","../../node_modules/@mantine/dates/lib/utils/get-weekdays-names/get-weekdays-names.d.ts","../../node_modules/@mantine/dates/lib/utils/get-years-range/get-years-range.d.ts","../../node_modules/@mantine/dates/lib/utils/is-same-date/is-same-date.d.ts","../../node_modules/@mantine/dates/lib/utils/is-same-month/is-same-month.d.ts","../../node_modules/@mantine/dates/lib/utils/index.d.ts","../../node_modules/@mantine/dates/lib/components/month/day/day.styles.d.ts","../../node_modules/@mantine/dates/lib/components/month/day/day.d.ts","../../node_modules/@mantine/dates/lib/components/month/types.d.ts","../../node_modules/@mantine/dates/lib/components/month/month.styles.d.ts","../../node_modules/@mantine/dates/lib/components/month/month.d.ts","../../node_modules/@mantine/dates/lib/components/month/index.d.ts","../../node_modules/@mantine/dates/lib/components/calendarbase/calendarheader/calendarheader.styles.d.ts","../../node_modules/@mantine/dates/lib/components/calendarbase/calendarheader/calendarheader.d.ts","../../node_modules/@mantine/dates/lib/components/calendarbase/yearpicker/yearpicker.styles.d.ts","../../node_modules/@mantine/dates/lib/components/calendarbase/yearpicker/yearpicker.d.ts","../../node_modules/@mantine/dates/lib/components/calendarbase/monthpicker/monthpicker.styles.d.ts","../../node_modules/@mantine/dates/lib/components/calendarbase/monthpicker/monthpicker.d.ts","../../node_modules/@mantine/dates/lib/components/calendarbase/monthslist/monthslist.d.ts","../../node_modules/@mantine/dates/lib/components/calendarbase/calendarbase.styles.d.ts","../../node_modules/@mantine/dates/lib/components/calendarbase/calendarbase.d.ts","../../node_modules/@mantine/dates/lib/components/calendar/calendar.d.ts","../../node_modules/@mantine/dates/lib/components/calendar/index.d.ts","../../node_modules/@mantine/dates/lib/components/datepickerbase/datepickerbase.styles.d.ts","../../node_modules/@mantine/dates/lib/components/datepickerbase/datepickerbase.d.ts","../../node_modules/@mantine/dates/lib/components/datepicker/datepicker.d.ts","../../node_modules/@mantine/dates/lib/components/datepicker/index.d.ts","../../node_modules/@mantine/dates/lib/components/daterangepicker/daterangepicker.d.ts","../../node_modules/@mantine/dates/lib/components/daterangepicker/index.d.ts","../../node_modules/@mantine/dates/lib/components/rangecalendar/rangecalendar.d.ts","../../node_modules/@mantine/dates/lib/components/rangecalendar/index.d.ts","../../node_modules/@mantine/dates/lib/components/timeinput/timeinput.styles.d.ts","../../node_modules/@mantine/dates/lib/components/timeinput/timeinput.d.ts","../../node_modules/@mantine/dates/lib/components/timeinput/index.d.ts","../../node_modules/@mantine/dates/lib/components/timerangeinput/timerangeinput.styles.d.ts","../../node_modules/@mantine/dates/lib/components/timerangeinput/timerangeinput.d.ts","../../node_modules/@mantine/dates/lib/components/timerangeinput/index.d.ts","../../node_modules/@mantine/dates/lib/components/calendarbase/index.d.ts","../../node_modules/@mantine/dates/lib/components/datepickerbase/index.d.ts","../../node_modules/@mantine/dates/lib/index.d.ts","./src/components/launches/helpers/date.picker.tsx","../../libraries/react-shared-libraries/src/form/custom.select.tsx","./src/components/launches/post.to.organization.tsx","./src/components/launches/submitted.tsx","./src/components/launches/add.edit.model.tsx","../../node_modules/dnd-core/dist/interfaces.d.ts","../../node_modules/dnd-core/dist/createdragdropmanager.d.ts","../../node_modules/dnd-core/dist/index.d.ts","../../node_modules/react-dnd/dist/core/dndcontext.d.ts","../../node_modules/react-dnd/dist/core/dndprovider.d.ts","../../node_modules/react-dnd/dist/types/options.d.ts","../../node_modules/react-dnd/dist/types/connectors.d.ts","../../node_modules/react-dnd/dist/types/monitors.d.ts","../../node_modules/react-dnd/dist/types/index.d.ts","../../node_modules/react-dnd/dist/core/dragpreviewimage.d.ts","../../node_modules/react-dnd/dist/core/index.d.ts","../../node_modules/react-dnd/dist/hooks/types.d.ts","../../node_modules/react-dnd/dist/hooks/usedrag/usedrag.d.ts","../../node_modules/react-dnd/dist/hooks/usedrag/index.d.ts","../../node_modules/react-dnd/dist/hooks/usedragdropmanager.d.ts","../../node_modules/react-dnd/dist/hooks/usedraglayer.d.ts","../../node_modules/react-dnd/dist/hooks/usedrop/usedrop.d.ts","../../node_modules/react-dnd/dist/hooks/usedrop/index.d.ts","../../node_modules/react-dnd/dist/hooks/index.d.ts","../../node_modules/react-dnd/dist/index.d.ts","../../node_modules/react-dnd-html5-backend/dist/getemptyimage.d.ts","../../node_modules/react-dnd-html5-backend/dist/nativetypes.d.ts","../../node_modules/react-dnd-html5-backend/dist/types.d.ts","../../node_modules/react-dnd-html5-backend/dist/index.d.ts","./src/components/launches/helpers/dnd.provider.tsx","./src/components/launches/comments/comment.component.tsx","./src/components/marketplace/marketplace.provider.tsx","./src/components/marketplace/preview.popup.dynamic.tsx","./src/components/marketplace/special.message.tsx","./src/components/launches/calendar.tsx","./src/components/launches/filters.tsx","../../libraries/nestjs-libraries/src/dtos/generator/generator.dto.ts","./src/components/launches/generator/generator.tsx","./src/components/launches/launches.component.tsx","./src/app/(site)/launches/page.tsx","./src/components/marketplace/buyer.seller.tsx","./src/app/(site)/marketplace/layout.tsx","./src/app/(site)/marketplace/page.tsx","./src/app/(site)/marketplace/buyer/page.tsx","./src/app/(site)/marketplace/seller/page.tsx","./src/components/messages/layout.tsx","./src/app/(site)/messages/layout.tsx","./src/app/(site)/messages/page.tsx","../../libraries/nestjs-libraries/src/dtos/messages/add.message.ts","../../libraries/nestjs-libraries/src/services/make.is.ts","../../libraries/react-shared-libraries/src/form/total.tsx","../../node_modules/yup/node_modules/type-fest/source/primitive.d.ts","../../node_modules/yup/node_modules/type-fest/source/typed-array.d.ts","../../node_modules/yup/node_modules/type-fest/source/basic.d.ts","../../node_modules/yup/node_modules/type-fest/source/observable-like.d.ts","../../node_modules/yup/node_modules/type-fest/source/internal.d.ts","../../node_modules/yup/node_modules/type-fest/source/except.d.ts","../../node_modules/yup/node_modules/type-fest/source/simplify.d.ts","../../node_modules/yup/node_modules/type-fest/source/writable.d.ts","../../node_modules/yup/node_modules/type-fest/source/mutable.d.ts","../../node_modules/yup/node_modules/type-fest/source/merge.d.ts","../../node_modules/yup/node_modules/type-fest/source/merge-exclusive.d.ts","../../node_modules/yup/node_modules/type-fest/source/require-at-least-one.d.ts","../../node_modules/yup/node_modules/type-fest/source/require-exactly-one.d.ts","../../node_modules/yup/node_modules/type-fest/source/require-all-or-none.d.ts","../../node_modules/yup/node_modules/type-fest/source/remove-index-signature.d.ts","../../node_modules/yup/node_modules/type-fest/source/partial-deep.d.ts","../../node_modules/yup/node_modules/type-fest/source/partial-on-undefined-deep.d.ts","../../node_modules/yup/node_modules/type-fest/source/readonly-deep.d.ts","../../node_modules/yup/node_modules/type-fest/source/literal-union.d.ts","../../node_modules/yup/node_modules/type-fest/source/promisable.d.ts","../../node_modules/yup/node_modules/type-fest/source/opaque.d.ts","../../node_modules/yup/node_modules/type-fest/source/invariant-of.d.ts","../../node_modules/yup/node_modules/type-fest/source/set-optional.d.ts","../../node_modules/yup/node_modules/type-fest/source/set-required.d.ts","../../node_modules/yup/node_modules/type-fest/source/set-non-nullable.d.ts","../../node_modules/yup/node_modules/type-fest/source/value-of.d.ts","../../node_modules/yup/node_modules/type-fest/source/promise-value.d.ts","../../node_modules/yup/node_modules/type-fest/source/async-return-type.d.ts","../../node_modules/yup/node_modules/type-fest/source/conditional-keys.d.ts","../../node_modules/yup/node_modules/type-fest/source/conditional-except.d.ts","../../node_modules/yup/node_modules/type-fest/source/conditional-pick.d.ts","../../node_modules/yup/node_modules/type-fest/source/union-to-intersection.d.ts","../../node_modules/yup/node_modules/type-fest/source/stringified.d.ts","../../node_modules/yup/node_modules/type-fest/source/fixed-length-array.d.ts","../../node_modules/yup/node_modules/type-fest/source/multidimensional-array.d.ts","../../node_modules/yup/node_modules/type-fest/source/multidimensional-readonly-array.d.ts","../../node_modules/yup/node_modules/type-fest/source/iterable-element.d.ts","../../node_modules/yup/node_modules/type-fest/source/entry.d.ts","../../node_modules/yup/node_modules/type-fest/source/entries.d.ts","../../node_modules/yup/node_modules/type-fest/source/set-return-type.d.ts","../../node_modules/yup/node_modules/type-fest/source/asyncify.d.ts","../../node_modules/yup/node_modules/type-fest/source/numeric.d.ts","../../node_modules/yup/node_modules/type-fest/source/jsonify.d.ts","../../node_modules/yup/node_modules/type-fest/source/schema.d.ts","../../node_modules/yup/node_modules/type-fest/source/literal-to-primitive.d.ts","../../node_modules/yup/node_modules/type-fest/source/string-key-of.d.ts","../../node_modules/yup/node_modules/type-fest/source/exact.d.ts","../../node_modules/yup/node_modules/type-fest/source/readonly-tuple.d.ts","../../node_modules/yup/node_modules/type-fest/source/optional-keys-of.d.ts","../../node_modules/yup/node_modules/type-fest/source/has-optional-keys.d.ts","../../node_modules/yup/node_modules/type-fest/source/required-keys-of.d.ts","../../node_modules/yup/node_modules/type-fest/source/has-required-keys.d.ts","../../node_modules/yup/node_modules/type-fest/source/spread.d.ts","../../node_modules/yup/node_modules/type-fest/source/split.d.ts","../../node_modules/yup/node_modules/type-fest/source/camel-case.d.ts","../../node_modules/yup/node_modules/type-fest/source/camel-cased-properties.d.ts","../../node_modules/yup/node_modules/type-fest/source/camel-cased-properties-deep.d.ts","../../node_modules/yup/node_modules/type-fest/source/delimiter-case.d.ts","../../node_modules/yup/node_modules/type-fest/source/kebab-case.d.ts","../../node_modules/yup/node_modules/type-fest/source/delimiter-cased-properties.d.ts","../../node_modules/yup/node_modules/type-fest/source/kebab-cased-properties.d.ts","../../node_modules/yup/node_modules/type-fest/source/delimiter-cased-properties-deep.d.ts","../../node_modules/yup/node_modules/type-fest/source/kebab-cased-properties-deep.d.ts","../../node_modules/yup/node_modules/type-fest/source/pascal-case.d.ts","../../node_modules/yup/node_modules/type-fest/source/pascal-cased-properties.d.ts","../../node_modules/yup/node_modules/type-fest/source/pascal-cased-properties-deep.d.ts","../../node_modules/yup/node_modules/type-fest/source/snake-case.d.ts","../../node_modules/yup/node_modules/type-fest/source/snake-cased-properties.d.ts","../../node_modules/yup/node_modules/type-fest/source/snake-cased-properties-deep.d.ts","../../node_modules/yup/node_modules/type-fest/source/includes.d.ts","../../node_modules/yup/node_modules/type-fest/source/screaming-snake-case.d.ts","../../node_modules/yup/node_modules/type-fest/source/join.d.ts","../../node_modules/yup/node_modules/type-fest/source/trim.d.ts","../../node_modules/yup/node_modules/type-fest/source/replace.d.ts","../../node_modules/yup/node_modules/type-fest/source/get.d.ts","../../node_modules/yup/node_modules/type-fest/source/last-array-element.d.ts","../../node_modules/yup/node_modules/type-fest/source/package-json.d.ts","../../node_modules/yup/node_modules/type-fest/source/tsconfig-json.d.ts","../../node_modules/yup/node_modules/type-fest/index.d.ts","../../node_modules/yup/index.d.ts","../../node_modules/@hookform/resolvers/yup/dist/yup.d.ts","../../node_modules/@hookform/resolvers/yup/dist/index.d.ts","./src/components/marketplace/order.top.actions.tsx","../../libraries/react-shared-libraries/src/helpers/use.is.visible.tsx","./src/components/messages/messages.tsx","./src/app/(site)/messages/[id]/page.tsx","./src/components/settings/settings.component.tsx","./src/app/(site)/settings/page.tsx","./src/app/auth/layout.tsx","../../libraries/nestjs-libraries/src/dtos/auth/create.org.user.dto.ts","./src/app/auth/providers/github.provider.tsx","./src/components/auth/register.tsx","./src/app/auth/page.tsx","../../libraries/nestjs-libraries/src/dtos/auth/forgot.password.dto.ts","./src/components/auth/forgot.tsx","./src/app/auth/forgot/page.tsx","../../libraries/nestjs-libraries/src/dtos/auth/forgot-return.password.dto.ts","./src/components/auth/forgot-return.tsx","./src/app/auth/forgot/[token]/page.tsx","../../libraries/nestjs-libraries/src/dtos/auth/login.user.dto.ts","./src/components/auth/login.tsx","./src/app/auth/login/page.tsx","./src/components/marketplace/marketplace.tsx","../../node_modules/@nx/next/src/utils/types.d.ts","../../node_modules/@nx/next/src/utils/generate-globs.d.ts","../../node_modules/@types/node/ts4.8/fs.d.ts","../../node_modules/nx/src/generators/tree.d.ts","../../node_modules/nx/src/command-line/release/utils/git.d.ts","../../node_modules/nx/src/config/project-graph.d.ts","../../node_modules/nx/src/command-line/release/config/config.d.ts","../../node_modules/nx/src/command-line/release/config/filter-release-groups.d.ts","../../node_modules/nx/src/command-line/release/utils/shared.d.ts","../../node_modules/nx/src/command-line/release/utils/github.d.ts","../../node_modules/nx/release/changelog-renderer/index.d.ts","../../node_modules/nx/src/utils/package-manager.d.ts","../../node_modules/nx/src/config/nx-json.d.ts","../../node_modules/nx/src/config/workspace-json-project-json.d.ts","../../node_modules/nx/src/config/task-graph.d.ts","../../node_modules/nx/src/utils/package-json.d.ts","../../node_modules/nx/src/utils/nx-plugin.deprecated.d.ts","../../node_modules/nx/src/project-graph/project-graph-builder.d.ts","../../node_modules/nx/src/utils/nx-plugin.d.ts","../../node_modules/nx/src/plugins/target-defaults/target-defaults-plugin.d.ts","../../node_modules/nx/src/project-graph/utils/project-configuration-utils.d.ts","../../node_modules/nx/src/daemon/client/client.d.ts","../../node_modules/nx/src/native/index.d.ts","../../node_modules/nx/src/hasher/task-hasher.d.ts","../../node_modules/enquirer/index.d.ts","../../node_modules/nx/src/utils/params.d.ts","../../node_modules/nx/src/config/misc-interfaces.d.ts","../../node_modules/nx/src/config/workspaces.d.ts","../../node_modules/nx/src/config/configuration.d.ts","../../node_modules/nx/src/utils/logger.d.ts","../../node_modules/nx/node_modules/chalk/index.d.ts","../../node_modules/@types/yargs-parser/index.d.ts","../../node_modules/@types/yargs/index.d.ts","../../node_modules/nx/src/utils/command-line-utils.d.ts","../../node_modules/nx/src/tasks-runner/tasks-runner.d.ts","../../node_modules/nx/src/utils/output.d.ts","../../node_modules/nx/src/command-line/run/run.d.ts","../../node_modules/nx/src/generators/utils/nx-json.d.ts","../../node_modules/nx/src/generators/utils/project-configuration.d.ts","../../node_modules/nx/src/generators/utils/glob.d.ts","../../node_modules/nx/node_modules/jsonc-parser/lib/umd/main.d.ts","../../node_modules/nx/src/utils/json.d.ts","../../node_modules/nx/src/generators/utils/json.d.ts","../../node_modules/nx/src/utils/fileutils.d.ts","../../node_modules/nx/src/utils/strip-indents.d.ts","../../node_modules/nx/src/utils/path.d.ts","../../node_modules/nx/src/utils/workspace-root.d.ts","../../node_modules/nx/src/utils/app-root.d.ts","../../node_modules/nx/src/project-graph/operators.d.ts","../../node_modules/nx/src/project-graph/project-graph.d.ts","../../node_modules/nx/src/tasks-runner/utils.d.ts","../../node_modules/nx/src/tasks-runner/life-cycle.d.ts","../../node_modules/nx/src/tasks-runner/default-tasks-runner.d.ts","../../node_modules/nx/src/hasher/file-hasher.d.ts","../../node_modules/nx/src/utils/cache-directory.d.ts","../../node_modules/nx/src/project-graph/file-map-utils.d.ts","../../node_modules/nx/src/devkit-exports.d.ts","../../node_modules/@nx/devkit/src/generators/format-files.d.ts","../../node_modules/@nx/devkit/src/generators/generate-files.d.ts","../../node_modules/typescript/lib/typescript.d.ts","../../node_modules/@nx/devkit/src/generators/to-js.d.ts","../../node_modules/@nx/devkit/src/generators/update-ts-configs-to-js.d.ts","../../node_modules/@nx/devkit/src/generators/run-tasks-in-serial.d.ts","../../node_modules/@nx/devkit/src/generators/visit-not-ignored-files.d.ts","../../node_modules/@nx/devkit/src/executors/parse-target-string.d.ts","../../node_modules/@nx/devkit/src/executors/read-target-options.d.ts","../../node_modules/@nx/devkit/src/utils/package-json.d.ts","../../node_modules/@nx/devkit/src/tasks/install-packages-task.d.ts","../../node_modules/@nx/devkit/src/utils/names.d.ts","../../node_modules/@nx/devkit/src/utils/get-workspace-layout.d.ts","../../node_modules/@nx/devkit/src/utils/string-change.d.ts","../../node_modules/@nx/devkit/src/utils/offset-from-root.d.ts","../../node_modules/@nx/devkit/src/utils/invoke-nx-generator.d.ts","../../node_modules/@nx/devkit/src/utils/convert-nx-executor.d.ts","../../node_modules/@nx/devkit/src/utils/move-dir.d.ts","../../node_modules/@nx/devkit/public-api.d.ts","../../node_modules/@nx/devkit/index.d.ts","../../node_modules/@nx/devkit/src/generators/project-name-and-root-utils.d.ts","../../node_modules/@nx/eslint/src/generators/utils/linter.d.ts","../../node_modules/@nx/eslint/src/generators/lint-project/lint-project.d.ts","../../node_modules/@nx/eslint/src/generators/init/init.d.ts","../../node_modules/@types/eslint/helpers.d.ts","../../node_modules/@types/json-schema/index.d.ts","../../node_modules/@types/eslint/index.d.ts","../../node_modules/@nx/eslint/src/utils/rules-requiring-type-checking.d.ts","../../node_modules/@nx/eslint/index.d.ts","../../node_modules/@nx/react/src/utils/lint.d.ts","../../node_modules/@nx/react/src/utils/dependencies.d.ts","../../node_modules/@nx/react/src/utils/styled.d.ts","../../node_modules/@nx/react/src/utils/assertion.d.ts","../../node_modules/@nx/react/src/utils/versions.d.ts","../../node_modules/@nx/react/typings/style.d.ts","../../node_modules/@nx/react/src/generators/application/schema.d.ts","../../node_modules/@nx/react/src/generators/application/application.d.ts","../../node_modules/@nx/react/src/generators/component/schema.d.ts","../../node_modules/@nx/react/src/generators/component/component.d.ts","../../node_modules/@nx/react/src/generators/hook/schema.d.ts","../../node_modules/@nx/react/src/generators/hook/hook.d.ts","../../node_modules/@nx/react/src/generators/component-cypress-spec/component-cypress-spec.d.ts","../../node_modules/@nx/react/src/generators/component-story/component-story.d.ts","../../node_modules/@nx/react/src/generators/library/schema.d.ts","../../node_modules/@nx/react/src/generators/library/library.d.ts","../../node_modules/@nx/react/src/generators/init/schema.d.ts","../../node_modules/@nx/react/src/generators/init/init.d.ts","../../node_modules/@nx/react/src/generators/redux/schema.d.ts","../../node_modules/@nx/react/src/generators/redux/redux.d.ts","../../node_modules/@nx/react/src/generators/stories/stories.d.ts","../../node_modules/@nx/react/src/generators/storybook-configuration/schema.d.ts","../../node_modules/@nx/react/src/generators/storybook-configuration/configuration.d.ts","../../node_modules/@nx/react/src/generators/host/schema.d.ts","../../node_modules/@nx/react/src/generators/host/host.d.ts","../../node_modules/@nx/react/src/generators/remote/schema.d.ts","../../node_modules/@nx/react/src/generators/remote/remote.d.ts","../../node_modules/@nx/react/src/generators/cypress-component-configuration/schema.d.ts","../../node_modules/@nx/react/src/generators/cypress-component-configuration/cypress-component-configuration.d.ts","../../node_modules/@nx/react/src/generators/component-test/schema.d.ts","../../node_modules/@nx/react/src/generators/component-test/component-test.d.ts","../../node_modules/@nx/react/src/generators/setup-tailwind/schema.d.ts","../../node_modules/@nx/react/src/generators/setup-tailwind/setup-tailwind.d.ts","../../node_modules/buffer/index.d.ts","../../node_modules/schema-utils/declarations/validationerror.d.ts","../../node_modules/schema-utils/node_modules/ajv/lib/ajv.d.ts","../../node_modules/schema-utils/declarations/validate.d.ts","../../node_modules/schema-utils/declarations/index.d.ts","../../node_modules/tapable/tapable.d.ts","../../node_modules/webpack/types.d.ts","../../node_modules/@nx/webpack/src/generators/configuration/schema.d.ts","../../node_modules/@nx/webpack/src/generators/configuration/configuration.d.ts","../../node_modules/copy-webpack-plugin/node_modules/schema-utils/declarations/validationerror.d.ts","../../node_modules/uri-js/dist/es5/uri.all.d.ts","../../node_modules/ajv/dist/compile/codegen/code.d.ts","../../node_modules/ajv/dist/compile/codegen/scope.d.ts","../../node_modules/ajv/dist/compile/codegen/index.d.ts","../../node_modules/ajv/dist/compile/rules.d.ts","../../node_modules/ajv/dist/compile/util.d.ts","../../node_modules/ajv/dist/compile/validate/subschema.d.ts","../../node_modules/ajv/dist/compile/errors.d.ts","../../node_modules/ajv/dist/compile/validate/index.d.ts","../../node_modules/ajv/dist/compile/validate/datatype.d.ts","../../node_modules/ajv/dist/vocabularies/applicator/additionalitems.d.ts","../../node_modules/ajv/dist/vocabularies/applicator/items2020.d.ts","../../node_modules/ajv/dist/vocabularies/applicator/contains.d.ts","../../node_modules/ajv/dist/vocabularies/applicator/dependencies.d.ts","../../node_modules/ajv/dist/vocabularies/applicator/propertynames.d.ts","../../node_modules/ajv/dist/vocabularies/applicator/additionalproperties.d.ts","../../node_modules/ajv/dist/vocabularies/applicator/not.d.ts","../../node_modules/ajv/dist/vocabularies/applicator/anyof.d.ts","../../node_modules/ajv/dist/vocabularies/applicator/oneof.d.ts","../../node_modules/ajv/dist/vocabularies/applicator/if.d.ts","../../node_modules/ajv/dist/vocabularies/applicator/index.d.ts","../../node_modules/ajv/dist/vocabularies/validation/limitnumber.d.ts","../../node_modules/ajv/dist/vocabularies/validation/multipleof.d.ts","../../node_modules/ajv/dist/vocabularies/validation/pattern.d.ts","../../node_modules/ajv/dist/vocabularies/validation/required.d.ts","../../node_modules/ajv/dist/vocabularies/validation/uniqueitems.d.ts","../../node_modules/ajv/dist/vocabularies/validation/const.d.ts","../../node_modules/ajv/dist/vocabularies/validation/enum.d.ts","../../node_modules/ajv/dist/vocabularies/validation/index.d.ts","../../node_modules/ajv/dist/vocabularies/format/format.d.ts","../../node_modules/ajv/dist/vocabularies/unevaluated/unevaluatedproperties.d.ts","../../node_modules/ajv/dist/vocabularies/unevaluated/unevaluateditems.d.ts","../../node_modules/ajv/dist/vocabularies/validation/dependentrequired.d.ts","../../node_modules/ajv/dist/vocabularies/discriminator/types.d.ts","../../node_modules/ajv/dist/vocabularies/discriminator/index.d.ts","../../node_modules/ajv/dist/vocabularies/errors.d.ts","../../node_modules/ajv/dist/types/json-schema.d.ts","../../node_modules/ajv/dist/types/jtd-schema.d.ts","../../node_modules/ajv/dist/runtime/validation_error.d.ts","../../node_modules/ajv/dist/compile/ref_error.d.ts","../../node_modules/ajv/dist/core.d.ts","../../node_modules/ajv/dist/compile/resolve.d.ts","../../node_modules/ajv/dist/compile/index.d.ts","../../node_modules/ajv/dist/types/index.d.ts","../../node_modules/ajv/dist/ajv.d.ts","../../node_modules/copy-webpack-plugin/node_modules/schema-utils/declarations/validate.d.ts","../../node_modules/@nodelib/fs.stat/out/types/index.d.ts","../../node_modules/@nodelib/fs.stat/out/adapters/fs.d.ts","../../node_modules/@nodelib/fs.stat/out/settings.d.ts","../../node_modules/@nodelib/fs.stat/out/providers/async.d.ts","../../node_modules/@nodelib/fs.stat/out/index.d.ts","../../node_modules/@nodelib/fs.scandir/out/types/index.d.ts","../../node_modules/@nodelib/fs.scandir/out/adapters/fs.d.ts","../../node_modules/@nodelib/fs.scandir/out/settings.d.ts","../../node_modules/@nodelib/fs.scandir/out/providers/async.d.ts","../../node_modules/@nodelib/fs.scandir/out/index.d.ts","../../node_modules/@nodelib/fs.walk/out/types/index.d.ts","../../node_modules/@nodelib/fs.walk/out/settings.d.ts","../../node_modules/@nodelib/fs.walk/out/readers/reader.d.ts","../../node_modules/@nodelib/fs.walk/out/readers/async.d.ts","../../node_modules/@nodelib/fs.walk/out/providers/async.d.ts","../../node_modules/@nodelib/fs.walk/out/index.d.ts","../../node_modules/fast-glob/out/types/index.d.ts","../../node_modules/fast-glob/out/settings.d.ts","../../node_modules/fast-glob/out/managers/tasks.d.ts","../../node_modules/fast-glob/out/index.d.ts","../../node_modules/copy-webpack-plugin/node_modules/globby/index.d.ts","../../node_modules/copy-webpack-plugin/types/index.d.ts","../../node_modules/@nx/js/src/utils/assets/assets.d.ts","../../node_modules/@nx/webpack/src/executors/webpack/schema.d.ts","../../node_modules/@nx/webpack/src/utils/create-copy-plugin.d.ts","../../node_modules/@nx/webpack/src/utils/config.d.ts","../../node_modules/@nx/webpack/src/generators/init/schema.d.ts","../../node_modules/@nx/webpack/src/generators/init/init.d.ts","../../node_modules/@nx/webpack/src/executors/dev-server/schema.d.ts","../../node_modules/@nx/webpack/src/executors/dev-server/dev-server.impl.d.ts","../../node_modules/@nx/webpack/src/executors/webpack/lib/normalize-options.d.ts","../../node_modules/@nx/webpack/src/executors/webpack/webpack.impl.d.ts","../../node_modules/@nx/webpack/src/utils/get-css-module-local-ident.d.ts","../../node_modules/@nx/webpack/src/plugins/nx-webpack-plugin/nx-webpack-plugin-options.d.ts","../../node_modules/@nx/webpack/src/utils/with-nx.d.ts","../../node_modules/@nx/webpack/src/utils/with-web.d.ts","../../node_modules/@nx/webpack/src/utils/module-federation/models/index.d.ts","../../node_modules/@nx/webpack/src/utils/module-federation/share.d.ts","../../node_modules/@nx/webpack/src/utils/module-federation/remotes.d.ts","../../node_modules/@nx/webpack/src/utils/module-federation/dependencies.d.ts","../../node_modules/@nx/webpack/src/utils/module-federation/package-json.d.ts","../../node_modules/@nx/webpack/src/utils/module-federation/public-api.d.ts","../../node_modules/@nx/webpack/src/plugins/nx-webpack-plugin/nx-webpack-plugin.d.ts","../../node_modules/@nx/webpack/src/plugins/nx-typescript-webpack-plugin/nx-tsconfig-paths-webpack-plugin.d.ts","../../node_modules/@nx/webpack/index.d.ts","../../node_modules/@nx/react/plugins/with-react.d.ts","../../node_modules/@nx/react/plugins/nx-react-webpack-plugin/nx-react-webpack-plugin.d.ts","../../node_modules/@nx/react/index.d.ts","../../node_modules/@nx/next/src/generators/application/schema.d.ts","../../node_modules/@nx/next/src/generators/application/application.d.ts","../../node_modules/@nx/next/src/generators/component/component.d.ts","../../node_modules/@nx/next/src/generators/library/schema.d.ts","../../node_modules/@nx/next/src/generators/library/library.d.ts","../../node_modules/@nx/next/src/generators/page/schema.d.ts","../../node_modules/@nx/next/src/generators/page/page.d.ts","../../node_modules/@nx/next/src/utils/config.d.ts","../../node_modules/@nx/next/plugins/with-nx.d.ts","../../node_modules/@nx/next/src/utils/compose-plugins.d.ts","../../node_modules/@nx/next/index.d.ts","./next.config.js","./postcss.config.js","../../node_modules/@nx/react/tailwind.d.ts","../../node_modules/tailwindcss/types/generated/corepluginlist.d.ts","../../node_modules/tailwindcss/types/generated/colors.d.ts","../../node_modules/tailwindcss/types/config.d.ts","../../node_modules/tailwind-scrollbar/src/index.d.ts","./tailwind.config.js","./.next/types/app/layout.ts","./.next/types/app/(site)/layout.ts","./.next/types/app/(site)/launches/page.ts","../../node_modules/@jest/expect-utils/build/index.d.ts","../../node_modules/jest-matcher-utils/node_modules/chalk/index.d.ts","../../node_modules/@sinclair/typebox/typebox.d.ts","../../node_modules/@jest/schemas/build/index.d.ts","../../node_modules/jest-diff/node_modules/pretty-format/build/index.d.ts","../../node_modules/jest-diff/build/index.d.ts","../../node_modules/jest-matcher-utils/build/index.d.ts","../../node_modules/expect/build/index.d.ts","../../node_modules/@types/jest/node_modules/pretty-format/build/index.d.ts","../../node_modules/@types/jest/index.d.ts"],"fileInfos":[{"version":"f33e5332b24c3773e930e212cbb8b6867c8ba3ec4492064ea78e55a524d57450","affectsGlobalScope":true},"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","26f2f787e82c4222710f3b676b4d83eb5ad0a72fa7b746f03449e7a026ce5073","9a68c0c07ae2fa71b44384a839b7b8d81662a236d4b9ac30916718f7510b1b2d","5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4",{"version":"21e41a76098aa7a191028256e52a726baafd45a925ea5cf0222eb430c96c1d83","affectsGlobalScope":true},{"version":"138fb588d26538783b78d1e3b2c2cc12d55840b97bf5e08bca7f7a174fbe2f17","affectsGlobalScope":true},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true},{"version":"4443e68b35f3332f753eacc66a04ac1d2053b8b035a0e0ac1d455392b5e243b3","affectsGlobalScope":true},{"version":"bc47685641087c015972a3f072480889f0d6c65515f12bd85222f49a98952ed7","affectsGlobalScope":true},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true},{"version":"93495ff27b8746f55d19fcbcdbaccc99fd95f19d057aed1bd2c0cafe1335fbf0","affectsGlobalScope":true},{"version":"6fc23bb8c3965964be8c597310a2878b53a0306edb71d4b5a4dfe760186bcc01","affectsGlobalScope":true},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true},{"version":"bb42a7797d996412ecdc5b2787720de477103a0b2e53058569069a0e2bae6c7e","affectsGlobalScope":true},{"version":"4738f2420687fd85629c9efb470793bb753709c2379e5f85bc1815d875ceadcd","affectsGlobalScope":true},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true},{"version":"9fc46429fbe091ac5ad2608c657201eb68b6f1b8341bd6d670047d32ed0a88fa","affectsGlobalScope":true},{"version":"61c37c1de663cf4171e1192466e52c7a382afa58da01b1dc75058f032ddf0839","affectsGlobalScope":true},{"version":"b541a838a13f9234aba650a825393ffc2292dc0fc87681a5d81ef0c96d281e7a","affectsGlobalScope":true},{"version":"e0275cd0e42990dc3a16f0b7c8bca3efe87f1c8ad404f80c6db1c7c0b828c59f","affectsGlobalScope":true},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true},{"version":"49ed889be54031e1044af0ad2c603d627b8bda8b50c1a68435fe85583901d072","affectsGlobalScope":true},{"version":"e93d098658ce4f0c8a0779e6cab91d0259efb88a318137f686ad76f8410ca270","affectsGlobalScope":true},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true},{"version":"bf14a426dbbf1022d11bd08d6b8e709a2e9d246f0c6c1032f3b2edb9a902adbe","affectsGlobalScope":true},{"version":"ec0104fee478075cb5171e5f4e3f23add8e02d845ae0165bfa3f1099241fa2aa","affectsGlobalScope":true},{"version":"2b72d528b2e2fe3c57889ca7baef5e13a56c957b946906d03767c642f386bbc3","affectsGlobalScope":true},{"version":"acae90d417bee324b1372813b5a00829d31c7eb670d299cd7f8f9a648ac05688","affectsGlobalScope":true},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true},{"version":"13f6e6380c78e15e140243dc4be2fa546c287c6d61f4729bc2dd7cf449605471","affectsGlobalScope":true},{"version":"33358442698bb565130f52ba79bfd3d4d484ac85fe33f3cb1759c54d18201393","affectsGlobalScope":true},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true},"415c9f8b3e499f42a77345f9393737ba658908ba13cc527cd0e6db2dde4811a9","0990a7576222f248f0a3b888adcb7389f957928ce2afb1cd5128169086ff4d29",{"version":"0bd5e7096c7bc02bf70b2cc017fc45ef489cb19bd2f32a71af39ff5787f1b56a","affectsGlobalScope":true},"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","9ed09d4538e25fc79cefc5e7b5bfbae0464f06d2984f19da009f85d13656c211","b1bf87add0ccfb88472cd4c6013853d823a7efb791c10bb7a11679526be91eda",{"version":"2998fbabd664cde4173f5fc9f2e4d1f9599fb2d6755275ce75c5f637388d9dfc","affectsGlobalScope":true},"cc69795d9954ee4ad57545b10c7bf1a7260d990231b1685c147ea71a6faa265c","8bc6c94ff4f2af1f4023b7bb2379b08d3d7dd80c698c9f0b07431ea16101f05f","1b61d259de5350f8b1e5db06290d31eaebebc6baafd5f79d314b5af9256d7153","57194e1f007f3f2cbef26fa299d4c6b21f4623a2eddc63dfeef79e38e187a36e","0f6666b58e9276ac3a38fdc80993d19208442d6027ab885580d93aec76b4ef00","05fd364b8ef02fb1e174fbac8b825bdb1e5a36a016997c8e421f5fab0a6da0a0","7e771891adaa85b690266bc37bd6eb43bc57eecc4b54693ead36467e7369952a","a69c09dbea52352f479d3e7ac949fde3d17b195abe90b045d619f747b38d6d1a",{"version":"f749812878fecfa53cfc13b36e5d35086fb6377983a9df44175da83ccc23af1f","affectsGlobalScope":true},"7d2e3fea24c712c99c03ad8f556abedbfe105f87f1be10b95dbd409d24bc05a3",{"version":"211e3f15fbced4ab4be19f49ffa990b9ff20d749d33b65ff753be691e7616239","affectsGlobalScope":true},"3719525a8f6ab731e3dfd585d9f87df55ec7d50d461df84f74eb4d68bb165244","5a94487653355b56018122d92392beb2e5f4a6c63ba5cef83bbe1c99775ef713",{"version":"d5135ad93b33adcce80b18f8065087934cdc1730d63db58562edcf017e1aad9b","affectsGlobalScope":true},"82408ed3e959ddc60d3e9904481b5a8dc16469928257af22a3f7d1a3bc7fd8c4","e596c9bb2f29a2699fdd4ae89139612652245192f67f45617c5a4b20832aaae9","bb9c4ffa5e6290c6980b63c815cdd1625876dadb2efaf77edbe82984be93e55e","1cdcfc1f624d6c08aa12c73935f6e13f095919cd99edf95752951796eb225729","4eaff3d8e10676fd7913d8c108890e71c688e1e7d52f6d1d55c39514f493dc47","14b5aa23c5d0ae1907bc696ac7b6915d88f7d85799cc0dc2dcf98fbce2c5a67c","5c439dafdc09abe4d6c260a96b822fa0ba5be7203c71a63ab1f1423cd9e838ea",{"version":"6b526a5ec4a401ca7c26cfe6a48e641d8f30af76673bad3b06a1b4504594a960","affectsGlobalScope":true},{"version":"00dee7cdca8b8420c47ea4a31a34b8e8294013ebc4f463fd941e867e7bf05029","affectsGlobalScope":true},"3256f3cccd578f9e7fe3a28096c505634bebcee8afb738ffa99368e536ca3a0b","1c84b46267610a34028edfd0d035509341751262bac1062857f3c8df7aff7153","7f138842074d0a40681775af008c8452093b68c383c94de31759e853c6d06b5c","a3d541d303ee505053f5dcbf9fafb65cac3d5631037501cd616195863a6c5740","8d3c583a07e0c37e876908c2d5da575019f689df8d9fa4c081d99119d53dba22","2c828a5405191d006115ab34e191b8474bc6c86ffdc401d1a9864b1b6e088a58",{"version":"e630e5528e899219ae319e83bef54bf3bcb91b01d76861ecf881e8e614b167f0","affectsGlobalScope":true},"bcebb922784739bdb34c18ee51095d25a92b560c78ccd2eaacd6bd00f7443d83","7ee6ed878c4528215c82b664fe0cfe80e8b4da6c0d4cc80869367868774db8b1","b0973c3cbcdc59b37bf477731d468696ecaf442593ec51bab497a613a580fe30",{"version":"4989e92ba5b69b182d2caaea6295af52b7dc73a4f7a2e336a676722884e7139d","affectsGlobalScope":true},{"version":"0715e4cd28ad471b2a93f3e552ff51a3ae423417a01a10aa1d3bc7c6b95059d6","affectsGlobalScope":true},"5153a2fd150e46ce57bb3f8db1318d33f6ad3261ed70ceeff92281c0608c74a3","210d54cd652ec0fec8c8916e4af59bb341065576ecda039842f9ffb2e908507c","36b03690b628eab08703d63f04eaa89c5df202e5f1edf3989f13ad389cd2c091","0effadd232a20498b11308058e334d3339cc5bf8c4c858393e38d9d4c0013dcf","25846d43937c672bab7e8195f3d881f93495df712ee901860effc109918938cc","4f3fdeba4e28e21aa719c081b8dc8f91d47e12e773389b9d35679c08151c9d37","1b952304137851e45bc009785de89ada562d9376177c97e37702e39e60c2f1ff","69ee23dd0d215b09907ad30d23f88b7790c93329d1faf31d7835552a10cf7cbf","44b8b584a338b190a59f4f6929d072431950c7bd92ec2694821c11bce180c8a5","23b89798789dffbd437c0c423f5d02d11f9736aea73d6abf16db4f812ff36eda","f69ff39996a61a0dd10f4bce73272b52e8024a4d58b13ab32bf4712909d0a2b7",{"version":"3c4ba1dd9b12ffa284b565063108f2f031d150ea15b8fafbdc17f5d2a07251f3","affectsGlobalScope":true},"e10177274a35a9d07c825615340b2fcde2f610f53f3fb40269fd196b4288dda6","1422cd9e705adcc09088fda85a900c2b70e3ad36ea85846f68bd1a884cdf4e2b","3c13ef48634e7b5012fcf7e8fce7496352c2d779a7201389ca96a2a81ee4314d","5d0a25ec910fa36595f85a67ac992d7a53dd4064a1ba6aea1c9f14ab73a023f2",{"version":"a73ae8c0e62103bb9e21bb6538700881bf135b9a8b125b857ec68edfa0da4ed3","affectsGlobalScope":true},{"version":"e1c1b2fbe236bf7ee3e342eeae7e20efb8988a0ac7da1cbbfa2c1f66b76c3423","affectsGlobalScope":true},"868831cab82b65dfe1d68180e898af1f2101e89ba9b754d1db6fb8cc2fac1921","0fe8985a28f82c450a04a6edf1279d7181c0893f37da7d2a27f8efd4fd5edb03","e59a892d87e72733e2a9ca21611b9beb52977be2696c7ba4b216cbbb9a48f5aa",{"version":"52120bb7e4583612225bdf08e7c12559548170f11e660d33a33623bae9bbdbba","affectsGlobalScope":true},"8a300fa9b698845a1f9c41ecbe2c5966634582a8e2020d51abcace9b55aa959e",{"version":"ab9b9a36e5284fd8d3bf2f7d5fcbc60052f25f27e4d20954782099282c60d23e","affectsGlobalScope":true},"a6dd3dba8e665ac43d279e0fdf5219edda0eed69b5e9a5061f46cd6a65c4f7a1","8caa5c86be1b793cd5f599e27ecb34252c41e011980f7d61ae4989a149ff6ccc","481231c1fc9d8efbceb62a6265af69d5cd5a49676df9c4214ecb5b81f0077a75","3303f49a2c7c25d8b5dbe0f93be5dccbb62dbea43bca9565c35c4737934dc2a4","4355c807c60f6b8a69ee3307c5f9adde7d8303172bcfa4805fa804511a6c3ce2","893288d87a9dd809619f7daf641ba9114d01275364856483b40186ba411dac40","bb7a61dd55dc4b9422d13da3a6bb9cc5e89be888ef23bbcf6558aa9726b89a1c","db6d2d9daad8a6d83f281af12ce4355a20b9a3e71b82b9f57cddcca0a8964a96","cfe4ef4710c3786b6e23dae7c086c70b4f4835a2e4d77b75d39f9046106e83d3","cbea99888785d49bb630dcbb1613c73727f2b5a2cf02e1abcaab7bcf8d6bf3c5","98817124fd6c4f60e0b935978c207309459fb71ab112cf514f26f333bf30830e","a86f82d646a739041d6702101afa82dcb935c416dd93cbca7fd754fd0282ce1f","2dad084c67e649f0f354739ec7df7c7df0779a28a4f55c97c6b6883ae850d1ce","fa5bbc7ab4130dd8cdc55ea294ec39f76f2bc507a0f75f4f873e38631a836ca7","df45ca1176e6ac211eae7ddf51336dc075c5314bc5c253651bae639defd5eec5","cf86de1054b843e484a3c9300d62fbc8c97e77f168bbffb131d560ca0474d4a8","a28e69b82de8008d23b88974aeb6fba7195d126c947d0da43c16e6bc2f719f9f","528637e771ee2e808390d46a591eaef375fa4b9c99b03749e22b1d2e868b1b7c","e54a8a1852a418d2e9cf8b9c88e6f48b102fc941718941267eefa3c9df80ee91","fc46f093d1b754a8e3e34a071a1dd402f42003927676757a9a10c6f1d195a35b","b7b3258e8d47333721f9d4c287361d773f8fa88e52d1148812485d9fc06d2577","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","a9af0e608929aaf9ce96bd7a7b99c9360636c31d73670e4af09a09950df97841","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","87eaecac33864ecec8972b1773c5d897f0f589deb7ac8fe0dcdf4b721b06e28d","47e5af2a841356a961f815e7c55d72554db0c11b4cba4d0caab91f8717846a94","4c91cc1ab59b55d880877ccf1999ded0bb2ebc8e3a597c622962d65bf0e76be8","fa1ea09d3e073252eccff2f6630a4ce5633cc2ff963ba672dd8fd6783108ea83","f5f541902bf7ae0512a177295de9b6bcd6809ea38307a2c0a18bfca72212f368","e8da637cbd6ed1cf6c36e9424f6bcee4515ca2c677534d4006cbd9a05f930f0c","ca1b882a105a1972f82cc58e3be491e7d750a1eb074ffd13b198269f57ed9e1b","c9d71f340f1a4576cd2a572f73a54dc7212161fa172dfe3dea64ac627c8fcb50","3867ca0e9757cc41e04248574f4f07b8f9e3c0c2a796a5eb091c65bfd2fc8bdb","6c66f6f7d9ff019a644ff50dd013e6bf59be4bf389092948437efa6b77dc8f9a","4e10622f89fea7b05dd9b52fb65e1e2b5cbd96d4cca3d9e1a60bb7f8a9cb86a1","ef2d1bd01d144d426b72db3744e7a6b6bb518a639d5c9c8d86438fb75a3b1934","b9750fe7235da7d8bf75cb171bf067b7350380c74271d3f80f49aea7466b55b5","e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","ef22951dfe1a4c8e973e177332c30903cec14844f3ad05d3785988f6daba9bd6","df8081a998c857194468fd082636f037bc56384c1f667531a99aa7022be2f95e","ac60bbee0d4235643cc52b57768b22de8c257c12bd8c2039860540cab1fa1d82","973b59a17aaa817eb205baf6c132b83475a5c0a44e8294a472af7793b1817e89","ada39cbb2748ab2873b7835c90c8d4620723aedf323550e8489f08220e477c7f","6e5f5cee603d67ee1ba6120815497909b73399842254fc1e77a0d5cdc51d8c9c","f79e0681538ef94c273a46bb1a073b4fe9fdc93ef7f40cc2c3abd683b85f51fc","70f3814c457f54a7efe2d9ce9d2686de9250bb42eb7f4c539bd2280a42e52d33","17ace83a5bea3f1da7e0aef7aab0f52bca22619e243537a83a89352a611b837d","ef61792acbfa8c27c9bd113f02731e66229f7d3a169e3c1993b508134f1a58e0","6cf2d240d4e449ccfee82aff7ce0fd1890c1b6d4f144ec003aa51f7f70f68935","f6404e7837b96da3ea4d38c4f1a3812c96c9dcdf264e93d5bdb199f983a3ef4b","c5426dbfc1cf90532f66965a7aa8c1136a78d4d0f96d8180ecbfc11d7722f1a5","65a15fc47900787c0bd18b603afb98d33ede930bed1798fc984d5ebb78b26cf9","9d202701f6e0744adb6314d03d2eb8fc994798fc83d91b691b75b07626a69801","de9d2df7663e64e3a91bf495f315a7577e23ba088f2949d5ce9ec96f44fba37d","c7af78a2ea7cb1cd009cfb5bdb48cd0b03dad3b54f6da7aab615c2e9e9d570c5","1dc574e42493e8bf9bb37be44d9e38c5bd7bbc04f884e5e58b4d69636cb192b3",{"version":"9deab571c42ed535c17054f35da5b735d93dc454d83c9a5330ecc7a4fb184e9e","affectsGlobalScope":true},{"version":"db01d18853469bcb5601b9fc9826931cc84cc1a1944b33cad76fd6f1e3d8c544","affectsGlobalScope":true},"6b8e8c0331a0c2e9fb53b8b0d346e44a8db8c788dae727a2c52f4cf3bd857f0d",{"version":"903e299a28282fa7b714586e28409ed73c3b63f5365519776bf78e8cf173db36","affectsGlobalScope":true},"fa6c12a7c0f6b84d512f200690bfc74819e99efae69e4c95c4cd30f6884c526e","f1c32f9ce9c497da4dc215c3bc84b722ea02497d35f9134db3bb40a8d918b92b",{"version":"b73c319af2cc3ef8f6421308a250f328836531ea3761823b4cabbd133047aefa","affectsGlobalScope":true},"e433b0337b8106909e7953015e8fa3f2d30797cea27141d1c5b135365bb975a6","dd3900b24a6a8745efeb7ad27629c0f8a626470ac229c1d73f1fe29d67e44dca","ddff7fc6edbdc5163a09e22bf8df7bef75f75369ebd7ecea95ba55c4386e2441","106c6025f1d99fd468fd8bf6e5bda724e11e5905a4076c5d29790b6c3745e50c","ec29be0737d39268696edcec4f5e97ce26f449fa9b7afc2f0f99a86def34a418","a3ab6d3eb668c3951fcbcaf27fa84f274218f68a9e85e2fa5407fe7d3486f7b2","ec6cba1c02c675e4dd173251b156792e8d3b0c816af6d6ad93f1a55d674591aa","763ee3998716d599321e34b7f7e93a8e57bef751206325226ebf088bf75ea460","e15d3c84d5077bb4a3adee4c791022967b764dc41cb8fa3cfa44d4379b2c95f5","78244a2a8ab1080e0dd8fc3633c204c9a4be61611d19912f4b157f7ef7367049","e1fc1a1045db5aa09366be2b330e4ce391550041fc3e925f60998ca0b647aa97","fccc5d7a6334dda19af6f663cc6f5f4e6bddbf2bda1aabb42406dda36da4029e","d23518a5f155f1a3e07214baf0295687507122ae2e6e9bd5e772551ebd4b3157","ed24912bd7a2b952cf1ff2f174bd5286c0f7d8a11376f083c03d4c76faae4134","3556cfbab7b43da96d15a442ddbb970e1f2fc97876d055b6555d86d7ac57dae5","437751e0352c6e924ddf30e90849f1d9eb00ca78c94d58d6a37202ec84eb8393","48e8af7fdb2677a44522fd185d8c87deff4d36ee701ea003c6c780b1407a1397","606e6f841ba9667de5d83ca458449f0ed8c511ba635f753eaa731e532dea98c7","d860ce4d43c27a105290c6fdf75e13df0d40e3a4e079a3c47620255b0e396c64","b064dd7dd6aa5efef7e0cc056fed33fc773ea39d1e43452ee18a81d516fb762c","2e4f37ffe8862b14d8e24ae8763daaa8340c0df0b859d9a9733def0eee7562d9","13283350547389802aa35d9f2188effaeac805499169a06ef5cd77ce2a0bd63f","680793958f6a70a44c8d9ae7d46b7a385361c69ac29dcab3ed761edce1c14ab8","6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","baeffe1b7d836196d497eb755699718deb729a2033078a018f037a14ecaeb9a7","9e6dbb5a1fc4840716e8b987f228652770b5c20b43b63332a90647ea5549d9b6","78244335c377ad261b6054029ec49197a97da17fb3ff8b8007a7e419d2b914d0","e53932e64841d2e1ef11175f7ec863ae9f8b06496850d7a81457892721c86a91","438c7513b1df91dcef49b13cd7a1c4720f91a36e88c1df731661608b7c055f10","ad444a874f011d3a797f1a41579dbfcc6b246623f49c20009f60e211dbd5315e","361e2b13c6765d7f85bb7600b48fde782b90c7c41105b7dab1f6e7871071ba20","950a320b88226a8d422ea2f33d44bbadc246dc97c37bf508a1fd3e153070c8ea","f1068c719ad8ec4580366eae164a82899af9126eed0452a3a2fde776f9eaf840","5fa139523e35fd907f3dd6c2e38ef2066687b27ed88e2680783e05662355ac04","9c250db4bab4f78fad08be7f4e43e962cc143e0f78763831653549ceb477344a","db7c948e2e69559324be7628cb63296ec8986d60f26173f9e324aeb8a2fe23d8","9385cdc09850950bc9b59cca445a3ceb6fcca32b54e7b626e746912e489e535e","0a72186f94215d020cb386f7dca81d7495ab6c17066eb07d0f44a5bf33c1b21a","d6786782daa690925e139faad965b2d1745f71380c26861717f10525790566d9","63a8e96f65a22604eae82737e409d1536e69a467bb738bec505f4f97cce9d878","3fd78152a7031315478f159c6a5872c712ece6f01212c78ea82aef21cb0726e2","50481f43195ec7a4da5d95c00ccaf4cc2d31a92073a256367a0cedf6a595a50e","cda4052f66b1e6cb7cf1fdfd96335d1627aa24a3b8b82ba4a9f873ec3a7bcde8","996d95990f57766b5cbbc1e4efd48125e664e1db177f919ef07e7226445bc58a","af8f233f11498dddebf06c57d03a568bf39f0cab2407151797ba18984fb3009d","fd933f824347f9edd919618a76cdb6a0c0085c538115d9a287fa0c7f59957ab3","6ac6715916fa75a1f7ebdfeacac09513b4d904b667d827b7535e84ff59679aff","6a1aa3e55bdc50503956c5cd09ae4cd72e3072692d742816f65c66ca14f4dfdd","ab75cfd9c4f93ffd601f7ca1753d6a9d953bbedfbd7a5b3f0436ac8a1de60dfa","28ebfca21bccf412dbb83a1095ee63eaa65dfc31d06f436f3b5f24bfe3ede7fa","b73cbf0a72c8800cf8f96a9acfe94f3ad32ca71342a8908b8ae484d61113f647","bae6dd176832f6423966647382c0d7ba9e63f8c167522f09a982f086cd4e8b23","1364f64d2fb03bbb514edc42224abd576c064f89be6a990136774ecdd881a1da","c9958eb32126a3843deedda8c22fb97024aa5d6dd588b90af2d7f2bfac540f23","950fb67a59be4c2dbe69a5786292e60a5cb0e8612e0e223537784c731af55db1","e927c2c13c4eaf0a7f17e6022eee8519eb29ef42c4c13a31e81a611ab8c95577","07ca44e8d8288e69afdec7a31fa408ce6ab90d4f3d620006701d5544646da6aa","70246ad95ad8a22bdfe806cb5d383a26c0c6e58e7207ab9c431f1cb175aca657","f00f3aa5d64ff46e600648b55a79dcd1333458f7a10da2ed594d9f0a44b76d0b","772d8d5eb158b6c92412c03228bd9902ccb1457d7a705b8129814a5d1a6308fc","4e4475fba4ed93a72f167b061cd94a2e171b82695c56de9899275e880e06ba41","97c5f5d580ab2e4decd0a3135204050f9b97cd7908c5a8fbc041eadede79b2fa","49b2375c586882c3ac7f57eba86680ff9742a8d8cb2fe25fe54d1b9673690d41","802e797bcab5663b2c9f63f51bdf67eff7c41bc64c0fd65e6da3e7941359e2f7","b9e436138dd3a36272c6026e07bb8a105d8e102992f5419636c6a81f31f4ee6e","b33ac7d8d7d1bfc8cc06c75d1ee186d21577ab2026f482e29babe32b10b26512","df002733439dc68e41174e1a869390977d81318f51a38c724d8394a676562cc7","6459054aabb306821a043e02b89d54da508e3a6966601a41e71c166e4ea1474f","05c97cddbaf99978f83d96de2d8af86aded9332592f08ce4a284d72d0952c391","71bc9bc7afa31a36fb61f66a668b44ee0e7c9ed0f2f364ca0185ffff8bc8f174","bbc183d2d69f4b59fd4dd8799ffdf4eb91173d1c4ad71cce91a3811c021bf80c","7b6ff760c8a240b40dab6e4419b989f06a5b782f4710d2967e67c695ef3e93c4","8dbc4134a4b3623fc476be5f36de35c40f2768e2e3d9ed437e0d5f1c4cd850f6","d5563f7b039981b4f1b011936b7d0dcdd96824c721842ff74881c54f2f634284","88469ceaabef1fb73fc8fbbb61e1fdf0901a656344a099e465ce6eaf78c540fb","3e4b580564f57a8495e7a598c33c98ecd673cff0106223416cdc8fcd66410c88","f974e4a06953682a2c15d5bd5114c0284d5abf8bc0fe4da25cb9159427b70072","2299a804d7bf5bb667a4cae0dde72052ff22eb6530e9c0cf61e23206f386f9ec","94404c4a878fe291e7578a2a80264c6f18e9f1933fbb57e48f0eb368672e389c","5c1b7f03aa88be854bc15810bfd5bd5a1943c5a7620e1c53eddd2a013996343e","f416c9c3eee9d47ff49132c34f96b9180e50485d435d5748f0e8b72521d28d2e","b4a49b80b0c625e4c7a9d6fcd95cd7d6a94ca6116b056d144de0cf70c03e4697","60a86278bd85866c81bc8e48d23659279b7a2d5231b06799498455586f7c8138","01aa917531e116485beca44a14970834687b857757159769c16b228eb1e49c5f","fbcde1fdade133b4a976480c0d4c692e030306f53909d7765dfef98436dec777","4f1ce48766482ed4c19da9b1103f87690abb7ba0a2885a9816c852bfad6881a1","187a6fdbdecb972510b7555f3caacb44b58415da8d5825d03a583c4b73fde4cf","ebffa210a9d55dea12119af0b19cf269fc7b80f60d0378d8877205d546d8c16a","28b57ddc587f2fe1f4e178eef2f073466b814e452ab79e730c1fc7959e9ff0ef","741067675daa6d4334a2dc80a4452ca3850e89d5852e330db7cb2b5f867173b1","a1c8542ed1189091dd39e732e4390882a9bcd15c0ca093f6e9483eba4e37573f","131b1475d2045f20fb9f43b7aa6b7cb51f25250b5e4c6a1d4aa3cf4dd1a68793","3a17f09634c50cce884721f54fd9e7b98e03ac505889c560876291fcf8a09e90","32531dfbb0cdc4525296648f53b2b5c39b64282791e2a8c765712e49e6461046","0ce1b2237c1c3df49748d61568160d780d7b26693bd9feb3acb0744a152cd86d","e489985388e2c71d3542612685b4a7db326922b57ac880f299da7026a4e8a117","76264a4df0b7c78b7b12dfaedc05d9f1016f27be1f3d0836417686ff6757f659",{"version":"272692898cec41af73cb5b65f4197a7076007aecd30c81514d32fdb933483335","affectsGlobalScope":true},"fd1b9d883b9446f1e1da1e1033a6a98995c25fbf3c10818a78960e2f2917d10c","19252079538942a69be1645e153f7dbbc1ef56b4f983c633bf31fe26aeac32cd","bc11f3ac00ac060462597add171220aed628c393f2782ac75dd29ff1e0db871c","1640728521f6ab040fc4a85edd2557193839d0cd0e41c02004fc8d415363d4e2","65c24a8baa2cca1de069a0ba9fba82a173690f52d7e2d0f1f7542d59d5eb4db0","ec9fd890d681789cb0aa9efbc50b1e0afe76fbf3c49c3ac50ff80e90e29c6bcb","5fbd292aa08208ae99bf06d5da63321fdc768ee43a7a104980963100a3841752","9eac5a6beea91cfb119688bf44a5688b129b804ede186e5e2413572a534c21bb","e81bf06c0600517d8f04cc5de398c28738bfdf04c91fb42ad835bfe6b0d63a23","363996fe13c513a7793aa28ffb05b5d0230db2b3d21b7bfaf21f79e4cde54b4e","b7fff2d004c5879cae335db8f954eb1d61242d9f2d28515e67902032723caeab","5f3dc10ae646f375776b4e028d2bed039a93eebbba105694d8b910feebbe8b9c","7f6c48cacd08c1b1e29737b8221b7661e6b855767f8778f9a181fa2f74c09d21","4545c1a1ceca170d5d83452dd7c4994644c35cf676a671412601689d9a62da35","15959543f93f27e8e2b1a012fe28e14b682034757e2d7a6c1f02f87107fc731e","a2d648d333cf67b9aeac5d81a1a379d563a8ffa91ddd61c6179f68de724260ff","4e828bf688597c32905215785730cbdb603b54e284d472a23fc0195c6d4aeee8","a3f41ed1b4f2fc3049394b945a68ae4fdefd49fa1739c32f149d32c0545d67f5","4da80db9ed5a1a20fd5bfce863dd178b8928bcaf4a3d75e8657bcae32e572ede","47699512e6d8bebf7be488182427189f999affe3addc1c87c882d36b7f2d0b0e","f72ee46ae3f73e6c5ff0da682177251d80500dd423bfd50286124cd0ca11e160","898b714aad9cfd0e546d1ad2c031571de7622bd0f9606a499bee193cf5e7cf0c","d707fb7ca32930495019a4c85500385f6850c785ee0987a1b6bcad6ade95235e","fedebeae32c5cdd1a85b4e0504a01996e4a8adf3dfa72876920d3dd6e42978e7","5d26aae738fa3efc87c24f6e5ec07c54694e6bcf431cc38d3da7576d6bb35bd6","cdf21eee8007e339b1b9945abf4a7b44930b1d695cc528459e68a3adc39a622e","db036c56f79186da50af66511d37d9fe77fa6793381927292d17f81f787bb195","bc6a6780c3b6e23bcb4bc9558d7cdbd3dfe32f1a9b457a0c1d651085cb6f7c0a","cd0c5af42811a4a56a0f77856cfa6c170278e9522888db715b11f176df3ff1f2","68f81dad9e8d7b7aa15f35607a70c8b68798cf579ac44bd85325b8e2f1fb3600","1de80059b8078ea5749941c9f863aa970b4735bdbb003be4925c853a8b6b4450","1d079c37fa53e3c21ed3fa214a27507bda9991f2a41458705b19ed8c2b61173d","94fd3ce628bd94a2caf431e8d85901dbe3a64ab52c0bd1dbe498f63ca18789f7","5835a6e0d7cd2738e56b671af0e561e7c1b4fb77751383672f4b009f4e161d70","c0eeaaa67c85c3bb6c52b629ebbfd3b2292dc67e8c0ffda2fc6cd2f78dc471e6","4b7f74b772140395e7af67c4841be1ab867c11b3b82a51b1aeb692822b76c872","27be6622e2922a1b412eb057faa854831b95db9db5035c3f6d4b677b902ab3b7","2470a2412a59c6177cd4408dd7edb099ca7ace68c0187f54187dfee56dc9c5aa","c2008605e78208cfa9cd70bd29856b72dda7ad89df5dc895920f8e10bcb9cd0a","ec61ebac4d71c4698318673efbb5c481a6c4d374da8d285f6557541a5bd318d0",{"version":"16fd66ae997b2f01c972531239da90fbf8ab4022bb145b9587ef746f6cecde5a","affectsGlobalScope":true},{"version":"fc8fbee8f73bf5ffd6ba08ba1c554d6f714c49cae5b5e984afd545ab1b7abe06","affectsGlobalScope":true},"3586f5ea3cc27083a17bd5c9059ede9421d587286d5a47f4341a4c2d00e4fa91","521fc35a732f1a19f5d52024c2c22e257aa63258554968f7806a823be2f82b03","b789bf89eb19c777ed1e956dbad0925ca795701552d22e68fd130a032008b9f9","9269d492817e359123ac64c8205e5d05dab63d71a3a7a229e68b5d9a0e8150bf","7a1971efcba559ea9002ada4c4e3c925004fb67a755300d53b5edf9399354900","d5ae953e9968946b809d277b5afb33a98fcebf7b05c0858584988f044719723a","6cffd9d5a03d319f1807048977bbda1ca26dec3dfbb04c042095ce70f2bc258d","1ea8148bca907ccf52233df6f6ec35f7bc7119da1a8d1fb9b4dfaea9ec869ffb",{"version":"7fa2bd3fa311382508952c523d765ea24b3b145ff221e5c3c45016e4436a7680","signature":"2f8baa2f9578da485926c487b4105f92877db49e3542098bcdefeec20ebdd678"},{"version":"988a79ff23e45865fe352fc46714fe1a5d5e675cf9ae18fc2463df27cb8a74a5","signature":"4ac3d8570573b85e700a3f42808f57dc29472230587ff8c50e75c3fc9c046916"},"75ee56c6066763d4b384fb7bdea6ce440416bf3749eceeb0a9c54e35f4545d51",{"version":"8d6d51a5118d000ed3bfe6e1dd1335bebfff3fef23cd2af2f84a24d30f90cc90","affectsGlobalScope":true},{"version":"73a0ee6395819b063df4b148211985f2e1442945c1a057204cf4cf6281760dc3","affectsGlobalScope":true},"d05d8c67116dceafc62e691c47ac89f8f10cf7313cd1b2fb4fe801c2bf1bb1a7","ccff6a039925da0bbddce77e8fe06865bb4bc144f8ca2f729b4390015044183b","3b2ef670d9fbaeba57e90f83a6e0bb6496cb6f7c40e0e4ea3f69a3c24ba8849e","eadb96cb45ec069f56044da0acb0e7971cf35727ac36f43cb7e6937e6de78568","83e3d3af2151c83d76018ae8e895709262c8dc1cd3a337d3ba13698f58009a71","5c572ee0ef0f072e79f06e5186c23c5dc03228ca30295c05c890400c969817c9","f3ebeb8a8c772f53224e548c9d7cee59cc0c3916528abbe3aaa64e2d657d1efa","9619101e844a1ef1de0b33b4d0a42c41052f825e36abe4741cba2ef5d612d59e","51ebca098538b252953b1ef83c165f25b52271bfb6049cd09d197dddd4cd43c5",{"version":"2e66135f85deba5273be964baae21b186728134f14e7581c174ce9ca72372136","signature":"bfefef03280bb2c17bf658bba1b384c0a4a99c082d02b01d07c6fb90eb4e51f2"},"495f3e1254a9f5cc7b124798b7d9c480e6aa1a97628a160cb172573178eda734",{"version":"a3728126c79d0b9de8af32f0c058cc148176fcfa550bde54d78ec4fbc19cef3a","signature":"d4a82d12c24bb81ac708265cd2061c9118f65a9aabb62362c4941744f8282f11"},"49ee6b7e5464a4279427241477a668b9ab134952f9e3b20a8daeb5aae4d59e01","e29b9dd7309feed4205b6acbd637d7e37f722efc91ef945fb3eceae970c1a685","91b4ce96f6ad631a0a6920eb0ab928159ff01a439ae0e266ecdc9ea83126a195","e3448881d526bfca052d5f9224cc772f61d9fc84d0c52eb7154b13bd4db9d8b2","e348f128032c4807ad9359a1fff29fcbc5f551c81be807bfa86db5a45649b7ba","0fba40d7d3d779a84c39aed52884def98a8cd032242c7eb86bd6dc0989759c3a","ad4d2c881a46db2a93346d760aa4e5e9f7d79a87e4b443055f5416b10dbe748c","c2fc483dea0580d1266c1500f17e49a739ca6cfe408691da638ddc211dfffad0","7c31a2b77ae042fb1f057c21367e730f364849ae8fa1d72f5a9936cef963a8b2","650d4007870fee41b86182e7965c6fb80283388d0ba8882ce664cc311a2840b5","1371cc469a4a618042f5230e95e6476dd6dc33ad75a65cf407c079fe4fcc619e","c16c3b97930e8fbf05022024f049d51c998dd5eb6509047e1f841777968e85c1","b512c143a2d01012a851fdf2d739f29a313e398b88ac363526fb2adddbabcf95","535b2fc8c89091c20124fe144699bb4a96d5db4418a1594a9a0a6a863b2195ae","13409a75ad9472934934afaff70eeeb16e84a3667522d1e6794f15a0db648829","3068cf3437f485ccac6ddc86c475e61bc487452852510d95c83f6bad6dab9a66","21575cdeaca6a2c2a0beb8c2ecbc981d9deb95f879f82dc7d6e325fe8737b5ba","832c2f78ec29728aca9c84998182993b8b27fff904e7622e73194d6d34154a0c","faba53dda443d501f30e2d92ed33a8d11f88b420b0e2f03c5d7d62ebe9e7c389","3eb7d541136cd8b66020417086e4f481fb1ae0e2b916846d43cbf0b540371954","9ff4b9f562c6b70f750ca1c7a88d460442f55007843531f233ab827c102ac855","4f4cbbada4295ab9497999bec19bd2eea1ede9212eb5b4d0d6e529df533c5a4b","cf81fae6e5447acb74958bc8353b0d50b6700d4b3a220c9e483f42ca7a7041aa","92f6f02b25b107a282f27fde90a78cbd46e21f38c0d7fc1b67aea3fff35f083e","479eec32bca85c1ff313f799b894c6bb304fdab394b50296e6efe4304d9f00aa","27c37f4535447fb3191a4c1bd9a5fcab1922bec4e730f13bace2cfa25f8d7367","3e9b3266a6b9e5b3e9a293c27fd670871753ab46314ce3eca898d2bcf58eb604","e52d722c69692f64401aa2dacea731cf600086b1878ed59e476d68dae094d9aa","e91e51fff687b8298cc417e946cbf5a771c2d02a6b5b7fe154593926cf3d1a8e","039bd8d1e0d151570b66e75ee152877fb0e2f42eca43718632ac195e6884be34","89fb1e22c3c98cbb86dc3e5949012bdae217f2b5d768a2cc74e1c4b413c25ad2","cb5eaaa2a079305b1c5344af739b29c479746f7a7aefffc7175d23d8b7c8dbb0","0d72f576807bb4f6f682bc705e06eb3e730139b018e8c026e3187f3f389ce2e9","56749bf8b557c4c76181b2fd87e41bde2b67843303ae2eabb299623897d704d6","5a6fbec8c8e62c37e9685a91a6ef0f6ecaddb1ee90f7b2c2b71b454b40a0d9a6","e7435f2f56c50688250f3b6ef99d8f3a1443f4e3d65b4526dfb31dfd4ba532f8","6fc56a681a637069675b2e11b4aa105efe146f7a88876f23537e9ea139297cf9","33b7f4106cf45ae7ccbb95acd551e9a5cd3c27f598d48216bda84213b8ae0c7e","176d6f604b228f727afb8e96fd6ff78c7ca38102e07acfb86a0034d8f8a2064a","c5079a23a0200a682ec3db25bc789d6cee4275b676a86ec1a3964d919b977e6a","8bcb884d06860a129dbffa3500d51116d9d1040bb3bf1c9762eb2f1e7fd5c85c","e55c0f31407e1e4eee10994001a4f570e1817897a707655f0bbe4d4a66920e9e","a37c2194c586faa8979f50a5c5ca165b0903d31ee62a9fe65e4494aa099712c0","6602339ddc9cd7e54261bda0e70fb356d9cdc10e3ec7feb5fa28982f8a4d9e34","7ffaa736b8a04b0b8af66092da536f71ef13a5ef0428c7711f32b94b68f7c8c8","7b4930d666bbe5d10a19fcc8f60cfa392d3ad3383b7f61e979881d2c251bc895","46342f04405a2be3fbfb5e38fe3411325769f14482b8cd48077f2d14b64abcfb","8fa675c4f44e6020328cf85fdf25419300f35d591b4f56f56e00f9d52b6fbb3b","ba98f23160cfa6b47ee8072b8f54201f21a1ee9addc2ef461ebadf559fe5c43a","45a4591b53459e21217dc9803367a651e5a1c30358a015f27de0b3e719db816b","9ef22bee37885193b9fae7f4cad9502542c12c7fe16afe61e826cdd822643d84","b0451895b894c102eed19d50bd5fcb3afd116097f77a7d83625624fafcca8939","bce17120b679ff4f1be70f5fe5c56044e07ed45f1e555db6486c6ded8e1da1c8","7590477bfa2e309e677ff7f31cb466f377fcd0e10a72950439c3203175309958","3f9ebd554335d2c4c4e7dc67af342d37dc8f2938afa64605d8a93236022cc8a5","1c077c9f6c0bc02a36207994a6e92a8fbf72d017c4567f640b52bf32984d2392","600b42323925b32902b17563654405968aa12ee39e665f83987b7759224cc317","32c8f85f6b4e145537dfe61b94ddd98b47dbdd1d37dc4b7042a8d969cd63a1aa","2426ed0e9982c3d734a6896b697adf5ae93d634b73eb15b48da8106634f6d911","057431f69d565fb44c246f9f64eac09cf309a9af7afb97e588ebef19cc33c779","960d026ca8bf27a8f7a3920ee50438b50ec913d635aa92542ca07558f9c59eca","14aaa5b8938496377d38e90d2b6f8cb1eabf8fe1ffb86e29233ab14977afd178","252eb4750d0439d1674ad0dc30d2a2a3e4655e08ad9e58a7e236b21e78d1d540","e344b4a389bb2dfa98f144f3f195387a02b6bdb69deed4a96d16cc283c567778","c6cdcd12d577032b84eed1de4d2de2ae343463701a25961b202cff93989439fb","2f4f96af192dc44a12bf238bcc08ebac498c9073f459740f6497fe0f8e1a432c","c5b3da7e2ecd5968f723282aba49d8d1a2e178d0afe48998dad93f81e2724091","efd2860dc74358ffa01d3de4c8fa2f966ae52c13c12b41ad931c078151b36601","09acacae732e3cc67a6415026cfae979ebe900905500147a629837b790a366b3","72154a9d896b0a0aed69fd2a58aa5aa8ab526078a65ff92f0d3c2237e9992610","99236ea5c4c583082975823fd19bcce6a44963c5c894e20384bc72e7eccf9b03","f6688a02946a3f7490aa9e26d76d1c97a388e42e77388cbab010b69982c86e9e","b027979b9e4e83be23db2d81e01d973b91fefe677feb93823486a83762f65012","533c6f9f1e29abb7ae71178f20ed8f2db65d8662b6e46b3535afb332b7eaf84b","2d2ec3235e01474f45a68f28cf826c2f5228b79f7d474d12ca3604cdcfdac80c","6dd249868034c0434e170ba6e0451d67a0c98e5a74fd57a7999174ee22a0fa7b","9716553c72caf4ff992be810e650707924ec6962f6812bd3fbdb9ac3544fd38f","506bc8f4d2d639bebb120e18d3752ddeee11321fd1070ad2ce05612753c628d6","053c51bbc32db54be396654ab5ecd03a66118d64102ac9e22e950059bc862a5e","1977f62a560f3b0fc824281fd027a97ce06c4b2d47b408f3a439c29f1e9f7e10","627570f2487bd8d899dd4f36ecb20fe0eb2f8c379eff297e24caba0c985a6c43","0f6e0b1a1deb1ab297103955c8cd3797d18f0f7f7d30048ae73ba7c9fb5a1d89","0a051f254f9a16cdde942571baab358018386830fed9bdfff42478e38ba641ce","17269f8dfc30c4846ab7d8b5d3c97ac76f50f33de96f996b9bf974d817ed025b","9e82194af3a7d314ccbc64bb94bfb62f4bfea047db3422a7f6c5caf2d06540a9","083d6f3547ccbf25dfa37b950c50bee6691ed5c42107f038cc324dbca1e173ae","952a9eab21103b79b7a6cca8ad970c3872883aa71273f540285cad360c35da40","8ba48776335db39e0329018c04486907069f3d7ee06ce8b1a6134b7d745271cc","e6d5809e52ed7ef1860d1c483e005d1f71bab36772ef0fd80d5df6db1da0e815","893e5cfbae9ed690b75b8b2118b140665e08d182ed8531e1363ec050905e6cb2","6ae7c7ada66314a0c3acfbf6f6edf379a12106d8d6a1a15bd35bd803908f2c31","e4b1e912737472765e6d2264b8721995f86a463a1225f5e2a27f783ecc013a7b","97146bbe9e6b1aab070510a45976faaf37724c747a42d08563aeae7ba0334b4f","c40d552bd2a4644b0617ec2f0f1c58618a25d098d2d4aa7c65fb446f3c305b54","09e64dea2925f3a0ef972d7c11e7fa75fec4c0824e9383db23eacf17b368532f","424ddba00938bb9ae68138f1d03c669f43556fc3e9448ed676866c864ca3f1d6","a0fe12181346c8404aab9d9a938360133b770a0c08b75a2fce967d77ca4b543f","3cc6eb7935ff45d7628b93bb6aaf1a32e8cb3b24287f9e75694b607484b377b3","ced02e78a2e10f89f4d70440d0a8de952a5946623519c54747bc84214d644bac","efd463021ccc91579ed8ae62584176baab2cd407c555c69214152480531a2072","29647c3b79320cfeecb5862e1f79220e059b26db2be52ea256df9cf9203fb401","e8cdefd2dc293cb4866ee8f04368e7001884650bb0f43357c4fe044cc2e1674f","582a3578ebba9238eb0c5d30b4d231356d3e8116fea497119920208fb48ccf85","185eae4a1e8a54e38f36cd6681cfa54c975a2fc3bc2ba6a39bf8163fac85188d","0c0a02625cf59a0c7be595ccc270904042bea523518299b754c705f76d2a6919","c44fc1bbdb5d1c8025073cb7c5eab553aa02c069235a1fc4613cd096d578ab80","cee72255e129896f0240ceb58c22e207b83d2cc81d8446190d1b4ef9b507ccd6","3b54670e11a8d3512f87e46645aa9c83ae93afead4a302299a192ac5458aa586","c2fc4d3a130e9dc0e40f7e7d192ef2494a39c37da88b5454c8adf143623e5979","2e693158fc1eedba3a5766e032d3620c0e9c8ad0418e4769be8a0f103fdb52cd","516275ccf3e66dc391533afd4d326c44dd750345b68bb573fc592e4e4b74545f","07c342622568693847f6cb898679402dd19740f815fd43bec996daf24a1e2b85","97a9a666237c856414a5e728d6319ddafa5004c3e551ab6188499d37326addcb","a8aa39794fafe452870fad67667a073125440adc0ea0aad2fd202fd497f730f8","89968316b7069339433bd42d53fe56df98b6990783dfe00c9513fb4bd01c2a1c","a4096686f982f6977433ee9759ecbef49da29d7e6a5d8278f0fbc7b9f70fce12","62e62a477c56cda719013606616dd856cfdc37c60448d0feb53654860d3113bb","207c107dd2bd23fa9febac2fe05c7c72cdac02c3f57003ab2e1c6794a6db0c05","55133e906c4ddabecdfcbc6a2efd4536a3ac47a8fa0a3fe6d0b918cac882e0d4","2147f8d114cf58c05106c3dccea9924d069c69508b5980ed4011d2b648af2ffe","2eb4012a758b9a7ba9121951d7c4b9f103fe2fc626f13bec3e29037bb9420dc6","fe61f001bd4bd0a374daa75a2ba6d1bb12c849060a607593a3d9a44e6b1df590","cfe8221c909ad721b3da6080570553dea2f0e729afbdbcf2c141252cf22f39b5","34e89249b6d840032b9acdec61d136877f84f2cd3e3980355b8a18f119809956","6f36ff8f8a898184277e7c6e3bf6126f91c7a8b6a841f5b5e6cb415cfc34820e","4b6378c9b1b3a2521316c96f5c777e32a1b14d05b034ccd223499e26de8a379c","07be5ae9bf5a51f3d98ffcfacf7de2fe4842a7e5016f741e9fad165bb929be93","cb1b37eda1afc730d2909a0f62cac4a256276d5e62fea36db1473981a5a65ab1","195f855b39c8a6e50eb1f37d8f794fbd98e41199dffbc98bf629506b6def73d7","471386a0a7e4eb88c260bdde4c627e634a772bf22f830c4ec1dad823154fd6f5","108314a60f3cb2454f2d889c1fb8b3826795399e5d92e87b2918f14d70c01e69","d75cc838286d6b1260f0968557cd5f28495d7341c02ac93989fb5096deddfb47","d531dc11bb3a8a577bd9ff83e12638098bfc9e0856b25852b91aac70b0887f2a","19968b998a2ab7dfd39de0c942fc738b2b610895843fec25477bc393687babd8","c0e6319f0839d76beed6e37b45ec4bb80b394d836db308ae9db4dea0fe8a9297","1a7b11be5c442dab3f4af9faf20402798fddf1d3c904f7b310f05d91423ba870","079d3f1ddcaf6c0ff28cfc7851b0ce79fcd694b3590afa6b8efa6d1656216924","2c817fa37b3d2aa72f01ce4d3f93413a7fbdecafe1b9fb7bd7baaa1bbd46eb08","682203aed293a0986cc2fccc6321d862742b48d7359118ac8f36b290d28920d2","7406d75a4761b34ce126f099eafe6643b929522e9696e5db5043f4e5c74a9e40","7e9c4e62351e3af1e5e49e88ebb1384467c9cd7a03c132a3b96842ccdc8045c4","ea1f9c60a912065c08e0876bd9500e8fa194738855effb4c7962f1bfb9b1da86","903f34c920e699dacbc483780b45d1f1edcb1ebf4b585a999ece78e403bb2db3","100ebfd0470433805c43be5ae377b7a15f56b5d7181c314c21789c4fe9789595","12533f60d36d03d3cf48d91dc0b1d585f530e4c9818a4d695f672f2901a74a86","21d9968dad7a7f021080167d874b718197a60535418e240389d0b651dd8110e7","2ef7349b243bce723d67901991d5ad0dfc534da994af61c7c172a99ff599e135","fa103f65225a4b42576ae02d17604b02330aea35b8aaf889a8423d38c18fa253","1b9173f64a1eaee88fa0c66ab4af8474e3c9741e0b0bd1d83bfca6f0574b6025","1b212f0159d984162b3e567678e377f522d7bee4d02ada1cc770549c51087170","46bd71615bdf9bfa8499b9cfce52da03507f7140c93866805d04155fa19caa1b","86cb49eb242fe19c5572f58624354ffb8743ff0f4522428ebcabc9d54a837c73","fc2fb9f11e930479d03430ee5b6588c3788695372b0ab42599f3ec7e78c0f6d5","bb1e5cf70d99c277c9f1fe7a216b527dd6bd2f26b307a8ab65d24248fb3319f5","817547eacf93922e22570ba411f23e9164544dead83e379c7ae9c1cfc700c2cf","a728478cb11ab09a46e664c0782610d7dd5c9db3f9a249f002c92918ca0308f7","9e91ef9c3e057d6d9df8bcbfbba0207e83ef9ab98aa302cf9223e81e32fdfe8d","66d30ef7f307f95b3f9c4f97e6c1a5e4c462703de03f2f81aca8a1a2f8739dbd","293ca178fd6c23ed33050052c6544c9d630f9d3b11d42c36aa86218472129243","90a4be0e17ba5824558c38c93894e7f480b3adf5edd1fe04877ab56c56111595","fadd55cddab059940934df39ce2689d37110cfe37cc6775f06b0e8decf3092d7","91324fe0902334523537221b6c0bef83901761cfd3bd1f140c9036fa6710fa2b","b4f3b4e20e2193179481ab325b8bd0871b986e1e8a8ed2961ce020c2dba7c02d","41744c67366a0482db029a21f0df4b52cd6f1c85cbc426b981b83b378ccb6e65","c3f3cf7561dd31867635c22f3c47c8491af4cfa3758c53e822a136828fc24e5d","a88ddea30fae38aa071a43b43205312dc5ff86f9e21d85ba26b14690dc19d95e","b5b2d0510e5455234016bbbaba3839ca21adbc715d1b9c3d6dede7d411a28545","5515f17f45c6aafe6459afa3318bba040cb466a8d91617041566808a5fd77a44","4df1f0c17953b0450aa988c9930061f8861b114e1649e1a16cfd70c5cbdf8d83","441104b363d80fe57eb79a50d495e0b7e3ebeb45a5f0d1a4067d71ef75e8fbfa","b6e995b5ef6661f5636ff738e67e4ec90150768ef119ad74b473c404304408a1","5d470930bf6142d7cbda81c157869024527dc7911ba55d90b8387ef6e1585aa1","074483fdbf20b30bd450e54e6892e96ea093430c313e61be5fdfe51588baa2d6","b7e6a6a3495301360edb9e1474702db73d18be7803b3f5c6c05571212acccd16","aa7527285c94043f21baf6e337bc60a92c20b6efaa90859473f6476954ac5f79","dd3be6d9dcd79e46d192175a756546630f2dc89dab28073823c936557b977f26","8d0566152618a1da6536c75a5659c139522d67c63a9ae27e8228d76ab0420584","ba06bf784edafe0db0e2bd1f6ecf3465b81f6b1819871bf190a0e0137b5b7f18","a0500233cb989bcb78f5f1a81f51eabc06b5c39e3042c560a7489f022f1f55a3","220508b3fb6b773f49d8fb0765b04f90ef15caacf0f3d260e3412ed38f71ef09","1ad113089ad5c188fec4c9a339cb53d1bcbb65682407d6937557bb23a6e1d4e5","e56427c055602078cbf0e58e815960541136388f4fc62554813575508def98b6","1f58b0676a80db38df1ce19d15360c20ce9e983b35298a5d0b4aa4eb4fb67e0f","3d67e7eb73c6955ee27f1d845cae88923f75c8b0830d4b5440eea2339958e8ec","11fec302d58b56033ab07290a3abc29e9908e29d504db9468544b15c4cd7670d","c66d6817c931633650edf19a8644eea61aeeb84190c7219911cefa8ddea8bd9a","ab1359707e4fc610c5f37f1488063af65cda3badca6b692d44b95e8380e0f6c2","37deda160549729287645b3769cf126b0a17e7e2218737352676705a01d5957e","d80ffdd55e7f4bc69cde66933582b8592d3736d3b0d1d8cc63995a7b2bcca579","c9b71952b2178e8737b63079dba30e1b29872240b122905cbaba756cb60b32f5","b596585338b0d870f0e19e6b6bcbf024f76328f2c4f4e59745714e38ee9b0582","e6717fc103dfa1635947bf2b41161b5e4f2fabbcaf555754cc1b4340ec4ca587","c36186d7bdf1f525b7685ee5bf639e4b157b1e803a70c25f234d4762496f771f","026726932a4964341ab8544f12b912c8dfaa388d2936b71cc3eca0cffb49cc1d","83188d037c81bd27076218934ba9e1742ddb69cd8cc64cdb8a554078de38eb12","7d82f2d6a89f07c46c7e3e9071ab890124f95931d9c999ba8f865fa6ef6cbf72","4fc523037d14d9bb6ddb586621a93dd05b6c6d8d59919a40c436ca3ac29d9716","91fb6333bddb60dfec52d50fadfca0576f6ce68db9b418636d81e84b5cb462ea","7749116fd6f1080b735d584ab6a83e0c23024f42a2c8fc7ed12691b3c42b45de","e68bfa73e3ae561ebe341c0f9d42c8710d7db291e405360c2050c974165bcda1",{"version":"0a3ef7d65cbf28318f3d2c17062c85c03538d84ac1e137b401ac99715aea5a4e","signature":"63eac52693e96c8007195e7116de318b6fcec74b3b3d0192a69609a31dd55064"},"fe93c474ab38ac02e30e3af073412b4f92b740152cf3a751fdaee8cbea982341","0e6c1523481666b62fea2fc616d7c0be5ca1ab1c46a3ef5575a3c84e4de659c7","1e00b8bf9e3766c958218cd6144ffe08418286f89ff44ba5a2cc830c03dd22c7","a45e90f0217b9bceb78bd7c4338aa7a62b57a5200f6e29cab3158a071e33d53d",{"version":"6ebbe57a6c93856003f66c6fb54648a23299fc583a0c435f64b9cd7d4da64191","affectsGlobalScope":true},"d2b9861e7bdec290206bca5c61f48cb564f147f60fc1f0317f109b8791888615",{"version":"51d19cf6dd988cf25671f70d44e0cc8cbb577af707baaead70520c8eef34a0f2","signature":"c689d5c82a309dd22dfa47ebf791065dab774ae390a260b45a64b9e838fb40fc"},"e1160a8bdbd434fa1a07d7e73ff190960dd7f6990590027a3421e79e4cfbede7","791b7d18616176562896692cdeff84662d2b2ffe3fc33fce2ce338eaa8a8288e",{"version":"ee47f1e292889eb8b207d015a46d0d522f5a76b7c5296ac4324f2e283a00720e","signature":"0e16da9bc6656e406f222f0302490108d90bb193c87975b49c1ddeb70f9414db"},{"version":"d45019132b89a40a302d623293f20da0b352a440bb7001c4fd10d288a9183f97","signature":"5eb170935c778d471968b057968dc0d83c45df161a96034b3e08c0af82575333"},{"version":"2f5c8f8c99fec4a9af21060f5ae83d116fd4af85e19c630db6bf3b6171e4a9b0","signature":"d3e51f645ef9a2457bea648478a817320bfbaa83d24f57cd0ed249f891828636"},"5340bbe4a404c70141165b2bb66b86ffb4d60a92be7508d0bf2c47668148eb6d","be2fd0c4a84a321079e3df8235a338177c613f8e6ad9eedb2e15d4bfdfd24b47","8f3d788e9f36da0712716b272870b06ad22c9dae8032ee0543a3f0f881a26f7a","1f420b81f613bd16733d048d6e828215b5e9191a64a20c9ff77a049fa75445d7","2a3b9bae621cfa8135b622bbc53b52cb7ba79d974ac4abe1003dab671c9352f7","eda7d437ae26e88e2d22d33d43b60ca69d418fe66045c9230cf79ac3f441a32a","e59afc33c7f94c61db082674f0cf1b0cd862e38cb51e93b312728400b0af95b9","b3828dcce5209e5b76fcd1a60b3c52c84735f56df7513a5d4412743771e62180","40b5c23e347e635cbf9f45cd03c58a68c501eba858ef3ea0358aee1e773ad2f9","04252db2f0c0f10a15bc819d1515c9939bfefa0210ee6d4a40847b08a427dec1","311f919487e8c40f67cba3784a9af8c2adfb79eb01bd8bc821cc07a565c0b148","71f7d6d1311209d26fc8336af08ff0353f0d8666dacd42e11178b9a8e6c55835","e7c641103dcec91a04dae4501bd74b105e106c1b8de28424882c3b1b7cee200b","4e70bbddb199aee939358c9a60931670082e768151ee3cf7fa05b04474341814","088358ebbc20cc651cc64f748206745b75bb1ac6a6571636a0d6020277375a79","8b07aa9f1a21859f840756e74ac33ae76392ab22313328484d4a191d1d098707","9855b7084a814cc618371d5389aff0c6605fb9221ff0b6c5e675a6fe6cdab9f7","c44d170308a86077ff837408c8d9c321ec61d5159f981b542e00af8054d2390f","1552a249535ba9306d1ce112428864d06af27f6c50f24fb75b46fcc562927b0a","59a6bb02d8b49f12fe01238dbaca499f1a1aa3d3ac2ac6f1d351ff59d0b5e080","5b14aaf663a0b8765f7dae3fce4adfcde6565215e72763eefdea7c223ba34995","b412ac3be6678bbc27058e17b2df63c5f9fd62c4b894d3851ccb10149c8d06d3","4bba4f0eb0c6199d82234f61fe5199879763756574713488595556251db20c50","bc176f0b0af87b8b38415db1274477c1936d96f4a1963a8b262e11a0bd74a363","81fdced220b7871158736c5d3760b3e7b5ce733bd9f2e581d5337d4bec081f2f","5988a006c63d1f252e53c769ff61202a664785ce4b6db475aa1b5ef829c40537","1ccce9d8ae7d65311733d005c012f7ce386e00a33994a48ac0b25583a7c76246","531cd80e4dba2620d86844a50e7d21b89436e56a14e66d6774e99b3759ac69ad","c83a76ad0bf69b0176042adfc65f8c6be7dd1141b66cfa20954520315dcf2c1a","5b1d4ebd62d975c7d3826202f8fac290bac0bae6e04d9e84d1707d7047e108df","22e4e3f0bc6ee46712e2533401c2a81a67ec3752cd86902c8a72db6cbe0e8a17","a3db1b06c287a664be4a5841f1a22246ef8c977169e84440704a70af34f4d0e5","90941c7eaa340348b54864722768b8489aa467876b52eeac712d43e92a125c86","975699767bb6b53a89f0bc1e759d22c07fa380682f87e47723cc0a15b1e5a09c","d5f26cf5a887c017990a71b4d97ca1b2bc63f2280c35e1d78c4cf919d85ae1af","74fe0b69c88fa28f23f5bf424c3019316b83fd6aa28e385180c3b48fc33af91c","c8459c432571ea13d18cdec09ed6fae9286dafc21a590d39fcb01698fb71c540","83e56d3337e1a6dbafdbe5a2502a84c330b1a328ed2860d689b2ded82b1f5c95","f186de91b1c50640e4d2bef41307ee06446d7ec76f787d4384ef808981025546","4886055af73784b27ea115b68763c1c0c30df8528ba50e7d1d3e0922c6e7d8e3","5e494aab922be4d32b26044c232b411feabcb9854d93ee82d56e79e5dcb48289","9cd6c2e0cb9949ee4f30f6302f0e59eca1dfaccd80f409bd61103f3a0f7b4295","3e670947b62651df1db828871a52a2cacb5cc23466c4060b4fb2de363ab7a01e","b05b23a0dc3dd90ed70d08845741ff463747cd539b331c5db7b7a249084d40ee","5be20831424f2ec3540853d3eb5741b10a5c40310ae0e8da196e518c912f29a7","71ce195a37abaeec965397ff586a8df51cf1061a2132a58b1d96f18061e08179","ef7229fe12c32f8a424017fa29e14b7c2927445ea606a922509fb8a1753ce236","187a9d8baf5677aad3b2d8e1c8c9adc0982ad9d9a2d8b9acfd3f779c964c466d","170f1219502b007cb173f10bb872cf397724f4c178a93a5d623ff04e30f14c63","3533374d0f9c64f4da2a7c12b12bb771000b91a2442ad551a332f266976f38fc","19d6bb75afaf19057fda9eea52f5e9b2904ad5ce074208e26a85a0a2ef02967f","0bd97515b730f06b3ad1d47e4ce48c938be1478bab653f3f543ae0b79906d198","197eedcb38339cc32c11d7730af7918a711455425cfadc0694a4ca5122eef269","a1d12dd95673359c47d355ba3ed5bbccf03a328c17dc89e14a8fcf9a97ea630b","dde8f168911f7381fea4c6a02a6195efe737fab17a9e529cda14cf75d213e64d","540f05e10a191e5f9ec2e98246fd9c4eb3e7a67db62727745eebc8ae33139c6f","713982b68291d8f31e689c96b1087d207ab1fca555516c68cb926ee9d4166a55","1bd60c1d8b798f2048cea93a93ddfa0909ac9b291f69deb3f0212bee2c4d5668","c0e6e062c3de2922dcaef1f5ede860e6261952597fcd7bdb9fb026cd6318bf86","8e4aa38228958772601e484fb67a17d895bbaf96ccd955683a92c3ea2ddb9008","38fc598403537c00848ed3351ba6e0c65965bd27f690fc01fcff21f4e9d27f1f","4179abc33d2184fee36504293aca04c5becd85ffbdd8256501e622f25a5776c3","bd8ebc99bcd31dd5bfbe3ae4f5b01fcf6d84425814d5169ae9d67323b00fbc83","f36f1888ca11a5ba157e06691e2bd5f813cf3a7fbe4f7d1eab73ca400ca194e4","ab345f367dea65a93fb572ea981d655b62be0cdbf65b28181d94bed66239d39b","cbc34423d552fdafcdae85854eb2269985cf94e9e8a8eefc2db5aba12e1a489e","a1cc012a1564f57f1fb78b689a443028efc86e2c50a8519cf14b9ac1f4ae0348","363296a883eb63974a8698bfccfb256ba8121ce0f9d3c8de912f2d2146737cfd","8dc41a1b2f84762049f27a94680a4bc120721fe06e397b369d2272b24dabcc5c","8b467fc313cee9fdf0f0c0dc0eb807472ec36a281dd844fe42aba7c7d274031d","782c2df0df4867357f3f083bded3eda44c13b3514d15017dfc78d2ebaf9ae276","e88b5b07b5c608a0f90c8da4966e90e3525613ab2732f381692bcfcc82002250","108a8327d3ae431c67d32cee2a9dbc69515cd0a797ce37637220c8c1e7cc3c59","76c5280b3e3d2ca72f8dbd12caa422414e688fd15b7d5f94a7b85874328f22f5","b23a73c176df3d745018066ec401477a2453e329bfacdc6990efb287fc86600c","50ceee7efc7b0ccc442027d2a88b154bd61ee1638423ad6384ab06097b3a1365","382b47aaca003ecac050864a116d375219d976c0e754893d8b6f512d4642f3bc","4eba19668b3a41814475ab55fb548eeae1b4dc5f4bb6867900b9fc2a6e54d1dc","f9ab58bb3c0f3e842a995edba6b222ae0d23e45bcaaea3d6f0561730f77ccb83","23558dc88cb96c231b77df151f99d25c5aec3e23b90f7d1abf3ec64cf3912c45","7928c0bf1e1cc09958e655590cc957dc4de2c57dc1841a90f5dea0b54cb14287","19705721a7e0e58cc2aea1e651f399df8868147705d8b75f436dc713885e7b77","7068a539fe4985654b67931fa23fd347010a2acc2c55ea6804906ec0ba215b24","8458301216f8b0edacedbd9bf4ed8d3c095d106b0dc89aef3f7d389777deb95f","5943ebb2c311af40cfed6bc4085d77a99815c4031bfccebd110a5c871c105c39","981b11b0b968b287b9314d62ce98f047df8c681401a0b7d980f860272e04b6af","a5b9e2f0d914124330c1bb33526ef5f37ede0a7b9efed33604fdc43bbc1d1e4d","b5a89eabf223770e33f91e450dd941ff088860e702b3c2dab32d84276dff0124","f642a8ccc5e5e51a274e83b33db0a58b0c29f7f76e367d60ec0ef753fc13ff71","7290fc12693cc4aee5c622e093d58fe2a87f24320109726734980095d2836cb0","086fa8f261577d811fc12ecb844013bfa2448d384e85687f8ed6d1eab50f9068","fec47f073b2fb33d111f1a5d0e4a4086825621077cb7d97b9cc7d70c71a8b4da","bdf2d64887b3310970ae8f82b3d3e252ee73021e68c1560c4100029cdd32d8b5","f2abc2de1390b39d10064755008f2780fbc4ca94d0c8220584f90f52d2a31c84","e27641c172fe5a41f19f32fc60ee3f6cd33cebd05478546711a0d5525e71c29a","b1f5c52932dde792df712a5e5bd3a0054e9bbfac25b75f64a7c9c560ef74769b","bded3e53c82923f398e79f13b4613c63c793ddfedb77dcc96ef2d4e5b7affb0a","199d5c90f2bfb449bfde1102db2987040dc196fa50236493be6e097880bb9a10","7f91c76025569a18f649b4f1457bdb2f37ea3f9095b3e8c258eba4be975b9dfd","dca5d1958e94212961875f29688f7aa2b759318e8e82b81691b9014e91793ac1","df3d1e02bf2ea886e1e19ff8c84cb0dd62fcfdc7594a23e9ca275bfc7a1a6929","866d209769bcdb53349b09f931ed7d3a6b9b4209517be447d05b79c7fb6dcee6","05b8bff7bf92fe6bc6186dd8242e6df53a12dd103f898235a595d9e4463d9299","af265239c6e9460640eae520e03f3c8c58a41e28214b73c758a14325e8c3873f","146198c8110714217f3a229c3d45db4de9abb408dd8cbb7d82dda5f41335fe26","a85874659715bff86a4f36163bd952d76fe964d60e920e724ba5a60bc4297cdf","daaf387669df2f89c1d517103111e82a0a7e1819a5c80e37917eb5c277459b97","b195cca0e1068e7bcb6196fc10730e8ffed7b9b8534ff9b2357f6803c32f390c","35f14910024494183c839fbb4006987eec028d511956909b9cc036b3f6534fb9","60c762939809e2c449e833f7f250d94f5a3e3f40ab9f13aad770c5c4358e3957","f736a4385419f05d6f79516a795e19ac3feed5faba15976beb00845a2512b5fe","106879c585e7d8217075b046fd720c250eed48464237827a52b52a97c331c22a","7b030ec60a2d65462d63662f0fcfd5928d699088bbb8b0e365627867d1a241ba","feac3eceef704a8c1233c06a48c6b876d4c3a4c39907a3b186460a9ab3e43547","4967b141cfb63143d2ed7bac0786f16d3b5cdbc141314349885ea6f574aaa807","8f88f12e68e94560cfa20456bec799a9addec6b5d1e17d5f69745fe053a6617e","c2d6040e9b54304965070dcb505152af8c0780a8fa6137441f32808a40293b66","6290d5f115e312dfafba88e6b5fdfa53f92d295580f186456a998b0c28ac0213","4e735513c891b43fbc6b6e5f6faea5cb367a120a9b41d2fb0e4485c63317da4b","af156aeb421bdd3268323bed89f14552c0e49c27f3af2710e8232f59db75695d","9842dc467389a949aae5414f159f3eb183eb86f0f70cd09be9380850a9a27bb7","647a9474f10624fa95a211a862084d02c8fc4e649dbc273d43e922d352d98ee6","509dbcf811ae625a026366aee55e5406b967672b4f125ccaffbe6a7a115e9b97","aadbccac3cc723ffe52ea862d54716080a8006e73649eccacfa5017d7a79b689","15fefce4c9ef47e53cd58a2e31c95c222a961da76d68f1bc67e5896ffc337237","ea02a9f9bc4963f021b599c172bd7c0c99978fcf9d3f4758b33302383855570d","7d4b9b998d3b90fb16576ecc6a0a4d509a30e3b7ddc1ae1aaef44bbf3f14db37","1869fc6926fb320d2ca95db2aa1add90a3e7cfebfcebedbb9d96617790537858","acbc7d0cf29def24a0c0208834067fb17143ad5fecf8749ad9b59b4acfdaf8b3","f283828ab153c81f3cbbbc5806cfb23fb1bbf7676c98f3d7337e02eb0a976ce6","372b08b99acf26f408df1a500c00edbc75f7bc76f632f0f1ccd1a64df04c1f26","e2e7d8d43f5ef2933fe9c6f858c94846d029eab5e9743645bfd07eb500445739","54bb61cfe4e3924c24e85ddda2707860950727aa9c7ff83476b9d18fee2a6aeb","125c53a5b5efd439b624dace6bc5cfe180246608edc4c16866a27ff1d7a78a63","5ece699cfddcb302026598710291f8a5a5d35a0a3f9c3b1377a71ffa22703fba","345de0d1c592b44db63ceed1f63dc41448d495dc1c86bb701eebccef13d59524","f490696d4982968b781337e5e16c3315935e8154561ae53fec5f867a2724a2cf","c3f2de2a31ea838e9edb87387e471e2cdc730671532d189cdb98960c8fd03211","37fdb8a2ed967950bed780b6d41ae769b342224ca19ce05fe8901805e3ece7d7","73e00b559b3f7b06eefe741f6f90c1041dcbd8f613e78665f39dacf6394e5d36","1787a588fafb08317552703339858b8dc1a4ff1a1d48d67b1ac5e3f70a542c3e","1b1062d7de0216e8a3a90802b97fc8b49918566ab71fa8f2799f169cc445a9c5","b134ccb28bb50740d975a28aab4e343de0aa3237991a3c706869d33b75b0777d","3cf87c6b59b29e44b45709bbf5d0a6681d68bbc740889ded2fe98383e0a55966","55668481052c746ee6c8e7fa7d131c55535f4c0ee8e6d10cbc8d0e3172aab65b","8a9756e1ff6ea9a823e1ad243e00d1b5c276b7bd67eec6497fc998cced477453","f214b8793bdbb7f815b206b2b847d0df65e0c761b4c9befbc7a7296ce83caf2c","f8823a11491370686c64157bddf82244f2c951f50e5e2dfc480fd60a6867e20d","46601649638c07ebccd45967bd970fe65ec4016ccd39eff20f15977da08257c9","a1e04c37eba1d3459a4ceaa449b0e8150def9208b53a2abd21ce3db889dca511","369b64f8020b09d25402e1032b992c352a5b1ccf7d74425b3cc2f5a113b041b9","f4185b338bb0ec604525395ebfed2d82f7657c34adcc99358f68fbb8f709f914","71f10a0c080c1ee4128370a3787911ee8543b178395519608bb05225482c4ebc","7d7ba4a044ef26036a2ac2e33040b2ec3c0d4cad918f72b06cc92f351a8184e4","654c45b1e0229ffc32ddfaa2f7a13240c8adfb8d245f6936837f8665f855ed7c","0bdbe4302b3d1079d6d1763662714519c475306b7b31b2edf5add65f67c7b826","483d3cde79a0a88584bc57f7f7521b80a65266a7fd07e82c31bad6adef29b1fe","90641e705d325de027109ca2d8268d5ae36f981acf113a414269c989ed0fa64f","f68cb4c74f0da0b793701c3a13e2e34537e56e4a3887d8ce3a73839b267efd03","5e5d9b22097160878951c9d421495cd5d56322d6670028fc8e76449ab2ca458d","a74b866bd293199b23e14108f3e56844d33787b2c703a532a93b656eb3f8932f","32a1804b990d2be79cc2368ce3bac2c63ca8b214b8a0aa56bcf87af4b2986209","b02d3275eaa38322f535a6689a722b912fd12fadc32602de713ab0c8307456a6","dee852f23b837922af727b7c710eaebb4ae014a7247db12b2c869c7b51cdd095","341d3e3b491dc7dce2e152c9ba1ed406e9437ca795b40d32145408ebe5d03462","8ab578c53ae8b6428db026a3c917be84db558d8041665a2be2af45208001d5db","8cf5e44edfa5d118b87d9c429b6f6480e44ae4146f1ce122be01cf1903d4b3b4","6fd6f9b2e99d4f156d97f632711e5305531bd293a3af9a8364ccc22a31385f15","2bf0564348cf6d5f332fece3c7e82d137a79d8643f5d89dbc20a51d437a49219","707c0465b632b25d3eee2f90be0878ba1db509b498faf24e3b3d77a7c014b337","5f3f82ed90760a5dfcea0d4d966b9da7fd3f95eb52aa20aa9c86b079def0e0de","33eaed797c50c21969e9822c291e891148153af64bba58c3c24d40469ed90509","9f1dfba33d8b2ea22aecd17efb3357720be9cf6e8e8b02528413f51cd6839e98","e7818cea10297d43f5f9f3a32e045eb884e24bd0e8cad121f0007e63aa528506","2e31d2696ee03a2766d9437a3cb06eb4fe0e9eb771665c84ed55d9ae099857cb","d542ac292805bf51b52ea1d57a86ca80e3eaed48f70c23d317d9cfbd983060e4","b56db6051baefb06c0469e892c41faa038f2567f64bf4a9368dfde64943b3d78","494156051cdb8d5503456454fe32e77361c231a3d904fc82431b2846bbd21134","6c3596c8cef330a66ec4d440da06243bf60410f9ede80b1714725346ee733fda","c43e320301589efa8355fceffaa3a74cf40d3d702ca312df55009c071ff56f25","bdb17b1a2e8ee934bba0a5b48886093852a8bc58b96467846a881c407116a002","23701acf3248c20ce61b59077e02f7fd5d16f3644eb387651989d361e60657af","745b3ccd3245bfc046dd279449fc85aefe8e92cc0b48c85728d1717b41e978d1","926298aa640e4265691b5c0f904e272c0f5848a48dfd6bbcba73dd219db066ab","11803bc0d16d5dc2d70acb442d2463294496a65696ad90ce4c997ab8816e529a","cdd2087e4f6360cd69309116f37d5e9832658cf00b39a9979c653276973ab5f5","95c0eb4ca11cbc7bc6aa90b5d09d845d4dec30baa1e0c6eb5eb5b1a570cb7cba","a75f736c816e34cda164a56f72aa1f8e7acf11a2b38dcdaa48b3a351065655d0","002eb28bc5f6f5ab3644332ed1c5cac44df406438d5113618f74c7bd9fdb9614","7423f7f5a98a1c44c087acd71a762d24b0f37c13d75b37f6fa26d0a3432f2d3e","76d36e3fe4d05668e3435789c3b8264bcf20af697e431a506450aa31af353ed4","67420c3747fd6f672d2f3c5fb37a7f86b816d16cbef3a048b2bc712cf96b2b9b","5e6f76936bc479cd12c6035e8af7db4cfb2236cb60e5073d9227db6c7dea960d","e1d8dc6d0e63fb42e257e4f3b1848ae9d87597ab6d42973382e4cf9ea1f2a5df","2775279e20122dbec5ab643205c2de54796481366d6fef23cd426aff3a775359","0f150330a95a7655340acfb6080b98eee2e7aabbb7621c12aba648ce96926499","5f54ccbb384fc83e442597b0bac56c2c33ab6f0d4272222403e74dda474e9329","74b4e492a5e50fc36ada0afcb28a6fd503ac6e56c32100fb0a3c67d2b039eaf2","c3906faaf1ef469a8c6bdb06d887ee72ef3efa3db90f13244fce8ad5151b6f29","ee0fc65dac0f1c8219b190992d8172f7f8d6c993f243a3b602d849726656d88f","d06fe49a2691f85081f2b7af3996418803fedb123c03a8ebb3c03c61aecbf5c8","b99ee43bfc44a2b1cc1f25119e12a45138f1129362cc896e2bd2b402845bf4f2","f64ec1d4f417e37db6a77b57d83890eaae4bc9f34bd6511a708ce7a996a3d55b","dab2b4105c3bfae9b075229c4dfa21fb3d1731366d4a3521f96aabf189d221dc","7d605d744a2357bf5b5894540e914005894b0c45121fc26a5db8becce77fd07a","ce528699f9a274347204b96ff2a6c45f7dd8daa1b64dff97813b7ed45f5ee66a","3613862537943cfed17d84ca8bce035c4b940027a9a0fc7d1f7150bfb0c5fd17","a0fa9812d4eae4d59a3b093c51de49c71e09e3b25fe9ca43773574737f75a157","bf634e01493c3f8d202f5768b6e39afd8ee37d2eb71cb17e0ea071d3e7c590a0","98c767e6e3e19e7138820d3c47e22c9abbf2e866f76cddc21107c0ef50d07a78","16390ff08b2c73c75ea19745d9312d4e468d9bb51961b04f60c998b90b3b928b","089696957b4c25dc7daac0989f7111f648803fc0502089333b62fac51bd2a924","04da2226a824c6f2e65c8d384e6a3f2c9764b1f6f403de9d2cc14b0805fe0f67","33720ae3aaad9176f2c0a9566f1de86ae383755460d0c8b2a2edbaaf4de43427","0548d2ec85b0b13a13221c4655e6c06aaf7418ebc97ade0aa587c2343ce6547b","6e2de5b0aebd9239eb9716ec2e0cb81ac4995325ce355b466999961029844ff5","d08c8749fe18ac1a6dbcf2bb91ceb7ccbb8cde5cb5e999bc0a741d61ba71f117","d9e43f6f76557c54fc1463bb650146837f49c6f2d0d822197198060110503bd2","d4deca71cf2889a5f7512760d0f08ea7d9e0bedd46100b828d07612a7f3e670b","975aabee6dcae41913b2564aa604561f22f7ab975cc2c01f6c3ffd27c294a552","5250574802683496a4f8fde6e133c702a392d53a444f5d1664587b86f0273639","7a9ba9476a31287e6647152529fae42347a862a5cd6368104e9e246202a91199","4e855b277502658b22e5aea161f3e09eebd53d5430698844af5c13a9ecd72c03","e1bb34d2a2efcfb67c19d05fb8db0e0a5de1cee68236d4ed4a6f9e6aa865a896","8c514d50eea9e613dc787aa529e1ce54874996c2157b92aed232598f2c50b3c0","88d801e4c8fff045839f47cb0ab33852ed850d7726ab82434fb5a44fd8cd2556","d8c3c3d023dfc947dd1056b21e6ac9bf074e95cc5ae68ad9df72a72077010d41","89e1166774ae1f891ec008e9589d1cf6c4c80c134b50f04c80b3c3e0ed3110f0","01e8936c8014e13c1bc211501fcc6e2d81d3923a22e9a19df18f1508965f449c","d102abc0b927801711a39a4d750776a6a0f5a91512d3570aa4cf622fa8cb3175","3d96ceeaebd16cc773a45faf1b9d3e147f1164d4a29caef7a0a0d5520f2fcb90","412c366af77e4023affa3739690ff5c76305bf50c4a0cbebb8a841c0bd7405bd","7f28cdeb367b7eec78e8a8c7b29a0ddfcd0c5861af3e4d4f9ff99fd35b4f5e9e","484d6e6f4e5fe43cf335058a3305e1afd98ad33b414c996f54571b336224b861","cb6efa14d1326c3d525e5597f840f6729d8f521fd85eb2697f8bf13068ec39b3","4b5f0d2a2af68a38dac59eecd5bc04fa48b247b7aaabd06166ed5ff64b897f43","4f95388cc4b8be42d2b39cb5c6c2a59bc7a5d5667248ddec118af922147c0ccb","2f428eecc597fb515969310b76daa01446eb02782656c617340b8aafeb4d97fc","afda8791c56ae66561c81e5c190911360e45491229ebfc46b2b863ee76a056dc","f52871ba2399dd4a87ec341bb238df010fab729cae37e583f4441f6634536ec5","20d7e7f98ada30849b09c3fa63d65622d40cb5acb0fb5b89b42376b554347988","0380612a956a6cdc2d6825f5c0bd3b00d76fd4f79e81e9e4fc9a1664b4fc22f2","2261f4647954aa335d81550054804db3b8c91a474cabf5585d86fe31937c067f","a1a9bc250b4ca1caad3f0de69498aabe2c01eded0be4f779f0a0a7c5a58c4077","c05c1981d2a1cb6d90922e61855ce3fc2d2e6db99df7b00ea58bd4c85bf0065b","283bdeabcba8258fb064ee12c8bb973fb6e024519cf1e5eb8c0f0349914f7b4a","5027737776525e26636313d9904a35b73147f2aff691a68052bff8f1e29b8510","59cd6dd4c5bdc99f36cbe0f0a469d47324adb8886ba518e50321da36ba9b0fe0","d974e4e8586aba636795ec9c8036c5fe8cd6321df28f7da4163a3b7af82197e3","a94337bc12b3d22667aa7e8f60551a1cf08b2e7b91dd8647de86e0c64e116dbf","9ba2e8c857c714e1be0db2a7e7173b2954606adb5552e616827346ea23ef1d05","57d04023254dc1fedddc1c55cf4f4c8be97c7b3e707d3f5a46c1256d4a3e615a","6de407959ab3bb5cde719891a4d7c6e00641a3b8f56a829340fc39ac5038acac","15dc1f1cfd32a0c720c99a72351a036c0272224ac0f41d10db10e7631bdf70df","d4ec31b0b60f89f055c40fcc5a768eb1435739c5bdb6181af596015dbe74a010","6867757137f9e2ebee7b508fc6a80fa9db0fd6d4793a444b80bfe99e768d258d","0e5d11cf8de3373b0e90ec6b6d8bb1aec9c516b7d48d8a56a572ba6f1b99962c","48a0e9632011de6d7737e1935c385638a19734a5257db668803e5737be641187","de8d8f3568cdce2b58ffd72af94cab625a680ad6582fd3c7167534ccef8e21fa","e83100a75dfb09a0e6b73ea26587deac836ab698689c59a39e9f91675d45d23f","9b123f2d39794362627d10e5ed91f72e972c1634af69f062d48c414bc9f66352","80a240a5891743d3674d97ca81290d585999f7c20678a0782d46548e326b2ac8","836c5266411f7f089248e84dfc1efea381e5411f8fa1860bec265e455e53bdfc","ee65d2d9b264f96bced10be5a548c009b9206c4e38cf8dcf2f62ff15b9c61ed6","7bdf7ae40b23d7d1341ba3c31823650631f867c1bb26f8c8228b680b579d3210","4dea89d7bd826440c16eca419f071bd7939ead4de6ebd17a8e57c779763c0c81","30e3290af779003d361e84c767916bc427a28a3858f73ee2efa76d48742793a3","69704cf1ccef472d78c190ffd29ce8b4452096ad5d71c41b4e1884391ff1b41e","3238a82685fc10a634a42266c3c41851cacba8803c97ea2113a61e4c95a7d1d7","7ed017437c45e65a50aa0b6cdff35add289106cc3239904ef3939e562976cb74","723f068a6f2ccad1305cdd179c2d3ba18e630c4e64d4c514de16f7af21149eac","239e71982bc438f297eb9def85629416225aa0d064ad9aee813dafd72cd152cd","869eb1844a7da0600c54553b8791525a62384b4c35b685ab19280cd50a528af7","5d4b2816f2e11781ab76a816955d4a160da778f295eb6cc17dfc0a8c7c14dfbf","0e950fa619fef178131fcff760f73e79db08187916cb8b64ab8945dd305a9c86","889cbbb50bc2d837f260e9094855a51fbb2096c5b6e60771f5bf1bde759b0529","e65218e979d3e7436269533ad6d17c66909aff8cfd869626cd8a5406b32f7f77","8f54a339b2c59a424cb7bbb8c1c25e481223f59392cb2e2ac722ad5054360ece","40fa0f2cecdfd021d8fe883a62caed86fa01da0abadab8b33c111f3a27f68cf3","7c1bd4784dea91c4d227b38c0b0f54e8744b3ddd9c1252eb14e72aa80e7f0d31","afa23eb99b264e6fd3bd49f9a9a2253d3e7ca72eb108aff4bc60c558d7621df5","bbbe319e8c4aa5e0f3bd17029839373abe2c6607db78c0d8076d43293581a78e","ce6bd901aa23d85f3f7115052ecbecbbee154d964abbd8e183a376ddf733990b","d78555a429403d2a1bfd2b5fa2bbbc13c7bbbca8c96368df2e322bd3ac8621cf","0f8679f0a77354915e3c3189eb61ddca10f5ccb101ab168b71782f2321b1273f","e997c118c2d5f6614c2d25320f29dc40dfcad163f56a701a2bc66eb80b32e6de","017351e1932f166f8f2d0c321dc157ee0e6dde15a30be910e3202c26cf606fb6","c83124bd4a3e5af897815af6b17ce8c9c5ebc62b309f0d5a14e916a843a19a7c","0c7285553c36ef69db118be778a000e24589b9101388e2f94339436acca2f268","d99d54c79b387d4178c6a12b09f57f9a853071ee504867e8c7030001f4bfea96","8609e917555f5be55b22967053bf3e38af2e5a765ff472884a775e368d83f2b2","65b908159bbe65097f92df403b01c4148f92aa18685841a0b8ab7c080c0cac21","246d6c93e32370c61e6a32a5b77df0c02987b454acf92fa17fbc127845de73eb","d8006e69eb4d592a40c5c1c112c8a8ef79dcee716f62d1fca8b41d0f90e5a1af","f187fd1bcbcb4e75c95a9c6e4027ae939439a661c0a37760ee39a5dcb41581ab","2292025dedc92d914c16bf233817bba165c7cc3f7575180bc05b283ecde2b781","ab3736f4d0149f337e95f3778e3bbc68914d3aa115cc0b285b302eafd73820cb","7d32a99d3073ebb61cdafd257c75b1d96757fa162db9e4aef51a594677b3c0ef","a4fec4b172622accd106504e64bed22bc9d60d4e5b3c6b3c9d00bd5574d60742","d03fca025fdd6877616d05653b6e8afc83cf6d27ad5c3c655f34efee15fe0f20","5efa480484e1bd38f84c55f91b58ec87a97f0125ff79db04676d2e57021a0dea","13e3b762d0a5c4370158b6b41207634c4b68784c13124c3345858b05cdecc11e","9f51695eddfcff9bf64dedb40cfd15044a2dcec4a149e5155d54c2e5bd07cbd0","76d82360626a25ebe0df6e5dd9434839f6cd1a2482f3c4e5dc9623b3d844b4f9","ec6498a9b1416845a9f964aeb71a56aa2977e98fa05759b84549404702aace35","71cd46cdf95730e6c9cea42e320cdfbfbf9cdd6b536bf9c96a6573153dea525e","bea348e50cb3e2c152c477b3d5cd0a94c2bfac2429fd1341b77ba57f0afdcae7","b8a4c26cde9f4f2e1ca8366db86ee72e716de45aa848eb5d15f8b09d47de6883","2d06b46d89444546d248874643a14e6afa9ca1400d3bacfa8c40031113935efa","8a61ddc3a411dc254efc9338acb987cfb620d9931d3ef3b3714d9061b32d2f3d","8f692d99f64adb2616d31409f12ca1e592f1fec9348ae35593fa3a16011351aa","07b690c40f08e018d07c453e4c88980765a4b4fad2c33b9121018c995951c9f9","f2fce8e09abe41eb2a2bf7c2cc35c1b341781fc28041a4f9ad90f5717e76d81b","2f3ac2abfb723643239aca6e6588e3d04a0870b0111fc4587860cdc053320090","9066d1b547a57485e8430191efb300c43b10685ceadfd5b258bbf06b3a1059df","6599c13c1c0d89f913b71c19ad323bed2ef94a8b472efe56cc0c63524d2d4547","41c163b384a5a67ffa85807addfa811c6e10189b3fac8478e00b3217188c0668","89ac02755a0c3a79aeae98b49725d597a245b753be90782ef2ec12730063f0c0","500921f96372879891f2ca5fd26f0e8de76d674b6bdb3800fc40eef5d26d1020","aefe6e20afb6461abc8abd42aefdbe22e9e50832e34b0f81e4568b00dbc74c49","18a0e300d7656ff1a95f53f0255e1281d4aa7909f6386dcf54c711778ee29acf","6d6e3cac4556668afc3773f11174b8cd4012295c3c35173e68cf2412312c76ea","2ba6ba26009f322d8f58e996c736aa9faf8457b739f2c69466eb3679fe7809ab","a6cfc043b9ee3136e49764d00ff297e79a45651adfe24c785ba227b88ea3bd71","a1ec8813c39e3dbd31361b0b3ca6926620251e9b9fec212cdf21c8f39f9b421f","d0ec900bbc8795c26c2eb4f6d831eff15568ec15083b5a63e5454cc9cbc83df6","af9d1e15bf118f6128db740554179800732e520a3f769a5ce4d69afefae511ee","9d6dc5653490ea7f28804a8f44aed9ace566a0280e97a621be9d1526df0cd359","7ea08edb2459d84a47e96b5e7b5ba8023c146cec209fa013acce93811c859349","6469ad8d46ffa793a564cc64efe3198e3134f730ab886760f5a5c93db3ebf053","e7aebccd51d863f0a0c08c5413f5b50c2fa92c7ecfe55ee828a40b8aa7e1813d","bde5a3d2f40f34d1c65e06031866faa316900665d8ef3584b4b162f0ae16ef65","e86e2618407de82d749c2464d6f912edd294109e058c45afe2fcd01e9e510ea8","0005a70db269659a53ed47a6545088425c45950d2410a09382d4a0fea75f4e79","a2e9b6faa5f72da2b4d7da630f41b60ddd4a936088e6b0c6ec24eb788cd36581","8dbdf722d1eee21282b71cc022e28d878f12c9b7dba4bc7c8e9e62c66bb986b9","dac4785d570436a1301aab1ece1cb37cb40be0dffc38a57e4c52a8ecd6a2e6c2","0e6f1f253598baa6649dc18cdb7ba52b6162906bc12b0f5b2a6671738efce0cf","300af52063a4fb9ef784acbe43f706af0abe5c883277e51e890ab3bf550bef02","7f5103c6727c21e83a00bd0e4a9b8f89ee5c893ac33066ffee9ee1f413faeca7","138b5d9a9940b2db33385617be7defda257ba0b5db5faee07f4cb209ae0fc471","3aa57a29b3e6e028c8df2d1e21491250fc8f13a28c53d27a02c5a1c5066771b1","f45effd310e153e583eb7acf0338dcb701dcd295028452146906677913dae935","2974bd7b4bc22c0eb63120f8d5697b6ada33e15e6ad58459b6ad3d9cacfe3618","cad274da74d07f9bc1d59f7979c3b39fbc8cea194a157db27f10cee5573b8801","996c853d12f565d3487c52ebaef0f7e91083be69ef838f81a2ae0d29e980df33","8cec8ecdd8ff9e3eaacdb028b53f138d410053f0ac300eec482ed5b7607caaec","ffe8e39fef48ebbe9758c36e333ecffffa9b904d18b917aaac8ff92e12628ee9","e9e3212f307326f1d441a700e64888cc07a30a95b82305fd8e287ac0216bcbb3","398bdd92a15a28edb7b5f0492201b360ebf539b0e20668d10990e2c52e978d43","bb10718decbf5af0f88b68bb7db836abff15f339f4d5d2eb340d69894ea1ba75","8045d5ba265e9bd655f5f041bd71f72b1c08cf51cc90765b234b5a71e56270bd","51da6318429b800f8ea7f932bb480ada6a4dcf565368f414b4d8ad65b72bde52","b4e6ce2c69fb887ded9037be96360068836aa5f040f3747f3c76b6960e65adad","4b5c967fded3dea8d67cd52a512032fc9a2c7feb898f309265f841fca1ec4762","f08da4cd6fbf446b5ae2b19d17307bbb31bbba46e6efc87f878d2834efa9b1fa","1242f5819e80eaa0a92910fdd2985943f68f678ddaa4867bd19df2dd48479561","e1fb87fb8865038ad2a728446be4a40b01b41851220ce56c91a7a77567083b66","5b4d3cb81d4693091c9040e455f408bf5ac863ec6d62d91dd15959feec9ae8eb","6195f21a5b7ae86b882f9cf78a316cc4cc5419e94ef0196b3b0646c42a4b0711","243eccd59e9ab1891bd60b80d8a9560b978ea7e052b64db7745c7e33ab9a4b32","bd8f93c76e69d06150e9ae31f8b778386d803a173afe759445ec4d642dbf2df7","f5369490fd4657232ee4e47714910203a4f238e6bbb1067890c9a3605101f73d","64c2db487063c5e85682c59853f60d8f599916348e9982c1c6290c057876b1e2","f9524d1d2324a7579670fb8f457d2f68e1e80a92ec90a7521ff864ff18a7876c","e70e85886b231efa91c41feb93d160a2162aea727268fd85a50db42504bead7c","8653a7809126736e3850156ba6f4444d1961e375d88a3945403da0a24ce03176","6ddfc50353b2d013675c5b05d2f9bac01ffcb1bf5f245a50f796d9fe37513225","78d858aa78fa34523982503ca58ad11f625874fcb2ed470d9ef15f99734fa61f","5f99110b8f3cba92e6071634583fc34fe5caacc49b746ea1d64998102396e106","bd4a68b7d50f02dd3159130bff9ba5756e7ac9d88790331c8623064312636e6d","fcc1404a08af56811291dcf6105b26c0e39587b8814c16deaa0e20027df3a1df","d409f2b4ac0bd8b103255d56bf1dd0bcdeb0d0cfe001f0e85e8bcdc2a02562e9","01d3407d9af088aad85c2bfd02171e5956e05f43d0007f119e047aa452718e35","8ae4cebdbe05164d1e9ae76c21d58f55e64de4db51d2811c849f813308e75ac4","63a3b217124c65f3b088e2de2a29fcf4f17e8ac0104eedee4275b077436bad91","32c7889a413b45b8d5683b9dace4f5184dbe14843a6049b760bdc15672b82f62","c0f0812d23d92787fa903bb3f3055c546e45b49e0a45c44b7a53d6232915cc85","02a3bffb91065bbb281d1f036cdca26329ed4db9a2061c93d8b7416e6f8fb71e","5774da9d3e6e29aee5b77dc6ff9adf43c33676430978f370dddccba9928377da","deb8990e5ddf23f1cdcee8bc99a5157cfa6c3985c9ea10fd6f3dfcf66684fdf9","a474580adf96ed8be4221036cfdff906b692c81075f1aaca64faf688a93b2517","252b0567f719b113d4d1640436c952f728655326787de844cc092365c73c9503","1e9ea265777aca136db6c42bce6b35afe534df56f63943b35fe9a147bc0ff3b2","dc57d102a5e03e30134c377d4cabdd701d609a21d491e72e45ba7720ee9ed4bd","90cb406c4415512efd7d80823e53d17d76a80d3ee1042b1f88167798fcb7a7a9","50d5f657807f868a1191281927aaad7115c53d864a0ed4fa9c7c7a17ed6f97b1","2fd7f0dc7f9eb7d983b5c2b657ed6f8199fe398380ce550348a402d475f7a8dc","d71ae839ab74d280be20729f69b251073585e32d9974e96e0534720254541ab9","9becedcfd497162235699a60e66758eb93903bd36d57f004ad7d64afe66a24cc","2e7b29eeaaea0a9a1f75ab399391d04b7314689589b5c6f964bddef44c0ef99d","50e4a0750cc2e71fe648c3c5ab37569cf907f53e4192234688a27639cad9a45f","3f41f29e2d89c323ee3059a2c93c2bddcb083cf255b7f203382215bd33e75ce7","34813350d7834f5c9a3695b5ada5cbfa0145ff5b8628d293c8c3ffd859f92dcf","2a77af568201387b02b9ec32b9d274e21e5f773607f1e63acf05865b25d1f51d","1673d43e587229fe516a07ad033101f3ca80b09bf95bd38716ee05ee33a1851c","8c17f60c20302a2fea8030702ede66e47d9be87a75eae111142cbc96bdf3434d","50f10f4f47478b23424046fd5f26bbe07070ebb3d7e632d62acd0ca9faae6eaf","ec28986e53f82a573c45f621dc00016bc8da18c3167c4b47012352a8b5a507d1","1d2f5a0d8f20ccd9a16e57eeda9b63701260061b9193823bfcbe16f828aa0602","b6d25224fe0f23250b4ac41eb159a385140163a4aca16a7cf52bb7ddc0b047fa","05cd5e0ca79531e518bd8f30c28808d708b3dfb83a8f3b86286b6d2ffd805986","f3db54330eb9d04afd39fa704903278172d5d22a9fccecd875c25a48f9bfb2da","a3d13450b7f211aaf02eca1acb2dd6b563e5e1f506d913ab5fe37362193142cf","376e4978875322ca023d312129c4eac85dd40a5949c17875a34652442d60faf4","9907acd58231ec43dfbc27cff0ed5a5018bc0be7b98e1149424ca29419d9a55f","980676ecb6851a6de00c89ea9562707876f5884ccf83ffc41a69117c644c8663","fab4b41c9112a72d811c8e7d4bd7f31234d96fb58ea720e1ffeabf36024067a0","186a559fe4d0c0adcba4b7caf2869db35af47bb8759e07585967f8452abe79be","78b663aae6b3a9e935bb467eef41628efad258fd82d2d51d1a07658c823276bd","8136040db8dca72044f3661cbe613dc43c3eaf635a814569e5a727f5101e8261","edfd56e00c88ea408851012390143f4896ccc8ced77cbeddd32d9e0f24e3a418","7198c60296fc65bb3f082f0d5c233721d817e73c635846f7004930a1d8183c15","40753d3499c0aa6334abdf0f99db38151f35f56313074ebffdd580c77ea0fc07","ff1c47c6c1e6f3629c09a471f0b2c548af3ed079f6b65fe90192d2e73c55af96","0fdee06202861dd0449bb160a6391d8bf3b32ef03891775a084330e43d50164b","95a0da91cf0f0a01b719d2d2f5c48f1809d99e480062c8e953b6c706ae448cd6","f6a47e3cc69c2f48b97cd453e0ad623751e5aa049e8a73de5ae6503c9da6e8ca","f9caa6e3e92b79b3cd0396e8ee030d1b128a73b741d070b4c36572c3fe0aa430","d1ab4a5f161c852e0757285b6def92c1d5155d71bb5a21073b4a6454d88a6fa5","35f269b460c45214e4fb7412afe334c2594631992bc4cd3232810271f964febb","961476c13adc969c85226918b678d62d3a5322dc7fd7c95f3256ab2006191fd2","633bd8afc6d2384d286a29ae372c6c98bd466171b16444432bc6ca756ff85165","48ef96606b4fa9c51a443c197d6de60571c80e1deed08c546c0f83c7f91c4e7b","cd1e925230c2957f3953e5b546016f0c006f6eb869299016569f12c88724fed7","9185ef0d2c9298325ff43d7fba4376a7f4f63cbbeff2cd6de58d6e0302e488ef","42c55276ef95724d893d9aacb9e55545259751bf460247cc800e79203e44844f","4f1d0f8126f2651161007a70a1e765013397e19a25a69fb22070c1cdf35a2eb6","2a91efc64428ac9a7fdb313efc4ffbf7e3154649ef0c7f714bf972ff14367a24","bad43263afb8c55abeb6aaa3e2e0fded47f04c5d6f6ddac261e81269f72d4567","4b62ffdd5e7ae39caa0e5196ff2736ded384c6a49b57fb6c0edfbfb1abe9885f","d14eef072c56ab4e98961e67b45ec5a5f8aa84708f703d65ed9850b1d1856939","96828db794d4886dc5138f8d2312d6bac583a617455d02785a6e95947e442a9f","1799148c18784803ae0ad156ee32e2eb2288396e519aca97f51517b6339e3937","a9bbb291c241313b548b12cec9736ace59b23193e18eea938fa8991109f3aa7d","d37a7077ef913a3402aa51a445fe052608db50530f6fd50450fe3523f1ac5910","c44dc3134ba82a17e6959119777e9da3de6b3513a5e9b32cc814f066741410a6","21dab28b88030774adf1108f3953170f9c0cc1059025a557dff18d1091257d25","27db4f565f974f1d299be4fd2435189ae207b42bccf39bea2e58911cc89297ec","ca33a8dd3b61ef200b947cf33da0fb3dff1e7416d086f637058d0f7dd1b9e67e","c13391437e20d60e52f7b891cbe8ec7ad6857fa89e58514d41b5ef09c40e7b2d","ea8282bd6ec2bc85ecc4913905507b3b36c4d42d21a2ff25e50ed96af476a865","fc2b43fc81ebec9aca80d833a56d2850307c39f05a3c12478af8bee0ab9a0a61","e798b23d14839f231fb15514abbf9cebfdbab490478113b4f9bd1e1967b0ff4e","783d99a4a0d83acc488992025afa42a8874c4021c1ab10c036e16eefda5a2110",{"version":"1d29b60f80d16f33bfe41657c25c65c419ef08cd9f688b4294f785cb4258653e","signature":"84398c0a7d6c2309ca7af972407fe924a6bd3f33f18a04c20398cd8ace3b889b"},"0fe8576818d9c3047025b6abeaf31c75c141d6dcb835ca577f21bb8a03b3d536",{"version":"30bad6adff038bdd2e0eaeec612b775a77e8b2a7a400b27712d19f09529e8060","signature":"75961aaa89dc62f10b2c30a12f32d5996e6c78f338ab7afd97eec5af86bc81b4"},"89121c1bf2990f5219bfd802a3e7fc557de447c62058d6af68d6b6348d64499a","79b4369233a12c6fa4a07301ecb7085802c98f3a77cf9ab97eee27e1656f82e6","ee7d8894904b465b072be0d2e4b45cf6b887cdba16a467645c4e200982ece7ea","5d08a179b846f5ee674624b349ebebe2121c455e3a265dc93da4e8d9e89722b4","1af1f2c02132bafa25c4c4b7c415e0a59ba959d6db6bd1800a43fb5d943e3f77","6ed78c0dd85bba4f0f286f8dea1bf8a65632cf671133f621125e34f5d63c57b5","8c50d5e8aaae8af1362963b1bdebdab08e4749bfb833c02e0ae9c20dd8419411","8840ac63b448062ed3c171c343493b988cbba758d3a4625f99052eb3a22a7fb9","d1fa26fa13ee8d9fffffce8e839feddc77d863597f2ac18d208c6966b3314f57","01e12c80ec3b6e60769389683fb87c47535a34a038977cd4ff9486c061a3a53d","a1b8d849266b3da0edb3705570fc7b34bd53c788afbd9d981fdcc44e73e89757","32b41b7a40546ed6eb38c7e51c721d006129cdf3bd9433149e4f9c5a0239638a","5143ac65b70252c4dce46785efdd41edf551abac29552bff7d2e3c559bd44c8b","c4115f1e5c67644a394ae1aa1439d6dc8fb08e9bb6a58cfd42d64b467f418f05","614eebb8e3a89f0b7445e23327bdc37dc426fd870a3b6b96e0de774869f19395","ab4267d371387f8be164f1743a5d2c844b8ec5b5fbefa1d9674eee34904eb221","e2dbbc9fac1688b3ca7a7a2fb98649b58ecc017576c7d745e10b27d7fbdb1fc3","69b96da62577eab48668dd4cbe9567f6f94f157c05507c6da7a8ea0bd9da63a2","3692f683fb4f3ec5b0eba15431cd90e37e891702e21ab1387461dbe89252c07c","bae0af9b71bebd58beeb607e048fa06ff5a976e0dd757f346f242cb50b5f4f13","e8951674626aedee6be73ff6bd659945032655453e8877fb484931f2254007cc","6b1a03729280176509798e8b295ae9abcf4fa71a58e7187ed9f10379d405840e","830e13e8e62f8bfcb291edaecb85641fe4dfe9608b3a0c0f8759c3ac966e95f4","53d7651005902b904b28ff9d97dac4061d5a6eadce2a2b96731e64168e9313be","f89599bbfa52914cc6ea40b837871a3cea4b86fb841fa05df1ea8aba868dc074","9533ab81da567cbf24762de21a1d41ce9fa41eb1f3cf5b906967c907974f0ee9","84fe919f192f518f05f0ddcc91b1b93b01eca8b9a9c791f502c93a82a2bcfce0","edb778e757329c6966494edab61f8ecfd2b747ef143da47bf23af148a465aeff","dd896a01076bff523df123124d67f4e6bfb29da9cb87c17ed2fddaed547bd888","e41be8943835ad083a4f8a558bd2a89b7fe39619ed99f1880187c75e231d033e","a598dc895431672aa781c14e7a2f898e26730ce06e9cc5009d39fe103b950061","13d6ded2bd2b0910e09aca1f2378fcf8b6861eb672c559655368a98ab81dc860","985d310b29f50ce5d4b4666cf2e5a06e841f3e37d1d507bd14186c78649aa3dd","94ccc6a0d45b112387e38bd01ef5851cd561575fa2164cc708a1714b7fb5d71f","61937e4027635e7f12746b58d1e3bb7145114697a555bfe912aca9bc34415367","1ab840e4672a64e3c705a9163142e2b79b898db88b3c18400e37dbe88a58fa60","48516730c1cf1b72cac2da04481983cfe61359101d8563314457ecb059b102a9","f1226c85c75dba57bf83b0df3fcf20af9c8d8a6f1043f33a637425bc41abda85","f2d80ce361931836b85db164e993b2770538c0ca2c13119dcbcdbc8962e2fdaf","a38fbe9176d15bbdfc75bec1e64c8adee2fdc1a3c9c65c1fb15d66ce764cc881","7a819c7133551418f5dcdbf7038879edcf2392baefde8296389f5c3c20cec2e7","a458446a6e4ef3db8be5f214f42490acd6d2bebc9c15c397077b0aae75da6a74","0413281c480cbe10fc6de715e912bf05688c53024884c57d0433981c06e5eb7d","6f27bc22042d5504aa2bf1ca4a0e4d415c96e69df45cf8f3e34d6794d8bd4618","0220ba3013de8eb3022af6c8881e48e5b9ea57fa5f045d4d40caa81cbab5c8b1","36c0840683680e9f4c2fc4157bbc8ff283cd147d729a27043a35238c39182530","5c5d901a999dfe64746ef4244618ae0628ac8afdb07975e3d5ed66e33c767ed0","85d08536e6cd9787f82261674e7d566421a84d286679db1503432a6ccf9e9625","113976386a1fd6065bb91eb0ec5958245c42548019f6da49f85bcbd50324cb8a","a1e9b1740facf44f7331b0f80223320656fce7a0781fee36fbd82e8fe73dcfec","1a46cc5a0c51fa06ed1acc1f9ee45e2ce889d4b3db45fae9068973461d3cf99c","33b8dcfdbd807bec327291afc1ef01ba79fa8d9ed1d9196701b549b257102c5b","447d006ae3eb00f96af15c77999273d2521d1b5b8744df62cd7c5e5e03973049","4c859bc41e4be5d0a51714c06a7f59cc9e4115c628d383aed57a592089d3fc54","c6658e3d10486947e1678aab34dab37183fd950bd17e1d0390dbc07faa5630c0","2261d69ccc41c056cbf5cc5674f1f931b6dfc57bae6eab762037b1821b7f92a3","46efaa5e9c4b1da7ce2f586b913db6144595cf927ffc6c8288ad1c76c6dec5ce","e05e23ad9282ace300cc99478ac578fb19f8b0d38f094378ef9208dc8ab66d28","573a3eda38e40e776cdae17c671cea3b58dfb19a1094831369cdf3feed84e746","9bbabb3c3efcb1e9ddf68fe90f695063ea43d0f0bc5baf28f9baca3633eeeb7a","eab4499baf0ff71ba110254dd694308e078544222dbf6ff60b9a68bac0592027","1d15d2f8888f3c02798ae4fe2fb8ad395bf4c5a4b84a16095c4c432cc78bc407","e54520d1663e6ac2fb38e157e23aa9b9616bd6a1ceb54a6b7a69f8ca892ac2e4","a7b1b8bb7b2b5a98057433bd52cb19ebbc411d7df10e8736946da5dad2d9600e","de9b48332e7d27cd5b2e39d0b6d52856da89923b3f8f3999d5bc72b2ec41c931","bbb4d08cd8441d17d28dbaa02fa9b15071ebb92649f7e7db196d1044cb1903e3","9ed08d9ed11d4f0cea817d3e6bd3065028e64e5be7e1974ffba0c87008f7d5ac","21fed563e62d6aab7c461407dbcee685b9e1b976c2aa41bd4dbebc0a1aab90a0","5d64102c5282174a0c61746fd6e593edaf45ca6f09cfc6908e4e96ed1a28772d","50939a03a6cb09ee9d3803053c034a564f15a2aa97f0210cdf34fd93fbab6efa","626c63121530f17f3c7d10e608e034a1f12c91012d8e6a4e0bdfa334c6efee13","0b38217d5c3a30483640ada208f6b5e469d6d66ac8380e80517e870ebbc7f8dc","8f016fe26950ee2d9f7167d35eb3bf882eaf94df817239b0c7e004fa1e63dd4b","7a00ad6a0f72353e2c94bef6e6b94345450980f44ef66893bfed6a84e43e00b4","bbad2d7fd3649826108302c952065b1914a886bedb94469e66d945f07b06ada5","f5622423ee5642dcf2b92d71b37967b458e8df3cf90b468675ff9fddaa532a0f","b7e708f140db732cc3fb369905dd2f472f8952635a3711a04a792d885d19c6a5","8b059dcecc0229f1390bbe27e321b843f02927538b1e0fb09ec149902fa53ce5","17d3f26684a88e7651e52ecce18b292bab01a9241670fadd6bb76910022fb492","dc4aae103a0c812121d9db1f7a5ea98231801ed405bf577d1c9c46a893177e36","106d3f40907ba68d2ad8ce143a68358bad476e1cc4a5c710c11c7dbaac878308","46e8d2193f476a7a7de3cdd24743a2eafd009175159fe8494f0e3001a0e681be","e924774b42ff4558194d6531a3c368aef7b257e52cf001f01f7eda4655d1a125","c93dceadb06e3cb565421474fa7feb4ce94592637df7c9d7034cb27644b2ca59","10f97da752d7aea1734a2098f7537fca63165dd48882ce3d08ef2aed4ac47667","60b93ce0381b11434394616a5db9762950a0501d748998c6932150bb249e0394","a4ead38d64e1720c52f26457738484a61cd50be51abfd2bfc234c951fb79d20c","1a82e5569808c2987a9d6882e5b910beacb0165b6d18656540170038d6b8661e","6b243d0f6cf1786f6e3b10a99db080a977cc27e6f49bcff2b6264cf0339063d5","ef12df927e5deeaa09efeaf9f79336fa33745a4b3d745a8a35f43ea587bbcf40","083609ca47c047c6802bd40e974346a9509ef28367bb07769dbcead77cc7359f","364918fa15f9021675fe091510ed8f1ef91d63be82ca07712c9f93b45c3e4a1f","3a2d62eeb42c8163cb300e447b124824ed0aaf1a504ae23ded431b7adb4a7fd8","c149ee8abaf2e327ae1b1b13859d259737cd35fee5bbb121aab6f9cadc827ee7","bf410b9cc911130a2f21e248afa1842a0cc2a6cb050520fb10e506c15c057de9","8da4afb6ca42ff0156e197a891aca4e8a6543ea93a90f3f7e4b952754bd1c63b","2e5238237af8045f44b9fa37cd47d426ab4390e617d01903621edc027c063210","cbd4075ce6fcd6e0244bc7cc7360420587d2c0d8372a2ab575282f12bb7a46b0","ac16fdbf246bf367fc231c19fb94101e3efd9c74817b70f7ba4593cab32bd9c2","bb6a9d75841861a379f09b6fc93e91169150334c94b04685957f231fb15d66e0","9cabeef76be51ac88d39b3fcec019a387435ac858488fa85f2319d0382bf25d7","343290f60021964a328b67924aa5b7bbee23b36468db3942d28da0a98bc8e86e","a927ce038209a0c252e6691b753edcd56652eec82c26e297cef7a7284817ebc8","a4b8805d87725578e689817c9aa1d4228d6d8abe7bbb5c92177c58b418e558f5","ef7e56454801054b97199fbb7e864df8750e7f47550050515d245d326f6492ee","b5240871f20ae98dcf86fae457a65d00e01075cdc4bf88fde71a8f56d5de0be5","c2b10ae77b33d72f60f9dbe35a11fb192995e0eeb34257ec7b790bbfbf8696a8","3acc2fc6a6f5219ba426a0f64300e01bdb69b990be43b88dead3743d8cb09cce","d894562d706ad1f3e3452f1812727f44d29d747227758e0a8dd7ff8f49e84604","0741de99de521f8fad680ca890986ba4e3de433da520e2b3bac6c05f5796d7c9","a8d187f851914bdec74d5050886b87614ffd818f2e192f20f7ea8c3bc49a017d","a19a8afbeaddb7908d0fabcde122cd6a4fb5555977bb73a05b66c787d13646dc","60256034815ad6b2894c01a60c2116e1209736cf5e7809f6dadd6647bf28b401","bd27bff2c0db599571e93e5446a5ddddf417a208ae49b532bae1399042f9733d","eead54a97c73988c813f277a86f141a8c54e81c5d8d5212af15803cc6c3dcaae","e5c5b2eb8ba2453b1a922bbef66b48ae540dcc98ce6d88a1a4d963a841bfd635","58027d81d586f19b27a5cf1345262a7558488404cba8098580188cbe04b48ee8","3b3f15d622a1f0bff3ae232606fdae05207fd8becb71d08ccc94fe2edb859d8c","bfcd3a12b870e8ded92e27270b1d70e7c490eab817fd52adecc9adbc74eae5fb","7f207637a308bce68816dc692e8580ae0f397aa713a4824a961e829c0af2a591","d96d0e8529f8dabdeb311338eac0728f1ba3a024b5198ccbf3a158db50aae1df","e37bf5783f448bcd2c329c87eea7f96d361e60d87521500cc13ecdaec8fc6f86","42b4e4c35a493f5f9f0d47b99391d71308ba4acbe49a2ccc841ddaeb2d946e01","2879a055439b6c0c0132a1467120a0f85b56b5d735c973ad235acd958b1b5345","d731bd44a07da38eba12567491596b35a0243b720c37b39ad559086327c8e41c","f426a41b0afa8ff53b18dc5c00fc2ddffee16fa0c8fe8e541e4c8002f18fd932","88563e190ee37b0067a61513a8fd9f210436b4917c40a95d8819ed5100f78a93","041749570f5dbdf9aad27ad5411021631a5db10d84530a2d9b91133b0431a439","8c652706fec90b666ec7de314a29db2da7824ebb196a7fb484bdd270ce8fc1a1","96e64288af3b3d8350baf8b1af14b47ca112d541b4a06a1aa197b613c34a8f25","035dcf078dd5b3bdbabb07d0fdb93df90b9a19760c8f7ec035bcf00389e3a2c7",{"version":"6d73ea016e0ab70ed8e014cfd7bf721c19ceea8b06b4ba81fd5ba91b1fa0afea","signature":"a77c81d81edf694804d3f5c5ff2aaad6724642697609f2a2fc8aedc9433cf632"},"6fa646ec60ebc09a72a0685cf404f398aa507d645ee60f7eba28dad360a627b7","1cca0673d11fb2a7fbb2b674db6f2f500e75d103bd2ee393a79c0f68199fe9a8","5ca90fe5d6d32c23cb5534520e55d77f202f863a790a0a55652d6a3334dc958b","c868f50837eedd81fa9f61bd42de6665f74e7eb7a459135c6a14ac33ddc86798","da1de218850a5710c84587f9ceecac7106c62f92a75a121cb1106fca10aed46b","9ff194a196707954313c197ff74831edf396ee89f6b6e50cd5fe9e07b8d7d46b","2081363e701e5aa935f0a0531644845225eeaf90b2b97984b65f07cd1860083a",{"version":"1bb3048a850989555dcefce1c92320131f26ca9c9299910d1d1e412a695d60c0","signature":"e8d81fdb6b619356ad8f8e40dd42905bdaf6923ac1c9bb274de23c5338734667"},"158867501bd563c0066c7837022156e514a2ec88437c47335605644dcd764160","61f974ca753e29a0f5328038d0cdc4a02823e192a6462b5193d3621e556c71dc","00bfabe714e576be5f011217c515f730563c64da019956e4cd866e2df427425b","f21718759f3eb4cf082d32086dd3946005ceb77e7d832a867c229fcdf0d3e6ca","b8442e9db28157344d1bc5d8a5a256f1692de213f0c0ddeb84359834015a008c","458111fc89d11d2151277c822dfdc1a28fa5b6b2493cf942e37d4cd0a6ee5f22","da2b6356b84a40111aaecb18304ea4e4fcb43d70efb1c13ca7d7a906445ee0d3","187119ff4f9553676a884e296089e131e8cc01691c546273b1d0089c3533ce42","febf0b2de54781102b00f61653b21377390a048fbf5262718c91860d11ff34a6","6f294731b495c65ecf46a5694f0082954b961cf05463bea823f8014098eaffa0","0aaef8cded245bf5036a7a40b65622dd6c4da71f7a35343112edbe112b348a1e","00baffbe8a2f2e4875367479489b5d43b5fc1429ecb4a4cc98cfc3009095f52a","68a0d0c508e1b6d8d23a519a8a0a3303dc5baa4849ca049f21e5bad41945e3fc","3c92b6dfd43cc1c2485d9eba5ff0b74a19bb8725b692773ef1d66dac48cda4bd","b03afe4bec768ae333582915146f48b161e567a81b5ebc31c4d78af089770ac9","df996e25faa505f85aeb294d15ebe61b399cf1d1e49959cdfaf2cc0815c203f9","4f6a12044ee6f458db11964153830abbc499e73d065c51c329ec97407f4b13dd",{"version":"cf70401efd3a3724f5dab9ee65d410adf834848ff6a6a9adf4233682c660ba90","signature":"97c5163dcaf908f176463e320a3a8b0c18c633f038fab64f3defb34e02558d77"},"63d722f645a149d7075289268eaf8072bd235861a933295d199d13f4a8bf7b85","c14eb044a35776d1f435adb967d731092e8ef35cdc00808f831a3e7d2e0fe8e7","2c8381a3a5a1663aa1723b31f3718dda9a359ad8eef9342b79f553de106b7ead","d8cd4bdfded991fdd7b9c6ee37a5766e1f6968d34ddc4e2a7014915da9adbc59",{"version":"87ce68e4a7dda7a4599d204d4ae3155f70763ea6af3ed5eaf311be08f86f919b","signature":"27ef11f8db612722f204e66502da6ceb60a6103afb6a0ed2c7d84aced38e91a4"},"24d091d213f05d0bac75034eebf8f2746c5ce471ba471de3a242688d8fe4972b","bc3ec7280efedb98099a25f27ec99fe7f55792d558e00d763e219a0b9b0a3676","036197218b934e2fc0f7a9a305189db3b77fe23f85b59b7a20d8121659048a8c","713faafa5f0c9bad3df980a8276fd639f88d8984f78f7064414a544bdc899c89","f4a45a1dc15b23057a8e6d8332735b22e218fa8651a052505a48123e912c919e","74240832859d68a0211296b55c8c47b18e37e36872142157fccd0a12b6df4228","487a95422c87284c5f27e07917e2cb8cd3ecac8f73c171ebf9e5388930d4074b","dcb180cd664f848da2c40f98ee75e84989e9d9f46b513fd331fa4999971c182b","83d83ce5d0a00b88ede49cdce3743654a4ed831d4b87e7511a0b4844cd9252f9","d93846e922ddd54f9dcef91e0d742007aaf3c01bd511e5aaa019ac2c02c4cea9","b13790bdee7d658643d9c3760bb29b1ac4476f0e02e9a4dbf568eab4af4d45c6","8edd6813078607889eb0255789e86d0c78015e7e07047a5c7e4640b60e5d1698","ad5e6aa2c0f4a105f9582458ecf597550bbca3115f08a291b19272ba38ed1fa1","962b4d565f8bc76fb0005ee3475bc41cfd3164e12d85ccab683f5d087c40edae","69dd472a6f506ab72b0b8f7107288b349dcaf76f30b829639c74f70cbc71011f","d64a3f0853a570b529d33949dccd64dd6a6f8e9a6869c39aa8cddef77ad0259d","9d8db6c5bcc844074d04b47d99039824237d90458124aef5390ec2e50ef95be5","e95cedc21ce1e44567ca69520c3fa03e45be7b4179e9c8d2e074232b8fb0b35d","399777df73e6232a296fc530b8c818323ade7259b03bec7ea51375b281f7294e","cfe0fca98caccf52574306b086998c8a2f4d0421ee5c846a0e6ea7b62c45641a","3dc41e9e459a6f6753d69aedf535a5b8d0fa389f25eb0e581727ff64560d8bd9","6d9a5833ec3d30bd5e1ff9cddf367f2d2fdc8ee9c33c1e3c7e6f83698286b0cb","ca9a6449ffb4ad480984c051c2fbb26087f40a2fb93fbe03052fb3d81c44876b","276ef457a9533ca700bdd152c88cfd1ebf2b468da7c535d9b4fcde96d9869f19","6ed7cc71d4668957e00e622ec36718d7de93f8b2bdb764bdeb97d23dc463ef06","354cc5f6ed65fe2ff6fb8b117716eff61275ecb04e637e8e9798dc3222154f14","eaa8c81f283dc48bb0b8b92153ee6dbf174876c1bba8efc4b7290d55bcacac22","263134d9d5993987860b8bd7af82ded88d0330f50426600de4500d734a6beaa8","91995cdf6c87cec05800fe23c9f5c64813d9da6f2354c937846b7a0fd108f3ff","74ca3a03364fb54682fb819dfcd4a63e670568ec9b4df5d09769db45c1680e18","d933cad0f39747f0fed38aadcfd4ca802f0eef4b527df83cc9cff5189112b781","731c01a62efb53a0c035c6a6ed2560ce38fb1ca5f0119dcdb0478a3a9ebc383f","8fa23010dd0eb237cfc5fe5ed2e563b2ed43489d86f47040b1f5a9768e32a46f","0ef2100bc184930946445c56b81e236abb8077b45f11c2c92a47364ead71b180","15393b714f4382482d53a01b520315bf707f17e7f681a6ca02c33cdd45971707","ad2ed280e2a994ccdb9f5e1021c7cc27fbb4344bcea7dff819c7e3486b48f149","fd2caaf40cb9b030fe1c79f6fb1190341c1228d1ed15bd30fc32accc5319c0fa","08ab867725d9790c6e9fb013d090966def2173af60a5d30a76c38b0aa9b18d3c","a8130959b07c47acc95267ef0a210c1ab3a695ea6a08dcc3325b19d51feb784d","cbc5b438e0924aad73db3ec355f6ae45bf4d9cea16dc55d14224b6691eb9a087","fa444bae13b23585468e8667cfc5524c6b33795692b8e7ab44043b898edbcdf0","64b265dd0389ed54f025e9f961e3a2876215fabf5f18692d78c57680fd654766","bc5f1bf18a897551a1534f22b2d78c5dc0351ba327cb84c212b94e772fd0dcb0","0601b30571203b3b772322fcda631ab43d17fb291d93b33ed32bb303f0cc8629","d6aaaa2d95f5d1f8329890aa7651c7faeede0944f8bf631b748617af508e7322","9821b950ecfaa879470f8777fb5d6477c4cbf51535e75a5481f580984bdf1b00","b0b4b43979a1ee3fcdc7a171f4458c9829e44e0dc34825ab0b8ad17678108a9c","4cf4a3d33ef2ab41bba5ba8353320534225bcc41298e352195b48f3b1dd590bb","ffa855a79e5b306c7fc0a414254c4308d4ae57f4aabccadcaa0bd82f7303a531","384f891f87bc77e37de7db9da407ee6f1aac6f3545e6ab7232fc8c959ef7c277","bb1ce1a985572c648669df6786f442e78a1486d9f9d068c7f31c13a03295e9a2","39e52f6556dfd29ebe4c27cc80dff0e1f39bc4aee15e9f2d7e2566d6305ae489","6dc3b7c621df1de66372c10590c577cc78b2b8f400d6b73760deab45e900f37d","7e55401a9cdeb3430f7d39930197bcb4f5a26a778925794e16cd19fe0901d587","885903bddb50b3d8f51b74f7088ad1c84e6ea683ae02f3f028cba1af8fa2eeeb","0c34144b009aeaa19ac1fde4e284c2bc5ca1dae79c8115d76143c98f194e346f","0abd847eeba0f4a32c3a14ce064ed9f97d8b6e82be0b1d87ee1df579a888a1db","bc27229d3ead574431746469ac795fe2d26f92d8c17bfd32c6b7d5a87ac21d40","f8925927267624cfd3003adb6535eab4000cec22aa6378b0b50b83c2c29635a8","390b4860dfe218d4159bf8334e36e2bb902402dc92b1ab6908a53c629baf8282","517e3aabfb7fc44c564cbd78a3cc8b009e7908059b38d96191ce12906a7938c6","018e52c3085d5195498e639d0c604eb5a52a5ff4eeba1381f6fb8ecae14d2c0f","79e2b7c326f5597657beec5b7fde02230212c4e90387fa2ee786c2706c98381b","2344010e666a4f71021b4daeddb495a7006cc37193052f37ac3ffd4057347f1a","9883753dbf22048978896802ffa68c45979fcf1a733c2d2c8d5b0af20fafefbd","140f114921466842827a6e6b9bb2e685660265f32704824842e781cc6db89d6a","5ac147fb256db95d00eed0057967e11ce2b7760e46ef1cf465688ea24b6e336b","67387497dc8e8acbbac133f3103df013b78df3382f0d85cb9b167bce6a26568f","bdf63cc7d7c3224a7f977dbf8346a25f1a86427daa299d6ea1a99f6bec5f0bc9","98f3725dbf74d12fb1c50978818b432e968d49ba2f91112dabfab75c469acce6","80431fb9470a6b829e9e996f0014eee28a7e70c94e75316a0706e1805a4f4381","bd1751ab16522a2b1d1ddbd7cb3fca5ae63e94a2c435cb8ddb81d18c89761113",{"version":"87e8d06aa9588cadb22b00f352f6675c4ae08c5ee771d5b2b227a192e6e5b8b6","signature":"b0e30141b596bcd107923d29bd018915bc36e303bb1e5b52a48d1d92abca93bd"},"9e4a1e7678c287702463f92e489f3145b7d3765630b1a13c051dcf1e88446576",{"version":"3132653d267c9716ef6e1e27b486f5591e2e052d49d957ceda8acf6136b379dd","signature":"8e73f9ee77af4a107c9d9e616f8f97e3f3c26494e3c42a95c40a136b20f85a48"},"765340988b7755af980438b2a5b5bb51c58371a5b08a03946bc6cf39e210821e","133b27cb2dc74b8f61f2162bf474f5c0cd61f9d4ce78a372badc219afca1a16b","da78357f8267dd27eaaf2b6d946152c00b166521d222376b685d0bbab9ae2d0e","18f89b5aea0838b270633ab90fc93770d17e7029547d39d9abd7385d8b2cbf69","16f10dc2ee120d2d66fd55b11bcefc6f4e71467e038201ff14136dfaabcfbc2d","f2dcdf4b4bae8b355171c53b9e73a85d8e13509a44da69e3c3740826d395be69","7bbffc57d4a9d4a90db9ac537fde4b84afa05fdfe409f01d8013d38e727ecfc6",{"version":"ad28ea67bbe63fcf2c94768ae1dfa7966e786ed411f58b4915225ed8d7c65d9c","signature":"5bb558ca5ce5513a05505471cc27b9f4337a52b3f4c33ef94b1de788f8396fb4"},"173b6ba8119feb33e6ad75426e8753b99c5aa07505bebffc570a312b0f2f9d90","3039c3eec3c8e6a0939fb978903c4db403364d5c1ee51695278477573c2df28c",{"version":"f675b6920aef1504ef6e096f3a7fb44dae719a86a6e6f38fc3d29b4762532c02","signature":"d355108dc111a4f3388cf05211dbd26e82162d2c5c14e169a908782f7d055c21"},{"version":"fd4d4f1521017562c5d94127951aded630acfabced8ad49f16711bc50bffec9d","signature":"86744705c456eb731b6a4265f9861f154b63de5731ab54e7d08f6e17e668d39b"},{"version":"6ba6347857f63355b40025fd092dcbc14e9b8eef12c11e7c760cfae22fc4d43b","signature":"bc3a56ef0e660b10caaa2299b473c38be2db58e45505a4ceaecddf71f14f3897"},{"version":"5795e4fce3d5f5876183333104a211d9da9ac2e4685a78cfe3396754b07538e9","signature":"3824f18787a78eb02ae92f45f3c88e9997bfc4eff31f62bfedec9e5cb2347caa"},{"version":"b2def6664a8b7fa5b805e48be8943fcd28fa5cad81d086e0008530feecb331fb","signature":"538f1805ece9ea11bece9f3519d51f67a90fb1aac4c11015ff945eeb6b6e60e0"},{"version":"fac3afc1cca535fc780cb84642ac722d2bc7aedadcbb1f93ea22b5549e8af166","signature":"e4fadb13ec2f11d4ab68a111788b6dfd4a9bb9c30f91fdce40ca8346a2a31fd4"},"d4dbab393760d425eb86b450fcf6f0c7d8a698d97c8f77ec21eac3674f49149b","091b3a857e84b218279c14b678c25ec67b6fc99b8e974c1d6fcb65b7943a820d","63f6312a4be1ec344baa7c5cdb831587ed5f737f35df2baa2d3db1d180b983ec","74c3a57d874889e2f042b89b9688716af704cb2366d757ead586988f6cc9a625","5ebf4476be92f000f00cb9fb79d69babe6f6ac2a39efdb04a8f370e110003e19","1ca88c3785d49effd915f565f3297e32a33ea969d3407e1fbb333b84562c7595","1a4cfb737223d523387f7afee7219fd2016f1d73ef885e9cb42183c911d07b4d","392b17a6ba3f687f19ba207f17841c99306701cc2882f3615a3b426686d854e6","2a9f82af6c7cf1e002d17153e10d758f685d085864f6c5f7d2b775ebcd6b2fc9","f65b6f12e264b6e22dcf888bc0c239aab27c1d1fa6560af64bcd450f864abab7","ecbac26c0c765e1da3e748a35ededfa4c7ed87f48399919cd952ae8bc32a1339","9c88eebb75b82b4ccb9412c7e3035e40e188ea3d7dcb010ff87986b7ff629555","154f87edab104ff00f36e95b36d01e014a4d74ac4fc219e124e2bf2627099267","30844ce073bb46b6908f55273063915629cd795bf7d83638bcb71e1507a494bb","4bf7c467d3655157dd0959deafeeaa9167f90382cec1845b8557dd34a9e5b0ed","baf557e659cefe8b9ce949735e8cf813f2daee3044324ed740cab7e143559f7a","b02604b3eb025af58b4c07c7ffce6d28a03948286cb5c4d5cdc46ffe21549524","ebd09f4071c53a42a09a20feb0b144b1f485f10a7d6190aba91c1714977d689f","345bf134b7c00954c1db3e011f029c066877a32256569c9d91b6ceb5bcca054c","2a1f7be668e3a95cdb683c6f755631bf19de9705c6d6c1c9e4ebc67e9db916d7","357acfb6822f15161214eb9e1848c767182750b67f9c2c6ac0fab52ce300ddbb","55ffe6de790f0199135425d8565d29e7719bf0e24582ec96765880b9e9b022d7","646d66c423da6f036ecfda81da6f7d60a4748ddb0c58c85d261bb5c8e541cef2","9c1435b5d22bb56aa077d9bd74729cd748eca5e245dac9d1d98a98248a53bbd9","24bf4c3ab312b32e6f114adc2f4ce858a8a28af76abcbdc46a4a40655933f152","3b355d5bc20b716079980a0ed2d400180a15368db05888b3b858f90ae3ceac14","ff2c4a40bbde08390837443555b9ae201af54b527baf151555310782bd7bb8ef","0e9998684ca02c028170441f4c006e1caf425f9a9c3814cf8765a0002773fe30","1e647f80259d61974c8d0a89d9e3fd22416975c257d76f4f32d6ff38b9157f21","31e9f9b81179cdce4ee1cd1d6a427dc0c5fd15064307df8cad58237b0d96385b","7ba73e6476144ac4587b18bcc70349d2a8e7cede4e780815b53a057ca71f764d","fba690fc44b5c1db29fb472830df4cea1374642935a02c6302730bff37752498","2515daf0e2b05ec5a90349ea839cc1fad8e67135665747cd5f72b7b3d2ad49c3","7b4a756bb59248aeb831709239014a9850837727c2d6ec053f54eeaee95dda39","cde91ca23d14021aca53adba5977bebf7f72e4f18bbdcd2c6a689482c77dba07","191878041be6dae0b75974d1d28d55ae82a2896d5eb5004eb039e964e8140c00","7f4272fd567d065c1f5614ae3bed61b3dee47845267be0e41dd24f901985bf0f","0fe6cb0ec82fea8bb694d8335f8d470c8843600a277cf02d7dbfb84002666e8a","e43159089587768cc9e4b325488c546cec950602173b04a4f6cb9a615c4fc3b9","f3ebf0a71fb9e0d708c607d6448edae7a7893162532b560b3f361f48bacdbfca","053ed027d6ab656c53ee8dfc3fe842beff2a831831591f7f446c0ea1632f606e","79c5c3441a6786ce4804528aa560836e45cf855af4f25d6ca40f598cd6f1979a","bf235a40a595fe4c1c72ff72b50a9881a7279c4063029fc88e49237542797935","25627620692594a49b01a7192416e59a0fd94717c4f5c2800a3cdde58e28b39f","00f9b95c0741094ef69f8befa268077fb5dae5192149d99af5c7abf4cd20d5e5","89536ffee2ff5d49cd4c898a854a92a3d0812394f4ab6e1d48f9fb658f4abe48","0085bc39713819715d49b27bb64767dff1829179b0914ef0d4e1a852770f0136","9c6c451215eae6ae4ee0ebf8433f9d90494df7dba87718478c050bf5551da18f","a12d1a8f1b6e34597b9aef2757fdf4505362189c75b7f15266604a80bcffb42e","193f77fd99a5798127915516363958d227df9cb82e23f5890aa668409c1e6360","d8dc0c576c79c5069f4e87b0a15088e952043cb3df0ec487f81e6b98b174e503","84b69e8d4be7b1736536d1ab8c72c48318bbe6c677dab53a2d51058f9e68df71","97d3c4bd2a49a56f2cb63bb76c5880afe5c76098dcbb5598cd14e96bf572cb86","a493cd942f29c45c9befb1cf2f3e9a757300e1fa6b5a20cf939bf563c31f46a1","5300527e32de6eab286e5b70c3cca475380320a142ad54f234a34daadfc7bb1c","7476dbc814b46489fff760fd1f3d64248aedbf17e86fda8883c9bd0482d8bf73","8520b3f4c2c698bcef9c71d418a11c7cbe90d7b6d7deaed251a97ee5ef6b2068","8afc3d51f8ace0b6b9e89a2f7d8a6dffaca41d91733d235dea7c28364a3081a1","01cd58f2842ffec94a7cd86881fb5595df4b08399b99e817d2c25c2fb973fe09","d49f5458be59a10cc60ad003bebafa22eb37e15492020b2be9ca07055b6c8b10","0aa491d56a8011fcf95247f81cc4e09b40cfd5a96e80221038347da3931e8ba6","814971944c21b19105949c552a7dd5b35235a17a2eb8092b809e2fcaa54ea4e4","70f1528dd7d2131386fdcf6223ac1c56f2d7726c7977bd5eddcdfd22cd24f7f6","87f41340a0cac5b54e499b3ea6e6d0cb2e7abb9abf5feaedc6c4cc608cdfdc54","d0a8b3701edaddb7db2935bb134439272b46201384579eb0b53d66e4ac83bbfc","7849c2e4caee1cb71890ceab95b767c68f7110eae9e3e976dac8248702276218","48ab9dbacb1cdaccc607f645fdc23b9e6e877f7dcf62135bacb2cf21f36a0bd1","15f9fd84c200e445e52b230b7fc3d2c546366538a3491006d046f7e5896c22eb","24a51f4e4cb62e4c5a21cb31492f462f65e2404861d7ca0d2a097e11556365ec","7feb97852491c09adc671870da6e04043ce1bbc4854486bca1d4e664b75a2eb7","d544eb58913c74e4e413b5995cb3386d2d94dd052961be16bee78a4c90ff5c70","d4c52334defb0295961ec9f4baa900c17d94d10f59a85e9d71842886f6eed0a8",{"version":"223834edd62138f62d1516a34a5a5604c699d9f0c60832717fcef2f96f6c846f","signature":"e5172f16a34b37b3aff7eaf2473bafbf0aa87d1307642f54757964fb09f7eaf2"},"023b31d5a92a0e18497fc87f270b630ee8b2ccb08727ce5a94e8c34ed2c0441f",{"version":"100f5e334c86468605a49aaa90416c8c8b4517a92aa0c58947225d34c11d95f5","signature":"b6ac89700ba296e7a10071ef232d3d5e5f673a269a1d823cfeedbc305e9c1c37"},"2e1b8d1c8440d46b0f31fa9e656be553512ec3bbd97de2d20673e0a74fd6dc4b","b43dbecdc2ef87becc7faa982d88cd9b0776aa32b021fbc89ead348028dc9e7b",{"version":"c145a4ab9707a7c8118704860cc855440a2abddf38f270c82b90b4ccc8a8e56e","signature":"e63cd019fe003ac33024735df1997b741471e9721f5456c6cc3b202d8953f05c"},{"version":"db5c86db1819409e0b17bbf0773f90e0468ad0d200f9575143814f3b4ace9c00","signature":"b6b8c5763aed31b5a3eacb89ed14d18f6e639a79f81a4ec7d99bb6fa7176ae24"},{"version":"4e279d73888bcf31b94866df9d0ed6a6356fccfecc8bdf196ea3145b0a046728","signature":"e63cd019fe003ac33024735df1997b741471e9721f5456c6cc3b202d8953f05c"},"96d3358722ad807e5ae61f4898899a3d02d61759ed2200cb1ab02d686cd84bc0","3026abd48e5e312f2328629ede6e0f770d21c3cd32cee705c450e589d015ee09","4a8bae6576783c910147d19ec6bef24fd2a24e83acbbb2043a60eec7134738e6","7663d2c19ce5ef8288c790edba3d45af54e58c84f1b37b1249f6d49d962f3d91","12bae4c8c1b1232b2a8dc626eb28c66d481233589b5ea735ffa99beae6cd1c89",{"version":"aa4fe7f24f9b5923d616cca410fbe78c865a7495d79b7e29a44586cdcde5c977","signature":"6bc2fe9f7b2be6728c541c197556eb2aeba0e616e8969bf0ec2a3e65c849df15"},"c1613da3811d845b8f349b457bad5923121abd1471b2405e94d04064c39ff0c1","9fbf43492355a568b974ad5ac55df6815ddfbe164e87fe6985d31e0e1517bbab","8b1700387b37a1d79b7daea019c77e5c4e49d00ac9fddc35bae495189dfab9ab","89079688fdc15440ef25bf4fbe5741f604cd408f82930f30b8eb255db77678db","1a7712e703d2c52a4053a765e8a4a4d4b93f224226d3ae4cd7d3c47cb08b0b0c","29252d86459a379622b2ab398929677616987c3c4fa8486d4e7962934e5e03f4",{"version":"b0ed074c60d8d0d40e1dd738ca5cbfbb9158481e7789cef5ac3fa347a241a6ce","signature":"1ad2243f28e98b8f584b50bd597569fa7d622bc0e363983bfeecb7605fcbb583"},"4015422e737fc40b3a1d3ed4ed16c3b4a8c8711092f23b596833f73bc1bccb2d","93b851cde18c33da9f43afcd72cc1d86d5543a2905ea0ee31fdfb0632cd60ac5",{"version":"e1fad1879e573f66480b59cf4bfe68671723fe753c6fbc8a947422391d99afc3","signature":"7aed8c57090c67d977f394b44c9d9d4c8f32a4d354dba7e395f16a02bdfa4ccc"},{"version":"fd2a964d83d4165b7afafa128186cedc5738dd1a982c4ee9a73c99def079f3c4","signature":"7c803dfaea37908744ad08f337e1ac58f0447bfe03738e541f85f3c1d1bd4463"},{"version":"de1dbcf3b9a305831e5ad01c65dec0898c66e2632926866edab9765d5ff19275","signature":"28c30dab83f86036e819ca5a5e0929e334a6a759fc63fb91fd810910682c1500"},"57bea92a28efe7a5573ee533abc2189f740a5ee00418f3d89ee9a585c722c950","481d913110e1abdfc4ceb40ad598379cdfed4cc7226a1db36bd4b38ab59528b3","5945d8a7684ba5e3adc50eeef8d5c21b5735cca180257689ae95b0ddc6d04726","8f6c5ed472c91dc2d8b6d5d4b18617c611239a0d0d0ad15fb6205aec62e369ca","0b960be5d075602748b6ebaa52abd1a14216d4dbd3f6374e998f3a0f80299a3a","ae24273c4805280386f1936aa8a8899dc8812266dd11a485e06c7b2be453aeb0","9acceab4ecd1a6c957682fa626fb59914b891ceabcee6b372f1b756c0066749e",{"version":"a5152e66b8738209d25d9de0d7317e3da5a87d4973ce8c95f9118f4207e5bad4","signature":"33ee64120dfc0707ffaca887767481257071847033a2a641e15f9c6e4a8bdb99"},{"version":"e7bba3833357bd0277812a4fa2c2405fc4a10fd11de22bf1ee090f9e80254e5c","signature":"35a261118196effb0c24d454ecb331b92dde021e652b86ae31adc84d865420cd"},"781d2d2bff517b1c1d55826a4255e068791b34ec5dea08f22986404efc55ac86",{"version":"b9579f9ead8067554706db5b40ae55ce4ca5479066eb60b53f5f8f0e7a2f555f","signature":"35a261118196effb0c24d454ecb331b92dde021e652b86ae31adc84d865420cd"},"1af9017e016bf8be526853b79ae605819d672ce887d58a1e3abe879ff2540846","36565e15613ed488fac721bf04baf1c3c9003ad05ddb11dc77c81267269c253d","c8d00b98df4d4f7d89fe665eaff712fe9c8a98ff27418bd72683b07b56a5e7fb","6029fed53087c94656821546cd272a90d1bbec1b5861e9dbdd5d8eec95889d5d","9c8f7cae582e4126ea024c260b1e41058ca1812edac2fd61fb675e166cb04852","afdf621da38a6eb13fa3820211b10fbb897a0be95e41b11a42d10a39b27e4008","2664ce356771fca599a9e10e51a8830d718e60e98f0b2a79103551dd48d5f8c1","88d2c3ccfb80cc5e9dc27e55e41dcafc2c35e51fb25d98980abf15e6cb497c6e","8401da63d4853bb8dfe629820014836e078375d63da23a18fef4e05e624d44e2","9b5f6b1424dc4253ac5007bc403237df7a0875a64a83e0c8f0f80d0aee67d0d7","ad6b385d0783852323905485d33e788e8d2609a70b8e38da1e0b7c53d1ff4cbf",{"version":"b073c48bf7de2068d5a36ff017a5776bc521112faa0e5f613521e35b11525336","signature":"35a261118196effb0c24d454ecb331b92dde021e652b86ae31adc84d865420cd"},{"version":"c08d168115df8d78536ad2c7425d02e44f172f2d0bf00194de718f4a5337e499","signature":"35a261118196effb0c24d454ecb331b92dde021e652b86ae31adc84d865420cd"},{"version":"12b2b4be9d1937b81063c82aeefd45740a6192c8f1ad2f808f7af26392d6df14","signature":"c4cf0433ba7fe8ad783a586dab1cc92a77ebc20d8aea81f5ca1df03b4c2de933"},{"version":"86187be7819252c68ea5ae90628d6956e35c30b0f310cc7502edfdbfac83bd93","signature":"35a261118196effb0c24d454ecb331b92dde021e652b86ae31adc84d865420cd"},{"version":"32bcde81bd714324ac4eeb392f4d7cb305f998ef899aed9e38a233c18357c928","signature":"35a261118196effb0c24d454ecb331b92dde021e652b86ae31adc84d865420cd"},{"version":"aaba2c8d074131e72602ec9797cf6e2838030d1a68bfa6d1a1dd199c49d0d110","signature":"c282bc277124127b7008e875836bd4094730f09b089ca688fa996222a731e4f2"},{"version":"6e7a6f2f1af17b5e2d6dcfab9683a741a989e4d95623ee59ac7a71fcd00a6e0c","signature":"e3352be5726d57f1218854a306c3c55acaa619643981142015f8e33239daf27a"},"6c5a126b2db406921ea5c0455fe819455713efa7e5f4304499a9c452ee1a7840","85b0391fcd3a715db562ec355e2252135c9479006fd91de85d704f3147bc0213","fd15cc2746b63f570390c8525c97e2550d3f85f210e571a99b18334187d3e44e","48b6a539737d0fef86eca873ec287a4200d00a9cd22ac7580fd668905d71569f","5ab67e3ddb9916b5999a0188a0987d7443232a35db13e79eebedc749fca410b3","295617c9b688374047f76fc87ef907eaec4962f9d5427ef0ef22af44a51d57a6","f5b29d4f24e65e79a290ba0e2e190ceb550700efa67029b705e3bd288976f736","1b3ba568a466a317e917b76e4711211d05529d78694fdb279d8985eb1bd0e750","bf4ac3fec08e1dedc0d159278c71436423b5997fb3ea93b03b29554db9e5d4e0","b5e4bdec0931d3602d9cce8617705af17b8e8f0a531d11ac4c7d3e8b60215961","f435d9691fe25a58898e45a7170667d2b292f7a287ef467db45c0cc583fb7df6","41c4293ea09048929cead9650169fd24847178295bcb8d823e4a126cc7f3ea09","36c9ec7b186c53726bc0d15a5976928717a6890071ff267b4a651df7b6666d68","687bcca94eff1bcf3d532302745c18ab6c18cd6902e8a49209bd353060c2307a","5c20bd12728001c60c031ecc79de0cfe8b2b977efcd1b90c87ea5704e0ee7b2d","d94a40ba5ba20c7890d7e099b6acdae4fcb5118b807ecb305ca2d827de7e7d11","ea3cb69dd466671fa43c24addb233c5f736773f45fada49532d0caae4a6a68e6","9d184135c46aed7563a5b39cd3bb09ea31ec148a543e99bb117416c183620579",{"version":"8fb24ead800f969f687545e44d978e56c89ad5a850bc5c26c943a2e3cf24cfb2","signature":"1247aa62bb04a4516813b894cf596c92c733e805932cdb7c0952caad202e6954"},"6ffb60732ae271bec850e03782596d1f47974998b9c90fb67b433c02664c0847","5cdbb77f9e167c67d70ab873d3f7076c3b4988ef24bc1d8e47981527e2505143","b4a402888a9e1d9e69e2b044bf1914fac1fad3362fdfa5c45cc47adba5733e5b","7d2b7fe4adb76d8253f20e4dbdce044f1cdfab4902ec33c3604585f553883f7d","8c4799337d5031e3813cbec776986396dd66d46259cc840bf896a4f3d52a2e25","99b65d6d0dc095d4cd635196b3318c07e843ac78e01d6cd399ee0da1a2f1d105","48c900d15a180d44deba3ed3f90149681d66da5174dd0d3bfc4cc8145865da61","1a989983fbefecaf4c0b57a13414bd1966bd8a77191541ef19efd2f0f08c6eb4","4e2e4e1d06fea7d362b31fc03c7c4aa5529beba98c374e5d0fde0ad1c5824098","ef78600c601e5f490601a41d68a1f36a63728f7e2d668240b63c55b054f0fb83","2f736296dc8ceebf2b0cdcaf39c6bb8f93cb4c08db97aa59e3018507773738a8","24e81417e5b83d558f2dcaac16bf2c88412f6c92019cfc086fb7245025745985","24ae29796b8dedd3fd6ccf345e33d0aecc67db071fb08babab196b8bc8694762","75c22d6cee948de50e8b4520a0b49622a9903749c0a3639869b2d12d4dfdcd3e","3414fa57857ee0a1fd4865cf8579babb445d3d7ae908854b07b95eb463e2c08b","723eee055d3e75f9395faa6d49bd00327dd0469790699eb90d1a4ce7e13412fb","2b3bd6d1c258a16229a41b198d42fad2808a933522db2c39e31cb07527763ac0","914a12d2eb2c9bbf8a0b79eeb86718a2206319bd636579c63dbffc4fcc25b4c8","6c36c26e0c57c5b225942b676e0efb5038b21512f4354199aa2693370f48fb07","b781824a29b92a7334a13cfa14b972879ab201b2b02d0535f9a74f59b5054824","96f7276365f42722b4d53de68809c5ab03a7751e4c0c9e28e5cd5569668380f8","5538e8d5035198ba7c14658264d667154653eba8a131ab819b932629874c38c6","87e15704705abc4f47a2ea7d9fea5d10fc008bfecc2019519ecde40dee268216","aa719402e1977d994b6a712f9e1f4f8b2d5c76b33e156c0790cf5ae13d35fd22","a15f8374196d9ee63cac4d0fe0887351b20d34ece403e0a53a68d12e5ead768a","79f5c8cf6f0c81f350c5154316fc66955fb35b2f373d8d75d0ad5e89cd8af7bc","eac9f12c2dd1e7c32115b9a36bd7997c8ae0f8cbfcd7904ac4c5aad63abdc3d7","0c15975cbed83a26cc9f567b6473e7e11e30275fb4a7e8052d62a783a51db349","253df3a3d66ea874d2b8b09d8cb4ecc20f06ae1ed2fcb52bb1d51aecd382aef3","af6403cd5325191ce78ed824f3ba34d83c5c6cf7ee02eb300266d3dfa2d02dd7","b47234ade5888bd24e2b1b33474c7cab140238a5b0f77d4d2004fa57692d1c87","4a2682e4bab581c543d0573ff87fe6b42116ce526b889409364ea2e27216fc3c","c312b7fd6ddb358c22785e789bd89ea5b18db552a82ca2f2c7cd4ef77d0b1a3a","99292d3680f8a29a14e327e0f12f9c5d9684f06a99cd3ecdcfe63baeb086527a","9eccef41fe0a9dd67b61a4875122ed8ddced8938a618f521f1e4f36cfd239ce1","19b56f50aa2a120ad9bf725b685f0e6812a1eba5b28744c0ec1381dcdf79dc1d","68eaf3c91c6a751e915081374b44fa408b89c999d7e3b5d408590c4751e6100c","274a0c60e48052c077735ed771380e92d9a733b6589387cbd27a4f21305dff22","765ae88f2716d9476e2c8dca6bedfbd7de33555d62a48c6cab2659aad1b956e7","bf5c6ee6137569c9d42c04d93bb9382d61b9a1e66ee5fbe4f8085fc82a7e01a7","6149158e3d839dc57041f116d9dfa66b0733973988794bbd957e52ad9db93242","03b10aa3b6c1df1df826e91abc606c1d7a6c5998224bda77a69af234a334781a","953469c9cfde374e8af60232aea3ef3e2393deaa31c79e4816662c32b4f97607","2ea8ce9b32f38b415405d5905c83c2528668ab0e056a3a1bf124d413f42bdad5","f6b757b116587a11694b84cab6a3691e027e7783050e16061dbb3d40ba29f295","3b9ec43b6306185caf2d73ed0459decb96bc4906aec054c38c2d83240b731bff","21f2f387dcded57538a043fd676c7a50e380c57456ccddb44c07b9b2f1bdfe85","390d2f67646bea7901a66fbcbce19e61286252e7ecd728bfffca1732a974e3ca","325f762bb27b5d66b375ec92c90c5dc827ced17171d260aab2b224497f9f6e6f","d39ca48594ac338bda70bf6189fe27e469b4d4c2ab1d49fe67cbf577b604f19e","e257cebe3b6f833c807bd759ae539b46f8446cde636b99899183678116901484","f1be135bbd8af0e16342c22a0a796c47ca5655c754976026a52aff13b360bd46","5b434a625ea3d398bcf042af80a479f037c897579b7cc7558452df366684c41d","2cf84edb5635844129afdb601cf5684c5a56400d210751243a681cd04b57c1d9","c610cd8509928c67c5e3f9de30905cd1ede08208563cf789ca3dd9ee3a484927","414526d9290a176733f3a5eb959383c03b2fcd506978fb5ffc26788f201c970a","b526e8dcac876944abce9efd72b5ebc6b789d84870575842be8450c6d3c74c4a","65602b6521d79c38b911ab142fa8833b1460878d976c54b63b3cf2f3b86d7c00","d0fde7c862376189423d11930ca69a7cad0c017ffdec17c776d0d607ada8b4a3","4caa87fd9f69e1e15a1a57349948539b57041970086da342f7bd42ece1353c3a","db8ba14996f88e34f4af93b6816944c6ea5d4b703244abc61de67cfe7f488ce5","a3a51b4200f61ddf427f81fc42cb11936911d53714ad9a8b2677d32a548aad3e","81171f0b7b97b3bf0e8cd9fa599f23c7cd8e43f3c34f0c197b53cb5f4f55a25c","f722e6f337828933c52512cae32a8d9c9bb3e8409fbd39b4ab556d9f2e629b30","c9cce0fdbf1e23604904ca1a552ab26492aaf119f351775f0b6eb451301410fc","8f56bab88834bb5ff5d14063c0c7bcebebb9cab6893749605ea2ab0f8d0a879b","74690a0a01465cec515784e0a9059d286276148cc62208a4eb85566b6890e962","afd4f7197d02aeeb6bf1107176f99c0f1d6559cadbbec5c71c2b95f89e177912","619d880e788c5066831a64d18108a59acc6a5c06b2331fa0472c9480154d8746","ff0824d9a6582f789ced75948e309ad517a2b7aba097e0cc3cf8b7555dd5c790","a3d4e893a96bf59fcda0d99da5fe737e807f8d1e4226418fb94c547bdc441026","b5c09e3d2f3887fe27b1824c9106ab5e5c6ba50bd67e91fd68139445e730df35","21cafd7a40b56b799977e4c31dba190ecfe6bb1e5d6b56b0ee346194c7773924","294c0200eb9f9f0b08f8c70c2c4e5d6fd8bf0d0ba19e850d147f723d7a33501a","b386e7b1fa1dca4a5ce1cb4ba97cf7288da377bddc7a0da1b3099c2cbe071067","e5c813d1eda908a823a49b560fb85aacb5e1c867132bf3758571128baba3ebee","914b10e122c91947fe38a9b88ab2902d1df81c1dd49ecc425a33afdf6b6b2351","9c2c9478e7485707c691989d4b84ed94eb0401628236472904bfc9cd728d1905","64de3cd96e6596d4f61910deba38419edec94a0d6d13bda4ebc943f1bea4a994","f78ede5e5ce6416ca20e86759e64c5c3b43164a8b4e85e4cf2711684817580e2","443f657370bc64f29f99fbd73234420a85f1201105ee2d51804a34c361867729","b05ae0376910614fb447f038c63344d8a4763c62dd61b061f78d367fb5f6cdaa","316c6aff8e889d67ee8eacd6115cee37b18834ec17fb27419d8cd770bdb3b472","043601290983f441c827ba8a9e586f45754b777c00394d475174e4c04f53b803",{"version":"156b0a745ba30989874120e5499ce23b5983e630c81bab0a7ff5949ddf491710","signature":"514e9babca1e9ad576179ec66bfacbb117159f99c6ed464664ca184010bfe2c1"},"0ca039c00e3c49a9d5d2f479878f94834af1331be8603e3f3211381a8f6509d4","39f250eed9db76c52d2994962b5ed658348d709c20ad84236300b43cbd3a58a8","76af9a0aa797f5223d306902b85edfc91bc18b55ab3f7190f61fe35ebae29d0c","868f9af4454f4f662ecc6c751005476fc71da63360939a7ed7c8c4586898f1f4","d5667d0bac13684c27f0024b6831e2e4e988e2664358cd9175b4233a3c5693a5",{"version":"88644e6ace80c63f4160eaf06e307655281db7e82f72de8fb65fa9cd746ffe6b","signature":"0aaf361e1b68bfe81f8a4e72aa0aea3c72331e0e72cb05f948f199a096db7e5d"},"57088cb3158fd64e65d89e98e42001880f765bfe0bc315ced0679b1b2e0548f9","4c711a2c4d0b73d4eeb1951533250ed93aaa8d79dbbe59cc3375dac5c9de01aa","1ed0d8545f0540e43a3863d927f97c8d034feebf13f515052c290a93bb1dcb51","0c7d68ea508126a520d1482b73232c833fd1dd7e7a52fe4a33a6c768f9eb4766",{"version":"cbe80a53ab25556fc2dc104bc8fcc6b4f6250b87f7bb91a46b909b29b1718018","signature":"e5172f16a34b37b3aff7eaf2473bafbf0aa87d1307642f54757964fb09f7eaf2"},"9e0241e712585635da3135ba8df5efa22bb99ec958fc22e60f3bb69337a5634a","42c9185d8b580f053cceca9a16f405d2c3e151a04d3ba190459839be23484538","1e65d7f6304e4f3c70d3ab5fa17289eded7074421016667e42431f46be056450","cd51ceafea7762ad639afb3ca5b68e1e4ffeaacaa402d7ef2cae17016e29e098","1b8357b3fef5be61b5de6d6a4805a534d68fe3e040c11f1944e27d4aec85936a","4a15fc59b27b65b9894952048be2afc561865ec37606cd0f5e929ee4a102233b",{"version":"744e7c636288493667d553c8f8ebd666ccbc0e715df445a4a7c4a48812f20544","affectsGlobalScope":true},"c05dcfbd5bd0abcefa3ad7d2931424d4d8090bc55bbe4f5c8acb8d2ca5886b2e","326da4aebf555d54b995854ff8f3432f63ba067be354fa16c6e1f50daa0667de","90748076a143bbeb455f8d5e8ad1cc451424c4856d41410e491268a496165256","76e3f3a30c533bf20840d4185ce2d143dc18ca955b64400ac09670a89d388198","144dfcee38ebc38aae93a85bc47211c9268d529b099127b74d61242ec5c17f35","2cf38989b23031694f04308b6797877534a49818b2f5257f4a5d824e7ea82a5a","f981ffdbd651f67db134479a5352dac96648ca195f981284e79dc0a1dbc53fd5","e4ace1cf5316aa7720e58c8dd511ba86bab1c981336996fb694fa64b8231d5f0","a1c85a61ff2b66291676ab84ae03c1b1ff7139ffde1942173f6aee8dc4ee357b","f35a727758da36dd885a70dd13a74d9167691aaff662d50eaaf66ed591957702","116205156fb819f2afe33f9c6378ea11b6123fa3090f858211c23f667fff75da","8fe68442c15f8952b8816fa4e7e6bd8d5c45542832206bd7bcf3ebdc77d1c3f3","3add9402f56a60e9b379593f69729831ac0fc9eae604b6fafde5fa86d2f8a4b9","cc28c8b188905e790de427f3cd00b96734c9c662fb849d68ff9d5f0327165c0d","da2aa652d2bf03cc042e2ff31e4194f4f18f042b8344dcb2568f761daaf7869f","03ed68319c97cd4ce8f1c4ded110d9b40b8a283c3242b9fe934ccfa834e45572","de2b56099545de410af72a7e430ead88894e43e4f959de29663d4d0ba464944d","eec9e706eef30b4f1c6ff674738d3fca572829b7fa1715f37742863dabb3d2f2","cec67731fce8577b0a90aa67ef0522ddb9f1fd681bece50cdcb80a833b4ed06f","a14679c24962a81ef24b6f4e95bbc31601551f150d91af2dc0bce51f7961f223","3f4d43bb3f61d173a4646c19557e090a06e9a2ec9415313a6d84af388df64923","18b86125c67d99150f54225df07349ddd07acde086b55f3eeac1c34c81e424d8","d5a5025f04e7a3264ecfa3030ca9a3cb0353450f1915a26d5b84f596240a11cd","03f4449c691dd9c51e42efd51155b63c8b89a5f56b5cf3015062e2f818be8959","23b213ec3af677b3d33ec17d9526a88d5f226506e1b50e28ce4090fb7e4050a8","f0abf96437a6e57b9751a792ba2ebb765729a40d0d573f7f6800b305691b1afb","7d30aee3d35e64b4f49c235d17a09e7a7ce2961bebb3996ee1db5aa192f3feba","eb1625bab70cfed00931a1e09ecb7834b61a666b0011913b0ec24a8e219023ef","1a923815c127b27f7f375c143bb0d9313ccf3c66478d5d2965375eeb7da72a4c","4f92df9d64e5413d4b34020ae6b382edda84347daec97099e7c008a9d5c0910b","fcc438e50c00c9e865d9c1777627d3fdc1e13a4078c996fb4b04e67e462648c8","d0f07efa072420758194c452edb3f04f8eabc01cd4b3884a23e7274d4e2a7b69","7086cca41a87b3bf52c6abfc37cda0a0ec86bb7e8e5ef166b07976abec73fa5e","4571a6886b4414403eacdd1b4cdbd854453626900ece196a173e15fb2b795155","c122227064c2ebf6a5bd2800383181395b56bb71fd6683d5e92add550302e45f","60f476f1c4de44a08d6a566c6f1e1b7de6cbe53d9153c9cc2284ca0022e21fba","84315d5153613eeb4b34990fb3bc3a1261879a06812ee7ae481141e30876d8dc","4f0781ec008bb24dc1923285d25d648ea48fb5a3c36d0786e2ee82eb00eff426","8fefaef4be2d484cdfc35a1b514ee7e7bb51680ef998fb9f651f532c0b169e6b","8be5c5be3dbf0003a628f99ad870e31bebc2364c28ea3b96231089a94e09f7a6","6626bbc69c25a92f6d32e6d2f25038f156b4c2380cbf29a420f7084fb1d2f7d7","f351eaa598ba2046e3078e5480a7533be7051e4db9212bb40f4eeb84279aa24d","5126032fe6e999f333827ee8e67f7ca1d5f3d6418025878aa5ebf13b499c2024","4ce53edb8fb1d2f8b2f6814084b773cdf5846f49bf5a426fbe4029327bda95bf","1edc9192dfc277c60b92525cdfa1980e1bfd161ae77286c96777d10db36be73c","1573cae51ae8a5b889ec55ecb58e88978fe251fd3962efa5c4fdb69ce00b23ba","75a7db3b7ddf0ca49651629bb665e0294fda8d19ba04fddc8a14d32bb35eb248","f2d1ac34b05bb6ce326ea1702befb0216363f1d5eccdd1b4b0b2f5a7e953ed8a","789665f0cd78bc675a31140d8f133ec6a482d753a514012fe1bb7f86d0a21040","bb30fb0534dceb2e41a884c1e4e2bb7a0c668dadd148092bba9ff15aafb94790","6ef829366514e4a8f75ce55fa390ebe080810b347e6f4a87bbeecb41e612c079","8f313aa8055158f08bd75e3a57161fa473a50884c20142f3318f89f19bfc0373","e789eb929b46299187312a01ff71905222f67907e546e491952c384b6f956a63","a0147b607f8c88a5433a5313cdc10443c6a45ed430e1b0a335a413dc2b099fd5","a86492d82baf906c071536e8de073e601eaa5deed138c2d9c42d471d72395d7e","6b1071c06abcbe1c9f60638d570fdbfe944b6768f95d9f28ebc06c7eec9b4087","92eb8a98444729aa61be5e6e489602363d763da27d1bcfdf89356c1d360484da","1285ddb279c6d0bc5fe46162a893855078ae5b708d804cd93bfc4a23d1e903d9","d729b8b400507b9b51ff40d11e012379dbf0acd6e2f66bf596a3bc59444d9bf1","fc3ee92b81a6188a545cba5c15dc7c5d38ee0aaca3d8adc29af419d9bdb1fdb9","a14371dc39f95c27264f8eb02ce2f80fd84ac693a2750983ac422877f0ae586d","755bcc456b4dd032244b51a8b4fe68ee3b2d2e463cf795f3fde970bb3f269fb1","c00b402135ef36fb09d59519e34d03445fd6541c09e68b189abb64151f211b12","e08e58ac493a27b29ceee80da90bb31ec64341b520907d480df6244cdbec01f8","c0fe2b1135ca803efa203408c953e1e12645b8065e1a4c1336ad8bb11ea1101b","f3dedc92d06e0fdc43e76c2e1acca21759dd63d2572c9ec78a5188249965d944","25b1108faedaf2043a97a76218240b1b537459bbca5ae9e2207c236c40dcfdef","a1d1e49ccd2ac07ed8a49a3f98dfd2f7357cf03649b9e348b58b97bb75116f18","7ad042f7d744ccfbcf6398216203c7712f01359d6fd4348c8bd8df8164e98096","0e0b8353d6d7f7cc3344adbabf3866e64f2f2813b23477254ba51f69e8fdf0eb","8e7653c13989dca094412bc4de20d5c449457fc92735546331d5e9cdd79ac16e","189dedb255e41c8556d0d61d7f1c18506501896354d0925cbd47060bcddccab1","48f0819c2e14214770232f1ab0058125bafdde1d04c4be84339d5533098bf60a","2641aff32336e35a5b702aa2d870a0891da29dc1c19ae48602678e2050614041","e133066d15e9e860ca96220a548dee28640039a8ac33a9130d0f83c814a78605","64c32c74b6fa2c6da88310137850d7632c5095adc1e339ab721d12cbad1b6faf","679c01bfe897d40b483d31e12b21c0894e7cf218487d437c7ef32cc2c43b57ec","6a57f4c75f135396f93cf407d8a38baf7ab5feee1aeb46dd86cba7aab9c4c509","13548d8236b26fc8e7fb42a1fe34ebcd152796f37ad66f5174fa643da3808d8f","9e1b0fc325046f3773a14b36ff3ec938d4ae81733664a89e97cbccc07e208655","f83f3dd32f8d2a6813c05e51017a61070aabc611a500240653076f84cd958d2b","f919943e2791240d31a32793a0d025a30f4439db09d9f1b76c4551de42faee2d","629768e891d33df865cd7d332d4d29e1f4797f80f5cee51cf101633b75a01be5",{"version":"281d39a62e7499a565994e0466f8b2267e3a735fb860f3652c92925b552a9ebd","signature":"208f396a3fa58757495921dfddafe93e0dc04707f9669e9126461a365b0b84cd"},"df1991e1e095d4d8d01bb67580161ea137ed899fa313266f35556e477b9cac5e","6763f6f34721945c942ecf981c77feb4871e7b4730efa62339dd162bf6c400b4","d92311993d06a1e66d66b5fa129242c93c9bbcf007a9cd2bb46363ef6a37fa9c",{"version":"7d39d70f9b963879bb3d66581089f6618ae8daaaa326bbae4f8eef365aa787d4","signature":"30f1f8b67594feb2f2ed2b8c82292f578e7e2354b4a9cf8603e5020838c09c99"},{"version":"f934e154ef6c94093e1e9f0888e5c551554e7836b46d16631c6b3e661eba98ae","signature":"775a9c6a48da117cbf8821707719fabb7735cf640ffdde99336e97322f648240"},"0e85cc63598264f659acf13d41f2342329e3b473fe8192c3b1b00684beeb5ea4","7c740e795a732772dba480cab292fa3655567564f34c290ba0015647a24f7b8f",{"version":"557964ffddf84e12d5aba625c60f7481a1dc2565e24f058b76f52172d7b51278","signature":"9da85fbd2539eac76b9f07450127e7597adb611f403ea9237d737ddbddf76d10"},"525db2640121085383d74b98217dfaf7ca342b3572ab73276cc2335a4dab6855","0d9b9776ed9786850020e7b9af76dff18e9657f936899c5edcdc76227a9d45ab",{"version":"23908f509456c9eb665a15c322c2e18f8a617c8033c3387888179167043f126b","signature":"fd4b584096a12ccd1dacb44da921ebc569c8f2972e905dd717b6688f21153628"},"57dd2ba4dde84cf1b5df22287087b1191a1ed8d6e72e69038e2fa8395a5bbf50",{"version":"786ec38f4826200bdb0605efdc7158173657b01412bdf5f244587817d21db741","signature":"a718912133138ce5eb00e94c6dcfa74cafe268e8cc47bcd1a83715b787482a46"},{"version":"043aca70517ef921c14facfe40c355f9c6e943e8e6d0a35b6dc5125a2219cd4b","signature":"9da85fbd2539eac76b9f07450127e7597adb611f403ea9237d737ddbddf76d10"},"7f1d06ffd0d8f6448365716cbc61e9f2d4e2d5e86c45ca9096cac85ddfcc29a1","149e6e66905c22d3ebd3c00b9ebbeacb342a1b4919a829ff7d65a9a329645881","7a0dc452c532ae34602747602b23189e65fa2535c82e9f17a9b618606a78bd26","33c18291895cf06a317440ad43c7b59b128537eff762ab9cca7efa0d5252457c","e42e9c9f14170a13fcec3dad710f6908366b76f364bf01e45b35bd749c022952","9d10739930fe527a0d2d99aa04a46b5c2c12ad36fd35a91fc699622886e17629","96690126b763aa0e2be9a6012f9575ddbb522d6deb31a7dde92c38e5ba650417","671a771b771346fcbd6b079e438459d3c021b4eb0bfc69bca23893028796900d","ad082dfa6e56bf6cdce310293fce70d6c622edbb587af09503a82a82595e3a5f","b019113fb3930581d5368dda8ce5f2954323e221df2bc9c801163f17c3c7126c","5b1856504bb04b8058150cc6e037bf62c23e7812797c1da5b583f8b00d4a7907","f5ee6cfd920a880ebed2fb7726f9c303a9290096e4a222a7a8fbb4593499a917","90fee5b4533335522b5f200340f85a41d42f337d86833a421c7888f514adf76b","3d0a689e5e465b187f0c1f1251057d8d90def6488982c2e6bcec16c02e3d5b69","58edbfb2c27d0e5bd4501cb95330e024a2dcb552b109d688e3b6bf33dd887505","b94873c1c4bbfe937efe5ec3dda5795898f6f79ff553e64ec7ca752cd9669559","433ae6866baaaf0b92615edb7d6e3a4ec6773dbf7b2d3db459094df8433e5419","874a08ac8589a6332ebae59df471f20c4f9d4e9c92bde2c145aa8d7e3ede125b","6a676a9dfd634b292aa4e624c1f334bebc3ea3f2ae470128bf53972f7f87876e","9f6386167ba6360d4b826ee7cb6f31d4ce93460ffc9332eb7e5bf9abecb52446","db75acf6de0c718aea14c5bf6530052f3459ef24848af96c12914291222dcb91","faea5d2939af602935e385c532f01641c0fb9153be8ea910462cb48d2736e372","9ee30c0bb4c33c75de1007c4a5473606ed3cbe857720b81f1aa096b8482fd8cf","9de432d749f81acacf8ed0d155f2e6a53a05a55ab29d68c8b06aa29d203caf31","95dd6bd71241da4791371fcd705819f5831ce0ff291ce0ae2ffff9a4e4754484","9d7ab67e9d5745e744001d6740df0318af32aa1d35e9bfc4cb43e9dbc54fd060","a4ceae3d4ec2e3a9768880af915fc8a8016ab6b09a80b49934643da669cf1e3f","1fafbad08f66f029625d24d33e401e90d7323e891f9299c640c2a13c69d6784c","6d3ebeefb0d567b72b2f0dac1e132f3e37fb647301ed2eaf0a4f418f9e0ceb3b","eb3b4dbe298331ed19a02a03bcccfc6c98e7e2f4812302851e9d193468f50fe7","354fad7d281830c7ee96c050352db11825f9ea41cf68c1c0724c452255523fd0","0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","bae8d023ef6b23df7da26f51cea44321f95817c190342a36882e93b80d07a960","5d30d04a14ed8527ac5d654dc345a4db11b593334c11a65efb6e4facc5484a0e","74a23cda64c2c884828599295012614c2c5b94d0a62f54556cdb9941a3eb76b9","71c922781e30a244ec7efc860c6c472536dcf6d09019a65d25a4c11a277b6ed1","35950a0e199bb15c91571fd9920d84edec85c4ee388527ee436a13b3b17b6cc3","b8bc705ba453106222eb9120292a5d9cf8ee4a601b4edcfd29bbc6c64b6c0110","e8129ab3c90d5ed6fe8baeb9cc5ca73802c76a6d8a0ed0acee8acb0f6773f2f5","bc4e5ca842c8fa20be22d83ce52cd7353da85191ed6a985bb042f6608c0bcb44","803a135e2ba3754c85a35669eded8c93aa2085753bc5355eaf82eb9eff5d83a9","06c179a5025fef9432eaf716e55cd080020d2710cd98bb0c3d4340e8c866ab59","82b6a50a83f4ed953a1713c486e87bfc5f20e4e77a72d4bac21ab323de6f5a32","ad8105b336fb5161e5299d4a93e314ac7237503bd4e70662a49b544d1a73b734","4a2eb8a189ad7548308ec2319f145fee86f08a4c3310561b9a6d1e04d4546901","821be7f22abd4069c16c1275199a5b3d79bc7a6ad1acd3ba22f1101b6647120f","5f04db9c2b12b5ac35f594d20bfd7941339b714961b62bcec76da6f7014373ef","192b1545fa45a35e565cbcfda34bd2907cac55844eaaa918aa13910f414a3ce0","c6a696a222e7cf897ffcc73f4d729094e01ba7b8c8c2812aea4460829455a3f2","f8e8f88cce9e56861d53c0c1e549e6ca12f82450c43bffba28c6c74faad93ff2","564a98433a68bc529866dbfb4535e9042d14eb210f346629f2648a7b214821d6","547cc9ef548f0444d633dc192ab59f0855c9767e607a6b82515fa478c436f5f3","68873ec52ab60d0b652f98a8566395070f31dd55bb7787f6cb705eeddb839449","73c41d2f53bae191ea753294e4aca067e21dfe4620a64dd06d5b52fafa083c16","a97180dfbda0da255bc90f679ca73d6c1a78b2155a7d971c8960b6cfd626e1cd","c7bc549d52c6e7f0ade19f2dc26625d97e80d43db09b755ebd4c944ab6248f75","b7d031367476b41306c9a441b9e535d5b8fcd619a0ab054a38b7f1d52cc47f6f","6a044de990a34c342df41b3cb528171b5e7d83ed52409509f9eab60c3862e818","ae14c10372a0a0188bea6b022499b8445581de2af1e24468f53848ddf2f96289","0891e9437ef7a839bf73a3a3387aeb1446293f577b9cccc1c15e38eb115d8091","b426147fec725961d1305b25b26dbf99e5c419de98b5728974a8a44fc5959181","554aa4c889f50708f8f7bfadc6c594957719354538cf9fc2718238e3479312bf","053f9ffa7c45eacbb4366a917d7b6fe25dca5490aee9b6de79f9b6b6204f910b","6eb3618527aa3ff049cf419cc780498a7106782d3819f7830d72a0a3ed1a81f7","75527855e817cf6f9db77c296134d452ca78a5d900fcb8d4e5b9ed48b51a7049","2883d05af1392c47d693f16da6758ac28f27520d6ebf1f5ca888aeda8855994c","71aefa55d5687c9e73e354bab7bb20bf5a875e49471b9ed7d62ea3fbf981148d","2b753e807024d2e99b6f85990416c33ac70c5e6ead8d129c9011f4251c916a1a","e400712a9c3161746cd82bd43fc3fddbd79f8f00727b8897f9b1be45bb735357","587f7431e1a0dfc74794fb9b12ba0619e5edd2de3783c3f67c1da81a5fcdb262","eef5c88f931331ae33f833781619a63ca7a356044099dd7ed064e8a4bc3bb18a","162d9b3e1b9692ba0496a6040d51f8332999836a45a5590dfa935b4f249cc37c","79828882be0a8435a3ec4bb4ddaaeee13715d3ef8e10c3074274882358520c42","e35ae53562febe4ca2aed9b77feac4d477603afc7d4dbcd1af969abbe90e5c36","4dcb37a44ae7ebd5acd3e5c5cf94f7f935278f32d6d0b3b9b821b13353edaf76","1b805478cd5cf07246a5688d9ba425f272f42ea71c5950ec41a185677310376b","55a0ec9b3809f2338cde743c716154c4013f2a331dc999ff2e814fcba53db455","89b02261025f0a90f12aee0734d53506064fce74ef810e7008f361496bf4dd11","69aec4cefffc71f4cbee1aa965a9f47a85595b5bf6e5c3d6620340e88e23993f","2bf92d52d124fe4594744ee1e8a66d2f7c0f75587d38edbb3f11e5104b430008","9788ef1cfe93d6d1bae945b932f70d38bd425c94d626462d66b3d0741cdc9a90","8615d2d0bd7dd2aa10d54b11d9317e8a2cbc8f1b82cc7776460a179bc661f656",{"version":"64d4b35c5456adf258d2cf56c341e203a073253f229ef3208fc0d5020253b241","affectsGlobalScope":true},"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","044851e9685b94a0c56bfd7f499b8be4c281e7dc024d1a715a5f9a4598bbf337","00eb9c5a1558c626108d601dd1098d289d93dc7909abd0c50da4f131c7f936ea","9d38599e6d9bdeb1cc3f812040653be9b72e053706a38630ef5ea6fe184f356a","c29ddb35c74f1e433d06427371886bd20c5c71592816614801d983089add7b23","f85ca05459fbcd4b943713896d921dcb8ffa544143f050650bf7228d2de3cb4c","ffc001e75e4b5d0a3db0ff2f0fe828ed956b4b79717e379c995b0b5a552d1890","b236aeba8fece5e4eda5ca3c58201c5ce00414d7f778017171f68ca9f5e64e31","c18efe40bf3764de507d0fa5e752c2060a1ba9cd997d75bbb0971399dc17253d","a7226fb453535e55425a63dce833967e73c220c74cdb88ca37152cf8bb48f351","aa5c28ae7e24cda833cc82ff246692abf18b492af6c3021fe440fc8141582cbf","a5015b425508680a0fc155b65f2c95cd2b8944646b203575385130074e09e3ac","96eaf46c63a12b0474edd3b096cdc0c07cae78ce304d322169657d5c21fb5526","d02d6b9244ff55b3f3de9bc3f1ba0d6acae1841675907c773ace14d5b2a5fee8","25099fd6f77393cfe7b4da0ea649d7470c9b75903d025328932f772cef7a1014","c9eedcd882a329c9e3a4980f1d4985019029429e08e1e0431c8d31f147da79bc","82913ce15fdc9fde3bfa1fcf3dc7d46c55c90230b8df1eb8f6bfd1464c51fa83","33fd349e90d47d203d8fd135d7a18e50924eb50e5cc479b6bfe7052244d0c0d9","2a20da0b105ff983e1018c7be4c3a32b8969904f0201cf992804aac55e8aa313","6006710196391753bae60a65df59cb4a45dd86496df51c0c3ec69135e40e1871","18d5a903b769dd0dcd439f1f8b7511ea0dd3812e9dd2b4c21109621a1013a79c","96f97d1f86d1642658d6fc7351f3b5a47fef657d278e888437b811b0c84772fd","8543ec3e4f66c9ee44de035bbfc8a125d3484b43726893ae06216885c1b6af1c","04ccd5aa42114aee2aa1b1b8273ff9de5c10436549d45789908e61b8a0d820c4","e0eddf45c79cd6ea9c17831c9a429e8d758e324be7042ddf2b0c160fb33c416c","459a1492083bf3c572cc08154e9941a1a9794b283fba9a249d6ce54c344f5cc2","f2a66014ec8375d83268c77e325c894591de09dc31507de1279cd3ad1c8ff376","37dc3ef63a04645623bceac6afc918fd8a9c789509006d5c1249070422915421","20629ddb2e46ff73cabc2d6cec20e6125387592ad8e61d0c4405647bbc2dcd5a","f20187cd57e32b865d9c2525976de9d469ad2f0049638b91c31b6dd7dde319bc","36b07143acf040a9458aa1049f4b30f54c1d3090f0a7494ed12c37ccd763fa79","2ce9ac274b82478aa1cafca6de9a9d1244bc7f40355f3bc88f57f610b1953bd3","48d2f9ffa9f8e3b7f780cca1006ec42ab435e8490f4b5f960b97cf997d6d92ec","21c3e262bd4548906544485c3d61c8b7efffb3fb613df4a58deb6c29a8448b25","3d3f87284a15bd748f6a999a5b0a7b1812a0447f33cb0f227bbf105f60833809","64cdf82ea41b4d76d033100a061897f1c86477cdf43b4165e88301e425f2a3c4","3ba9bcdc8503a114cf6b505916524a9dbc9a491307112cd08e3ab13d4734de6a","8e9c23ba78aabc2e0a27033f18737a6df754067731e69dc5f52823957d60a4b6","dee5d387e2e6f3015cbf91fc0c13ed6f016f9c5c1f2ad9c62602f4fd398fa83a","67f129ed8b372622ff36b8b10e39d03e09e363a5ff7821105f92f085b8d1ccba","1b831600aabe1c065830d303d087189e1ccfc93a0ef1882eb58a336ec1ce9f2f","75f191b59fe7ce72d1d7d11d0f329a193843f54af93182fc5a65c37d0a82c85a","cd74c8275483d3fe0d07a9b4bba28845a8a611f0aa399e961dbd40e5d46dd9ad","82900e1055abedb522b1c2fb580502e9b247b57ab43785b19009bcffa35c7295","154e8bf4a35b6561164de436fd5799b99de1aacf61acbc93c0221002504fa3c9","9dd175cfb2d553c91a631b7b9aaed8cd7693332462195600ed1f7bc1a7fcc319","dee5d387e2e6f3015cbf91fc0c13ed6f016f9c5c1f2ad9c62602f4fd398fa83a","9f3c5498245c38c9016a369795ec5ef1768d09db63643c8dba9656e5ab294825","2d225e7bda2871c066a7079c88174340950fb604f624f2586d3ea27bb9e5f4ff","6a785f84e63234035e511817dd48ada756d984dd8f9344e56eb8b2bdcd8fd001","c1422d016f7df2ccd3594c06f2923199acd09898f2c42f50ea8159f1f856f618","d48084248e3fc241d87852210cabf78f2aed6ce3ea3e2bdaf070e99531c71de2","0eb6152d37c84d6119295493dfcc20c331c6fda1304a513d159cdaa599dcb78b","237df26f8c326ca00cd9d2deb40214a079749062156386b6d75bdcecc6988a6b","cd44995ee13d5d23df17a10213fed7b483fabfd5ea08f267ab52c07ce0b6b4da","58ce1486f851942bd2d3056b399079bc9cb978ec933fe9833ea417e33eab676e","7557d4d7f19f94341f4413575a3453ba7f6039c9591015bcf4282a8e75414043","a3b2cc16f3ce2d882eca44e1066f57a24751545f2a5e4a153d4de31b4cac9bb5","ac2b3b377d3068bfb6e1cb8889c99098f2c875955e2325315991882a74d92cc8","8deb39d89095469957f73bd194d11f01d9894b8c1f1e27fbf3f6e8122576b336","a38a9c41f433b608a0d37e645a31eecf7233ef3d3fffeb626988d3219f80e32f","8e1428dcba6a984489863935049893631170a37f9584c0479f06e1a5b1f04332","1fce9ecb87a2d3898941c60df617e52e50fb0c03c9b7b2ba8381972448327285","5ef0597b8238443908b2c4bf69149ed3894ac0ddd0515ac583d38c7595b151f1","ac52b775a80badff5f4ac329c5725a26bd5aaadd57afa7ad9e98b4844767312a","6ae5b4a63010c82bf2522b4ecfc29ffe6a8b0c5eea6b2b35120077e9ac54d7a1","dd7109c49f416f218915921d44f0f28975df78e04e437c62e1e1eb3be5e18a35","eee181112e420b345fc78422a6cc32385ede3d27e2eaf8b8c4ad8b2c29e3e52e","25fbe57c8ee3079e2201fe580578fab4f3a78881c98865b7c96233af00bf9624","62cc8477858487b4c4de7d7ae5e745a8ce0015c1592f398b63ee05d6e64ca295","cc2a9ec3cb10e4c0b8738b02c31798fad312d21ef20b6a2f5be1d077e9f5409d","4b4fadcda7d34034737598c07e2dca5d7e1e633cb3ba8dd4d2e6a7782b30b296","360fdc8829a51c5428636f1f83e7db36fef6c5a15ed4411b582d00a1c2bd6e97","1cf0d15e6ab1ecabbf329b906ae8543e6b8955133b7f6655f04d433e3a0597ab","7c9f98fe812643141502b30fb2b5ec56d16aaf94f98580276ae37b7924dd44a4","b3547893f24f59d0a644c52f55901b15a3fa1a115bc5ea9a582911469b9348b7","596e5b88b6ca8399076afcc22af6e6e0c4700c7cd1f420a78d637c3fb44a885e","adddf736e08132c7059ee572b128fdacb1c2650ace80d0f582e93d097ed4fbaf","d4cad9dc13e9c5348637170ddd5d95f7ed5fdfc856ddca40234fa55518bc99a6","d70675ba7ba7d02e52b7070a369957a70827e4b2bca2c1680c38a832e87b61fd","3be71f4ce8988a01e2f5368bdd58e1d60236baf511e4510ee9291c7b3729a27e","423d2ccc38e369a7527988d682fafc40267bcd6688a7473e59c5eea20a29b64f","2f9fde0868ed030277c678b435f63fcf03d27c04301299580a4017963cc04ce6","6b6ed4aa017eb6867cef27257379cfe3e16caf628aceae3f0163dbafcaf891ff","25f1159094dc0bf3a71313a74e0885426af21c5d6564a254004f2cadf9c5b052","cde493e09daad4bb29922fe633f760be9f0e8e2f39cdca999cce3b8690b5e13a","3d7f9eb12aface876f7b535cc89dcd416daf77f0b3573333f16ec0a70bcf902a","b83139ae818dd20f365118f9999335ca4cd84ae518348619adc5728e7e0372d5","c3d608cc3e97d22d1d9589262865d5d786c3ee7b0a2ae9716be08634b79b9a8c","62d26d8ba4fa15ab425c1b57a050ed76c5b0ecbffaa53f182110aa3a02405a07","87a4f46dabe0e415e3d38633e4b2295e9a2673ae841886c90a1ff3e66defb367","1a81526753a454468403c6473b7504c297bd4ee9aa8557f4ebf4092db7712fde","813012c29722611e2115e0caaf9901967ebe218069d67381a6931461bfda2099","46324183533e34fad2461b51174132e8e0e4b3ac1ceb5032e4952992739d1eab","d3fa0530dfb1df408f0abd76486de39def69ca47683d4a3529b2d22fce27c693","d9be977c415df16e4defe4995caeca96e637eeef9d216d0d90cdba6fc617e97e","98e0c2b48d855a844099123e8ec20fe383ecd1c5877f3895b048656befe268d0","ff53802a97b7d11ab3c4395aa052baa14cd12d2b1ed236b520a833fdd2a15003","fce9262f840a74118112caf685b725e1cc86cd2b0927311511113d90d87cc61e","d7a7cac49af2a3bfc208fe68831fbfa569864f74a7f31cc3a607f641e6c583fd","9a80e3322d08274f0e41b77923c91fe67b2c8a5134a5278c2cb60a330441554e","2460af41191009298d931c592fb6d4151beea320f1f25b73605e2211e53e4e88","2f87ea988d84d1c617afdeba9d151435473ab24cd5fc456510c8db26d8bd1581","b7336c1c536e3deaedbda956739c6250ac2d0dd171730c42cb57b10368f38a14","6fb67d664aaab2f1d1ad4613b58548aecb4b4703b9e4c5dba6b865b31bd14722","4414644199b1a047b4234965e07d189781a92b578707c79c3933918d67cd9d85","04a4b38c6a1682059eac00e7d0948d99c46642b57003d61d0fe9ccc9df442887","f12ea658b060da1752c65ae4f1e4c248587f6cd4cb4acabbf79a110b6b02ff75","011b2857871a878d5eae463bedc4b3dd14755dc3a67d5d10f8fbb7823d119294","e175549fe57dbff5cd68c1a5ccf33717584d7db9afb8ec216fd2c0daa3b06931","ea68c312e1eb9b48f7064a8dda348594769ba8f9c8596315827c559734a60205","6ddb5fb4476ca702ecff9e5ff0295cde6ce138d71f817da65e118a2a3c534106","6dfff2e65f10158f5a868e642a2e74d2d1bd76f15291552f389f2b8c829a9a86","eb8b0f7424dfee5358cccc6e8f42ddee87e80e9683a10baccaf72287f68d5940","ad9bd8d00b2bfa966a5edb7ab7d9fd7f279937832ce3036dda205ee4cab95fe1","15f7172b1d430bb13e602dadb2342df306f6c52426a2963816357ed8784cd4b5","5e79dd14055a6106d658329e24a9030304023c680bca86b877829e95c68f8e60","2c17e10bc926706da86b72d3420e92dc69d37a99e91ebb28d65a7d340dd9ac4a","ca786387b50329e80d00d79ab9f704d8ac3d8b68be26c3a30194a2dff4221448","6c745adb009a15d106cf629f5da8d974e45235b73d046a6d3455c1309a684163","4357f3465cc3d5a848fe1dcbb30ae1d95657da44e165213895b7bfaca21ac370","e19929fc2ebad3278bdac78001631aa266774b455c2fc068e99460733c09af8a","e91c1bd6e00781ea1244d30abbdf1f631614c49c92597780db06ed6510d40671","d7ca3c7f6d18f7edd625ba5f7b22bd9fba0c60da79eb01efbfdfc294ae315af0","d25556148ec066b173563bb07bab37f541db45201103befec136d0db0f2e025c","53d8ae40f67d0a10993e27bd27c96fa95bccf4475a3f752fe40121afc534c41b","3d7936b56d7c286e6550a2bbfb6fdedc9ff6f4c521494fc16b4c2bf15ecd9c53","f580b06b85f6e917d5880880a78a4bf292603f707bbfe6a955be05cba441f53b","fc1cae7c51cd4348869686b9ac3282bcbea64e73bb69287c5617068f28ba9386","ff8c198b840235bb14dfedac3f2f919af5af5c650b1aea9a599b0a41f12ecea6","eae083813e6770f0e1b99ed23547a0ccdcd16ef237fa758cd7c7de1c687aff6a","ed26221635c99e6d40f967e385d6cdc4ceca94e0100b4c9ba95ef8a80fcb86e7","6a423b9ffbfff4715fdbbd1ba7bc7cb6551a686e0e769071d0e3a1946984319a","86014c681010506f75516a27561403fc44198336ef163fcc7a3228e174bff45b","72d1c17138fae5758747b43974facca6bf1fe5ae5ad2852c1bce64ddcbceab1d","6f46ef7f7238b39efc227189b54f99c967099a30a17ba78d90af26610c57746f","4a72cec63796098be18f9ac3dd1c316f77ab6ac48f44396f3eb0f0bac8cf319d","27a856ac0a35c8783e486e6d417adb03378c1e19e602e86a33bd16603c0bea17","c5928a95ea514f946d2d5fa8d08d55515d8afab25cb36d413c2c5e4aabb42cb5","3bb1600b952d785b9b28745398acf00093ea8a27a8b17d0f97a19176f9f02b08","c0f96e7af436837438c375a8389e449e7de66b424170587997a7e064ac82903d","a163a673ab1c646f84e596a3acb160b251286dd6fe0040e70fbbe06aa0d054ef","787dfe85e3df00873ec0452370d6d140b966e965755d5b6da62f2e0d6b24df66","c67fc3f5c1e0807d0da3b13674337bb7e46fb9a05933d69a8b0c9507c9be8e45","8c0b404becb3d7bdce5ff4a8e8da19d67a898051fb2dd9eef18976571ad17783","6273a64a8e9e8e086351220585add4570014fd3c0fe17a15a6c0953936fea8b1","f8557f6887f2edeac914edecd9ed1aa939e86604ac950d72521f9de60b75ecd8","f57c1eddd4a1614e91aa14aecfb44dff395d80652ce26539d2baf8e18e5361b4","5aff3115425b2156dd900d27df60d5c13881c3450a9edad475ede28b16b01f32","b3eeeccf7e068a3797d81df6d27a5a64b1ec56bb20faf99863d68d61d0bb4101","9998e7178f6ca55019e1f056825d2258e5c2d67b7f13ed50a3447b22d339e0b7","d6c01d3aa3df0e637e13619d40844cb7a3cefe93cb61f4b3cfe558fe8ae9394c",{"version":"bbab463ff1ddf25030561da2de17c38e8232b07279822586afa0239b78566eae","signature":"cc0c0a7e95e9d02f412bfae281f62e9e109cce06c2ea677e855e415f39143b7c"},"6947674aa4f96573d01ef8a50dd8a8a717a56874c2b103afbe14dbb017df7ac7","0da6540b88fe4b3706d468a9387e506408c8acc889a71fb3c3be3f8da5ff6b99","a96467b5253a791d1e3d2d3dbf7643340d4b6c6891edd95902d64ab7f8040f2a","01374379f82be05d25c08d2f30779fa4a4c41895a18b93b33f14aeef51768692","8e59152220eb6d209371f0c6c4347a2350d8a6be6f4821bb2de8263519c89a8f","14b217c8691536bbcbfdbb9b130c329819cc33b7748a5b4bade531db75910e8b","957f9bead11de03e1aa0f14d22a05b95706f78724c7ecca6a71dea94dc0dc13b",{"version":"858a159a825e9862a36b2d2c2b925f8e30f8792efc39aa3d685c9752c449cdb7","signature":"50eb0cca60a05f4817fa22b73df94690c4f0696b58e6cea749c0ef331d5637b9"},"d77fd6fc7b66e38e314565d1b7086136f2e72383765c0d28706333ca39121123",{"version":"faaae29a2f02805c772ea5cf00b3f93ccb35568c6d42c73d299c1993ffd9c740","signature":"50eb0cca60a05f4817fa22b73df94690c4f0696b58e6cea749c0ef331d5637b9"},"cdcc132f207d097d7d3aa75615ab9a2e71d6a478162dde8b67f88ea19f3e54de","0d14fa22c41fdc7277e6f71473b20ebc07f40f00e38875142335d5b63cdfc9d2","c085e9aa62d1ae1375794c1fb927a445fa105fed891a7e24edbb1c3300f7384a","f315e1e65a1f80992f0509e84e4ae2df15ecd9ef73df975f7c98813b71e4c8da","5b9586e9b0b6322e5bfbd2c29bd3b8e21ab9d871f82346cb71020e3d84bae73e","3e70a7e67c2cb16f8cd49097360c0309fe9d1e3210ff9222e9dac1f8df9d4fb6","ab68d2a3e3e8767c3fba8f80de099a1cfc18c0de79e42cb02ae66e22dfe14a66","d96cc6598148bf1a98fb2e8dcf01c63a4b3558bdaec6ef35e087fd0562eb40ec","5b9586e9b0b6322e5bfbd2c29bd3b8e21ab9d871f82346cb71020e3d84bae73e",{"version":"5ab630d466ac55baa6d32820378098404fc18ba9da6f7bc5df30c5dbb1cffae8","affectsGlobalScope":true}],"root":[46,318,324,325,[337,339],341,540,547,548,[551,553],993,997,1000,1132,1133,1135,1141,[1162,1166],1233,1235,1236,1240,1241,[1247,1256],1321,[1323,1327],[1329,1335],1340,[1342,1348],1350,1353,1355,1359,1361,1363,1364,[1366,1368],[1370,1372],[1374,1376],[1378,1380],[1401,1403],1449,[1451,1453],[1478,1484],[1486,1496],1582,[1584,1588],[1590,1592],1594,1595,1597,1598,[1600,1602],1837,1838,[1844,1847]],"options":{"allowJs":true,"allowSyntheticDefaultImports":true,"declaration":false,"emitDecoratorMetadata":true,"esModuleInterop":true,"experimentalDecorators":true,"importHelpers":true,"jsx":1,"module":99,"noPropertyAccessFromIndexSignature":false,"rootDir":"../..","skipDefaultLibCheck":true,"skipLibCheck":true,"sourceMap":true,"strict":true,"strictPropertyInitialization":false,"target":2},"fileIdsList":[[46,76,105,271,317,319,1488,1605],[46,76,105,271,317,319,1256,1605],[46,76,105,271,317,319,548,1605],[76,105,317,1605],[46,76,105,316,317,1605],[46,76,105,317,319,1605,1834,1836],[46,76,85,105,317,319,1605],[46,76,105,316,317,319,323,1326,1605],[46,76,105,316,317,319,323,1333,1605],[46,76,105,316,317,319,323,1331,1605],[46,76,105,316,317,319,1605],[46,76,105,303,317,319,1339,1605],[46,76,105,316,317,319,323,1487,1605],[46,76,105,317,319,1255,1605],[46,76,105,316,317,319,323,1241,1605],[46,52,76,105,317,319,1489,1605],[46,76,105,303,316,317,319,323,1338,1605],[46,76,105,316,317,319,323,1247,1605],[46,76,105,316,317,319,323,1584,1605],[46,52,76,105,317,319,1494,1605],[46,76,105,316,317,319,323,1605],[46,76,105,300,303,316,317,319,323,1339,1586,1605],[46,76,105,316,317,319,323,1597,1605],[46,76,105,316,317,319,323,1594,1605],[46,52,76,105,317,319,1605],[46,76,105,316,317,319,323,1600,1605],[46,76,105,316,317,319,323,1591,1605],[46,52,76,105,317,319,332,544,1605],[46,52,76,105,317,319,543,544,547,1605],[46,52,76,105,317,319,331,332,1323,1324,1325,1605],[46,52,76,105,317,319,325,329,1320,1605],[46,76,105,317,319,1605],[46,52,76,105,317,319,325,549,1321,1322,1605],[46,52,76,105,298,303,317,319,329,331,332,544,549,994,995,1322,1605],[46,52,76,105,298,317,319,332,370,539,995,1140,1596,1605],[46,52,76,105,298,317,319,332,370,539,995,1140,1593,1605],[46,52,76,105,298,317,319,323,332,370,539,544,995,1140,1590,1599,1605],[46,52,76,105,298,303,317,319,323,332,370,539,544,995,1140,1325,1589,1590,1605],[46,52,76,105,317,319,331,332,1325,1330,1605],[46,52,76,105,317,319,323,544,549,1605],[46,52,76,105,303,317,319,331,332,550,551,995,999,1140,1605],[46,52,76,105,303,317,319,329,331,332,336,544,546,549,550,551,994,995,999,1157,1237,1245,1328,1329,1605],[46,52,76,105,317,319,329,331,332,337,540,546,549,990,995,997,999,1000,1131,1132,1157,1341,1342,1343,1344,1345,1346,1347,1348,1349,1403,1404,1449,1451,1452,1605],[46,52,76,105,303,317,319,332,370,539,990,995,997,1140,1234,1605],[46,52,76,105,303,317,319,323,326,329,331,332,336,1605],[46,52,76,105,317,319,329,331,332,336,337,338,549,551,990,999,1134,1235,1344,1453,1473,1478,1479,1482,1605],[46,52,76,105,317,319,329,332,544,546,549,551,990,995,997,1140,1142,1605],[46,52,76,105,317,319,329,337,1605],[46,52,76,105,303,317,319,329,332,370,539,546,549,551,990,995,1132,1140,1158,1248,1485,1605],[46,52,76,105,317,319,329,995,1232,1448,1605],[46,52,76,105,317,319,1473,1477,1605],[46,52,75,76,105,317,319,329,332,339,995,997,1131,1140,1605],[46,52,76,105,317,319,1000,1131,1605],[46,52,76,105,296,317,319,337,546,549,1343,1605],[46,52,76,105,317,319,332,338,1605],[46,52,76,105,317,319,336,1605],[46,52,75,76,105,317,319,1605],[46,52,76,105,317,319,340,1605],[46,52,76,105,317,319,370,539,1605],[46,52,76,105,296,303,317,319,331,332,336,337,549,551,1157,1233,1235,1325,1483,1484,1486,1605],[46,52,76,105,317,319,332,544,546,999,1232,1605],[46,52,76,105,317,319,370,1450,1605],[46,52,76,105,317,319,329,337,338,1347,1402,1605],[46,52,76,105,317,319,331,332,338,339,549,995,1605],[46,76,105,317,319,1250,1251,1605],[46,52,76,105,317,319,338,540,549,996,1000,1131,1140,1350,1352,1353,1355,1357,1358,1605],[46,52,76,105,317,319,339,540,544,1354,1605],[46,52,76,105,317,319,339,540,1158,1605],[46,52,76,105,317,319,338,341,996,1350,1360,1362,1605],[46,52,76,105,317,319,338,540,543,549,996,1000,1131,1140,1350,1358,1371,1372,1373,1605],[46,52,76,105,116,117,118,317,319,338,370,540,546,549,995,1000,1131,1132,1141,1342,1343,1344,1345,1348,1349,1605],[46,52,76,105,317,319,338,540,544,549,1131,1140,1350,1357,1358,1367,1368,1369,1605],[46,52,76,105,317,319,540,544,1354,1605],[46,52,76,105,317,319,338,341,540,996,1140,1350,1360,1362,1380,1381,1400,1605],[46,52,76,105,317,319,338,341,370,540,544,546,549,995,996,1131,1350,1364,1365,1605],[46,52,76,105,317,319,338,339,370,540,549,995,1000,1140,1158,1245,1358,1605],[46,52,76,105,317,319,337,1359,1361,1363,1366,1370,1374,1375,1376,1378,1379,1401,1605],[46,52,76,105,317,319,338,341,549,996,1350,1357,1360,1605],[46,52,76,105,317,319,338,341,540,996,1000,1140,1350,1360,1362,1368,1377,1605],[46,52,76,105,317,319,332,546,995,1605],[46,52,76,105,317,319,549,1605],[46,52,76,105,303,317,319,329,331,332,338,997,1252,1605],[46,52,76,105,317,319,331,332,551,1140,1605],[46,52,76,105,317,319,323,332,546,1605],[46,52,76,105,296,298,317,319,323,329,331,332,549,551,552,553,991,993,999,1000,1132,1133,1135,1136,1137,1138,1139,1141,1164,1248,1249,1253,1254,1605],[46,76,105,317,319,994,1605],[46,52,76,105,317,319,331,332,551,1605],[46,52,76,105,317,319,323,331,332,370,539,549,551,990,995,999,1000,1140,1142,1144,1162,1163,1605],[46,52,76,105,303,317,319,552,1605],[46,52,76,105,298,303,317,319,323,549,551,1605],[46,76,105,317,319,992,1605],[46,52,76,105,317,319,336,550,1605],[46,52,76,105,298,303,317,319,549,1605],[46,52,76,105,303,317,319,331,332,370,539,544,549,990,995,997,1142,1157,1159,1238,1239,1240,1605],[46,52,76,105,317,319,331,332,1605],[46,52,76,105,317,319,331,332,370,546,551,990,995,997,999,1140,1450,1480,1499,1579,1581,1605],[46,52,76,105,317,319,326,334,1402,1605],[46,52,76,105,317,319,331,332,990,995,1140,1158,1237,1238,1240,1241,1245,1246,1605],[46,52,76,105,288,317,319,329,331,332,336,338,340,546,551,990,995,1157,1480,1481,1605],[46,52,75,76,105,317,319,331,332,336,540,544,549,995,996,997,998,999,1605],[46,52,76,105,303,317,319,331,332,549,551,995,1480,1605],[46,52,76,105,303,317,319,329,331,332,370,539,544,549,551,1142,1157,1480,1482,1497,1498,1582,1583,1605],[46,52,76,105,317,319,331,332,544,549,994,1134,1605],[46,52,76,105,296,303,317,319,331,332,549,551,1157,1233,1235,1605],[46,52,76,105,317,319,331,332,1165,1605],[46,52,76,105,303,317,319,323,549,990,995,1164,1166,1236,1247,1605],[46,52,75,76,105,317,319,329,331,332,340,549,997,1131,1605],[46,52,76,105,296,317,319,332,544,546,995,999,1140,1605],[46,52,76,105,303,317,319,323,331,332,551,1162,1165,1325,1605],[46,52,76,105,317,319,331,332,370,539,544,546,551,990,995,997,999,1140,1157,1158,1159,1160,1161,1605],[46,76,105,313,317,319,320,322,323,1605],[46,76,85,105,317,319,1605,1839,1843],[46,76,105,317,319,321,1605],[46,52,76,105,317,319,320,1605],[46,76,105,317,319,320,1338,1605],[46,76,105,317,319,336,509,1605],[46,76,105,317,319,509,1498,1605],[46,76,105,317,319,509,1605],[46,76,105,317,319,509,536,1143,1351,1605],[46,76,105,317,319,509,536,1143,1605],[46,76,105,317,319,509,1143,1605],[46,52,76,105,317,319,549,994,1605],[46,52,76,105,317,319,329,370,544,549,1132,1605],[46,52,76,105,296,317,319,370,549,1605],[46,52,76,105,317,319,370,544,995,1399,1605],[46,52,76,105,317,319,370,544,549,1605],[46,52,76,105,317,319,354,370,544,549,1605],[46,52,76,105,317,319,984,1605],[46,76,105,317,319,545,1605],[46,76,105,317,319,543,1605],[46,52,76,105,317,319,984,990,1605],[46,52,76,105,317,319,329,1136,1605],[46,52,75,76,105,317,319,549,1605],[46,76,105,317,334,1605],[46,76,105,317,333,1605],[46,76,105,317,580,1605],[46,52,76,105,317,1605],[46,52,76,105,317,581,588,589,590,591,1605],[46,52,76,105,317,588,592,1605],[46,52,76,105,317,590,592,1605],[46,49,76,105,317,580,1605],[46,76,105,317,1605],[46,76,105,317,537,1605],[46,76,105,317,537,538,1605],[46,76,105,317,370,509,536,1605],[46,76,105,317,1580,1605],[46,76,105,317,370,1579,1605],[46,76,105,317,1605,1850],[46,52,76,105,317,611,612,613,615,617,619,1605],[46,76,105,317,611,1605],[46,52,76,105,317,611,616,1605],[46,76,105,317,611,612,1605],[46,52,76,105,317,611,614,1605],[46,52,76,105,317,611,618,1605],[46,52,76,105,317,611,612,620,1605],[46,76,105,317,612,615,617,619,620,621,1605],[46,52,76,105,317,570,611,623,625,1605],[46,76,105,317,623,626,1605],[46,52,76,105,317,611,1605],[46,76,105,317,628,1605],[46,52,76,105,317,611,630,1605],[46,76,105,317,630,631,1605],[46,52,76,105,317,570,633,1605],[46,76,105,317,634,1605],[46,52,76,105,317,611,645,1605],[46,52,76,105,317,570,637,638,1605],[46,52,76,105,317,641,1605],[46,52,76,105,317,611,636,1605],[46,52,76,105,317,570,611,1605],[46,76,105,317,639,642,643,644,645,646,1605],[46,52,76,105,317,611,640,1605],[46,76,105,317,648,649,1605],[46,52,76,105,317,611,663,685,688,1605],[46,76,105,317,689,1605],[46,52,76,105,317,570,611,691,692,1605],[46,76,105,317,692,693,1605],[46,76,105,317,695,1605],[46,52,76,105,317,570,611,697,1605],[46,76,105,317,697,698,1605],[46,52,76,105,317,611,700,1605],[46,76,105,317,700,701,1605],[46,76,105,317,703,704,705,710,711,712,1605],[46,76,105,317,611,711,1605],[46,76,105,317,705,710,1605],[46,76,105,317,706,707,708,709,1605],[46,52,76,105,317,611,714,1605],[46,76,105,317,715,1605],[46,52,76,105,317,611,717,1605],[46,76,105,317,717,718,1605],[46,52,76,105,317,570,611,625,721,722,1605],[46,52,76,105,317,611,720,1605],[46,76,105,317,720,721,722,723,1605],[46,52,76,105,317,570,611,726,727,1605],[46,76,105,317,727,728,1605],[46,76,105,317,730,1605],[46,52,76,105,317,570,611,734,735,736,1605],[46,52,76,105,317,611,663,1605],[46,76,105,317,735,736,737,738,1605],[46,52,76,105,317,570,611,743,744,1605],[46,52,76,105,317,611,742,1605],[46,76,105,317,743,744,745,1605],[46,52,76,105,317,570,626,1605],[46,76,105,317,747,1605],[46,52,76,105,317,611,749,1605],[46,76,105,317,749,750,1605],[46,76,105,317,752,1605],[46,52,76,105,317,611,663,667,682,764,1605],[46,76,105,317,765,1605],[46,52,76,105,317,757,1605],[46,52,76,105,317,611,755,757,758,760,762,763,1605],[46,52,76,105,317,611,755,756,1605],[46,76,105,317,763,764,767,768,1605],[46,52,76,105,317,611,755,758,759,1605],[46,52,76,105,317,611,761,1605],[46,52,76,105,317,611,754,1605],[46,52,76,105,317,570,611,770,1605],[46,76,105,317,770,771,1605],[46,76,105,317,773,774,1605],[46,76,105,317,776,1605],[46,52,76,105,317,611,667,778,779,1605],[46,76,105,317,779,780,1605],[46,76,105,317,782,783,1605],[46,52,76,105,317,611,667,785,1605],[46,76,105,317,785,786,1605],[46,76,105,317,788,1605],[46,52,76,105,317,611,663,790,1605],[46,76,105,317,791,1605],[46,76,105,317,713,1605],[46,76,105,317,793,794,1605],[46,52,76,105,317,673,1605],[46,76,105,317,673,1605],[46,76,105,317,671,672,673,674,675,1605],[46,76,105,317,796,1605],[46,52,76,105,317,611,798,1605],[46,52,76,105,317,570,611,799,1605],[46,76,105,317,798,799,800,801,1605],[46,52,76,105,317,611,740,1605],[46,76,105,317,740,741,1605],[46,52,76,105,317,570,611,633,1605],[46,76,105,317,803,1605],[46,52,76,105,317,611,682,805,806,1605],[46,52,76,105,317,682,1605],[46,76,105,317,805,806,807,1605],[46,52,76,105,317,611,809,1605],[46,76,105,317,809,810,1605],[46,76,105,317,570,611,622,625,627,629,632,635,647,650,663,667,682,688,690,694,696,699,702,713,716,719,724,729,731,739,742,746,748,751,753,766,769,772,775,777,778,781,784,787,789,792,795,797,802,804,808,811,815,817,821,822,825,827,832,834,837,840,851,854,859,861,864,867,870,873,877,880,883,886,890,896,899,902,905,909,912,923,925,928,931,937,941,944,955,957,960,964,967,973,979,981,983,1605],[46,76,105,317,813,814,1605],[46,52,76,105,317,611,812,813,1605],[46,52,76,105,317,611,812,1605],[46,76,105,317,733,1605],[46,52,76,105,317,611,732,1605],[46,76,105,317,652,654,656,658,660,661,662,1605],[46,52,76,105,317,570,611,652,654,656,658,659,660,1605],[46,52,76,105,317,611,655,1605],[46,52,76,105,317,611,653,1605],[46,52,76,105,317,611,651,1605],[46,52,76,105,317,611,652,654,656,657,1605],[46,52,76,105,317,611,658,661,1605],[46,76,105,317,816,1605],[46,52,76,105,317,570,611,663,1605],[46,76,105,317,818,823,824,1605],[46,52,76,105,317,611,821,822,1605],[46,76,105,317,826,1605],[46,76,105,317,828,830,831,1605],[46,52,76,105,317,570,611,828,830,1605],[46,52,76,105,317,611,829,1605],[46,76,105,317,611,828,1605],[46,76,105,317,624,1605],[46,76,105,317,833,1605],[46,52,76,105,317,611,625,1605],[46,76,105,317,835,836,1605],[46,76,105,317,838,839,1605],[46,76,105,317,842,843,845,847,849,850,1605],[46,52,76,105,317,570,611,682,842,843,845,847,848,849,1605],[46,52,76,105,317,611,841,1605],[46,52,76,105,317,570,611,844,1605],[46,52,76,105,317,611,846,1605],[46,76,105,317,852,853,1605],[46,52,76,105,317,611,667,852,1605],[46,52,76,105,317,611,663,855,1605],[46,76,105,317,856,857,858,1605],[46,52,76,105,317,611,684,685,856,857,1605],[46,76,105,317,860,1605],[46,52,76,105,317,611,663,684,1605],[46,76,105,317,862,863,1605],[46,52,76,105,317,570,611,862,1605],[46,76,105,317,865,866,1605],[46,52,76,105,317,611,865,1605],[46,76,105,317,868,869,1605],[46,52,76,105,317,611,663,822,868,1605],[46,76,105,317,872,1605],[46,52,76,105,317,570,611,871,1605],[46,76,105,317,874,875,876,1605],[46,52,76,105,317,611,741,874,875,1605],[46,76,105,317,725,726,1605],[46,52,76,105,317,570,611,725,1605],[46,76,105,317,878,879,1605],[46,52,76,105,317,611,822,878,1605],[46,76,105,317,678,679,680,681,1605],[46,52,76,105,317,611,667,676,678,679,680,1605],[46,52,76,105,317,611,677,1605],[46,76,105,317,881,882,1605],[46,52,76,105,317,881,1605],[46,76,105,317,884,885,1605],[46,52,76,105,317,611,884,1605],[46,76,105,317,887,888,889,1605],[46,52,76,105,317,570,611,734,887,888,1605],[46,76,105,317,894,895,1605],[46,52,76,105,317,611,892,893,1605],[46,52,76,105,317,611,891,1605],[46,76,105,317,898,1605],[46,52,76,105,317,611,897,1605],[46,76,105,317,900,901,1605],[46,52,76,105,317,570,611,900,1605],[46,76,105,317,903,904,1605],[46,52,76,105,317,611,903,1605],[46,76,105,317,684,685,686,687,1605],[46,52,76,105,317,611,667,684,1605],[46,52,76,105,317,611,668,684,1605],[46,52,76,105,317,611,667,670,682,1605],[46,52,76,105,317,663,669,683,1605],[46,76,105,317,906,907,908,1605],[46,52,76,105,317,611,906,1605],[46,76,105,317,910,911,1605],[46,52,76,105,317,611,910,1605],[46,76,105,317,592,611,1605],[46,76,105,317,921,922,1605],[46,52,76,105,317,611,915,1605],[46,52,76,105,317,611,667,914,916,918,920,1605],[46,52,76,105,317,611,919,1605],[46,52,76,105,317,611,667,913,1605],[46,52,76,105,317,611,916,917,1605],[46,76,105,317,924,1605],[46,76,105,317,926,927,1605],[46,52,76,105,317,611,926,1605],[46,76,105,317,929,930,1605],[46,52,76,105,317,611,929,1605],[46,76,105,317,932,933,935,936,1605],[46,52,76,105,317,611,932,1605],[46,52,76,105,317,570,611,933,934,935,1605],[46,76,105,317,938,939,940,1605],[46,52,76,105,317,570,611,734,938,939,1605],[46,76,105,317,942,943,1605],[46,52,76,105,317,611,942,1605],[46,76,105,317,945,947,949,951,954,1605],[46,52,76,105,317,611,950,1605],[46,76,105,317,611,945,1605],[46,52,76,105,317,570,611,945,947,949,951,952,953,1605],[46,52,76,105,317,611,945,946,1605],[46,52,76,105,317,611,948,1605],[46,52,76,105,317,611,945,954,1605],[46,76,105,317,633,956,1605],[46,76,105,317,820,1605],[46,52,76,105,317,611,663,819,1605],[46,76,105,317,819,1605],[46,76,105,317,958,959,1605],[46,52,76,105,317,611,958,1605],[46,76,105,317,962,963,1605],[46,52,76,105,317,570,611,962,1605],[46,52,76,105,317,611,961,1605],[46,76,105,317,965,966,1605],[46,52,76,105,317,611,957,965,1605],[46,52,76,105,317,611,966,1605],[46,76,105,317,968,969,970,971,972,1605],[46,76,105,317,570,667,676,968,970,971,1605],[46,52,76,105,317,611,676,969,1605],[46,52,76,105,317,970,1605],[46,76,105,317,974,978,1605],[46,52,76,105,317,611,974,975,1605],[46,52,76,105,317,611,974,976,977,1605],[46,52,76,105,317,664,1605],[46,76,105,317,664,665,666,1605],[46,76,105,317,980,1605],[46,76,105,317,982,1605],[46,52,76,105,317,1429,1605],[46,76,105,317,1430,1605],[46,52,76,105,317,984,1420,1424,1426,1427,1428,1605],[46,76,105,317,984,1605],[46,52,76,105,317,984,1421,1605],[46,76,105,317,1429,1605],[46,52,76,105,317,984,1422,1425,1605],[46,52,76,105,317,984,1420,1422,1605],[46,52,76,105,317,984,1422,1423,1605],[46,52,76,105,317,1405,1429,1433,1605],[46,76,105,317,1434,1605],[46,52,76,105,317,984,1429,1432,1605],[46,76,105,317,1433,1605],[46,76,105,317,1436,1605],[46,52,76,105,317,984,1415,1605],[46,76,105,317,1417,1418,1419,1605],[46,52,76,105,317,984,1405,1416,1417,1418,1605],[46,76,105,317,1438,1605],[46,76,105,317,1440,1441,1605],[46,52,76,105,317,984,1440,1605],[46,76,105,317,1443,1444,1605],[46,52,76,105,317,984,1443,1605],[46,76,105,317,1414,1420,1431,1435,1437,1439,1442,1445,1446,1447,1605],[46,76,105,317,1405,1605],[46,76,105,317,1406,1407,1408,1409,1410,1411,1412,1413,1605],[46,76,105,317,1174,1175,1176,1177,1178,1179,1180,1181,1182,1183,1184,1185,1186,1187,1188,1189,1190,1191,1192,1194,1195,1196,1197,1198,1199,1200,1201,1202,1203,1204,1205,1206,1207,1208,1209,1210,1211,1212,1213,1215,1216,1217,1218,1219,1220,1221,1222,1223,1224,1225,1226,1227,1228,1229,1230,1231,1605],[46,76,105,317,1177,1605],[46,76,105,317,1214,1605],[46,76,105,317,1193,1605],[46,76,105,317,1167,1168,1169,1170,1171,1172,1173,1605],[46,52,76,105,317,984,986,1605],[46,52,76,105,317,984,985,1605],[46,76,105,317,986,1605],[46,76,105,317,986,987,988,989,1605],[46,52,76,105,317,986,1605],[46,76,105,317,571,597,610,1605],[46,52,76,105,317,601,1605],[46,76,105,317,601,1605],[46,76,105,317,601,604,605,606,607,608,609,1605],[46,52,76,105,317,581,601,611,1605],[46,52,76,105,317,576,597,598,1605],[46,76,105,317,572,573,574,575,576,578,598,599,600,1605],[46,76,105,317,573,1605],[46,76,105,317,575,1605],[46,52,76,105,317,574,575,1605],[46,52,76,105,317,572,574,575,577,578,579,597,1605],[46,76,105,317,602,603,1605],[46,76,105,317,586,610,1605],[46,76,105,317,581,1605],[46,52,76,105,317,592,601,1605],[46,76,105,317,581,586,587,592,593,594,595,596,1605],[46,76,105,317,582,1605],[46,76,105,317,583,1605],[46,76,105,317,583,584,585,1605],[46,76,105,317,581,586,1605],[46,76,105,317,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,1605],[46,76,105,317,1605,1782,1783],[46,76,105,317,1605,1783,1784,1785,1786],[46,76,105,112,317,1605,1783,1785],[46,76,105,317,1605,1782,1784],[46,76,105,112,317,1605],[46,76,105,112,317,1605,1778],[46,76,105,317,1605,1778,1779,1780,1781],[46,76,105,317,1605,1778,1780],[46,76,105,317,1605,1779],[46,76,93,105,112,317,1605,1787,1788,1789,1792],[46,76,105,317,1605,1788,1789,1791],[46,75,76,105,112,317,1605,1787,1788,1789,1790],[46,76,105,317,1605,1789],[46,76,105,317,1605,1787,1788],[46,76,105,112,317,1605,1787],[46,76,105,317,1605,1659,1678],[46,76,105,317,1605,1660,1661,1663,1664,1665,1666,1667,1668,1669,1670,1671,1672,1673,1674,1675,1676,1677],[46,76,105,317,1605,1608,1639,1659],[46,76,105,317,1605,1629,1639],[46,76,105,317,1605,1606],[46,76,105,317,1605,1606,1616],[46,76,105,317,1605,1629],[46,76,105,317,1605,1606,1662],[46,76,105,317,1605,1606,1614],[46,76,105,317,1605,1606,1629],[46,76,105,317,1605,1681,1682,1683,1687],[46,76,105,317,1605,1679],[46,76,105,317,1605,1679,1681],[46,76,105,317,1605,1686],[46,76,105,317,1603,1604,1605,1827,1828,1830,1832,1834,1835],[46,76,105,316,317,1605,1679,1833],[46,76,105,317,1605,1679,1826],[46,76,105,317,1605,1680,1688,1825],[46,76,105,317,1605,1679,1825],[46,76,105,317,1605,1679,1829],[46,76,105,317,1605,1679,1831],[46,76,105,317,1605,1825],[46,76,105,316,317,1605,1833],[46,76,105,316,317,1603,1605,1728],[46,76,105,317,1605,1689,1691,1692,1693,1694,1696,1698,1700,1701,1702,1704,1706,1708,1709,1711,1713,1715,1717,1719,1721,1823,1824],[46,76,105,317,1605,1728],[46,76,105,317,1605,1728,1822],[46,76,105,317,1605,1679,1695],[46,76,105,317,1605,1680,1688,1694],[46,76,105,317,1605,1662,1679],[46,76,105,317,1605,1679,1718],[46,76,105,317,1605,1679,1697],[46,76,105,317,1605,1694],[46,76,105,317,1605,1679,1716],[46,76,105,317,1605,1679,1699],[46,76,105,317,1605,1679,1712],[46,76,105,317,1605,1679,1705],[46,76,105,317,1605,1679,1703],[46,76,105,317,1605,1679,1707],[46,76,105,317,1605,1679,1695,1714],[46,76,105,317,1605,1680,1688,1694,1695],[46,76,105,317,1605,1679,1720],[46,76,105,317,1605,1679,1710],[46,76,105,317,1605,1688],[46,76,105,317,1605,1690],[46,76,105,317,1605,1730,1801,1802,1803,1805,1806,1807,1808,1809,1810,1812,1813,1819,1820,1821],[46,76,105,317,1605,1679,1806],[46,76,105,317,1605,1801],[46,76,105,317,1605,1800],[46,76,105,317,1605,1679,1801],[46,76,105,317,1605,1679,1729],[46,76,105,317,1605,1679,1804],[46,76,105,317,1605,1679,1800],[46,76,105,317,1605,1728,1811],[46,76,105,317,1605,1679,1728,1801],[46,76,105,317,1605,1799,1801],[46,76,105,317,1605,1679,1814],[46,76,105,317,1605,1814,1815,1816,1817,1818],[46,76,105,317,1605,1814],[46,76,105,317,1605,1803,1811],[46,76,105,317,1605,1801,1803],[46,76,105,317,335,1605],[46,76,105,317,1003,1004,1605,1684,1685],[46,76,105,317,1003,1004,1605],[46,76,105,317,1001,1605],[46,76,105,317,1605,1852,1855],[46,76,105,317,1605,1851],[46,76,105,317,1145,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1605],[46,76,105,317,1145,1146,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1605],[46,76,105,317,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1605],[46,76,105,317,1145,1146,1147,1149,1150,1151,1152,1153,1154,1155,1156,1157,1605],[46,76,105,317,1145,1146,1147,1148,1150,1151,1152,1153,1154,1155,1156,1157,1605],[46,76,105,317,1145,1146,1147,1148,1149,1151,1152,1153,1154,1155,1156,1157,1605],[46,76,105,317,1145,1146,1147,1148,1149,1150,1152,1153,1154,1155,1156,1157,1605],[46,76,105,317,1145,1146,1147,1148,1149,1150,1151,1153,1154,1155,1156,1157,1605],[46,76,105,317,1145,1146,1147,1148,1149,1150,1151,1152,1154,1155,1156,1157,1605],[46,76,105,317,1145,1146,1147,1148,1149,1150,1151,1152,1153,1155,1156,1157,1605],[46,76,105,317,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1156,1157,1605],[46,76,105,317,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1157,1605],[46,76,105,317,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1605],[46,59,76,105,317,1605],[46,62,76,105,317,1605],[46,63,68,76,96,105,317,1605],[46,64,75,76,83,93,104,105,317,1605],[46,64,65,75,76,83,105,317,1605],[46,66,76,105,317,1605],[46,67,68,76,84,105,317,1605],[46,68,76,93,101,105,317,1605],[46,69,71,75,76,83,105,317,1605],[46,70,76,105,317,1605],[46,71,72,76,105,317,1605],[46,75,76,105,317,1605],[46,73,75,76,105,317,1605],[46,75,76,77,93,104,105,317,1605],[46,75,76,77,90,93,96,105,317,1605],[46,76,105,109,317,1605],[46,71,75,76,78,83,93,104,105,317,1605],[46,75,76,78,79,83,93,101,104,105,317,1605],[46,76,78,80,93,101,104,105,317,1605],[46,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,317,1605],[46,75,76,81,105,317,1605],[46,76,82,104,105,317,1605],[46,71,75,76,83,93,105,317,1605],[46,76,84,105,317,1605],[46,76,85,105,317,1605],[46,62,76,86,105,317,1605],[46,76,87,103,105,109,317,1605],[46,76,88,105,317,1605],[46,76,89,105,317,1605],[46,75,76,90,91,105,317,1605],[46,76,90,92,105,107,317,1605],[46,63,75,76,93,94,95,96,105,317,1605],[46,63,76,93,95,105,317,1605],[46,76,93,94,105,317,1605],[46,76,96,105,317,1605],[46,76,97,105,317,1605],[46,75,76,99,100,105,317,1605],[46,76,99,100,105,317,1605],[46,68,76,83,93,101,105,317,1605],[46,76,102,105,317,1605],[46,76,83,103,105,317,1605],[46,63,76,78,89,104,105,317,1605],[46,68,76,105,317,1605],[46,76,93,105,106,317,1605],[46,76,105,107,317,1605],[46,76,105,108,317,1605],[46,63,68,75,76,77,86,93,104,105,107,109,317,1605],[46,76,93,105,110,317,1605],[46,52,76,105,116,117,118,317,1605],[46,52,76,105,116,117,317,1605],[46,52,56,76,105,115,272,312,317,992,1605],[46,52,56,76,105,114,272,312,317,992,1605],[46,48,49,50,51,76,105,317,1605],[46,76,105,317,404,405,406,407,408,409,410,411,412,1605],[46,76,105,317,1605,1634],[46,52,76,105,317,1095,1605],[46,52,76,105,317,1083,1093,1094,1605],[46,76,105,317,1122,1605],[46,52,76,105,317,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1128,1605],[46,76,105,317,1107,1122,1605],[46,52,76,105,317,1122,1124,1125,1127,1128,1605],[46,52,76,105,317,1124,1127,1605],[46,49,52,76,105,317,1122,1127,1605],[46,52,76,105,317,1096,1127,1128,1605],[46,76,105,317,1102,1107,1122,1127,1128,1129,1130,1605],[46,52,76,105,317,1122,1123,1126,1128,1605],[46,76,105,317,1605,1735,1736,1740,1767,1768,1770,1771,1772,1774,1775],[46,76,105,317,1605,1733,1734],[46,76,105,317,1605,1733],[46,76,105,317,1605,1735,1775],[46,76,105,317,1605,1735,1736,1772,1773,1775],[46,76,105,317,1605,1775],[46,76,105,317,1605,1732,1775,1776],[46,76,105,317,1605,1735,1736,1774,1775],[46,76,105,317,1605,1735,1736,1738,1739,1774,1775],[46,76,105,317,1605,1735,1736,1737,1774,1775],[46,76,105,317,1605,1735,1736,1740,1767,1768,1769,1770,1771,1774,1775],[46,76,105,317,1605,1732,1735,1736,1740,1772,1774],[46,76,105,317,1605,1740,1775],[46,76,105,317,1605,1742,1743,1744,1745,1746,1747,1748,1749,1750,1751,1775],[46,76,105,317,1605,1765,1775],[46,76,105,317,1605,1741,1752,1760,1761,1762,1763,1764,1766],[46,76,105,317,1605,1745,1775],[46,76,105,317,1605,1753,1754,1755,1756,1757,1758,1759,1775],[46,76,105,317,1319,1605],[46,76,105,317,1277,1605],[46,76,105,317,1276,1277,1605],[46,76,105,317,1280,1605],[46,76,105,317,1278,1279,1280,1281,1282,1283,1284,1285,1605],[46,76,105,317,1259,1270,1605],[46,76,105,317,1276,1287,1605],[46,76,105,317,1257,1270,1271,1272,1275,1605],[46,76,105,317,1274,1276,1605],[46,76,105,317,1259,1261,1262,1605],[46,76,105,317,1263,1270,1276,1605],[46,76,105,317,1276,1605],[46,76,105,317,1270,1276,1605],[46,76,105,317,1263,1273,1274,1277,1605],[46,76,105,317,1259,1263,1270,1319,1605],[46,76,105,317,1272,1605],[46,76,105,317,1260,1263,1271,1272,1274,1275,1276,1277,1287,1288,1289,1290,1291,1292,1605],[46,76,105,317,1263,1270,1605],[46,76,105,317,1259,1263,1605],[46,76,105,317,1259,1263,1264,1294,1605],[46,76,105,317,1264,1269,1295,1296,1605],[46,76,105,317,1264,1295,1605],[46,76,105,317,1286,1293,1297,1301,1309,1317,1605],[46,76,105,317,1298,1299,1300,1605],[46,76,105,317,1257,1276,1605],[46,76,105,317,1298,1605],[46,76,105,317,1276,1298,1605],[46,76,105,317,1268,1302,1303,1304,1305,1306,1308,1605],[46,76,105,317,1259,1263,1270,1605],[46,76,105,317,1259,1263,1319,1605],[46,76,105,317,1259,1263,1270,1276,1288,1290,1298,1307,1605],[46,76,105,317,1310,1312,1313,1314,1315,1316,1605],[46,76,105,317,1274,1605],[46,76,105,317,1311,1605],[46,76,105,317,1311,1319,1605],[46,76,105,317,1260,1274,1605],[46,76,105,317,1315,1605],[46,76,105,317,1270,1318,1605],[46,76,105,317,1258,1259,1260,1261,1262,1263,1264,1265,1266,1267,1268,1269,1605],[46,76,105,317,1261,1605],[46,76,105,317,526,1605],[46,76,105,317,528,529,530,531,532,533,534,1605],[46,76,105,317,517,1605],[46,76,105,317,518,526,527,535,1605],[46,76,105,317,519,1605],[46,76,105,317,513,1605],[46,76,105,317,510,511,512,513,514,515,516,519,520,521,522,523,524,525,1605],[46,76,105,317,518,520,1605],[46,76,105,317,521,526,1605],[46,76,105,317,376,1605],[46,76,105,317,375,376,381,1605],[46,76,105,317,377,378,379,380,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,1605],[46,76,105,317,376,413,1605],[46,76,105,317,376,453,1605],[46,76,105,317,375,1605],[46,76,105,317,371,372,373,374,375,376,381,501,502,503,504,508,1605],[46,76,105,317,381,1605],[46,76,105,317,373,506,507,1605],[46,76,105,317,375,505,1605],[46,76,105,317,376,381,1605],[46,76,105,317,371,372,1605],[46,76,104,105,317,1605,1797],[46,76,105,317,1605,1685,1731,1776],[46,76,105,317,1605,1685,1777],[46,76,105,317,1605,1728,1777,1798],[46,76,105,317,328,1605],[46,76,105,317,327,1605],[46,76,105,317,329,1136,1137,1138,1605],[46,76,105,317,329,1136,1137,1139,1605],[46,76,105,317,329,1137,1138,1139,1605],[46,76,105,317,329,1136,1138,1139,1605],[46,76,105,317,1454,1605],[46,76,105,317,1454,1455,1605],[46,76,105,317,1605,1848,1854],[46,76,105,112,317,1605,1794,1795,1796],[46,76,105,317,1605,1794,1795],[46,76,105,317,1605,1794],[46,76,105,112,317,1605,1793],[46,76,105,317,1044,1045,1605],[46,76,105,317,1002,1033,1035,1037,1078,1605],[46,76,105,317,1001,1002,1003,1004,1033,1035,1037,1043,1044,1078,1605],[46,76,105,317,1605,1852],[46,76,105,317,1605,1633,1853],[46,76,105,317,452,1605],[46,76,105,317,1006,1007,1605],[46,76,105,317,1001,1005,1006,1008,1033,1035,1037,1078,1605],[46,76,105,317,1002,1004,1005,1032,1033,1035,1037,1078,1605],[46,76,105,317,1008,1031,1033,1035,1605],[46,76,105,317,1001,1002,1004,1005,1008,1031,1033,1034,1035,1037,1078,1605],[46,76,105,317,1001,1008,1031,1035,1605],[46,76,105,317,1002,1004,1005,1033,1035,1036,1037,1078,1605],[46,76,105,317,1008,1031,1035,1037,1605],[46,76,105,317,1002,1005,1033,1035,1037,1051,1052,1076,1077,1078,1605],[46,76,105,317,1002,1033,1035,1037,1051,1078,1605],[46,76,105,317,1002,1005,1033,1035,1037,1051,1078,1605],[46,76,105,317,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1605],[46,76,105,317,1002,1005,1033,1035,1037,1050,1052,1078,1605],[46,76,105,317,1009,1010,1030,1605],[46,76,105,317,1005,1009,1033,1035,1037,1078,1605],[46,76,105,317,1005,1033,1035,1037,1078,1605],[46,76,105,317,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1605],[46,76,105,317,1001,1005,1031,1033,1035,1037,1078,1605],[46,57,76,105,317,1605],[46,76,105,276,317,1605],[46,76,105,278,279,280,281,317,1605],[46,76,105,283,317,1605],[46,76,105,121,130,137,272,317,1605],[46,76,105,121,128,132,139,150,317,1605],[46,76,105,130,317,1605],[46,76,105,130,249,317,1605],[46,76,105,183,198,213,315,317,1605],[46,76,105,221,317,1605],[46,76,105,113,121,130,134,138,150,186,205,215,272,317,1605],[46,76,105,121,130,136,170,180,246,247,315,317,1605],[46,76,105,136,315,317,1605],[46,76,105,130,180,181,315,317,1605],[46,76,105,130,136,170,315,317,1605],[46,76,105,315,317,1605],[46,76,105,136,137,315,317,1605],[46,62,76,105,112,317,1605],[46,52,76,105,199,200,218,219,317,1605],[46,76,105,190,317,1605],[46,52,76,105,115,317,1605],[46,76,105,189,191,317,1336,1605],[46,52,76,105,199,216,317,1605],[46,76,105,195,219,300,301,317,1605],[46,76,105,144,299,317,1605],[46,62,76,105,112,144,189,190,191,317,1605],[46,52,76,105,216,219,317,1605],[46,76,105,216,218,317,1605],[46,76,105,216,217,219,317,1605],[46,62,76,105,112,131,139,186,187,317,1605],[46,76,105,206,317,1605],[46,52,76,105,122,293,317,1605],[46,52,76,104,105,112,317,1605],[46,52,76,105,136,168,317,1605],[46,52,76,105,136,317,1605],[46,76,105,166,171,317,1605],[46,52,76,105,167,275,317,1605],[46,76,105,317,541,1605],[46,52,56,76,78,105,112,114,115,272,310,311,317,992,1605],[46,76,105,272,317,1605],[46,76,105,120,317,1605],[46,76,105,265,266,267,268,269,270,317,1605],[46,76,105,267,317,1605],[46,52,76,105,273,275,317,1605],[46,52,76,105,275,317,1605],[46,76,78,105,112,131,275,317,1605],[46,76,78,105,112,129,139,140,158,188,192,193,215,216,317,1605],[46,76,105,187,188,192,199,201,202,203,204,207,208,209,210,211,212,315,317,1605],[46,52,76,89,105,112,130,158,160,162,186,215,272,315,317,1605],[46,76,78,105,112,131,132,144,145,189,317,1605],[46,76,78,105,112,130,132,317,1605],[46,76,78,93,105,112,129,131,132,317,1605],[46,76,78,89,104,105,112,120,122,129,130,131,132,136,139,140,141,151,152,154,157,158,160,161,162,185,186,216,224,226,229,231,234,236,237,238,272,317,1605],[46,76,78,93,105,112,317,1605],[46,76,105,121,122,123,129,272,275,315,317,1605],[46,76,78,93,104,105,112,126,248,250,251,315,317,1605],[46,76,89,104,105,112,126,129,131,148,152,154,155,156,160,186,229,239,241,246,261,262,317,1605],[46,76,105,130,134,186,317,1605],[46,76,105,129,130,317,1605],[46,76,105,141,230,317,1605],[46,76,105,232,317,1605],[46,76,105,230,317,1605],[46,76,105,232,235,317,1605],[46,76,105,232,233,317,1605],[46,76,105,125,126,317,1605],[46,76,105,125,163,317,1605],[46,76,105,125,317,1605],[46,76,105,127,141,228,317,1605],[46,76,105,227,317,1605],[46,76,105,126,127,317,1605],[46,76,105,127,225,317,1605],[46,76,105,126,317,1605],[46,76,105,215,317,1605],[46,76,78,105,112,129,140,159,178,183,194,197,214,216,317,1605],[46,76,105,172,173,174,175,176,177,195,196,219,273,317,1605],[46,76,105,223,317,1605],[46,76,78,105,112,129,140,159,164,220,222,224,272,275,317,1605],[46,76,78,104,105,112,122,129,130,185,317,1605],[46,76,105,182,317,1605],[46,76,78,105,112,254,260,317,1605],[46,76,105,151,185,275,317,1605],[46,76,105,246,255,261,264,317,1605],[46,76,78,105,134,246,254,256,317,1605],[46,76,105,121,130,151,161,258,317,1605],[46,76,78,105,112,130,136,161,242,252,253,257,258,259,317,1605],[46,76,105,113,158,159,272,275,317,1605],[46,76,78,89,104,105,112,127,129,131,134,138,139,140,148,151,152,154,155,156,157,160,185,186,226,239,240,275,317,1605],[46,76,78,105,112,129,130,134,241,263,317,1605],[46,76,78,105,112,131,139,317,1605],[46,52,76,78,89,105,112,120,122,129,132,140,157,158,160,162,223,272,275,317,1605],[46,76,78,89,104,105,112,124,127,128,131,317,1605],[46,76,105,125,184,317,1605],[46,76,78,105,112,125,139,140,317,1605],[46,76,78,105,112,130,141,317,1605],[46,76,78,105,112,317,1605],[46,76,105,144,317,1605],[46,76,105,143,317,1605],[46,76,105,145,317,1605],[46,76,105,130,142,144,148,317,1605],[46,76,105,130,142,144,317,1605],[46,76,78,105,112,124,130,131,145,146,147,317,1605],[46,52,76,105,216,217,218,317,1605],[46,76,105,179,317,1605],[46,52,76,105,122,317,1605],[46,52,76,105,154,317,1605],[46,52,76,105,113,157,162,272,275,317,1605],[46,76,105,122,293,294,317,1605],[46,52,76,105,171,317,1605],[46,52,76,89,104,105,112,120,165,167,169,170,275,317,1605],[46,76,105,131,136,154,317,1605],[46,76,89,105,112,317,1605],[46,76,105,153,317,1605],[46,52,76,78,89,105,112,120,171,180,272,273,274,317,1605],[46,47,52,53,54,55,76,105,114,115,272,312,317,992,1605],[46,76,105,243,244,245,317,1605],[46,76,105,243,317,1605],[46,76,105,285,317,1605],[46,76,105,287,317,1605],[46,76,105,289,317,1605],[46,76,105,317,542,1605],[46,76,105,317,1356,1605],[46,76,105,291,317,1605],[46,76,105,317,1337,1605],[46,76,105,295,1605],[46,76,105,295,317,1605],[46,56,58,76,105,272,277,282,284,286,288,290,292,296,298,303,304,306,313,314,315,317,1605],[46,76,105,297,317,1605],[46,76,105,302,317,1605],[46,76,105,167,317,1605],[46,76,105,305,317,1605],[46,62,76,105,145,146,147,148,307,308,309,312,317,1605],[46,52,56,76,78,80,89,105,112,114,115,116,118,120,132,264,271,275,312,317,992,1605],[46,76,105,317,1605,1607,1608,1612],[46,76,105,317,1605,1615,1659],[46,76,105,317,1605,1608,1609],[46,76,105,317,1605,1607,1611],[46,76,105,317,1605,1606,1607,1608,1610],[46,76,105,317,1605,1616,1617,1628,1629],[46,76,105,317,1605,1615],[46,76,105,317,1605,1608,1615,1616,1617,1626,1628],[46,76,105,317,1605,1613,1614,1616],[46,76,105,317,1605,1615,1616],[46,64,76,105,112,317,1605,1608,1615,1617,1623,1626],[46,76,105,317,1605,1606,1608,1614,1615,1616,1617,1620,1621,1626,1629,1630,1631,1632,1638,1639,1641,1642,1644,1645,1646,1647,1648,1650,1651,1652,1653,1655,1656,1657,1658],[46,76,105,317,1605,1606,1644],[46,76,105,317,1605,1606,1615],[46,76,105,317,1605,1606,1616,1640],[46,76,105,112,317,1605,1608,1615,1616,1617,1624,1625],[46,76,105,317,1605,1616,1621],[46,76,105,317,1605,1608,1616,1625],[46,76,105,317,1605,1608],[46,76,105,317,1605,1608,1621],[46,76,105,317,1605,1608,1616,1623],[46,76,105,317,1605,1608,1615,1616,1621,1622],[46,76,105,317,1605,1637,1654],[46,76,105,317,1605,1617,1637],[46,76,105,317,1605,1608,1615,1617,1624,1626,1636],[46,76,105,317,1605,1608,1616,1617,1629],[46,76,105,317,1605,1649],[46,76,105,317,1605,1608,1615,1635],[46,76,105,112,317,1605,1644],[46,76,105,317,1605,1643],[46,76,105,317,1605,1608,1615,1616,1618,1619,1620],[46,76,105,317,1605,1608,1616,1621],[46,76,105,317,1605,1633,1637],[46,76,105,317,1605,1616],[46,76,105,317,1605,1615,1616,1627],[46,76,105,317,1038,1039,1040,1041,1042,1605],[46,76,105,317,1038,1039,1605],[46,76,105,317,1038,1605],[46,52,76,105,317,1382,1605],[46,76,105,317,1382,1383,1384,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1397,1398,1605],[46,76,105,317,1456,1474,1475,1476,1605],[46,52,76,105,317,1456,1605],[46,52,76,105,317,1462,1605],[46,76,105,317,1457,1458,1463,1605],[46,76,105,317,1465,1467,1468,1469,1471,1605],[46,76,105,317,1456,1462,1605],[46,76,105,317,1466,1605],[46,76,105,317,1462,1465,1605],[46,76,105,317,1456,1605],[46,76,105,317,1462,1605],[46,76,105,317,1470,1605],[46,76,105,317,1462,1464,1472,1605],[46,52,76,105,317,1459,1605],[46,76,105,317,1459,1460,1461,1605],[46,52,76,105,317,356,1605],[46,76,105,317,356,357,358,360,361,362,363,364,365,366,369,1605],[46,76,105,317,356,1605],[46,76,105,317,359,1605],[46,52,76,105,317,354,356,1605],[46,76,105,317,351,352,354,1605],[46,76,105,317,347,350,352,354,1605],[46,76,105,317,351,354,1605],[46,52,76,105,317,342,343,344,347,348,349,351,352,353,354,1605],[46,76,105,317,344,347,348,349,350,351,352,353,354,355,1605],[46,76,105,317,351,1605],[46,76,105,317,345,351,352,1605],[46,76,105,317,345,346,1605],[46,76,105,317,350,352,353,1605],[46,76,105,317,350,1605],[46,76,105,317,342,347,352,353,1605],[46,76,105,317,367,368,1605],[46,76,105,317,1046,1092,1605],[46,76,105,317,1002,1033,1035,1037,1046,1078,1083,1085,1091,1605],[46,52,56,76,105,114,115,272,312,317,1605],[46,76,105,317,1002,1033,1035,1037,1078,1083,1605],[46,76,105,317,1078,1084,1605],[46,76,105,317,1002,1005,1033,1035,1037,1050,1078,1083,1605],[46,76,105,317,1605,1725],[46,76,105,317,1605,1685,1723,1724],[46,76,105,317,1605,1685,1725],[46,76,105,317,545,1605],[46,52,76,105,317,330,1605],[46,76,105,317,1605,1842],[46,76,105,317,1605,1840,1841],[46,76,105,317,1080,1605],[46,76,105,317,1050,1082,1605],[46,76,105,317,1001,1050,1079,1081,1083,1605],[46,76,105,317,1086,1605],[46,76,105,317,1087,1088,1605],[46,76,105,317,1001,1087,1605],[46,76,105,317,1087,1089,1090,1605],[46,76,105,317,1001,1087,1089,1605],[46,76,105,317,1242,1243,1244,1605],[46,76,105,317,1242,1605],[46,76,105,317,1047,1605],[46,76,105,317,1049,1605],[46,76,105,317,1001,1048,1050,1605],[46,63,76,78,83,101,105,107,317,1003,1004,1605,1723,1725,1726,1727],[46,76,105,317,1578,1605],[46,76,105,317,1500,1501,1502,1503,1505,1506,1507,1508,1509,1510,1511,1512,1513,1514,1515,1516,1517,1518,1519,1520,1521,1522,1523,1524,1525,1526,1527,1528,1529,1530,1531,1532,1533,1534,1535,1536,1537,1538,1539,1540,1541,1542,1543,1544,1545,1546,1547,1548,1549,1550,1551,1552,1553,1554,1555,1556,1557,1558,1559,1560,1561,1562,1563,1564,1565,1566,1567,1568,1569,1570,1571,1572,1573,1574,1575,1576,1577,1605],[46,76,105,317,1526,1605],[46,76,105,317,1526,1539,1605],[46,76,105,317,1504,1553,1605],[46,76,105,317,1554,1605],[46,76,105,317,1505,1528,1605],[46,76,105,317,1528,1605],[46,76,105,317,1504,1605],[46,76,105,317,1557,1605],[46,76,105,317,1537,1605],[46,76,105,317,1504,1545,1553,1605],[46,76,105,317,1548,1605],[46,76,105,317,1550,1605],[46,76,105,317,1500,1605],[46,76,105,317,1520,1605],[46,76,105,317,1501,1502,1541,1605],[46,76,105,317,1561,1605],[46,76,105,317,1559,1605],[46,76,105,317,1505,1506,1605],[46,76,105,317,1507,1605],[46,76,105,317,1518,1605],[46,76,105,317,1504,1509,1605],[46,76,105,317,1563,1605],[46,76,105,317,1505,1605],[46,76,105,317,1557,1566,1569,1605],[46,76,105,317,1505,1506,1550,1605],[316],[52,316],[52],[52,326,329,334,336],[52,337],[370],[52,334,336,550],[52,329,1131],[313],[1143,1351],[1143],[52,354]],"referencedMap":[[1847,1],[1846,2],[1845,3],[46,4],[318,5],[1837,6],[1838,7],[1327,8],[1334,9],[1332,10],[1335,11],[1340,12],[1488,13],[1256,14],[1492,15],[1490,16],[1491,17],[1493,18],[1585,19],[1495,20],[1496,21],[1587,22],[1598,23],[1595,24],[1588,25],[1601,26],[1592,27],[1590,28],[548,29],[1326,30],[1321,31],[325,32],[1323,33],[1324,34],[1597,35],[1594,36],[1600,37],[1591,38],[1331,39],[1329,40],[1333,41],[1330,42],[1453,43],[1235,44],[337,45],[1483,46],[1479,47],[1484,48],[1486,49],[1449,50],[1478,51],[1141,52],[1345,53],[1347,54],[997,25],[339,55],[1344,56],[1346,57],[341,58],[1342,57],[338,48],[1343,57],[540,59],[1487,60],[1233,61],[1451,62],[1403,63],[1251,64],[1250,64],[1252,65],[1359,66],[1355,67],[1353,68],[1375,69],[1374,70],[1371,68],[1372,67],[1350,71],[1376,69],[1363,69],[1370,72],[1367,68],[1368,73],[1380,68],[1401,74],[1366,75],[1364,76],[1402,77],[1379,69],[1361,78],[1378,79],[1452,80],[1348,81],[1253,82],[1254,83],[547,84],[1255,85],[1325,86],[1163,84],[1133,87],[1164,88],[1249,32],[553,89],[552,90],[993,91],[551,92],[1489,93],[1241,94],[1480,56],[1602,32],[1240,95],[1582,96],[1481,97],[1247,98],[1482,99],[1000,100],[1494,101],[1584,102],[1135,103],[1236,104],[1166,105],[1248,106],[1132,107],[1165,108],[1586,109],[1162,110],[324,111],[1844,112],[321,32],[322,113],[320,32],[332,114],[1339,115],[1362,32],[1238,32],[550,32],[1589,116],[1596,117],[1593,118],[1599,116],[1485,118],[1234,118],[1239,118],[1143,118],[1497,118],[1352,119],[1351,118],[1373,120],[1369,118],[1381,118],[1365,120],[1377,120],[1160,118],[1144,121],[1498,32],[1246,32],[995,122],[1358,123],[1159,124],[1400,125],[1450,126],[1140,126],[1158,127],[1237,81],[1142,126],[1499,126],[1328,128],[546,129],[544,130],[323,32],[991,131],[1583,25],[996,25],[1341,25],[1322,132],[998,25],[1360,25],[999,133],[335,134],[334,135],[581,136],[590,137],[592,138],[589,139],[591,140],[588,141],[580,142],[538,143],[539,144],[537,145],[1581,146],[1580,147],[1848,142],[1851,148],[620,149],[612,150],[617,151],[616,152],[615,153],[614,152],[619,154],[618,152],[613,155],[621,137],[622,156],[626,157],[623,150],[627,158],[628,159],[629,160],[631,161],[630,150],[632,162],[634,163],[635,164],[646,165],[645,150],[643,166],[644,167],[642,167],[637,168],[636,159],[638,169],[647,170],[639,166],[641,171],[640,159],[648,159],[649,150],[650,172],[689,173],[690,174],[693,175],[692,150],[691,159],[694,176],[695,169],[696,177],[698,178],[697,150],[699,179],[701,180],[700,150],[702,181],[703,169],[713,182],[704,150],[705,150],[712,183],[711,184],[706,150],[707,142],[708,150],[709,150],[710,185],[715,186],[714,150],[716,187],[718,188],[717,150],[719,189],[723,190],[722,150],[721,191],[720,150],[724,192],[728,193],[727,169],[729,194],[730,169],[731,195],[737,196],[736,150],[735,197],[738,137],[739,198],[745,199],[744,150],[743,200],[746,201],[747,202],[748,203],[750,204],[749,150],[751,205],[752,159],[753,206],[765,207],[766,208],[768,209],[764,210],[763,150],[757,211],[756,150],[767,209],[769,212],[760,213],[759,150],[762,214],[761,150],[755,215],[754,150],[758,142],[771,216],[770,150],[772,217],[773,159],[774,150],[775,218],[776,137],[777,219],[780,220],[779,150],[781,221],[782,159],[783,150],[784,222],[786,223],[785,159],[787,224],[788,137],[789,225],[791,226],[790,150],[792,227],[794,228],[793,159],[795,229],[675,230],[674,231],[676,232],[673,142],[671,142],[672,137],[796,137],[797,233],[799,234],[798,159],[800,235],[801,159],[802,236],[741,237],[740,159],[742,238],[803,239],[804,240],[807,241],[805,242],[806,242],[808,243],[810,244],[809,150],[811,245],[984,246],[815,247],[814,248],[813,249],[812,142],[734,250],[733,251],[732,150],[663,252],[661,253],[660,150],[656,254],[655,150],[654,255],[653,150],[652,256],[651,150],[659,159],[658,257],[657,150],[662,258],[817,259],[816,260],[825,261],[823,262],[824,150],[818,142],[827,263],[826,159],[832,264],[831,265],[828,150],[830,266],[829,267],[625,268],[624,159],[834,269],[833,270],[837,271],[835,159],[836,150],[840,272],[838,159],[839,150],[851,273],[850,274],[848,142],[842,275],[841,150],[843,159],[845,276],[844,150],[847,277],[846,150],[849,137],[854,278],[853,279],[852,159],[856,280],[855,150],[859,281],[858,282],[857,150],[861,283],[860,284],[864,285],[863,286],[862,150],[867,287],[866,288],[865,150],[870,289],[869,290],[868,150],[873,291],[872,292],[871,159],[874,137],[877,293],[876,294],[875,150],[778,295],[726,296],[725,150],[880,297],[879,298],[878,150],[682,299],[681,300],[678,301],[679,159],[677,150],[680,137],[883,302],[882,303],[881,137],[886,304],[885,305],[884,150],[890,306],[889,307],[888,150],[887,197],[896,308],[894,309],[893,150],[892,310],[891,150],[895,137],[899,311],[898,312],[897,150],[902,313],[901,314],[900,150],[905,315],[904,316],[903,150],[687,137],[688,317],[685,318],[669,319],[668,150],[683,320],[670,150],[686,159],[684,321],[908,150],[909,322],[907,323],[906,150],[912,324],[911,325],[910,326],[923,327],[916,328],[915,150],[922,329],[921,329],[920,330],[919,150],[914,331],[913,150],[918,332],[917,150],[925,333],[924,159],[928,334],[927,335],[926,150],[931,336],[930,337],[929,159],[937,338],[933,339],[932,150],[934,137],[936,340],[935,150],[941,341],[940,342],[939,150],[938,197],[944,343],[943,344],[942,150],[955,345],[951,346],[950,347],[954,348],[953,347],[945,150],[947,349],[946,347],[949,350],[948,347],[952,351],[957,352],[633,169],[956,159],[821,353],[820,354],[822,355],[819,197],[960,356],[959,357],[958,150],[964,358],[963,359],[962,360],[961,150],[967,361],[966,362],[965,363],[973,364],[972,365],[969,150],[970,366],[971,367],[968,137],[979,368],[976,369],[975,150],[978,370],[974,159],[977,142],[666,371],[667,372],[665,371],[664,137],[981,373],[980,159],[983,374],[982,169],[1430,375],[1431,376],[1429,377],[1428,378],[1422,379],[1421,378],[1446,380],[1426,381],[1425,378],[1427,382],[1424,383],[1423,378],[1434,384],[1435,385],[1433,386],[1432,378],[1447,387],[1436,384],[1437,388],[1416,389],[1415,378],[1420,390],[1419,391],[1418,378],[1417,142],[1439,392],[1438,375],[1442,393],[1441,394],[1440,378],[1445,395],[1444,396],[1443,378],[1448,397],[1405,142],[1406,398],[1407,398],[1408,142],[1409,398],[1410,398],[1411,142],[1414,399],[1412,142],[1413,142],[1232,400],[1175,137],[1176,142],[1178,401],[1179,142],[1180,142],[1181,142],[1185,137],[1224,142],[1182,142],[1183,142],[1223,137],[1231,142],[1230,142],[1184,142],[1186,142],[1225,137],[1187,142],[1216,142],[1213,142],[1214,137],[1215,402],[1218,137],[1188,142],[1189,142],[1222,137],[1212,142],[1190,142],[1191,137],[1192,137],[1193,142],[1194,403],[1217,142],[1177,142],[1196,137],[1197,137],[1198,137],[1226,142],[1220,142],[1201,142],[1199,142],[1229,142],[1200,142],[1202,401],[1204,137],[1203,137],[1205,137],[1195,403],[1221,142],[1206,137],[1228,142],[1227,142],[1207,142],[1208,142],[1219,142],[1209,142],[1210,142],[1211,142],[1167,137],[1168,142],[1174,404],[1169,142],[1170,142],[1171,142],[1172,142],[1173,142],[985,405],[986,406],[989,407],[990,408],[987,409],[988,407],[611,410],[607,411],[605,412],[579,411],[608,411],[610,413],[606,414],[609,137],[572,142],[577,142],[599,415],[601,416],[574,417],[578,142],[600,418],[575,142],[576,419],[598,420],[573,142],[603,142],[602,142],[604,421],[587,422],[596,423],[593,424],[597,425],[583,426],[584,427],[586,428],[585,142],[594,429],[595,423],[571,142],[582,142],[561,137],[562,142],[554,137],[558,137],[555,137],[567,142],[557,142],[569,137],[556,142],[560,142],[566,142],[570,430],[568,137],[564,142],[563,142],[559,142],[565,137],[274,142],[1784,431],[1787,432],[1786,433],[1785,434],[1783,435],[1779,436],[1782,437],[1781,438],[1780,439],[1778,435],[1793,440],[1792,441],[1791,442],[1790,443],[1789,444],[1788,445],[1679,446],[1678,447],[1667,448],[1668,449],[1660,450],[1661,450],[1680,451],[1665,452],[1663,453],[1664,450],[1666,450],[1670,454],[1676,452],[1672,450],[1675,452],[1677,450],[1671,142],[1674,142],[1669,455],[1673,142],[1688,456],[1683,457],[1682,458],[1681,142],[1687,459],[1800,142],[1836,460],[1834,461],[1827,462],[1826,463],[1828,464],[1830,465],[1829,463],[1832,466],[1831,467],[1835,468],[1833,469],[1604,142],[1603,142],[1825,470],[1824,471],[1823,472],[1696,473],[1695,474],[1701,475],[1702,475],[1719,476],[1718,142],[1698,477],[1697,478],[1717,479],[1716,142],[1700,480],[1699,142],[1713,481],[1712,474],[1706,482],[1705,142],[1704,483],[1703,474],[1708,484],[1707,142],[1715,485],[1714,486],[1720,142],[1721,487],[1709,457],[1711,488],[1710,489],[1692,142],[1690,142],[1689,459],[1691,490],[1693,142],[1839,142],[1694,142],[1822,491],[1807,492],[1806,142],[1808,493],[1801,494],[1809,495],[1730,496],[1729,142],[1805,497],[1804,142],[1821,471],[1811,498],[1820,499],[1803,500],[1802,501],[1810,142],[1817,502],[1814,471],[1818,142],[1819,503],[1816,504],[1815,502],[1812,505],[1813,506],[336,507],[333,142],[1850,142],[1684,142],[1686,508],[1004,509],[1003,142],[1002,510],[1857,511],[1856,512],[1685,142],[1146,513],[1147,514],[1145,515],[1148,516],[1149,517],[1150,518],[1151,519],[1152,520],[1153,521],[1154,522],[1155,523],[1156,524],[1157,525],[1005,510],[59,526],[60,526],[62,527],[63,528],[64,529],[65,530],[66,531],[67,532],[68,533],[69,534],[70,535],[71,536],[72,536],[74,537],[73,538],[75,537],[76,539],[77,540],[61,541],[111,142],[78,542],[79,543],[80,544],[112,545],[81,546],[82,547],[83,548],[84,549],[85,550],[86,551],[87,552],[88,553],[89,554],[90,555],[91,555],[92,556],[93,557],[95,558],[94,559],[96,560],[97,561],[98,142],[99,562],[100,563],[101,564],[102,565],[1605,539],[103,566],[104,567],[105,568],[106,569],[107,570],[108,571],[109,572],[110,573],[50,142],[117,574],[118,575],[116,137],[114,576],[115,577],[48,142],[52,578],[1124,137],[340,142],[51,142],[1001,142],[1404,142],[413,579],[404,142],[405,142],[406,142],[407,142],[408,142],[409,142],[410,142],[411,142],[412,142],[1634,142],[1635,580],[1134,137],[1096,581],[1095,582],[1123,581],[1097,583],[1098,583],[1099,583],[1100,583],[1101,583],[1102,583],[1121,583],[1103,583],[1104,583],[1122,584],[1120,583],[1105,583],[1106,583],[1108,585],[1109,583],[1110,583],[1111,583],[1119,583],[1112,583],[1113,583],[1114,583],[1115,583],[1116,583],[1117,583],[1118,583],[1126,586],[1125,587],[1128,588],[1129,589],[1131,590],[1127,591],[1130,142],[1107,583],[1776,592],[1733,142],[1735,593],[1734,594],[1739,595],[1774,596],[1771,597],[1773,598],[1736,597],[1737,599],[1741,599],[1740,600],[1738,601],[1772,602],[1770,597],[1775,603],[1768,142],[1769,142],[1742,604],[1747,597],[1749,597],[1744,597],[1745,604],[1751,597],[1752,605],[1743,597],[1748,597],[1750,597],[1746,597],[1766,606],[1765,597],[1767,607],[1761,597],[1763,597],[1762,597],[1758,597],[1764,608],[1759,597],[1760,609],[1753,597],[1754,597],[1755,597],[1756,597],[1757,597],[1349,142],[1722,142],[1320,610],[1278,611],[1279,611],[1280,612],[1281,611],[1283,613],[1282,611],[1284,611],[1285,611],[1286,614],[1260,615],[1287,142],[1288,142],[1289,616],[1257,142],[1276,617],[1277,618],[1272,142],[1263,619],[1290,620],[1291,621],[1271,622],[1275,623],[1274,624],[1292,142],[1273,625],[1293,626],[1269,627],[1296,628],[1295,629],[1264,627],[1297,630],[1307,615],[1265,142],[1294,631],[1318,632],[1301,633],[1298,634],[1299,635],[1300,636],[1309,637],[1268,610],[1302,142],[1303,142],[1304,638],[1305,142],[1306,639],[1308,640],[1317,641],[1310,642],[1312,643],[1311,642],[1313,642],[1314,644],[1315,645],[1316,646],[1319,647],[1262,615],[1259,142],[1266,142],[1261,142],[1270,648],[1267,649],[1258,142],[527,650],[528,650],[529,650],[535,651],[530,650],[531,650],[532,650],[533,650],[534,650],[518,652],[517,142],[536,653],[524,142],[520,654],[511,142],[510,142],[512,142],[513,650],[514,655],[526,656],[515,650],[516,650],[521,657],[522,658],[523,650],[519,142],[525,142],[374,142],[493,659],[497,659],[496,659],[494,659],[495,659],[498,659],[377,659],[389,659],[378,659],[391,659],[393,659],[387,659],[386,659],[388,659],[392,659],[394,659],[379,659],[390,659],[380,659],[382,660],[383,659],[384,659],[385,659],[401,659],[400,659],[501,661],[395,659],[397,659],[396,659],[398,659],[399,659],[500,659],[499,659],[402,659],[484,659],[483,659],[414,662],[415,662],[417,659],[461,659],[482,659],[418,662],[462,659],[459,659],[463,659],[419,659],[420,659],[421,662],[464,659],[458,662],[416,662],[465,659],[422,662],[466,659],[446,659],[423,662],[424,659],[425,659],[456,662],[428,659],[427,659],[467,659],[468,659],[469,662],[430,659],[432,659],[433,659],[439,659],[440,659],[434,662],[470,659],[457,662],[435,659],[436,659],[471,659],[437,659],[429,662],[472,659],[455,659],[473,659],[438,662],[441,659],[442,659],[460,662],[474,659],[475,659],[454,663],[431,659],[476,662],[477,659],[478,659],[479,659],[480,662],[443,659],[481,659],[447,659],[444,662],[445,662],[426,659],[448,659],[451,659],[449,659],[450,659],[403,659],[491,659],[485,659],[486,659],[488,659],[489,659],[487,659],[492,659],[490,659],[376,664],[509,665],[507,666],[508,667],[506,668],[505,659],[504,669],[373,142],[375,142],[371,142],[502,142],[503,670],[381,664],[372,142],[549,142],[1161,142],[1798,671],[1777,672],[1731,673],[1799,674],[49,142],[329,675],[328,676],[327,142],[1139,677],[1138,678],[1136,679],[1137,680],[1455,681],[1456,682],[1454,142],[1627,537],[1855,683],[1797,684],[1796,685],[1795,686],[1794,687],[1046,688],[1044,689],[1045,690],[1853,691],[1852,512],[1854,692],[1849,142],[453,693],[452,142],[1008,694],[1007,695],[1033,696],[1032,697],[1035,698],[1034,699],[1037,700],[1036,701],[1078,702],[1052,703],[1053,704],[1054,704],[1055,704],[1056,704],[1057,704],[1058,704],[1059,704],[1060,704],[1061,704],[1062,704],[1076,705],[1063,704],[1064,704],[1065,704],[1066,704],[1067,704],[1068,704],[1069,704],[1070,704],[1072,704],[1073,704],[1071,704],[1074,704],[1075,704],[1077,704],[1051,706],[1031,707],[1011,708],[1012,708],[1013,708],[1014,708],[1015,708],[1016,708],[1017,709],[1019,708],[1018,708],[1030,710],[1020,708],[1022,708],[1021,708],[1024,708],[1023,708],[1025,708],[1026,708],[1027,708],[1028,708],[1029,708],[1010,708],[1009,711],[1006,142],[58,712],[277,713],[282,714],[284,715],[136,716],[151,717],[247,718],[250,719],[214,720],[222,721],[206,722],[248,723],[137,724],[181,142],[182,725],[205,142],[249,726],[158,727],[138,728],[162,727],[152,727],[123,727],[204,729],[128,142],[201,730],[1336,731],[199,732],[1337,733],[187,142],[202,734],[302,735],[210,137],[301,142],[299,142],[300,736],[203,137],[192,737],[200,738],[217,739],[218,740],[209,142],[188,741],[207,742],[208,137],[294,743],[297,744],[169,745],[168,746],[167,747],[305,137],[166,748],[143,142],[308,142],[542,749],[1356,749],[541,142],[311,142],[310,137],[312,750],[119,142],[242,142],[150,751],[121,752],[265,142],[266,142],[268,142],[271,753],[267,142],[269,754],[270,754],[149,142],[276,748],[285,755],[289,756],[132,757],[194,758],[193,142],[213,759],[211,142],[212,142],[216,760],[190,761],[131,762],[156,763],[239,764],[124,765],[130,766],[120,718],[252,767],[263,768],[251,142],[262,769],[157,142],[141,770],[231,771],[230,142],[238,772],[232,773],[236,774],[237,775],[235,773],[234,775],[233,773],[178,776],[163,776],[225,777],[164,777],[126,778],[125,142],[229,779],[228,780],[227,781],[226,782],[127,783],[198,784],[215,785],[197,786],[221,787],[223,788],[220,786],[159,783],[113,142],[240,789],[183,790],[261,791],[186,792],[256,793],[139,142],[257,794],[259,795],[260,796],[255,142],[254,765],[160,797],[241,798],[264,799],[133,142],[135,142],[140,800],[224,801],[129,802],[134,142],[185,803],[184,804],[142,805],[191,806],[189,807],[144,808],[146,809],[309,142],[145,810],[147,811],[279,142],[280,142],[278,142],[281,142],[307,142],[148,812],[196,137],[57,142],[219,813],[170,142],[180,814],[287,137],[293,815],[177,137],[291,137],[176,816],[273,817],[175,815],[122,142],[295,818],[173,137],[174,137],[165,142],[179,142],[172,819],[171,820],[161,821],[155,822],[258,142],[154,823],[153,142],[283,142],[195,137],[275,824],[47,142],[56,825],[53,137],[54,142],[55,142],[253,568],[246,826],[245,142],[244,827],[243,142],[286,828],[288,829],[290,830],[543,831],[1357,832],[292,833],[1338,834],[317,835],[296,836],[316,837],[298,838],[303,839],[304,840],[306,841],[313,842],[315,142],[314,435],[272,843],[1633,142],[1643,142],[1613,844],[1609,845],[1610,846],[1607,142],[1612,847],[1611,848],[1639,849],[1631,850],[1629,851],[1615,852],[1608,853],[1617,142],[1616,850],[1630,853],[1624,854],[1659,855],[1606,435],[1642,450],[1645,856],[1640,857],[1641,858],[1656,142],[1626,859],[1625,142],[1622,860],[1658,861],[1651,862],[1620,863],[1652,864],[1623,865],[1655,866],[1654,867],[1637,868],[1653,869],[1650,870],[1657,142],[1636,871],[1646,872],[1644,873],[1632,142],[1621,874],[1619,875],[1638,876],[1618,877],[1614,142],[1628,878],[1648,142],[1647,142],[1649,142],[1043,879],[1040,880],[1041,142],[1042,142],[1038,142],[1039,881],[1384,882],[1397,882],[1383,882],[1385,882],[1386,882],[1387,882],[1388,882],[1389,882],[1390,882],[1391,882],[1392,882],[1393,882],[1394,882],[1395,882],[1396,882],[1399,883],[1382,137],[1398,142],[1474,142],[1477,884],[1475,142],[1476,142],[1457,885],[1458,885],[1463,886],[1464,887],[1472,888],[1465,889],[1467,890],[1466,891],[1468,892],[1469,893],[1471,894],[1470,891],[1473,895],[1460,896],[1462,897],[1461,892],[1459,142],[342,142],[357,898],[358,898],[370,899],[359,900],[360,901],[355,902],[353,903],[344,142],[348,904],[352,905],[350,906],[356,907],[345,908],[346,909],[347,910],[349,911],[351,912],[354,913],[361,900],[362,900],[363,900],[364,898],[365,900],[366,900],[343,900],[367,142],[369,914],[368,900],[994,137],[1093,915],[1092,916],[1354,137],[992,917],[326,142],[1094,918],[1085,919],[1084,920],[1726,921],[1725,922],[1723,923],[1724,142],[545,924],[330,137],[331,925],[1843,926],[1842,927],[1841,142],[1840,142],[1727,142],[1081,928],[1080,142],[319,142],[44,142],[45,142],[8,142],[10,142],[9,142],[2,142],[11,142],[12,142],[13,142],[14,142],[15,142],[16,142],[17,142],[18,142],[3,142],[4,142],[19,142],[23,142],[20,142],[21,142],[22,142],[24,142],[25,142],[26,142],[5,142],[27,142],[28,142],[29,142],[30,142],[6,142],[34,142],[31,142],[32,142],[33,142],[35,142],[7,142],[36,142],[41,142],[42,142],[37,142],[38,142],[39,142],[40,142],[1,142],[43,142],[1662,142],[1083,929],[1079,142],[1082,930],[1087,931],[1086,510],[1089,932],[1088,933],[1091,934],[1090,935],[1732,142],[1245,936],[1243,937],[1242,142],[1244,937],[1048,938],[1047,510],[1050,939],[1049,940],[1728,941],[1579,942],[1578,943],[1527,944],[1540,945],[1502,142],[1554,946],[1556,947],[1555,947],[1529,948],[1528,142],[1530,949],[1557,950],[1561,951],[1559,951],[1538,952],[1537,142],[1546,950],[1505,950],[1533,142],[1574,953],[1549,954],[1551,955],[1569,950],[1504,956],[1521,957],[1536,142],[1571,142],[1542,958],[1558,951],[1562,959],[1560,960],[1575,142],[1544,142],[1518,956],[1510,142],[1509,961],[1534,950],[1535,950],[1508,962],[1541,142],[1503,142],[1520,142],[1548,142],[1576,963],[1515,950],[1516,964],[1563,947],[1565,965],[1564,965],[1500,142],[1519,142],[1526,142],[1517,950],[1547,142],[1514,142],[1573,142],[1513,142],[1511,966],[1512,142],[1550,142],[1543,142],[1570,967],[1524,961],[1522,961],[1523,961],[1539,142],[1506,142],[1566,951],[1568,959],[1567,960],[1553,142],[1552,968],[1545,142],[1532,142],[1572,142],[1577,142],[1501,142],[1531,142],[1525,142],[1507,961]],"exportedModulesMap":[[1846,2],[46,4],[318,5],[1837,969],[1838,7],[1327,970],[1334,970],[1332,970],[1335,11],[1488,13],[1256,14],[1492,15],[1490,16],[1491,969],[1493,18],[1585,19],[1495,20],[1496,970],[1587,970],[1598,970],[1595,970],[1588,25],[1601,970],[1592,970],[1590,28],[548,29],[1326,30],[1321,31],[325,32],[1323,33],[1324,34],[1597,35],[1594,36],[1600,971],[1591,971],[1331,39],[1329,971],[1333,971],[1330,42],[1453,43],[1235,44],[337,972],[1483,46],[1479,47],[1484,48],[1486,49],[1449,50],[1478,51],[1141,52],[1345,53],[1347,973],[997,25],[1344,56],[1346,57],[341,58],[1342,57],[338,48],[1343,57],[540,974],[1487,60],[1233,61],[1451,62],[1403,63],[1251,971],[1250,971],[1252,971],[1359,66],[1355,67],[1353,68],[1375,971],[1374,70],[1371,68],[1372,67],[1350,971],[1376,971],[1363,971],[1370,72],[1367,68],[1368,73],[1380,971],[1401,74],[1366,75],[1364,76],[1402,77],[1379,971],[1361,971],[1378,971],[1452,80],[1348,81],[1253,971],[1254,971],[547,971],[1255,85],[1325,86],[1163,971],[1133,87],[1164,88],[1249,971],[553,89],[552,971],[993,91],[551,975],[1489,93],[1241,94],[1480,56],[1602,32],[1240,95],[1582,96],[1481,97],[1247,98],[1482,99],[1000,971],[1494,101],[1584,102],[1135,103],[1236,971],[1166,105],[1248,106],[1132,976],[1165,108],[1586,109],[1162,110],[324,977],[1844,112],[321,32],[322,113],[320,32],[332,114],[1339,115],[1362,32],[1589,116],[1596,117],[1593,118],[1599,116],[1234,118],[1239,118],[1143,118],[1497,118],[1352,978],[1373,120],[1369,118],[1365,120],[1377,979],[1160,118],[1144,121],[1498,32],[995,122],[1358,123],[1159,124],[1400,971],[1450,126],[1140,971],[1158,980],[1237,81],[1142,126],[1499,126],[1328,128],[546,129],[544,130],[991,131],[1583,25],[996,25],[1341,25],[1322,132],[998,971],[1360,971],[999,133],[335,134],[334,135],[581,136],[590,137],[592,138],[589,139],[591,140],[588,141],[580,142],[538,143],[539,144],[537,145],[1581,146],[1580,147],[1848,142],[1851,148],[620,149],[612,150],[617,151],[616,152],[615,153],[614,152],[619,154],[618,152],[613,155],[621,137],[622,156],[626,157],[623,150],[627,158],[628,159],[629,160],[631,161],[630,150],[632,162],[634,163],[635,164],[646,165],[645,150],[643,166],[644,167],[642,167],[637,168],[636,159],[638,169],[647,170],[639,166],[641,171],[640,159],[648,159],[649,150],[650,172],[689,173],[690,174],[693,175],[692,150],[691,159],[694,176],[695,169],[696,177],[698,178],[697,150],[699,179],[701,180],[700,150],[702,181],[703,169],[713,182],[704,150],[705,150],[712,183],[711,184],[706,150],[707,142],[708,150],[709,150],[710,185],[715,186],[714,150],[716,187],[718,188],[717,150],[719,189],[723,190],[722,150],[721,191],[720,150],[724,192],[728,193],[727,169],[729,194],[730,169],[731,195],[737,196],[736,150],[735,197],[738,137],[739,198],[745,199],[744,150],[743,200],[746,201],[747,202],[748,203],[750,204],[749,150],[751,205],[752,159],[753,206],[765,207],[766,208],[768,209],[764,210],[763,150],[757,211],[756,150],[767,209],[769,212],[760,213],[759,150],[762,214],[761,150],[755,215],[754,150],[758,142],[771,216],[770,150],[772,217],[773,159],[774,150],[775,218],[776,137],[777,219],[780,220],[779,150],[781,221],[782,159],[783,150],[784,222],[786,223],[785,159],[787,224],[788,137],[789,225],[791,226],[790,150],[792,227],[794,228],[793,159],[795,229],[675,230],[674,231],[676,232],[673,142],[671,142],[672,137],[796,137],[797,233],[799,234],[798,159],[800,235],[801,159],[802,236],[741,237],[740,159],[742,238],[803,239],[804,240],[807,241],[805,242],[806,242],[808,243],[810,244],[809,150],[811,245],[984,246],[815,247],[814,248],[813,249],[812,142],[734,250],[733,251],[732,150],[663,252],[661,253],[660,150],[656,254],[655,150],[654,255],[653,150],[652,256],[651,150],[659,159],[658,257],[657,150],[662,258],[817,259],[816,260],[825,261],[823,262],[824,150],[818,142],[827,263],[826,159],[832,264],[831,265],[828,150],[830,266],[829,267],[625,268],[624,159],[834,269],[833,270],[837,271],[835,159],[836,150],[840,272],[838,159],[839,150],[851,273],[850,274],[848,142],[842,275],[841,150],[843,159],[845,276],[844,150],[847,277],[846,150],[849,137],[854,278],[853,279],[852,159],[856,280],[855,150],[859,281],[858,282],[857,150],[861,283],[860,284],[864,285],[863,286],[862,150],[867,287],[866,288],[865,150],[870,289],[869,290],[868,150],[873,291],[872,292],[871,159],[874,137],[877,293],[876,294],[875,150],[778,295],[726,296],[725,150],[880,297],[879,298],[878,150],[682,299],[681,300],[678,301],[679,159],[677,150],[680,137],[883,302],[882,303],[881,137],[886,304],[885,305],[884,150],[890,306],[889,307],[888,150],[887,197],[896,308],[894,309],[893,150],[892,310],[891,150],[895,137],[899,311],[898,312],[897,150],[902,313],[901,314],[900,150],[905,315],[904,316],[903,150],[687,137],[688,317],[685,318],[669,319],[668,150],[683,320],[670,150],[686,159],[684,321],[908,150],[909,322],[907,323],[906,150],[912,324],[911,325],[910,326],[923,327],[916,328],[915,150],[922,329],[921,329],[920,330],[919,150],[914,331],[913,150],[918,332],[917,150],[925,333],[924,159],[928,334],[927,335],[926,150],[931,336],[930,337],[929,159],[937,338],[933,339],[932,150],[934,137],[936,340],[935,150],[941,341],[940,342],[939,150],[938,197],[944,343],[943,344],[942,150],[955,345],[951,346],[950,347],[954,348],[953,347],[945,150],[947,349],[946,347],[949,350],[948,347],[952,351],[957,352],[633,169],[956,159],[821,353],[820,354],[822,355],[819,197],[960,356],[959,357],[958,150],[964,358],[963,359],[962,360],[961,150],[967,361],[966,362],[965,363],[973,364],[972,365],[969,150],[970,366],[971,367],[968,137],[979,368],[976,369],[975,150],[978,370],[974,159],[977,142],[666,371],[667,372],[665,371],[664,137],[981,373],[980,159],[983,374],[982,169],[1430,375],[1431,376],[1429,377],[1428,378],[1422,379],[1421,378],[1446,380],[1426,381],[1425,378],[1427,382],[1424,383],[1423,378],[1434,384],[1435,385],[1433,386],[1432,378],[1447,387],[1436,384],[1437,388],[1416,389],[1415,378],[1420,390],[1419,391],[1418,378],[1417,142],[1439,392],[1438,375],[1442,393],[1441,394],[1440,378],[1445,395],[1444,396],[1443,378],[1448,397],[1405,142],[1406,398],[1407,398],[1408,142],[1409,398],[1410,398],[1411,142],[1414,399],[1412,142],[1413,142],[1232,400],[1175,137],[1176,142],[1178,401],[1179,142],[1180,142],[1181,142],[1185,137],[1224,142],[1182,142],[1183,142],[1223,137],[1231,142],[1230,142],[1184,142],[1186,142],[1225,137],[1187,142],[1216,142],[1213,142],[1214,137],[1215,402],[1218,137],[1188,142],[1189,142],[1222,137],[1212,142],[1190,142],[1191,137],[1192,137],[1193,142],[1194,403],[1217,142],[1177,142],[1196,137],[1197,137],[1198,137],[1226,142],[1220,142],[1201,142],[1199,142],[1229,142],[1200,142],[1202,401],[1204,137],[1203,137],[1205,137],[1195,403],[1221,142],[1206,137],[1228,142],[1227,142],[1207,142],[1208,142],[1219,142],[1209,142],[1210,142],[1211,142],[1167,137],[1168,142],[1174,404],[1169,142],[1170,142],[1171,142],[1172,142],[1173,142],[985,405],[986,406],[989,407],[990,408],[987,409],[988,407],[611,410],[607,411],[605,412],[579,411],[608,411],[610,413],[606,414],[609,137],[572,142],[577,142],[599,415],[601,416],[574,417],[578,142],[600,418],[575,142],[576,419],[598,420],[573,142],[603,142],[602,142],[604,421],[587,422],[596,423],[593,424],[597,425],[583,426],[584,427],[586,428],[585,142],[594,429],[595,423],[571,142],[582,142],[561,137],[562,142],[554,137],[558,137],[555,137],[567,142],[557,142],[569,137],[556,142],[560,142],[566,142],[570,430],[568,137],[564,142],[563,142],[559,142],[565,137],[274,142],[1784,431],[1787,432],[1786,433],[1785,434],[1783,435],[1779,436],[1782,437],[1781,438],[1780,439],[1778,435],[1793,440],[1792,441],[1791,442],[1790,443],[1789,444],[1788,445],[1679,446],[1678,447],[1667,448],[1668,449],[1660,450],[1661,450],[1680,451],[1665,452],[1663,453],[1664,450],[1666,450],[1670,454],[1676,452],[1672,450],[1675,452],[1677,450],[1671,142],[1674,142],[1669,455],[1673,142],[1688,456],[1683,457],[1682,458],[1681,142],[1687,459],[1800,142],[1836,460],[1834,461],[1827,462],[1826,463],[1828,464],[1830,465],[1829,463],[1832,466],[1831,467],[1835,468],[1833,469],[1604,142],[1603,142],[1825,470],[1824,471],[1823,472],[1696,473],[1695,474],[1701,475],[1702,475],[1719,476],[1718,142],[1698,477],[1697,478],[1717,479],[1716,142],[1700,480],[1699,142],[1713,481],[1712,474],[1706,482],[1705,142],[1704,483],[1703,474],[1708,484],[1707,142],[1715,485],[1714,486],[1720,142],[1721,487],[1709,457],[1711,488],[1710,489],[1692,142],[1690,142],[1689,459],[1691,490],[1693,142],[1839,142],[1694,142],[1822,491],[1807,492],[1806,142],[1808,493],[1801,494],[1809,495],[1730,496],[1729,142],[1805,497],[1804,142],[1821,471],[1811,498],[1820,499],[1803,500],[1802,501],[1810,142],[1817,502],[1814,471],[1818,142],[1819,503],[1816,504],[1815,502],[1812,505],[1813,506],[336,507],[333,142],[1850,142],[1684,142],[1686,508],[1004,509],[1003,142],[1002,510],[1857,511],[1856,512],[1685,142],[1146,513],[1147,514],[1145,515],[1148,516],[1149,517],[1150,518],[1151,519],[1152,520],[1153,521],[1154,522],[1155,523],[1156,524],[1157,525],[1005,510],[59,526],[60,526],[62,527],[63,528],[64,529],[65,530],[66,531],[67,532],[68,533],[69,534],[70,535],[71,536],[72,536],[74,537],[73,538],[75,537],[76,539],[77,540],[61,541],[111,142],[78,542],[79,543],[80,544],[112,545],[81,546],[82,547],[83,548],[84,549],[85,550],[86,551],[87,552],[88,553],[89,554],[90,555],[91,555],[92,556],[93,557],[95,558],[94,559],[96,560],[97,561],[98,142],[99,562],[100,563],[101,564],[102,565],[1605,539],[103,566],[104,567],[105,568],[106,569],[107,570],[108,571],[109,572],[110,573],[50,142],[117,574],[118,575],[116,137],[114,576],[115,577],[48,142],[52,578],[1124,137],[340,142],[51,142],[1001,142],[1404,142],[413,579],[404,142],[405,142],[406,142],[407,142],[408,142],[409,142],[410,142],[411,142],[412,142],[1634,142],[1635,580],[1134,137],[1096,581],[1095,582],[1123,581],[1097,583],[1098,583],[1099,583],[1100,583],[1101,583],[1102,583],[1121,583],[1103,583],[1104,583],[1122,584],[1120,583],[1105,583],[1106,583],[1108,585],[1109,583],[1110,583],[1111,583],[1119,583],[1112,583],[1113,583],[1114,583],[1115,583],[1116,583],[1117,583],[1118,583],[1126,586],[1125,587],[1128,588],[1129,589],[1131,590],[1127,591],[1130,142],[1107,583],[1776,592],[1733,142],[1735,593],[1734,594],[1739,595],[1774,596],[1771,597],[1773,598],[1736,597],[1737,599],[1741,599],[1740,600],[1738,601],[1772,602],[1770,597],[1775,603],[1768,142],[1769,142],[1742,604],[1747,597],[1749,597],[1744,597],[1745,604],[1751,597],[1752,605],[1743,597],[1748,597],[1750,597],[1746,597],[1766,606],[1765,597],[1767,607],[1761,597],[1763,597],[1762,597],[1758,597],[1764,608],[1759,597],[1760,609],[1753,597],[1754,597],[1755,597],[1756,597],[1757,597],[1349,142],[1722,142],[1320,610],[1278,611],[1279,611],[1280,612],[1281,611],[1283,613],[1282,611],[1284,611],[1285,611],[1286,614],[1260,615],[1287,142],[1288,142],[1289,616],[1257,142],[1276,617],[1277,618],[1272,142],[1263,619],[1290,620],[1291,621],[1271,622],[1275,623],[1274,624],[1292,142],[1273,625],[1293,626],[1269,627],[1296,628],[1295,629],[1264,627],[1297,630],[1307,615],[1265,142],[1294,631],[1318,632],[1301,633],[1298,634],[1299,635],[1300,636],[1309,637],[1268,610],[1302,142],[1303,142],[1304,638],[1305,142],[1306,639],[1308,640],[1317,641],[1310,642],[1312,643],[1311,642],[1313,642],[1314,644],[1315,645],[1316,646],[1319,647],[1262,615],[1259,142],[1266,142],[1261,142],[1270,648],[1267,649],[1258,142],[527,650],[528,650],[529,650],[535,651],[530,650],[531,650],[532,650],[533,650],[534,650],[518,652],[517,142],[536,653],[524,142],[520,654],[511,142],[510,142],[512,142],[513,650],[514,655],[526,656],[515,650],[516,650],[521,657],[522,658],[523,650],[519,142],[525,142],[374,142],[493,659],[497,659],[496,659],[494,659],[495,659],[498,659],[377,659],[389,659],[378,659],[391,659],[393,659],[387,659],[386,659],[388,659],[392,659],[394,659],[379,659],[390,659],[380,659],[382,660],[383,659],[384,659],[385,659],[401,659],[400,659],[501,661],[395,659],[397,659],[396,659],[398,659],[399,659],[500,659],[499,659],[402,659],[484,659],[483,659],[414,662],[415,662],[417,659],[461,659],[482,659],[418,662],[462,659],[459,659],[463,659],[419,659],[420,659],[421,662],[464,659],[458,662],[416,662],[465,659],[422,662],[466,659],[446,659],[423,662],[424,659],[425,659],[456,662],[428,659],[427,659],[467,659],[468,659],[469,662],[430,659],[432,659],[433,659],[439,659],[440,659],[434,662],[470,659],[457,662],[435,659],[436,659],[471,659],[437,659],[429,662],[472,659],[455,659],[473,659],[438,662],[441,659],[442,659],[460,662],[474,659],[475,659],[454,663],[431,659],[476,662],[477,659],[478,659],[479,659],[480,662],[443,659],[481,659],[447,659],[444,662],[445,662],[426,659],[448,659],[451,659],[449,659],[450,659],[403,659],[491,659],[485,659],[486,659],[488,659],[489,659],[487,659],[492,659],[490,659],[376,664],[509,665],[507,666],[508,667],[506,668],[505,659],[504,669],[373,142],[375,142],[371,142],[502,142],[503,670],[381,664],[372,142],[549,142],[1161,142],[1798,671],[1777,672],[1731,673],[1799,674],[49,142],[329,675],[328,676],[327,142],[1139,677],[1138,678],[1136,679],[1137,680],[1455,681],[1456,682],[1454,142],[1627,537],[1855,683],[1797,684],[1796,685],[1795,686],[1794,687],[1046,688],[1044,689],[1045,690],[1853,691],[1852,512],[1854,692],[1849,142],[453,693],[452,142],[1008,694],[1007,695],[1033,696],[1032,697],[1035,698],[1034,699],[1037,700],[1036,701],[1078,702],[1052,703],[1053,704],[1054,704],[1055,704],[1056,704],[1057,704],[1058,704],[1059,704],[1060,704],[1061,704],[1062,704],[1076,705],[1063,704],[1064,704],[1065,704],[1066,704],[1067,704],[1068,704],[1069,704],[1070,704],[1072,704],[1073,704],[1071,704],[1074,704],[1075,704],[1077,704],[1051,706],[1031,707],[1011,708],[1012,708],[1013,708],[1014,708],[1015,708],[1016,708],[1017,709],[1019,708],[1018,708],[1030,710],[1020,708],[1022,708],[1021,708],[1024,708],[1023,708],[1025,708],[1026,708],[1027,708],[1028,708],[1029,708],[1010,708],[1009,711],[1006,142],[58,712],[277,713],[282,714],[284,715],[136,716],[151,717],[247,718],[250,719],[214,720],[222,721],[206,722],[248,723],[137,724],[181,142],[182,725],[205,142],[249,726],[158,727],[138,728],[162,727],[152,727],[123,727],[204,729],[128,142],[201,730],[1336,731],[199,732],[1337,733],[187,142],[202,734],[302,735],[210,137],[301,142],[299,142],[300,736],[203,137],[192,737],[200,738],[217,739],[218,740],[209,142],[188,741],[207,742],[208,137],[294,743],[297,744],[169,745],[168,746],[167,747],[305,137],[166,748],[143,142],[308,142],[542,749],[1356,749],[541,142],[311,142],[310,137],[312,750],[119,142],[242,142],[150,751],[121,752],[265,142],[266,142],[268,142],[271,753],[267,142],[269,754],[270,754],[149,142],[276,748],[285,755],[289,756],[132,757],[194,758],[193,142],[213,759],[211,142],[212,142],[216,760],[190,761],[131,762],[156,763],[239,764],[124,765],[130,766],[120,718],[252,767],[263,768],[251,142],[262,769],[157,142],[141,770],[231,771],[230,142],[238,772],[232,773],[236,774],[237,775],[235,773],[234,775],[233,773],[178,776],[163,776],[225,777],[164,777],[126,778],[125,142],[229,779],[228,780],[227,781],[226,782],[127,783],[198,784],[215,785],[197,786],[221,787],[223,788],[220,786],[159,783],[113,142],[240,789],[183,790],[261,791],[186,792],[256,793],[139,142],[257,794],[259,795],[260,796],[255,142],[254,765],[160,797],[241,798],[264,799],[133,142],[135,142],[140,800],[224,801],[129,802],[134,142],[185,803],[184,804],[142,805],[191,806],[189,807],[144,808],[146,809],[309,142],[145,810],[147,811],[279,142],[280,142],[278,142],[281,142],[307,142],[148,812],[196,137],[57,142],[219,813],[170,142],[180,814],[287,137],[293,815],[177,137],[291,137],[176,816],[273,817],[175,815],[122,142],[295,818],[173,137],[174,137],[165,142],[179,142],[172,819],[171,820],[161,821],[155,822],[258,142],[154,823],[153,142],[283,142],[195,137],[275,824],[47,142],[56,825],[53,137],[54,142],[55,142],[253,568],[246,826],[245,142],[244,827],[243,142],[286,828],[288,829],[290,830],[543,831],[1357,832],[292,833],[1338,834],[317,835],[296,836],[316,837],[298,838],[303,839],[304,840],[306,841],[313,842],[315,142],[314,435],[272,843],[1633,142],[1643,142],[1613,844],[1609,845],[1610,846],[1607,142],[1612,847],[1611,848],[1639,849],[1631,850],[1629,851],[1615,852],[1608,853],[1617,142],[1616,850],[1630,853],[1624,854],[1659,855],[1606,435],[1642,450],[1645,856],[1640,857],[1641,858],[1656,142],[1626,859],[1625,142],[1622,860],[1658,861],[1651,862],[1620,863],[1652,864],[1623,865],[1655,866],[1654,867],[1637,868],[1653,869],[1650,870],[1657,142],[1636,871],[1646,872],[1644,873],[1632,142],[1621,874],[1619,875],[1638,876],[1618,877],[1614,142],[1628,878],[1648,142],[1647,142],[1649,142],[1043,879],[1040,880],[1041,142],[1042,142],[1038,142],[1039,881],[1384,882],[1397,882],[1383,882],[1385,882],[1386,882],[1387,882],[1388,882],[1389,882],[1390,882],[1391,882],[1392,882],[1393,882],[1394,882],[1395,882],[1396,882],[1399,883],[1382,137],[1398,142],[1474,142],[1477,884],[1475,142],[1476,142],[1457,885],[1458,885],[1463,886],[1464,887],[1472,888],[1465,889],[1467,890],[1466,891],[1468,892],[1469,893],[1471,894],[1470,891],[1473,895],[1460,896],[1462,897],[1461,892],[1459,142],[342,142],[357,898],[358,898],[370,899],[359,900],[360,901],[355,902],[353,903],[344,142],[348,904],[352,905],[350,906],[356,907],[345,908],[346,909],[347,910],[349,911],[351,912],[354,913],[361,900],[362,900],[363,900],[364,898],[365,900],[366,900],[343,900],[367,142],[369,914],[368,900],[994,137],[1093,915],[1092,916],[1354,137],[992,917],[326,142],[1094,918],[1085,919],[1084,920],[1726,921],[1725,922],[1723,923],[1724,142],[545,924],[330,137],[331,925],[1843,926],[1842,927],[1841,142],[1840,142],[1727,142],[1081,928],[1080,142],[319,142],[44,142],[45,142],[8,142],[10,142],[9,142],[2,142],[11,142],[12,142],[13,142],[14,142],[15,142],[16,142],[17,142],[18,142],[3,142],[4,142],[19,142],[23,142],[20,142],[21,142],[22,142],[24,142],[25,142],[26,142],[5,142],[27,142],[28,142],[29,142],[30,142],[6,142],[34,142],[31,142],[32,142],[33,142],[35,142],[7,142],[36,142],[41,142],[42,142],[37,142],[38,142],[39,142],[40,142],[1,142],[43,142],[1662,142],[1083,929],[1079,142],[1082,930],[1087,931],[1086,510],[1089,932],[1088,933],[1091,934],[1090,935],[1732,142],[1245,936],[1243,937],[1242,142],[1244,937],[1048,938],[1047,510],[1050,939],[1049,940],[1728,941],[1579,942],[1578,943],[1527,944],[1540,945],[1502,142],[1554,946],[1556,947],[1555,947],[1529,948],[1528,142],[1530,949],[1557,950],[1561,951],[1559,951],[1538,952],[1537,142],[1546,950],[1505,950],[1533,142],[1574,953],[1549,954],[1551,955],[1569,950],[1504,956],[1521,957],[1536,142],[1571,142],[1542,958],[1558,951],[1562,959],[1560,960],[1575,142],[1544,142],[1518,956],[1510,142],[1509,961],[1534,950],[1535,950],[1508,962],[1541,142],[1503,142],[1520,142],[1548,142],[1576,963],[1515,950],[1516,964],[1563,947],[1565,965],[1564,965],[1500,142],[1519,142],[1526,142],[1517,950],[1547,142],[1514,142],[1573,142],[1513,142],[1511,966],[1512,142],[1550,142],[1543,142],[1570,967],[1524,961],[1522,961],[1523,961],[1539,142],[1506,142],[1566,951],[1568,959],[1567,960],[1553,142],[1552,968],[1545,142],[1532,142],[1572,142],[1577,142],[1501,142],[1531,142],[1525,142],[1507,961]],"semanticDiagnosticsPerFile":[1847,1846,1845,46,318,1837,1838,1327,1334,1332,1335,1340,1488,1256,1492,1490,1491,1493,1585,1495,1496,1587,1598,1595,1588,1601,1592,1590,548,1326,1321,325,1323,1324,1597,1594,1600,1591,1331,1329,1333,1330,1453,1235,337,1483,1479,1484,1486,1449,1478,1141,1345,1347,997,339,1344,1346,341,1342,338,1343,540,1487,1233,1451,1403,1251,1250,1252,1359,1355,1353,1375,1374,1371,1372,1350,1376,1363,1370,1367,1368,1380,1401,1366,1364,1402,1379,1361,1378,1452,1348,1253,1254,547,1255,1325,1163,1133,1164,1249,553,552,993,551,1489,1241,1480,1602,1240,1582,1481,1247,1482,1000,1494,1584,1135,1236,1166,1248,1132,1165,1586,1162,324,1844,321,322,320,332,1339,1362,1238,550,1589,1596,1593,1599,1485,1234,1239,1143,1497,1352,1351,1373,1369,1381,1365,1377,1160,1144,1498,1246,995,1358,1159,1400,1450,1140,1158,1237,1142,1499,1328,546,544,323,991,1583,996,1341,1322,998,1360,999,335,334,581,590,592,589,591,588,580,538,539,537,1581,1580,1848,1851,620,612,617,616,615,614,619,618,613,621,622,626,623,627,628,629,631,630,632,634,635,646,645,643,644,642,637,636,638,647,639,641,640,648,649,650,689,690,693,692,691,694,695,696,698,697,699,701,700,702,703,713,704,705,712,711,706,707,708,709,710,715,714,716,718,717,719,723,722,721,720,724,728,727,729,730,731,737,736,735,738,739,745,744,743,746,747,748,750,749,751,752,753,765,766,768,764,763,757,756,767,769,760,759,762,761,755,754,758,771,770,772,773,774,775,776,777,780,779,781,782,783,784,786,785,787,788,789,791,790,792,794,793,795,675,674,676,673,671,672,796,797,799,798,800,801,802,741,740,742,803,804,807,805,806,808,810,809,811,984,815,814,813,812,734,733,732,663,661,660,656,655,654,653,652,651,659,658,657,662,817,816,825,823,824,818,827,826,832,831,828,830,829,625,624,834,833,837,835,836,840,838,839,851,850,848,842,841,843,845,844,847,846,849,854,853,852,856,855,859,858,857,861,860,864,863,862,867,866,865,870,869,868,873,872,871,874,877,876,875,778,726,725,880,879,878,682,681,678,679,677,680,883,882,881,886,885,884,890,889,888,887,896,894,893,892,891,895,899,898,897,902,901,900,905,904,903,687,688,685,669,668,683,670,686,684,908,909,907,906,912,911,910,923,916,915,922,921,920,919,914,913,918,917,925,924,928,927,926,931,930,929,937,933,932,934,936,935,941,940,939,938,944,943,942,955,951,950,954,953,945,947,946,949,948,952,957,633,956,821,820,822,819,960,959,958,964,963,962,961,967,966,965,973,972,969,970,971,968,979,976,975,978,974,977,666,667,665,664,981,980,983,982,1430,1431,1429,1428,1422,1421,1446,1426,1425,1427,1424,1423,1434,1435,1433,1432,1447,1436,1437,1416,1415,1420,1419,1418,1417,1439,1438,1442,1441,1440,1445,1444,1443,1448,1405,1406,1407,1408,1409,1410,1411,1414,1412,1413,1232,1175,1176,1178,1179,1180,1181,1185,1224,1182,1183,1223,1231,1230,1184,1186,1225,1187,1216,1213,1214,1215,1218,1188,1189,1222,1212,1190,1191,1192,1193,1194,1217,1177,1196,1197,1198,1226,1220,1201,1199,1229,1200,1202,1204,1203,1205,1195,1221,1206,1228,1227,1207,1208,1219,1209,1210,1211,1167,1168,1174,1169,1170,1171,1172,1173,985,986,989,990,987,988,611,607,605,579,608,610,606,609,572,577,599,601,574,578,600,575,576,598,573,603,602,604,587,596,593,597,583,584,586,585,594,595,571,582,561,562,554,558,555,567,557,569,556,560,566,570,568,564,563,559,565,274,1784,1787,1786,1785,1783,1779,1782,1781,1780,1778,1793,1792,1791,1790,1789,1788,1679,1678,1667,1668,1660,1661,1680,1665,1663,1664,1666,1670,1676,1672,1675,1677,1671,1674,1669,1673,1688,1683,1682,1681,1687,1800,1836,1834,1827,1826,1828,1830,1829,1832,1831,1835,1833,1604,1603,1825,1824,1823,1696,1695,1701,1702,1719,1718,1698,1697,1717,1716,1700,1699,1713,1712,1706,1705,1704,1703,1708,1707,1715,1714,1720,1721,1709,1711,1710,1692,1690,1689,1691,1693,1839,1694,1822,1807,1806,1808,1801,1809,1730,1729,1805,1804,1821,1811,1820,1803,1802,1810,1817,1814,1818,1819,1816,1815,1812,1813,336,333,1850,1684,1686,1004,1003,1002,1857,1856,1685,1146,1147,1145,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1005,59,60,62,63,64,65,66,67,68,69,70,71,72,74,73,75,76,77,61,111,78,79,80,112,81,82,83,84,85,86,87,88,89,90,91,92,93,95,94,96,97,98,99,100,101,102,1605,103,104,105,106,107,108,109,110,50,117,118,116,114,115,48,52,1124,340,51,1001,1404,413,404,405,406,407,408,409,410,411,412,1634,1635,1134,1096,1095,1123,1097,1098,1099,1100,1101,1102,1121,1103,1104,1122,1120,1105,1106,1108,1109,1110,1111,1119,1112,1113,1114,1115,1116,1117,1118,1126,1125,1128,1129,1131,1127,1130,1107,1776,1733,1735,1734,1739,1774,1771,1773,1736,1737,1741,1740,1738,1772,1770,1775,1768,1769,1742,1747,1749,1744,1745,1751,1752,1743,1748,1750,1746,1766,1765,1767,1761,1763,1762,1758,1764,1759,1760,1753,1754,1755,1756,1757,1349,1722,1320,1278,1279,1280,1281,1283,1282,1284,1285,1286,1260,1287,1288,1289,1257,1276,1277,1272,1263,1290,1291,1271,1275,1274,1292,1273,1293,1269,1296,1295,1264,1297,1307,1265,1294,1318,1301,1298,1299,1300,1309,1268,1302,1303,1304,1305,1306,1308,1317,1310,1312,1311,1313,1314,1315,1316,1319,1262,1259,1266,1261,1270,1267,1258,527,528,529,535,530,531,532,533,534,518,517,536,524,520,511,510,512,513,514,526,515,516,521,522,523,519,525,374,493,497,496,494,495,498,377,389,378,391,393,387,386,388,392,394,379,390,380,382,383,384,385,401,400,501,395,397,396,398,399,500,499,402,484,483,414,415,417,461,482,418,462,459,463,419,420,421,464,458,416,465,422,466,446,423,424,425,456,428,427,467,468,469,430,432,433,439,440,434,470,457,435,436,471,437,429,472,455,473,438,441,442,460,474,475,454,431,476,477,478,479,480,443,481,447,444,445,426,448,451,449,450,403,491,485,486,488,489,487,492,490,376,509,507,508,506,505,504,373,375,371,502,503,381,372,549,1161,1798,1777,1731,1799,49,329,328,327,1139,1138,1136,1137,1455,1456,1454,1627,1855,1797,1796,1795,1794,1046,1044,1045,1853,1852,1854,1849,453,452,1008,1007,1033,1032,1035,1034,1037,1036,1078,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1076,1063,1064,1065,1066,1067,1068,1069,1070,1072,1073,1071,1074,1075,1077,1051,1031,1011,1012,1013,1014,1015,1016,1017,1019,1018,1030,1020,1022,1021,1024,1023,1025,1026,1027,1028,1029,1010,1009,1006,58,277,282,284,136,151,247,250,214,222,206,248,137,181,182,205,249,158,138,162,152,123,204,128,201,1336,199,1337,187,202,302,210,301,299,300,203,192,200,217,218,209,188,207,208,294,297,169,168,167,305,166,143,308,542,1356,541,311,310,312,119,242,150,121,265,266,268,271,267,269,270,149,276,285,289,132,194,193,213,211,212,216,190,131,156,239,124,130,120,252,263,251,262,157,141,231,230,238,232,236,237,235,234,233,178,163,225,164,126,125,229,228,227,226,127,198,215,197,221,223,220,159,113,240,183,261,186,256,139,257,259,260,255,254,160,241,264,133,135,140,224,129,134,185,184,142,191,189,144,146,309,145,147,279,280,278,281,307,148,196,57,219,170,180,287,293,177,291,176,273,175,122,295,173,174,165,179,172,171,161,155,258,154,153,283,195,275,47,56,53,54,55,253,246,245,244,243,286,288,290,543,1357,292,1338,317,296,316,298,303,304,306,313,315,314,272,1633,1643,1613,1609,1610,1607,1612,1611,1639,1631,1629,1615,1608,1617,1616,1630,1624,1659,1606,1642,1645,1640,1641,1656,1626,1625,1622,1658,1651,1620,1652,1623,1655,1654,1637,1653,1650,1657,1636,1646,1644,1632,1621,1619,1638,1618,1614,1628,1648,1647,1649,1043,1040,1041,1042,1038,1039,1384,1397,1383,1385,1386,1387,1388,1389,1390,1391,1392,1393,1394,1395,1396,1399,1382,1398,1474,1477,1475,1476,1457,1458,1463,1464,1472,1465,1467,1466,1468,1469,1471,1470,1473,1460,1462,1461,1459,342,357,358,370,359,360,355,353,344,348,352,350,356,345,346,347,349,351,354,361,362,363,364,365,366,343,367,369,368,994,1093,1092,1354,992,326,1094,1085,1084,1726,1725,1723,1724,545,330,331,1843,1842,1841,1840,1727,1081,1080,319,44,45,8,10,9,2,11,12,13,14,15,16,17,18,3,4,19,23,20,21,22,24,25,26,5,27,28,29,30,6,34,31,32,33,35,7,36,41,42,37,38,39,40,1,43,1662,1083,1079,1082,1087,1086,1089,1088,1091,1090,1732,1245,1243,1242,1244,1048,1047,1050,1049,1728,1579,1578,1527,1540,1502,1554,1556,1555,1529,1528,1530,1557,1561,1559,1538,1537,1546,1505,1533,1574,1549,1551,1569,1504,1521,1536,1571,1542,1558,1562,1560,1575,1544,1518,1510,1509,1534,1535,1508,1541,1503,1520,1548,1576,1515,1516,1563,1565,1564,1500,1519,1526,1517,1547,1514,1573,1513,1511,1512,1550,1543,1570,1524,1522,1523,1539,1506,1566,1568,1567,1553,1552,1545,1532,1572,1577,1501,1531,1525,1507],"affectedFilesPendingEmit":[1847,1846,1845,1837,1838,1327,1334,1332,1335,1340,1488,1256,1492,1490,1491,1493,1585,1495,1496,1587,1598,1595,1588,1601,1592,1590,548,1326,1321,325,1323,1324,1597,1594,1600,1591,1331,1329,1333,1330,1453,1235,337,1483,1479,1484,1486,1449,1478,1141,1345,1347,997,339,1344,1346,341,1342,338,1343,540,1487,1233,1451,1403,1251,1250,1252,1359,1355,1353,1375,1374,1371,1372,1350,1376,1363,1370,1367,1368,1380,1401,1366,1364,1402,1379,1361,1378,1452,1348,1253,1254,547,1255,1325,1163,1133,1164,1249,553,552,993,551,1489,1241,1480,1602,1240,1582,1481,1247,1482,1000,1494,1584,1135,1236,1166,1248,1132,1165,1586,1162,324,1844,321,322,320,332,1339,1362,1238,550,1589,1596,1593,1599,1485,1234,1239,1143,1497,1352,1351,1373,1369,1381,1365,1377,1160,1144,1498,1246,995,1358,1159,1400,1450,1140,1158,1237,1142,1499,1328,546,544,323,991,1583,996,1341,1322,998,1360,999]},"version":"5.3.3"} \ No newline at end of file From 78a9dea3f5765160182d8f2ca47252d4f5603c48 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Fri, 31 May 2024 11:41:44 +0700 Subject: [PATCH 12/36] feat: stringify --- .../nestjs-libraries/src/database/prisma/posts/posts.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts index 941d41dd..6a346f6a 100644 --- a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts @@ -145,7 +145,7 @@ export class PostsService { await this._notificationService.inAppNotification( firstPost.organizationId, `Error posting on ${firstPost.integration?.providerIdentifier} for ${firstPost?.integration?.name}`, - `An error occurred while posting on ${firstPost.integration?.providerIdentifier}`, + `An error occurred while posting on ${firstPost.integration?.providerIdentifier} ${JSON.stringify(err)}`, true ); } From e0599b48c389afa1e3d7fac448c32eb00f4ddb0d Mon Sep 17 00:00:00 2001 From: Nevo David Date: Fri, 31 May 2024 14:50:50 +0700 Subject: [PATCH 13/36] feat: social media --- .../src/api/routes/media.controller.ts | 13 ++--- .../src/services/auth/auth.middleware.ts | 1 - .../components/launches/add.edit.model.tsx | 2 +- .../launches/helpers/date.picker.tsx | 5 -- .../launches/helpers/linkedin.component.tsx | 1 - .../pinterest/pinterest.provider.tsx | 4 +- .../src/components/media/media.component.tsx | 8 ++- .../database/prisma/posts/posts.service.ts | 1 - .../integrations/social/pinterest.provider.ts | 58 +++++++++++++++---- .../src/upload/custom.upload.validation.ts | 46 +++++++++++++++ .../src/upload/upload.module.ts | 4 +- .../src/helpers/video.frame.tsx | 2 +- 12 files changed, 110 insertions(+), 35 deletions(-) create mode 100644 libraries/nestjs-libraries/src/upload/custom.upload.validation.ts diff --git a/apps/backend/src/api/routes/media.controller.ts b/apps/backend/src/api/routes/media.controller.ts index 3b0d371d..a8f910b5 100644 --- a/apps/backend/src/api/routes/media.controller.ts +++ b/apps/backend/src/api/routes/media.controller.ts @@ -8,6 +8,7 @@ import { Query, UploadedFile, UseInterceptors, + UsePipes, } from '@nestjs/common'; import { FileInterceptor } from '@nestjs/platform-express'; import { Express } from 'express'; @@ -15,6 +16,7 @@ import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.reque import { Organization } from '@prisma/client'; import { MediaService } from '@gitroom/nestjs-libraries/database/prisma/media/media.service'; import { ApiTags } from '@nestjs/swagger'; +import { CustomFileValidationPipe } from '@gitroom/nestjs-libraries/upload/custom.upload.validation'; @ApiTags('Media') @Controller('/media') @@ -22,17 +24,10 @@ export class MediaController { constructor(private _mediaService: MediaService) {} @Post('/') @UseInterceptors(FileInterceptor('file')) + @UsePipes(new CustomFileValidationPipe()) async uploadFile( @GetOrgFromRequest() org: Organization, - @UploadedFile( - 'file', - new ParseFilePipe({ - validators: [ - new MaxFileSizeValidator({ maxSize: 10 * 1024 * 1024 }), - new FileTypeValidator({ fileType: /^(image\/.+|video\/mp4)$/ }), - ], - }) - ) + @UploadedFile('file') file: Express.Multer.File ) { const filePath = diff --git a/apps/backend/src/services/auth/auth.middleware.ts b/apps/backend/src/services/auth/auth.middleware.ts index d2040774..cdf6aac6 100644 --- a/apps/backend/src/services/auth/auth.middleware.ts +++ b/apps/backend/src/services/auth/auth.middleware.ts @@ -65,7 +65,6 @@ export class AuthMiddleware implements NestMiddleware { } catch (err) { throw new Error('Unauthorized'); } - console.log('Request...'); next(); } } diff --git a/apps/frontend/src/components/launches/add.edit.model.tsx b/apps/frontend/src/components/launches/add.edit.model.tsx index b911eb6c..2a8c7b87 100644 --- a/apps/frontend/src/components/launches/add.edit.model.tsx +++ b/apps/frontend/src/components/launches/add.edit.model.tsx @@ -255,7 +255,7 @@ export const AddEditModal: FC<{ for (const key of allKeys) { if (key.checkValidity) { - const check = await key.checkValidity(key?.value.map((p: any) => p.image || {path: ''})); + const check = await key.checkValidity(key?.value.map((p: any) => p.image || [])); if (typeof check === 'string') { toaster.show(check, 'warning'); return; diff --git a/apps/frontend/src/components/launches/helpers/date.picker.tsx b/apps/frontend/src/components/launches/helpers/date.picker.tsx index d23bcd5f..52aa7f63 100644 --- a/apps/frontend/src/components/launches/helpers/date.picker.tsx +++ b/apps/frontend/src/components/launches/helpers/date.picker.tsx @@ -22,11 +22,6 @@ export const DatePicker: FC<{ const changeDate = useCallback( (type: 'date' | 'time') => (day: Date) => { - console.log( - type === 'time' - ? date.format('YYYY-MM-DD') + ' ' + dayjs(day).format('HH:mm:ss') - : dayjs(day).format('YYYY-MM-DD') + ' ' + date.format('HH:mm:ss') - ); onChange( dayjs( type === 'time' diff --git a/apps/frontend/src/components/launches/helpers/linkedin.component.tsx b/apps/frontend/src/components/launches/helpers/linkedin.component.tsx index d1b2691c..29e9bb74 100644 --- a/apps/frontend/src/components/launches/helpers/linkedin.component.tsx +++ b/apps/frontend/src/components/launches/helpers/linkedin.component.tsx @@ -181,7 +181,6 @@ export const linkedinCompany = (identifier: string, id: string): ICommand[] => { const state1 = api.setSelectionRange(newSelectionRange); const media = await showPostSelector(id); - console.log(media); executeCommand({ api, selectedText: state1.selectedText, diff --git a/apps/frontend/src/components/launches/providers/pinterest/pinterest.provider.tsx b/apps/frontend/src/components/launches/providers/pinterest/pinterest.provider.tsx index 7d94d5b2..135052bc 100644 --- a/apps/frontend/src/components/launches/providers/pinterest/pinterest.provider.tsx +++ b/apps/frontend/src/components/launches/providers/pinterest/pinterest.provider.tsx @@ -131,8 +131,8 @@ export default withProvider( PinterestPreview, PinterestSettingsDto, async ([firstItem, ...otherItems]) => { - const isMp4 = firstItem.find((item) => item.path.indexOf('mp4') > -1); - const isPicture = firstItem.find((item) => item.path.indexOf('mp4') === -1); + const isMp4 = firstItem?.find((item) => item.path.indexOf('mp4') > -1); + const isPicture = firstItem?.find((item) => item.path.indexOf('mp4') === -1); if (firstItem.length === 0) { return 'Pinterest requires at least one media'; diff --git a/apps/frontend/src/components/media/media.component.tsx b/apps/frontend/src/components/media/media.component.tsx index e2698b0e..2ae51e3c 100644 --- a/apps/frontend/src/components/media/media.component.tsx +++ b/apps/frontend/src/components/media/media.component.tsx @@ -67,12 +67,16 @@ export const MediaBox: FC<{ const uploadMedia = useCallback( async (file: ChangeEvent) => { - const maxFileSize = 10 * 1024 * 1024; + const maxFileSize = + (file?.target?.files?.[0].name.indexOf('mp4') || -1) > -1 + ? 100 * 1024 * 1024 + : 10 * 1024 * 1024; + if ( !file?.target?.files?.length || file?.target?.files?.[0]?.size > maxFileSize ) { - toaster.show('Maximum file size 10mb', 'warning'); + toaster.show(`Maximum file size ${maxFileSize / 1024 / 1024}mb`, 'warning'); return; } const formData = new FormData(); diff --git a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts index 6a346f6a..7bacf814 100644 --- a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts @@ -300,7 +300,6 @@ export class PostsService { integrationId: string ) { if (!(await this._messagesService.canAddPost(id, order, integrationId))) { - console.log('hello'); throw new Error('You can not add a post to this publication'); } const getOrgByOrder = await this._messagesService.getOrgByOrder(order); diff --git a/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts b/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts index 36ad8673..415e64bb 100644 --- a/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts @@ -15,15 +15,43 @@ export class PinterestProvider implements SocialProvider { name = 'Pinterest'; isBetweenSteps = false; - async refreshToken(refresh_token: string): Promise { + async refreshToken(refreshToken: string): Promise { + const { access_token, expires_in } = await ( + await fetch('https://api-sandbox.pinterest.com/v5/oauth/token', { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + Authorization: `Basic ${Buffer.from( + `${process.env.PINTEREST_CLIENT_ID}:${process.env.PINTEREST_CLIENT_SECRET}` + ).toString('base64')}`, + }, + body: new URLSearchParams({ + grant_type: 'refresh_token', + refresh_token: refreshToken, + scope: + 'boards:read,boards:write,pins:read,pins:write,user_accounts:read', + redirect_uri: `${process.env.FRONTEND_URL}/integrations/social/pinterest`, + }), + }) + ).json(); + + const { id, profile_image, username } = await ( + await fetch('https://api-sandbox.pinterest.com/v5/user_account', { + method: 'GET', + headers: { + Authorization: `Bearer ${access_token}`, + }, + }) + ).json(); + return { - refreshToken: '', - expiresIn: 0, - accessToken: '', - id: '', - name: '', - picture: '', - username: '', + id: id, + name: username, + accessToken: access_token, + refreshToken: refreshToken, + expiresIn: expires_in, + picture: profile_image, + username, }; } @@ -110,7 +138,14 @@ export class PinterestProvider implements SocialProvider { postDetails: PostDetails[] ): Promise { let mediaId = ''; - if ((postDetails?.[0]?.media?.[0]?.path?.indexOf('mp4') || -1) > -1) { + const findMp4 = postDetails?.[0]?.media?.find( + (p) => (p.path?.indexOf('mp4') || -1) > -1 + ); + const picture = postDetails?.[0]?.media?.find( + (p) => (p.path?.indexOf('mp4') || -1) === -1 + ); + + if (findMp4) { const { upload_url, media_id, upload_parameters } = await ( await fetch('https://api-sandbox.pinterest.com/v5/media', { method: 'POST', @@ -197,6 +232,7 @@ export class PinterestProvider implements SocialProvider { ? { source_type: 'video_id', media_id: mediaId, + cover_image_url: picture?.url, } : mapImages?.length === 1 ? { @@ -213,9 +249,9 @@ export class PinterestProvider implements SocialProvider { return [ { - id, + id: postDetails?.[0]?.id, postId: pId, - releaseURL: link, + releaseURL: `https://www.pinterest.com/pin/${pId}`, status: 'success', }, ]; diff --git a/libraries/nestjs-libraries/src/upload/custom.upload.validation.ts b/libraries/nestjs-libraries/src/upload/custom.upload.validation.ts new file mode 100644 index 00000000..add65c38 --- /dev/null +++ b/libraries/nestjs-libraries/src/upload/custom.upload.validation.ts @@ -0,0 +1,46 @@ +import { + BadRequestException, + FileTypeValidator, + Injectable, + MaxFileSizeValidator, + ParseFilePipe, + PipeTransform, +} from '@nestjs/common'; + +@Injectable() +export class CustomFileValidationPipe implements PipeTransform { + async transform(value: any) { + if (!value) { + throw 'No file provided.'; + } + + if (!value.mimetype) { + return value; + } + + // Set the maximum file size based on the MIME type + const maxSize = this.getMaxSize(value.mimetype); + const validation = + (value.mimetype.startsWith('image/') || + value.mimetype.startsWith('video/mp4')) && + value.size <= maxSize; + + if (validation) { + return value; + } + + throw new BadRequestException( + `File size exceeds the maximum allowed size of ${maxSize} bytes.` + ); + } + + private getMaxSize(mimeType: string): number { + if (mimeType.startsWith('image/')) { + return 10 * 1024 * 1024; // 10 MB + } else if (mimeType.startsWith('video/')) { + return 1024 * 1024 * 1024; // 1 GB + } else { + throw new BadRequestException('Unsupported file type.'); + } + } +} diff --git a/libraries/nestjs-libraries/src/upload/upload.module.ts b/libraries/nestjs-libraries/src/upload/upload.module.ts index 1c94dfa8..c74ec29e 100644 --- a/libraries/nestjs-libraries/src/upload/upload.module.ts +++ b/libraries/nestjs-libraries/src/upload/upload.module.ts @@ -4,6 +4,7 @@ import { diskStorage } from 'multer'; import { mkdirSync } from 'fs'; import { extname } from 'path'; import CloudflareStorage from '@gitroom/nestjs-libraries/upload/cloudflare.storage'; +import { CustomFileValidationPipe } from '@gitroom/nestjs-libraries/upload/custom.upload.validation'; const storage = process.env.CLOUDFLARE_ACCOUNT_ID && @@ -51,8 +52,9 @@ const storage = storage, }), ], + providers: [CustomFileValidationPipe], get exports() { - return this.imports; + return [...this.imports, ...this.providers]; }, }) export class UploadModule {} diff --git a/libraries/react-shared-libraries/src/helpers/video.frame.tsx b/libraries/react-shared-libraries/src/helpers/video.frame.tsx index a7275660..37325d21 100644 --- a/libraries/react-shared-libraries/src/helpers/video.frame.tsx +++ b/libraries/react-shared-libraries/src/helpers/video.frame.tsx @@ -5,5 +5,5 @@ import { FC } from 'react'; export const VideoFrame: FC<{ url: string }> = (props) => { const { url } = props; - return ; + return ; }; From 4a5e93c35618747abbaeec231f5b3ebe57a71871 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Sun, 2 Jun 2024 17:25:22 +0700 Subject: [PATCH 14/36] feat: refresh tokens fallback --- .../src/api/routes/integrations.controller.ts | 9 + apps/frontend/next.config.js | 11 +- .../public/icons/platforms/dribbble.png | Bin 0 -> 2787 bytes .../public/icons/platforms/linkedin-page.png | Bin 0 -> 1071 bytes apps/frontend/public/postiz-fav.png | Bin 0 -> 3300 bytes .../frontend/src/app/(site)/launches/page.tsx | 2 +- apps/frontend/src/app/layout.tsx | 3 +- .../launches/launches.component.tsx | 17 +- .../linkedin/linkedin.continue.tsx | 102 +++++++ .../providers/continue-provider/list.tsx | 6 +- .../launches/providers/show.all.providers.tsx | 1 + .../integrations/integration.service.ts | 40 ++- .../database/prisma/posts/posts.service.ts | 119 +++++--- .../src/integrations/integration.manager.ts | 6 +- .../src/integrations/social.abstract.ts | 13 + .../integrations/social/dribbble.provider.ts | 271 ++++++++++++++++++ .../integrations/social/facebook.provider.ts | 21 +- .../integrations/social/instagram.provider.ts | 35 +-- .../social/linkedin.page.provider.ts | 198 +++++++++++++ .../integrations/social/linkedin.provider.ts | 51 ++-- .../integrations/social/pinterest.provider.ts | 21 +- .../integrations/social/reddit.provider.ts | 23 +- .../integrations/social/tiktok.provider.ts | 21 +- .../src/integrations/social/x.provider.ts | 3 +- .../integrations/social/youtube.provider.ts | 3 +- .../src/helpers/image.with.fallback.tsx | 27 ++ 26 files changed, 862 insertions(+), 141 deletions(-) create mode 100644 apps/frontend/public/icons/platforms/dribbble.png create mode 100644 apps/frontend/public/icons/platforms/linkedin-page.png create mode 100644 apps/frontend/public/postiz-fav.png create mode 100644 apps/frontend/src/components/launches/providers/continue-provider/linkedin/linkedin.continue.tsx create mode 100644 libraries/nestjs-libraries/src/integrations/social.abstract.ts create mode 100644 libraries/nestjs-libraries/src/integrations/social/dribbble.provider.ts create mode 100644 libraries/nestjs-libraries/src/integrations/social/linkedin.page.provider.ts create mode 100644 libraries/react-shared-libraries/src/helpers/image.with.fallback.tsx diff --git a/apps/backend/src/api/routes/integrations.controller.ts b/apps/backend/src/api/routes/integrations.controller.ts index aded60b2..2fb340df 100644 --- a/apps/backend/src/api/routes/integrations.controller.ts +++ b/apps/backend/src/api/routes/integrations.controller.ts @@ -261,6 +261,15 @@ export class IntegrationsController { return this._integrationService.saveFacebook(org.id, id, body.page); } + @Post('/linkedin-page/:id') + async saveLinkedin( + @Param('id') id: string, + @Body() body: { page: string }, + @GetOrgFromRequest() org: Organization + ) { + return this._integrationService.saveLinkedin(org.id, id, body.page); + } + @Post('/enable') enableChannel( @GetOrgFromRequest() org: Organization, diff --git a/apps/frontend/next.config.js b/apps/frontend/next.config.js index 8edcfcf5..34610438 100644 --- a/apps/frontend/next.config.js +++ b/apps/frontend/next.config.js @@ -12,13 +12,20 @@ const nextConfig = { // See: https://github.com/gregberge/svgr svgr: false, }, + images: { + remotePatterns: [ + { + protocol: 'https', + hostname: '**', + }, + ], + }, env: { isBillingEnabled: String(!!process.env.STRIPE_PUBLISHABLE_KEY), isGeneral: String(!!process.env.IS_GENERAL), - } + }, }; - const plugins = [ // Add more Next.js plugins to this list if needed. withNx, diff --git a/apps/frontend/public/icons/platforms/dribbble.png b/apps/frontend/public/icons/platforms/dribbble.png new file mode 100644 index 0000000000000000000000000000000000000000..4d3aa5354bc4d892d62a5fc34acfccca5c5b358b GIT binary patch literal 2787 zcmV<93LN!`P)DFPv7 zl}ixh11hLxiF>(}3u=i=St?j=d=V*kDO0W#D1{_+3}FN&B6UF**{j!LpE36ob2R7(q(E5e zl;HH>D3v>RQu+Nun2Hwznt{v+h^hIg);#%-y#e?9r6(z9sy;(s_%){LVZ0D5iEwRH za}L$ff^$wM&Z}O5$hgTf;lX}NH*dk)zW0RRUl!9$t%TR5Fx)vJm(Sx|> zE(RHc8oBWfDw}s9(oQ@lGWEX*Y=xTFNc!UCWH!DU*_^9ez)-w-3zgd*9)E6{qCR!z zrC*-zWK;2RS1qRLt5+clnHa;qK1Oc1gVK-xg3LHL%NGLRoV|!($39HeM<|J~B*In* z$3iGcRIK9f+E4ZVClQW?-PI04;I29YEQP;wKf+co0FW@k?wU{24ev<&xVm{4!{4}_ z@acYJHih@dKHT$`qFNgeu8p;zh05lg28T3qiKf;nNQJp-CGi+%9|cw18PAt7^wW=5lTP5ACXOgI_{tg@E?Dg z${%-(D|GF8tc9)P3Gsx5BTOwId({OLKK@2f5`A=ts8o%g{on>f&Yf1`oEk`=anC)2 z^!nxT@IW7>@Be8+{}pM6;w|@}j}FD-j7!72F9O53LMF~7B9o$U-DNafdno|==nw-R z`x%wnw}UZQ3tGr*T#YIFvj9X%a@Vd;hQnX^U0ve|%p?TTwHf)=9}~Aoty_lO-Hxe+ zn5vJ7B2w#?(Q?zfNpCnCq#)RRl)=yZ5>u*D-t+*vcLadk)oYPi_tZOjIza5McI+i_ zva4?1MfB_t*i#%pB?x*BQ`^>){8aetTM)Lwy`YPh8{a|W^>0PBHvv$)?@0zfeJfFa z5iEt#5hLH*oIIPoW-X=`O!~^nHHr-G>Lm!*#&`jhKR-4(2xCASjMflniZ|U&YTdFJ zTU(yipL`J2mQQj`bgV?_r}t6a`WQk=sJp93+4zs_LmwJIb+nLr-I0JKj@G45s?0N6EeS5@bsQR%a{0p5B=O5lUipv;q(w=tCA#$b1HovJq(q znNK5|8c=f!s5yDm+(y*=Mr1=evHEkxdw35c-?@vZe+1#$h|B~TT!6p(2*wW)X$RHb zGD9Gt#(L%aWazA3Lfg+i3`!wvIju_7ls&?Iz38DbsWsgo1@@Wq(MJZ8%7C#md#;;gQtI8j6)p+4C%LrnNN)bmLDUv$O zcp-!uXW2qh7oQbZ#&wa+InoWpBhgS9|A|AGp)!#lfRMV21F=9`1G;y ziHlkZ5B4D@0#ff)WY#73o{Py|vHFC7pbrh;J$8`vCCd?MhiJ6M@b$j}sg5Hi1W18& z9Yj+G=iJ5QKd>R5-#apC`#kZESc-7pc(`*{c2e8=_=E}3jC$B-wo~}*My$>`$?ty8 zVJdfQ$9rfGX0(da{R*rlbFn&Fuolfh_ZLrc8)Gz4e-XXEFEK`Nuzynbn$%B>j*?w* z&h9vMz89rWn=-S7La=V%J?0FWx|8UPBC$sK#&6Ok-Zo%K%^bg>y|+< zUhfz$B)#q|3fEm0m-WU_`r%fFzjhl@u@;jE$NRMu=-y$%gZ;6-Sr_N51t(RurWW9= z>P+%j?V2oOAVBsnXYE6zhSW#c@dBb=`J6h8Upcw!VWeB&LAZrX;h)P$s) z$fl^=Ro@jMa8`DXXZNu=Qj-6~8cW?8GU#Ngdq3Mi%4DA4S=_OFQuQ~J7o!RyhIg`@K7Dd z!d8T1VQK+(cRNjAy(%tks8U3-~eHJAuRvG^0?U+EvNwJ;)OSjyEuuqfb3^c*s z@f@Y*bv-jc_b78($ME(UwmvU;5EjMt`yG zw8`w5lh|_#F^Ro;$#_K35&o0U;Q#XgLC<0Iu~MA5BZF`)WFdoUZ^k)i5$-vQk#q9N zn&H#ODBW@o-h;alS%=fT1$zG13Ts|P?&`Hzooy%22{iaYd~s!|nErfD7>$N2R5$Nr z^tb=OjMip+tuW(@9$`r^g4%um!rQ(FchzE2mn_Fwu@G6v#_fu&z*Z;O)>M6hy}fwb zdZ=ydLHCZtJirV=!1LIV6C}BM6R6e(R7WfJqBdk}4$+W82uW1+Z{}&TNP@k`tuV4TG002ovPDHLkV1m3MLB9Y1 literal 0 HcmV?d00001 diff --git a/apps/frontend/public/icons/platforms/linkedin-page.png b/apps/frontend/public/icons/platforms/linkedin-page.png new file mode 100644 index 0000000000000000000000000000000000000000..3ce04bcdfc9bcd0bf84817bbb0e29e98c5cd6989 GIT binary patch literal 1071 zcmV+~1kn45P) zO{H$yN<1VMtl02au|r}36@Nihu>*;MR0%1f5|2%aDgkOm1O(J1&^C<%uAMk>{J4)9 z7WOsqz1R2J!cL0nZ(;e4M>D^B&Y5%0nDD_g?mn^Y1_;&ws~Zily3t*VrF1k)N(cY| zBTzqaTt!(+0+!Gjjiq9l9hxE}Y_SDcq1KXsBaYvndgtiqllzBFA*SY5-n)F`dcF*m zZyy%qv!gpcJ9#*z*QfE9A4*T`j-R;j^X-xerH^qLwsb<}uRfk}nHrkhmw0g^4I%r- z6oF-E{L%D~fBe3b!LgkE9kQmDWcyJLIIv1-+AOf(sblE^DEyku0roD2?LGX zE8XuMdp-&afGtpU00{{&LQDbMlT0r7`{kS!VBZcX=`;q-%P57TB5aO&{x507V2 zb3*p*ab43ndubxwj;StAbn?)iquHIX+LCQg8#p?wJvTlQ;>3S*B{Fmir0SGk(i6{RZ1qq7&ye>=1SjxjEh8AM%?Sa%UI73!UyIC%+GIE&vV&OOur4pIt-7Uy zGs;)&I~5y500d!bA)krs&HjWDmNqOf&)d>(h3eEop;>VZg-?8Cko=FEh8RJ%?k9sxKm_t(wO14tQTWXXEXXzi>x9`R pVAam2ZlwlT-DrT-jRsiV=pT4MRA*p0Mi~GA002ovPDHLkV1nCR`w##C literal 0 HcmV?d00001 diff --git a/apps/frontend/public/postiz-fav.png b/apps/frontend/public/postiz-fav.png new file mode 100644 index 0000000000000000000000000000000000000000..64a1cf0bfbbb1ea54a989d2a0b4cafb2d1ad309c GIT binary patch literal 3300 zcmZ`*c{J4T+x{>kVG1RNNZAcCb|zV}WYAz5n(XT^46=&fAM|XkfgjqKFK0&$tC2Fl&;)~XPefll|wN(rlcuq zIp7oZM`3uLTcJ~!Yhpq)2KhXgP&Mw0hagq;!ulbE*IGMLcJ2dw#802y#$rvs)|G zFU7!??f%)P)p@#ZSX=6}O8s*JzC&HKNMF&WgWW0HzEY+Oq1>J6UdG2;%&e&ygNCIF zrRrc{cD+kimfRb*Y;WJ(4t&;5(kXs2U{%$r5LLsvE;?qc9?pltI*L}GPX}9^X3^d_ zHkE_ufr1r0FO-iuy-t%Sb1!;ulUq&#agL61$;s2~*SU*LU&AHQwnftSs1Cf=L_3+e{ObP|jCKT7W|Cp??PnWw^Zd7s9+dZ1Fk^MbK@h~pR%dNU( z>zY@SS<87sTltSsCq!YP$0Va5-paE7<`sL{e|V+dXGHVxKwEV_UA#;Ye) zpKP^R0A9q&z)IZ?ZvJv&WYG|#T^mj@xl_wgCMkENrI>0(0Y}cxH?MfJ^RpH)>*u4a zd^#Vz{ZmA6ZQrlrYry$QaPDmD*6w$|>Hg;g^U@>J%i^i`47(U_C_036@EL8PlLnu$ zj?rU#tUC%v9Y;1jqqM8jwJ&WiFE9J7evHZ>X4#+oaYB}!oV&_qDIP68JpIKMl)!u6 zoD&9mtgJJ4a&s~M#@$RBc!3`gcGk!&^SH7IFJt1_m<8&#l>~pxgBgCSFPuD9@8L*3pn3sQZb}T{595DOGg>gR zMsRF@tW#`yWA3PRkfeMjQAe1$C!4kOt7&WT&$R3H!~S3{zfj`Y%B~vKMRx^&=)ws= z!yDqj>JVX*yz$Lp7uVLS>`ua|I!-AeFJt$)7O9nd2hBhX^UkWuN_1$6p{+Bmo9&AgNzf0Rxs12Wf**L-S(vjn$3v-h~Ao zE2xWOp>Y+pPmC}%lpzX}bgB93aLKp9cBWW}r8U754sz4280ACW?h?uwm}~xs46?I} zkVnamDo>4X2_v~xz@-L9#5nLUE}SnKFDi4P;6rt2wG5{nzD$)xBi)vt0|5WsuX`-W z#N0(9!8JJ@n3+b_->0j@Q?2`@*V!##@v}CmFU8D<{NwD{sVhgJa)Mlopwwpd^ zp*>P~|0{IaTy{+i3zdzxv)Nr|+za(Y1kwS;U!i^Ndx?0* zbWbN6$RjfuRanjxCb-zR%h+B^x-DyFY~zlPe|Wb+sMkSHif~?Z{wU#cYUs`Fo|Rot zvvJkHPA@$&2`+bs#CyWcH6a-|YrnNWo~V6^D$le_!5)q_CAShdL!P%n-T^6N^iVe+ zfqIV4{uhUnqDKMk-@kYM+1b$%-)*-D4y!V$f3n)3rnvuY1SB~=`!?OgkT9eo4me!8?^FLc}$F4-q zs|dRgo73I|ICKBF`XlRSWKc~drnlMGrDS3gcNerhp{F#Y`u(F9O%Y?>q~jIMEYRCA zNd)3U>T&B}e|^9|jEYcldZ z&B2yXt|}gV$jI&5Mpv36%f=aFg~IMXwfFEQB{K*)Oa(2Jn_Dyr9z!vk4{IgYXVYrd z6QApIRZ%Zi$*he=m+y$2525>N*6E5LMB^%Cq(gRv&5MOzyb>EDSMRccq%UX&&^4XG zLIO|z@N4eTsf%By8>#DX_s=k|mrDuNu2mdLDG;)*_Fe*B#KrSG=Vlj&%D;$NWwvyy zQt4$`_4b4Ke-KaA1_7AVhROMX(a%Gx6GGIXY!%8t-qrm9>Ni!_o(P0=NZgU5JeN3p zk(_DejKj%KS_u&c6MKuA)r%EhQVlv?bSG^3Z1TmJB(pKl7SqeJC#CP1oNXL)I8Zpd#MpLPoPU`+jI2^Xha3*3 z%(8|S-72F}bLI1IKl{W*(G{auEVjtJV#Kk|p)ON&^!m5-G)g-xn7=sy)gIICdU!~! zQ~Mka8HyaB#7?nR<%7&!l5*%Z#eUwCwy>IbJ+g;jL%?NBbaJ?P{r#qyk{Oo~$9lY+ zNuc0QujOSnih{Of=A}j^)@9^8qc@Zx^HqI7IS=+63y%G0-7(J>E2ESvET}y{$%hXP z+<=`&{~#qC9OpW#9H3f!>R}1g75V1zvx~K3HhuR8lSPo{X}VVtIk#I-S}Xz_8d{t% zr0v_JE^SspcCUq4sSJi$w=R6y{bNNRz~c1wCZqd zMveor5+v*7zVdg+2vYskjoSff-g_1A8(o(>&iQ2G-No%F_;E<8DU*KoTw~Ee4krgG*o};0P%> zgoLaJ9FBm)VV}CD{vW~F)fSKQ{qF=5Vi1l(5c-urT+S!<+J|*R&+39 literal 0 HcmV?d00001 diff --git a/apps/frontend/src/app/(site)/launches/page.tsx b/apps/frontend/src/app/(site)/launches/page.tsx index 2c3b5948..82e36764 100644 --- a/apps/frontend/src/app/(site)/launches/page.tsx +++ b/apps/frontend/src/app/(site)/launches/page.tsx @@ -6,7 +6,7 @@ import {LaunchesComponent} from "@gitroom/frontend/components/launches/launches. import {Metadata} from "next"; export const metadata: Metadata = { - title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Launches`, + title: `${isGeneral() ? 'Postiz Calendar' : 'Gitroom Launches'}`, description: '', } diff --git a/apps/frontend/src/app/layout.tsx b/apps/frontend/src/app/layout.tsx index 660310ef..9841de5c 100644 --- a/apps/frontend/src/app/layout.tsx +++ b/apps/frontend/src/app/layout.tsx @@ -7,6 +7,7 @@ import 'react-tooltip/dist/react-tooltip.css'; import LayoutContext from '@gitroom/frontend/components/layout/layout.context'; import { ReactNode } from 'react'; import { Chakra_Petch } from 'next/font/google'; +import { isGeneral } from '@gitroom/react/helpers/is.general'; const chakra = Chakra_Petch({ weight: '400', subsets: ['latin'] }); @@ -14,7 +15,7 @@ export default async function AppLayout({ children }: { children: ReactNode }) { return ( - + {children} diff --git a/apps/frontend/src/components/launches/launches.component.tsx b/apps/frontend/src/components/launches/launches.component.tsx index 534c9086..2b8b1239 100644 --- a/apps/frontend/src/components/launches/launches.component.tsx +++ b/apps/frontend/src/components/launches/launches.component.tsx @@ -16,6 +16,7 @@ import { Menu } from '@gitroom/frontend/components/launches/menu/menu'; import { GeneratorComponent } from '@gitroom/frontend/components/launches/generator/generator'; import { useRouter } from 'next/navigation'; import { Integration } from '@prisma/client'; +import ImageWithFallback from '@gitroom/react/helpers/image.with.fallback'; export const LaunchesComponent = () => { const fetch = useFetch(); @@ -71,10 +72,15 @@ export const LaunchesComponent = () => { ); const refreshChannel = useCallback( - (integration: Integration & {identifier: string}) => async () => { - const {url} = await (await fetch(`/integrations/social/${integration.identifier}?refresh=${integration.internalId}`, { - method: 'GET', - })).json(); + (integration: Integration & { identifier: string }) => async () => { + const { url } = await ( + await fetch( + `/integrations/social/${integration.identifier}?refresh=${integration.internalId}`, + { + method: 'GET', + } + ) + ).json(); window.location.href = url; }, @@ -134,7 +140,8 @@ export const LaunchesComponent = () => {
)} - {integration.identifier} void; + existingId: string[]; +}> = (props) => { + const { closeModal, existingId } = props; + const call = useCustomProviderFunction(); + const { integration } = useIntegration(); + const [page, setSelectedPage] = useState(null); + const fetch = useFetch(); + + const loadPages = useCallback(async () => { + try { + const pages = await call.get('companies'); + return pages; + } catch (e) { + closeModal(); + } + }, []); + + const setPage = useCallback( + (param: { id: string; pageId: string }) => () => { + setSelectedPage(param); + }, + [] + ); + + const { data } = useSWR('load-pages', loadPages, { + refreshWhenHidden: false, + refreshWhenOffline: false, + revalidateOnFocus: false, + revalidateIfStale: false, + revalidateOnMount: true, + revalidateOnReconnect: false, + refreshInterval: 0, + }); + + const saveLinkedin = useCallback(async () => { + await fetch(`/integrations/linkedin-page/${integration?.id}`, { + method: 'POST', + body: JSON.stringify(page), + }); + + closeModal(); + }, [integration, page]); + + const filteredData = useMemo(() => { + return ( + data?.filter((p: { id: string }) => !existingId.includes(p.id)) || [] + ); + }, [data]); + + return ( +
+
Select Linkedin Account:
+
+ {filteredData?.map( + (p: { + id: string; + pageId: string; + username: string; + name: string; + picture: string; + }) => ( +
+
+ profile +
+
{p.name}
+
+ ) + )} +
+
+ +
+
+ ); +}; diff --git a/apps/frontend/src/components/launches/providers/continue-provider/list.tsx b/apps/frontend/src/components/launches/providers/continue-provider/list.tsx index 0bec9f55..7ff24102 100644 --- a/apps/frontend/src/components/launches/providers/continue-provider/list.tsx +++ b/apps/frontend/src/components/launches/providers/continue-provider/list.tsx @@ -1,7 +1,9 @@ import { InstagramContinue } from '@gitroom/frontend/components/launches/providers/continue-provider/instagram/instagram.continue'; import { FacebookContinue } from '@gitroom/frontend/components/launches/providers/continue-provider/facebook/facebook.continue'; +import { LinkedinContinue } from '@gitroom/frontend/components/launches/providers/continue-provider/linkedin/linkedin.continue'; export const continueProviderList = { instagram: InstagramContinue, - facebook: FacebookContinue -} \ No newline at end of file + facebook: FacebookContinue, + 'linkedin-page': LinkedinContinue, +}; diff --git a/apps/frontend/src/components/launches/providers/show.all.providers.tsx b/apps/frontend/src/components/launches/providers/show.all.providers.tsx index a4996015..2ee9aa87 100644 --- a/apps/frontend/src/components/launches/providers/show.all.providers.tsx +++ b/apps/frontend/src/components/launches/providers/show.all.providers.tsx @@ -16,6 +16,7 @@ export const Providers = [ {identifier: 'devto', component: DevtoProvider}, {identifier: 'x', component: XProvider}, {identifier: 'linkedin', component: LinkedinProvider}, + {identifier: 'linkedin-page', component: LinkedinProvider}, {identifier: 'reddit', component: RedditProvider}, {identifier: 'medium', component: MediumProvider}, {identifier: 'hashnode', component: HashnodeProvider}, diff --git a/libraries/nestjs-libraries/src/database/prisma/integrations/integration.service.ts b/libraries/nestjs-libraries/src/database/prisma/integrations/integration.service.ts index d9ec0be0..2f201b73 100644 --- a/libraries/nestjs-libraries/src/database/prisma/integrations/integration.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/integrations/integration.service.ts @@ -4,9 +4,9 @@ import { IntegrationManager } from '@gitroom/nestjs-libraries/integrations/integ import { InstagramProvider } from '@gitroom/nestjs-libraries/integrations/social/instagram.provider'; import { FacebookProvider } from '@gitroom/nestjs-libraries/integrations/social/facebook.provider'; import { SocialProvider } from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface'; -import { Integration, Organization } from '@prisma/client'; +import { Integration } from '@prisma/client'; import { NotificationService } from '@gitroom/nestjs-libraries/database/prisma/notifications/notification.service'; -import { YoutubeProvider } from '@gitroom/nestjs-libraries/integrations/social/youtube.provider'; +import { LinkedinPageProvider } from '@gitroom/nestjs-libraries/integrations/social/linkedin.page.provider'; @Injectable() export class IntegrationService { @@ -86,6 +86,10 @@ export class IntegrationService { ); } + async refreshNeeded(org: string, id: string) { + return this._integrationRepository.refreshNeeded(org, id); + } + async refreshTokens() { const integrations = await this._integrationRepository.needsToBeRefreshed(); for (const integration of integrations) { @@ -195,6 +199,38 @@ export class IntegrationService { return { success: true }; } + async saveLinkedin(org: string, id: string, page: string) { + const getIntegration = await this._integrationRepository.getIntegrationById( + org, + id + ); + if (getIntegration && !getIntegration.inBetweenSteps) { + throw new HttpException('Invalid request', HttpStatus.BAD_REQUEST); + } + + const linkedin = this._integrationManager.getSocialIntegration( + 'linkedin-page' + ) as LinkedinPageProvider; + + const getIntegrationInformation = await linkedin.fetchPageInformation( + getIntegration?.token!, + page + ); + + await this.checkForDeletedOnceAndUpdate(org, String(getIntegrationInformation.id)); + + await this._integrationRepository.updateIntegration(String(id), { + picture: getIntegrationInformation.picture, + internalId: String(getIntegrationInformation.id), + name: getIntegrationInformation.name, + inBetweenSteps: false, + token: getIntegrationInformation.access_token, + profile: getIntegrationInformation.username, + }); + + return { success: true }; + } + async saveFacebook(org: string, id: string, page: string) { const getIntegration = await this._integrationRepository.getIntegrationById( org, diff --git a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts index 7bacf814..80002293 100644 --- a/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/posts/posts.service.ts @@ -16,6 +16,7 @@ import { OpenaiService } from '@gitroom/nestjs-libraries/openai/openai.service'; import { CreateGeneratedPostsDto } from '@gitroom/nestjs-libraries/dtos/generator/create.generated.posts.dto'; import { IntegrationService } from '@gitroom/nestjs-libraries/database/prisma/integrations/integration.service'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; +import { RefreshToken } from '@gitroom/nestjs-libraries/integrations/social.abstract'; type PostWithConditionals = Post & { integration?: Integration; @@ -145,7 +146,9 @@ export class PostsService { await this._notificationService.inAppNotification( firstPost.organizationId, `Error posting on ${firstPost.integration?.providerIdentifier} for ${firstPost?.integration?.name}`, - `An error occurred while posting on ${firstPost.integration?.providerIdentifier} ${JSON.stringify(err)}`, + `An error occurred while posting on ${ + firstPost.integration?.providerIdentifier + } ${JSON.stringify(err)}`, true ); } @@ -173,19 +176,33 @@ export class PostsService { return this.updateTags(orgId, JSON.parse(newPlainText) as Post[]); } - private async postSocial(integration: Integration, posts: Post[]) { + private async postSocial( + integration: Integration, + posts: Post[], + forceRefresh = false + ): Promise> { const getIntegration = this._integrationManager.getSocialIntegration( integration.providerIdentifier ); if (!getIntegration) { - return; + return {}; } - if (dayjs(integration?.tokenExpiration).isBefore(dayjs())) { + if (dayjs(integration?.tokenExpiration).isBefore(dayjs()) || forceRefresh) { const { accessToken, expiresIn, refreshToken } = await getIntegration.refreshToken(integration.refreshToken!); + if (!accessToken) { + await this._integrationService.refreshNeeded( + integration.organizationId, + integration.id + ); + + await this._integrationService.informAboutRefreshError(integration.organizationId, integration); + return {}; + } + await this._integrationService.createOrUpdateIntegration( integration.organizationId, integration.name, @@ -203,51 +220,59 @@ export class PostsService { const newPosts = await this.updateTags(integration.organizationId, posts); - const publishedPosts = await getIntegration.post( - integration.internalId, - integration.token, - newPosts.map((p) => ({ - id: p.id, - message: p.content, - settings: JSON.parse(p.settings || '{}'), - media: (JSON.parse(p.image || '[]') as Media[]).map((m) => ({ - url: - m.path.indexOf('http') === -1 - ? process.env.FRONTEND_URL + - '/' + - process.env.NEXT_PUBLIC_UPLOAD_STATIC_DIRECTORY + - m.path - : m.path, - type: 'image', - path: - m.path.indexOf('http') === -1 - ? process.env.UPLOAD_DIRECTORY + m.path - : m.path, - })), - })) - ); - - for (const post of publishedPosts) { - await this._postRepository.updatePost( - post.id, - post.postId, - post.releaseURL + try { + const publishedPosts = await getIntegration.post( + integration.internalId, + integration.token, + newPosts.map((p) => ({ + id: p.id, + message: p.content, + settings: JSON.parse(p.settings || '{}'), + media: (JSON.parse(p.image || '[]') as Media[]).map((m) => ({ + url: + m.path.indexOf('http') === -1 + ? process.env.FRONTEND_URL + + '/' + + process.env.NEXT_PUBLIC_UPLOAD_STATIC_DIRECTORY + + m.path + : m.path, + type: 'image', + path: + m.path.indexOf('http') === -1 + ? process.env.UPLOAD_DIRECTORY + m.path + : m.path, + })), + })) ); + + for (const post of publishedPosts) { + await this._postRepository.updatePost( + post.id, + post.postId, + post.releaseURL + ); + } + + await this._notificationService.inAppNotification( + integration.organizationId, + `Your post has been published on ${capitalize( + integration.providerIdentifier + )}`, + `Your post has been published at ${publishedPosts[0].releaseURL}`, + true + ); + + return { + postId: publishedPosts[0].postId, + releaseURL: publishedPosts[0].releaseURL, + }; + } catch (err) { + if (err instanceof RefreshToken) { + return this.postSocial(integration, posts, true); + } + + throw err; } - - await this._notificationService.inAppNotification( - integration.organizationId, - `Your post has been published on ${capitalize( - integration.providerIdentifier - )}`, - `Your post has been published at ${publishedPosts[0].releaseURL}`, - true - ); - - return { - postId: publishedPosts[0].postId, - releaseURL: publishedPosts[0].releaseURL, - }; } private async postArticle(integration: Integration, posts: Post[]) { diff --git a/libraries/nestjs-libraries/src/integrations/integration.manager.ts b/libraries/nestjs-libraries/src/integrations/integration.manager.ts index efa47538..c0e93cda 100644 --- a/libraries/nestjs-libraries/src/integrations/integration.manager.ts +++ b/libraries/nestjs-libraries/src/integrations/integration.manager.ts @@ -12,16 +12,20 @@ import { InstagramProvider } from '@gitroom/nestjs-libraries/integrations/social import { YoutubeProvider } from '@gitroom/nestjs-libraries/integrations/social/youtube.provider'; import { TiktokProvider } from '@gitroom/nestjs-libraries/integrations/social/tiktok.provider'; import { PinterestProvider } from '@gitroom/nestjs-libraries/integrations/social/pinterest.provider'; +import { DribbbleProvider } from '@gitroom/nestjs-libraries/integrations/social/dribbble.provider'; +import { LinkedinPageProvider } from '@gitroom/nestjs-libraries/integrations/social/linkedin.page.provider'; const socialIntegrationList = [ new XProvider(), new LinkedinProvider(), + new LinkedinPageProvider(), new RedditProvider(), new FacebookProvider(), new InstagramProvider(), new YoutubeProvider(), new TiktokProvider(), - new PinterestProvider() + new PinterestProvider(), + new DribbbleProvider(), ]; const articleIntegrationList = [ diff --git a/libraries/nestjs-libraries/src/integrations/social.abstract.ts b/libraries/nestjs-libraries/src/integrations/social.abstract.ts new file mode 100644 index 00000000..52439fdb --- /dev/null +++ b/libraries/nestjs-libraries/src/integrations/social.abstract.ts @@ -0,0 +1,13 @@ +export class RefreshToken { +} + +export abstract class SocialAbstract { + async fetch(url: string, options: RequestInit = {}) { + const request = await fetch(url, options); + if (request.status === 401) { + throw new RefreshToken(); + } + + return request; + } +} \ No newline at end of file diff --git a/libraries/nestjs-libraries/src/integrations/social/dribbble.provider.ts b/libraries/nestjs-libraries/src/integrations/social/dribbble.provider.ts new file mode 100644 index 00000000..e892e9ae --- /dev/null +++ b/libraries/nestjs-libraries/src/integrations/social/dribbble.provider.ts @@ -0,0 +1,271 @@ +import { + AuthTokenDetails, + PostDetails, + PostResponse, + SocialProvider, +} from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface'; +import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; +import { PinterestSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/pinterest.dto'; +import axios from 'axios'; +import FormData from 'form-data'; +import { timer } from '@gitroom/helpers/utils/timer'; +import dayjs from 'dayjs'; +import { SocialAbstract } from '@gitroom/nestjs-libraries/integrations/social.abstract'; + +export class DribbbleProvider extends SocialAbstract implements SocialProvider { + identifier = 'dribbble'; + name = 'Dribbbble'; + isBetweenSteps = false; + + async refreshToken(refreshToken: string): Promise { + const { access_token, expires_in } = await ( + await this.fetch('https://api-sandbox.pinterest.com/v5/oauth/token', { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + Authorization: `Basic ${Buffer.from( + `${process.env.PINTEREST_CLIENT_ID}:${process.env.PINTEREST_CLIENT_SECRET}` + ).toString('base64')}`, + }, + body: new URLSearchParams({ + grant_type: 'refresh_token', + refresh_token: refreshToken, + scope: + 'boards:read,boards:write,pins:read,pins:write,user_accounts:read', + redirect_uri: `${process.env.FRONTEND_URL}/integrations/social/pinterest`, + }), + }) + ).json(); + + const { id, profile_image, username } = await ( + await this.fetch('https://api-sandbox.pinterest.com/v5/user_account', { + method: 'GET', + headers: { + Authorization: `Bearer ${access_token}`, + }, + }) + ).json(); + + return { + id: id, + name: username, + accessToken: access_token, + refreshToken: refreshToken, + expiresIn: expires_in, + picture: profile_image, + username, + }; + } + + async teams(accessToken: string) { + const { teams } = await ( + await this.fetch('https://api.dribbble.com/v2/user', { + method: 'GET', + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }) + ).json(); + + return teams?.map((team: any) => ({ + id: team.id, + name: team.name, + })) || []; + } + + async generateAuthUrl(refresh?: string) { + const state = makeId(6); + return { + url: `https://dribbble.com/oauth/authorize?client_id=${ + process.env.DRIBBBLE_CLIENT_ID + }&redirect_uri=${encodeURIComponent( + `${process.env.FRONTEND_URL}/integrations/social/dribbble${ + refresh ? `?refresh=${refresh}` : '' + }` + )}&response_type=code&scope=public+upload&state=${state}`, + codeVerifier: makeId(10), + state, + }; + } + + async authenticate(params: { + code: string; + codeVerifier: string; + refresh: string; + }) { + const { access_token } = await ( + await this.fetch( + `https://dribbble.com/oauth/token?client_id=${process.env.DRIBBBLE_CLIENT_ID}&client_secret=${process.env.DRIBBBLE_CLIENT_SECRET}&code=${params.code}&redirect_uri=${process.env.FRONTEND_URL}/integrations/social/dribbble`, + { + method: 'POST', + } + ) + ).json(); + + const { id, name, avatar_url, login } = await ( + await this.fetch('https://api.dribbble.com/v2/user', { + method: 'GET', + headers: { + Authorization: `Bearer ${access_token}`, + }, + }) + ).json(); + + return { + id: id, + name, + accessToken: access_token, + refreshToken: '', + expiresIn: 999999999, + picture: avatar_url, + username: login, + }; + } + + async boards(accessToken: string) { + const { items } = await ( + await this.fetch('https://api-sandbox.pinterest.com/v5/boards', { + method: 'GET', + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }) + ).json(); + + return ( + items?.map((item: any) => ({ + name: item.name, + id: item.id, + })) || [] + ); + } + + async post( + id: string, + accessToken: string, + postDetails: PostDetails[] + ): Promise { + let mediaId = ''; + const findMp4 = postDetails?.[0]?.media?.find( + (p) => (p.path?.indexOf('mp4') || -1) > -1 + ); + const picture = postDetails?.[0]?.media?.find( + (p) => (p.path?.indexOf('mp4') || -1) === -1 + ); + + if (findMp4) { + const { upload_url, media_id, upload_parameters } = await ( + await this.fetch('https://api-sandbox.pinterest.com/v5/media', { + method: 'POST', + body: JSON.stringify({ + media_type: 'video', + }), + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${accessToken}`, + }, + }) + ).json(); + + const { data, status } = await axios.get( + postDetails?.[0]?.media?.[0]?.url!, + { + responseType: 'stream', + } + ); + + const formData = Object.keys(upload_parameters) + .filter((f) => f) + .reduce((acc, key) => { + acc.append(key, upload_parameters[key]); + return acc; + }, new FormData()); + + formData.append('file', data); + await axios.post(upload_url, formData); + + let statusCode = ''; + while (statusCode !== 'succeeded') { + console.log('trying'); + const mediafile = await ( + await this.fetch( + 'https://api-sandbox.pinterest.com/v5/media/' + media_id, + { + method: 'GET', + headers: { + Authorization: `Bearer ${accessToken}`, + }, + } + ) + ).json(); + + await timer(3000); + statusCode = mediafile.status; + } + + mediaId = media_id; + } + + const mapImages = postDetails?.[0]?.media?.map((m) => ({ + url: m.url, + })); + + try { + const { + id: pId, + link, + ...all + } = await ( + await this.fetch('https://api-sandbox.pinterest.com/v5/pins', { + method: 'POST', + headers: { + Authorization: `Bearer ${accessToken}`, + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + ...(postDetails?.[0]?.settings.link + ? { link: postDetails?.[0]?.settings.link } + : {}), + ...(postDetails?.[0]?.settings.title + ? { title: postDetails?.[0]?.settings.title } + : {}), + ...(postDetails?.[0]?.settings.description + ? { title: postDetails?.[0]?.settings.description } + : {}), + ...(postDetails?.[0]?.settings.dominant_color + ? { title: postDetails?.[0]?.settings.dominant_color } + : {}), + board_id: postDetails?.[0]?.settings.board, + media_source: mediaId + ? { + source_type: 'video_id', + media_id: mediaId, + cover_image_url: picture?.url, + } + : mapImages?.length === 1 + ? { + source_type: 'image_url', + url: mapImages?.[0]?.url, + } + : { + source_type: 'multiple_image_urls', + items: mapImages, + }, + }), + }) + ).json(); + + return [ + { + id: postDetails?.[0]?.id, + postId: pId, + releaseURL: `https://www.pinterest.com/pin/${pId}`, + status: 'success', + }, + ]; + } catch (err) { + console.log(err); + return []; + } + } +} diff --git a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts index 8785dc08..d8824364 100644 --- a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts @@ -6,8 +6,9 @@ import { } from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; import dayjs from 'dayjs'; +import { SocialAbstract } from '@gitroom/nestjs-libraries/integrations/social.abstract'; -export class FacebookProvider implements SocialProvider { +export class FacebookProvider extends SocialAbstract implements SocialProvider { identifier = 'facebook'; name = 'Facebook Page'; isBetweenSteps = true; @@ -46,7 +47,7 @@ export class FacebookProvider implements SocialProvider { refresh?: string; }) { const getAccessToken = await ( - await fetch( + await this.fetch( 'https://graph.facebook.com/v20.0/oauth/access_token' + `?client_id=${process.env.FACEBOOK_APP_ID}` + `&redirect_uri=${encodeURIComponent( @@ -60,7 +61,7 @@ export class FacebookProvider implements SocialProvider { ).json(); const { access_token } = await ( - await fetch( + await this.fetch( 'https://graph.facebook.com/v20.0/oauth/access_token' + '?grant_type=fb_exchange_token' + `&client_id=${process.env.FACEBOOK_APP_ID}` + @@ -92,7 +93,7 @@ export class FacebookProvider implements SocialProvider { data: { url }, }, } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/me?fields=id,name,picture&access_token=${access_token}` ) ).json(); @@ -110,7 +111,7 @@ export class FacebookProvider implements SocialProvider { async pages(accessToken: string) { const { data } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/me/accounts?fields=id,username,name,picture.type(large)&access_token=${accessToken}` ) ).json(); @@ -128,7 +129,7 @@ export class FacebookProvider implements SocialProvider { data: { url }, }, } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/${pageId}?fields=username,access_token,name,picture.type(large)&access_token=${accessToken}` ) ).json(); @@ -153,7 +154,7 @@ export class FacebookProvider implements SocialProvider { let finalUrl = ''; if ((firstPost?.media?.[0]?.path?.indexOf('mp4') || -2) > -1) { const { id: videoId, permalink_url } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/${id}/videos?access_token=${accessToken}&fields=id,permalink_url`, { method: 'POST', @@ -177,7 +178,7 @@ export class FacebookProvider implements SocialProvider { : await Promise.all( firstPost.media.map(async (media) => { const { id: photoId } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/${id}/photos?access_token=${accessToken}`, { method: 'POST', @@ -201,7 +202,7 @@ export class FacebookProvider implements SocialProvider { permalink_url, ...all } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/${id}/feed?access_token=${accessToken}&fields=id,permalink_url`, { method: 'POST', @@ -224,7 +225,7 @@ export class FacebookProvider implements SocialProvider { const postsArray = []; for (const comment of comments) { const data = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/${finalId}/comments?access_token=${accessToken}&fields=id,permalink_url`, { method: 'POST', diff --git a/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts b/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts index 8f11cca8..37b6be8f 100644 --- a/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts @@ -7,8 +7,9 @@ import { import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; import { timer } from '@gitroom/helpers/utils/timer'; import dayjs from 'dayjs'; +import { SocialAbstract } from '@gitroom/nestjs-libraries/integrations/social.abstract'; -export class InstagramProvider implements SocialProvider { +export class InstagramProvider extends SocialAbstract implements SocialProvider { identifier = 'instagram'; name = 'Instagram'; isBetweenSteps = true; @@ -51,7 +52,7 @@ export class InstagramProvider implements SocialProvider { refresh: string; }) { const getAccessToken = await ( - await fetch( + await this.fetch( 'https://graph.facebook.com/v20.0/oauth/access_token' + `?client_id=${process.env.FACEBOOK_APP_ID}` + `&redirect_uri=${encodeURIComponent( @@ -65,7 +66,7 @@ export class InstagramProvider implements SocialProvider { ).json(); const { access_token, expires_in, ...all } = await ( - await fetch( + await this.fetch( 'https://graph.facebook.com/v20.0/oauth/access_token' + '?grant_type=fb_exchange_token' + `&client_id=${process.env.FACEBOOK_APP_ID}` + @@ -81,7 +82,7 @@ export class InstagramProvider implements SocialProvider { data: { url }, }, } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/me?fields=id,name,picture&access_token=${access_token}` ) ).json(); @@ -117,7 +118,7 @@ export class InstagramProvider implements SocialProvider { async pages(accessToken: string) { const { data } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/me/accounts?fields=id,instagram_business_account,username,name,picture.type(large)&access_token=${accessToken}&limit=500` ) ).json(); @@ -129,7 +130,7 @@ export class InstagramProvider implements SocialProvider { return { pageId: p.id, ...(await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/${p.instagram_business_account.id}?fields=name,profile_picture_url&access_token=${accessToken}&limit=500` ) ).json()), @@ -151,13 +152,13 @@ export class InstagramProvider implements SocialProvider { data: { pageId: string; id: string } ) { const { access_token, ...all } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/${data.pageId}?fields=access_token,name,picture.type(large)&access_token=${accessToken}` ) ).json(); const { id, name, profile_picture_url, username } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/${data.id}?fields=username,name,profile_picture_url&access_token=${accessToken}` ) ).json(); @@ -191,7 +192,7 @@ export class InstagramProvider implements SocialProvider { : `video_url=${m.url}&media_type=VIDEO` : `image_url=${m.url}`; const { id: photoId } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/${id}/media?${mediaType}${caption}${isCarousel}&access_token=${accessToken}`, { method: 'POST', @@ -202,7 +203,7 @@ export class InstagramProvider implements SocialProvider { let status = 'IN_PROGRESS'; while (status === 'IN_PROGRESS') { const { status_code } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/${photoId}?access_token=${accessToken}&fields=status_code` ) ).json(); @@ -220,7 +221,7 @@ export class InstagramProvider implements SocialProvider { let linkGlobal = ''; if (medias.length === 1) { const { id: mediaId } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/${id}/media_publish?creation_id=${medias[0]}&access_token=${accessToken}&field=id`, { method: 'POST', @@ -231,7 +232,7 @@ export class InstagramProvider implements SocialProvider { containerIdGlobal = mediaId; const { permalink } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/${mediaId}?fields=permalink&access_token=${accessToken}` ) ).json(); @@ -246,7 +247,7 @@ export class InstagramProvider implements SocialProvider { linkGlobal = permalink; } else { const { id: containerId, ...all3 } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/${id}/media?caption=${encodeURIComponent( firstPost?.message )}&media_type=CAROUSEL&children=${encodeURIComponent( @@ -261,7 +262,7 @@ export class InstagramProvider implements SocialProvider { let status = 'IN_PROGRESS'; while (status === 'IN_PROGRESS') { const { status_code } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/${containerId}?fields=status_code&access_token=${accessToken}` ) ).json(); @@ -270,7 +271,7 @@ export class InstagramProvider implements SocialProvider { } const { id: mediaId, ...all4 } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/${id}/media_publish?creation_id=${containerId}&access_token=${accessToken}&field=id`, { method: 'POST', @@ -281,7 +282,7 @@ export class InstagramProvider implements SocialProvider { containerIdGlobal = mediaId; const { permalink } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/${mediaId}?fields=permalink&access_token=${accessToken}` ) ).json(); @@ -298,7 +299,7 @@ export class InstagramProvider implements SocialProvider { for (const post of theRest) { const { id: commentId } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/${containerIdGlobal}/comments?message=${encodeURIComponent( post.message )}&access_token=${accessToken}`, diff --git a/libraries/nestjs-libraries/src/integrations/social/linkedin.page.provider.ts b/libraries/nestjs-libraries/src/integrations/social/linkedin.page.provider.ts new file mode 100644 index 00000000..cef78db9 --- /dev/null +++ b/libraries/nestjs-libraries/src/integrations/social/linkedin.page.provider.ts @@ -0,0 +1,198 @@ +import { + AuthTokenDetails, + PostDetails, + PostResponse, + SocialProvider, +} from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface'; +import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; +import { LinkedinProvider } from '@gitroom/nestjs-libraries/integrations/social/linkedin.provider'; + +export class LinkedinPageProvider + extends LinkedinProvider + implements SocialProvider +{ + override identifier = 'linkedin-page'; + override name = 'LinkedIn Page'; + override isBetweenSteps = true; + + override async refreshToken( + refresh_token: string + ): Promise { + const { access_token: accessToken, refresh_token: refreshToken } = await ( + await fetch('https://www.linkedin.com/oauth/v2/accessToken', { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body: new URLSearchParams({ + grant_type: 'refresh_token', + refresh_token, + client_id: process.env.LINKEDIN_CLIENT_ID!, + client_secret: process.env.LINKEDIN_CLIENT_SECRET!, + }), + }) + ).json(); + + const { vanityName } = await ( + await fetch('https://api.linkedin.com/v2/me', { + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }) + ).json(); + + const { + name, + sub: id, + picture, + } = await ( + await fetch('https://api.linkedin.com/v2/userinfo', { + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }) + ).json(); + + return { + id, + accessToken, + refreshToken, + name, + picture, + username: vanityName, + }; + } + + override async generateAuthUrl(refresh?: string) { + const state = makeId(6); + const codeVerifier = makeId(30); + const url = `https://www.linkedin.com/oauth/v2/authorization?response_type=code&client_id=${ + process.env.LINKEDIN_CLIENT_ID + }&redirect_uri=${encodeURIComponent( + `${process.env.FRONTEND_URL}/integrations/social/linkedin-page${ + refresh ? `?refresh=${refresh}` : '' + }` + )}&state=${state}&scope=${encodeURIComponent( + 'openid profile w_member_social r_basicprofile rw_organization_admin w_organization_social r_organization_social' + )}`; + return { + url, + codeVerifier, + state, + }; + } + + async companies(accessToken: string) { + const { elements } = await ( + await fetch( + 'https://api.linkedin.com/v2/organizationalEntityAcls?q=roleAssignee&role=ADMINISTRATOR&projection=(elements*(organizationalTarget~(localizedName,vanityName,logoV2(original~:playableStreams))))', + { + headers: { + Authorization: `Bearer ${accessToken}`, + }, + } + ) + ).json(); + + return (elements || []).map((e: any) => ({ + id: e.organizationalTarget.split(':').pop(), + page: e.organizationalTarget.split(':').pop(), + username: e['organizationalTarget~'].vanityName, + name: e['organizationalTarget~'].localizedName, + picture: + e['organizationalTarget~'].logoV2?.['original~']?.elements?.[0] + ?.identifiers?.[0]?.identifier, + })); + } + + async fetchPageInformation(accessToken: string, pageId: string) { + const data = await ( + await fetch( + `https://api.linkedin.com/v2/organizations/${pageId}?projection=(id,localizedName,vanityName,logoV2(original~:playableStreams))`, + { + headers: { + Authorization: `Bearer ${accessToken}`, + }, + } + ) + ).json(); + + return { + id: data.id, + name: data.localizedName, + access_token: accessToken, + picture: data?.logoV2?.['original~']?.elements?.[0]?.identifiers?.[0].identifier, + username: data.vanityName, + }; + } + + override async authenticate(params: { + code: string; + codeVerifier: string; + refresh?: string; + }) { + const body = new URLSearchParams(); + body.append('grant_type', 'authorization_code'); + body.append('code', params.code); + body.append( + 'redirect_uri', + `${process.env.FRONTEND_URL}/integrations/social/linkedin-page${ + params.refresh ? `?refresh=${params.refresh}` : '' + }` + ); + body.append('client_id', process.env.LINKEDIN_CLIENT_ID!); + body.append('client_secret', process.env.LINKEDIN_CLIENT_SECRET!); + + const { + access_token: accessToken, + expires_in: expiresIn, + refresh_token: refreshToken, + } = await ( + await fetch('https://www.linkedin.com/oauth/v2/accessToken', { + method: 'POST', + headers: { + 'Content-Type': 'application/x-www-form-urlencoded', + }, + body, + }) + ).json(); + + const { + name, + sub: id, + picture, + } = await ( + await fetch('https://api.linkedin.com/v2/userinfo', { + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }) + ).json(); + + const { vanityName } = await ( + await fetch('https://api.linkedin.com/v2/me', { + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }) + ).json(); + + return { + id, + accessToken, + refreshToken, + expiresIn, + name, + picture, + username: vanityName, + }; + } + + override async post( + id: string, + accessToken: string, + postDetails: PostDetails[] + ): Promise { + return super.post(id, accessToken, postDetails, 'company'); + } +} diff --git a/libraries/nestjs-libraries/src/integrations/social/linkedin.provider.ts b/libraries/nestjs-libraries/src/integrations/social/linkedin.provider.ts index 44a4362e..25fe4b88 100644 --- a/libraries/nestjs-libraries/src/integrations/social/linkedin.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/linkedin.provider.ts @@ -9,15 +9,16 @@ import sharp from 'sharp'; import { lookup } from 'mime-types'; import { readOrFetch } from '@gitroom/helpers/utils/read.or.fetch'; import { removeMarkdown } from '@gitroom/helpers/utils/remove.markdown'; +import { SocialAbstract } from '@gitroom/nestjs-libraries/integrations/social.abstract'; -export class LinkedinProvider implements SocialProvider { +export class LinkedinProvider extends SocialAbstract implements SocialProvider { identifier = 'linkedin'; name = 'LinkedIn'; isBetweenSteps = false; async refreshToken(refresh_token: string): Promise { const { access_token: accessToken, refresh_token: refreshToken } = await ( - await fetch('https://www.linkedin.com/oauth/v2/accessToken', { + await this.fetch('https://www.linkedin.com/oauth/v2/accessToken', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', @@ -32,7 +33,7 @@ export class LinkedinProvider implements SocialProvider { ).json(); const { vanityName } = await ( - await fetch('https://api.linkedin.com/v2/me', { + await this.fetch('https://api.linkedin.com/v2/me', { headers: { Authorization: `Bearer ${accessToken}`, }, @@ -44,7 +45,7 @@ export class LinkedinProvider implements SocialProvider { sub: id, picture, } = await ( - await fetch('https://api.linkedin.com/v2/userinfo', { + await this.fetch('https://api.linkedin.com/v2/userinfo', { headers: { Authorization: `Bearer ${accessToken}`, }, @@ -102,7 +103,7 @@ export class LinkedinProvider implements SocialProvider { expires_in: expiresIn, refresh_token: refreshToken, } = await ( - await fetch('https://www.linkedin.com/oauth/v2/accessToken', { + await this.fetch('https://www.linkedin.com/oauth/v2/accessToken', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', @@ -116,7 +117,7 @@ export class LinkedinProvider implements SocialProvider { sub: id, picture, } = await ( - await fetch('https://api.linkedin.com/v2/userinfo', { + await this.fetch('https://api.linkedin.com/v2/userinfo', { headers: { Authorization: `Bearer ${accessToken}`, }, @@ -124,7 +125,7 @@ export class LinkedinProvider implements SocialProvider { ).json(); const { vanityName } = await ( - await fetch('https://api.linkedin.com/v2/me', { + await this.fetch('https://api.linkedin.com/v2/me', { headers: { Authorization: `Bearer ${accessToken}`, }, @@ -152,7 +153,7 @@ export class LinkedinProvider implements SocialProvider { } const { elements } = await ( - await fetch( + await this.fetch( `https://api.linkedin.com/rest/organizations?q=vanityName&vanityName=${getCompanyVanity[1]}`, { method: 'GET', @@ -174,17 +175,18 @@ export class LinkedinProvider implements SocialProvider { }; } - private async uploadPicture( + protected async uploadPicture( fileName: string, accessToken: string, personId: string, - picture: any + picture: any, + type = 'personal' as 'company' | 'personal' ) { try { const { value: { uploadUrl, image, video, uploadInstructions, ...all }, } = await ( - await fetch( + await this.fetch( `https://api.linkedin.com/rest/${ fileName.indexOf('mp4') > -1 ? 'videos' : 'images' }?action=initializeUpload`, @@ -198,7 +200,10 @@ export class LinkedinProvider implements SocialProvider { }, body: JSON.stringify({ initializeUploadRequest: { - owner: `urn:li:person:${personId}`, + owner: + type === 'personal' + ? `urn:li:person:${personId}` + : `urn:li:organization:${personId}`, ...(fileName.indexOf('mp4') > -1 ? { fileSizeBytes: picture.length, @@ -215,7 +220,7 @@ export class LinkedinProvider implements SocialProvider { const sendUrlRequest = uploadInstructions?.[0]?.uploadUrl || uploadUrl; const finalOutput = video || image; - const upload = await fetch(sendUrlRequest, { + const upload = await this.fetch(sendUrlRequest, { method: 'PUT', headers: { 'X-Restli-Protocol-Version': '2.0.0', @@ -230,7 +235,7 @@ export class LinkedinProvider implements SocialProvider { if (fileName.indexOf('mp4') > -1) { const etag = upload.headers.get('etag'); - const a = await fetch( + const a = await this.fetch( 'https://api.linkedin.com/rest/videos?action=finalizeUpload', { method: 'POST', @@ -260,7 +265,8 @@ export class LinkedinProvider implements SocialProvider { async post( id: string, accessToken: string, - postDetails: PostDetails[] + postDetails: PostDetails[], + type = 'personal' as 'company' | 'personal' ): Promise { const [firstPost, ...restPosts] = postDetails; @@ -281,7 +287,8 @@ export class LinkedinProvider implements SocialProvider { .resize({ width: 1000, }) - .toBuffer() + .toBuffer(), + type ), postId: p.id, }; @@ -300,7 +307,7 @@ export class LinkedinProvider implements SocialProvider { const media_ids = (uploadAll[firstPost.id] || []).filter((f) => f); - const data = await fetch('https://api.linkedin.com/v2/posts', { + const data = await this.fetch('https://api.linkedin.com/v2/posts', { method: 'POST', headers: { 'X-Restli-Protocol-Version': '2.0.0', @@ -308,7 +315,10 @@ export class LinkedinProvider implements SocialProvider { Authorization: `Bearer ${accessToken}`, }, body: JSON.stringify({ - author: `urn:li:person:${id}`, + author: + type === 'personal' + ? `urn:li:person:${id}` + : `urn:li:organization:${id}`, commentary: removeMarkdown({ text: firstPost.message.replace('\n', '𝔫𝔢𝔴𝔩𝔦𝔫𝔢'), except: [/@\[(.*?)]\(urn:li:organization:(\d+)\)/g], @@ -350,6 +360,7 @@ export class LinkedinProvider implements SocialProvider { } const topPostId = data.headers.get('x-restli-id')!; + const ids = [ { status: 'posted', @@ -360,7 +371,7 @@ export class LinkedinProvider implements SocialProvider { ]; for (const post of restPosts) { const { object } = await ( - await fetch( + await this.fetch( `https://api.linkedin.com/v2/socialActions/${decodeURIComponent( topPostId )}/comments`, @@ -371,7 +382,7 @@ export class LinkedinProvider implements SocialProvider { Authorization: `Bearer ${accessToken}`, }, body: JSON.stringify({ - actor: `urn:li:person:${id}`, + actor: type === 'personal' ? `urn:li:person:${id}` : `urn:li:organization:${id}`, object: topPostId, message: { text: removeMarkdown({ diff --git a/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts b/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts index 415e64bb..951beead 100644 --- a/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts @@ -9,15 +9,16 @@ import { PinterestSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/provi import axios from 'axios'; import FormData from 'form-data'; import { timer } from '@gitroom/helpers/utils/timer'; +import { SocialAbstract } from '@gitroom/nestjs-libraries/integrations/social.abstract'; -export class PinterestProvider implements SocialProvider { +export class PinterestProvider extends SocialAbstract implements SocialProvider { identifier = 'pinterest'; name = 'Pinterest'; isBetweenSteps = false; async refreshToken(refreshToken: string): Promise { const { access_token, expires_in } = await ( - await fetch('https://api-sandbox.pinterest.com/v5/oauth/token', { + await this.fetch('https://api.pinterest.com/v5/oauth/token', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', @@ -36,7 +37,7 @@ export class PinterestProvider implements SocialProvider { ).json(); const { id, profile_image, username } = await ( - await fetch('https://api-sandbox.pinterest.com/v5/user_account', { + await this.fetch('https://api.pinterest.com/v5/user_account', { method: 'GET', headers: { Authorization: `Bearer ${access_token}`, @@ -78,7 +79,7 @@ export class PinterestProvider implements SocialProvider { refresh: string; }) { const { access_token, refresh_token, expires_in } = await ( - await fetch('https://api-sandbox.pinterest.com/v5/oauth/token', { + await this.fetch('https://api.pinterest.com/v5/oauth/token', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', @@ -95,7 +96,7 @@ export class PinterestProvider implements SocialProvider { ).json(); const { id, profile_image, username } = await ( - await fetch('https://api-sandbox.pinterest.com/v5/user_account', { + await this.fetch('https://api.pinterest.com/v5/user_account', { method: 'GET', headers: { Authorization: `Bearer ${access_token}`, @@ -116,7 +117,7 @@ export class PinterestProvider implements SocialProvider { async boards(accessToken: string) { const { items } = await ( - await fetch('https://api-sandbox.pinterest.com/v5/boards', { + await this.fetch('https://api.pinterest.com/v5/boards', { method: 'GET', headers: { Authorization: `Bearer ${accessToken}`, @@ -147,7 +148,7 @@ export class PinterestProvider implements SocialProvider { if (findMp4) { const { upload_url, media_id, upload_parameters } = await ( - await fetch('https://api-sandbox.pinterest.com/v5/media', { + await this.fetch('https://api.pinterest.com/v5/media', { method: 'POST', body: JSON.stringify({ media_type: 'video', @@ -180,8 +181,8 @@ export class PinterestProvider implements SocialProvider { while (statusCode !== 'succeeded') { console.log('trying'); const mediafile = await ( - await fetch( - 'https://api-sandbox.pinterest.com/v5/media/' + media_id, + await this.fetch( + 'https://api.pinterest.com/v5/media/' + media_id, { method: 'GET', headers: { @@ -208,7 +209,7 @@ export class PinterestProvider implements SocialProvider { link, ...all } = await ( - await fetch('https://api-sandbox.pinterest.com/v5/pins', { + await this.fetch('https://api.pinterest.com/v5/pins', { method: 'POST', headers: { Authorization: `Bearer ${accessToken}`, diff --git a/libraries/nestjs-libraries/src/integrations/social/reddit.provider.ts b/libraries/nestjs-libraries/src/integrations/social/reddit.provider.ts index 2a9c0858..db4ffbf2 100644 --- a/libraries/nestjs-libraries/src/integrations/social/reddit.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/reddit.provider.ts @@ -8,8 +8,9 @@ import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; import { RedditSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/reddit.dto'; import { timer } from '@gitroom/helpers/utils/timer'; import { groupBy } from 'lodash'; +import { SocialAbstract } from '@gitroom/nestjs-libraries/integrations/social.abstract'; -export class RedditProvider implements SocialProvider { +export class RedditProvider extends SocialAbstract implements SocialProvider { identifier = 'reddit'; name = 'Reddit'; isBetweenSteps = false; @@ -20,7 +21,7 @@ export class RedditProvider implements SocialProvider { refresh_token: newRefreshToken, expires_in: expiresIn, } = await ( - await fetch('https://www.reddit.com/api/v1/access_token', { + await this.fetch('https://www.reddit.com/api/v1/access_token', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', @@ -36,7 +37,7 @@ export class RedditProvider implements SocialProvider { ).json(); const { name, id, icon_img } = await ( - await fetch('https://oauth.reddit.com/api/v1/me', { + await this.fetch('https://oauth.reddit.com/api/v1/me', { headers: { Authorization: `Bearer ${accessToken}`, }, @@ -77,7 +78,7 @@ export class RedditProvider implements SocialProvider { refresh_token: refreshToken, expires_in: expiresIn, } = await ( - await fetch('https://www.reddit.com/api/v1/access_token', { + await this.fetch('https://www.reddit.com/api/v1/access_token', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded', @@ -94,7 +95,7 @@ export class RedditProvider implements SocialProvider { ).json(); const { name, id, icon_img } = await ( - await fetch('https://oauth.reddit.com/api/v1/me', { + await this.fetch('https://oauth.reddit.com/api/v1/me', { headers: { Authorization: `Bearer ${accessToken}`, }, @@ -126,7 +127,7 @@ export class RedditProvider implements SocialProvider { data: { id, name, url }, }, } = await ( - await fetch('https://oauth.reddit.com/api/submit', { + await this.fetch('https://oauth.reddit.com/api/submit', { method: 'POST', headers: { Authorization: `Bearer ${accessToken}`, @@ -181,7 +182,7 @@ export class RedditProvider implements SocialProvider { }, }, } = await ( - await fetch('https://oauth.reddit.com/api/comment', { + await this.fetch('https://oauth.reddit.com/api/comment', { method: 'POST', headers: { Authorization: `Bearer ${accessToken}`, @@ -226,7 +227,7 @@ export class RedditProvider implements SocialProvider { const { data: { children }, } = await ( - await fetch( + await this.fetch( `https://oauth.reddit.com/subreddits/search?show=public&q=${data.word}&sort=activity&show_users=false&limit=10`, { method: 'GET', @@ -271,7 +272,7 @@ export class RedditProvider implements SocialProvider { const { data: { submission_type, allow_images }, } = await ( - await fetch(`https://oauth.reddit.com/${data.subreddit}/about`, { + await this.fetch(`https://oauth.reddit.com/${data.subreddit}/about`, { method: 'GET', headers: { Authorization: `Bearer ${accessToken}`, @@ -281,7 +282,7 @@ export class RedditProvider implements SocialProvider { ).json(); const { is_flair_required } = await ( - await fetch( + await this.fetch( `https://oauth.reddit.com/api/v1/${ data.subreddit.split('/r/')[1] }/post_requirements`, @@ -296,7 +297,7 @@ export class RedditProvider implements SocialProvider { ).json(); const newData = await ( - await fetch( + await this.fetch( `https://oauth.reddit.com/${data.subreddit}/api/link_flair_v2`, { method: 'GET', diff --git a/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts b/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts index 540cae96..b873958e 100644 --- a/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts @@ -6,8 +6,9 @@ import { } from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; import dayjs from 'dayjs'; +import { SocialAbstract } from '@gitroom/nestjs-libraries/integrations/social.abstract'; -export class TiktokProvider implements SocialProvider { +export class TiktokProvider extends SocialAbstract implements SocialProvider { identifier = 'tiktok'; name = 'Tiktok'; isBetweenSteps = false; @@ -73,7 +74,7 @@ export class TiktokProvider implements SocialProvider { refresh?: string; }) { const getAccessToken = await ( - await fetch( + await this.fetch( 'https://graph.facebook.com/v20.0/oauth/access_token' + `?client_id=${process.env.FACEBOOK_APP_ID}` + `&redirect_uri=${encodeURIComponent( @@ -87,7 +88,7 @@ export class TiktokProvider implements SocialProvider { ).json(); const { access_token } = await ( - await fetch( + await this.fetch( 'https://graph.facebook.com/v20.0/oauth/access_token' + '?grant_type=fb_exchange_token' + `&client_id=${process.env.FACEBOOK_APP_ID}` + @@ -119,7 +120,7 @@ export class TiktokProvider implements SocialProvider { data: { url }, }, } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v19.0/me?fields=id,name,picture&access_token=${access_token}` ) ).json(); @@ -137,7 +138,7 @@ export class TiktokProvider implements SocialProvider { async pages(accessToken: string) { const { data } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/me/accounts?fields=id,username,name,picture.type(large)&access_token=${accessToken}` ) ).json(); @@ -155,7 +156,7 @@ export class TiktokProvider implements SocialProvider { data: { url }, }, } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/${pageId}?fields=username,access_token,name,picture.type(large)&access_token=${accessToken}` ) ).json(); @@ -180,7 +181,7 @@ export class TiktokProvider implements SocialProvider { let finalUrl = ''; if ((firstPost?.media?.[0]?.path?.indexOf('mp4') || -2) > -1) { const { id: videoId, permalink_url } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/${id}/videos?access_token=${accessToken}&fields=id,permalink_url`, { method: 'POST', @@ -204,7 +205,7 @@ export class TiktokProvider implements SocialProvider { : await Promise.all( firstPost.media.map(async (media) => { const { id: photoId } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/${id}/photos?access_token=${accessToken}`, { method: 'POST', @@ -228,7 +229,7 @@ export class TiktokProvider implements SocialProvider { permalink_url, ...all } = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/${id}/feed?access_token=${accessToken}&fields=id,permalink_url`, { method: 'POST', @@ -251,7 +252,7 @@ export class TiktokProvider implements SocialProvider { const postsArray = []; for (const comment of comments) { const data = await ( - await fetch( + await this.fetch( `https://graph.facebook.com/v20.0/${finalId}/comments?access_token=${accessToken}&fields=id,permalink_url`, { method: 'POST', diff --git a/libraries/nestjs-libraries/src/integrations/social/x.provider.ts b/libraries/nestjs-libraries/src/integrations/social/x.provider.ts index d866f1bb..2470a3f9 100644 --- a/libraries/nestjs-libraries/src/integrations/social/x.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/x.provider.ts @@ -9,8 +9,9 @@ import { lookup } from 'mime-types'; import sharp from 'sharp'; import { readOrFetch } from '@gitroom/helpers/utils/read.or.fetch'; import removeMd from 'remove-markdown'; +import { SocialAbstract } from '@gitroom/nestjs-libraries/integrations/social.abstract'; -export class XProvider implements SocialProvider { +export class XProvider extends SocialAbstract implements SocialProvider { identifier = 'x'; name = 'X'; isBetweenSteps = false; diff --git a/libraries/nestjs-libraries/src/integrations/social/youtube.provider.ts b/libraries/nestjs-libraries/src/integrations/social/youtube.provider.ts index 9fff423c..8ddc3278 100644 --- a/libraries/nestjs-libraries/src/integrations/social/youtube.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/youtube.provider.ts @@ -10,6 +10,7 @@ import { OAuth2Client } from 'google-auth-library/build/src/auth/oauth2client'; import * as console from 'node:console'; import axios from 'axios'; import { YoutubeSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/youtube.settings.dto'; +import { SocialAbstract } from '@gitroom/nestjs-libraries/integrations/social.abstract'; const clientAndYoutube = () => { const client = new google.auth.OAuth2({ @@ -33,7 +34,7 @@ const clientAndYoutube = () => { return { client, youtube, oauth2 }; }; -export class YoutubeProvider implements SocialProvider { +export class YoutubeProvider extends SocialAbstract implements SocialProvider { identifier = 'youtube'; name = 'Youtube'; isBetweenSteps = false; diff --git a/libraries/react-shared-libraries/src/helpers/image.with.fallback.tsx b/libraries/react-shared-libraries/src/helpers/image.with.fallback.tsx new file mode 100644 index 00000000..d0b754b3 --- /dev/null +++ b/libraries/react-shared-libraries/src/helpers/image.with.fallback.tsx @@ -0,0 +1,27 @@ +import { FC, useState } from 'react'; +import Image from 'next/image'; + +interface ImageSrc { + src: string; + fallbackSrc: string; + width: number; + height: number; + [key: string]: any; +} + +const ImageWithFallback: FC = (props) => { + const { src, fallbackSrc, ...rest } = props; + const [imgSrc, setImgSrc] = useState(src); + + return ( + { + setImgSrc(fallbackSrc); + }} + /> + ); +}; + +export default ImageWithFallback; \ No newline at end of file From 01161692ba22c08efce553664b2c807af4c271c9 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Mon, 3 Jun 2024 19:57:03 +0700 Subject: [PATCH 15/36] feat: analytics --- .../src/api/routes/analytics.controller.ts | 105 ++++-- .../src/api/routes/integrations.controller.ts | 2 + .../src/app/(site)/analytics/page.tsx | 11 +- .../src/components/analytics/chart-social.tsx | 84 +++++ .../analytics/stars.and.forks.interface.ts | 5 + .../src/components/layout/support.tsx | 28 +- .../src/components/layout/top.menu.tsx | 9 + .../platform-analytics/platform.analytics.tsx | 181 ++++++++++ .../platform-analytics/render.analytics.tsx | 77 ++++ apps/frontend/src/middleware.ts | 6 - .../src/integrations/integration.manager.ts | 2 +- .../integrations/social/dribbble.provider.ts | 21 +- .../integrations/social/facebook.provider.ts | 38 +- .../integrations/social/instagram.provider.ts | 39 +- .../social/linkedin.page.provider.ts | 335 +++++++++++++++++- .../integrations/social/linkedin.provider.ts | 6 +- .../integrations/social/pinterest.provider.ts | 86 ++++- .../social/social.integrations.interface.ts | 91 +++-- .../integrations/social/tiktok.provider.ts | 97 +---- .../integrations/social/youtube.provider.ts | 98 ++++- .../src/form/select.tsx | 17 +- package-lock.json | 69 ++++ package.json | 2 + videos.csv | 0 24 files changed, 1205 insertions(+), 204 deletions(-) create mode 100644 apps/frontend/src/components/analytics/chart-social.tsx create mode 100644 apps/frontend/src/components/platform-analytics/platform.analytics.tsx create mode 100644 apps/frontend/src/components/platform-analytics/render.analytics.tsx delete mode 100644 videos.csv diff --git a/apps/backend/src/api/routes/analytics.controller.ts b/apps/backend/src/api/routes/analytics.controller.ts index 82a4f83c..ab0571f6 100644 --- a/apps/backend/src/api/routes/analytics.controller.ts +++ b/apps/backend/src/api/routes/analytics.controller.ts @@ -1,42 +1,83 @@ -import {Body, Controller, Get, Post} from '@nestjs/common'; -import {Organization} from "@prisma/client"; -import {GetOrgFromRequest} from "@gitroom/nestjs-libraries/user/org.from.request"; -import {StarsService} from "@gitroom/nestjs-libraries/database/prisma/stars/stars.service"; -import dayjs from "dayjs"; -import {StarsListDto} from "@gitroom/nestjs-libraries/dtos/analytics/stars.list.dto"; -import {ApiTags} from "@nestjs/swagger"; +import { Body, Controller, Get, Inject, Param, Post, Query } from '@nestjs/common'; +import { Organization } from '@prisma/client'; +import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request'; +import { StarsService } from '@gitroom/nestjs-libraries/database/prisma/stars/stars.service'; +import dayjs from 'dayjs'; +import { StarsListDto } from '@gitroom/nestjs-libraries/dtos/analytics/stars.list.dto'; +import { ApiTags } from '@nestjs/swagger'; +import { IntegrationService } from '@gitroom/nestjs-libraries/database/prisma/integrations/integration.service'; +import { IntegrationManager } from '@gitroom/nestjs-libraries/integrations/integration.manager'; +import { ioRedis } from '@gitroom/nestjs-libraries/redis/redis.service'; @ApiTags('Analytics') @Controller('/analytics') export class AnalyticsController { - constructor( - private _starsService: StarsService - ) { - } - @Get('/') - async getStars( - @GetOrgFromRequest() org: Organization - ) { - return this._starsService.getStars(org.id); + constructor( + private _starsService: StarsService, + private _integrationService: IntegrationService, + private _integrationManager: IntegrationManager + ) {} + @Get('/') + async getStars(@GetOrgFromRequest() org: Organization) { + return this._starsService.getStars(org.id); + } + + @Get('/trending') + async getTrending() { + const todayTrending = dayjs(dayjs().format('YYYY-MM-DDT12:00:00')); + const last = todayTrending.isAfter(dayjs()) + ? todayTrending.subtract(1, 'day') + : todayTrending; + const nextTrending = last.add(1, 'day'); + + return { + last: last.format('YYYY-MM-DD HH:mm:ss'), + predictions: nextTrending.format('YYYY-MM-DD HH:mm:ss'), + }; + } + + @Post('/stars') + async getStarsFilter( + @GetOrgFromRequest() org: Organization, + @Body() starsFilter: StarsListDto + ) { + return { + stars: await this._starsService.getStarsFilter(org.id, starsFilter), + }; + } + + @Get('/:integration') + async getIntegration( + @GetOrgFromRequest() org: Organization, + @Param('integration') integration: string, + @Query('date') date: string + ) { + const getIntegration = await this._integrationService.getIntegrationById( + org.id, + integration + ); + + if (!getIntegration) { + throw new Error('Invalid integration'); } - @Get('/trending') - async getTrending() { - const todayTrending = dayjs(dayjs().format('YYYY-MM-DDT12:00:00')); - const last = todayTrending.isAfter(dayjs()) ? todayTrending.subtract(1, 'day') : todayTrending; - const nextTrending = last.add(1, 'day'); + if (getIntegration.type === 'social') { + const integrationProvider = this._integrationManager.getSocialIntegration( + getIntegration.providerIdentifier + ); - return { - last: last.format('YYYY-MM-DD HH:mm:ss'), - predictions: nextTrending.format('YYYY-MM-DD HH:mm:ss'), - } - } + const getIntegrationData = await ioRedis.get(`integration:${org.id}:${integration}:${date}`); + if (getIntegrationData) { + return JSON.parse(getIntegrationData) + } - @Post('/stars') - async getStarsFilter( - @GetOrgFromRequest() org: Organization, - @Body() starsFilter: StarsListDto - ) { - return {stars: await this._starsService.getStarsFilter(org.id, starsFilter)}; + if (integrationProvider.analytics) { + const loadAnalytics = await integrationProvider.analytics(getIntegration.internalId, getIntegration.token, +date); + await ioRedis.set(`integration:${org.id}:${integration}:${date}`, JSON.stringify(loadAnalytics), 'EX', !process.env.NODE_ENV || process.env.NODE_ENV === 'development' ? 1 : 3600); + return loadAnalytics; + } + + return {}; } + } } diff --git a/apps/backend/src/api/routes/integrations.controller.ts b/apps/backend/src/api/routes/integrations.controller.ts index 2fb340df..d6f86401 100644 --- a/apps/backend/src/api/routes/integrations.controller.ts +++ b/apps/backend/src/api/routes/integrations.controller.ts @@ -199,6 +199,8 @@ export class IntegrationsController { throw new Error('Invalid state'); } + await ioRedis.del(`login:${body.state}`); + const integrationProvider = this._integrationManager.getSocialIntegration(integration); const { diff --git a/apps/frontend/src/app/(site)/analytics/page.tsx b/apps/frontend/src/app/(site)/analytics/page.tsx index 16d5d8da..ac117078 100644 --- a/apps/frontend/src/app/(site)/analytics/page.tsx +++ b/apps/frontend/src/app/(site)/analytics/page.tsx @@ -2,16 +2,19 @@ import { isGeneral } from '@gitroom/react/helpers/is.general'; export const dynamic = 'force-dynamic'; -import {AnalyticsComponent} from "@gitroom/frontend/components/analytics/analytics.component"; -import {Metadata} from "next"; +import { AnalyticsComponent } from '@gitroom/frontend/components/analytics/analytics.component'; +import { Metadata } from 'next'; +import { PlatformAnalytics } from '@gitroom/frontend/components/platform-analytics/platform.analytics'; export const metadata: Metadata = { title: `${isGeneral() ? 'Postiz' : 'Gitroom'} Analytics`, description: '', -} +}; export default async function Index() { return ( - + <> + {isGeneral() ? : } + ); } diff --git a/apps/frontend/src/components/analytics/chart-social.tsx b/apps/frontend/src/components/analytics/chart-social.tsx new file mode 100644 index 00000000..f51db426 --- /dev/null +++ b/apps/frontend/src/components/analytics/chart-social.tsx @@ -0,0 +1,84 @@ +'use client'; +import { FC, useEffect, useMemo, useRef } from 'react'; +import DrawChart from 'chart.js/auto'; +import { TotalList } from '@gitroom/frontend/components/analytics/stars.and.forks.interface'; +import dayjs from 'dayjs'; +import { chunk } from 'lodash'; + +function mergeDataPoints(data: TotalList[], numPoints: number): TotalList[] { + const res = chunk(data, Math.ceil(data.length / numPoints)); + return res.map((row) => { + return { + date: `${row[0].date} - ${row?.at(-1)?.date}`, + total: row.reduce((acc, curr) => acc + curr.total, 0), + }; + }); +} + +export const ChartSocial: FC<{ data: TotalList[] }> = (props) => { + const { data } = props; + const list = useMemo(() => { + return mergeDataPoints(data, 7); + }, [data]); + + const ref = useRef(null); + const chart = useRef(null); + useEffect(() => { + const gradient = ref.current + .getContext('2d') + .createLinearGradient(0, 0, 0, ref.current.height); + gradient.addColorStop(0, 'rgb(20,101,6)'); // Start color with some transparency + gradient.addColorStop(1, 'rgb(9, 11, 19, 1)'); + chart.current = new DrawChart(ref.current!, { + type: 'line', + options: { + maintainAspectRatio: false, + responsive: true, + layout: { + padding: { + left: 0, + right: 0, + top: 0, + bottom: 0, + }, + }, + scales: { + y: { + beginAtZero: true, + display: false, + }, + x: { + display: false, + ticks: { + stepSize: 10, + maxTicksLimit: 7, + }, + }, + }, + plugins: { + legend: { + display: false, + }, + }, + }, + data: { + labels: list.map((row) => row.date), + datasets: [ + { + borderColor: '#fff', + // @ts-ignore + label: 'Total', + backgroundColor: gradient, + fill: true, + // @ts-ignore + data: list.map((row) => row.total), + }, + ], + }, + }); + return () => { + chart?.current?.destroy(); + }; + }, []); + return ; +}; diff --git a/apps/frontend/src/components/analytics/stars.and.forks.interface.ts b/apps/frontend/src/components/analytics/stars.and.forks.interface.ts index 6ae14c1e..d795ad69 100644 --- a/apps/frontend/src/components/analytics/stars.and.forks.interface.ts +++ b/apps/frontend/src/components/analytics/stars.and.forks.interface.ts @@ -3,6 +3,11 @@ export interface StarsList { date: string; } +export interface TotalList { + total: number; + date: string; +} + export interface ForksList { totalForks: number; date: string; diff --git a/apps/frontend/src/components/layout/support.tsx b/apps/frontend/src/components/layout/support.tsx index 7a777e91..ffec314e 100644 --- a/apps/frontend/src/components/layout/support.tsx +++ b/apps/frontend/src/components/layout/support.tsx @@ -1,8 +1,28 @@ 'use client'; export const Support = () => { - if (!process.env.NEXT_PUBLIC_DISCORD_SUPPORT) return null + if (!process.env.NEXT_PUBLIC_DISCORD_SUPPORT) return null; return ( -
window.open(process.env.NEXT_PUBLIC_DISCORD_SUPPORT)}>Discord Support
- ) -} \ No newline at end of file +
window.open(process.env.NEXT_PUBLIC_DISCORD_SUPPORT)} + > +
+ + + +
+
Discord Support
+
+ ); +}; diff --git a/apps/frontend/src/components/layout/top.menu.tsx b/apps/frontend/src/components/layout/top.menu.tsx index 5dac13bc..216bc481 100644 --- a/apps/frontend/src/components/layout/top.menu.tsx +++ b/apps/frontend/src/components/layout/top.menu.tsx @@ -24,6 +24,15 @@ export const menuItems = [ icon: 'launches', path: '/launches', }, + ...(general + ? [ + { + name: 'Analytics', + icon: 'analytics', + path: '/analytics', + }, + ] + : []), ...(!general ? [ { diff --git a/apps/frontend/src/components/platform-analytics/platform.analytics.tsx b/apps/frontend/src/components/platform-analytics/platform.analytics.tsx new file mode 100644 index 00000000..184664a9 --- /dev/null +++ b/apps/frontend/src/components/platform-analytics/platform.analytics.tsx @@ -0,0 +1,181 @@ +'use client'; + +import useSWR from 'swr'; +import { useCallback, useMemo, useState } from 'react'; +import { orderBy } from 'lodash'; +import clsx from 'clsx'; +import ImageWithFallback from '@gitroom/react/helpers/image.with.fallback'; +import Image from 'next/image'; +import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; +import { RenderAnalytics } from '@gitroom/frontend/components/platform-analytics/render.analytics'; +import { Select } from '@gitroom/react/form/select'; + +const allowedIntegrations = [ + 'facebook', + 'instagram', + 'linkedin-page', + 'tiktok', + 'youtube', + 'pinterest' +]; + +export const PlatformAnalytics = () => { + const fetch = useFetch(); + const [current, setCurrent] = useState(0); + const [key, setKey] = useState(7); + + const load = useCallback(async () => { + const int = (await (await fetch('/integrations/list')).json()).integrations; + return int.filter((f: any) => allowedIntegrations.includes(f.identifier)); + }, []); + + const { data } = useSWR('analytics-list', load, { + fallbackData: [], + }); + + const sortedIntegrations = useMemo(() => { + return orderBy( + data, + ['type', 'disabled', 'identifier'], + ['desc', 'asc', 'asc'] + ); + }, [data]); + + const currentIntegration = useMemo(() => { + return sortedIntegrations[current]; + }, [current, sortedIntegrations]); + + const options = useMemo(() => { + if (!currentIntegration) { + return []; + } + const arr = []; + if ( + ['facebook', 'instagram', 'linkedin-page', 'pinterest', 'youtube'].indexOf( + currentIntegration.identifier + ) !== -1 + ) { + arr.push({ + key: 7, + value: '7 Days', + }); + } + + if ( + ['facebook', 'instagram', 'linkedin-page', 'pinterest', 'youtube'].indexOf( + currentIntegration.identifier + ) !== -1 + ) { + arr.push({ + key: 30, + value: '30 Days', + }); + } + + if ( + ['facebook', 'linkedin-page', 'pinterest', 'youtube'].indexOf(currentIntegration.identifier) !== + -1 + ) { + arr.push({ + key: 90, + value: '90 Days', + }); + } + + return arr; + }, [currentIntegration]); + + const keys = useMemo(() => { + if (!currentIntegration) { + return 7; + } + if (options.find((p) => p.key === key)) { + return key; + } + + return options[0]?.key; + }, [key, currentIntegration]); + + return ( +
+
+
+
Channels
+ {sortedIntegrations.map((integration, index) => ( +
setCurrent(index)} + className={clsx( + 'flex gap-[8px] items-center', + currentIntegration.id !== integration.id && + 'opacity-20 hover:opacity-100 cursor-pointer' + )} + > +
+ {(integration.inBetweenSteps || integration.refreshNeeded) && ( +
+
+ ! +
+
+
+ )} + + {integration.identifier} +
+
+ {integration.name} +
+
+ ))} +
+
+
+
+ +
+
+ {!!keys && !!currentIntegration && ( + + )} +
+
+
+ ); +}; diff --git a/apps/frontend/src/components/platform-analytics/render.analytics.tsx b/apps/frontend/src/components/platform-analytics/render.analytics.tsx new file mode 100644 index 00000000..18401d77 --- /dev/null +++ b/apps/frontend/src/components/platform-analytics/render.analytics.tsx @@ -0,0 +1,77 @@ +import { FC, useCallback, useEffect, useMemo, useState } from 'react'; +import { Integration } from '@prisma/client'; +import useSWR from 'swr'; +import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; +import { ChartSocial } from '@gitroom/frontend/components/analytics/chart-social'; +import { LoadingComponent } from '@gitroom/frontend/components/layout/loading'; + +export const RenderAnalytics: FC<{ integration: Integration; date: number }> = ( + props +) => { + const { integration, date } = props; + const [loading, setLoading] = useState(true); + + const fetch = useFetch(); + + const load = useCallback(async () => { + setLoading(true); + const load = ( + await fetch(`/analytics/${integration.id}?date=${date}`) + ).json(); + setLoading(false); + return load; + }, [integration, date]); + + const { data } = useSWR(`/analytics-${integration?.id}-${date}`, load, { + refreshInterval: 0, + refreshWhenHidden: false, + revalidateOnFocus: false, + revalidateOnReconnect: false, + revalidateIfStale: false, + refreshWhenOffline: false, + revalidateOnMount: true, + }); + + const total = useMemo(() => { + return data?.map( + (p: any) => { + const value = (p?.data.reduce((acc: number, curr: any) => acc + curr.total, 0) || 0) / + (p.average ? p.data.length : 1); + + if (p.average) { + return value.toFixed(2) + '%'; + } + + return value; + } + ); + }, [data]); + + if (loading) { + return ( + <> + + + ); + } + + return ( +
+ {data?.map((p: any, index: number) => ( +
+
+
+
{p.label}
+
+
+
+ +
+
+
{total[index]}
+
+
+ ))} +
+ ); +}; diff --git a/apps/frontend/src/middleware.ts b/apps/frontend/src/middleware.ts index 624468a4..52cd0c7f 100644 --- a/apps/frontend/src/middleware.ts +++ b/apps/frontend/src/middleware.ts @@ -87,12 +87,6 @@ export async function middleware(request: NextRequest) { return redirect; } - if (isGeneral() && (nextUrl.pathname.indexOf('/analytics') > -1 || nextUrl.pathname.indexOf('/settings') > -1)) { - return NextResponse.redirect( - new URL('/launches', nextUrl.href) - ); - } - if (nextUrl.pathname === '/') { return NextResponse.redirect( new URL(isGeneral() ? '/launches' : `/analytics`, nextUrl.href) diff --git a/libraries/nestjs-libraries/src/integrations/integration.manager.ts b/libraries/nestjs-libraries/src/integrations/integration.manager.ts index c0e93cda..f001409c 100644 --- a/libraries/nestjs-libraries/src/integrations/integration.manager.ts +++ b/libraries/nestjs-libraries/src/integrations/integration.manager.ts @@ -16,7 +16,7 @@ import { DribbbleProvider } from '@gitroom/nestjs-libraries/integrations/social/ import { LinkedinPageProvider } from '@gitroom/nestjs-libraries/integrations/social/linkedin.page.provider'; const socialIntegrationList = [ - new XProvider(), + ...(process.env.IS_GENERAL !== 'true' ? [new XProvider()] : []), new LinkedinProvider(), new LinkedinPageProvider(), new RedditProvider(), diff --git a/libraries/nestjs-libraries/src/integrations/social/dribbble.provider.ts b/libraries/nestjs-libraries/src/integrations/social/dribbble.provider.ts index e892e9ae..0d76c8b2 100644 --- a/libraries/nestjs-libraries/src/integrations/social/dribbble.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/dribbble.provider.ts @@ -1,4 +1,5 @@ import { + AnalyticsData, AuthTokenDetails, PostDetails, PostResponse, @@ -14,7 +15,7 @@ import { SocialAbstract } from '@gitroom/nestjs-libraries/integrations/social.ab export class DribbbleProvider extends SocialAbstract implements SocialProvider { identifier = 'dribbble'; - name = 'Dribbbble'; + name = 'Dribbble'; isBetweenSteps = false; async refreshToken(refreshToken: string): Promise { @@ -67,10 +68,12 @@ export class DribbbleProvider extends SocialAbstract implements SocialProvider { }) ).json(); - return teams?.map((team: any) => ({ - id: team.id, - name: team.name, - })) || []; + return ( + teams?.map((team: any) => ({ + id: team.id, + name: team.name, + })) || [] + ); } async generateAuthUrl(refresh?: string) { @@ -268,4 +271,12 @@ export class DribbbleProvider extends SocialAbstract implements SocialProvider { return []; } } + + analytics( + id: string, + accessToken: string, + date: number + ): Promise { + return Promise.resolve([]); + } } diff --git a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts index d8824364..9ba02834 100644 --- a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts @@ -1,4 +1,5 @@ import { + AnalyticsData, AuthTokenDetails, PostDetails, PostResponse, @@ -32,7 +33,9 @@ export class FacebookProvider extends SocialAbstract implements SocialProvider { 'https://www.facebook.com/v20.0/dialog/oauth' + `?client_id=${process.env.FACEBOOK_APP_ID}` + `&redirect_uri=${encodeURIComponent( - `${process.env.FRONTEND_URL}/integrations/social/facebook${refresh ? `?refresh=${refresh}` : ''}` + `${process.env.FRONTEND_URL}/integrations/social/facebook${ + refresh ? `?refresh=${refresh}` : '' + }` )}` + `&state=${state}` + '&scope=pages_show_list,business_management,pages_manage_posts,pages_manage_engagement,pages_read_engagement', @@ -259,4 +262,37 @@ export class FacebookProvider extends SocialAbstract implements SocialProvider { ...postsArray, ]; } + + async analytics( + id: string, + accessToken: string, + date: number + ): Promise { + const until = dayjs().format('YYYY-MM-DD'); + const since = dayjs().subtract(date, 'day').format('YYYY-MM-DD'); + + const { data } = await ( + await fetch( + `https://graph.facebook.com/v20.0/${id}/insights?metric=page_impressions_unique,page_posts_impressions_unique,page_post_engagements,page_daily_follows,page_video_views&access_token=${accessToken}&period=day&since=${since}&until=${until}` + ) + ).json(); + + return data.map((d: any) => ({ + label: + d.name === 'page_impressions_unique' + ? 'Page Impressions' + : d.name === 'page_post_engagements' + ? 'Posts Engagement' + : d.name === 'page_daily_follows' + ? 'Page followers' + : d.name === 'page_video_views' + ? 'Videos views' + : 'Posts Impressions', + percentageChange: 5, + data: d.values.map((v: any) => ({ + total: v.value, + date: dayjs(v.end_time).format('YYYY-MM-DD'), + })), + })); + } } diff --git a/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts b/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts index 37b6be8f..f6492edf 100644 --- a/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/instagram.provider.ts @@ -1,4 +1,5 @@ import { + AnalyticsData, AuthTokenDetails, PostDetails, PostResponse, @@ -8,8 +9,12 @@ import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; import { timer } from '@gitroom/helpers/utils/timer'; import dayjs from 'dayjs'; import { SocialAbstract } from '@gitroom/nestjs-libraries/integrations/social.abstract'; +import { chunk } from 'lodash'; -export class InstagramProvider extends SocialAbstract implements SocialProvider { +export class InstagramProvider + extends SocialAbstract + implements SocialProvider +{ identifier = 'instagram'; name = 'Instagram'; isBetweenSteps = true; @@ -39,7 +44,7 @@ export class InstagramProvider extends SocialAbstract implements SocialProvider )}` + `&state=${state}` + `&scope=${encodeURIComponent( - 'instagram_basic,pages_show_list,pages_read_engagement,business_management,instagram_content_publish,instagram_manage_comments' + 'instagram_basic,pages_show_list,pages_read_engagement,business_management,instagram_content_publish,instagram_manage_comments,instagram_manage_insights' )}`, codeVerifier: makeId(10), state, @@ -88,7 +93,9 @@ export class InstagramProvider extends SocialAbstract implements SocialProvider ).json(); if (params.refresh) { - const findPage = (await this.pages(access_token)).find(p => p.id === params.refresh); + const findPage = (await this.pages(access_token)).find( + (p) => p.id === params.refresh + ); const information = await this.fetchPageInformation(access_token, { id: params.refresh, pageId: findPage?.pageId!, @@ -319,4 +326,30 @@ export class InstagramProvider extends SocialAbstract implements SocialProvider return arr; } + + async analytics( + id: string, + accessToken: string, + date: number + ): Promise { + const until = dayjs().format('YYYY-MM-DD'); + const since = dayjs().subtract(date, 'day').format('YYYY-MM-DD'); + + const { data, ...all } = await ( + await fetch( + `https://graph.facebook.com/v20.0/${id}/insights?metric=follower_count,impressions,reach,profile_views&access_token=${accessToken}&period=day&since=${since}&until=${until}` + ) + ).json(); + + console.log(all); + + return data?.map((d: any) => ({ + label: d.title, + percentageChange: 5, + data: d.values.map((v: any) => ({ + total: v.value, + date: dayjs(v.end_time).format('YYYY-MM-DD'), + })), + })) || []; + } } diff --git a/libraries/nestjs-libraries/src/integrations/social/linkedin.page.provider.ts b/libraries/nestjs-libraries/src/integrations/social/linkedin.page.provider.ts index cef78db9..8a732567 100644 --- a/libraries/nestjs-libraries/src/integrations/social/linkedin.page.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/linkedin.page.provider.ts @@ -1,4 +1,5 @@ import { + AnalyticsData, AuthTokenDetails, PostDetails, PostResponse, @@ -6,6 +7,9 @@ import { } from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; import { LinkedinProvider } from '@gitroom/nestjs-libraries/integrations/social/linkedin.provider'; +import { number, string } from 'yup'; +import dayjs from 'dayjs'; +import { writeFileSync } from 'fs'; export class LinkedinPageProvider extends LinkedinProvider @@ -121,7 +125,8 @@ export class LinkedinPageProvider id: data.id, name: data.localizedName, access_token: accessToken, - picture: data?.logoV2?.['original~']?.elements?.[0]?.identifiers?.[0].identifier, + picture: + data?.logoV2?.['original~']?.elements?.[0]?.identifiers?.[0].identifier, username: data.vanityName, }; } @@ -195,4 +200,332 @@ export class LinkedinPageProvider ): Promise { return super.post(id, accessToken, postDetails, 'company'); } + + async analytics( + id: string, + accessToken: string, + date: number + ): Promise { + const endDate = dayjs().unix() * 1000; + const startDate = dayjs().subtract(date, 'days').unix() * 1000; + + const { elements }: { elements: Root[]; paging: any } = await ( + await fetch( + `https://api.linkedin.com/rest/organizationPageStatistics?q=organization&organization=${encodeURIComponent( + `urn:li:organization:${id}` + )}&timeIntervals=(timeRange:(start:${startDate},end:${endDate}),timeGranularityType:DAY)`, + { + headers: { + Authorization: `Bearer ${accessToken}`, + 'Linkedin-Version': '202405', + 'X-Restli-Protocol-Version': '2.0.0', + }, + } + ) + ).json(); + + const { elements: elements2 }: { elements: Root[]; paging: any } = await ( + await fetch( + `https://api.linkedin.com/rest/organizationalEntityFollowerStatistics?q=organizationalEntity&organizationalEntity=${encodeURIComponent( + `urn:li:organization:${id}` + )}&timeIntervals=(timeRange:(start:${startDate},end:${endDate}),timeGranularityType:DAY)`, + { + headers: { + Authorization: `Bearer ${accessToken}`, + 'Linkedin-Version': '202405', + 'X-Restli-Protocol-Version': '2.0.0', + }, + } + ) + ).json(); + + const { elements: elements3 }: { elements: Root[]; paging: any } = await ( + await fetch( + `https://api.linkedin.com/rest/organizationalEntityShareStatistics?q=organizationalEntity&organizationalEntity=${encodeURIComponent( + `urn:li:organization:${id}` + )}&timeIntervals=(timeRange:(start:${startDate},end:${endDate}),timeGranularityType:DAY)`, + { + headers: { + Authorization: `Bearer ${accessToken}`, + 'Linkedin-Version': '202405', + 'X-Restli-Protocol-Version': '2.0.0', + }, + } + ) + ).json(); + + const analytics = [...elements2, ...elements, ...elements3].reduce( + (all, current) => { + if ( + typeof current?.totalPageStatistics?.views?.allPageViews + ?.pageViews !== 'undefined' + ) { + all['Page Views'].push({ + total: current.totalPageStatistics.views.allPageViews.pageViews, + date: dayjs(current.timeRange.start).format('YYYY-MM-DD'), + }); + } + + if ( + typeof current?.followerGains?.organicFollowerGain !== 'undefined' + ) { + all['Organic Followers'].push({ + total: current?.followerGains?.organicFollowerGain, + date: dayjs(current.timeRange.start).format('YYYY-MM-DD'), + }); + } + + if (typeof current?.followerGains?.paidFollowerGain !== 'undefined') { + all['Paid Followers'].push({ + total: current?.followerGains?.paidFollowerGain, + date: dayjs(current.timeRange.start).format('YYYY-MM-DD'), + }); + } + + if (typeof current?.totalShareStatistics !== 'undefined') { + all['Clicks'].push({ + total: current?.totalShareStatistics.clickCount, + date: dayjs(current.timeRange.start).format('YYYY-MM-DD'), + }); + + all['Shares'].push({ + total: current?.totalShareStatistics.shareCount, + date: dayjs(current.timeRange.start).format('YYYY-MM-DD'), + }); + + all['Engagement'].push({ + total: current?.totalShareStatistics.engagement, + date: dayjs(current.timeRange.start).format('YYYY-MM-DD'), + }); + + all['Comments'].push({ + total: current?.totalShareStatistics.commentCount, + date: dayjs(current.timeRange.start).format('YYYY-MM-DD'), + }); + } + + return all; + }, + { + 'Page Views': [] as any[], + Clicks: [] as any[], + Shares: [] as any[], + Engagement: [] as any[], + Comments: [] as any[], + 'Organic Followers': [] as any[], + 'Paid Followers': [] as any[], + } + ); + + return Object.keys(analytics).map((key) => ({ + label: key, + data: analytics[ + key as 'Page Views' | 'Organic Followers' | 'Paid Followers' + ], + percentageChange: 5, + })); + } +} + +export interface Root { + pageStatisticsByIndustryV2: any[]; + pageStatisticsBySeniority: any[]; + organization: string; + pageStatisticsByGeoCountry: any[]; + pageStatisticsByTargetedContent: any[]; + totalPageStatistics: TotalPageStatistics; + pageStatisticsByStaffCountRange: any[]; + pageStatisticsByFunction: any[]; + pageStatisticsByGeo: any[]; + followerGains: { organicFollowerGain: number; paidFollowerGain: number }; + timeRange: TimeRange; + totalShareStatistics: { + uniqueImpressionsCount: number; + shareCount: number; + engagement: number; + clickCount: number; + likeCount: number; + impressionCount: number; + commentCount: number; + }; +} + +export interface TotalPageStatistics { + clicks: Clicks; + views: Views; +} + +export interface Clicks { + mobileCustomButtonClickCounts: any[]; + desktopCustomButtonClickCounts: any[]; +} + +export interface Views { + mobileProductsPageViews: MobileProductsPageViews; + allDesktopPageViews: AllDesktopPageViews; + insightsPageViews: InsightsPageViews; + mobileAboutPageViews: MobileAboutPageViews; + allMobilePageViews: AllMobilePageViews; + productsPageViews: ProductsPageViews; + desktopProductsPageViews: DesktopProductsPageViews; + jobsPageViews: JobsPageViews; + peoplePageViews: PeoplePageViews; + overviewPageViews: OverviewPageViews; + mobileOverviewPageViews: MobileOverviewPageViews; + lifeAtPageViews: LifeAtPageViews; + desktopOverviewPageViews: DesktopOverviewPageViews; + mobileCareersPageViews: MobileCareersPageViews; + allPageViews: AllPageViews; + careersPageViews: CareersPageViews; + mobileJobsPageViews: MobileJobsPageViews; + mobileLifeAtPageViews: MobileLifeAtPageViews; + desktopJobsPageViews: DesktopJobsPageViews; + desktopPeoplePageViews: DesktopPeoplePageViews; + aboutPageViews: AboutPageViews; + desktopAboutPageViews: DesktopAboutPageViews; + mobilePeoplePageViews: MobilePeoplePageViews; + desktopCareersPageViews: DesktopCareersPageViews; + desktopInsightsPageViews: DesktopInsightsPageViews; + desktopLifeAtPageViews: DesktopLifeAtPageViews; + mobileInsightsPageViews: MobileInsightsPageViews; +} + +export interface MobileProductsPageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface AllDesktopPageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface InsightsPageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface MobileAboutPageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface AllMobilePageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface ProductsPageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface DesktopProductsPageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface JobsPageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface PeoplePageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface OverviewPageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface MobileOverviewPageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface LifeAtPageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface DesktopOverviewPageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface MobileCareersPageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface AllPageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface CareersPageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface MobileJobsPageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface MobileLifeAtPageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface DesktopJobsPageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface DesktopPeoplePageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface AboutPageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface DesktopAboutPageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface MobilePeoplePageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface DesktopCareersPageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface DesktopInsightsPageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface DesktopLifeAtPageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface MobileInsightsPageViews { + pageViews: number; + uniquePageViews: number; +} + +export interface TimeRange { + start: number; + end: number; } diff --git a/libraries/nestjs-libraries/src/integrations/social/linkedin.provider.ts b/libraries/nestjs-libraries/src/integrations/social/linkedin.provider.ts index 25fe4b88..51b18117 100644 --- a/libraries/nestjs-libraries/src/integrations/social/linkedin.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/linkedin.provider.ts @@ -1,8 +1,5 @@ import { - AuthTokenDetails, - PostDetails, - PostResponse, - SocialProvider, + AnalyticsData, AuthTokenDetails, PostDetails, PostResponse, SocialProvider } from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface'; import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; import sharp from 'sharp'; @@ -10,6 +7,7 @@ import { lookup } from 'mime-types'; import { readOrFetch } from '@gitroom/helpers/utils/read.or.fetch'; import { removeMarkdown } from '@gitroom/helpers/utils/remove.markdown'; import { SocialAbstract } from '@gitroom/nestjs-libraries/integrations/social.abstract'; +import { number, string } from 'yup'; export class LinkedinProvider extends SocialAbstract implements SocialProvider { identifier = 'linkedin'; diff --git a/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts b/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts index 951beead..b09bc655 100644 --- a/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/pinterest.provider.ts @@ -1,4 +1,5 @@ import { + AnalyticsData, AuthTokenDetails, PostDetails, PostResponse, @@ -10,8 +11,12 @@ import axios from 'axios'; import FormData from 'form-data'; import { timer } from '@gitroom/helpers/utils/timer'; import { SocialAbstract } from '@gitroom/nestjs-libraries/integrations/social.abstract'; +import dayjs from 'dayjs'; -export class PinterestProvider extends SocialAbstract implements SocialProvider { +export class PinterestProvider + extends SocialAbstract + implements SocialProvider +{ identifier = 'pinterest'; name = 'Pinterest'; isBetweenSteps = false; @@ -181,15 +186,12 @@ export class PinterestProvider extends SocialAbstract implements SocialProvider while (statusCode !== 'succeeded') { console.log('trying'); const mediafile = await ( - await this.fetch( - 'https://api.pinterest.com/v5/media/' + media_id, - { - method: 'GET', - headers: { - Authorization: `Bearer ${accessToken}`, - }, - } - ) + await this.fetch('https://api.pinterest.com/v5/media/' + media_id, { + method: 'GET', + headers: { + Authorization: `Bearer ${accessToken}`, + }, + }) ).json(); await timer(3000); @@ -261,4 +263,68 @@ export class PinterestProvider extends SocialAbstract implements SocialProvider return []; } } + + async analytics( + id: string, + accessToken: string, + date: number + ): Promise { + const until = dayjs().format('YYYY-MM-DD'); + const since = dayjs().subtract(date, 'day').format('YYYY-MM-DD'); + + const { + all: { daily_metrics }, + } = await ( + await this.fetch( + `https://api.pinterest.com/v5/user_account/analytics?start_date=${since}&end_date=${until}`, + { + method: 'GET', + headers: { + Authorization: `Bearer ${accessToken}`, + 'Content-Type': 'application/json', + }, + } + ) + ).json(); + + return daily_metrics.reduce( + (acc: any, item: any) => { + if (typeof item.metrics.PIN_CLICK_RATE !== 'undefined') { + acc[0].data.push({ + date: item.date, + total: item.metrics.PIN_CLICK_RATE, + }); + + acc[1].data.push({ + date: item.date, + total: item.metrics.IMPRESSION, + }); + + acc[2].data.push({ + date: item.date, + total: item.metrics.PIN_CLICK, + }); + + acc[3].data.push({ + date: item.date, + total: item.metrics.ENGAGEMENT, + }); + + acc[4].data.push({ + date: item.date, + total: item.metrics.SAVE, + }); + } + + return acc; + }, + [ + { label: 'Pin click rate', data: [] as any[] }, + { label: 'Impressions', data: [] as any[] }, + { label: 'Pin Clicks', data: [] as any[] }, + { label: 'Engagement', data: [] as any[] }, + { label: 'Saves', data: [] as any[] }, + ] + ); + } } diff --git a/libraries/nestjs-libraries/src/integrations/social/social.integrations.interface.ts b/libraries/nestjs-libraries/src/integrations/social/social.integrations.interface.ts index cd2b8ebc..7449ceb0 100644 --- a/libraries/nestjs-libraries/src/integrations/social/social.integrations.interface.ts +++ b/libraries/nestjs-libraries/src/integrations/social/social.integrations.interface.ts @@ -1,57 +1,74 @@ export interface IAuthenticator { - authenticate(params: {code: string, codeVerifier: string, refresh?: string}): Promise; - refreshToken(refreshToken: string): Promise; - generateAuthUrl(refresh?: string): Promise; + authenticate(params: { + code: string; + codeVerifier: string; + refresh?: string; + }): Promise; + refreshToken(refreshToken: string): Promise; + generateAuthUrl(refresh?: string): Promise; + analytics?(id: string, accessToken: string, date: number): Promise; +} + +export interface AnalyticsData { + label: string; + data: Array<{ total: string; date: string }>; + percentageChange: number; } export type GenerateAuthUrlResponse = { - url: string, - codeVerifier: string, - state: string -} + url: string; + codeVerifier: string; + state: string; +}; export type AuthTokenDetails = { - id: string; - name: string; - accessToken: string; // The obtained access token - refreshToken?: string; // The refresh token, if applicable - expiresIn?: number; // The duration in seconds for which the access token is valid - picture?: string; - username: string; + id: string; + name: string; + accessToken: string; // The obtained access token + refreshToken?: string; // The refresh token, if applicable + expiresIn?: number; // The duration in seconds for which the access token is valid + picture?: string; + username: string; }; export interface ISocialMediaIntegration { - post(id: string, accessToken: string, postDetails: PostDetails[]): Promise; // Schedules a new post + post( + id: string, + accessToken: string, + postDetails: PostDetails[] + ): Promise; // Schedules a new post } export type PostResponse = { - id: string; // The db internal id of the post - postId: string; // The ID of the scheduled post returned by the platform - releaseURL: string; // The URL of the post on the platform - status: string; // Status of the operation or initial post status + id: string; // The db internal id of the post + postId: string; // The ID of the scheduled post returned by the platform + releaseURL: string; // The URL of the post on the platform + status: string; // Status of the operation or initial post status }; export type PostDetails = { - id: string; - message: string; - settings: T; - media?: MediaContent[]; - poll?: PollDetails; + id: string; + message: string; + settings: T; + media?: MediaContent[]; + poll?: PollDetails; }; export type PollDetails = { - options: string[]; // Array of poll options - duration: number; // Duration in hours for which the poll will be active -} - -export type MediaContent = { - type: 'image' | 'video'; // Type of the media content - url: string; // URL of the media file, if it's already hosted somewhere - path: string; + options: string[]; // Array of poll options + duration: number; // Duration in hours for which the poll will be active }; -export interface SocialProvider extends IAuthenticator, ISocialMediaIntegration { - identifier: string; - name: string; - isBetweenSteps: boolean; -} \ No newline at end of file +export type MediaContent = { + type: 'image' | 'video'; // Type of the media content + url: string; // URL of the media file, if it's already hosted somewhere + path: string; +}; + +export interface SocialProvider + extends IAuthenticator, + ISocialMediaIntegration { + identifier: string; + name: string; + isBetweenSteps: boolean; +} diff --git a/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts b/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts index b873958e..de634367 100644 --- a/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/tiktok.provider.ts @@ -73,103 +73,18 @@ export class TiktokProvider extends SocialAbstract implements SocialProvider { codeVerifier: string; refresh?: string; }) { - const getAccessToken = await ( - await this.fetch( - 'https://graph.facebook.com/v20.0/oauth/access_token' + - `?client_id=${process.env.FACEBOOK_APP_ID}` + - `&redirect_uri=${encodeURIComponent( - `${process.env.FRONTEND_URL}/integrations/social/facebook${ - params.refresh ? `?refresh=${params.refresh}` : '' - }` - )}` + - `&client_secret=${process.env.FACEBOOK_APP_SECRET}` + - `&code=${params.code}` - ) - ).json(); - - const { access_token } = await ( - await this.fetch( - 'https://graph.facebook.com/v20.0/oauth/access_token' + - '?grant_type=fb_exchange_token' + - `&client_id=${process.env.FACEBOOK_APP_ID}` + - `&client_secret=${process.env.FACEBOOK_APP_SECRET}` + - `&fb_exchange_token=${getAccessToken.access_token}&fields=access_token,expires_in` - ) - ).json(); - - if (params.refresh) { - const information = await this.fetchPageInformation( - access_token, - params.refresh - ); - return { - id: information.id, - name: information.name, - accessToken: information.access_token, - refreshToken: information.access_token, - expiresIn: dayjs().add(59, 'days').unix() - dayjs().unix(), - picture: information.picture, - username: information.username, - }; - } - - const { - id, - name, - picture: { - data: { url }, - }, - } = await ( - await this.fetch( - `https://graph.facebook.com/v19.0/me?fields=id,name,picture&access_token=${access_token}` - ) - ).json(); - + console.log(params); return { - id, - name, - accessToken: access_token, - refreshToken: access_token, + id: '', + name: '', + accessToken: '', + refreshToken: '', expiresIn: dayjs().add(59, 'days').unix() - dayjs().unix(), - picture: url, + picture: '', username: '', }; } - async pages(accessToken: string) { - const { data } = await ( - await this.fetch( - `https://graph.facebook.com/v20.0/me/accounts?fields=id,username,name,picture.type(large)&access_token=${accessToken}` - ) - ).json(); - - return data; - } - - async fetchPageInformation(accessToken: string, pageId: string) { - const { - id, - name, - access_token, - username, - picture: { - data: { url }, - }, - } = await ( - await this.fetch( - `https://graph.facebook.com/v20.0/${pageId}?fields=username,access_token,name,picture.type(large)&access_token=${accessToken}` - ) - ).json(); - - return { - id, - name, - access_token, - picture: url, - username, - }; - } - async post( id: string, accessToken: string, diff --git a/libraries/nestjs-libraries/src/integrations/social/youtube.provider.ts b/libraries/nestjs-libraries/src/integrations/social/youtube.provider.ts index 8ddc3278..a6c1b89e 100644 --- a/libraries/nestjs-libraries/src/integrations/social/youtube.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/youtube.provider.ts @@ -1,4 +1,5 @@ import { + AnalyticsData, AuthTokenDetails, PostDetails, PostResponse, @@ -8,9 +9,11 @@ import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; import { google } from 'googleapis'; import { OAuth2Client } from 'google-auth-library/build/src/auth/oauth2client'; import * as console from 'node:console'; -import axios from 'axios'; +import axios, { all } from 'axios'; import { YoutubeSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/youtube.settings.dto'; import { SocialAbstract } from '@gitroom/nestjs-libraries/integrations/social.abstract'; +import * as process from 'node:process'; +import dayjs from 'dayjs'; const clientAndYoutube = () => { const client = new google.auth.OAuth2({ @@ -25,13 +28,19 @@ const clientAndYoutube = () => { auth: newClient, }); + const youtubeAnalytics = (newClient: OAuth2Client) => + google.youtubeAnalytics({ + version: 'v2', + auth: newClient, + }); + const oauth2 = (newClient: OAuth2Client) => google.oauth2({ version: 'v2', auth: newClient, }); - return { client, youtube, oauth2 }; + return { client, youtube, oauth2, youtubeAnalytics }; }; export class YoutubeProvider extends SocialAbstract implements SocialProvider { @@ -79,6 +88,8 @@ export class YoutubeProvider extends SocialAbstract implements SocialProvider { 'https://www.googleapis.com/auth/youtube.readonly', 'https://www.googleapis.com/auth/youtube.upload', 'https://www.googleapis.com/auth/youtubepartner', + 'https://www.googleapis.com/auth/youtubepartner', + 'https://www.googleapis.com/auth/yt-analytics.readonly', ], }), codeVerifier: makeId(10), @@ -162,4 +173,87 @@ export class YoutubeProvider extends SocialAbstract implements SocialProvider { } return []; } + + async analytics( + id: string, + accessToken: string, + date: number + ): Promise { + const endDate = dayjs().format('YYYY-MM-DD'); + const startDate = dayjs().subtract(date, 'day').format('YYYY-MM-DD'); + + const { client, youtubeAnalytics } = clientAndYoutube(); + client.setCredentials({ access_token: accessToken }); + const youtubeClient = youtubeAnalytics(client); + const { data } = await youtubeClient.reports.query({ + ids: 'channel==MINE', + startDate, + endDate, + metrics: + 'views,estimatedMinutesWatched,averageViewDuration,averageViewPercentage,subscribersGained,likes,subscribersLost', + dimensions: 'day', + sort: 'day', + }); + + const columns = data?.columnHeaders?.map((p) => p.name)!; + const mappedData = data?.rows?.map((p) => { + return columns.reduce((acc, curr, index) => { + acc[curr!] = p[index]; + return acc; + }, {} as any); + }); + + const acc = [] as any[]; + acc.push({ + label: 'Estimated Minutes Watched', + data: mappedData?.map((p: any) => ({ + total: p.estimatedMinutesWatched, + date: p.day, + })), + }); + + acc.push({ + label: 'Average View Duration', + average: true, + data: mappedData?.map((p: any) => ({ + total: p.averageViewDuration, + date: p.day, + })), + }); + + acc.push({ + label: 'Average View Percentage', + average: true, + data: mappedData?.map((p: any) => ({ + total: p.averageViewPercentage, + date: p.day, + })), + }); + + acc.push({ + label: 'Subscribers Gained', + data: mappedData?.map((p: any) => ({ + total: p.subscribersGained, + date: p.day, + })), + }); + + acc.push({ + label: 'Subscribers Lost', + data: mappedData?.map((p: any) => ({ + total: p.subscribersLost, + date: p.day, + })), + }); + + acc.push({ + label: 'Likes', + data: mappedData?.map((p: any) => ({ + total: p.likes, + date: p.day, + })), + }); + + return acc; + } } diff --git a/libraries/react-shared-libraries/src/form/select.tsx b/libraries/react-shared-libraries/src/form/select.tsx index 546fe9cf..25d27d92 100644 --- a/libraries/react-shared-libraries/src/form/select.tsx +++ b/libraries/react-shared-libraries/src/form/select.tsx @@ -16,9 +16,18 @@ export const Select: FC< disableForm?: boolean; label: string; name: string; + hideErrors?: boolean; } > = (props) => { - const { label, className, disableForm, error, extraForm, ...rest } = props; + const { + label, + className, + hideErrors, + disableForm, + error, + extraForm, + ...rest + } = props; const form = useFormContext(); const err = useMemo(() => { if (error) return error; @@ -27,7 +36,7 @@ export const Select: FC< }, [form?.formState?.errors?.[props?.name!]?.message, error]); return ( -
+
{label}
setKey(+e.target.value)} - > - {options.map((option) => ( - - ))} - + {!!options.length && ( +
+
+ +
+
+ {!!keys && !!currentIntegration && ( + + )} +
-
- {!!keys && !!currentIntegration && ( - - )} -
-
+ )}
); }; From 67d6776404378d5b49e1a33ea634cbf0f30277e5 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Tue, 4 Jun 2024 13:14:03 +0700 Subject: [PATCH 22/36] feat: privacy policy --- apps/frontend/src/components/auth/register.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/apps/frontend/src/components/auth/register.tsx b/apps/frontend/src/components/auth/register.tsx index d4416db5..8c514961 100644 --- a/apps/frontend/src/components/auth/register.tsx +++ b/apps/frontend/src/components/auth/register.tsx @@ -105,6 +105,11 @@ export function RegisterAfter({ } }; + const rootDomain = useMemo(() => { + const url = new URL(process.env.frontendUrl!); + return url.protocol + '//' + url.host; + }, []); + return (
@@ -150,6 +155,7 @@ export function RegisterAfter({ placeholder="Company" />
+
By registering you agree to our Terms of Service and Privacy Policy
-
By registering you agree to our Terms of Service and Privacy Policy
+
+ By registering you agree to our{' '} + + Terms of Service + {' '} + and{' '} + + Privacy Policy + +
-
+
By registering you agree to our{' '} Date: Wed, 5 Jun 2024 13:13:36 +0700 Subject: [PATCH 26/36] feat: registration provider --- .../auth/providers/github.provider.ts | 2 +- .../auth/providers/google.provider.ts | 74 +++++++++++++++++++ .../auth/providers/providers.factory.ts | 21 +++--- apps/frontend/src/components/auth/login.tsx | 2 +- .../auth/providers/github.provider.tsx | 0 .../auth/providers/google.provider.tsx | 45 +++++++++++ .../frontend/src/components/auth/register.tsx | 7 +- apps/frontend/src/middleware.ts | 5 +- .../src/database/prisma/schema.prisma | 1 + .../src/services/email.service.ts | 2 +- 10 files changed, 143 insertions(+), 16 deletions(-) create mode 100644 apps/backend/src/services/auth/providers/google.provider.ts rename apps/frontend/src/{app => components}/auth/providers/github.provider.tsx (100%) create mode 100644 apps/frontend/src/components/auth/providers/google.provider.tsx diff --git a/apps/backend/src/services/auth/providers/github.provider.ts b/apps/backend/src/services/auth/providers/github.provider.ts index dcfdb669..2d8b95ea 100644 --- a/apps/backend/src/services/auth/providers/github.provider.ts +++ b/apps/backend/src/services/auth/providers/github.provider.ts @@ -5,7 +5,7 @@ export class GithubProvider implements ProvidersInterface { return `https://github.com/login/oauth/authorize?client_id=${ process.env.GITHUB_CLIENT_ID }&scope=user:email&redirect_uri=${encodeURIComponent( - `${process.env.FRONTEND_URL}/settings?provider=github` + `${process.env.FRONTEND_URL}/settings` )}`; } diff --git a/apps/backend/src/services/auth/providers/google.provider.ts b/apps/backend/src/services/auth/providers/google.provider.ts new file mode 100644 index 00000000..d895b45a --- /dev/null +++ b/apps/backend/src/services/auth/providers/google.provider.ts @@ -0,0 +1,74 @@ +import { + AnalyticsData, + AuthTokenDetails, + PostDetails, + PostResponse, + SocialProvider, +} from '@gitroom/nestjs-libraries/integrations/social/social.integrations.interface'; +import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; +import { google } from 'googleapis'; +import { OAuth2Client } from 'google-auth-library/build/src/auth/oauth2client'; +import { ProvidersInterface } from '@gitroom/backend/services/auth/providers.interface'; + +const clientAndYoutube = () => { + const client = new google.auth.OAuth2({ + clientId: process.env.YOUTUBE_CLIENT_ID, + clientSecret: process.env.YOUTUBE_CLIENT_SECRET, + redirectUri: `${process.env.FRONTEND_URL}/integrations/social/youtube`, + }); + + const youtube = (newClient: OAuth2Client) => + google.youtube({ + version: 'v3', + auth: newClient, + }); + + const youtubeAnalytics = (newClient: OAuth2Client) => + google.youtubeAnalytics({ + version: 'v2', + auth: newClient, + }); + + const oauth2 = (newClient: OAuth2Client) => + google.oauth2({ + version: 'v2', + auth: newClient, + }); + + return { client, youtube, oauth2, youtubeAnalytics }; +}; + +export class GoogleProvider implements ProvidersInterface { + generateLink() { + const state = makeId(7); + const { client } = clientAndYoutube(); + return client.generateAuthUrl({ + access_type: 'online', + prompt: 'consent', + state, + redirect_uri: `${process.env.FRONTEND_URL}/integrations/social/youtube`, + scope: [ + 'https://www.googleapis.com/auth/userinfo.profile', + 'https://www.googleapis.com/auth/userinfo.email', + ], + }); + } + + async getToken(code: string) { + const { client, oauth2 } = clientAndYoutube(); + const { tokens } = await client.getToken(code); + return tokens.access_token; + } + + async getUser(providerToken: string) { + const { client, oauth2 } = clientAndYoutube(); + client.setCredentials({ access_token: providerToken }); + const user = oauth2(client); + const { data } = await user.userinfo.get(); + + return { + id: data.id!, + email: data.email, + }; + } +} diff --git a/apps/backend/src/services/auth/providers/providers.factory.ts b/apps/backend/src/services/auth/providers/providers.factory.ts index 96af6adb..61048d50 100644 --- a/apps/backend/src/services/auth/providers/providers.factory.ts +++ b/apps/backend/src/services/auth/providers/providers.factory.ts @@ -1,12 +1,15 @@ -import {Provider} from "@prisma/client"; -import {GithubProvider} from "@gitroom/backend/services/auth/providers/github.provider"; -import {ProvidersInterface} from "@gitroom/backend/services/auth/providers.interface"; +import { Provider } from '@prisma/client'; +import { GithubProvider } from '@gitroom/backend/services/auth/providers/github.provider'; +import { ProvidersInterface } from '@gitroom/backend/services/auth/providers.interface'; +import { GoogleProvider } from '@gitroom/backend/services/auth/providers/google.provider'; export class ProvidersFactory { - static loadProvider(provider: Provider): ProvidersInterface { - switch (provider) { - case Provider.GITHUB: - return new GithubProvider(); - } + static loadProvider(provider: Provider): ProvidersInterface { + switch (provider) { + case Provider.GITHUB: + return new GithubProvider(); + case Provider.GOOGLE: + return new GoogleProvider(); } -} \ No newline at end of file + } +} diff --git a/apps/frontend/src/components/auth/login.tsx b/apps/frontend/src/components/auth/login.tsx index 91c0f3a8..5f101a37 100644 --- a/apps/frontend/src/components/auth/login.tsx +++ b/apps/frontend/src/components/auth/login.tsx @@ -8,7 +8,7 @@ import { Input } from '@gitroom/react/form/input'; import { useMemo, useState } from 'react'; import { classValidatorResolver } from '@hookform/resolvers/class-validator'; import { LoginUserDto } from '@gitroom/nestjs-libraries/dtos/auth/login.user.dto'; -import { GithubProvider } from '@gitroom/frontend/app/auth/providers/github.provider'; +import { GithubProvider } from '@gitroom/frontend/components/auth/providers/github.provider'; import interClass from '@gitroom/react/helpers/inter.font'; import { isGeneral } from '@gitroom/react/helpers/is.general'; diff --git a/apps/frontend/src/app/auth/providers/github.provider.tsx b/apps/frontend/src/components/auth/providers/github.provider.tsx similarity index 100% rename from apps/frontend/src/app/auth/providers/github.provider.tsx rename to apps/frontend/src/components/auth/providers/github.provider.tsx diff --git a/apps/frontend/src/components/auth/providers/google.provider.tsx b/apps/frontend/src/components/auth/providers/google.provider.tsx new file mode 100644 index 00000000..1bbb8a60 --- /dev/null +++ b/apps/frontend/src/components/auth/providers/google.provider.tsx @@ -0,0 +1,45 @@ +import { useCallback } from 'react'; +import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; +import interClass from '@gitroom/react/helpers/inter.font'; + +export const GoogleProvider = () => { + const fetch = useFetch(); + const gotoLogin = useCallback(async () => { + const link = await (await fetch('/auth/oauth/GOOGLE')).text(); + window.location.href = link; + }, []); + + return ( +
+
+ + + + + + +
+
Sign in with Google
+
+ ); +}; diff --git a/apps/frontend/src/components/auth/register.tsx b/apps/frontend/src/components/auth/register.tsx index 698b2826..bf8242a2 100644 --- a/apps/frontend/src/components/auth/register.tsx +++ b/apps/frontend/src/components/auth/register.tsx @@ -8,12 +8,13 @@ import { Input } from '@gitroom/react/form/input'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { classValidatorResolver } from '@hookform/resolvers/class-validator'; import { CreateOrgUserDto } from '@gitroom/nestjs-libraries/dtos/auth/create.org.user.dto'; -import { GithubProvider } from '@gitroom/frontend/app/auth/providers/github.provider'; +import { GithubProvider } from '@gitroom/frontend/components/auth/providers/github.provider'; import { useSearchParams } from 'next/navigation'; import { LoadingComponent } from '@gitroom/frontend/components/layout/loading'; import interClass from '@gitroom/react/helpers/inter.font'; import { isGeneral } from '@gitroom/react/helpers/is.general'; import clsx from 'clsx'; +import { GoogleProvider } from '@gitroom/frontend/components/auth/providers/google.provider'; type Inputs = { email: string; @@ -125,8 +126,8 @@ export function RegisterAfter({ Sign Up
- {!isAfterProvider && !isGeneral() && } - {!isAfterProvider && !isGeneral() && ( + {!isAfterProvider && (!isGeneral() ? : )} + {!isAfterProvider && (
nextUrl.href.indexOf(p) > -1); + const additional = !findIndex ? '' : (url.indexOf('?') > -1 ? '&' : '?') + `provider=${findIndex.toUpperCase()}`; + return NextResponse.redirect(new URL(`/auth${url}${additional}`, nextUrl.href)); } // If the url is /auth and the cookie exists, redirect to / diff --git a/libraries/nestjs-libraries/src/database/prisma/schema.prisma b/libraries/nestjs-libraries/src/database/prisma/schema.prisma index b659ab95..be6310e4 100644 --- a/libraries/nestjs-libraries/src/database/prisma/schema.prisma +++ b/libraries/nestjs-libraries/src/database/prisma/schema.prisma @@ -413,6 +413,7 @@ enum Period { enum Provider { LOCAL GITHUB + GOOGLE } enum Role { diff --git a/libraries/nestjs-libraries/src/services/email.service.ts b/libraries/nestjs-libraries/src/services/email.service.ts index be586c7c..96bc94e4 100644 --- a/libraries/nestjs-libraries/src/services/email.service.ts +++ b/libraries/nestjs-libraries/src/services/email.service.ts @@ -11,7 +11,7 @@ export class EmailService { return; } await resend.emails.send({ - from: 'Gitroom ', + from: process.env.IS_GENERAL === 'true' ? 'Nevo ' : 'Nevo ', to, subject, html, From 498d4ef3c464fe6fbea7745d35232857e1107242 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Wed, 5 Jun 2024 13:20:12 +0700 Subject: [PATCH 27/36] feat: registration provider --- .../src/integrations/social/youtube.provider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/nestjs-libraries/src/integrations/social/youtube.provider.ts b/libraries/nestjs-libraries/src/integrations/social/youtube.provider.ts index 3bbf008d..fc2df021 100644 --- a/libraries/nestjs-libraries/src/integrations/social/youtube.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/youtube.provider.ts @@ -92,7 +92,7 @@ export class YoutubeProvider extends SocialAbstract implements SocialProvider { 'https://www.googleapis.com/auth/yt-analytics.readonly', ], }), - codeVerifier: makeId(10), + codeVerifier: makeId(11), state, }; } From e534476189ec175efd5253fa8bd2382691ed148b Mon Sep 17 00:00:00 2001 From: Nevo David Date: Wed, 5 Jun 2024 14:46:33 +0700 Subject: [PATCH 28/36] feat: activate your email --- .../backend/src/api/routes/auth.controller.ts | 29 +++++++++++++ apps/backend/src/main.ts | 2 +- .../src/services/auth/auth.middleware.ts | 7 ++- .../backend/src/services/auth/auth.service.ts | 35 ++++++++++++--- .../src/app/auth/activate/[code]/page.tsx | 15 +++++++ apps/frontend/src/app/auth/activate/page.tsx | 17 ++++++++ .../frontend/src/components/auth/activate.tsx | 16 +++++++ .../src/components/auth/after.activate.tsx | 43 +++++++++++++++++++ apps/frontend/src/components/auth/login.tsx | 2 +- .../frontend/src/components/auth/register.tsx | 9 +++- .../organizations/organization.repository.ts | 1 + .../src/database/prisma/schema.prisma | 1 + .../database/prisma/users/users.repository.ts | 11 +++++ .../database/prisma/users/users.service.ts | 4 ++ .../src/services/email.service.ts | 4 +- 15 files changed, 184 insertions(+), 12 deletions(-) create mode 100644 apps/frontend/src/app/auth/activate/[code]/page.tsx create mode 100644 apps/frontend/src/app/auth/activate/page.tsx create mode 100644 apps/frontend/src/components/auth/activate.tsx create mode 100644 apps/frontend/src/components/auth/after.activate.tsx diff --git a/apps/backend/src/api/routes/auth.controller.ts b/apps/backend/src/api/routes/auth.controller.ts index f36ea646..3bbabf7d 100644 --- a/apps/backend/src/api/routes/auth.controller.ts +++ b/apps/backend/src/api/routes/auth.controller.ts @@ -30,6 +30,12 @@ export class AuthController { getOrgFromCookie ); + if (body.provider === 'LOCAL') { + response.header('activate', 'true'); + response.status(200).json({ activate: true }); + return; + } + response.cookie('auth', jwt, { domain: '.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname, @@ -132,6 +138,29 @@ export class AuthController { return this._authService.oauthLink(provider); } + @Post('/activate') + async activate( + @Body('code') code: string, + @Res({ passthrough: true }) response: Response + ) { + const activate = await this._authService.activate(code); + if (!activate) { + return response.status(200).send({ can: false }); + } + + response.cookie('auth', activate, { + domain: + '.' + new URL(removeSubdomain(process.env.FRONTEND_URL!)).hostname, + secure: true, + httpOnly: true, + sameSite: 'none', + expires: new Date(Date.now() + 1000 * 60 * 60 * 24 * 365), + }); + + response.header('onboarding', 'true'); + return response.status(200).send({ can: true }); + } + @Post('/oauth/:provider/exists') async oauthExists( @Body('code') code: string, diff --git a/apps/backend/src/main.ts b/apps/backend/src/main.ts index cbad49fd..5cc8f4c0 100644 --- a/apps/backend/src/main.ts +++ b/apps/backend/src/main.ts @@ -14,7 +14,7 @@ async function bootstrap() { rawBody: true, cors: { credentials: true, - exposedHeaders: ['reload', 'onboarding'], + exposedHeaders: ['reload', 'onboarding', 'activate'], origin: [process.env.FRONTEND_URL], } }); diff --git a/apps/backend/src/services/auth/auth.middleware.ts b/apps/backend/src/services/auth/auth.middleware.ts index 372b40c1..a54dfb4a 100644 --- a/apps/backend/src/services/auth/auth.middleware.ts +++ b/apps/backend/src/services/auth/auth.middleware.ts @@ -36,8 +36,11 @@ export class AuthMiddleware implements NestMiddleware { const orgHeader = req.cookies.showorg || req.headers.showorg; if (!user) { - removeAuth(res); - res.status(401).send('Unauthorized'); + throw new HttpForbiddenException(); + } + + if (!user.activated) { + throw new HttpForbiddenException(); } if (user?.isSuperAdmin && req.cookies.impersonate) { diff --git a/apps/backend/src/services/auth/auth.service.ts b/apps/backend/src/services/auth/auth.service.ts index 007fc746..160a7f30 100644 --- a/apps/backend/src/services/auth/auth.service.ts +++ b/apps/backend/src/services/auth/auth.service.ts @@ -10,13 +10,15 @@ import dayjs from 'dayjs'; import { NewsletterService } from '@gitroom/nestjs-libraries/services/newsletter.service'; import { NotificationService } from '@gitroom/nestjs-libraries/database/prisma/notifications/notification.service'; import { ForgotReturnPasswordDto } from '@gitroom/nestjs-libraries/dtos/auth/forgot-return.password.dto'; +import { EmailService } from '@gitroom/nestjs-libraries/services/email.service'; @Injectable() export class AuthService { constructor( private _userService: UsersService, private _organizationService: OrganizationService, - private _notificationService: NotificationService + private _notificationService: NotificationService, + private _emailService: EmailService, ) {} async routeAuth( provider: Provider, @@ -31,7 +33,7 @@ export class AuthService { } const create = await this._organizationService.createOrgAndUser(body); - NewsletterService.register(body.email); + const addedOrg = addToOrg && typeof addToOrg !== 'boolean' ? await this._organizationService.addUserToOrg( @@ -41,14 +43,21 @@ export class AuthService { addToOrg.role ) : false; - return { addedOrg, jwt: await this.jwt(create.users[0].user) }; + + const obj = { addedOrg, jwt: await this.jwt(create.users[0].user) }; + await this._emailService.sendEmail(body.email, 'Activate your account', `Click here to activate your account`); + return obj; } if (!user || !AuthChecker.comparePassword(body.password, user.password)) { - throw new Error('Invalid user'); + throw new Error('Invalid user name or password'); } - return { jwt: await this.jwt(user) }; + if (!user.activated) { + throw new Error('User is not activated'); + } + + return { addedOrg: false, jwt: await this.jwt(user) }; } const user = await this.loginOrRegisterProvider( @@ -152,6 +161,22 @@ export class AuthService { return this._userService.updatePassword(user.id, body.password); } + async activate(code: string) { + const user = AuthChecker.verifyJWT(code) as { id: string, activated: boolean, email: string }; + if (user.id && !user.activated) { + const getUserAgain = await this._userService.getUserByEmail(user.email); + if (getUserAgain.activated) { + return false; + } + await this._userService.activateUser(user.id); + user.activated = true; + await NewsletterService.register(user.email); + return this.jwt(user as any); + } + + return false; + } + oauthLink(provider: string) { const providerInstance = ProvidersFactory.loadProvider( provider as Provider diff --git a/apps/frontend/src/app/auth/activate/[code]/page.tsx b/apps/frontend/src/app/auth/activate/[code]/page.tsx new file mode 100644 index 00000000..fb02d53a --- /dev/null +++ b/apps/frontend/src/app/auth/activate/[code]/page.tsx @@ -0,0 +1,15 @@ +import { isGeneral } from '@gitroom/react/helpers/is.general'; + +export const dynamic = 'force-dynamic'; + +import { Metadata } from 'next'; +import { AfterActivate } from '@gitroom/frontend/components/auth/after.activate'; + +export const metadata: Metadata = { + title: `${isGeneral() ? 'Postiz' : 'Gitroom'} - Activate your account`, + description: '', +}; + +export default async function Auth() { + return ; +} diff --git a/apps/frontend/src/app/auth/activate/page.tsx b/apps/frontend/src/app/auth/activate/page.tsx new file mode 100644 index 00000000..607b709d --- /dev/null +++ b/apps/frontend/src/app/auth/activate/page.tsx @@ -0,0 +1,17 @@ +import { isGeneral } from '@gitroom/react/helpers/is.general'; + +export const dynamic = 'force-dynamic'; + +import {Metadata} from "next"; +import { Activate } from '@gitroom/frontend/components/auth/activate'; + +export const metadata: Metadata = { + title: `${isGeneral() ? 'Postiz' : 'Gitroom'} - Activate your account`, + description: '', +}; + +export default async function Auth() { + return ( + + ); +} diff --git a/apps/frontend/src/components/auth/activate.tsx b/apps/frontend/src/components/auth/activate.tsx new file mode 100644 index 00000000..cdf18d1e --- /dev/null +++ b/apps/frontend/src/components/auth/activate.tsx @@ -0,0 +1,16 @@ +'use client'; + +export function Activate() { + return ( + <> +
+

+ Activate your account +

+
+
+ Thank you for registering!
Please check your email to activate your account. +
+ + ); +} diff --git a/apps/frontend/src/components/auth/after.activate.tsx b/apps/frontend/src/components/auth/after.activate.tsx new file mode 100644 index 00000000..f19a8784 --- /dev/null +++ b/apps/frontend/src/components/auth/after.activate.tsx @@ -0,0 +1,43 @@ +'use client'; + +import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; +import { LoadingComponent } from '@gitroom/frontend/components/layout/loading'; +import { useCallback, useEffect, useRef, useState } from 'react'; +import { useParams } from 'next/navigation'; +import Link from 'next/link'; + +export const AfterActivate = () => { + const fetch = useFetch(); + const params = useParams(); + const [showLoader, setShowLoader] = useState(true); + const run = useRef(false); + + useEffect(() => { + if (!run.current) { + run.current = true; + loadCode(); + } + }, []); + + const loadCode = useCallback(async () => { + if (params.code) { + const { can } = await ( + await fetch(`/auth/activate`, { + method: 'POST', + body: JSON.stringify({ code: params.code }), + headers: { + 'Content-Type': 'application/json', + }, + }) + ).json(); + + if (!can) { + setShowLoader(false); + } + } + }, []); + + return ( + <>{showLoader ? : (<>This user is already activated,
Click here to go back to login)} + ); +}; diff --git a/apps/frontend/src/components/auth/login.tsx b/apps/frontend/src/components/auth/login.tsx index 5f101a37..594659cd 100644 --- a/apps/frontend/src/components/auth/login.tsx +++ b/apps/frontend/src/components/auth/login.tsx @@ -44,7 +44,7 @@ export function Login() { if (login.status === 400) { form.setError('email', { - message: 'Invalid email or password', + message: await login.text(), }); setLoading(false); diff --git a/apps/frontend/src/components/auth/register.tsx b/apps/frontend/src/components/auth/register.tsx index bf8242a2..3d160ad2 100644 --- a/apps/frontend/src/components/auth/register.tsx +++ b/apps/frontend/src/components/auth/register.tsx @@ -9,7 +9,7 @@ import { useCallback, useEffect, useMemo, useState } from 'react'; import { classValidatorResolver } from '@hookform/resolvers/class-validator'; import { CreateOrgUserDto } from '@gitroom/nestjs-libraries/dtos/auth/create.org.user.dto'; import { GithubProvider } from '@gitroom/frontend/components/auth/providers/github.provider'; -import { useSearchParams } from 'next/navigation'; +import { useRouter, useSearchParams } from 'next/navigation'; import { LoadingComponent } from '@gitroom/frontend/components/layout/loading'; import interClass from '@gitroom/react/helpers/inter.font'; import { isGeneral } from '@gitroom/react/helpers/is.general'; @@ -73,6 +73,7 @@ export function RegisterAfter({ }) { const [loading, setLoading] = useState(false); const getQuery = useSearchParams(); + const router = useRouter(); const isAfterProvider = useMemo(() => { return !!token && !!provider; @@ -105,6 +106,12 @@ export function RegisterAfter({ setLoading(false); } + + console.log(register.headers.get('activate'), register.headers.get('Activate')); + + if (register.headers.get('activate')) { + router.push('/auth/activate'); + } }; const rootDomain = useMemo(() => { diff --git a/libraries/nestjs-libraries/src/database/prisma/organizations/organization.repository.ts b/libraries/nestjs-libraries/src/database/prisma/organizations/organization.repository.ts index a3d208a2..1500998f 100644 --- a/libraries/nestjs-libraries/src/database/prisma/organizations/organization.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/organizations/organization.repository.ts @@ -186,6 +186,7 @@ export class OrganizationRepository { role: Role.SUPERADMIN, user: { create: { + activated: body.provider !== 'LOCAL', email: body.email, password: body.password ? AuthService.hashPassword(body.password) diff --git a/libraries/nestjs-libraries/src/database/prisma/schema.prisma b/libraries/nestjs-libraries/src/database/prisma/schema.prisma index be6310e4..350b0bca 100644 --- a/libraries/nestjs-libraries/src/database/prisma/schema.prisma +++ b/libraries/nestjs-libraries/src/database/prisma/schema.prisma @@ -50,6 +50,7 @@ model User { updatedAt DateTime @updatedAt lastReadNotifications DateTime @default(now()) inviteId String? + activated Boolean @default(true) items ItemUser[] marketplace Boolean @default(true) account String? diff --git a/libraries/nestjs-libraries/src/database/prisma/users/users.repository.ts b/libraries/nestjs-libraries/src/database/prisma/users/users.repository.ts index 0c2d297c..c51d5283 100644 --- a/libraries/nestjs-libraries/src/database/prisma/users/users.repository.ts +++ b/libraries/nestjs-libraries/src/database/prisma/users/users.repository.ts @@ -64,6 +64,17 @@ export class UsersRepository { }); } + activateUser(id: string) { + return this._user.model.user.update({ + where: { + id, + }, + data: { + activated: true, + }, + }); + } + getUserByProvider(providerId: string, provider: Provider) { return this._user.model.user.findFirst({ where: { diff --git a/libraries/nestjs-libraries/src/database/prisma/users/users.service.ts b/libraries/nestjs-libraries/src/database/prisma/users/users.service.ts index 097582c2..e7580632 100644 --- a/libraries/nestjs-libraries/src/database/prisma/users/users.service.ts +++ b/libraries/nestjs-libraries/src/database/prisma/users/users.service.ts @@ -28,6 +28,10 @@ export class UsersService { return this._usersRepository.getUserByProvider(providerId, provider); } + activateUser(id: string) { + return this._usersRepository.activateUser(id); + } + updatePassword(id: string, password: string) { return this._usersRepository.updatePassword(id, password); } diff --git a/libraries/nestjs-libraries/src/services/email.service.ts b/libraries/nestjs-libraries/src/services/email.service.ts index 96bc94e4..b1e494fe 100644 --- a/libraries/nestjs-libraries/src/services/email.service.ts +++ b/libraries/nestjs-libraries/src/services/email.service.ts @@ -10,8 +10,8 @@ export class EmailService { console.log('No Resend API Key found, skipping email sending'); return; } - await resend.emails.send({ - from: process.env.IS_GENERAL === 'true' ? 'Nevo ' : 'Nevo ', + const sends = await resend.emails.send({ + from: process.env.IS_GENERAL === 'true' ? 'Nevo ' : 'Nevo ', to, subject, html, From 2bc3a6cd2d7518ca292a1c67dac8b7b25412b285 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Wed, 5 Jun 2024 16:34:41 +0700 Subject: [PATCH 29/36] feat: postiz email --- libraries/nestjs-libraries/src/services/email.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/nestjs-libraries/src/services/email.service.ts b/libraries/nestjs-libraries/src/services/email.service.ts index b1e494fe..83bd8dfb 100644 --- a/libraries/nestjs-libraries/src/services/email.service.ts +++ b/libraries/nestjs-libraries/src/services/email.service.ts @@ -11,7 +11,7 @@ export class EmailService { return; } const sends = await resend.emails.send({ - from: process.env.IS_GENERAL === 'true' ? 'Nevo ' : 'Nevo ', + from: process.env.IS_GENERAL === 'true' ? 'Nevo ' : 'Nevo ', to, subject, html, From 7777d3a03bfb70a94c79f9fc3aa3e83afda6a307 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Wed, 5 Jun 2024 16:57:01 +0700 Subject: [PATCH 30/36] feat: logo in login --- apps/frontend/src/app/auth/layout.tsx | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/apps/frontend/src/app/auth/layout.tsx b/apps/frontend/src/app/auth/layout.tsx index 4ffffd52..57fb0c49 100644 --- a/apps/frontend/src/app/auth/layout.tsx +++ b/apps/frontend/src/app/auth/layout.tsx @@ -1,6 +1,10 @@ +import { isGeneral } from '@gitroom/react/helpers/is.general'; + export const dynamic = 'force-dynamic'; import { ReactNode } from 'react'; +import Image from 'next/image'; +import clsx from 'clsx'; export default async function AuthLayout({ children, @@ -12,6 +16,25 @@ export default async function AuthLayout({
+
+
+ Logo +
+ {isGeneral() ? ( + + ) : ( +
Gitroom
+ )} +
+
+
{children}
From d7cc0d20a16cd6640d0f60f5afa2342d8dc2265e Mon Sep 17 00:00:00 2001 From: Nevo David Date: Wed, 5 Jun 2024 19:14:13 +0700 Subject: [PATCH 31/36] feat: insights --- .../providers/dribbble/dribbble.provider.tsx | 160 ++++++++++++++++ .../providers/dribbble/dribbble.teams.tsx | 47 +++++ .../launches/providers/show.all.providers.tsx | 2 + .../src/dtos/posts/create.post.dto.ts | 2 + .../posts/providers-settings/dribbble.dto.ts | 12 ++ .../integrations/social/dribbble.provider.ts | 172 ++++-------------- .../integrations/social/facebook.provider.ts | 2 +- 7 files changed, 261 insertions(+), 136 deletions(-) create mode 100644 apps/frontend/src/components/launches/providers/dribbble/dribbble.provider.tsx create mode 100644 apps/frontend/src/components/launches/providers/dribbble/dribbble.teams.tsx create mode 100644 libraries/nestjs-libraries/src/dtos/posts/providers-settings/dribbble.dto.ts diff --git a/apps/frontend/src/components/launches/providers/dribbble/dribbble.provider.tsx b/apps/frontend/src/components/launches/providers/dribbble/dribbble.provider.tsx new file mode 100644 index 00000000..42739668 --- /dev/null +++ b/apps/frontend/src/components/launches/providers/dribbble/dribbble.provider.tsx @@ -0,0 +1,160 @@ +import { FC } from 'react'; +import { withProvider } from '@gitroom/frontend/components/launches/providers/high.order.provider'; +import { useIntegration } from '@gitroom/frontend/components/launches/helpers/use.integration'; +import { useFormatting } from '@gitroom/frontend/components/launches/helpers/use.formatting'; +import { useMediaDirectory } from '@gitroom/react/helpers/use.media.directory'; +import { + afterLinkedinCompanyPreventRemove, + linkedinCompanyPreventRemove, +} from '@gitroom/helpers/utils/linkedin.company.prevent.remove'; +import { VideoOrImage } from '@gitroom/react/helpers/video.or.image'; +import { useSettings } from '@gitroom/frontend/components/launches/helpers/use.values'; +import { Input } from '@gitroom/react/form/input'; +import { DribbbleTeams } from '@gitroom/frontend/components/launches/providers/dribbble/dribbble.teams'; +import { DribbbleDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/dribbble.dto'; + +const DribbbleSettings: FC = () => { + const { register, control } = useSettings(); + return ( +
+ + +
+ ); +}; +const DribbblePreview: FC = (props) => { + const { value: topValue, integration } = useIntegration(); + const mediaDir = useMediaDirectory(); + const newValues = useFormatting(topValue, { + removeMarkdown: true, + saveBreaklines: true, + beforeSpecialFunc: (text: string) => { + return linkedinCompanyPreventRemove(text); + }, + specialFunc: (text: string) => { + return afterLinkedinCompanyPreventRemove(text.slice(0, 280)); + }, + }); + + const [firstPost, ...morePosts] = newValues; + if (!firstPost) { + return null; + } + + return ( +
+
+
+ x +
+
+
{integration?.name}
+
+ CEO @ Gitroom +
+
1m
+
+
+
+
+
+        {!!firstPost?.images?.length && (
+          
+ {firstPost.images.map((image, index) => ( + + + + ))} +
+ )} +
+ {morePosts.map((p, index) => ( +
+
+ x +
+
+
{integration?.name}
+
+ CEO @ Gitroom +
+
+ {p.text} +
+ + {!!p?.images?.length && ( +
+ {p.images.map((image, index) => ( + +
+ +
+
+ ))} +
+ )} +
+
+ ))} +
+ ); +}; + +export default withProvider( + DribbbleSettings, + DribbblePreview, + DribbbleDto, + async ([firstItem, ...otherItems]) => { + const isMp4 = firstItem?.find((item) => item.path.indexOf('mp4') > -1); + + if (firstItem.length !== 1) { + return 'Dribbble requires one item'; + } + + if (isMp4) { + return 'Dribbble does not support mp4 files'; + } + + const details = await new Promise<{width: number, height: number}>((resolve, reject) => { + const url = new Image(); + url.onload = function() { + // @ts-ignore + resolve({width: this.width, height: this.height}); + } + url.src = firstItem[0].path; + }); + + + if ( + (details?.width === 400 && details?.height === 300) || + (details?.width === 800 && details?.height === 600) + ) { + return true; + } + + return 'Invalid image size. Dribbble requires 400x300 or 800x600 px images.'; + } +); diff --git a/apps/frontend/src/components/launches/providers/dribbble/dribbble.teams.tsx b/apps/frontend/src/components/launches/providers/dribbble/dribbble.teams.tsx new file mode 100644 index 00000000..22d79be2 --- /dev/null +++ b/apps/frontend/src/components/launches/providers/dribbble/dribbble.teams.tsx @@ -0,0 +1,47 @@ +import { FC, useEffect, useState } from 'react'; +import { useCustomProviderFunction } from '@gitroom/frontend/components/launches/helpers/use.custom.provider.function'; +import { Select } from '@gitroom/react/form/select'; +import { useSettings } from '@gitroom/frontend/components/launches/helpers/use.values'; + +export const DribbbleTeams: FC<{ + name: string; + onChange: (event: { target: { value: string; name: string } }) => void; +}> = (props) => { + const { onChange, name } = props; + const customFunc = useCustomProviderFunction(); + const [orgs, setOrgs] = useState(); + const { getValues } = useSettings(); + const [currentMedia, setCurrentMedia] = useState(); + + const onChangeInner = (event: { target: { value: string, name: string } }) => { + setCurrentMedia(event.target.value); + onChange(event); + }; + + useEffect(() => { + customFunc.get('teams').then((data) => setOrgs(data)); + const settings = getValues()[props.name]; + if (settings) { + setCurrentMedia(settings); + } + }, []); + + if (!orgs) { + return null; + } + + if (!orgs.length) { + return <>; + } + + return ( + + ); +}; diff --git a/apps/frontend/src/components/launches/providers/show.all.providers.tsx b/apps/frontend/src/components/launches/providers/show.all.providers.tsx index 2ee9aa87..cfb7997e 100644 --- a/apps/frontend/src/components/launches/providers/show.all.providers.tsx +++ b/apps/frontend/src/components/launches/providers/show.all.providers.tsx @@ -11,6 +11,7 @@ import InstagramProvider from '@gitroom/frontend/components/launches/providers/i import YoutubeProvider from '@gitroom/frontend/components/launches/providers/youtube/youtube.provider'; import TiktokProvider from '@gitroom/frontend/components/launches/providers/tiktok/tiktok.provider'; import PinterestProvider from '@gitroom/frontend/components/launches/providers/pinterest/pinterest.provider'; +import DribbbleProvider from '@gitroom/frontend/components/launches/providers/dribbble/dribbble.provider'; export const Providers = [ {identifier: 'devto', component: DevtoProvider}, @@ -25,6 +26,7 @@ export const Providers = [ {identifier: 'youtube', component: YoutubeProvider}, {identifier: 'tiktok', component: TiktokProvider}, {identifier: 'pinterest', component: PinterestProvider}, + {identifier: 'dribbble', component: DribbbleProvider}, ]; diff --git a/libraries/nestjs-libraries/src/dtos/posts/create.post.dto.ts b/libraries/nestjs-libraries/src/dtos/posts/create.post.dto.ts index c314c473..563b4c65 100644 --- a/libraries/nestjs-libraries/src/dtos/posts/create.post.dto.ts +++ b/libraries/nestjs-libraries/src/dtos/posts/create.post.dto.ts @@ -10,6 +10,7 @@ import {HashnodeSettingsDto} from "@gitroom/nestjs-libraries/dtos/posts/provider import {RedditSettingsDto} from "@gitroom/nestjs-libraries/dtos/posts/providers-settings/reddit.dto"; import { YoutubeSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/youtube.settings.dto'; import { PinterestSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/pinterest.dto'; +import { DribbbleDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/dribbble.dto'; export class EmptySettings {} export class Integration { @@ -64,6 +65,7 @@ export class Post { { value: RedditSettingsDto, name: 'reddit' }, { value: YoutubeSettingsDto, name: 'youtube' }, { value: PinterestSettingsDto, name: 'pinterest' }, + { value: DribbbleDto, name: 'dribbble' }, ], }, }) diff --git a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/dribbble.dto.ts b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/dribbble.dto.ts new file mode 100644 index 00000000..882429a4 --- /dev/null +++ b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/dribbble.dto.ts @@ -0,0 +1,12 @@ +import { IsDefined, IsOptional, IsString, IsUrl } from 'class-validator'; + +export class DribbbleDto { + @IsString() + @IsDefined() + title: string; + + @IsString() + @IsOptional() + @IsUrl() + team: string; +} diff --git a/libraries/nestjs-libraries/src/integrations/social/dribbble.provider.ts b/libraries/nestjs-libraries/src/integrations/social/dribbble.provider.ts index 0d76c8b2..f95fafeb 100644 --- a/libraries/nestjs-libraries/src/integrations/social/dribbble.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/dribbble.provider.ts @@ -12,6 +12,8 @@ import FormData from 'form-data'; import { timer } from '@gitroom/helpers/utils/timer'; import dayjs from 'dayjs'; import { SocialAbstract } from '@gitroom/nestjs-libraries/integrations/social.abstract'; +import { DribbbleDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/dribbble.dto'; +import mime from 'mime-types'; export class DribbbleProvider extends SocialAbstract implements SocialProvider { identifier = 'dribbble'; @@ -125,151 +127,51 @@ export class DribbbleProvider extends SocialAbstract implements SocialProvider { }; } - async boards(accessToken: string) { - const { items } = await ( - await this.fetch('https://api-sandbox.pinterest.com/v5/boards', { - method: 'GET', - headers: { - Authorization: `Bearer ${accessToken}`, - }, - }) - ).json(); - - return ( - items?.map((item: any) => ({ - name: item.name, - id: item.id, - })) || [] - ); - } - async post( id: string, accessToken: string, - postDetails: PostDetails[] + postDetails: PostDetails[] ): Promise { - let mediaId = ''; - const findMp4 = postDetails?.[0]?.media?.find( - (p) => (p.path?.indexOf('mp4') || -1) > -1 - ); - const picture = postDetails?.[0]?.media?.find( - (p) => (p.path?.indexOf('mp4') || -1) === -1 - ); - - if (findMp4) { - const { upload_url, media_id, upload_parameters } = await ( - await this.fetch('https://api-sandbox.pinterest.com/v5/media', { - method: 'POST', - body: JSON.stringify({ - media_type: 'video', - }), - headers: { - 'Content-Type': 'application/json', - Authorization: `Bearer ${accessToken}`, - }, - }) - ).json(); - - const { data, status } = await axios.get( - postDetails?.[0]?.media?.[0]?.url!, - { - responseType: 'stream', - } - ); - - const formData = Object.keys(upload_parameters) - .filter((f) => f) - .reduce((acc, key) => { - acc.append(key, upload_parameters[key]); - return acc; - }, new FormData()); - - formData.append('file', data); - await axios.post(upload_url, formData); - - let statusCode = ''; - while (statusCode !== 'succeeded') { - console.log('trying'); - const mediafile = await ( - await this.fetch( - 'https://api-sandbox.pinterest.com/v5/media/' + media_id, - { - method: 'GET', - headers: { - Authorization: `Bearer ${accessToken}`, - }, - } - ) - ).json(); - - await timer(3000); - statusCode = mediafile.status; + const { data, status } = await axios.get( + postDetails?.[0]?.media?.[0]?.url!, + { + responseType: 'stream', } + ); - mediaId = media_id; - } + const slash = postDetails?.[0]?.media?.[0]?.url.split('/').at(-1); - const mapImages = postDetails?.[0]?.media?.map((m) => ({ - url: m.url, - })); + const formData = new FormData(); + formData.append('image', data, { + filename: slash, + contentType: mime.lookup(slash!) || '', + }); - try { - const { - id: pId, - link, - ...all - } = await ( - await this.fetch('https://api-sandbox.pinterest.com/v5/pins', { - method: 'POST', - headers: { - Authorization: `Bearer ${accessToken}`, - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ - ...(postDetails?.[0]?.settings.link - ? { link: postDetails?.[0]?.settings.link } - : {}), - ...(postDetails?.[0]?.settings.title - ? { title: postDetails?.[0]?.settings.title } - : {}), - ...(postDetails?.[0]?.settings.description - ? { title: postDetails?.[0]?.settings.description } - : {}), - ...(postDetails?.[0]?.settings.dominant_color - ? { title: postDetails?.[0]?.settings.dominant_color } - : {}), - board_id: postDetails?.[0]?.settings.board, - media_source: mediaId - ? { - source_type: 'video_id', - media_id: mediaId, - cover_image_url: picture?.url, - } - : mapImages?.length === 1 - ? { - source_type: 'image_url', - url: mapImages?.[0]?.url, - } - : { - source_type: 'multiple_image_urls', - items: mapImages, - }, - }), - }) - ).json(); + formData.append('title', postDetails[0].settings.title); + formData.append('description', postDetails[0].message); - return [ - { - id: postDetails?.[0]?.id, - postId: pId, - releaseURL: `https://www.pinterest.com/pin/${pId}`, - status: 'success', + const data2 = await axios.post( + 'https://api.dribbble.com/v2/shots', + formData, + { + headers: { + ...formData.getHeaders(), + Authorization: `Bearer ${accessToken}`, }, - ]; - } catch (err) { - console.log(err); - return []; - } + } + ); + + const location = data2.headers['location']; + const newId = location.split('/').at(-1); + + return [ + { + id: postDetails?.[0]?.id, + status: 'completed', + postId: newId, + releaseURL: `https://dribbble.com/shots/${newId}`, + }, + ]; } analytics( diff --git a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts index 9ba02834..ad9bcb2b 100644 --- a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts @@ -38,7 +38,7 @@ export class FacebookProvider extends SocialAbstract implements SocialProvider { }` )}` + `&state=${state}` + - '&scope=pages_show_list,business_management,pages_manage_posts,pages_manage_engagement,pages_read_engagement', + '&scope=pages_show_list,business_management,pages_manage_posts,pages_manage_engagement,pages_read_engagement,read_insights', codeVerifier: makeId(10), state, }; From bbedccd5a91fc3d9a4987f8cdfd699993ddae6d1 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Thu, 6 Jun 2024 11:32:30 +0700 Subject: [PATCH 32/36] feat: loader --- .../src/components/media/media.component.tsx | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/apps/frontend/src/components/media/media.component.tsx b/apps/frontend/src/components/media/media.component.tsx index 2ae51e3c..e9a66689 100644 --- a/apps/frontend/src/components/media/media.component.tsx +++ b/apps/frontend/src/components/media/media.component.tsx @@ -13,6 +13,7 @@ import clsx from 'clsx'; import interClass from '@gitroom/react/helpers/inter.font'; import { VideoFrame } from '@gitroom/react/helpers/video.frame'; import { useToaster } from '@gitroom/react/toaster/toaster'; +import { LoadingComponent } from '@gitroom/frontend/components/layout/loading'; const showModalEmitter = new EventEmitter(); export const ShowMediaBoxModal: FC = () => { @@ -60,6 +61,7 @@ export const MediaBox: FC<{ const fetch = useFetch(); const mediaDirectory = useMediaDirectory(); const toaster = useToaster(); + const [loading, setLoading] = useState(false); const loadMedia = useCallback(async () => { return (await fetch('/media')).json(); @@ -76,18 +78,22 @@ export const MediaBox: FC<{ !file?.target?.files?.length || file?.target?.files?.[0]?.size > maxFileSize ) { - toaster.show(`Maximum file size ${maxFileSize / 1024 / 1024}mb`, 'warning'); + toaster.show( + `Maximum file size ${maxFileSize / 1024 / 1024}mb`, + 'warning' + ); return; } const formData = new FormData(); formData.append('file', file?.target?.files?.[0]); + setLoading(true); const data = await ( await fetch('/media', { method: 'POST', body: formData, }) ).json(); - + setLoading(false); setListMedia([...mediaList, data]); }, [mediaList] @@ -247,6 +253,13 @@ export const MediaBox: FC<{ )}
))} + {loading && ( +
+
+ +
+
+ )}
From 9d9fad582693f5c41f83989055aca53f3a761164 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Mon, 10 Jun 2024 23:53:17 +0700 Subject: [PATCH 33/36] feat: no analytics --- .../src/integrations/social/facebook.provider.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts index ad9bcb2b..4d3c2703 100644 --- a/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/facebook.provider.ts @@ -277,7 +277,7 @@ export class FacebookProvider extends SocialAbstract implements SocialProvider { ) ).json(); - return data.map((d: any) => ({ + return data?.map((d: any) => ({ label: d.name === 'page_impressions_unique' ? 'Page Impressions' @@ -289,10 +289,10 @@ export class FacebookProvider extends SocialAbstract implements SocialProvider { ? 'Videos views' : 'Posts Impressions', percentageChange: 5, - data: d.values.map((v: any) => ({ + data: d?.values?.map((v: any) => ({ total: v.value, date: dayjs(v.end_time).format('YYYY-MM-DD'), })), - })); + })) || []; } } From 97bd36bacc0062f9ee1ca1398e5502c3d2d40b73 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Tue, 11 Jun 2024 10:10:22 +0700 Subject: [PATCH 34/36] feat: add comment --- apps/frontend/src/components/launches/add.edit.model.tsx | 2 +- .../src/components/launches/providers/high.order.provider.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/frontend/src/components/launches/add.edit.model.tsx b/apps/frontend/src/components/launches/add.edit.model.tsx index 2a8c7b87..58db4d7d 100644 --- a/apps/frontend/src/components/launches/add.edit.model.tsx +++ b/apps/frontend/src/components/launches/add.edit.model.tsx @@ -459,7 +459,7 @@ export const AddEditModal: FC<{ />
-
Add post
+
Add Comment
diff --git a/apps/frontend/src/components/launches/providers/high.order.provider.tsx b/apps/frontend/src/components/launches/providers/high.order.provider.tsx index b9b6520e..6d1d9bee 100644 --- a/apps/frontend/src/components/launches/providers/high.order.provider.tsx +++ b/apps/frontend/src/components/launches/providers/high.order.provider.tsx @@ -373,7 +373,7 @@ export const withProvider = ( />
-
Add post
+
Add Comment
From 004ffcabb0a5ae46e95152c7cf83b04acdc30f44 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Wed, 12 Jun 2024 15:29:42 +0700 Subject: [PATCH 35/36] feat: youtube changes --- .../public/icons/platforms/youtube.svg | 1 + .../launches/add.provider.component.tsx | 18 ++- .../helpers/pick.platform.component.tsx | 146 ++++++++++-------- .../launches/launches.component.tsx | 22 ++- .../providers/youtube/youtube.provider.tsx | 22 ++- .../youtube.settings.dto.ts | 11 +- .../integrations/social/youtube.provider.ts | 28 ++-- 7 files changed, 151 insertions(+), 97 deletions(-) create mode 100644 apps/frontend/public/icons/platforms/youtube.svg diff --git a/apps/frontend/public/icons/platforms/youtube.svg b/apps/frontend/public/icons/platforms/youtube.svg new file mode 100644 index 00000000..3bce3e61 --- /dev/null +++ b/apps/frontend/public/icons/platforms/youtube.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/apps/frontend/src/components/launches/add.provider.component.tsx b/apps/frontend/src/components/launches/add.provider.component.tsx index 87cf37c9..740f5b3d 100644 --- a/apps/frontend/src/components/launches/add.provider.component.tsx +++ b/apps/frontend/src/components/launches/add.provider.component.tsx @@ -195,13 +195,21 @@ export const AddProviderComponent: FC<{
- + {item.identifier === 'youtube' ? ( + + ) : ( + + )}
{item.name}
diff --git a/apps/frontend/src/components/launches/helpers/pick.platform.component.tsx b/apps/frontend/src/components/launches/helpers/pick.platform.component.tsx index 8fe11bbe..08105ef8 100644 --- a/apps/frontend/src/components/launches/helpers/pick.platform.component.tsx +++ b/apps/frontend/src/components/launches/helpers/pick.platform.component.tsx @@ -56,15 +56,17 @@ export const PickPlatforms: FC<{ checkLeftRight(); }, [selectedIntegrations, integrations]); - useMoveToIntegrationListener([integrations], props.singleSelect, (identifier) => { - const findIntegration = integrations.find( - (p) => p.id === identifier - ); + useMoveToIntegrationListener( + [integrations], + props.singleSelect, + (identifier) => { + const findIntegration = integrations.find((p) => p.id === identifier); - if (findIntegration) { - addPlatform(findIntegration)(); + if (findIntegration) { + addPlatform(findIntegration)(); + } } - }); + ); const addPlatform = useCallback( (integration: Integrations) => async () => { @@ -102,7 +104,9 @@ export const PickPlatforms: FC<{ } return ( -
+
{props.singleSelect && (
{isLeft && ( @@ -138,75 +142,81 @@ export const PickPlatforms: FC<{ >
- {integrations.filter(f => !f.inBetweenSteps).map((integration) => - !props.singleSelect ? ( -
+ {integrations + .filter((f) => !f.inBetweenSteps) + .map((integration) => + !props.singleSelect ? (
p.id === integration.id - ) === -1 - ? 'opacity-40' - : '' - )} + key={integration.id} + className="flex gap-[8px] items-center mr-[10px]" > - {integration.identifier} - {integration.identifier} -
-
- ) : ( -
-
p.id === integration.id - ) === -1 - ? 'bg-third border border-third' - : 'bg-[#291259] border border-[#5826C2]' - )} - > -
-
- {integration.identifier} +
p.id === integration.id + ) === -1 + ? 'opacity-40' + : '' + )} + > + {integration.identifier} + {integration.identifier === 'youtube' ? ( + + ) : ( {integration.identifier} -
-
{integration.name}
+ )}
-
- ) - )} + ) : ( +
+
p.id === integration.id + ) === -1 + ? 'bg-third border border-third' + : 'bg-[#291259] border border-[#5826C2]' + )} + > +
+
+ {integration.identifier} + {integration.identifier} +
+
{integration.name}
+
+
+
+ ) + )}
diff --git a/apps/frontend/src/components/launches/launches.component.tsx b/apps/frontend/src/components/launches/launches.component.tsx index 2b8b1239..e54e3556 100644 --- a/apps/frontend/src/components/launches/launches.component.tsx +++ b/apps/frontend/src/components/launches/launches.component.tsx @@ -148,13 +148,21 @@ export const LaunchesComponent = () => { width={32} height={32} /> - {integration.identifier} + {integration.identifier === 'youtube' ? ( + + ) : ( + {integration.identifier} + )}
{ const { register, control } = useSettings(); return (
+
{ - if (items.length === 1) { + const [firstItems] = items; + + if (items.length !== 1) { return 'Youtube items should be one'; } @@ -145,6 +161,10 @@ export default withProvider( return 'You need one item'; } + if (firstItems[0].path.indexOf('mp4') === -1) { + return 'Item must be a video'; + } + return true; } ); diff --git a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/youtube.settings.dto.ts b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/youtube.settings.dto.ts index d4fd7c67..dec5f77b 100644 --- a/libraries/nestjs-libraries/src/dtos/posts/providers-settings/youtube.settings.dto.ts +++ b/libraries/nestjs-libraries/src/dtos/posts/providers-settings/youtube.settings.dto.ts @@ -1,10 +1,5 @@ import { - IsArray, - IsDefined, - IsOptional, - IsString, - MinLength, - ValidateNested, + IsArray, IsDefined, IsIn, IsOptional, IsString, MinLength, ValidateNested } from 'class-validator'; import { MediaDto } from '@gitroom/nestjs-libraries/dtos/media/media.dto'; import { Type } from 'class-transformer'; @@ -23,6 +18,10 @@ export class YoutubeSettingsDto { @IsDefined() title: string; + @IsIn(['public', 'private', 'unlisted']) + @IsDefined() + type: string; + @IsOptional() @ValidateNested() @Type(() => MediaDto) diff --git a/libraries/nestjs-libraries/src/integrations/social/youtube.provider.ts b/libraries/nestjs-libraries/src/integrations/social/youtube.provider.ts index fc2df021..782dda64 100644 --- a/libraries/nestjs-libraries/src/integrations/social/youtube.provider.ts +++ b/libraries/nestjs-libraries/src/integrations/social/youtube.provider.ts @@ -8,8 +8,7 @@ import { import { makeId } from '@gitroom/nestjs-libraries/services/make.is'; import { google } from 'googleapis'; import { OAuth2Client } from 'google-auth-library/build/src/auth/oauth2client'; -import * as console from 'node:console'; -import axios, { all } from 'axios'; +import axios from 'axios'; import { YoutubeSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/youtube.settings.dto'; import { SocialAbstract } from '@gitroom/nestjs-libraries/integrations/social.abstract'; import * as process from 'node:process'; @@ -45,7 +44,7 @@ const clientAndYoutube = () => { export class YoutubeProvider extends SocialAbstract implements SocialProvider { identifier = 'youtube'; - name = 'Youtube'; + name = 'YouTube'; isBetweenSteps = false; async refreshToken(refresh_token: string): Promise { @@ -152,14 +151,18 @@ export class YoutubeProvider extends SocialAbstract implements SocialProvider { title: settings.title, description: firstPost?.message, tags: settings.tags.map((p) => p.label), - thumbnails: { - default: { - url: settings?.thumbnail?.path, - }, - }, + ...(settings?.thumbnail?.path + ? { + thumbnails: { + default: { + url: settings?.thumbnail?.path, + }, + }, + } + : {}), }, status: { - privacyStatus: 'public', + privacyStatus: settings.type, }, }, media: { @@ -167,7 +170,12 @@ export class YoutubeProvider extends SocialAbstract implements SocialProvider { }, }); - console.log(all); + return [{ + id: firstPost.id, + releaseURL: `https://www.youtube.com/watch?v=${all.data.id}`, + postId: all?.data?.id!, + status: 'success', + }]; } catch (err) { console.log(err); } From c734635072858584f2925a3525c73f7cf92f9bba Mon Sep 17 00:00:00 2001 From: Nevo David Date: Tue, 18 Jun 2024 11:11:19 +0700 Subject: [PATCH 36/36] feat: change url --- apps/frontend/src/components/auth/register.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/frontend/src/components/auth/register.tsx b/apps/frontend/src/components/auth/register.tsx index 3d160ad2..cf2e7411 100644 --- a/apps/frontend/src/components/auth/register.tsx +++ b/apps/frontend/src/components/auth/register.tsx @@ -173,14 +173,14 @@ export function RegisterAfter({
By registering you agree to our{' '} Terms of Service {' '} and{' '} Privacy Policy