From 7cc384e7ff0cde106ad6d73be8b529b33f7860e7 Mon Sep 17 00:00:00 2001
From: Patrick Fic <>
Date: Wed, 12 Aug 2020 16:39:03 -0700
Subject: [PATCH] Added bodyshop querying before starting application. Basic
job query and list view.
---
app.json | 7 +-
.../error-display/error-display.component.jsx | 10 ++
components/job-list/job-list.component.jsx | 83 ++++++++++++++
.../loading-display.component.jsx | 14 +++
.../screen-job-list.component.jsx | 19 +---
.../screen-main/screen-main.component.jsx | 21 +++-
firebase/firebase.utils.js | 5 +-
graphql/bodyshop.queries.js | 51 +--------
graphql/client.js | 12 +-
package.json | 7 +-
redux/store.js | 6 +-
redux/user/user.sagas.js | 12 +-
redux/user/user.types.js | 1 +
yarn.lock | 105 ++----------------
14 files changed, 167 insertions(+), 186 deletions(-)
create mode 100644 components/error-display/error-display.component.jsx
create mode 100644 components/job-list/job-list.component.jsx
create mode 100644 components/loading-display/loading-display.component.jsx
diff --git a/app.json b/app.json
index a04af49..250a247 100644
--- a/app.json
+++ b/app.json
@@ -13,12 +13,15 @@
"updates": {
"fallbackToCacheTimeout": 0
},
- "assetBundlePatterns": ["**/*"],
+ "assetBundlePatterns": [
+ "**/*"
+ ],
"ios": {
"supportsTablet": true
},
"web": {
"favicon": "./assets/logo240.png"
- }
+ },
+ "description": ""
}
}
diff --git a/components/error-display/error-display.component.jsx b/components/error-display/error-display.component.jsx
new file mode 100644
index 0000000..84f41b6
--- /dev/null
+++ b/components/error-display/error-display.component.jsx
@@ -0,0 +1,10 @@
+import React from "react";
+import { View, Text } from "react-native";
+
+export default function ErrorDisplay({ errorMessage }) {
+ return (
+
+ {errorMessage}
+
+ );
+}
diff --git a/components/job-list/job-list.component.jsx b/components/job-list/job-list.component.jsx
new file mode 100644
index 0000000..383e735
--- /dev/null
+++ b/components/job-list/job-list.component.jsx
@@ -0,0 +1,83 @@
+import React from "react";
+import {
+ View,
+ Text,
+ ActivityIndicator,
+ ListView,
+ RefreshControl,
+} from "react-native";
+
+import { connect } from "react-redux";
+import { createStructuredSelector } from "reselect";
+import { selectBodyshop } from "../../redux/user/user.selectors";
+import { useQuery } from "@apollo/client";
+import { QUERY_ALL_ACTIVE_JOBS } from "../../graphql/jobs.queries";
+import styles from "../styles";
+import {
+ Container,
+ Content,
+ Card,
+ CardItem,
+ Icon,
+ Right,
+ H1,
+} from "native-base";
+import { FlatList } from "react-native-gesture-handler";
+import ErrorDisplay from "../error-display/error-display.component";
+import LoadingDisplay from "../loading-display/loading-display.component";
+
+const mapStateToProps = createStructuredSelector({
+ bodyshop: selectBodyshop,
+});
+
+export function JobListComponent({ bodyshop }) {
+ const { loading, error, data, refetch } = useQuery(QUERY_ALL_ACTIVE_JOBS, {
+ variables: {
+ statuses: bodyshop.md_ro_statuses.open_statuses || ["Open", "Open*"],
+ },
+ skip: !bodyshop,
+ });
+
+ const onRefresh = async () => {
+ await refetch();
+ };
+
+ if (loading) return ;
+ if (error) return ;
+
+ return (
+
+ }
+ style={{ flex: 1 }}
+ data={data ? data.jobs : []}
+ renderItem={renderItem}
+ />
+ );
+}
+const renderItem = ({ item }) => {
+ return (
+
+
+ {`${item.est_number}${
+ item.ro_number ? ` ${item.ro_number}` : ""
+ }`}
+ {`${item.ownr_fn || ""} ${item.ownr_ln || ""} ${
+ item.ownr_co_nm || ""
+ }`}
+ {`${item.v_model_yr || ""} ${item.v_make_desc || ""} ${
+ item.v_model_desc || ""
+ }`}
+
+
+ {item.ded_amt}
+
+
+
+
+
+ );
+};
+
+export default connect(mapStateToProps, null)(JobListComponent);
diff --git a/components/loading-display/loading-display.component.jsx b/components/loading-display/loading-display.component.jsx
new file mode 100644
index 0000000..2dc50a1
--- /dev/null
+++ b/components/loading-display/loading-display.component.jsx
@@ -0,0 +1,14 @@
+import React from "react";
+import { View, Text } from "react-native";
+import { BarIndicator } from "react-native-indicators";
+import { Container, Content } from "native-base";
+
+export default function LoadingDisplay({ size, count = 5 }) {
+ return (
+
+
+
+
+
+ );
+}
diff --git a/components/screen-job-list/screen-job-list.component.jsx b/components/screen-job-list/screen-job-list.component.jsx
index 8362852..303cd82 100644
--- a/components/screen-job-list/screen-job-list.component.jsx
+++ b/components/screen-job-list/screen-job-list.component.jsx
@@ -1,18 +1,7 @@
+import { Container, Content } from "native-base";
import React from "react";
-import { View, Text, Button } from "react-native";
-import { useTranslation } from "react-i18next";
-import { useQuery, useLazyQuery, useSubscription } from "@apollo/client";
-import { QUERY_BODYSHOP } from "../../graphql/bodyshop.queries.js";
+import JobListComponent from "../job-list/job-list.component.jsx";
+
export default function ScreenJobList({ navigation }) {
- const { t } = useTranslation();
- const { loading, error, data } = useSubscription(QUERY_BODYSHOP);
- console.log("ScreenJobList -> error", error);
- console.log("ScreenJobList -> loading", loading);
- console.log("BodyshopData", data);
- return (
-
- This is the Job List.
- {t("joblist.labels.activejobs")}
-
- );
+ return ;
}
diff --git a/components/screen-main/screen-main.component.jsx b/components/screen-main/screen-main.component.jsx
index 0319400..edfe4b1 100644
--- a/components/screen-main/screen-main.component.jsx
+++ b/components/screen-main/screen-main.component.jsx
@@ -47,9 +47,7 @@ const JobStackNavigator = () => (
({
- title: `${i18n.t("joblist.labels.activejobs")} ${
- JSON.stringify(route.params) | "X"
- }`,
+ title: `${i18n.t("joblist.labels.activejobs")}`,
})}
component={ScreenJobList}
/>
@@ -96,19 +94,32 @@ const DrawerNavigator = () => (
);
-export function ScreenMainComponent({ checkUserSession, currentUser }) {
+export function ScreenMainComponent({
+ checkUserSession,
+ currentUser,
+ bodyshop,
+}) {
useEffect(() => {
checkUserSession();
}, [checkUserSession]);
const { t } = useTranslation();
+ useEffect(() => {
+ if (currentUser.authorized) console.log("Authed");
+ //Do the saga shit.
+ }, [currentUser]);
+
return (
{currentUser.authorized === null ? (
) : currentUser.authorized ? (
-
+ bodyshop ? (
+
+ ) : (
+
+ )
) : (
)}
diff --git a/firebase/firebase.utils.js b/firebase/firebase.utils.js
index 611d8a2..927e6fb 100644
--- a/firebase/firebase.utils.js
+++ b/firebase/firebase.utils.js
@@ -1,7 +1,5 @@
-import firebase from "firebase/app";
+import * as firebase from "firebase/app";
import "firebase/auth";
-import "firebase/database";
-import "firebase/firestore";
//const config = JSON.parse(process.env.REACT_APP_FIREBASE_CONFIG);
const config = {
@@ -20,7 +18,6 @@ if (!firebase.apps.length) {
}
export const auth = firebase.auth();
-export const firestore = firebase.firestore();
//export const analytics = firebase.analytics();
export default firebase;
diff --git a/graphql/bodyshop.queries.js b/graphql/bodyshop.queries.js
index 1e8fc37..8f332f1 100644
--- a/graphql/bodyshop.queries.js
+++ b/graphql/bodyshop.queries.js
@@ -1,65 +1,16 @@
import gql from "graphql-tag";
export const QUERY_BODYSHOP = gql`
- subscription QUERY_BODYSHOP {
+ query QUERY_BODYSHOP {
bodyshops(where: { associations: { active: { _eq: true } } }) {
- associations {
- authlevel
- useremail
- user {
- authid
- email
- dashboardlayout
- employee {
- id
- }
- }
- }
- address1
- address2
- city
- country
- created_at
- email
- federal_tax_id
- id
- insurance_vendor_id
- logo_img_path
md_ro_statuses
md_order_statuses
shopname
- state
- state_tax_id
- updated_at
- zip_post
- shoprates
- region_config
- md_responsibility_centers
messagingservicesid
- template_header
- textid
- production_config
- invoice_tax_rates
- inhousevendorid
- accountingconfig
- appt_length
- stripe_acct_id
- ssbuckets
- scoreboard_target
md_referral_sources
md_messaging_presets
- intakechecklist
- speedprint
md_parts_locations
md_notes_presets
- md_rbac
- employees {
- id
- first_name
- last_name
- employee_number
- cost_center
- }
}
}
`;
diff --git a/graphql/client.js b/graphql/client.js
index d5ba050..d9f89c8 100644
--- a/graphql/client.js
+++ b/graphql/client.js
@@ -8,7 +8,6 @@ import {
from,
} from "@apollo/client";
import { setContext } from "@apollo/client/link/context";
-import apolloLogger from "apollo-link-logger";
import { RetryLink } from "@apollo/client/link/retry";
import { WebSocketLink } from "@apollo/client/link/ws";
import { SubscriptionClient } from "subscriptions-transport-ws";
@@ -116,17 +115,18 @@ const retryLink = new RetryLink({
},
});
-const middlewares = [];
-if (process.env.NODE_ENV === "development") {
- middlewares.push(apolloLogger);
-}
+// const middlewares = [];
+// if (process.env.NODE_ENV === "development") {
+// middlewares.push(apolloLogger);
+// }
-middlewares.push(retryLink.concat(errorLink.concat(authLink.concat(link))));
+// middlewares.push(retryLink.concat(errorLink.concat(authLink.concat(link))));
const cache = new InMemoryCache({});
export const client = new ApolloClient({
//link: ApolloLink.from(middlewares),
+ //link: from([apolloLogger, errorLink, authLink, link]),
link: from([authLink, link]),
cache,
// connectToDevTools: process.env.NODE_ENV !== "production",
diff --git a/package.json b/package.json
index b155ea4..bc3836a 100644
--- a/package.json
+++ b/package.json
@@ -15,12 +15,6 @@
"@react-navigation/drawer": "^5.9.0",
"@react-navigation/native": "^5.7.3",
"@react-navigation/stack": "^5.9.0",
- "apollo-link-context": "^1.0.20",
- "apollo-link-error": "^1.1.13",
- "apollo-link-http": "^1.5.17",
- "apollo-link-logger": "^1.2.3",
- "apollo-link-retry": "^2.2.16",
- "apollo-link-ws": "^1.0.20",
"expo": "~38.0.8",
"expo-font": "~8.2.1",
"expo-localization": "~8.2.1",
@@ -35,6 +29,7 @@
"react-i18next": "^11.7.0",
"react-native": "https://github.com/expo/react-native/archive/sdk-38.0.2.tar.gz",
"react-native-gesture-handler": "~1.6.0",
+ "react-native-indicators": "^0.17.0",
"react-native-reanimated": "~1.9.0",
"react-native-safe-area-context": "~3.0.7",
"react-native-screens": "~2.9.0",
diff --git a/redux/store.js b/redux/store.js
index baf5adf..67cf65e 100644
--- a/redux/store.js
+++ b/redux/store.js
@@ -10,7 +10,11 @@ const sagaMiddleWare = createSagaMiddleware();
const middlewares = [sagaMiddleWare];
if (process.env.NODE_ENV === "development") {
- middlewares.push(createLogger({ collapsed: true, diff: true }));
+ middlewares.push(
+ createLogger({
+ collapsed: true,
+ })
+ );
}
const enhancer = compose(
diff --git a/redux/user/user.sagas.js b/redux/user/user.sagas.js
index c8b42b4..9561fad 100644
--- a/redux/user/user.sagas.js
+++ b/redux/user/user.sagas.js
@@ -15,8 +15,11 @@ import {
updateUserDetailsSuccess,
validatePasswordResetFailure,
validatePasswordResetSuccess,
+ setBodyshop,
} from "./user.actions";
import UserActionTypes from "./user.types";
+import { client } from "../../graphql/client";
+import { QUERY_BODYSHOP } from "../../graphql/bodyshop.queries";
export function* onEmailSignInStart() {
yield takeLatest(UserActionTypes.EMAIL_SIGN_IN_START, signInWithEmail);
@@ -75,7 +78,6 @@ export function* signOutStart() {
yield auth.signOut();
yield put(signOutSuccess());
- localStorage.removeItem("token");
} catch (error) {
yield put(signOutFailure(error.message));
}
@@ -99,7 +101,13 @@ export function* onSignInSuccess() {
}
export function* signInSuccessSaga({ payload }) {
- //yield logImEXEvent("redux_sign_in_success");
+ try {
+ const shop = yield client.query({ query: QUERY_BODYSHOP });
+
+ yield put(setBodyshop(shop.data.bodyshops[0]));
+ } catch (error) {
+ console.log("UHOH. Couldn't get shop details.", error);
+ }
}
export function* onSendPasswordResetStart() {
diff --git a/redux/user/user.types.js b/redux/user/user.types.js
index faa717c..0f5773c 100644
--- a/redux/user/user.types.js
+++ b/redux/user/user.types.js
@@ -14,6 +14,7 @@ const UserActionTypes = {
SET_USER_LANGUAGE: "SET_USER_LANGUAGE",
UPDATE_USER_DETAILS: "UPDATE_USER_DETAILS",
UPDATE_USER_DETAILS_SUCCESS: "UPDATE_USER_DETAILS_SUCCESS",
+ QUERY_SHOP_DETAILS: "QUERY_SHOP_DETAILS",
SET_SHOP_DETAILS: "SET_SHOP_DETAILS",
SET_INSTANCE_ID: "SET_INSTANCE_ID",
CHECK_INSTANCE_ID: "CHECK_INSTANCE_ID",
diff --git a/yarn.lock b/yarn.lock
index d961b24..7eeb267 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1706,7 +1706,7 @@
dependencies:
"@types/yargs-parser" "*"
-"@types/zen-observable@0.8.0", "@types/zen-observable@^0.8.0":
+"@types/zen-observable@^0.8.0":
version "0.8.0"
resolved "https://registry.yarnpkg.com/@types/zen-observable/-/zen-observable-0.8.0.tgz#8b63ab7f1aa5321248aad5ac890a485656dcea4d"
integrity sha512-te5lMAWii1uEJ4FwLjzdlbw3+n0FZNOvFXHxQDKeT0dilh7HOzdMzV2TrJVUzq8ep7J4Na8OUYPRLSQkJHAlrg==
@@ -1734,13 +1734,6 @@
dependencies:
tslib "^1.9.3"
-"@wry/equality@^0.1.2":
- version "0.1.11"
- resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.1.11.tgz#35cb156e4a96695aa81a9ecc4d03787bc17f1790"
- integrity sha512-mwEVBDUVODlsQQ5dfuLUS5/Tf7jqUKyhKYHmVi4fPB6bDMOfWvUPJmKgS1Z7Za/sOI3vzWt4+O7yCiL/70MogA==
- dependencies:
- tslib "^1.9.3"
-
"@wry/equality@^0.2.0":
version "0.2.0"
resolved "https://registry.yarnpkg.com/@wry/equality/-/equality-0.2.0.tgz#a312d1b6a682d0909904c2bcd355b02303104fb7"
@@ -1868,83 +1861,6 @@ anymatch@^2.0.0:
micromatch "^3.1.4"
normalize-path "^2.1.1"
-apollo-link-context@^1.0.20:
- version "1.0.20"
- resolved "https://registry.yarnpkg.com/apollo-link-context/-/apollo-link-context-1.0.20.tgz#1939ac5dc65d6dff0c855ee53521150053c24676"
- integrity sha512-MLLPYvhzNb8AglNsk2NcL9AvhO/Vc9hn2ZZuegbhRHGet3oGr0YH9s30NS9+ieoM0sGT11p7oZ6oAILM/kiRBA==
- dependencies:
- apollo-link "^1.2.14"
- tslib "^1.9.3"
-
-apollo-link-error@^1.1.13:
- version "1.1.13"
- resolved "https://registry.yarnpkg.com/apollo-link-error/-/apollo-link-error-1.1.13.tgz#c1a1bb876ffe380802c8df0506a32c33aad284cd"
- integrity sha512-jAZOOahJU6bwSqb2ZyskEK1XdgUY9nkmeclCrW7Gddh1uasHVqmoYc4CKdb0/H0Y1J9lvaXKle2Wsw/Zx1AyUg==
- dependencies:
- apollo-link "^1.2.14"
- apollo-link-http-common "^0.2.16"
- tslib "^1.9.3"
-
-apollo-link-http-common@^0.2.16:
- version "0.2.16"
- resolved "https://registry.yarnpkg.com/apollo-link-http-common/-/apollo-link-http-common-0.2.16.tgz#756749dafc732792c8ca0923f9a40564b7c59ecc"
- integrity sha512-2tIhOIrnaF4UbQHf7kjeQA/EmSorB7+HyJIIrUjJOKBgnXwuexi8aMecRlqTIDWcyVXCeqLhUnztMa6bOH/jTg==
- dependencies:
- apollo-link "^1.2.14"
- ts-invariant "^0.4.0"
- tslib "^1.9.3"
-
-apollo-link-http@^1.5.17:
- version "1.5.17"
- resolved "https://registry.yarnpkg.com/apollo-link-http/-/apollo-link-http-1.5.17.tgz#499e9f1711bf694497f02c51af12d82de5d8d8ba"
- integrity sha512-uWcqAotbwDEU/9+Dm9e1/clO7hTB2kQ/94JYcGouBVLjoKmTeJTUPQKcJGpPwUjZcSqgYicbFqQSoJIW0yrFvg==
- dependencies:
- apollo-link "^1.2.14"
- apollo-link-http-common "^0.2.16"
- tslib "^1.9.3"
-
-apollo-link-logger@^1.2.3:
- version "1.2.3"
- resolved "https://registry.yarnpkg.com/apollo-link-logger/-/apollo-link-logger-1.2.3.tgz#1f3e6f7849ce7a7e3aa822141fe062cfa278b1e1"
- integrity sha512-GaVwdHyXmawfvBlHfZkFkBHH3+YH7wibzSCc4/YpIbPVtbtZqi0Qop18w++jgpw385W083DMOdYe2eJsKkZdag==
-
-apollo-link-retry@^2.2.16:
- version "2.2.16"
- resolved "https://registry.yarnpkg.com/apollo-link-retry/-/apollo-link-retry-2.2.16.tgz#745ff51e60a7a68b34c8d382832856c43a9c306c"
- integrity sha512-7F9+meFAz4dw5gtgtLsRFqJW6QzNOhTzt5R5Hsy+yFhkTW9LddgYO7gxN9n7RN/7Ouosh3TcpUkdHs2laC+0sA==
- dependencies:
- "@types/zen-observable" "0.8.0"
- apollo-link "^1.2.14"
- tslib "^1.9.3"
-
-apollo-link-ws@^1.0.20:
- version "1.0.20"
- resolved "https://registry.yarnpkg.com/apollo-link-ws/-/apollo-link-ws-1.0.20.tgz#dfad44121f8445c6d7b7f8101a1b24813ba008ed"
- integrity sha512-mjSFPlQxmoLArpHBeUb2Xj+2HDYeTaJqFGOqQ+I8NVJxgL9lJe84PDWcPah/yMLv3rB7QgBDSuZ0xoRFBPlySw==
- dependencies:
- apollo-link "^1.2.14"
- tslib "^1.9.3"
-
-apollo-link@^1.2.14:
- version "1.2.14"
- resolved "https://registry.yarnpkg.com/apollo-link/-/apollo-link-1.2.14.tgz#3feda4b47f9ebba7f4160bef8b977ba725b684d9"
- integrity sha512-p67CMEFP7kOG1JZ0ZkYZwRDa369w5PIjtMjvrQd/HnIV8FRsHRqLqK+oAZQnFa1DDdZtOtHTi+aMIW6EatC2jg==
- dependencies:
- apollo-utilities "^1.3.0"
- ts-invariant "^0.4.0"
- tslib "^1.9.3"
- zen-observable-ts "^0.8.21"
-
-apollo-utilities@^1.3.0:
- version "1.3.4"
- resolved "https://registry.yarnpkg.com/apollo-utilities/-/apollo-utilities-1.3.4.tgz#6129e438e8be201b6c55b0f13ce49d2c7175c9cf"
- integrity sha512-pk2hiWrCXMAy2fRPwEyhvka+mqwzeP60Jr1tRYi5xru+3ko94HI9o6lK0CT33/w4RDlxWchmdhDCrvdr+pHCig==
- dependencies:
- "@wry/equality" "^0.1.2"
- fast-json-stable-stringify "^2.0.0"
- ts-invariant "^0.4.0"
- tslib "^1.10.0"
-
argparse@^1.0.7:
version "1.0.10"
resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911"
@@ -5301,6 +5217,13 @@ react-native-gesture-handler@~1.6.0:
invariant "^2.2.4"
prop-types "^15.7.2"
+react-native-indicators@^0.17.0:
+ version "0.17.0"
+ resolved "https://registry.yarnpkg.com/react-native-indicators/-/react-native-indicators-0.17.0.tgz#92f95efaf5fb53be576dfe4e1980a25655a93f55"
+ integrity sha512-s23em477GHGxWeGczWrixScAZD6tQU4mx1fttlrwhEGKOxhBgp55Kh3RoD9Wj4yna4e5W35xQNoPqoJAT6QW5A==
+ dependencies:
+ prop-types "^15.5.10"
+
react-native-iphone-x-helper@^1.0.3, react-native-iphone-x-helper@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/react-native-iphone-x-helper/-/react-native-iphone-x-helper-1.2.1.tgz#645e2ffbbb49e80844bb4cbbe34a126fda1e6772"
@@ -6191,7 +6114,7 @@ toidentifier@1.0.0:
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
-ts-invariant@^0.4.0, ts-invariant@^0.4.4:
+ts-invariant@^0.4.4:
version "0.4.4"
resolved "https://registry.yarnpkg.com/ts-invariant/-/ts-invariant-0.4.4.tgz#97a523518688f93aafad01b0e80eb803eb2abd86"
integrity sha512-uEtWkFM/sdZvRNNDL3Ehu4WVpwaulhwQszV8mrtcdeE8nN00BV9mAmQ88RkrBhFgl9gMgvjJLAQcZbnPXI9mlA==
@@ -6681,15 +6604,7 @@ yargs@^15.0.2, yargs@^15.1.0:
y18n "^4.0.0"
yargs-parser "^18.1.2"
-zen-observable-ts@^0.8.21:
- version "0.8.21"
- resolved "https://registry.yarnpkg.com/zen-observable-ts/-/zen-observable-ts-0.8.21.tgz#85d0031fbbde1eba3cd07d3ba90da241215f421d"
- integrity sha512-Yj3yXweRc8LdRMrCC8nIc4kkjWecPAUVh0TI0OUrWXx6aX790vLcDlWca6I4vsyCGH3LpWxq0dJRcMOFoVqmeg==
- dependencies:
- tslib "^1.9.3"
- zen-observable "^0.8.0"
-
-zen-observable@^0.8.0, zen-observable@^0.8.14:
+zen-observable@^0.8.14:
version "0.8.15"
resolved "https://registry.yarnpkg.com/zen-observable/-/zen-observable-0.8.15.tgz#96415c512d8e3ffd920afd3889604e30b9eaac15"
integrity sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==