\n \n Community Area:\n \n {{ calculateCommunityArea(currentCommunity.GisAcres) }}\n
\n
\n Enter assessment details in the sections below. Photos and Assessment Comments are\n optional; all other fields are required to complete and upload the assessment.\n
\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Home.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Home.vue?vue&type=template&id=58f21448&\"\nimport script from \"./Home.vue?vue&type=script&lang=js&\"\nexport * from \"./Home.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',[(_vm.projectsLoading)?_c('div',{staticClass:\"container-sm background-white text-center\"},[_c('b-spinner',{staticClass:\"large-spinner\",attrs:{\"label\":\"Loading\"}})],1):_c('div',{staticClass:\"container-sm background-white\"},[[_c('b-navbar',{staticClass:\"return-home\",attrs:{\"sticky\":\"\"}},[_c('b-navbar-nav',[_c('span',[_c('font-awesome-icon',{attrs:{\"icon\":\"caret-left\",\"size\":\"lg\"}})],1),_c('router-link',{attrs:{\"to\":{ name: 'home' }}},[_vm._v(\"Return to Community List\")])],1)],1)],_c('b-card',{attrs:{\"no-body\":\"\"}},[_c('form',{staticClass:\"needs-validation\",attrs:{\"novalidate\":\"\"}},[_c('div',{staticClass:\"ad-hoc-community-form\"},[_c('div',{staticClass:\"assessment-title\"},[_vm._v(\" Add New Community \")]),_c('div',{staticClass:\"instructional-text\"},[_vm._v(\" Please provide basic details for the new ad hoc community to assess. All fields are required. \"),_c('br'),_vm._v(\" To get latitude and longitude, ensure you are located in the community and then click the 'Get Current Location' button. If prompted, allow the browser to access your location and the coordinates will be autopopulated. \"),_c('br'),_vm._v(\"The following Latitude, Longitude formats are supported: \"),_c('br'),_vm._v(\"30.273734, -97.739818 \"),_c('br'),_vm._v(\"36°06'04.1\\\"N 115°10'24.7\\\"W \"),_c('br'),_vm._v(\"40.689201 N, 74.044543 W \"),_c('br'),_vm._v(\"39.423800° N, 0.397766° W \"),_c('br'),_c('strong',[_vm._v(\"Note:\")]),_vm._v(\" The community boundary will have to be mapped from the Community Assessor Tool after the assessment has been uploaded. \")]),_c('div',{staticClass:\"card-body\"},[_c('b-row',{staticClass:\"form-row\"},[_c('b-col',{attrs:{\"sm\":\"3\"}},[_c('label',{staticClass:\"bold-label-in-card\",attrs:{\"for\":\"type-CommunityName\"}},[_vm._v(\"Community Name \")])]),_c('b-col',{attrs:{\"sm\":\"9\"}},[_c('b-form-input',{staticClass:\"form-control\",attrs:{\"id\":\"CommunityName\",\"type\":\"text\",\"state\":_vm.getCommunityNameState(_vm.communityName),\"required\":\"\",\"aria-describedby\":\"input-live-help input-live-feedback-CommunityName\"},model:{value:(_vm.communityName),callback:function ($$v) {_vm.communityName=$$v},expression:\"communityName\"}}),_c('b-form-invalid-feedback',{attrs:{\"id\":\"input-live-feedback-CommunityName\"}},[_vm._v(\" Community Name must be between 1 and 200 characters. \")])],1)],1),_c('b-row',{staticClass:\"form-row\"},[_c('b-col',{attrs:{\"sm\":\"3\"}},[_c('label',{staticClass:\"bold-label-in-card\",attrs:{\"for\":\"type-Project\"}},[_vm._v(\"Project \")])]),_c('b-col',{attrs:{\"sm\":\"9\"}},[_c('b-form-select',{staticClass:\"custom-select\",attrs:{\"options\":_vm.projects,\"required\":\"\",\"state\":_vm.getProjectSelectionState()},model:{value:(_vm.project),callback:function ($$v) {_vm.project=$$v},expression:\"project\"}}),_c('b-form-invalid-feedback',{attrs:{\"id\":\"input-live-feedback-Project\"}},[_vm._v(\" A project must be selected. \")])],1)],1),(!_vm.online)?_c('div',[_c('b-row',{staticClass:\"form-row\"},[_c('b-col',{attrs:{\"sm\":\"3\"}},[_c('label',{staticClass:\"bold-label-in-card\",attrs:{\"for\":\"type-LatLong\"}},[_vm._v(\"Latitude/Longitude \")])]),_c('b-col',{attrs:{\"sm\":\"9\"}},[_c('b-form-input',{staticClass:\"form-control\",attrs:{\"id\":\"LatLong\",\"type\":\"text\",\"state\":_vm.getLatLongState(),\"required\":\"\",\"aria-describedby\":\"latlong-help-block input-live-feedback-latlong\"},model:{value:(_vm.latLong),callback:function ($$v) {_vm.latLong=$$v},expression:\"latLong\"}}),_c('b-form-text',{attrs:{\"id\":\"latlong-help-block\"}},[_vm._v(\" You are offline. Please use your device's mapping app to copy your current latitude/longitude coordinates and paste them into this field. \")]),_c('b-form-invalid-feedback',{attrs:{\"id\":\"input-live-feedback-latlong\"}},[_vm._v(\" This field is required and must have a valid value. \")])],1)],1)],1):_c('div',[_c('div',[_c('b-row',{staticClass:\"form-row\"},[_c('b-button',{attrs:{\"variant\":\"success\"},on:{\"click\":_vm.triggerGetCurrentPosition}},[_vm._v(\" Get Current Location \")])],1)],1),_c('div',[_c('b-row',{staticClass:\"form-row\"},[_c('b-col',{attrs:{\"sm\":\"3\"}},[_c('label',{staticClass:\"bold-label-in-card\",attrs:{\"for\":\"type-Latitude\"}},[_vm._v(\"Latitude \")])]),_c('b-col',{attrs:{\"sm\":\"9\"}},[_c('b-form-input',{staticClass:\"form-control\",attrs:{\"id\":\"Latitude\",\"type\":\"text\",\"state\":_vm.getLatitudeState(),\"required\":\"\",\"aria-describedby\":\"input-live-help input-live-feedback-latitude\"},model:{value:(_vm.latitude),callback:function ($$v) {_vm.latitude=$$v},expression:\"latitude\"}}),_c('b-form-invalid-feedback',{attrs:{\"id\":\"input-live-feedback-latitude\"}},[_vm._v(\" Latitude is required and must have a valid format. \")])],1)],1),_c('b-row',{staticClass:\"form-row\"},[_c('b-col',{attrs:{\"sm\":\"3\"}},[_c('label',{staticClass:\"bold-label-in-card\",attrs:{\"for\":\"type-Longitude\"}},[_vm._v(\"Longitude \")])]),_c('b-col',{attrs:{\"sm\":\"9\"}},[_c('b-form-input',{staticClass:\"form-control\",attrs:{\"id\":\"Longitude\",\"type\":\"text\",\"state\":_vm.getLongitudeState(),\"required\":\"\",\"aria-describedby\":\"long-help-block input-live-feedback-longitude\"},model:{value:(_vm.longitude),callback:function ($$v) {_vm.longitude=$$v},expression:\"longitude\"}}),_c('b-form-invalid-feedback',{attrs:{\"id\":\"input-live-feedback-latitude\"}},[_vm._v(\" Longitude is required and must have a valid format. \")])],1)],1)],1)]),_c('b-row',{staticClass:\"form-row\"},[_c('b-button',{staticClass:\"finish-assessment-btn\",attrs:{\"variant\":\"primary\",\"aria-label\":\"Start Assessment\",\"type\":\"button\"},on:{\"click\":_vm.saveAdHocAndStartAssessment}},[_vm._v(\" Start Assessment \")])],1)],1)])])])],2)])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","\n
\n
\n \n
\n
\n \n \n \n \n Return to Community List\n \n \n \n \n \n \n
\n
\n\n\n\n\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AdHocCommunity.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../node_modules/thread-loader/dist/cjs.js!../../node_modules/babel-loader/lib/index.js!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./AdHocCommunity.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./AdHocCommunity.vue?vue&type=template&id=b8888954&\"\nimport script from \"./AdHocCommunity.vue?vue&type=script&lang=js&\"\nexport * from \"./AdHocCommunity.vue?vue&type=script&lang=js&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import Vue from 'vue';\nimport VueRouter from 'vue-router';\nimport Assessment from '../views/Assessment.vue';\nimport Home from '../views/Home.vue';\nimport AdHocCommunity from '../views/AdHocCommunity.vue';\n\nVue.use(VueRouter);\n\nconst routes = [\n {\n path: '/',\n name: 'home',\n component: Home,\n },\n {\n path: '/community/:community_id/assessment',\n name: 'assessment',\n component: Assessment,\n },\n {\n path: '/login',\n name: 'LogIn',\n component: () => import(/* webpackChunkName: \"login\" */ '../views/LogIn.vue'),\n },\n {\n path: '/ad-hoc-community',\n name: 'AdHocCommunity',\n component: AdHocCommunity,\n },\n];\n\nconst router = new VueRouter({\n mode: 'history',\n base: process.env.BASE_URL,\n routes,\n});\n\nexport default router;\n","/* eslint no-shadow: [\"error\", { \"allow\": [\"state\"] }] */\nimport axios from 'axios';\nimport {\n createStore,\n del,\n entries,\n values,\n get,\n set,\n setMany,\n} from 'idb-keyval';\n\nimport Vue from 'vue';\nimport Vuex from 'vuex';\n\nVue.use(Vuex);\n\nasync function getJwt() {\n const accessStore = createStore('fieldToolAccess', 'access');\n let jwt;\n await get('access_token', accessStore).then((token) => {\n if (token) {\n jwt = token;\n }\n });\n return jwt;\n}\n\nfunction getRandomNegativeIdForAdHocComm(excludeIds) {\n const min = -9999;\n const max = -1;\n let id = Math.floor(Math.random() * (max - min + 1) + min);\n\n while (excludeIds.includes(Math.abs(id))) {\n id = Math.floor(Math.random() * (max - min + 1) + min);\n }\n return id;\n}\n\nexport default new Vuex.Store({\n state: {\n config: {},\n configLoading: false,\n configLoaded: false,\n uploading: false,\n loggedIn: false,\n userLoggedIn: '',\n assessmentCategories: [],\n assessmentModel: {},\n categoriesLoading: false,\n fireDepartments: [],\n fireDepartmentsLoading: [],\n currentCommunity: { assessment: {} },\n downloadedCommunities: [],\n communities: [],\n communitiesLoading: false,\n projects: [],\n projectsLoading: false,\n finishSuccess: false,\n uploadSuccess: false,\n online: true,\n nextAdHocCommunityId: getRandomNegativeIdForAdHocComm([]),\n },\n actions: {\n async fetchConfiguration({ commit, state }) {\n if (!state.configLoaded && !state.configLoading) {\n commit('SET_LOADING', true);\n const configStore = createStore('fieldToolConfig', 'config');\n await axios.get('/config.json')\n .then((response) => {\n commit('SET_CONFIGURATION', response.data);\n set('communityAssessorUrl', response.data.communityAssessorUrl, configStore);\n set('wrapUrl', response.data.wrapUrl, configStore);\n commit('SET_LOADING', false);\n commit('SET_LOADED');\n }).catch(async () => {\n commit('SET_CONFIGURATION', {\n communityAssessorUrl:\n await get('communityAssessorUrl', configStore),\n wrapUrl:\n await get('wrapUrl', configStore),\n });\n commit('SET_LOADING', false);\n commit('SET_LOADED');\n });\n }\n },\n async setNewTokenAndLoggedInStatus({ commit }, { newToken, userLoggedIn }) {\n const accessStore = createStore('fieldToolAccess', 'access');\n set('access_token', newToken, accessStore);\n set('userLoggedIn', userLoggedIn, accessStore);\n commit('SET_LOGGED_IN', true);\n commit('SET_USER_LOGGED_IN', userLoggedIn);\n },\n async refreshLoggedInStatus({ commit }) {\n const token = await getJwt();\n let expirationTime = null;\n let userLoggedIn = '';\n\n if (token) {\n // extract token's expiration time\n const base64Url = token.split('.')[1];\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\n /* eslint-disable prefer-template */\n const jsonPayload = JSON.parse(decodeURIComponent(atob(base64).split('')\n .map((c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join('')));\n\n expirationTime = new Date(jsonPayload.exp * 1000);\n // extract token's user name\n userLoggedIn = jsonPayload.unique_name;\n }\n\n if (!token) {\n commit('SET_LOGGED_IN', false);\n commit('SET_USER_LOGGED_IN', '');\n } else if (!expirationTime || expirationTime < Date.now()) {\n // we do not want to sign out the user if offline\n // so we'll keep the user signed in FTM until we check network status\n // but we flag loggedIn as false to indicate this situation\n commit('SET_LOGGED_IN', false);\n commit('SET_USER_LOGGED_IN', userLoggedIn);\n } else {\n commit('SET_LOGGED_IN', true);\n commit('SET_USER_LOGGED_IN', userLoggedIn);\n }\n },\n async LogOut({ commit }) {\n // go back to default/initial state\n // but do not remove this on sign out so the forgot password link still works\n // commit('SET_CONFIGURATION', {});\n commit('SET_LOADING', false);\n commit('SET_LOADED', false);\n commit('SET_LOGGED_IN', false);\n commit('SET_USER_LOGGED_IN', '');\n commit('SET_ASSESSMENT_CATEGORIES', []);\n commit('SET_CATEGORIES_LOADING', false);\n commit('SET_FIRE_DEPARTMENTS', []);\n commit('SET_FIRE_DEPARTMENTS_LOADING', false);\n commit('SET_CURRENT_COMMUNITY', null);\n commit('SET_DOWNLOADED_COMMUNITIES', []);\n commit('SET_COMMUNITIES', []);\n commit('SET_COMMUNITIES_LOADING', false);\n commit('SET_FINISH_SUCCESS', false);\n commit('SET_UPLOADING', false);\n },\n async fetchAssessmentCategories({ commit, state }) {\n const categoriesStore = createStore('fieldToolCategories', 'assessmentCategories');\n\n if (state.loggedIn && navigator.onLine) {\n if (!state.assessmentCategories || state.assessmentCategories.length === 0) {\n commit('SET_CATEGORIES_LOADING', true);\n const config = {\n headers: { Authorization: `Bearer ${await getJwt()}` },\n };\n await axios.get(`${state.config.communityAssessorUrl}/categories`, config)\n .then((response) => {\n if (response && response.data && response.data.accessToken) {\n const accessStore = createStore('fieldToolAccess', 'access');\n set('access_token', response.data.accessToken, accessStore);\n }\n const categories = response.data.items;\n // deal with sorting sub collections of classes and conditions\n categories.map((cat) => {\n const newCat = cat;\n newCat.HazardClasses = cat.HazardClasses.sort((a, b) => {\n if (a.Row === b.Row) {\n return a.Col - b.Col;\n }\n return a.Row - b.Row;\n }).map((hazClass) => {\n const newClass = hazClass;\n newClass.HazardConditions = hazClass.HazardConditions\n .sort((a, b) => a.DisplayOrder - b.DisplayOrder);\n return newClass;\n });\n return newCat;\n });\n commit('SET_ASSESSMENT_CATEGORIES', categories);\n setMany(categories.map((ac) => [ac.HazardCategoryId, ac]), categoriesStore);\n })\n .catch((exc) => {\n console.log(`error: ${exc}`);\n values(categoriesStore).then((acEntries) => {\n commit('SET_ASSESSMENT_CATEGORIES', acEntries);\n });\n\n if (exc.message === 'Request failed with status code 401') {\n commit('SET_LOGGED_IN', false);\n }\n })\n .finally(() => {\n commit('SET_CATEGORIES_LOADING', false);\n });\n }\n } else if (!navigator.onLine) {\n commit('SET_CATEGORIES_LOADING', true);\n values(categoriesStore).then((acEntries) => {\n commit('SET_ASSESSMENT_CATEGORIES', acEntries);\n });\n commit('SET_CATEGORIES_LOADING', false);\n }\n },\n async fetchFireDepartments({ commit, state }) {\n const fdStore = createStore('fieldToolFireDepartments', 'fireDepartments');\n if (state.loggedIn) {\n if (!state.fireDepartments || state.fireDepartments.length === 0) {\n commit('SET_FIRE_DEPARTMENTS_LOADING', true);\n const config = {\n headers: { Authorization: `Bearer ${await getJwt()}` },\n };\n await axios.get(`${state.config.communityAssessorUrl}/fireDepartments`, config)\n .then((response) => {\n if (response && response.data && response.data.accessToken) {\n const accessStore = createStore('fieldToolAccess', 'access');\n set('access_token', response.data.accessToken, accessStore);\n }\n const items = response.data.items.map((x) => ({ id: x.Key, fdName: x.Value }));\n commit('SET_FIRE_DEPARTMENTS', items);\n setMany(items.map((fd) => [fd.id, fd]), fdStore);\n })\n .catch((exc) => {\n console.log(`error: ${exc}`);\n values(fdStore).then((fdEntries) => {\n commit('SET_FIRE_DEPARTMENTS', fdEntries);\n });\n if (exc.message === 'Request failed with status code 401') {\n commit('SET_LOGGED_IN', false);\n }\n })\n .finally(() => {\n commit('SET_FIRE_DEPARTMENTS_LOADING', false);\n });\n }\n } else if (!navigator.onLine) {\n commit('SET_FIRE_DEPARTMENTS_LOADING', true);\n values(fdStore).then((fdEntries) => {\n commit('SET_FIRE_DEPARTMENTS', fdEntries);\n });\n commit('SET_FIRE_DEPARTMENTS_LOADING', false);\n }\n },\n async updateCurrentCommunity({ commit }, community) {\n // save to idb\n const communitiesStore = createStore('fieldToolCommunities', 'communities');\n set(community.CommunityId, community, communitiesStore);\n // and update the downloadedCommunities and the currentCommunity\n commit('SET_CURRENT_COMMUNITY', community);\n commit('SET_DOWNLOADED_COMMUNITIES', await entries(communitiesStore));\n },\n async setFinishSuccess({ commit }) {\n commit('SET_FINISH_SUCCESS', true);\n },\n async setUploadSuccess({ commit }) {\n commit('SET_UPLOAD_SUCCESS', true);\n },\n async resetFinishSuccess({ commit }) {\n commit('SET_FINISH_SUCCESS', false);\n },\n async resetUploadSuccess({ commit }) {\n commit('SET_UPLOAD_SUCCESS', false);\n },\n async setCurrentCommunityById({ commit }, id) {\n const communitiesStore = createStore('fieldToolCommunities', 'communities');\n const comm = await get(id, communitiesStore);\n commit('SET_CURRENT_COMMUNITY', comm);\n },\n async fetchProjects({ commit, state }) {\n const projectsStore = createStore('fieldToolProjects', 'projects');\n commit('SET_PROJECTS', await entries(projectsStore));\n\n if (state.loggedIn) {\n commit('SET_PROJECTS_LOADING', true);\n const config = {\n headers: { Authorization: `Bearer ${await getJwt()}` },\n };\n // get all of the user authorized projects from the server\n await axios.get(`${state.config.communityAssessorUrl}/myProjectsWithToken`, config)\n .then((response) => {\n if (response && response.data && response.data.accessToken) {\n const accessStore = createStore('fieldToolAccess', 'access');\n set('access_token', response.data.accessToken, accessStore);\n }\n const items = response.data.items.map((x) => ({\n value: x,\n text: x.ProjectName,\n projectId: x.ProjectId,\n }));\n commit('SET_PROJECTS', items);\n setMany(items.map((p) => [p.projectId, p]), projectsStore);\n })\n .catch((exc) => {\n console.log(`error: ${exc}`);\n values(projectsStore).then((projectEntries) => {\n commit('SET_PROJECTS', projectEntries);\n });\n if (exc.message === 'Request failed with status code 401') {\n commit('SET_LOGGED_IN', false);\n commit('SET_USER_LOGGED_IN', '');\n }\n })\n .finally(() => {\n commit('SET_PROJECTS_LOADING', false);\n });\n }\n },\n async fetchAssessmentModel({ commit, state }) {\n const assessmentModelStore = createStore('fieldToolAssessModel', 'assessment_model');\n commit('SET_ASSESSMENT_MODEL', await entries(assessmentModelStore));\n\n if (state.loggedIn) {\n const config = {\n headers: { Authorization: `Bearer ${await getJwt()}` },\n };\n await axios.get(`${state.config.communityAssessorUrl}/GetEmptyAssessment`, config)\n .then((response) => {\n if (response && response.data && response.data.accessToken) {\n const accessStore = createStore('fieldToolAccess', 'access');\n set('access_token', response.data.accessToken, accessStore);\n }\n const model = response.data.items;\n commit('SET_ASSESSMENT_MODEL', model);\n set('assessment_model', model, assessmentModelStore);\n })\n .catch((exc) => {\n console.log(`error: ${exc}`);\n values(assessmentModelStore).then((assessmentModel) => {\n commit('SET_ASSESSMENT_MODEL', assessmentModel[0]);\n });\n if (exc.message === 'Request failed with status code 401') {\n commit('SET_LOGGED_IN', false);\n commit('SET_USER_LOGGED_IN', '');\n }\n });\n }\n },\n async fetchCommunities({ commit, state }) {\n const communitiesStore = createStore('fieldToolCommunities', 'communities');\n commit('SET_DOWNLOADED_COMMUNITIES', await entries(communitiesStore));\n\n if (state.loggedIn) {\n commit('SET_COMMUNITIES_LOADING', true);\n const config = {\n headers: { Authorization: `Bearer ${await getJwt()}` },\n };\n // get all of the unassessed communities from the server\n await axios.get(`${state.config.communityAssessorUrl}/myUnassessedCommunities`, config)\n .then((response) => {\n if (response && response.data && response.data.accessToken) {\n const accessStore = createStore('fieldToolAccess', 'access');\n set('access_token', response.data.accessToken, accessStore);\n }\n\n commit('SET_COMMUNITIES', response.data.items);\n })\n .catch((exc) => {\n console.log(`error: ${exc}`);\n commit('SET_COMMUNITIES', []);\n if (exc.message === 'Request failed with status code 401') {\n commit('SET_LOGGED_IN', false);\n commit('SET_USER_LOGGED_IN', '');\n }\n })\n .finally(() => {\n commit('SET_COMMUNITIES_LOADING', false);\n });\n }\n },\n async downloadCommunity({ state, commit }, id) {\n const selectedCommunity = state.communities.find((comm) => comm.CommunityId === id);\n selectedCommunity.status = 'downloaded';\n const communitiesStore = createStore('fieldToolCommunities', 'communities');\n set(selectedCommunity.CommunityId, selectedCommunity, communitiesStore);\n commit('ADD_TO_DOWNLOADED_COMMUNITIES', [selectedCommunity.CommunityId, selectedCommunity]);\n },\n async addAdHocToCommunities({ commit }, adHocCommunity) {\n const communitiesStore = createStore('fieldToolCommunities', 'communities');\n set(adHocCommunity.CommunityId, adHocCommunity, communitiesStore);\n commit('ADD_TO_COMMUNITIES', [adHocCommunity.CommunityId, adHocCommunity]);\n },\n async setNextAdHocCommunityId({ commit, state }) {\n const nextId = getRandomNegativeIdForAdHocComm(state.communities.map((c) => c.CommunityId));\n commit('SET_NEXT_AD_HOC_COMMUNITY_ID', nextId);\n },\n async deleteDownloadedCommunity({ commit }, communityId) {\n const communitiesStore = createStore('fieldToolCommunities', 'communities');\n\n // remove from indexedDb then reset the downloadedCommunities in state\n del(communityId, communitiesStore);\n commit('SET_DOWNLOADED_COMMUNITIES', await entries(communitiesStore));\n },\n async uploadPhotos({ state, commit }, community) {\n if (state.loggedIn) {\n const config = {\n headers: {\n Authorization: `Bearer ${await getJwt()}`,\n 'Content-Type': 'multipart/form-data',\n },\n };\n const communityToUpdate = community;\n const photoFiles = new FormData();\n /* eslint-disable no-plusplus */\n for (let imageIndexNumber = 1; imageIndexNumber <= 3; imageIndexNumber++) {\n const indexName = `Image${imageIndexNumber}File`;\n if (community[indexName] && community[indexName].size > 0) {\n photoFiles.append(`photoFiles[${imageIndexNumber - 1}]`, community[indexName]);\n }\n }\n\n return axios\n .post(`${state.config.communityAssessorUrl}/UploadPhotos`, photoFiles, config)\n .then(async (response) => {\n communityToUpdate.AssessmentPictureIds = response.data.pictureIds;\n // save to idb\n const communitiesStore = createStore('fieldToolCommunities', 'communities');\n set(communityToUpdate.CommunityId, communityToUpdate, communitiesStore);\n // and update the downloadedCommunities and the currentCommunity\n commit('SET_CURRENT_COMMUNITY', communityToUpdate);\n commit('SET_DOWNLOADED_COMMUNITIES', await entries(communitiesStore));\n }).catch((exc) => {\n console.log(`error: ${exc}`);\n if (exc.message === 'Request failed with status code 401') {\n commit('SET_LOGGED_IN', false);\n }\n return Promise.reject(exc.response);\n });\n }\n return new Promise(() => {}).reject(new Error('Not logged in.'));\n },\n async uploadCommunity({ commit, state }, community) {\n const commStore = createStore('fieldToolCommunities', 'communities');\n\n if (state.loggedIn) {\n const config = {\n headers: { Authorization: `Bearer ${await getJwt()}` },\n };\n /* eslint-disable no-param-reassign */\n if (!community.FireProtectionDistrictId) {\n community.FireProtectionDistrictId = community.FireDepartmentId;\n }\n /* eslint-enable no-param-reassign */\n // To look if I have to use the Sync endpoint (for ad hoc comms)\n // or the Assessment Create endpoint\n const communityId = parseInt(community.CommunityId, 10);\n\n if (communityId && communityId > 0) {\n // post the assessment to the server\n return axios.post(`${state.config.communityAssessorUrl}/Project/${community\n .ProjectId}/Community/${community.CommunityId}/Assessment/Create`, community, config)\n .then(async (response) => {\n if (response && response.data && response.data.accessToken) {\n const accessStore = createStore('fieldToolAccess', 'access');\n set('access_token', response.data.accessToken, accessStore);\n }\n\n // remove from indexedDb then reset the downloadedCommunities in state\n del(community.CommunityId, commStore);\n commit('REMOVE_AVAILABLE_COMMUNITY', community.CommunityId);\n commit('SET_DOWNLOADED_COMMUNITIES', await entries(commStore));\n })\n .catch((exc) => {\n console.log(`error: ${exc}`);\n return Promise.reject(exc.response);\n });\n }\n // If we reached this, community id is negative so it's an ad hoc\n // sync up the ad hoc to the server\n const syncModel = {\n Community: community,\n Assessment: community,\n };\n return axios.post(`${state.config.communityAssessorUrl}/Project/${community\n .ProjectId}/Sync`, syncModel, config)\n .then(async (response) => {\n if (response && response.data && response.data.accessToken) {\n const accessStore = createStore('fieldToolAccess', 'access');\n set('access_token', response.data.accessToken, accessStore);\n }\n\n // remove from indexedDb\n del(community.CommunityId, commStore);\n commit('REMOVE_AVAILABLE_COMMUNITY', community.CommunityId);\n // set next Ad Hoc Community Id\n const nextId = getRandomNegativeIdForAdHocComm(state.communities\n .map((c) => c.CommunityId));\n commit('SET_NEXT_AD_HOC_COMMUNITY_ID', nextId);\n // and reset the downloadedCommunities in state\n commit('SET_DOWNLOADED_COMMUNITIES', await entries(commStore));\n })\n .catch((exc) => {\n console.log(`error: ${exc}`);\n return Promise.reject(exc.response);\n });\n }\n return new Promise(() => {}).reject(new Error('Not logged in.'));\n },\n async setOnline({ commit }) {\n commit('SET_ONLINE', true);\n },\n async setOffline({ commit }) {\n commit('SET_ONLINE', false);\n },\n async setUploading({ commit }, uploading) {\n commit('SET_UPLOADING', uploading);\n },\n },\n mutations: {\n ADD_TO_DOWNLOADED_COMMUNITIES(state, community) {\n state.downloadedCommunities.push(community);\n },\n ADD_TO_COMMUNITIES(state, adHocCommunity) {\n state.communities.push(adHocCommunity);\n },\n SET_LOGGED_IN(state, loggedIn) {\n state.loggedIn = loggedIn;\n },\n SET_ONLINE(state, online) {\n state.online = online;\n },\n SET_USER_LOGGED_IN(state, username) {\n state.userLoggedIn = username;\n },\n SET_CONFIGURATION(state, config) {\n state.config = config;\n },\n SET_LOADING(state, loading) {\n state.configLoading = loading;\n },\n SET_UPLOADING(state, uploading) {\n state.uploading = uploading;\n },\n SET_CATEGORIES_LOADING(state, loading) {\n state.categoriesLoading = loading;\n },\n SET_LOADED(state) {\n state.configLoaded = true;\n },\n SET_ASSESSMENT_CATEGORIES(state, categories) {\n state.assessmentCategories = categories;\n },\n SET_FIRE_DEPARTMENTS(state, fds) {\n state.fireDepartments = fds;\n },\n SET_FIRE_DEPARTMENTS_LOADING(state, fdsLoading) {\n state.fireDepartmentsLoading = fdsLoading;\n },\n SET_CURRENT_COMMUNITY(state, community) {\n state.currentCommunity = community;\n },\n SET_COMMUNITIES(state, communities) {\n state.communities = communities;\n },\n REMOVE_AVAILABLE_COMMUNITY(state, communityId) {\n const i = state.communities.map((item) => item.CommunityId).indexOf(communityId);\n if (i >= 0) {\n state.communities.splice(i, 1);\n }\n },\n SET_DOWNLOADED_COMMUNITIES(state, communities) {\n state.downloadedCommunities = communities;\n },\n SET_COMMUNITIES_LOADING(state, loading) {\n state.communitiesLoading = loading;\n },\n SET_PROJECTS(state, projects) {\n state.projects = projects;\n },\n SET_ASSESSMENT_MODEL(state, model) {\n state.assessmentModel = model;\n },\n SET_PROJECTS_LOADING(state, loading) {\n state.projectsLoading = loading;\n },\n SET_FINISH_SUCCESS(state, success) {\n state.finishSuccess = success;\n },\n SET_UPLOAD_SUCCESS(state, success) {\n state.uploadSuccess = success;\n },\n SET_NEXT_AD_HOC_COMMUNITY_ID(state, nextId) {\n state.nextAdHocCommunityId = nextId;\n },\n },\n getters: {\n numericFields(state) {\n if (state.assessmentCategories.length === 0) {\n return [];\n }\n return state.assessmentCategories.flatMap((ac) => ac.HazardClasses\n .filter((hc) => hc.Type === 'text')\n .map((hc) => hc.Name));\n },\n requiredFieldsCountObj(state) {\n if (state.assessmentCategories.length === 0) {\n return [];\n }\n return state.assessmentCategories\n .map((cat) => ({\n id: cat.HazardCategoryId,\n name: cat.DisplayName,\n requiredCount: cat.HazardClasses.filter((hc) => hc.IsRequired).length,\n completedRequiredCount: cat.HazardClasses.filter((hc) => hc.IsRequired\n && state.currentCommunity[hc.Name]).length,\n }));\n },\n incompleteCategoriesObj(state) {\n if (state.assessmentCategories.length === 0) {\n return [];\n }\n return state.assessmentCategories\n .map((cat) => ({\n id: cat.HazardCategoryId,\n name: cat.DisplayName,\n requiredCount: cat.HazardClasses.filter((hc) => hc.IsRequired).length,\n completedRequiredCount: cat.HazardClasses.filter((hc) => hc.IsRequired\n && state.currentCommunity[hc.Name]).length,\n }))\n .filter((item) => item.requiredCount > item.completedRequiredCount)\n .map((item) => item.name);\n },\n availableCommunities(state) {\n // get all communities that are available, filter out any that have been downloaded\n // and add a status of 'available'\n let availableCommunities = [];\n if (navigator.onLine) {\n availableCommunities = state.communities\n .filter((item) => state.downloadedCommunities\n .findIndex((entry) => entry[1].CommunityId === item.CommunityId) < 0)\n .map((obj) => ({ ...obj, status: 'available' }));\n }\n\n // set up a function that sets up the secondary sort on CommunityName\n const compareByCommunityName = (a, b) => (a.CommunityName || '').toUpperCase()\n .localeCompare((b.CommunityName || '').toUpperCase());\n\n // set up a function to get only downloadedCommunities by a specific status\n // and sort them by CommunityName\n const downloadedCommunitiesByStatus = (status) => state.downloadedCommunities\n .map((entry) => entry[1])\n .filter((comm) => comm.status === status)\n .sort((a, b) => compareByCommunityName(a, b));\n\n // combine downloaded communities with ones available for download\n // this is done to force the order of displayed communities by status\n // and by CommunityName within each status\n return downloadedCommunitiesByStatus('started')\n .concat(downloadedCommunitiesByStatus('downloaded'))\n .concat(downloadedCommunitiesByStatus('finished'))\n .concat(availableCommunities.sort((a, b) => compareByCommunityName(a, b)));\n },\n },\n modules: {\n },\n});\n","import Vue from 'vue';\nimport { library } from '@fortawesome/fontawesome-svg-core';\n\nimport {\n faSignOutAlt,\n faCaretRight,\n faCaretDown,\n faCaretLeft,\n faUpload,\n} from '@fortawesome/free-solid-svg-icons';\n\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\n\nimport { BootstrapVue, IconsPlugin } from 'bootstrap-vue';\nimport App from './App.vue';\nimport './registerServiceWorker';\nimport router from './router';\nimport '../sass/base.scss';\nimport store from './store';\n\nVue.config.productionTip = false;\nVue.config.devtools = true;\n\nlibrary.add(\n faSignOutAlt,\n faCaretRight,\n faCaretDown,\n faCaretLeft,\n faUpload,\n);\n\nVue.component('font-awesome-icon', FontAwesomeIcon);\n\nVue.use(BootstrapVue);\nVue.use(IconsPlugin);\n\nnew Vue({\n router,\n store,\n render: (h) => h(App),\n}).$mount('#app');\n","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAADKADAAQAAAABAAAADAAAAAATDPpdAAAAgElEQVQoFWNgwAL+////HIifYZFiYMImiE+MjhqAbtYH4jlAzAFzEpDNA8RLgFgXJgangYKbgBgEDgDxOyB+D8SngBgENsMVwhhAQQ4g3giSRQObgXxOmDoUGijBDMTzkDQsALJZUBRh4wAVdQJxDxAzYpMnSYwRaMp/UnSQHHEA8Kl6trXMRsUAAAAASUVORK5CYII=\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOCAYAAAAfSC3RAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAADqADAAQAAAABAAAADgAAAAC98Dn6AAAA5ElEQVQoFZ2SMQ6CQBBFCYUdiZUJXsXG0FlwKAov4QE8iI0lHgErD0AvvgdLgBAw+pPPzM7Mn51dNopGaJomgQUsYR2obywZlQ4uiQxWcAnmskGBZwC+g+KGzWEaqG9MWNOJcRyv3+mMH0+6do1j4uaEtYm7Ob+waytyoRhzgZvgK+53Lkw+oMgtEC56i3uH+7B2bFFa5O2J1KRw0Vt98IIH6LlFPTtPq5x/doROkzDqb6M+qTkqwk5GXbucK8XbIJpdzn+/I3TL6PzbA1AoECqu4BLMda+mkwxfEo7tmb2w1Uf+AWNX4gyuVhopAAAAAElFTkSuQmCC\"","var map = {\n\t\"./continue-in-button.png\": \"9ab2\",\n\t\"./continue.png\": \"569b\",\n\t\"./download-in-button.png\": \"8e8b\",\n\t\"./download.png\": \"f6f5\",\n\t\"./logo.png\": \"cf05\",\n\t\"./start-in-button.png\": \"0188\",\n\t\"./start.png\": \"fd98\",\n\t\"./upload-in-button.png\": \"a1dc\",\n\t\"./upload.png\": \"cf55\"\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = \"9e01\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAADKADAAQAAAABAAAADAAAAAATDPpdAAAAc0lEQVQoFWP8DwQMJAAmEtRSSSnQhYxA3APEnQSNBCpiAeIFQAwD84AMZqwagRKcQLwZphKJ3gBkc2BoQlJ8Csh+D8TvgPgAEIPAJmwadIESS4CYB4ifAfFzIOYA4jlArI+hAVkAqACsAVkMxiY5HmivAQC954J6Y77YlQAAAABJRU5ErkJggg==\"","export default {\n methods: {\n isOnline() {\n return navigator.onLine;\n },\n isLoggedOutAndOnline() {\n return !this.loggedIn && navigator.onLine;\n },\n isLoggedIn() {\n return this.loggedIn;\n },\n isUserLoggedIn() {\n return this.userLoggedIn;\n },\n isLoggedInAndOnline() {\n return this.loggedIn && navigator.onLine;\n },\n\n // this is basically lifted straight from communityAssessor project, utils/Methods.js\n getDMS(nDec, bLong = false) {\n let sDir = (nDec > 0) ? 'N' : 'S';\n if (bLong) {\n sDir = (nDec > 0) ? 'E' : 'W';\n }\n const nDeg = Math.trunc(nDec);\n const nDecimal = Math.abs(nDec) - Math.abs(nDeg);\n const nMin = Math.trunc(nDecimal * 60);\n const nSec = ((nDecimal * 60) - nMin) * 60;\n\n const re = new RegExp('(\\\\d+\\\\.\\\\d{4})(\\\\d)');\n const m = nSec.toString().match(re);\n const nSecValue = m ? parseFloat(m[1]) : this.valueOf();\n\n return `${Math.abs(nDeg)}° ${nMin}' ${nSecValue}\" ${sDir}`;\n },\n\n showOkModal(title, message) {\n this.$bvModal.msgBoxOk(\n message,\n {\n title,\n okVariant: 'success',\n okTitle: 'Okay',\n hideHeaderClose: true,\n centered: true,\n },\n );\n },\n },\n};\n","module.exports = __webpack_public_path__ + \"img/logo.e215a32a.png\";","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACcAAAAnCAYAAACMo1E1AAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAJ6ADAAQAAAABAAAAJwAAAAA+NMKoAAABjklEQVRYCe2XWUoEMRRFbZeg9tw4bECRRl2HfoqIvRdBRHAjbkH00z9RVBxwWoDTApzOkwRCUVV2UqnuoHlwyfRyc/IqNHTlixgJNEYD5frBinCuXyfoyrleKu77HxXg53IGHaJOUDcGaBo9Iolb1A4CEJAp9IDMuGHQGiogAJPo3qQy+tf0m0MB5OAOujNg0rpXTDYGCsiBbSRvq5+4JKk+EEAOaiF5UzZxQXKtVEAOaCJ5Sy5xzqZqKYAYN5C8oSJxxuYJr4AY1pG8HR9xism4F0CMakjejM84wWysECAGVSRvJS+OMhb3mH/PWJPpY+QOyOYDccmJLdaWM9ZXmF9FeYD7ztXDeBY9obTYFmMWMuHU+ho5HykGr8x1neGU+RwmzwnzHW3KfC6c8lgnzwR8Y7ygPQq1GM2jFySxa5ox/hVOAfbI/UQCtmh6FO5j2EWbSSPm+oJTgBvkLyU9ShvbwNlCBP3vK8LZfk6dHyunK2HbxsrZVkznx8rpSti2sXK2FdP5f75yFX1T3+039mcBfx2PWckAAAAASUVORK5CYII=\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACcAAAAnCAYAAACMo1E1AAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAJ6ADAAQAAAABAAAAJwAAAAA+NMKoAAABtUlEQVRYCe2YWUoEQQyGR4+gzj64XEBRUc/h+CYiehgREbyIVxB99UkUFRfcDuB2ALX9At0QqlerugccKvBTqVTy55+Qh5mp1RwtCII1kGR9R+raqCsB9UEKR1o8JT0eLkNcnLWkiBdnO0g/OT852wnY1vmd85OznYBt3XDsHF87VsCW7RSkjvodsODCEauFcBl8gh+wrRO490GSrRp5B2HSO+e8frP2IVoCIiyyb5zNiBA/Vxw5+1FxeL5xzkUcVicEi+AjJNSHCNwQUs5Mcbzv6ULlv+LPWgkLGx8pMtP9IrAOUsXxtmsWGfdjF3FjkJ0ZhPoqAg91QPmnyk9yrwjWrcWF0xOB50nsDrFrahtOwqJiiMbBhYMYXXrDpRlxl3JCOAEudRcL/5aaVimCTBKI60B2xcbuKGqbnKXeadAAsjN/sXuSO6UKSSOjURPI7hSxB5K6aVyVxGnYArJDWfbIY68SAXmkNG4D2aUkeyI4mcdR6TsCOkB2Stszl6lKGxclR0gXyG6JvYDporUDyUNQD5yAmYE09E3+6wRG2BHnP/mq+vDD8eurqulk8frJZU0n6+0XgHLo6Yf95jUAAAAASUVORK5CYII=\"","module.exports = \"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACcAAAAnCAYAAACMo1E1AAAAAXNSR0IArs4c6QAAAERlWElmTU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAAJ6ADAAQAAAABAAAAJwAAAAA+NMKoAAAELklEQVRYCbWYy0uUURjGHSWzi2BaQRLOZHsRKoIwW7TIwv4AoUVESyVw0wX/gYIgaBN0WyTUJuy2aFHRoht0g6jACIuSLMtsIRRdtN8zzYzHd873fWec6YFn5pz3vLeZeb9z3jOpqnlgZmamDrOtcDvMwOYcl/E+Dj/AMTgMr8J7qVRqmvf/B5LqghfhFCwF4yifhu0Vzw6n6+FNWC6mcXAOpstOEid18BSU00riB84OJiWYilLAeBVrQ3BjhM4b5JfhLTgKVWeTcCVUDWZgF9wJl0MfLiDcQz1+9y16ZSTWBkehD9cQrvMaeoTo1kDV6mPow0OE+kDJQHEV9CX2HPmWZA9+DWxTsAd+ghZ3EdT6LXNSFFRjD6wl80twaaxx4CJ+WuBTaHE21gXaKn6LYwgiazPWYcQi/pbA6zYQ816vCQvaLuxTqW+soonlg+O3Hr6ALiaZNOZ1Cu8I7T6mGkv8KdGpLjgpcYBtK/wKXRyd44YVPU0WQcWP0RBMz3FYwgTbfSaw9sCWggsmOpJcXCssJgwwege/wG0Jqt5l7GrhCHQxkFVGoid0yl1hXMo+puSEP3AAllyj2OyFLh7mk+t2pYxHvB8xQoh+Prm8mysMGiLUvWL0m+DvvIPc+2oVs44YFzqSyoGOq0cEaAt1wvE1ge4do9+l5NYYoc7KcrEWB/dJcFcJjmzcjJLTIe1Ch3glsBgnao+OwwUBDt8bnWYlp+7DhbqLSkK7/m0StF+CjWHjZpNTa+1CbU+lsQmHT0iwM8bxN7PWoG9OPb+LsPbFtQgbv0YtrmRs3HElV/R1hsUK1vqJ5gHYyVMZt03Z8hpTcroluci4kzLHz7DfQFKH4XSCL7trfFByw8bI7ntmOWiqRI5AJaYEQ2DjDldRpB3QxWcmNSHepIOuPSF0TnaE2ud8pLFx8YtJg5xXQ90rXdhPERkLIze5k8wT2yzrDJuDbnDGNwo6TM6YRV1Ggg5w9JTcR9hdcFjCALtl0PZ0fQUXLLZD2wX3FBRiBtipjY+6+sVY/lvC9gh0McFkbuOAQEeNC92SWhK9l6GA/83wpxuUcX+RS4RpqC7UhW5JOiMrDvxmoK31t8gWeoOxYAsTUfaWVO81mKcQn0rspZw7ULO6I9YlCucdg/xQt6TWWMPARfzop7TfmOLsT3SB0iKovwgs9ETpMhJ/M4+IgF0DVPHbGkM0MxhhVixGeSXUXwQ+aJNVz99UbFksQS8NVS52u0CUxSCv3jqL3MtyBicIt7s4ZFbyh1e11jehug01EGp7VkD1bhmofz7boQ864g7p3PUtBslIshdOwkpCT2V88QdlhxKOGuFRaLcaRCVBG2w/9P6Mofl49XDaAnU31e0qFDrEb8A+OHfn90aZFUbW3KyKf0Sg1ayoQchA1Zio4J+h6k98Ba9TV/Nq/f8C6YqyPdXUNIsAAAAASUVORK5CYII=\""],"sourceRoot":""}