├── README.md
├── .firebaserc
├── public
├── 192x192.png
├── 384x384.png
├── 512x512.png
├── favicon.ico
├── index.html
└── manifest.json
├── src
├── App.test.js
├── reducers
│ ├── index.js
│ ├── story.js
│ └── comment.js
├── const
│ └── index.js
├── Default.js
├── App.css
├── actions
│ └── comment.js
├── components
│ ├── CommentItem.js
│ ├── Item.js
│ └── Comment.js
├── Jobs.js
├── Ask.js
├── Show.js
├── Newest.js
├── App.js
├── utils
│ └── scroll.js
├── Story.js
├── Container.js
├── registerServiceWorker.js
├── logo.svg
├── index.css
├── index.js
└── public
│ └── loading.js
├── firebase.json
├── .gitignore
└── package.json
/README.md:
--------------------------------------------------------------------------------
1 | # hackerNews-pwa
2 | hacker news pwa
3 |
--------------------------------------------------------------------------------
/.firebaserc:
--------------------------------------------------------------------------------
1 | {
2 | "projects": {
3 | "default": "hn-pwa-d8b2e"
4 | }
5 | }
6 |
--------------------------------------------------------------------------------
/public/192x192.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stephenkingsley/hackerNews-pwa/HEAD/public/192x192.png
--------------------------------------------------------------------------------
/public/384x384.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stephenkingsley/hackerNews-pwa/HEAD/public/384x384.png
--------------------------------------------------------------------------------
/public/512x512.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stephenkingsley/hackerNews-pwa/HEAD/public/512x512.png
--------------------------------------------------------------------------------
/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/stephenkingsley/hackerNews-pwa/HEAD/public/favicon.ico
--------------------------------------------------------------------------------
/src/App.test.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import ReactDOM from 'react-dom';
3 | import App from './App';
4 |
5 | it('renders without crashing', () => {
6 | const div = document.createElement('div');
7 | ReactDOM.render(, div);
8 | });
9 |
--------------------------------------------------------------------------------
/src/reducers/index.js:
--------------------------------------------------------------------------------
1 | import { combineReducers } from 'redux';
2 | import comment from './comment';
3 | import story from './story';
4 |
5 | const rootReducer = combineReducers({
6 | comment,
7 | story,
8 | });
9 |
10 | export default rootReducer;
11 |
--------------------------------------------------------------------------------
/src/const/index.js:
--------------------------------------------------------------------------------
1 | export const NEWS_LIST = 'NEWS_LIST';
2 | export const SHOW_LIST = 'SHOW_LIST';
3 | export const ASK_LIST = 'ASK_LIST';
4 | export const NEWEST_LIST = 'NEWEST_LIST';
5 | export const JOBS_LIST = 'JOBS_LIST';
6 |
7 | export const STORY = 'STORY';
8 |
--------------------------------------------------------------------------------
/src/Default.js:
--------------------------------------------------------------------------------
1 | import React, { Component, PropTypes } from 'react';
2 | import { Redirect } from 'react-router-dom';
3 |
4 | class Default extends Component {
5 | render() {
6 | return
7 | }
8 | }
9 |
10 | export default Default;
11 |
--------------------------------------------------------------------------------
/firebase.json:
--------------------------------------------------------------------------------
1 | {
2 | "hosting": {
3 | "public": "build",
4 | "rewrites": [{
5 | "source": "**",
6 | "destination": "/index.html"
7 | }],
8 | "ignore": [
9 | "firebase.json",
10 | "**/.*",
11 | "**/node_modules/**"
12 | ]
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/src/reducers/story.js:
--------------------------------------------------------------------------------
1 | import { STORY } from '../const';
2 |
3 | const initState = {};
4 |
5 | export default (state = initState, action) => {
6 | switch (action.type) {
7 | case STORY:
8 | return {
9 | state: action.data,
10 | };
11 | default:
12 | return state;
13 | }
14 | };
15 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # See https://help.github.com/ignore-files/ for more about ignoring files.
2 |
3 | # dependencies
4 | /node_modules
5 |
6 | # testing
7 | /coverage
8 |
9 | # production
10 | /build
11 |
12 | # misc
13 | .DS_Store
14 | .env.local
15 | .env.development.local
16 | .env.test.local
17 | .env.production.local
18 |
19 | npm-debug.log*
20 | yarn-debug.log*
21 | yarn-error.log*
22 |
--------------------------------------------------------------------------------
/src/App.css:
--------------------------------------------------------------------------------
1 | .App {
2 | text-align: center;
3 | }
4 |
5 | .App-logo {
6 | animation: App-logo-spin infinite 20s linear;
7 | height: 80px;
8 | }
9 |
10 | .App-header {
11 | background-color: #222;
12 | height: 150px;
13 | padding: 20px;
14 | color: white;
15 | }
16 |
17 | .App-intro {
18 | font-size: large;
19 | }
20 |
21 | @keyframes App-logo-spin {
22 | from { transform: rotate(0deg); }
23 | to { transform: rotate(360deg); }
24 | }
25 |
--------------------------------------------------------------------------------
/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 | HNPWA
10 |
11 |
12 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/public/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "short_name": "HN PWA",
3 | "name": "Hacker News PWA",
4 | "icons": [
5 | {
6 | "src": "favicon.ico",
7 | "sizes": "192x192",
8 | "type": "image/png"
9 | },
10 | {
11 | "src": "384x384.png",
12 | "sizes": "384x384",
13 | "type": "image/png"
14 | },
15 | {
16 | "src": "512x512.png",
17 | "sizes": "512x512",
18 | "type": "image/png"
19 | }
20 | ],
21 | "start_url": "./index.html",
22 | "display": "standalone",
23 | "theme_color": "#000000",
24 | "background_color": "#ffffff"
25 | }
26 |
--------------------------------------------------------------------------------
/src/actions/comment.js:
--------------------------------------------------------------------------------
1 | export const getData = (type, page) =>
2 | dispatch => {
3 | fetch(`https://node-hnapi.herokuapp.com/${type}?page=${page}`)
4 | .then(res => res.json())
5 | .then(data => {
6 | dispatch(receiveData(`${type.toUpperCase()}_LIST`, data));
7 | })
8 | };
9 |
10 | export const getItem = (id) =>
11 | dispatch => {
12 | fetch(`https://node-hnapi.herokuapp.com/item/${id}`)
13 | .then(res => res.json())
14 | .then(data => {
15 | dispatch(receiveData('STORY', data));
16 | })
17 | };
18 |
19 | const receiveData = (type, data) => {
20 | return {
21 | type, data,
22 | }
23 | };
24 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "hacker-news-pwa",
3 | "version": "0.1.3",
4 | "private": true,
5 | "dependencies": {
6 | "react": "^16.5.2",
7 | "react-dom": "^16.5.2",
8 | "react-redux": "^5.0.7",
9 | "react-router": "^4.3.1",
10 | "react-router-dom": "^4.3.1",
11 | "redux": "^3.6.0",
12 | "redux-thunk": "^2.3.0"
13 | },
14 | "devDependencies": {
15 | "react-scripts": "2.0.5"
16 | },
17 | "scripts": {
18 | "start": "react-scripts start",
19 | "build": "react-scripts build",
20 | "deploy": "firebase deploy --only hosting",
21 | "push": "npm run build && npm run deploy",
22 | "test": "react-scripts test --env=jsdom",
23 | "eject": "react-scripts eject"
24 | },
25 | "browserslist": [
26 | ">0.2%",
27 | "not dead",
28 | "not ie <= 11",
29 | "not op_mini all"
30 | ]
31 | }
32 |
--------------------------------------------------------------------------------
/src/components/CommentItem.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 |
3 | export default (props) => {
4 | return (
5 | reply(props.id)}
11 | >
12 |
17 | {props.user}
18 |
19 |
20 |
25 | {props.timeAgo}
26 |
27 |
30 |
31 | );
32 | };
33 |
34 | const reply = (id) => {
35 | window.location.href = `https://news.ycombinator.com/reply?id=${id}`;
36 | };
37 |
--------------------------------------------------------------------------------
/src/reducers/comment.js:
--------------------------------------------------------------------------------
1 | import { NEWS_LIST, SHOW_LIST, ASK_LIST, NEWEST_LIST, JOBS_LIST } from '../const';
2 |
3 | const initState = {
4 | news: [],
5 | show: [],
6 | ask: [],
7 | newest: [],
8 | jobs: [],
9 | };
10 |
11 | export default (state = initState, action) => {
12 | switch (action.type) {
13 | case NEWS_LIST:
14 | return {
15 | ...state,
16 | news: action.data,
17 | };
18 | case SHOW_LIST:
19 | return {
20 | ...state,
21 | show: action.data,
22 | };
23 | case ASK_LIST:
24 | return {
25 | ...state,
26 | ask: action.data,
27 | };
28 | case NEWEST_LIST:
29 | return {
30 | ...state,
31 | newest: action.data,
32 | };
33 | case JOBS_LIST:
34 | return {
35 | ...state,
36 | jobs: action.data,
37 | };
38 | default:
39 | return state;
40 | }
41 | };
42 |
--------------------------------------------------------------------------------
/src/Jobs.js:
--------------------------------------------------------------------------------
1 | import React, { Component, PropTypes } from 'react';
2 | import { connect } from 'react-redux';
3 | import { getData } from './actions/comment';
4 | import Scroll from './utils/scroll';
5 | import Container from './Container';
6 |
7 | class Jobs extends Container {
8 | componentWillMount() {
9 | const page = this.props.match.params.page;
10 | this.props.dispatch(getData('jobs', page));
11 | }
12 |
13 | componentWillReceiveProps(nextProps) {
14 | const newPage = nextProps.match.params.page;
15 | const page = this.props.match.params.page;
16 | if (newPage !== page) {
17 | this.props.dispatch(getData('jobs', newPage));
18 | }
19 | }
20 |
21 | render() {
22 | const { jobs } = this.props;
23 | return
24 | {this.renderList(jobs)}
25 | {this.renderPage('jobs')}
26 |
;
27 | }
28 | }
29 |
30 | const mapStateToProps = state => state.comment;
31 |
32 | export default connect(mapStateToProps)(Jobs);
33 |
--------------------------------------------------------------------------------
/src/Ask.js:
--------------------------------------------------------------------------------
1 | import React, { Component, PropTypes } from 'react';
2 | import { connect } from 'react-redux';
3 | import { getData } from './actions/comment';
4 | import Scroll from './utils/scroll';
5 | import Container from './Container';
6 | import Item from './components/Item';
7 |
8 | class Ask extends Container {
9 | componentWillMount() {
10 | const page = this.props.match.params.page;
11 | this.props.dispatch(getData('ask', page));
12 | }
13 |
14 | componentWillReceiveProps(nextProps) {
15 | const newPage = nextProps.match.params.page;
16 | const page = this.props.match.params.page;
17 | if (newPage !== page) {
18 | this.props.dispatch(getData('ask', newPage));
19 | }
20 | }
21 |
22 | render() {
23 | const { ask } = this.props;
24 | return
25 | {this.renderList(ask)}
26 | {this.renderPage('ask')}
27 |
;
28 | }
29 | }
30 |
31 | const mapStateToProps = state => state.comment;
32 |
33 | export default connect(mapStateToProps)(Ask);
34 |
--------------------------------------------------------------------------------
/src/Show.js:
--------------------------------------------------------------------------------
1 | import React, { Component, PropTypes } from 'react';
2 | import { connect } from 'react-redux';
3 | import { getData } from './actions/comment';
4 | import Scroll from './utils/scroll';
5 | import Container from './Container';
6 |
7 | class Show extends Container {
8 | componentWillMount() {
9 | const page = this.props.match.params.page;
10 | this.props.dispatch(getData('show', page));
11 | }
12 |
13 | componentWillReceiveProps(nextProps) {
14 | const newPage = nextProps.match.params.page;
15 | const page = this.props.match.params.page;
16 | if (newPage !== page) {
17 | this.props.dispatch(getData('show', newPage));
18 | }
19 | }
20 |
21 | render() {
22 | const { show, match } = this.props;
23 | const page = Number(match.params.page);
24 | return
25 | {this.renderList(show)}
26 | {this.renderPage('show')}
27 |
;
28 | }
29 | }
30 |
31 | const mapStateToProps = state => state.comment;
32 |
33 | export default connect(mapStateToProps)(Show);
34 |
--------------------------------------------------------------------------------
/src/Newest.js:
--------------------------------------------------------------------------------
1 | import React, { Component, PropTypes } from 'react';
2 | import { connect } from 'react-redux';
3 | import { getData } from './actions/comment';
4 | import Scroll from './utils/scroll';
5 | import Container from './Container';
6 |
7 | class Newest extends Container {
8 | componentWillMount() {
9 | const page = this.props.match.params.page;
10 | this.props.dispatch(getData('newest', page));
11 | }
12 |
13 | componentWillReceiveProps(nextProps) {
14 | const newPage = nextProps.match.params.page;
15 | const page = this.props.match.params.page;
16 | if (newPage !== page) {
17 | this.props.dispatch(getData('newest', newPage));
18 | }
19 | }
20 |
21 | render() {
22 | const { newest, match } = this.props;
23 | const page = Number(match.params.page);
24 | return
25 | {this.renderList(newest)}
26 | {this.renderPage('newest')}
27 |
;
28 | }
29 | }
30 |
31 | const mapStateToProps = state => state.comment;
32 |
33 | export default connect(mapStateToProps)(Newest);
34 |
--------------------------------------------------------------------------------
/src/App.js:
--------------------------------------------------------------------------------
1 | import React, { Component, PropTypes } from 'react';
2 | import { connect } from 'react-redux';
3 | import clone from 'lodash/clone';
4 | import { getData } from './actions/comment';
5 | import Scroll from './utils/scroll';
6 | import Container from './Container';
7 | import Item from './components/Item';
8 |
9 | class App extends Container {
10 | componentWillMount() {
11 | const page = this.props.match.params.page;
12 | this.props.dispatch(getData('news', page));
13 | }
14 |
15 | componentWillReceiveProps(nextProps, nextState, context) {
16 | const newPage = nextProps.match.params.page;
17 | const page = this.props.match.params.page;
18 | if (newPage !== page) {
19 | this.props.dispatch(getData('news', newPage));
20 | }
21 | }
22 |
23 | render() {
24 | console.log(this.props);
25 | const { news } = this.props;
26 | return
27 | {this.renderList(news)}
28 | {this.renderPage()}
29 |
;
30 | }
31 | }
32 |
33 | const mapStateToProps = state => {
34 | console.log(state);
35 | return state.comment
36 | };
37 |
38 | export default connect(mapStateToProps)(App);
39 |
--------------------------------------------------------------------------------
/src/components/Item.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import {
3 | Link,
4 | Redirect,
5 | } from 'react-router-dom'
6 |
7 | export default class Item extends Component {
8 | jumpUrl(event, url) {
9 | event.preventDefault();
10 | try {
11 | const newUrl = new URL(url);
12 | // window.location.href = url;
13 | window.open(url);
14 | } catch (e) {
15 | const id = url.match(/id=([0-9]*)/, 'g');
16 | }
17 | }
18 |
19 | render() {
20 | const { data, index, page } = this.props;
21 | return (
22 |
23 |
26 |
27 |
28 |
29 | { data.points ? `${data.points} by ${data.user} |` : ' ' }
30 | {' ' + data.time_ago} |
31 | {data.comments_count > 0 ? ` ${data.comments_count} comments` : ' discuss'}
32 |
33 |
34 |
35 |
36 | );
37 | }
38 | }
39 |
--------------------------------------------------------------------------------
/src/components/Comment.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import CommentItem from './CommentItem';
3 |
4 | export default class Comment extends Component {
5 | constructor() {
6 | super();
7 | this.element = [];
8 | }
9 |
10 | renderChildren(data, type = 1) {
11 | if (data.comments) {
12 | data.comments.forEach((ele, key) => {
13 | this.element.push(
14 |
22 | );
23 | this.renderChildren(ele, key + 2);
24 | });
25 | }
26 | }
27 |
28 | renderComponent(data) {
29 | this.element = [
30 |
37 | ];
38 | this.renderChildren(data);
39 | return this.element;
40 | }
41 |
42 | render() {
43 | return (
44 |
45 | {this.renderComponent(this.props.data)}
46 |
47 | );
48 | }
49 | }
50 |
51 | //
52 |
--------------------------------------------------------------------------------
/src/utils/scroll.js:
--------------------------------------------------------------------------------
1 | let isRunning = false;
2 | /**
3 | * @parma {func} callback - 执行的回调,一定要是promise
4 | * @parma {object} options - 执行scroll事件的一些配置
5 | * @parma {num} options.bottom - 当滑到距离底部的距离时执行回调
6 | */
7 | export default (cb, options = {}) => {
8 | const loadMore = () => {
9 | window.requestAnimationFrame(() => {
10 | let bottom = getWindowHeight() / 3;
11 | if (options && Object.hasOwnProperty.call(options, 'bottom')) {
12 | bottom = options.bottom;
13 | }
14 |
15 | if (getScrollTop() + getWindowHeight() >= getScrollHeight() - bottom) {
16 | cb();
17 | }
18 | });
19 | };
20 | window.addEventListener('scroll', loadMore, false);
21 | };
22 |
23 | const getScrollTop = () => {
24 | let scrollTop = 0;
25 | let bodyScrollTop = 0;
26 | let documentScrollTop = 0;
27 | if (document.body) {
28 | bodyScrollTop = document.body.scrollTop;
29 | }
30 | if (document.documentElement) {
31 | documentScrollTop = document.documentElement.scrollTop;
32 | }
33 | scrollTop = (bodyScrollTop - documentScrollTop > 0) ? bodyScrollTop : documentScrollTop;
34 | return scrollTop;
35 | };
36 |
37 | const getScrollHeight = () => {
38 | let scrollHeight = 0;
39 | let bodyScrollHeight = 0;
40 | let documentScrollHeight = 0;
41 | if (document.body) {
42 | bodyScrollHeight = document.body.scrollHeight;
43 | }
44 | if (document.documentElement) {
45 | documentScrollHeight = document.documentElement.scrollHeight;
46 | }
47 | scrollHeight = (bodyScrollHeight - documentScrollHeight > 0) ?
48 | bodyScrollHeight : documentScrollHeight;
49 | return scrollHeight;
50 | };
51 |
52 | const getWindowHeight = () => {
53 | let windowHeight = 0;
54 | if (document.compatMode === 'CSS1Compat') {
55 | windowHeight = document.documentElement.clientHeight;
56 | } else {
57 | windowHeight = document.body.clientHeight;
58 | }
59 | return windowHeight;
60 | };
61 |
--------------------------------------------------------------------------------
/src/Story.js:
--------------------------------------------------------------------------------
1 | import React, { Component, PropTypes } from 'react';
2 | import { connect } from 'react-redux';
3 | import { getItem } from './actions/comment';
4 | import Comment from './components/Comment';
5 |
6 | class Story extends Component {
7 | componentWillMount() {
8 | const id = this.props.match.params.id;
9 | this.props.dispatch(getItem(id));
10 | }
11 |
12 | reply(id) {
13 | window.location.href = `https://news.ycombinator.com/item?id=${id}`;
14 | }
15 |
16 | renderDescription(data) {
17 | if (data && Object.hasOwnProperty.call(data, 'title')) {
18 | return (
19 |
20 |
23 |
this.reply(data.id)}>
24 | - points: {data.points}
25 | - comments_count: {data.comments_count}
26 | - time_ago: {data.time_ago}
27 | -
33 | reply
34 |
35 |
36 |
37 | );
38 | }
39 | }
40 |
41 | renderComments(data) {
42 | if (data && Object.hasOwnProperty.call(data, 'comments') && data.comments.length > 0) {
43 | return (
44 |
45 | {data.comments.map((ele, key) =>
46 | )}
47 |
48 | );
49 | }
50 | return null;
51 | }
52 |
53 | render() {
54 | const { state } = this.props;
55 | return (
56 |
57 | {this.renderDescription(state)}
58 | {this.renderComments(state)}
59 |
60 | );
61 | }
62 | }
63 |
64 | const mapStateToProps = state => state.story;
65 |
66 | export default connect(mapStateToProps)(Story);
67 |
--------------------------------------------------------------------------------
/src/Container.js:
--------------------------------------------------------------------------------
1 | import React, { Component, PropTypes } from 'react';
2 | import { Link } from 'react-router-dom';
3 | import Item from './components/Item';
4 | import { loadingPic } from './public/loading';
5 |
6 | export default class Container extends Component {
7 | constructor() {
8 | super();
9 | this.state = {
10 | page: 1,
11 | };
12 | }
13 |
14 | componentDidMount() {
15 | window.scrollTo(0, 0);
16 | }
17 |
18 | scrollTop() {
19 | window.scrollTo(0, 0);
20 | }
21 |
22 | renderItem(data) {
23 | if (data && data.length > 0) {
24 | return data.map((ele, index) => (
25 |
26 | ));
27 | }
28 | }
29 |
30 | renderLoading() {
31 | const { match } = this.props;
32 | const page = Number(match.params.page);
33 | let element;
34 | if (page > 1) {
35 | element = (
36 |
37 | content is null, please read prev page!
38 |
39 | );
40 | } else {
41 | element = (
42 |
43 |

44 |
45 | );
46 | }
47 | return element;
48 | }
49 |
50 | renderList(data) {
51 | return (
52 |
53 | {
54 | (data && data.length) > 0 ?
55 |
56 | {this.renderItem(data)}
57 |
:
58 | this.renderLoading()
59 | }
60 |
61 | );
62 | }
63 |
64 | renderPage(type) {
65 | const { match } = this.props;
66 | const page = Number(match.params.page);
67 | let newTypePrve;
68 | let newTypeNext;
69 | if (type) {
70 | newTypePrve = `/${type}/${(page - 1) > 1 ? page - 1 : 1}`
71 | newTypeNext = `/${type}/${page + 1}`;
72 | } else {
73 | newTypePrve = `/${(page - 1) > 1 ? page - 1 : 1}`
74 | newTypeNext = `/${page + 1}`;
75 | }
76 | return (
77 |
78 | this.scrollTop()}>{'< prev --- '}
79 | {page}
80 | this.scrollTop()}>{' --- next >'}
81 |
82 | );
83 | }
84 | }
85 |
--------------------------------------------------------------------------------
/src/registerServiceWorker.js:
--------------------------------------------------------------------------------
1 | // In production, we register a service worker to serve assets from local cache.
2 |
3 | // This lets the app load faster on subsequent visits in production, and gives
4 | // it offline capabilities. However, it also means that developers (and users)
5 | // will only see deployed updates on the "N+1" visit to a page, since previously
6 | // cached resources are updated in the background.
7 |
8 | // To learn more about the benefits of this model, read https://goo.gl/KwvDNy.
9 | // This link also includes instructions on opting out of this behavior.
10 |
11 | export default function register() {
12 | if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {
13 | window.addEventListener('load', () => {
14 | const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;
15 | navigator.serviceWorker
16 | .register(swUrl)
17 | .then(registration => {
18 | registration.onupdatefound = () => {
19 | const installingWorker = registration.installing;
20 | installingWorker.onstatechange = () => {
21 | if (installingWorker.state === 'installed') {
22 | if (navigator.serviceWorker.controller) {
23 | // At this point, the old content will have been purged and
24 | // the fresh content will have been added to the cache.
25 | // It's the perfect time to display a "New content is
26 | // available; please refresh." message in your web app.
27 | console.log('New content is available; please refresh.');
28 | } else {
29 | // At this point, everything has been precached.
30 | // It's the perfect time to display a
31 | // "Content is cached for offline use." message.
32 | console.log('Content is cached for offline use.');
33 | }
34 | }
35 | };
36 | };
37 | })
38 | .catch(error => {
39 | console.error('Error during service worker registration:', error);
40 | });
41 | });
42 | }
43 | }
44 |
45 | export function unregister() {
46 | if ('serviceWorker' in navigator) {
47 | navigator.serviceWorker.ready.then(registration => {
48 | registration.unregister();
49 | });
50 | }
51 | }
52 |
--------------------------------------------------------------------------------
/src/logo.svg:
--------------------------------------------------------------------------------
1 |
8 |
--------------------------------------------------------------------------------
/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | padding: 0;
4 | font-family: sans-serif;
5 | }
6 |
7 | a {
8 | text-decoration: none;
9 | max-width: 100%;
10 | word-break: break-all;
11 | }
12 |
13 | a:link {
14 | color: #333333;
15 | }
16 | a:active {
17 | color: #333333;
18 | }
19 | a:visited {
20 | color: #333333;
21 | }
22 | a:hover {
23 | color: #333333;
24 | }
25 |
26 | ul {
27 | list-style: none;
28 | }
29 |
30 | ol {
31 | display: block;
32 | list-style-type: decimal;
33 | -webkit-margin-before: 1em;
34 | -webkit-margin-after: 1em;
35 | -webkit-margin-start: 0px;
36 | -webkit-margin-end: 0px;
37 | -webkit-padding-start: 40px;
38 | }
39 |
40 | .topbar {
41 | position: fixed;
42 | width: 100%;
43 | top: 0;
44 | z-index: 100;
45 | height: 48px;
46 | padding: 0 16px;
47 | background-color: #222;
48 | display: flex;
49 | align-items: center;
50 | }
51 |
52 | .topbar > ul {
53 | list-style: none;
54 | display: flex;
55 | align-items: center;
56 | height: 100%;
57 | max-width: 1200px;
58 | overflow: hidden;
59 | margin-left: -20px;
60 | }
61 |
62 | .topbar > ul > li {
63 | margin-right: .6rem;
64 | color: #FFFFFF;
65 | }
66 |
67 | .topbar > ul > li > a {
68 | color: #FFFFFF;
69 | text-decoration: none;
70 | }
71 |
72 | .content {
73 | margin-top: 48px;
74 | }
75 |
76 | .content li {
77 | display: flex;
78 | flex-wrap: wrap;
79 | align-items: center;
80 | align-items: center;
81 | margin-left: -1.2rem;
82 | width: 100%;
83 | overflow: hidden;
84 | height: 4rem;
85 | border-bottom: 1px solid #ebebeb;
86 | padding: 0.3rem 0;
87 | }
88 |
89 | .content li div {
90 | width: 100%;
91 | }
92 |
93 | .content li > div:last-child {
94 | color: #999999;
95 | font-size: 0.8rem;
96 | }
97 |
98 | .item-footer {
99 | text-decoration: underline;
100 | }
101 |
102 | .story-top {
103 | border-bottom: 1px solid #ebebeb;
104 | }
105 |
106 | .story-title {
107 | font-size: 1.2rem;
108 | margin-left: 1.2rem;
109 | padding-top: 1rem;
110 | font-weight: bold;
111 | }
112 |
113 | .story-ol > li {
114 | height: 1.2rem;
115 | border-bottom: 0px;
116 | padding: 0px;
117 | color: #999999;
118 | }
119 |
120 | .comment-item {
121 | border-bottom: 1px solid #ebebeb;
122 | padding: 1rem;
123 | font-size: 0.8rem;
124 | max-width: 100%;
125 | }
126 |
127 | .footer-page {
128 | width: 100%;
129 | height: 32px;
130 | text-align: center;
131 | line-height: 16px;
132 | }
133 |
134 | .loading {
135 | height: 100%;
136 | width: 100%;
137 | display: flex;
138 | justify-content: center;
139 | align-items: center;
140 | }
141 |
142 | .loading > img {
143 | width: 200px;
144 | height: 200px;
145 | }
146 |
147 | .one-line-ellipsis {
148 | overflow: hidden;
149 | text-overflow: ellipsis;
150 | white-space: nowrap;
151 | }
152 |
--------------------------------------------------------------------------------
/src/index.js:
--------------------------------------------------------------------------------
1 | import querystring from 'querystring';
2 |
3 | import React from 'react';
4 | import ReactDOM from 'react-dom';
5 |
6 | import { createStore, applyMiddleware } from 'redux'
7 | import { Provider } from 'react-redux'
8 | import thunk from 'redux-thunk'
9 | import reducer from './reducers'
10 |
11 | import {
12 | BrowserRouter as Router,
13 | Route,
14 | Link,
15 | Redirect
16 | } from 'react-router-dom'
17 |
18 | import Default from './Default';
19 | import App from './App';
20 | import Newest from './Newest';
21 | import Show from './Show';
22 | import Ask from './Ask';
23 | import Jobs from './Jobs';
24 | import Story from './Story';
25 |
26 | import registerServiceWorker from './registerServiceWorker';
27 |
28 | import './index.css';
29 |
30 | const middleware = [ thunk ]
31 |
32 | const store = createStore(
33 | reducer,
34 | applyMiddleware(...middleware)
35 | )
36 |
37 | const defaultChannelList = [
38 | 'news', 'newest', 'show', 'ask', 'jobs'
39 | ];
40 |
41 | const changeChannel = (event) => {
42 | const channelList = document.querySelectorAll('.channel > a');
43 | if (channelList && channelList.length > 0) {
44 | for (let i = 0; i < channelList.length; i += 1) {
45 | channelList[i].setAttribute('style', '');
46 | }
47 | }
48 | event.target.setAttribute('style', 'border-bottom: 4px solid rgb(255, 102, 0)');
49 | };
50 |
51 | const initChannel = () => {
52 | const path = window.location.pathname.match(/\/([a-z]*)\/([0-9]*)/, 'g');
53 | let channel = 'news';
54 | if (path) {
55 | channel = path[1];
56 | }
57 | const index = defaultChannelList.indexOf(channel);
58 | const channelList = document.querySelectorAll('.channel > a');
59 | index > -1 && channelList[index].setAttribute('style', 'border-bottom: 4px solid rgb(255, 102, 0)');
60 | };
61 |
62 | ReactDOM.render(
63 |
64 |
65 |
66 |
67 |

75 |
76 | - changeChannel(event)}>NEWS
77 | - changeChannel(event)}>NEW
78 | - changeChannel(event)}>SHOW
79 | - changeChannel(event)}>ASK
80 | - changeChannel(event)}>JOBS
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 | , document.getElementById('root'));
94 |
95 | window.addEventListener('popstate', () => initChannel());
96 |
97 | initChannel();
98 | registerServiceWorker();
99 |
--------------------------------------------------------------------------------
/src/public/loading.js:
--------------------------------------------------------------------------------
1 | export const loadingPic = 'data:image/gif;base64,R0lGODlhxgDGAPcAAAAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKi0sKzYxLT00L0M3MEc6MUs8Mk49M1E+M1RAM1VANFdBNFdBNFhBNFhBNFhBNFhBNFhBNFhBNFhBNFhBNFhBNFhBNFhBNFhCNFhCNFhCNFhCNFhCNFhCNFhCNFhCNFlCNVpDNlpENlpEN1pGOlhKQVZPSlRUU1JYWlBcYU1ha0lndkhqe0dsf0dtgUdtgUdtgUdtgUdtgUdtgUdtgUdtgUdtgUdtgUdtgUdtgUdugkdugkdugkdugkdugkdugkhvg0pwhExyhU50h1J2iVZ6jFx+kF+BkmGCk2OElWWFlmaGl2eHmGqHlW2GknCFjnOFinaEh3mCg3yBf39/fIN9eIZ7dYh5cZB1a5xxZKxsWrdoU8JkTMphR9NeQtpcPt5bO+BaOuFaOuFaOuFaOuFbO+FbO+FcPOFdPeFfPuFhQOBmQ+BrRt9wSt91Td56Ud1+UtuDUtiIUtWMUNOOTtKOTNKOTNKOTNKPS9KRR9KbOdKhMNKmKNKoJNKpI9KqI9KqI9OsKdWwNdiyUdivX9mybNe2fdW6kNO8mNPBodjLsd/VweLYyOXd0evn4+7r5/Lw7fTx7/b08fv59/79/P7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJBADfACwAAAAAxgDGAAAI/gC/CRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17MuLHjx5AjS55MubJlorpo0bpj5w6tW70ul6R1prTp0m5uiQ6p687p16VphV7NsZcb2Ljv0OboGjduWrsz3vLt242u4BfhEPetG3nF5b7tOKc4HDru6RNJW4eNS7KtWrFq/h3PqH376e6OebVSxb69KlizK1Y3b/pxLVbu87OydZG+6eaMvZLfgOzVYpFy/gGoWC0ENjjeRPNtZxxjvODX4ICtWNTbdsAFeGGDBlLUC4LQKajYhw1mWFFr0MnWmC4oEsgKRrTcBhscqjnGYIwD8oKRLrds1tln8TUWC48D8ocdRLYgmd+SEfHiZHszQgmRhU6+YiVEsEypSohbNtTLekjCEiZEMPLISpFnMnQfiqw82KZD6l0I35wT1fIKlq3AoiSeFfXyJ6CEFmrodLfIAkgURgiixyw+HsoQL4AYYemllj7RoaQI2cIopqAaAUiknBJ0S6ioilpqQVKkiuqm/qXK4iqqT6BX6qypyrLqqbiGKsiqtPQa6hOr6iFsqKQeKuuxmALL7KVQrIrLs5YGsuo3T1A7y7XBMgtFspwGwmyOe+VC7ky8ZNurrnn1IgssoMQLyiux5IKuILM+sW1etngi77/xwgrTLOqCKoitd8kC8MLz7oKuLbP0IYgsn+1FC8MMm3ntN7v4i/HCAkv6yscMe+JwqbuQjPG+nNqicsarzvLywlqWCu/MAK+qMM7yurJqLTzLqzGnuQQdL8ucumL0uZLeEjS7F/GSKCexzMI0ZDu/7AqbEvHCSSNgh91IJUg/1svIKntydUS1VCL2241wAq5jMn8My8kVzQL3vN6VzN1YLmj/60rIEuXi9t5wc2LZLbVYzTVFmyCOOOGF6i0539fGcjniCB8a+eZwUw4o6HvHsirpcA8t6SWoi122oV+3DvagysoOtt+E8nI46qZfW0vrl+AOO+q0l+r15pWIzmnbiG9i78YG8TILLJmMvUksykOv/fbcd+/99+CHL/745Jdv/vnop6/++uy37/778Mcv//z012///fjnr//+/Pfv//8ADKAAB0jAAhrwgAhMoAIXyMAGli8gACH5BAkEANkALAAAAADGAMYAhwAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKi4sKzgxLUI2L047MVY+MlpAM11BM15CM2BCM2BCNGBCNGBCNGBCNGBCNGBCNGBCNGBCNGBCNGBCNGBDNGFDNGFDNWJENmJFN2JGOGFIPF5NRVpUUVZaXFNdY1Bhak1kcEtndkhqfEhqfEhqfEhqfEhqfEhqfEhrfEhrfEhrfUhrfUlsfkxugE5wgVVygFx1f2N3fm9+f3aDf32GfI2NcZiSaKCUYKWWV6+ZRrqeOsKjMMimKcmmKMmmKMmmKMqnKMqnK8umL82lNM6jOc+hPdGcRNGZRtKXR9KUSNORSdOQSdOPSdOOSNSKSNaDRtl3Qt1pPt9hPOBeO+BdO+BdO+BdO+BdO+BdO+BdO+BeO+BfPOBgPuBiP+FmQuFrR+FzTuF7VuOJZOSYc+ashue+lunEn+nJpOrNqOrQrOvRsOzStO3Ut+3Xu+7Yvu7awvDcyOzczfPh0vTl2PXp3/bs5fbu5/bv6vbw7Pbx7fbz7/b08Pb18vb28/b28/f4+P7+/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+ALMJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDMnRJXpSxcqW7pg2qRZ5KYsVFKrTu0FVemOqLysnp06C+nXGmXT3v0JN8ZNu4Nz8W1RFOrguy8Rp3gJOfLKqDiB2vjZOe/Il+C8UcO9DZxIGLX+WN99uzGqR9zTq4fTqSKq8bvBONbURr399JQqwqetnDGq+vcF2N5EXOy3WnmKoRdggHC4JpFuBlIhCmOXLGjhIxNlEiEVWTQGh4ULvkFRgQYimBiAIN7nYESfGOiFeSkuqAlz8GWxomKaxBgghhRlclxwXdyoGCg63tcfRaJUN1sWmURWpH3TXfTJJpd08UUmJjr24ZNqtLHcRAo+yeOXEW2pYxtCktlQJ08eqSZEkeg45psRabLdgm24SWdE56GY3iNp7ikRKJo8ckmUgiaq6KKMNuqoTKY8OpEpjnxhxA8/HPGFI5I2hEkRmIYa6hFZdiqQKV+IqmqonJpaUBj+q8b6Q6uuZrOJrLEW0ZurpoCK66pf1ErJr7KWyiisxK6an6mpJqtqGK46C6yrl0obarDMWhsqtHqFwkkkkVziSUzIamtsXJrIUce67NYBnku3aktEpHad1+69dTQybkvNSksrXajAge/AM7JkChHSYmuXIwMPLEegJsVLLBG71qVJww3/q9ImR/z6Bb12zYFxw5y8VK6oRGhMFycjN/zuS5tQEkYYlJwr1yUtD6xyo4/kjK8crjLs872uRjJ0u424evHR6875aChMr/typ0IPPUcotYYi8tB6doqzzztPtIkkm4BsmdEtOwLxQ48oAsjbbyviiNmTeSLwwHMsW1HSJ4vA7ffbidhsHiWO3D2HI49gbVElfzf+ttPQKY5RJ45XjkmtAvVdeeOJ0P3oI5tXnrSrjITueCK1ImK64xU/+snqjgu+5yawNw45o6/X7rfse6qu+9ueN1r674jUyvjvYQuvuyLBO/qJ76vzrmgl0G8uCeYEfTK844sMiD1Bkmz/NiPJf5/NlN6br/767Lfv/vvwxy///PTXb//9+Oev//789+///wAMoAAHSMACGvCACEygAhfIwAY68IEQjKAEJ0jBClrwghjMoAY3yMEOjiUgACH5BAkEANUALAAAAADGAMYAhwAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKi4sKzYwLUM1L0w5MVQ8Mlk+Ml1AM2BBM2NCM2VCNGdDNGdDNGhDNGhDNGhDNGhDNGhDNGhDNGhDNGhDNGhDNGhDNGhDNGhDNGhDNGhENGlENGlFNWpFNWpGNmpHN2pHOGpKPWVQSF9WU1xaW1VdYlFhaUxlckhoeEhoeEhoeEhoeEhoeEhoeEhpeUhpeUlqeUlqelJvfVlzgF52gWZ6gHB/fICGeJaPaaSWXqqZVbCbTredQb6gNcCiMMGiLsKiLsKiLsOhL8SgMsedNc2XPs+VQNCUQtGTRNKSRNORRdOQRdOPRdSLRNeBQtl4QNxrPt5nPd9iPN9gPN9gPN9gPN9gPN9gPN9gPN9gPN9hPd5mQd1uSdx8VduGXtqTatmedNijd9mofdmvhNq0itq2jdq5kdu/mN7Dn+HJqOPOsOLUu+raxO7gzfDj0/Ll1vPm2PTn2vTo3PXq3/Tr4PTs4vTu5vXx7Pj18/j29Pn49fn49vz8+v79/P7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AKsJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3ilqc0lRlcJ8wYLFS5hKnT17BDWatGvSXSqp5ljptW3XYVLPtlj7tu8wuy2G6uK7uGzJpCg5WqTmzaJJlzCCKV68i27Hl96o2c59+yJSFUH+Uad+vDEpR93Tb29jiWLv8bfFPEavvn50ie/hvwbj2FL9/2+AF9F0+t1mXhv//eeIRGEUaJsXjUmSYIICPpSfg8Ax1siE/933kCUOvlaeYtpxqN4kEYnCRYikgdKYifU1gh+LGTIGo3oLSkSgflxcpxhzN3JHyUShrKhfe47RF6QaHqbYIHVfuPjYJEuq0cZFlRhp24iPlXgjihiBUkklYlQi5WSbBLlIcBZJaGIbZ7I5kSUIJrhInHJOBAqQJ+ap0SaUSLLIIpJcUqGfiCaq6KKMNuroo5A6BpqPkTZEJhNFZMqEGENWupAoYmQq6qhifOIpQpUsMeqqmS7R6an+A32iKqusLmEqrAKFSiutTuBaDSS7BgsJrroGy2qvsBobLF+dUPLIIoo4MgkmLmGi7K5c0kXKI3R06223i3TCUiXX0jrsXZgo8u263YKZErnlrpptXJ2way8d7qIU76qUwkWKuveyK25KTuyr6V2RBGyvIoeWNIbBRchXFykK3/uqSaJgGu8S/b6FScX2RqISvOXOC9ckILPLyEoPXyuxXY2kzO64s9K6hMlxcSvzty2BSqsYHctFyc7ervwSJpVAQgm1fH1MNB0in0rx0zg3ivLOa/q6yM4D41pvyvl6vbXCF1sUdGWkJGwvI6FcRIkiiAAidyKQNIlZJ5VMwgjJI48sfZEoicgt+OCS+FqQJYYMrrjciGxieDWbLC45IIec7eghk0v+iK+SZD653ZEm7vniicAKyuiSIwLrJahLDmvnrSsOuqOUxK44no+ybrvchuC6O+O4xr172JFGbnvlnNvuuOGYo17449XAPrkhSEIPefOKJ2I5rKJcIskj0Fkv/vjkl2/++einr/767Lfv/vvwxy///PTXb//9+Oev//789+///wAMoAAHSMACGvCACEygAhfIwAY68IEQjKAEJ0jBClpwIQEBACH5BAkEANQALAAAAADGAMYAhwAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKi8sKzgwLUY2MFU8Ml8/M2VCNGlDNG1ENG5FNG9FNHBFNXBFNXBFNXBFNXBFNXBFNXBFNXBFNXBFNXBGNXBGNXBGNXBGNW9GNm5HOGxKPmVPRl5UUVZbX1JeZE9hakxjb0pkcUllc0llc0llc0llc0llc0llc0llc0llc0lmc0lmc0lmc0tmc05mcVZlbWZkZnhkX41jV55jUa5jTMNjRddjP9xjPd1jPd5jPd5jPd5jPd5jPd5jPd5jPd5jPd5jPd5lPd1pPdxuPth/QNaIQdSPQdOTQtOTQtOUQtOUQtKUQc+WQMeZO8CdN7ufNLqfNLqfNLqfNLufNbyfNr2fOcGgPsahSM+lWtesbtixgda0kNW4mti6oNu9puDBquPFr+PItuLNvt/Pw9/RxuLUyOnay+3fz/Dh0PPk0fPl0/Tm1fTn1fTn1vXn1/Xn2fbo2vbp3Pfs3/jt4vr07Pv17fz69/38+v79/P7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AKkJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3swZMihIoDqPdLQlC5XTWQw5Et3R05bTsGNvCW0ZlKREhAglkkT7oiMssYOfxrKasiE+yJMjL3TRE3DhwrF4kpxJkPLrfARlqvgaOvQtkTP+YR/PR9LEQ97TN3oMKhB57IF6P9SS3jt4x4Xej2cesX56x+LpN952Dz3in3fmMbaIgOMlApEjB0JX3GL5MXgdfw4ZGGFwjzQ2iIXXDQIRKBsG59iHICYXSESmlUiFFo4RkmJyIkKEnouHOJbIjMgZEhEoz0WYhXyKScJjeRJpGGGHj1mXoiAU3ehfjpB1AkiKBE70W3rETbajhT5aBIqUsR1CJGTHCRhmRpI4cogjCV5WHXmBZMmaRokUguIghSRy5p2ABirooIQWauihiCaq6KKMSuWJI45s0mhEm3TBBRCYAkEEFxNOmtAhRGQqKqaFTOfpQV2MqioQXEAimCf+k8hkyKqrcuEXKIkMQseudPApKUuQ0ErrmnlNIgivyO6qCEuXCrvqr3glkuy0vZp6UrDOrkpsXYpQS22NJx2S7apd4OWJt94ue9Ks445q6126okuttSQ1266od50rL7XqlsTuvZi+W1ck+1JLSLgAZ1quXd0WnCy4JGGb8LZyxeswsijZe2+nc0l7McYnOZIwhnVB8jGvEPt7r8B2bXKysippTCsRrub1Mh2xqgSqsF3QexfBHzvIUqWhisoFI355XLAgf6a0iZs1/wWKxfLmfGpBSn/r89UDTUL1roL0y3VCkyiiyCRNQ6TJInq6oVskYyP0SSFj1G133W50Eje7QZG0cfffY7QhdNyaAG74GFSO7cbhhmsy9iGMG+4G159EfvgiV0diueEkNwr55n+nzCghoAN+9SCl/33156mPIfqimrc+RueMVi475lfTnfrklC9euuNjFw564mP3bfnge899uBvA702QJrgN0sYgh8Dt/PXYZ6/99tx37/334Icv/vjkl2/++einr/767Lfv/vvwxy///PTXb//9+Oev//789+///wAMoAAHSMACGvCACEygAhfIQI0EBAAh+QQJBADUACwAAAAAxgDGAIcAAAABAQECAgIDAwMEBAQFBQUGBgYHBwcICAgJCQkKCgoLCwsMDAwNDQ0ODg4PDw8QEBARERESEhITExMUFBQVFRUWFhYXFxcYGBgZGRkaGhobGxscHBwdHR0eHh4fHx8gICAhISEiIiIjIyMkJCQlJSUmJiYnJycoKCgpKSkuKyo4MCxFNC5PODBXOzFePjJkQDNoQTRtQzRxRDR0RTR2RjV3RjV4RjV4RjV4RjV4RjV4RjV4RjV4RjV4RjV4RjV4RjV4RjV4RjV4RjV4RzV3RzZ2SDhzSjtsTkRkVFBaWFlUXGFNYGlLYWtKYm1JYm5JYm5JYm5JY29JY29JY29KZG9LZHBPaHNTbHdZcXxieIJrf4ZxhIh5iomAj4qHlIuOmIuWnIyYnYugoHyooGKtn1GunUOwnT2wnTuwnDqwnDqxnDqznDu2nDu5mzzCmT7Klz/PlkDRlkHSlkHTlkHTlUHUlUHUk0HVjkHXg0DadUDcbj/daT/dZj/dZj/eZj/eZz/eaEHeakPebUbecUnfeE/fgVbei17ek2XdnWzcq3Tasnnas3vatHzatn/at4HbuYTbu4fdv4/fw5fjyKHmzKno0rXq1b7s2MPt2cfv3c3w39Hy6N3y7OPy7eXz7uby7ufz7+n19fL39vP5+PX7+/v9/f3+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gCpCRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17MuLHjx5AjS55MubLly5gza97MubPnzx8/YbKkCSSoTZtEbf60yMya16/JVNK4qQuWKbinaPkC6nIl17CDr1n0yaIoMbmT48ZyqfIi4dDXmOFEsZMW5dindJlMKXr0MqQm/m7Jnl1MZE7evUOSiJx89k6QyaT3jgkiKPfktTz+NN+7JIjt4YcdfI1p0l90i0DkhYDZZeJYdwdCB9F1DCpnXmOQRCjhQxVit11jEGr4mhkTdpjchYwZKOJrCT60oIm4OdgYKSu+RgmAMOJGYGPPrVjaQ/fBqN9+wEX4X0QBVrhJZJVoSEZ4Eo1XIYqQZdhfGdRN1MltAn44GSZFQgcJlBSJ8mJ2zF1GCiTywWbGIvVlVJtyWHjR22aaaFLcR51kssmdoAUq6KCEFmrooYgmquiijDbq6KMmkbIJJZRoEkpNmVBSyZKEbZIIHaCGSseNL1GSBBGopjoGp36RMomo/rDSoUiWKnlCRqq4pkqlXqR8GmuscaKUCRK5FksEGX018uuyZJYkyqnGFrurXZgsu2wjKI0RbbQy4mWttayOdMm20SaR1ybfLksqSWKQG60neF2S7q+KmHSru8U2d9er88Zq0hH4SouXIv36W1LAxY6BFyUFi1pvSdAijOq0clXbMKiR2Ctxqt3WFcrFoK47UrsbEwHvwCBfWtImJSOb18cNz3YSyQEfcXJelRT8MEpKICxyXgynq0izJm0S8bZh/OWptTKvJEoY2x6h71+kVKKIr7JOorJLmYxxNBljqFYYKVvTJIqfhYpGKSZ7QspQJYT8IffchATrtkGfIDL3zN5zJzLK3QVxEjffhBPS9t2jGEL44n8gArhAkjDOeNOQciI544bfXcnljNvtaCKcL/5zo4qHzrfjbg9u+tyH3H3I6nsncjclsM9NuaOY1C73j5COorrphjyuSe203h256aP3rjfnRz4+ECa/710I784PNAolhwxOyCGU/F19Qp94//345Jdv/vnop6/++uy37/778Mcv//z012///fjnr//+/Pfv//8ADKAAB0jAAhrwgAhMoAIXyMAGOvCBEIygBCdIwQpa8IIY9EhAAAAh+QQJBADVACwAAAAAxgDGAIcAAAABAQECAgIDAwMEBAQFBQUGBgYHBwcICAgJCQkKCgoLCwsMDAwNDQ0ODg4PDw8QEBARERESEhITExMUFBQVFRUWFhYXFxcYGBgZGRkaGhobGxscHBwdHR0eHh4fHx8gICAhISEiIiIjIyMkJCQlJSUmJiYnJyctKSg9MCtKNS5UOS9dPDFlPzJqQTNvQjN1RDR6RTR8RjR+RzR/RzSARzWARzWARzWARzWARzWARzWARzWARzWARzWARzWARzWARzWASDWASDWASDWASDV/SDZ+STd8STl2TD9rUUpdV1dXWl1SXWJOXmZMX2hKYGpKYGpKYGpKYGpKYGpKYGpKYGpKYWtLYmxNY21PZW9TaXJXbHRZbnRccHVgc3ZkdXVreXJ1f219hGmFiGSPjV2XkVWdlE+jl0immEOomEGpmUCpmUCpmUCpmUCqmUGsmkKumkK2mkK9mkHDmUHLmUDQmD/TmD7Ulz7Ulz7Ulz7Ulz7Vlz7Vlz7Vlj7Vkz7Xij7Ygz/ZfD/bcT/cbj/ca0DcaUDcaUDcaUDdaUDdaUDdaUDda0LdbkbedEzfeVPehF3dkGjYnHXSpXzPqoHSsInVtZDXuJTYupfZu5rZvZ3avqHUvaXTvavSv7Hbxrncy8Hg0Mbr3tXy5t/06+f28vH28/L39PP9/f3+/v7+/v7+/v7+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gCrCRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17MuLHjx5AjS55MubLly5gza97MubPmUZ5HgqI0iY3pSZZCheZoqrTp168tmVqNERQc2LhNxxGVUdSnTqFmXx51O3duOMInihpjpblzL50suzaeexLFTs6zOw8DWjIn6uBB/kkEo728lS2qI8cBT906ROzmy29J7pg9dTgQRcWPPwZyKPvUddeQF/vFJ55j3wGYW3oMjVJgfJw8BoqCCzoEyoPmhfHYKBTi9hB8GGoHWXEdxvEQcyGK+Nh0FFLyYYrZaQEZcR0i91AoMG4XWYIKMtiQKTk2F11kLIJniURhBMmbdyQed2BEo2gB45CTibJedQJKBOKDYGBmSiibbMKJjxVxgqEXS9JWUSgEQkifmhSZwkmSz41BJpwYiRIcnnz26eefgAYq6KCEFjqUKKBcEkkklmiSpqEKmXIJH5RWSikkj0JakCiRWOoppZpoapAon5bKR6iiCmQKJKaWmilK/qBsMkknT/41aaufQvImSaOQMcSvwA4hRil+mYKrqbWStAkSwTaLhCd9kXrsp5ecNEmz2P7qnl6aTPtpJCZtku24ydp1q7eWljQKs+NimwSxeZ2LLqUlidHuuNveBcq8lYJLErv3NttfXtLyW+1IowQ8rl7G8stHuR55onC2d9LV7byQlCTuxM1CTBer6L76ESgcNwsvweiiSlIpJQOLRLTTegxSEi0PMTBfkpoKSZYlXdsytH8hqigkl4AicklllCxGqgKtOzESJ6fqCcDjJlGxl6Ec7VAp9uIbdWagQOIIImQjAols102S9K9jTCIzZaZIUvbcZDty9Y2riTI2vN18H8l0NabszTffbwtqyeCIN7IroaEg7njGoh7uOOKpQjI54ncDejniEUI6yuaDZyIq6HyLrukjpM+d+Z9yp0724oKC4joijzAdietaC2pKI6SbzjQovF/u79/VjGJ54p0TP1AmgpPdSCQ8Kz9QKJyAEr302Gev/fbcd+/99+CHL/745Jdv/vnop6/++uy37/778Mcv//z012///fjnr//+/Pfv//8ADKAAB0jAAhrwgAhMoAIXyMAGBiogACH5BAkEANcALAAAAADGAMYAhwAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njg5OjxBQj9HSkFLT0NPVEVSWEZVW0dYXkhaYUlcY0lcZEldZUldZUldZUldZUldZUldZUldZUldZUpdZUpeZktfZ0peZkpdZUpdZUpdZUtdZE1cY1ZZXGFWVHFQR31MPYJLOYZJNohJNYhJNYhJNYhJNYhJNYhJNYlJNYlKNYpNNYtQNpFhO5ZzPpl9QJ2JQ5+QRKCURaCVRaCVRaCVRaCVRaGWRqKXSKOYSaSYSqWZS6eZS7CZSLmaRsCZRMeZQc6YPdOYO9SYO9SYO9SYO9SYO9WYO9WYO9WXO9WTO9aMPNiDPdl5P9txQNttQNtsQNtsQdtsQdtsQdtsQdtsQdpuRNdxSdR1Uc18XcSDa7+NebyXiLuilr6uocK3qce+rMvBrM7DrdHErdTFrNfFqtrFp93HpuHKqOXNrOnRserTtOvWuuzYv+7dyPDhzvLl1vbw6vjx7fjy7/r49/v6+fz7+v39/f7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AK8JHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3sy5M2ZVpjJRmhMpE6lTnj2WktOmtevWmlJrVHXpte3WkVDLtkjptu84qnZTJOW7OCXhElXFKV6clEVTlShVMhXccm3mvuVMVDWpiffvTZj+mKocCXvx6g8tMQHPvkklyuaLl4JIqb39SZJPxfed6aEp+wC+B5l++9nWX0OqrAdge0zo9liBts3XUH0L3hdZeRC2ht5CklQIYGTXQaidQx4C6GBjpywHoXMN/Vdie5ZEJgqExznk4ovgCQhZb/EB95AqOLI3XmS0mTfHkA8pGGQTG0K2WnEHRtThkkxYpgopopF2iSgnQmTJkk3UiNxD3eFY5ZgQJfhig2hGZIqSADIRY5sRqULhfU3S6R8lU4Y3yZx6XoRkoIQWauihUaEyKKIOqQIKJH5E6gcknSzK6EGlSKqppJ9cmlAnm4YaaZ6XgiKqqJB4ShAqp54Kiqr+AkHaqqioqMrqrKJ26ikpuIraiaqf9CqqSqRUEkkklZCSSmCyCqspSpN8Ie200kqyrF+gOvtsSaeQQe23X4xhKV6iaCtpqiSZIga47LK4lynmRqrrSN6yC+4Y1+4Vrx8SihStveyiuxev2v460ikAAzyuXdkKS2pHnCRsL358qeJsv/5KzG4kfqnSMKq1lgSJxuCSAVimuaI0MsnUjjFYKaB8UkrIKEnCMrUCM0rJzdNSfCkpPEvLCawrs0xGvpeesi7LC+fXSSSPJPJIJJ10OSHLPl/WSSJcd921wRD9m7AkmZkStddoS900QqbUe6+7Vp6dNtqPPKxQJpKsDEmtJJQgbdnWc89NNqylBG74KLBGYnjgHKvayOKBq3oK5IGvTecolM+N+KWFZ442xoeq4jnadgcqt+eNJD461417esrjqFuN6Cejz6s65a3DKhDghoOt+0Bmz/0I6L8DH8rTnYRiefHMN+/889BHL/301Fdv/fXYZ6/99tx37/334Icv/vjkl2/++einr/767Lfv/vvwxy///PTXb//9+Oev//789+///wAMoAAFGBAAIfkECQQA3QAsAAAAAMYAxgCHAAAAAQEBAgICAwMDBAQEBQUFBgYGBwcHCAgICQkJCgoKCwsLDAwMDQ0NDg4ODw8PEBAQEREREhISExMTFBQUFRUVFhYWFxcXGBgYGRkZGhoaGxsbHBwcHR0dHh4eHx8fICAgISEhIiIiIyMjJCQkJSUlJiYmJycnKCgoKSkpKioqKysrLCwsLS0tLi4uLy8vMDAwMTExMjIyMzMzNDQ0NTU1NjY2Nzc3ODg4OTk5Ojo6Ozw9PkFCQEVHQkhLRk9TSFRZSVddSllfSlpgSlphSlphSlphSlphSlphSlphSlphS1phS1phS1phS1phS1phTFphTVpgT1pfWFdZZFdUclFJf09Bh008i0w5j0s3kEs2kEs2kEs2kEs2kEs2kUs2kkw3k003lk84mlA5pFU6tFw8wmM+zGg/1GxB2G1B2m5C2m5C2m9C2m9C2m9C2m9C2m9B23FD23RE2ntC2YVA2I091pQ51pk41po41ps41ps41ps51ps51ps51Zs505s5z5o6wZc/rpVFpJNIm5JLmpJLmZJLmZJLmZJMmZJMmZJMmZJMmpJNm5NOnJVQnpZUopVZo5Vir5hquJx1vJ94waR9waaEwaiJwauNw66NybCKz7GH0rKI1rSM2LWR2bia2r2i2sOp3ceu38uz4tG559e/8OLN8uXU9Oja9uzh9+/m+PLs+vXx+vXy+/Xz+/b0/Pf1/Pf2/vv5/vv6/vv6/v7+/v7+/v7+/v7+/v7+/v7+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CP4AuwkcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS7as2bNo06pdy7at27dw48qdS7eu3bt48+rdy7ev37+AAwseTLiw4cOIEytezLix48eQI0ueTLmy5cuYM2vezHkuqlKhQp1S1TlkKESoUyN6VKo0R1SSVMtGZOmVa4ynZuuOZPs2xVeRdOu25JuiJeHCSRWPmBu57kfLIZ52rvtUdIfHqc8eNbFVKUyRIv6FKtXqcnDtsjNFbIWpifv37jFZRj+bEsRUVODrb0IlFWVK9KkWykOl7GdgE/5JlkmAqSnXUCv5HagfFZONwiBqqDgUiYQGyhfZK48waF9DqXB4YIKQlRLgI6Q1FIqJBnInWXbaydjQhjDq5+GHAFL3CUQR5vheJJWNEuJu1kEkhZDwEVmZKqFQcmQklozSG0Q4MtnEjpepcuVE7WnZxIDXMTSKmE20ViZDQebo5JoLlSikFC3CuVCYMJJpJ0N4SsjlnguVsqSB/QEKUSuhgOdeJJjoaehysJwyyiim1PmoQ6bskcemnO5h46UJweIJp6RyykmGoB4ECyeltprHHv6mpGpQJ666ugcssg5kSq21dpKrQJry6mqssu4qrKufXlrKsa76KuuozJa6R660RltqrqNYSyonuRqrbR7OpqrKt5smOxIpoEwiySSYlIIiYNVau4elIp0CyRf45vvFGKAIpkqw0TpIEib6FoyvJO/2RYq14Y5EsMEGj1EeYNAK2wmuJJEC8caTCJYprwKP1MoYG28simCwkNIJwJ14gmpJD5ccsWGwvIySJDJvnPCjJOdscMiPpuIzxH8aKvTQBRdtaM9I43uyrDg3je/Ok5kSCieTgFKKzQ7FjPQYmJUihxtkl+3GJPTGyfTQ/Vb2SiVmx+2GHI4yFErTklj2ytkccvftCUSTDD0G1Y9x0vfhxD7oNcSQJElZKYcfPseXDImytr5KRzZ25H3XzVAromAiyRiQZO2425wfXkm3qfc9R66ftN435YbGLnvcaQMK+e1ly5ErKryX3XGuwZP9N+zBy5H7o3Tw7jmowMs+/K8CmcI355XQnuvbh8uhJvUGmfJJJXzTwUkoy4Ov/vrst+/++/DHL//89Ndv//3456///vz37///AAygAAdIwAIa8IAITKACF8jABjrwgRCMoAQnSMEKWvCCGMygBjfIwQ568IMgDKEIKRIQACH5BAkEAOIALAAAAADGAMYAhwAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzAwMDExMTIyMjMzMzQ0NDU1NTY2Njc3Nzg4ODo6Oz0/QD9DREFGSENJS0VMTkdPUUhSVUpVWEtWWktXW0tYXEtYXEtYXEtYXEtYXEtYXEtYXEtYXExYXExYXExYXExYXExYXExZXU1aXU9aXVFZXFRZWllYWGFWU3FSSoBQQ4pOPpFNOpZMN5hMNplMNplMNplMNplMNplMNppMNppMNppMNptNN59QOKZUOrBaPMRlQNJtQtZvQ9hxQ9lxQ9lxQ9lxQ9lxQ9lyQ9lzQ9p2Rdp8SNuAStqHStqNSNmRRdiVQNaaOtacNtWcNtWcNtWcNtWcNtWcNtKcN82bOcaZPLyXQK2URqCSS5aQT5OPUZGPUZGOUpCOUpCOUpCOUpGNVJOLWJSKXJOKYJGJZo+IaoyHcYeGeYSHfYOJgYSLg4eNhYuQh4+SiZuZjKefkK+klLiqmr+woce3qc6+r9bEs9rKuNzPvd/Vw+Pcyebgzubi0ebj0+bj1ebk1ujl2ern2+zo3ezp3+3q4O7r4e/s5O/t5fDu5/Lx6/X18Pf28fr59vr59/v6+Pv7+f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AMUJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3tx0FStdnEfeAuVJkWlFkz7FCu2RVKTTsE2LYr3xU+zbijyBpm0xFG7cn3hXXPX7NynhEycVxx3pFnKIxJfjNvX8ISnpuENVdwgK++3g2xn+2vYeOzzD7uRPe5IoyxQoTZg4iTqF67Ko9KdBRRRVJYr//1Fcwopl0eF3nEOyYALggv7pR5kur+HnXEO49Mcgg5xUhgp+szmUyYUgUkfZeNit55ApIIJYRX2T6VKadJGs5pCFKTLoIGX3FffJbhTWCCIml61ConqoRHSKjxdWoVksppiyCkWgIHmhLOYpFKWUC1JZJUJHYgnglgnJ4uV/QIKJEI1YdmImQqKMWYWWaxqkIJajxImQLGimmIlhs6BSSh55kGJKKimxYomPnbAomC6l8OHoo47mMUtKVzJYxSmFpZIHpJw6iilKsojSCSZVYAKKKYoKNkunrPIhop3+Bm3aaqeTwkoQKbOymoetA+mSa6tF8prKr6weaKspxHa6K6+4Jsspr+I06+yj0CI7baTQDnstH8bC6uu2wfJqrbPLQiuOrMnWau6qyb5qrjia5qrHpye5Ioonk6Axyam5HKaLtJxKSukYBBdMMBruEtYnKYAKSihKrqRh8MQEe9Lvu+LQggbFHFeCsTiTcCxyh9CKIrLIaNBi7hkni2yirbS0LPIk0KIis8jQgnIzxypjBksppKgC5c4U90yZpnIkrTQe9DpkM9EFn2FZKEpXrbTFD+UCdcE0T5YLHlaHLUcdsDzE8tY3RpaH2GLj8ZApW59xcWSnsM02yQxVAnXGwo7lUofdbNviUC5ny/xyZKkAzna3C9EScstpRyaK4mJHzpAohRuchiuWgUJ52G5HRIt7lUziiSjhVrb251bnzHrV5cJKyutKaycs7UkzbqcdtNcheLa06w4r1Z/Hbu7qgOMxN8ak/H33xwXZAgrYStuRR9nQI5TKw9l37/334Icv/vjkl2/++einr/767Lfv/vvwxy///PTXb//9+Oev//789+///wAMoAAHSMACGvCACEygAhfIwAY68IEQjKAEJ0jBsQQEACH5BAkEAOcALAAAAADGAMYAhwAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHR4eHh8fHyAgICEhISIiIiMjIyQkJCUlJSYmJicnJygoKCkpKSoqKisrKywsLC0tLS4uLi8vLzEyMjQ1NTY4ODg7Ozo9Pj1BQkJISUVNTkhQUUlSVEpUVktVV0tVV0tVV0tVV0tVV0tVV0tVV0tVV0tVV0tVV0xWWExWWExWWExWWExWWExWWExWWExWWExWWE1XWU1XWU5YWk9ZW1BaW1FaXFJbXFJcXVNdXVRdXlVeXlZfX1dgXlliYFtkYWFqYWpyYHR7YXyCYYGGX4WJXIaLWoeLV4eLV4eLV4iMV4iMV4iMV4iMV4iMV4mMWImNWYqNWYyPXI2PXY2OXIuMWY2HVpF9UZV0TJpsSptlRZ5dQKBXPaFUO6JROqJPOKJON6JNNqJNNqJNNqJNNqJNNqNONqZQN6pTOLVbO8NlP8trQdFvQ9VyRNh0RNh0RNh0RNh0RNh1RNh1RNh1RNh1RNh3RNh5Q9h9QdiHPdePOdeXNtecNNedM9eeM9eeM9eeM9efM9efM9efM9efNNefNdefN9igO9mgPtqiRNumVtqoadiod9apg9SriNOui9Gvjs+vkMqxlciymMizm8i0nMm1ncu2nc63nNS4nNi6ndu7n9++oOPDpOTGquXKsefPu+rVxuzZzO3c0O7f0/Dj1/Hm2vTp3vft4vjw5/rz7fv28Pz38vz49P369v37+P78+v79/f///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AM8JHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNr3sxU2C5VcNDAgcXLGOePyl6hWc16NZxfpzkKC926NppXymJjJGa7NxpVui/S9l2bV3CKu4j3hmP6eETlvmc5h8gbum3g0x3+sm4bTnaHybn+127+XWF48axzl1coDD1r7+sVKnO/Gnv8hMPFG4eobFYsMFp4AccswWS2HXpwqOeQL1oo4eCDDsaiYGWwoCfMQ8rEAuGGDnpRoGXK5EfcLhCJweGJWhBzmTKuKAfHfg7NcuKMYBgoYn3kNURMgzOeKItmwvACiyq7/JKjQxr2iOJ9CoGh5IwqMnlQFk+e6IuUBhFT5YmxYFmQMlty2KWXBFEZ5oNXEmZMMSs5eaaDE/aVzC6olALKnajowqZJSZ6ZRWDDnHLnoISSWJIyZoaZpl+6EOrooKgkU5IvZ4oB2C6PZgoKKnxumUWcehljp6aPGkpSnzRG6RcqpGZaypH+IQXjxYlZ/AiYMa1qqgtKvsgCBxhixOKLqn8Fk2umqZBJUKPHOnqKsgOx2qyj0ArE7LR3llLtObxgC+m2w3h7567bjortMNueYyy2yaZ7TirTniKpu8kImmsp6LorUDLXZnrKnvoOFOijpZAbsEHJDLOLLsHAevDDQiFjiyp0AAIIHa3gAvFAvtxh8ccf2/Hhwa2AbPLHtRzsysksA2KLvsG0zHIexEJrh8ws05FuLzi3vOhlxsxL0co9n/xyZca8kkolkURiSSq7CP1QKkWf3EpluzDd9NZNWwJMRB5XDbLOkiWTCtdob/0KRDeL/THZkZ2d9tymMqSK2x+7IpnqL3P3XYnDB9mCt8W9RJaM1n2n3S5DMQ8+smO7JJ54vgxR7bbeka0ied+FN4RM2EXbMZncm6Ody0O+iP34Y6XPvXhDwbTdssiUWdI62qtEhEzJLGNOGem3R1L3Q8j44ooqqtjyM2W5BL/119UC43wklbirefDLK5uM7a2/vi0wiCduidTpDoOK5KmQr2/zaVeS/cPG+JJLLsCov/H9+Oev//789+///wAMoAAHSMACGvCACEygAhfIwAY68IEQjKAEJ0jBClrwghjMoAY3yMEOevCDIAyhCEdIwhKa8IQoTKEKV8jCFrowXQEBACH5BAkEAOAALAAAAADGAMYAhwAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFRYWFhcXFxgYGBkZGRoaGhsbGxwcHB0dHSMkJCkrKzEzMzY5Ojs/Pz9DREJGR0RJSkZLTElOT0pQUUtRUktRUkxSU0xSU0xSU0xSU0xSU0xSU0xSU0xSU01TU01TU01TU01TVE1TVE9VVlJYWVZcXFleX1xiYWFnZGdsZ2pwaW1zanF2a3V7a3d9a3h+aXmAaHqBZnyDY36FYH+HXn+HXX+HXYCHXICHXICHXICHXICHXICHXICGXIKFW4d+Vo9zT5doR55eQaRWPKdSOalPN6lPN6lPN6lPN6lPN6lPN6lPN6pPN6pPN6tQN6xRN69UObJWOrtePcVnQMxtQtJyQ9V2RdZ3Rdd3Rdd3Rdd3Rdd4Rdd4Rdd4Rdd4Rdd7RNd/QteEP9eNOteVNdecMtefMNegMNegMNegMNegMNegMNegMNegMNegMNegMNegMNehNNijO9qkRNymT92uYtaxetS1idW7lNrFodzKrODPteTSu+nXverXwurZxerayu3dzu/g1O/h1u/i2fDi2vHk2/Hk2/Hk2/Dk3PDl3PDl3fDm3vDn3vHo3/Hp3/Lp4PPq4PTr4fbs4vft4/jt4/ju5Pju5Pju5fjv5fnv5vnv5vnv5vnv5vrw5/rw5/rx6Pry6/z28vz28/z39Pz39P7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AMEJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmDNrJkkKUqNFjSCR2izyUpIoqFNHSXKJtEdHqmOjbpTLtcZFsnMvso3xUe7fj3hXnHX6t+wks4RPxG1ct3KJxZvHTvIcYi7pv2tXb3gJe+7W2xn+UvIum1J4hrPIxx59fmF09e0ZMle/O77C7uqjmLevsJF6RvwtlMt7xiWhHUSOMELEDTcAkYQjt2xGCoHHsfcQJkAwqKGGPeynGWy/OSIRIxuWqCGAm83iyCKnJbGII8lF5IiJNN6AYoAIkbJDjTRigiNCQ/BIYw8R/kgQJULWKKKRA82YpIk3AlZJJI1IQotKJD5Z4hBSIkLIl2Aa0ghKQWq54Q5+2dIImGyCmciVJZVpJoNA9GVLIm3mSYghlZSU5Zw3UMeXInrqiYgtJDkJaJR4RVJooYpwBiiDPu5lyKOF9jnSn1oKqlcqmBY6JkkZakkkX46GmmciJWGig5b+Huq1pqptGmISKaXWCESlfOFJa5socbohI0X2NeuvX7KaEiWOJPEgJcX6lSqyhETKpEC0UPvlqNeC4+uvhsDZLS2X/hpJtwRNG6qy6A507KOJINouQZV4Keq8B9kSSSLlEpKIIqnguxAtAQts8MEIJ1wXrwoPRMkidIQhcRqKBJewLYtIrPHGisgrMCZnbCyyxGZAIrAtIY88shkMd6uIyjCncdktkzSiiB2KMAKJLBRBAvPPjEJWiR1yFG100dxCNMfPMJ8x2S2MHC110Yl4ElHKTI/s8WOKTO11HdEuZEvWMMfaGCRep21tQ5SQrXLSjMlSR9ppm9wQJm6PbLfbY1HT7bUdD+UtsimQJeJ32mEntLTgEkd2eNqaMsQI42Gs3Zgnj3sNd0IoC24G4Y/JkvnUmyfUdt6lLza61JE3lDHZlj9m+OpFJ74QJGYwnTpjfa8OuES2vDxyGi1Ddsvcq09iESWNMNIIJVtTNsnqsbucOdgCQ314IjwfPPTXSyZ8SyU2J5JII5N03/D67Lfv/vvwxy///PTXb//9+Oev//789+///wAMoAAHSMACGvCACEygAhfIwAY68IEQjKAEJ0jBClrwghjMoAY3yMEOevCDIAyhCEd4kYAAACH5BAkEANEALAAAAADGAMYAhwAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODg8PDxAQEBERERISEhMTExQUFBUVFSMkIzU4Nj9CQUVIR0hMSktPTUxQTkxQTkxQTkxQTk1RT01RT01RT01RT05SUE9TUVFUUlJVUlVVUllVUWFVT2tUTHdTSIZSRJRSQJ5RPKhQOq5QOLFQN7FQN7FQN7JQN7JQN7JQN7NRN7ZVOLpaOsBgPcVnP85xQ9J2RdV4RtZ6RtZ6RtZ7RtZ7RtZ8RdeARdeHQtiOQNmZPtmfOtmjONmlNtmkNNikMtijMNijL9ejLtejLtejLtWiMM6gNMCbO6qURpSNU4CHXnuFYXiFYniEYniEYniEYniFY3iFY3iFY3iFY3iFY3iFY3iFZHmGZXqHZ3yIaX+KbIGMb4SOc4eReIyUf4+Wg5OYiJaai5icjZqekJ2gk6CilqKjmaSlm62pnLWsm7yvmsOzl8i1ls22ltG3ltS4lta5ltq7ltu8l929mt28nd6+oeC/pOHBp+PErOXHsOfJtOjMuOfOvOfQwOnTxOzVx+vXzO7a0e7c1O7f2O/i3fDn5PHq5vPr5vPt6vPv7PXy8Pf18/z7+v39/f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AKMJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLmClniqTI0aXMJvGsAUO6NJ3PoD9eilO6NWk0ilJ3dITGtW0wdGRrzFT7tm08ujHO8e17UvCKjoj7bnOcoh3lvjM1l9gG+u1I0yNavw08u8NL23/+e38Y3jWi8Q7hlC+NHT3DO+tJu28YKf6c+Q3hh0cjHf/CTKNt54h/DU0SoHJ3EOhQJvrdtkZ7FUninSNwHAgGHHj0JxEebpAhwodkuLFIdpsZV1EmZXyo4opxaKigQouksOKMH6og4YsJUSIjjTSm4GJflSQSyB9LBJLIIyx5yCOPavylSSBSRClllEtUklIdS2Y5Il+PLDHll1IskQhKKmS5ZBl8VQLmmlIEYlImZi6ZAl9esgmmlSQ5EueSP9YFpZ1gLlHSHXvyOCBemgDK5pgjLVIojTfe9Yiia7o5EiWPzqjXn5RO+UdJKGT6IZp5cdqplCWpIaoIdWx66pf+JVES6qMq9EmXqad+Omimh+Y16atRWlpSG4XGwVeiwErBqEl3zMojClvyhauiS2iSEiUp0qiGrXnV2SmeKzlyRx149AqYmp0Ki+NBXSqq7roHPclmlfA2FOSQRQaCZL389uvvvwAHLPDABBf8USSOcCtwJn0QUcPDNfBghLkCO8IDxBg/3IfCkGXyCCGEHPIIxw7xkfHJEUM4mSRHDOHyy0MgYUlFg6CMcg+VHQLzzkMUcchElehgM8p+TPYHz0gDItEQQ9uscmM6I430vgs2bXPRj1lShNRIF0EyQY5YjfIQkB3NNdK6NuSH2CfrANnWZ/N8xENGsH1y1nFL/dDO2nZD7LZjjeQ9tUOL9A0x2Y5FLTjMVC9UieEP8/HYI4vvPLNDFxsebWOVv1wERJEYbkRkLXeORER8i83D14UpvngjS4utA8WOIVF52qg3PQS4kWktuNcVRVJ3xjwMclkjcHN9RKQWRWLIIAmDlonZSbO+biOA2O4yEoA0brBAl38v/vjkl2/++einr/767Lfv/vvwxy///PTXb//9+Oev//789+///wAMoAAHSMACGvCACEygAhfIwAY68IEQjKAEJ0jBClrwghjMoAY7EhAAIfkECQQA2wAsAAAAAMYAxgCHAAAAAQEBAgICAwMDBAQEBQUFBgYGBwcHCAgICQkJCgoKCwsLDAwMDQ0NDg4ODw8PEBAQEREREhISExMTFBQUFRUVFhYWFxcXGBgYGRkZGhoaGxsbHBwcHR0dHh4eHx8fICAgISEhIiIiIyMjJCQkJSUlJiYmJycnKCgoKysrMDAwOTk4QEA+RERCR0dFSkpHTExJTU1KTU1KTU1KTU1KTU1KTU1KTU1KTU1KTk5LTk5LTk5LTk5LTk5LTk5LTk5LT09MUFBNUVFOUlJPVFRRV1dUW1tYXV5aYGJdY2ZfZWpgZm1iaXJka3hmbXtnbn1nb35ob39ob4Bob4Bob4BocIBpcIBpcIFpcIFpcIFpcIFpcIFqcYJqcoNrc4NsdYVud4Zwd4dweIdxeYhyeohze4lzfYp1f4t1gIt1got1hIt1hox1iIx0jIx0k4VtnHxiqmpPs15Et1k+uFQ6uVI4uVE3uVE3uVE3uVE3ulE3ulE3ulE3ulE3ulE3ulE3ulE3ulI3vVY4wl47yGg/znFD0XZF03pG1HxK1X1H1X5I1n5I1n5I1n5I1n9J1oFJ1oNI14pD148/15Y415wz2KAu2KIs2KMq2KMq2KMq2KQr2KQt2KUv2KYz2Kg42ao+2a1G2K9L17FS1bFi1bJx0rKA0LKJ0bWUzLmezL+qy8OxzMm50s+/19TH3trP4+Da6+ji7Ovm7+7q8fHt9/bz/vz6/vz7/v39////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CP4AtwkcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS7as2bNo06pdy7at27dw48qdS7eu3bt48+rdy7ev37+AAwseTLiw4cOIEytezLix48eQI0ueTLmy5ctqY83CjDJWqjZjtGgZ0ybVZs4hW4UWzVr0GFeoPc4y1bo2a1SxOaKyzVtLqtwZXfXu/Qq4xVmrh9duY7ziKuW9YTeXmAo6b1XTJbaxbvtU9ohiuP4v/w5xu3jWpsg/PHWe9W/1DVW1F90KfsNX88XEst9w93ns/DE0i3nWMRfgfeFBp9+BDsVCIG+mnMagQ6ok2JoY9U0oUSytpJKKK/upN4uENM3CinSEmSjKJ5m0KEopIbrEihpJ8GAjD2S0QWJfr7DY4o8tdsJKSwPeaKSNRQDYVylANvmjKDuW5EqNR1Zp4F6sOKllJqKoxESVYPLwXl6zdLKllkOedEqYYBYBi16inKllJ1GC5AqbYZJBppxbplfSmniC+eZdrvCp5SgmkREomGnaZYqhToZiEpWLGundXXFC2qRJlVapBl5MavpjJyYV0amleLUi6pOJnnqjkv51vbJqi36SBKirg95l5qrFlaSKqzwkoVehoiJ6UhuuoojXKJrSidIslAZ6qV6z+MinsiaxYmqgevY1S6hbhhJjSrAoyua0fvWoZa0tpRKtjWpg+9csr5hiiit1ypiKKvJq6O+/AAcs8MAEF2zwwQgnrPDCH7kCop2ptJIrZt+KosjFijwySqMXrXKIHiCDLMco/ULGyiMYp3wxKfk6NMsoIccsMm6UlaLyzYpA0qtErsgh8896HDJZKjjjDEnLChECNNClRBYLykXfzK5Dpiy9dIaOjRJ10SUjBIvVSw/y2CxbF00z1WAv3XVhrpSNs7EOwZz2z2MuhorbNz8C0dkgc//cdGM2460yRH3/LHRjdwuOsd4P8V14yH8z1rbiF8PdkNyP61G3YrFQfvHUC1WduR5rF2Yx5Rwz9HXmhED2CuWgMyR64aUblrjbR0+kdN+xM6Z12Y/sHJErjoN9+NBQvz2uRN9aLQe6k8VCSvIXi7J5Ra0c4nPIg4wy8WWxuLJK7RTB0korSDOs/vrst+/++/DHL//89Ndv//3456///vz37///AAygAAdIwAIa8IAITKACF8jABjrwgRCMoAQnSMEKWvCCGMygBjfIwQ568IMgDKEIQRgQACH5BAkEANQALAAAAADGAMYAhwAAAAEBARAPDiopJkRBPUdFQEpHQkxJRExKRU1KRU1KRU1LRk1LRk5LRk5LRk5LRk5LRk5MRk9NR1BPSVJTTFVaUlliWFtnXF5tYWJ1Z2V6bGZ9bmZ9bmZ9bmZ9bmZ9bmZ9bmd9bmd9bmd9bmd9bmd+bmh+bmt/bHCBaHaDZX6GYImKWZmPT6qVRbycOcmgMdKjLNilKNilKNilKNilKNilKNilKNilKNilKNilKNilKNilKNilKNikKdihLtidMteYN9eRPtaMQ9WGTNWET9WDTtWCS9WCS9WBStSBSdSASdSASdSASdSASdSASdSASdR/SdN8SNF3Rs1tQsdgPMZbO8RXOcJUN8JSN8JSN8JSN8JSN8JSN8JSN8JSN8JSN8JSN8JSN8FSN8JVOsJZP8JdRMBiS75qU7txXLl8abGMe6+QgK2VhquajamilaqnmqysoK+xpLGzp7S2qba4qri6rLq8rry9r76/r8LAr8bCrsnErs7GrdPIq9jIqNzIpeDIoeTJnubJnOjJmerJl+rKl+rLluvNlevPluzRluzRl+zSl+zSmOzRmuzQnezPoOzOo+zOpevOquvOrerOsOrPsurRuOvUvezYw+zbyuzfz+3j1+/r6PLv7fb08vb18vf28/j39Pn49fr59vz69/78+v79+/7+/P7+/f7+/f///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AKkJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5suXLaTnhieMmxRs8mzCTDDWnhOnTptlwEg1yUwrUsE3jYd2RU+zbJe7Q1hjqNe7Yq3dfLP07NhvhFkMVx60HOcVNy2/PcT7xTvTYbqhLfHM9tvaIcbr+w/4O0bp409nJO4R+vsR09Q2Vt28Ov6H57sfrO2QjPrh+hrZdp9t/6/mGGwqzEfgQabi50YlzmTyySCakYMSJHnO44UYcoCGXCRE5hCiiD48oCBEph4ioooiDeGIiQ6SAuOKMPmTyokIpzqijDxW+xMked4T21yU6FpnDIS25VoEDTDIpwh59+WBkkTaqJMeSTWbpQAou5rXJlEUuopIIWpbpQAVC3jUJmDoOkpIbZpqJQl45sqmiDyhpEmec6dk1iJ0zonTBnnFqctcigKpIxEmbEBrnG3cRmWiIbpp0h6NmpnCXJ5OGKKZJcGKq5QV4/ZmoD12WRKaoWuLliZT+gJZ40husZkkqXo8AWulJe9TapKZ0sklEqiY16qsDkOqVCaw6fqpSBsf6lxeKgzBLxCBpqmQsq8n+5UmVMNEqagY3KpQCphdkW65Bd2BpphvErnsQJykM2mQFIhgq70OaaCLtvgAHLPDABBds8MEIJ6ywX5MMogYSSKgxCCWhJLwJERBnnDER6goMicYgZxzJRptUAsglHUc2ScgsIwHJRZ6s0cXMNHexRryOXdwyyyk7dEkZNQddxiWSYbxzyItO1EbQTM/cBmSaHN2yvhBd0vTV4DK2stQhvwyRJ0BfzfQZOCM2CNch7+qQzGI3/XRjD6OtcdIPmdF202g4FrfU3BCr8fXdVzt2Nt8Qq81QJoA3nXVilhAO8SRVJ8400Yxt4jgSPSOEuOQ1Z17Y4HIb3hDnNT8WitFcE1FxRGiQ3kUakFmONtUQAeL6H5HpvDPHFaXBOeyTfcyy1xVxEvbdZfwbmSYNDzKJJqtfVMnxVw9tMCe+Xz1swpUQYffMZhBRycIDfVs2+einr/767Lfv/vvwxy///PTXb//9+Oev//789+///wAMoAAHSMACGvCACEygAhfIwAY68IEQjKAEJ0jBClrwghjMoAY3yMEOelBBAQEAIfkECQQA5wAsAAAAAMYAxgCHAAAAAQEBAgICAwMDBAQEBQUFBgYGBwcHCAgICQkJCgoKCwsLDAwMDQ0NDg4ODw8PEBAQEREREhISExMTFBQUFRUVFhYWFxcXGBgYGRkZGhoaGxsbHBwcHR0dHh4eIiEhKCcmMC4rNjMwOzgzPzs2Qz45RUE6R0I8SUQ9S0Y+TEc/TUdATkhATkhATkhATkhATkhATkhATkhATkhATkhAT0hAT0hAT0hAT0hAT0lAT0lAT0lAT0lAUElAVklAYEo/bks+e0w9ik48nVA7t1I5wlM4xVM4x1M4yFM4yVM4yVM4yVM4yVM4yVM4yVM4ylQ4yVM4yVM4yVQ4yVQ4yVQ4yVQ4yVQ4yVQ4yVQ4yFQ4xlU5xFU7wVc9u1lAq19JlGdWgm1gdXJoa3ZtY3lyYHp0X3p0X3p0X3p0X3p0X3p0X3p0X3p0X3t0X3t1X3t1X3t1X3t1X3t1X3t1X3t1X3t1X3t1X3t1YHt0aXx1cn11e390hYF0jYJ0l4RypIVvsYdrv4hnzYlj04lg1Ydd1oZc1oZa1odZ1ohY1YhW1YhU1YdT1YdS1IZQ1IVO1IRM1IRL1IRL1IRL1IRK1IRK1IRK1IRK1IRK1IZI1IlE1ZA+15kz2KEr2KQo2KYm2Kcl2Kcl2Kcl2Kcl2Kcl2acl2ago2aks2qox26w63a9D37JP4LRX4bZe4rlp5Lxy48OJ4ceY5M604sy3386839PD5NfL59vS6N3X6uDa7OLd7eTf7+bi8Obi8efj8+fj9Ojk9enm9ern9evo9uzo9u3p9u7p+PHs+/j1+/n2/Pv5/Pz7/f39/v7+/v7+/v7+/v7+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CP4AzwkcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS7as2bNo06pdy7at27dw48qdS7eu3bt48+rdy7ev37+AAwseTLiw4cOIEytezLix48eQI0ueTLmy5Z7GbsmKNevW5ZO69MgZTVoOH2OfRcYqzVoOHlqpP4pu3TpWbI6radPWdTujLt2686DubXEPcN2yiFs8rnuPcoq3mNPG83ziLOm0iVWPmBt7ac/bH/5G9146PERi5EnrMQ8RT3o5fdg/7O4dvPyGs7Hbvu/wN3bh/D1Ei3vH6cHbZ8TA8soqq7TyCjAXGcMHcPtddowro2SoYYarFHPRLH0Y59oesdhnGTGpbKjiKKa8otFwsRGz4oyjuBhgQynSuKJ2Nyr0io4zptJjQscASSMsQx70i5EzupKkQT8yqeIqMNkSix+x2NJXK1Ku2FIxfPAg5pg87OFhXlx2uSFLs/hA5ps+zJJXlGqOQqVKfbypp5h84LVknaM4mdIsexYqp11FAmrjScWIUeiePpxZF4ZqonJMSnk+umefiOYoJY8ohaHpnmLgJaOUi6I0aqGS1vULKv5GpnoSoavqeehdx6S5YiqgDlqrnhWa+korqaDCyiu/uGTLr2/e+qRAzJL5bEF6RMtDGNMSFIu1fmRLULW/ruftQLy4uaoPvIxLUJujxqluQcXs8age6b5r0Cx7/DDmDyTay9Asrfor8MAEF2zwwQgn3JIvsgzryiu3wEhwMa1EYvHFFstqLy2IYOxxJK0EPO4rH5eMiMjT+lLyyq3YK8jKKyOJ0S2xvOIKLLBNBgvMKyNy0StPBC100BozRjLPJZsIkTGCDO30E4MovVjFSH+cnES/PK31E8EuVnXJRTNEyNZaS6zY1x8LChHQZD8tiGMvo32xzA8Z0/bWUh/misfcF+etEC13ax12YUfzbTZDbAc+9NuMGZMI34Mn1LTiQzPi2C1yC3K42JQ7/VjhSPu9UOKdE/KYMaCXnEjOEsHSudBqXx532ps7dMvrQdN9esOtJCLIw75gNPbrtQ+ZdeddZ0t627Gru7zWmg98y/BaJ+/vK4IMz4ggrxQ/sPcKhy/++OSXb/756Kev/vrst+/++/DHL//89Ndv//3456///vz37///AAygAAdIwAIa8IAITKACF8jABjrwgRCMoAQnSMEKxi8gACH5BAkEANAALAAAAADGAMYAhwAAAAEBAQICAgMDAwQEBAUFBQYGBgcHBwgICAkJCQoKCgsLCwwMDA0NDQ4ODhMSEhsZGCIgHSklIi4qJjMuKT03MEM8NUhAOEtDOk1EPE5FPE5FPE5FPE5FPE5FPE5FPE9GPU9GPU9GPVBHPlBHP1FIP1FJQFJJQVNLQ1RPSFVYU1VfXVZoaFZtblZwclZzdld1eVd2eld2eld2eld3eld3eld3elh3ell3elt3el54e2R3eHN2c4Rza41wZqFoWK9jT7lfScRaQcpYPc5WOtBVOdFVONFVONFVONFVONFVONFVONFWONJYOdJaOtJiPdJtQdJ0RNJ6R9KASdKEStOGS9OHTdSHUNWHVNaHV9aHV9aIVdWIUdSKSdSPQdWTPNeaM9iiK9mmJdmoI9mpItmpItqqItqqItqqItqqItqqItqqItipJ9WpLtKpOM6pRM2rUc2uYM2xctC0gdK2jdS5l9a7odi9p9K8rNzArt7BseDEtOLGuOTJu+jNwOzRxe/WyvPbz/Te0vTh1/Xl2/Xn3vTo4fTq4/Xs5vbw6ffy6/j07vn17/r27/z38Pz38fz48fz48vz48/379v389/389/389/78+P79+f7+/v7+/v7+/v7+/v7+/v7+/v7+/v7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////wj+AKEJHEiwoMGDCBMqXMiwocOHECNKnEixosWLGDNq3Mixo8ePIEOKHEmypMmTKFOqXMmypcuXMGPKnEmzps2bOHPq3Mmzp8+fQIMKHUq0qNGjSJMqXcq0qdOnUKNKnUq1qtWrWLNq3cq1q9evYMOKHUu2rNmzaNOqXcu2rdu3cOPKnUu3rt27ePPq3cu3r9+/gAMLHky4sOHDiBMrXsy4sePHkCNLnky5ckRDgwxZVrmHR43Pn3ngabR5ZCLPoFPX4KG59Ec/OlTLrrHHdcdEsWfLHmR7I2rdqneQ7n3RD3DdeIhf/H08tQ7lFnM3Vz0cesRE02fzth5xUHbZybn+Q8T+PfV28Q+ll0+EHiLz7M/bP8RT/nN4+Q7fH9dRvTKkRRoZot5x50kGCSBxuHHGGW3EMQeAFhk33X2SEaLgghgu2AYgFxmiH2g7FBjZHxmWiGEckFyExw7BjVZZICbGeEYcGg2yxyD9TbZIGzLGyCF+DsXRY4xtQAikQosMKeMfRy4Eo5ImytGkQiRCWSIcUyYkpJUlZonQHFxm2IaXBz0Z5oxkGiTImQsyCdMfeNBBBx4i3sXjmYK8VEcIfPYZQgoU2mWmlTS2NAgLfiYaQg+t3bUllG2kyNIfilaaQqN1QXKhkoG0tEgKlVbaQ16QgNkjHIS41EOooQZaVyD+d5bopqGshpqCkXhBIsgffwSSKkx71lrprGkKtKqwitZRLEEqIKvoqMsK5Oyz0Ro7rZ90VAsNHdf26SqZeHTLZ51kLtLstdBqS+m0l2o7ELfOfrvsIsfWqqy7BfEBaqUskIvvInX0cC4LPsiLb0G4Hqzwwgw37PBFiQCyByCFPDyQJHZoYcXGHM8hicOCaMzxyFZo8aPCfZCs8sbZHlzIyjCfrK0cMK+sxcfa7lEzzC1XS/POKmvhLtAws3fRIH7UkcUcdwTySGSJEL2yzBIhkgUSWGeNxBN3QCaI1CrXRtEdT2htNhJZIOKYJGCTnOdEdZwt9xNPN7ZF2xzj3J3j3HwL3djPbfst0dV8y+1HY4DgbYUdE91RON9PODZH21JOpMXjfKvNmCR3S13xRIRjbvbhjQnSec1bEBuR6HLf25gkk8Msx+cTPcL62T07BsgcIluxhRx9YATF7VqLLZkkghidUejE+5tl3MRj7S4iZRPverV+EJ+Fwpez7nyaj3Rf+BOkL+xH9WdrUXfDj9xBx9VQaFEH1RbXb//9+Oev//789+///wAMoAAHSMACGvCACEygAhfIwAY68IEQjKAEJ0jBClrwghjMoAY3yMEOevCDIAyhCEdIwhKa8IQoTOGyAgIAIfkECQQA0QAsAAAAAMYAxgCHAAAAAQEBAgICAwMDBAQEBQUFBgYGBwcHCAgICQkJCgoKCwsLDAwMDQ0NDg4ODw8PEBAQEREREhISExMTFBQUFRUVFhYWFxcXGBgYGRkZGhoaGxsbHBwcHR0dHh4eHx8fICAgKSclMSwpNzEsPDUvQDgxQzoyRz00Sj81TEA2TUE3TkI3T0I3T0I3T0I3T0I3T0I3T0I3T0I3T0I3T0I3T0I3T0I3UEM4UEM4UkU4VUY5WEk5XEw5bVg2gmgxn34rvZUlyp8i0qUg2Kof2asf2asf2asf2asf2asf2asf2asf2aoh2agl2KMu1p041ZhD1ZVI1JNM1JBQ049R045R1I1S04xQ0otP0opO0olN0olN0ohM0oVL1HxH1m9C2GQ+2Vg52Vc42VY42VY42VY42VY42VY42VY42FY40Vg8yFpBul5IsGBNnGRXf2tncW5uZ3B0XHJ5VHN9UXN/T3SAT3SAT3SBT3SBT3SBT3SBUXWCUnaDVHeDVniEWXqFY4GLboePfI+UipaYlJycoqSfq6misqyit66hu6+gwbGfyrOdzbSd0LWd1Lib17yZ2L+Z3cWX4cqY5c+d7dqr8eK88+nP9OzX9e3c9u/k+PTw+fb0+vf1+vn3/Pr6/v39/v7+/v7+/v7+/v7+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CP4AowkcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS7as2bNo06pdy7at27dw48qdS7eu3bt48+rdy7ev37+AAwseTLiw4cOIEytezLix48eQI0ueTLkyRE2FBgW64ycQIUSWTVryc6e06dKBMoUOqWnQ6del/YBe7dE17NuXaHO0dLv3H026M2oi3fs2oeAYCxUvDhx5RdvLYed2TvFP9NuGqFO8fnuQ9oncYf4f/x5xc3jTs8k/JHTeNCb1EA2151y50iRJlTppNB8+/eNKUBQh4IBOTIJRJsRd511kkgzo4IBSvGcRItz50ZxjnQT44IZNVHLRaMsNcqFjDW5oohP6WdTabX5kF1klJsZYhCTCXZLZZ9NJxoSMMXoIn0OW8BgjjT82NImQJkpRZEMlIumgE0syJIWTG0a5UJNUFgGFlQpRkuWAkHCZECZfCkikmAdpSCUTEqJpECY7Ummgmwgd6aSSdCaEZYxQtAlTJpUQIogbhCRiSV+VxGnimTEZwgMOkEaKgxt+4tWJJFMOCEUkh8qEiRuShooDDy72ZYmPNGXyqKiijpenQf6gssoqqq8KpIissvagWq0CrYqrqKW+ismvsrrBazS3EitqD8cSoiyrxwryrKi7vorItJLycKwl2EZq7LHdQupqrc5iy0Olr76BrSLHDsTts9+2K1AlPRDrRrXyRpNJrKLywG6+BllCiBv1uiEIIvgCrPDCbm5CK8MEUeKIFFhULIUjlEAcDSaOVOzxx49ssjAlFH9sMhZS5NjuJSe3jLLI7W5SsssmOyLvIzS7nPGxM+f8sc28YuJzy3jWSsnQLR8rCdInP+zm0Ux/jK5EmFDSSBVdVNFIJQkvxnLUFmPEyBdllG12GV44rRjYFQNNESZVnC132Y50jVjHYM85UdUmXsztdxWOYdKzz0VPFLfffjPi2CRRqxwRJYgj/sXUh+Hts94T9R2534UvNsngH0uhNkSbI94FZBy3HPJFlZSO+GSVUCIJJY5XxIjrfnf66u24y617nq33fna7wpt9+rGaC995npALP7m8h+OuuLyZkO368fli0kXpdTPM+9xfjC4vJpM00kXWjVBit8bst+/++/DHL//89Ndv//3456///vz37///AAygAAdIwAIa8IAITKACF8jABjrwgRCMoAQnSMEKWvCCGMygBjfIwQ568INICQgAIfkECQQA0wAsAAAAAMYAxgCHAAAAAQEBAgICAwMDBAQEBQUFBgYGBwcHCAgICQkJCgoKCwsLDAwMDQ0NDg4ODw8PEBAQEREREhISExMTHhwZKCMfMCkjNy4nPDIqQDUsRDguSDowSz0xTT4yTj8zT0AzUEAzUEAzUEAzUEAzUEAzUEAzUEAzUEAzUEAzUEAzUUEzUUEzUUEzUUEzUUEzVUE0X0M0bEU0fEg1oU42uVI3x1Q31VY43Fc44Fc44Vc44Vg44Vg44Vg44Vg54Vg54Vk54Vs64F473mI922xB2HhG1n1I1YJK04ZM04lN0otO0oxO0oxO0o1O0o1P0o1O0o1O0o1N0o5M05FH1JVC1Zk716Aw2agl2qsg2qwe2q0d260d2q0d2q0d2q0d2q0d2a0e1qwg0KkkxqUrtp43lpFOd4RkYHt0T3SBSnKESHGFR3GGR3GGR3GHR3GHR3GHR3GHR3GHR3GHSHKISnOJTHWKUHeMV32RXoKVY4aYaYqccZCgeJWkepalhJijjpqjlZyjnZ+lqqWks6mivqyfy66X1a6O2rCN4LGO5LGQ57KT6LOU6bOV6rWW6riZ6r+c68Ge6sOh6sam6syt7NG17dS87drC7t3I7t/N6+DU6uHX7OPX8ezh8e7i8u/k8/Hm8/Lo9PPp9fTr9/Xt+ffw/fr0/v7+/v7+/v7+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////CP4ApwkcSLCgwYMIEypcyLChw4cQI0qcSLGixYsYM2rcyLGjx48gQ4ocSbKkyZMoU6pcybKly5cwY8qcSbOmzZs4c+rcybOnz59AgwodSrSo0aNIkypdyrSp06dQo0qdSrWq1atYs2rdyrWr169gw4odS7as2bNo06pdy7at27dw48qdS7eu3bt48+rdy7ev37+AAwseTLiw4cOIEytezLix48eQI0uebJdTpkB79gTKxIkyylGA2ogeLRrQKM8kM90hzbrNnUyoQ2ZqTbsN7NgdR62uzbrOadwb/fCm3Qe4Rk3Da2syjhFTctqCmF8M/Zy1H+kW91RnvQd7xTzbSf7n8U5ReHjR18lLFHRedCDInSo9QoTo0SNLGme3v934kZb/AP6HiCgZaRded411MkWADGphxSMYcVLHdnV0xlgnDWaoBYQXsVdddI0tqGGDnWAkyIS81QEiY/6N2OAUGXECHm15LNcYKS5qKEl+mNVRh2b8NWZJjhlyqB5ELRIZYBNHRuSIkg02CdGTUAYo5UNJVsnklQ0NWeV/RnKpEI5fbihmQ1kSWQUpZzJEShVV4tcmQ14SGeacClliRY534jkmlS+W6CdEnTziyBRVOPJIJYM2uhYolARSxqSBDLKJow5dEkMLnHbK6YqYHgQKIJ6WymkZl4ZqUBmmtgoDKP6qEiRIq7SWEatAm8BAK62U3Erqrq3GcCurwLYKq6rF0nqJqpkk2yqojTbrbKnQNjptqcuqSuy1LRwb6q/XChtrrtz2euus09p6q0DbAvvqugKNWiyq8BKkqavV1gvKJZJSSkmq9S62SSSIGNKEIZHIGfBApBzSxMMQP2wIwPViEvHFEEcSsMUYd+wIvKR0LHITmKzryMgis6lqyCh3vKOqHLd88ceqRiIzxobE6vDNF8eKCM89qyoJ0BDnDDPRD9McKstEm4sRJYsYIYQQRizitGM2A230RZkQ0cPXYH9NRJCMGcwzxRQxIkTYbH/dyGOb8KzxRYy0bXcPjMBt9r/IL1vkydp3sy2EJ5BljbO3FhkRuN1GRAaKJZEYYogjkpSc0SWL351tqHVn3vYiPnveNiKxei162ETEqvjpYDeuKiKsg026qpPE/nXezNreA9mOws56EuuSMsTpQ6h8K+aib77uJcMHPoTyIPs+uvELT+MJ1ElUTQnh1Xfv/ffghy/++OSXb/756Kev/vrst+/++/DHL//89Ndv//3456///vz37///AAygAAdIwAIa8IAITKACF8jABjrwgRsJCAAh+QQJBADfACwAAAAAxgDGAIcAAAABAQECAgIDAwMEBAQFBQUGBgYHBwcICAgJCQkKCgoLCwsMDAwNDQ0ODg4PDw8QEBARERESEhITExMUFBQVFRUWFhYXFxcYGBgZGRkaGhobGxscHBwdHR0eHh4fHx8gICAhISEiIiIjIyMkJCQlJSUmJiYnJycoKCgpKSkqKiotLCs2MS09NC9DNzBHOjFLPDJOPTNRPjNUQDNVQDRXQTRXQTRYQTRYQTRYQTRYQTRYQTRYQTRYQTRYQTRYQTRYQTRYQTRYQjRYQjRYQjRYQjRYQjRYQjRYQjRYQjRZQjVaQzZaRDZaRDdaRjpYSkFWT0pUVFNSWFpQXGFNYWtJZ3ZIantHbH9HbYFHbYFHbYFHbYFHbYFHbYFHbYFHbYFHbYFHbYFHbYFHbYFHboJHboJHboJHboJHboJHboJIb4NKcIRMcoVOdIdSdolWeoxcfpBfgZJhgpNjhJVlhZZmhpdnh5hqh5VthpJwhY5zhYp2hId5goN8gX9/f3yDfXiGe3WIeXGQdWuccWSsbFq3aFPCZEzKYUfTXkLaXD7eWzvgWjrhWjrhWjrhWjrhWzvhWzvhXDzhXT3hXz7hYUDgZkPga0bfcErfdU3eelHdflLbg1LYiFLVjFDTjk7SjkzSjkzSjkzSj0vSkUfSmznSoTDSpijSqCTSqSPSqiPSqiPTrCnVsDXYslHYr1/ZsmzXtn3VupDTvJjTwaHYy7Hf1cHi2Mjl3dHr5+Pu6+fy8O308e/29PH7+ff+/fz+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8I/gC/CRxIsKDBgwgTKlzIsKHDhxAjSpxIsaLFixgzatzIsaPHjyBDihxJsqTJkyhTqlzJsqXLlzBjypxJs6bNmzhz6tzJs6fPn0CDCh1KtKjRo0iTKl3KtKnTp1CjSp1KtarVq1izat3KtavXr2DDih1LtqzZs2jTql3Ltq3bt3Djyp1Lt67du3jz6t3Lt6/fv4ADCx5MuLDhw4gTK17MuLHjx5AjS55MubJlorpo0bpj5w6tW70ul6R1prTp0m5uiQ6p687p16VphV7NsZcb2Ljv0OboGjduWrsz3vLt242u4BfhEPetG3nF5b7tOKc4HDru6RNJW4eNS7KtWrFq/h3PqH376e6OebVSxb69KlizK1Y3b/pxLVbu87OydZG+6eaMvZLfgOzVYpFy/gGoWC0ENjjeRPNtZxxjvODX4ICtWNTbdsAFeGGDBlLUC4LQKajYhw1mWFFr0MnWmC4oEsgKRrTcBhscqjnGYIwD8oKRLrds1tln8TUWC48D8ocdRLYgmd+SEfHiZHszQgmRhU6+YiVEsEypSohbNtTLekjCEiZEMPLISpFnMnQfiqw82KZD6l0I35wT1fIKlq3AoiSeFfXyJ6CEFmrodLfIAkgURgiixyw+HsoQL4AYYemllj7RoaQI2cIopqAaAUiknBJ0S6ioilpqQVKkiuqm/qXK4iqqT6BX6qypyrLqqbiGKsiqtPQa6hOr6iFsqKQeKuuxmALL7KVQrIrLs5YGsuo3T1A7y7XBMgtFspwGwmyOe+VC7ky8ZNurrnn1IgssoMQLyiux5IKuILM+sW1etngi77/xwgrTLOqCKoitd8kC8MLz7oKuLbP0IYgsn+1FC8MMm3ntN7v4i/HCAkv6yscMe+JwqbuQjPG+nNqicsarzvLywlqWCu/MAK+qMM7yurJqLTzLqzGnuQQdL8ucumL0uZLeEjS7F/GSKCexzMI0ZDu/7AqbEvHCSSNgh91IJUg/1svIKntydUS1VCL2241wAq5jMn8My8kVzQL3vN6VzN1YLmj/60rIEuXi9t5wc2LZLbVYzTVFmyCOOOGF6i0539fGcjniCB8a+eZwUw4o6HvHsirpcA8t6SWoi122oV+3DvagysoOtt+E8nI46qZfW0vrl+AOO+q0l+r15pWIzmnbiG9i78YG8TILLJmMvUksykOv/fbcd+/99+CHL/745Jdv/vnop6/++uy37/778Mcv//z012///fjnr//+/Pfv//8ADKAAB0jAAhrwgAhMoAIXyMAGli8gADsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA';
2 |
--------------------------------------------------------------------------------