From e1c2c2514c930e9ae4fcdc58f693aef3bfe7d431 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Daubensch=C3=BCtz?= Date: Tue, 8 Dec 2015 10:23:37 +0100 Subject: [PATCH 001/305] Move AuthProxyHandler one directory up --- .../{proxy_routes => }/auth_proxy_handler.js | 8 ++++---- .../portfolioreview/components/pr_login_container.js | 0 js/components/whitelabel/prize/prize_routes.js | 2 +- js/components/whitelabel/wallet/wallet_routes.js | 2 +- js/routes.js | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) rename js/components/ascribe_routes/{proxy_routes => }/auth_proxy_handler.js (94%) delete mode 100644 js/components/whitelabel/prize/portfolioreview/components/pr_login_container.js diff --git a/js/components/ascribe_routes/proxy_routes/auth_proxy_handler.js b/js/components/ascribe_routes/auth_proxy_handler.js similarity index 94% rename from js/components/ascribe_routes/proxy_routes/auth_proxy_handler.js rename to js/components/ascribe_routes/auth_proxy_handler.js index 0eb4ad8f..a390fe2f 100644 --- a/js/components/ascribe_routes/proxy_routes/auth_proxy_handler.js +++ b/js/components/ascribe_routes/auth_proxy_handler.js @@ -3,10 +3,10 @@ import React from 'react'; import { History, RouteContext } from 'react-router'; -import UserStore from '../../../stores/user_store'; -import UserActions from '../../../actions/user_actions'; +import UserStore from '../../stores/user_store'; +import UserActions from '../../actions/user_actions'; -import AppConstants from '../../../constants/application_constants'; +import AppConstants from '../../constants/application_constants'; const { object } = React.PropTypes; @@ -89,7 +89,7 @@ export default function AuthProxyHandler({to, when}) { } else if(!exprToValidate && when === 'loggedOut' && redirectAuthenticated) { /* - * redirectAuthenticated contains an arbirary path + * redirectAuthenticated contains an arbitrary path * eg pieces/, editions/, collection, settings, ... * hence transitionTo cannot be used directly. * diff --git a/js/components/whitelabel/prize/portfolioreview/components/pr_login_container.js b/js/components/whitelabel/prize/portfolioreview/components/pr_login_container.js deleted file mode 100644 index e69de29b..00000000 diff --git a/js/components/whitelabel/prize/prize_routes.js b/js/components/whitelabel/prize/prize_routes.js index ec0269a5..742416b5 100644 --- a/js/components/whitelabel/prize/prize_routes.js +++ b/js/components/whitelabel/prize/prize_routes.js @@ -22,7 +22,7 @@ import PasswordResetContainer from '../../password_reset_container'; import CoaVerifyContainer from '../../coa_verify_container'; import ErrorNotFoundPage from '../../error_not_found_page'; -import AuthProxyHandler from '../../../components/ascribe_routes/proxy_routes/auth_proxy_handler'; +import AuthProxyHandler from '../../../components/ascribe_routes/auth_proxy_handler'; const ROUTES = { diff --git a/js/components/whitelabel/wallet/wallet_routes.js b/js/components/whitelabel/wallet/wallet_routes.js index 0a4e3a58..268a588b 100644 --- a/js/components/whitelabel/wallet/wallet_routes.js +++ b/js/components/whitelabel/wallet/wallet_routes.js @@ -40,7 +40,7 @@ import LumenusLanding from './components/lumenus/lumenus_landing'; import Vivi23Landing from './components/23vivi/23vivi_landing'; import Vivi23PieceList from './components/23vivi/23vivi_piece_list'; -import AuthProxyHandler from '../../../components/ascribe_routes/proxy_routes/auth_proxy_handler'; +import AuthProxyHandler from '../../../components/ascribe_routes/auth_proxy_handler'; import WalletApp from './wallet_app'; diff --git a/js/routes.js b/js/routes.js index 116fb663..45adae3c 100644 --- a/js/routes.js +++ b/js/routes.js @@ -25,7 +25,7 @@ import ErrorNotFoundPage from './components/error_not_found_page'; import RegisterPiece from './components/register_piece'; -import AuthProxyHandler from './components/ascribe_routes/proxy_routes/auth_proxy_handler'; +import AuthProxyHandler from './components/ascribe_routes/auth_proxy_handler'; let COMMON_ROUTES = ( From 7cb5fa6758865b92c4386959dcf4d8d9ba43a1d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Daubensch=C3=BCtz?= Date: Tue, 8 Dec 2015 10:38:32 +0100 Subject: [PATCH 002/305] Rename AuthProxyHandler to ProxyHandler and remove default export --- ...auth_proxy_handler.js => proxy_handler.js} | 6 +- .../whitelabel/prize/prize_routes.js | 26 +++--- .../whitelabel/wallet/wallet_routes.js | 90 +++++++++---------- js/routes.js | 18 ++-- 4 files changed, 71 insertions(+), 69 deletions(-) rename js/components/ascribe_routes/{auth_proxy_handler.js => proxy_handler.js} (97%) diff --git a/js/components/ascribe_routes/auth_proxy_handler.js b/js/components/ascribe_routes/proxy_handler.js similarity index 97% rename from js/components/ascribe_routes/auth_proxy_handler.js rename to js/components/ascribe_routes/proxy_handler.js index a390fe2f..17913bc5 100644 --- a/js/components/ascribe_routes/auth_proxy_handler.js +++ b/js/components/ascribe_routes/proxy_handler.js @@ -12,6 +12,8 @@ import AppConstants from '../../constants/application_constants'; const { object } = React.PropTypes; const WHEN_ENUM = ['loggedIn', 'loggedOut']; + + /** * Can be used in combination with `Route` as an intermediate Handler * between the actual component we want to display dependent on a certain state @@ -20,7 +22,7 @@ const WHEN_ENUM = ['loggedIn', 'loggedOut']; * @param {string} options.to Any type of route path that is defined in routes.js * @param {enum/string} options.when ('loggedIn' || 'loggedOut') */ -export default function AuthProxyHandler({to, when}) { +export function ProxyHandler({to, when}) { // validate `when`, must be contained in `WHEN_ENUM`. // Throw an error otherwise. @@ -31,7 +33,7 @@ export default function AuthProxyHandler({to, when}) { return (Component) => { return React.createClass({ - displayName: 'AuthProxyHandler', + displayName: 'ProxyHandler', propTypes: { location: object diff --git a/js/components/whitelabel/prize/prize_routes.js b/js/components/whitelabel/prize/prize_routes.js index 742416b5..a9b0ef56 100644 --- a/js/components/whitelabel/prize/prize_routes.js +++ b/js/components/whitelabel/prize/prize_routes.js @@ -22,7 +22,7 @@ import PasswordResetContainer from '../../password_reset_container'; import CoaVerifyContainer from '../../coa_verify_container'; import ErrorNotFoundPage from '../../error_not_found_page'; -import AuthProxyHandler from '../../../components/ascribe_routes/auth_proxy_handler'; +import { ProxyHandler } from '../../../components/ascribe_routes/proxy_handler'; const ROUTES = { @@ -31,26 +31,26 @@ const ROUTES = { + component={ProxyHandler({to: '/collection', when: 'loggedIn'})(SPLoginContainer)} /> + component={ProxyHandler({to: '/', when: 'loggedOut'})(LogoutContainer)}/> + component={ProxyHandler({to: '/collection', when: 'loggedIn'})(SPSignupContainer)} /> + component={ProxyHandler({to: '/collection', when: 'loggedIn'})(PasswordResetContainer)} /> + component={ProxyHandler({to: '/login', when: 'loggedOut'})(SPSettingsContainer)}/> @@ -64,20 +64,20 @@ const ROUTES = { + component={ProxyHandler({to: '/register_piece', when: 'loggedIn'})(SPLoginContainer)} /> + component={ProxyHandler({to: '/', when: 'loggedOut'})(LogoutContainer)} /> + component={ProxyHandler({to: '/register_piece', when: 'loggedIn'})(SPSignupContainer)} /> + component={ProxyHandler({to: '/register_piece', when: 'loggedIn'})(PasswordResetContainer)} /> diff --git a/js/components/whitelabel/wallet/wallet_routes.js b/js/components/whitelabel/wallet/wallet_routes.js index 268a588b..192cd31d 100644 --- a/js/components/whitelabel/wallet/wallet_routes.js +++ b/js/components/whitelabel/wallet/wallet_routes.js @@ -40,7 +40,7 @@ import LumenusLanding from './components/lumenus/lumenus_landing'; import Vivi23Landing from './components/23vivi/23vivi_landing'; import Vivi23PieceList from './components/23vivi/23vivi_piece_list'; -import AuthProxyHandler from '../../../components/ascribe_routes/auth_proxy_handler'; +import { ProxyHandler } from '../../../components/ascribe_routes/proxy_handler'; import WalletApp from './wallet_app'; @@ -51,29 +51,29 @@ let ROUTES = { + component={ProxyHandler({to: '/collection', when: 'loggedIn'})(LoginContainer)} /> + component={ProxyHandler({to: '/', when: 'loggedOut'})(LogoutContainer)}/> + component={ProxyHandler({to: '/collection', when: 'loggedIn'})(SignupContainer)} /> + component={ProxyHandler({to: '/collection', when: 'loggedIn'})(PasswordResetContainer)} /> + component={ProxyHandler({to: '/login', when: 'loggedOut'})(SettingsContainer)}/> + component={ProxyHandler({to: '/login', when: 'loggedOut'})(ContractSettings)}/> @@ -85,29 +85,29 @@ let ROUTES = { + component={ProxyHandler({to: '/collection', when: 'loggedIn'})(LoginContainer)} /> + component={ProxyHandler({to: '/', when: 'loggedOut'})(LogoutContainer)}/> + component={ProxyHandler({to: '/collection', when: 'loggedIn'})(SignupContainer)} /> + component={ProxyHandler({to: '/collection', when: 'loggedIn'})(PasswordResetContainer)} /> + component={ProxyHandler({to: '/login', when: 'loggedOut'})(SettingsContainer)}/> + component={ProxyHandler({to: '/login', when: 'loggedOut'})(ContractSettings)}/> @@ -120,39 +120,39 @@ let ROUTES = { + component={ProxyHandler({to: '/collection', when: 'loggedIn'})(LoginContainer)} /> + component={ProxyHandler({to: '/', when: 'loggedOut'})(LogoutContainer)}/> + component={ProxyHandler({to: '/collection', when: 'loggedIn'})(SignupContainer)} /> + component={ProxyHandler({to: '/collection', when: 'loggedIn'})(PasswordResetContainer)} /> + component={ProxyHandler({to: '/login', when: 'loggedOut'})(SettingsContainer)}/> + component={ProxyHandler({to: '/login', when: 'loggedOut'})(ContractSettings)}/> + component={ProxyHandler({to: '/login', when: 'loggedOut'})(IkonotvContractNotifications)}/> @@ -161,32 +161,32 @@ let ROUTES = { ), 'lumenus': ( - + + component={ProxyHandler({to: '/collection', when: 'loggedIn'})(LoginContainer)} /> + component={ProxyHandler({to: '/', when: 'loggedOut'})(LogoutContainer)}/> + component={ProxyHandler({to: '/collection', when: 'loggedIn'})(SignupContainer)} /> + component={ProxyHandler({to: '/collection', when: 'loggedIn'})(PasswordResetContainer)} /> + component={ProxyHandler({to: '/login', when: 'loggedOut'})(SettingsContainer)}/> + component={ProxyHandler({to: '/login', when: 'loggedOut'})(ContractSettings)}/> @@ -196,33 +196,33 @@ let ROUTES = { ), '23vivi': ( - + + component={ProxyHandler({to: '/collection', when: 'loggedIn'})(LoginContainer)} /> + component={ProxyHandler({to: '/', when: 'loggedOut'})(LogoutContainer)}/> + component={ProxyHandler({to: '/collection', when: 'loggedIn'})(SignupContainer)} /> + component={ProxyHandler({to: '/collection', when: 'loggedIn'})(PasswordResetContainer)} /> + component={ProxyHandler({to: '/login', when: 'loggedOut'})(SettingsContainer)}/> + component={ProxyHandler({to: '/login', when: 'loggedOut'})(ContractSettings)}/> diff --git a/js/routes.js b/js/routes.js index 45adae3c..2fef9483 100644 --- a/js/routes.js +++ b/js/routes.js @@ -25,39 +25,39 @@ import ErrorNotFoundPage from './components/error_not_found_page'; import RegisterPiece from './components/register_piece'; -import AuthProxyHandler from './components/ascribe_routes/auth_proxy_handler'; +import { ProxyHandler } from './components/ascribe_routes/proxy_handler'; let COMMON_ROUTES = ( + component={ProxyHandler({to: '/collection', when: 'loggedIn'})(LoginContainer)} /> + component={ProxyHandler({to: '/collection', when: 'loggedIn'})(SignupContainer)} /> + component={ProxyHandler({to: '/login', when: 'loggedOut'})(LogoutContainer)}/> + component={ProxyHandler({to: '/collection', when: 'loggedIn'})(PasswordResetContainer)} /> + component={ProxyHandler({to: '/login', when: 'loggedOut'})(SettingsContainer)}/> + component={ProxyHandler({to: '/login', when: 'loggedOut'})(ContractSettings)}/> From 50377ba478c7a09ab506fcd9e4fb3de3cf9b9e03 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Daubensch=C3=BCtz?= Date: Tue, 8 Dec 2015 11:17:04 +0100 Subject: [PATCH 003/305] Generalize ProxyHandler to take arbitrary redirect functions --- js/components/ascribe_routes/proxy_handler.js | 106 +++++++++--------- .../whitelabel/prize/prize_routes.js | 26 ++--- .../whitelabel/wallet/wallet_routes.js | 90 +++++++-------- js/routes.js | 18 +-- 4 files changed, 121 insertions(+), 119 deletions(-) diff --git a/js/components/ascribe_routes/proxy_handler.js b/js/components/ascribe_routes/proxy_handler.js index 17913bc5..c5c60506 100644 --- a/js/components/ascribe_routes/proxy_handler.js +++ b/js/components/ascribe_routes/proxy_handler.js @@ -1,7 +1,8 @@ 'use strict'; import React from 'react'; -import { History, RouteContext } from 'react-router'; +import { RouteContext } from 'react-router'; +import history from '../../history'; import UserStore from '../../stores/user_store'; import UserActions from '../../actions/user_actions'; @@ -12,18 +13,12 @@ import AppConstants from '../../constants/application_constants'; const { object } = React.PropTypes; const WHEN_ENUM = ['loggedIn', 'loggedOut']; - - /** - * Can be used in combination with `Route` as an intermediate Handler - * between the actual component we want to display dependent on a certain state - * that is required to display that component. + * Redirects the user conditionally according to his authentication * - * @param {string} options.to Any type of route path that is defined in routes.js * @param {enum/string} options.when ('loggedIn' || 'loggedOut') */ -export function ProxyHandler({to, when}) { - +export function AuthRedirect({to, when}) { // validate `when`, must be contained in `WHEN_ENUM`. // Throw an error otherwise. if(WHEN_ENUM.indexOf(when) === -1) { @@ -31,6 +26,52 @@ export function ProxyHandler({to, when}) { throw new Error(`"when" must be one of: [${whenValues}] got "${when}" instead`); } + return function(currentUser, query) { + const { redirectAuthenticated, redirect } = query; + + // The user of this handler specifies with `when`, what kind of status + // needs to be checked to conditionally do - if that state is `true` - + // a redirect. + // + // So if when === 'loggedIn', we're checking if the user is logged in (and + // vice versa) + let exprToValidate = when === 'loggedIn' ? currentUser && currentUser.email + : currentUser && !currentUser.email; + + // and redirect if `true`. + if(exprToValidate) { + window.setTimeout(() => history.replaceState(null, to, query)); + + // Otherwise there can also be the case that the backend + // wants to redirect the user to a specific route when the user is logged out already + } else if(!exprToValidate && when === 'loggedIn' && redirect) { + + delete query.redirect; + window.setTimeout(() => history.replaceState(null, '/' + redirect, query)); + + } else if(!exprToValidate && when === 'loggedOut' && redirectAuthenticated) { + /* + * redirectAuthenticated contains an arbitrary path + * eg pieces/, editions/, collection, settings, ... + * hence transitionTo cannot be used directly. + * + * While we're getting rid of `query.redirect` explicitly in the + * above `else if` statement, here it's sufficient to just call + * `baseUrl` + `redirectAuthenticated`, as it gets rid of queries as well. + */ + window.location = AppConstants.baseUrl + redirectAuthenticated; + } + }; +} + +/** + * Can be used in combination with `Route` as an intermediate Handler + * between the actual component we want to display dependent on a certain state + * that is required to display that component. + * + * @param {[function]} redirectFn A function that conditionally redirects + */ +export function ProxyHandler(redirectFn) { return (Component) => { return React.createClass({ displayName: 'ProxyHandler', @@ -41,7 +82,7 @@ export function ProxyHandler({to, when}) { // We need insert `RouteContext` here in order to be able // to use the `Lifecycle` widget in further down nested components - mixins: [History, RouteContext], + mixins: [RouteContext], getInitialState() { return UserStore.getState(); @@ -53,10 +94,10 @@ export function ProxyHandler({to, when}) { }, componentDidUpdate() { - // Only refresh this component, when UserSources are not loading - // data from the server if(!UserStore.isLoading()) { - this.redirectConditionally(); + const { currentUser } = this.state; + const { query } = this.props.location; + redirectFn(currentUser, query); } }, @@ -64,45 +105,6 @@ export function ProxyHandler({to, when}) { UserStore.unlisten(this.onChange); }, - redirectConditionally() { - const { query } = this.props.location; - const { redirectAuthenticated, redirect } = query; - - // The user of this handler specifies with `when`, what kind of status - // needs to be checked to conditionally do - if that state is `true` - - // a redirect. - // - // So if when === 'loggedIn', we're checking if the user is logged in (and - // vice versa) - let exprToValidate = when === 'loggedIn' ? - this.state.currentUser && this.state.currentUser.email : - this.state.currentUser && !this.state.currentUser.email; - - // and redirect if `true`. - if(exprToValidate) { - window.setTimeout(() => this.history.replaceState(null, to, query)); - - // Otherwise there can also be the case that the backend - // wants to redirect the user to a specific route when the user is logged out already - } else if(!exprToValidate && when === 'loggedIn' && redirect) { - - delete query.redirect; - window.setTimeout(() => this.history.replaceState(null, '/' + redirect, query)); - - } else if(!exprToValidate && when === 'loggedOut' && redirectAuthenticated) { - /* - * redirectAuthenticated contains an arbitrary path - * eg pieces/, editions/, collection, settings, ... - * hence transitionTo cannot be used directly. - * - * While we're getting rid of `query.redirect` explicitly in the - * above `else if` statement, here it's sufficient to just call - * `baseUrl` + `redirectAuthenticated`, as it gets rid of queries as well. - */ - window.location = AppConstants.baseUrl + redirectAuthenticated; - } - }, - onChange(state) { this.setState(state); }, diff --git a/js/components/whitelabel/prize/prize_routes.js b/js/components/whitelabel/prize/prize_routes.js index a9b0ef56..19215f08 100644 --- a/js/components/whitelabel/prize/prize_routes.js +++ b/js/components/whitelabel/prize/prize_routes.js @@ -22,7 +22,7 @@ import PasswordResetContainer from '../../password_reset_container'; import CoaVerifyContainer from '../../coa_verify_container'; import ErrorNotFoundPage from '../../error_not_found_page'; -import { ProxyHandler } from '../../../components/ascribe_routes/proxy_handler'; +import { ProxyHandler, AuthRedirect } from '../../../components/ascribe_routes/proxy_handler'; const ROUTES = { @@ -31,26 +31,26 @@ const ROUTES = { + component={ProxyHandler(AuthRedirect({to: '/collection', when: 'loggedIn'}))(SPLoginContainer)} /> + component={ProxyHandler(AuthRedirect({to: '/', when: 'loggedOut'}))(LogoutContainer)}/> + component={ProxyHandler(AuthRedirect({to: '/collection', when: 'loggedIn'}))(SPSignupContainer)} /> + component={ProxyHandler(AuthRedirect({to: '/collection', when: 'loggedIn'}))(PasswordResetContainer)} /> + component={ProxyHandler(AuthRedirect({to: '/login', when: 'loggedOut'}))(SPSettingsContainer)}/> @@ -64,20 +64,20 @@ const ROUTES = { + component={ProxyHandler(AuthRedirect({to: '/register_piece', when: 'loggedIn'}))(SPLoginContainer)} /> + component={ProxyHandler(AuthRedirect({to: '/', when: 'loggedOut'}))(LogoutContainer)} /> + component={ProxyHandler(AuthRedirect({to: '/register_piece', when: 'loggedIn'}))(SPSignupContainer)} /> + component={ProxyHandler(AuthRedirect({to: '/register_piece', when: 'loggedIn'}))(PasswordResetContainer)} /> diff --git a/js/components/whitelabel/wallet/wallet_routes.js b/js/components/whitelabel/wallet/wallet_routes.js index 192cd31d..92c6d77b 100644 --- a/js/components/whitelabel/wallet/wallet_routes.js +++ b/js/components/whitelabel/wallet/wallet_routes.js @@ -40,7 +40,7 @@ import LumenusLanding from './components/lumenus/lumenus_landing'; import Vivi23Landing from './components/23vivi/23vivi_landing'; import Vivi23PieceList from './components/23vivi/23vivi_piece_list'; -import { ProxyHandler } from '../../../components/ascribe_routes/proxy_handler'; +import { ProxyHandler, AuthRedirect } from '../../../components/ascribe_routes/proxy_handler'; import WalletApp from './wallet_app'; @@ -51,29 +51,29 @@ let ROUTES = { + component={ProxyHandler(AuthRedirect({to: '/collection', when: 'loggedIn'}))(LoginContainer)} /> + component={ProxyHandler(AuthRedirect({to: '/', when: 'loggedOut'}))(LogoutContainer)}/> + component={ProxyHandler(AuthRedirect({to: '/collection', when: 'loggedIn'}))(SignupContainer)} /> + component={ProxyHandler(AuthRedirect({to: '/collection', when: 'loggedIn'}))(PasswordResetContainer)} /> + component={ProxyHandler(AuthRedirect({to: '/login', when: 'loggedOut'}))(SettingsContainer)}/> + component={ProxyHandler(AuthRedirect({to: '/login', when: 'loggedOut'}))(ContractSettings)}/> @@ -85,29 +85,29 @@ let ROUTES = { + component={ProxyHandler(AuthRedirect({to: '/collection', when: 'loggedIn'}))(LoginContainer)} /> + component={ProxyHandler(AuthRedirect({to: '/', when: 'loggedOut'}))(LogoutContainer)}/> + component={ProxyHandler(AuthRedirect({to: '/collection', when: 'loggedIn'}))(SignupContainer)} /> + component={ProxyHandler(AuthRedirect({to: '/collection', when: 'loggedIn'}))(PasswordResetContainer)} /> + component={ProxyHandler(AuthRedirect({to: '/login', when: 'loggedOut'}))(SettingsContainer)}/> + component={ProxyHandler(AuthRedirect({to: '/login', when: 'loggedOut'}))(ContractSettings)}/> @@ -120,39 +120,39 @@ let ROUTES = { + component={ProxyHandler(AuthRedirect({to: '/collection', when: 'loggedIn'}))(LoginContainer)} /> + component={ProxyHandler(AuthRedirect({to: '/', when: 'loggedOut'}))(LogoutContainer)}/> + component={ProxyHandler(AuthRedirect({to: '/collection', when: 'loggedIn'}))(SignupContainer)} /> + component={ProxyHandler(AuthRedirect({to: '/collection', when: 'loggedIn'}))(PasswordResetContainer)} /> + component={ProxyHandler(AuthRedirect({to: '/login', when: 'loggedOut'}))(SettingsContainer)}/> + component={ProxyHandler(AuthRedirect({to: '/login', when: 'loggedOut'}))(ContractSettings)}/> + component={ProxyHandler(AuthRedirect({to: '/login', when: 'loggedOut'}))(IkonotvContractNotifications)}/> @@ -161,32 +161,32 @@ let ROUTES = { ), 'lumenus': ( - + + component={ProxyHandler(AuthRedirect({to: '/collection', when: 'loggedIn'}))(LoginContainer)} /> + component={ProxyHandler(AuthRedirect({to: '/', when: 'loggedOut'}))(LogoutContainer)}/> + component={ProxyHandler(AuthRedirect({to: '/collection', when: 'loggedIn'}))(SignupContainer)} /> + component={ProxyHandler(AuthRedirect({to: '/collection', when: 'loggedIn'}))(PasswordResetContainer)} /> + component={ProxyHandler(AuthRedirect({to: '/login', when: 'loggedOut'}))(SettingsContainer)}/> + component={ProxyHandler(AuthRedirect({to: '/login', when: 'loggedOut'}))(ContractSettings)}/> @@ -196,33 +196,33 @@ let ROUTES = { ), '23vivi': ( - + + component={ProxyHandler(AuthRedirect({to: '/collection', when: 'loggedIn'}))(LoginContainer)} /> + component={ProxyHandler(AuthRedirect({to: '/', when: 'loggedOut'}))(LogoutContainer)}/> + component={ProxyHandler(AuthRedirect({to: '/collection', when: 'loggedIn'}))(SignupContainer)} /> + component={ProxyHandler(AuthRedirect({to: '/collection', when: 'loggedIn'}))(PasswordResetContainer)} /> + component={ProxyHandler(AuthRedirect({to: '/login', when: 'loggedOut'}))(SettingsContainer)}/> + component={ProxyHandler(AuthRedirect({to: '/login', when: 'loggedOut'}))(ContractSettings)}/> diff --git a/js/routes.js b/js/routes.js index 2fef9483..49a284af 100644 --- a/js/routes.js +++ b/js/routes.js @@ -25,39 +25,39 @@ import ErrorNotFoundPage from './components/error_not_found_page'; import RegisterPiece from './components/register_piece'; -import { ProxyHandler } from './components/ascribe_routes/proxy_handler'; +import { ProxyHandler, AuthRedirect } from './components/ascribe_routes/proxy_handler'; let COMMON_ROUTES = ( + component={ProxyHandler(AuthRedirect({to: '/collection', when: 'loggedIn'}))(LoginContainer)} /> + component={ProxyHandler(AuthRedirect({to: '/collection', when: 'loggedIn'}))(SignupContainer)} /> + component={ProxyHandler(AuthRedirect({to: '/login', when: 'loggedOut'}))(LogoutContainer)}/> + component={ProxyHandler(AuthRedirect({to: '/collection', when: 'loggedIn'}))(PasswordResetContainer)} /> + component={ProxyHandler(AuthRedirect({to: '/login', when: 'loggedOut'}))(SettingsContainer)}/> + component={ProxyHandler(AuthRedirect({to: '/login', when: 'loggedOut'}))(ContractSettings)}/> From eaed3011557bb2a3d2ef8305aaec7b57d6a6dce0 Mon Sep 17 00:00:00 2001 From: diminator Date: Tue, 8 Dec 2015 11:46:30 +0100 Subject: [PATCH 004/305] coa flush causes dispatcherror --- js/actions/coa_actions.js | 16 ++++++++-------- js/components/ascribe_detail/edition.js | 3 ++- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/js/actions/coa_actions.js b/js/actions/coa_actions.js index d3d13290..a7f36305 100644 --- a/js/actions/coa_actions.js +++ b/js/actions/coa_actions.js @@ -14,27 +14,27 @@ class CoaActions { } fetchOrCreate(id, bitcoinId) { - return Q.Promise((resolve, reject) => { + //return Q.Promise((resolve, reject) => { CoaFetcher.fetchOne(id) .then((res) => { if (res.coa) { this.actions.updateCoa(res.coa); - resolve(res.coa); + //resolve(res.coa); } else { - this.actions.create(bitcoinId); + this.actions.create(bitcoinId).defer(); } }) .catch((err) => { console.logGlobal(err); this.actions.updateCoa(null); - reject(err); + //reject(err); }); - }); + //}); } create(bitcoinId) { - return Q.Promise((resolve, reject) => { + //return Q.Promise((resolve, reject) => { CoaFetcher.create(bitcoinId) .then((res) => { this.actions.updateCoa(res.coa); @@ -42,9 +42,9 @@ class CoaActions { .catch((err) => { console.logGlobal(err); this.actions.updateCoa(null); - reject(err); + //reject(err); }); - }); + //}); } } diff --git a/js/components/ascribe_detail/edition.js b/js/components/ascribe_detail/edition.js index bc2f0cfa..3c88e022 100644 --- a/js/components/ascribe_detail/edition.js +++ b/js/components/ascribe_detail/edition.js @@ -256,6 +256,7 @@ let CoaDetails = React.createClass({ componentDidMount() { let { edition } = this.props; CoaStore.listen(this.onChange); + CoaActions.updateCoa({}); if(edition.coa) { CoaActions.fetchOrCreate(edition.coa, edition.bitcoin_id); } @@ -300,7 +301,7 @@ let CoaDetails = React.createClass({ } return (
- +
); } From bf6b78c058a81b873f358e4e4292c491bc1d9bc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Daubensch=C3=BCtz?= Date: Tue, 8 Dec 2015 11:49:03 +0100 Subject: [PATCH 005/305] Revert "coa flush causes dispatcherror" This reverts commit eaed3011557bb2a3d2ef8305aaec7b57d6a6dce0. --- js/actions/coa_actions.js | 16 ++++++++-------- js/components/ascribe_detail/edition.js | 3 +-- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/js/actions/coa_actions.js b/js/actions/coa_actions.js index a7f36305..d3d13290 100644 --- a/js/actions/coa_actions.js +++ b/js/actions/coa_actions.js @@ -14,27 +14,27 @@ class CoaActions { } fetchOrCreate(id, bitcoinId) { - //return Q.Promise((resolve, reject) => { + return Q.Promise((resolve, reject) => { CoaFetcher.fetchOne(id) .then((res) => { if (res.coa) { this.actions.updateCoa(res.coa); - //resolve(res.coa); + resolve(res.coa); } else { - this.actions.create(bitcoinId).defer(); + this.actions.create(bitcoinId); } }) .catch((err) => { console.logGlobal(err); this.actions.updateCoa(null); - //reject(err); + reject(err); }); - //}); + }); } create(bitcoinId) { - //return Q.Promise((resolve, reject) => { + return Q.Promise((resolve, reject) => { CoaFetcher.create(bitcoinId) .then((res) => { this.actions.updateCoa(res.coa); @@ -42,9 +42,9 @@ class CoaActions { .catch((err) => { console.logGlobal(err); this.actions.updateCoa(null); - //reject(err); + reject(err); }); - //}); + }); } } diff --git a/js/components/ascribe_detail/edition.js b/js/components/ascribe_detail/edition.js index 3c88e022..bc2f0cfa 100644 --- a/js/components/ascribe_detail/edition.js +++ b/js/components/ascribe_detail/edition.js @@ -256,7 +256,6 @@ let CoaDetails = React.createClass({ componentDidMount() { let { edition } = this.props; CoaStore.listen(this.onChange); - CoaActions.updateCoa({}); if(edition.coa) { CoaActions.fetchOrCreate(edition.coa, edition.bitcoin_id); } @@ -301,7 +300,7 @@ let CoaDetails = React.createClass({ } return (
- +
); } From da75353b00120f5293b89a1b9a7a346ba3f93c32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Daubensch=C3=BCtz?= Date: Tue, 8 Dec 2015 13:28:47 +0100 Subject: [PATCH 006/305] Refactor Edition endpoints to create Coa on demand properly --- js/actions/coa_actions.js | 51 ------------- js/actions/edition_actions.js | 19 ++--- js/components/ascribe_detail/edition.js | 75 +++---------------- .../ascribe_detail/edition_container.js | 47 ++++++------ js/sources/edition_source.js | 36 +++++++++ js/stores/coa_store.js | 22 ------ js/stores/edition_store.js | 46 ++++++++++-- 7 files changed, 118 insertions(+), 178 deletions(-) delete mode 100644 js/actions/coa_actions.js create mode 100644 js/sources/edition_source.js delete mode 100644 js/stores/coa_store.js diff --git a/js/actions/coa_actions.js b/js/actions/coa_actions.js deleted file mode 100644 index d3d13290..00000000 --- a/js/actions/coa_actions.js +++ /dev/null @@ -1,51 +0,0 @@ -'use strict'; - -import { alt } from '../alt'; -import CoaFetcher from '../fetchers/coa_fetcher'; - -import Q from 'q'; - -class CoaActions { - constructor() { - this.generateActions( - 'updateCoa', - 'flushCoa' - ); - } - - fetchOrCreate(id, bitcoinId) { - return Q.Promise((resolve, reject) => { - CoaFetcher.fetchOne(id) - .then((res) => { - if (res.coa) { - this.actions.updateCoa(res.coa); - resolve(res.coa); - } - else { - this.actions.create(bitcoinId); - } - }) - .catch((err) => { - console.logGlobal(err); - this.actions.updateCoa(null); - reject(err); - }); - }); - } - - create(bitcoinId) { - return Q.Promise((resolve, reject) => { - CoaFetcher.create(bitcoinId) - .then((res) => { - this.actions.updateCoa(res.coa); - }) - .catch((err) => { - console.logGlobal(err); - this.actions.updateCoa(null); - reject(err); - }); - }); - } -} - -export default alt.createActions(CoaActions); diff --git a/js/actions/edition_actions.js b/js/actions/edition_actions.js index 3f659524..9563ed92 100644 --- a/js/actions/edition_actions.js +++ b/js/actions/edition_actions.js @@ -1,27 +1,18 @@ 'use strict'; import { alt } from '../alt'; -import EditionFetcher from '../fetchers/edition_fetcher'; class EditionActions { constructor() { this.generateActions( - 'updateEdition', - 'editionFailed' + 'fetchEdition', + 'successFetchEdition', + 'successFetchCoa', + 'errorCoa', + 'errorEdition' ); } - - fetchOne(editionId) { - EditionFetcher.fetchOne(editionId) - .then((res) => { - this.actions.updateEdition(res.edition); - }) - .catch((err) => { - console.logGlobal(err); - this.actions.editionFailed(err.json); - }); - } } export default alt.createActions(EditionActions); diff --git a/js/components/ascribe_detail/edition.js b/js/components/ascribe_detail/edition.js index bc2f0cfa..567c7d7f 100644 --- a/js/components/ascribe_detail/edition.js +++ b/js/components/ascribe_detail/edition.js @@ -8,11 +8,6 @@ import Row from 'react-bootstrap/lib/Row'; import Col from 'react-bootstrap/lib/Col'; import Glyphicon from 'react-bootstrap/lib/Glyphicon'; -import UserActions from '../../actions/user_actions'; -import UserStore from '../../stores/user_store'; -import CoaActions from '../../actions/coa_actions'; -import CoaStore from '../../stores/coa_store'; - import HistoryIterator from './history_iterator'; import MediaContainer from './media_container'; @@ -44,6 +39,7 @@ let Edition = React.createClass({ actionPanelButtonListType: React.PropTypes.func, furtherDetailsType: React.PropTypes.func, edition: React.PropTypes.object, + currentUser: React.PropTypes.object, loadEdition: React.PropTypes.func }, @@ -55,32 +51,6 @@ let Edition = React.createClass({ }; }, - getInitialState() { - return UserStore.getState(); - }, - - componentDidMount() { - UserStore.listen(this.onChange); - UserActions.fetchCurrentUser(); - }, - - componentWillUnmount() { - // Flushing the coa state is essential to not displaying the same - // data to the user while he's on another edition - // - // BUGFIX: Previously we had this line in the componentWillUnmount of - // CoaDetails, but since we're reloading the edition after performing an ACL action - // on it, this resulted in multiple events occupying the dispatcher, which eventually - // resulted in crashing the app. - CoaActions.flushCoa(); - - UserStore.unlisten(this.onChange); - }, - - onChange(state) { - this.setState(state); - }, - render() { let FurtherDetailsType = this.props.furtherDetailsType; @@ -101,13 +71,13 @@ let Edition = React.createClass({ + coa={this.props.edition.coa}/> + currentUser={this.props.currentUser}/> {return {'bitcoin_id': this.props.edition.bitcoin_id}; }} label={getLangText('Personal note (public)')} @@ -154,7 +124,7 @@ let Edition = React.createClass({ show={!!this.props.edition.public_note || !!this.props.edition.acl.acl_edit} successMessage={getLangText('Public edition note saved')} url={ApiUrls.note_public_edition} - currentUser={this.state.currentUser}/> + currentUser={this.props.currentUser}/>

- + @@ -291,10 +238,10 @@ let CoaDetails = React.createClass({

); - } else if(typeof this.state.coa === 'string'){ + } else if(typeof this.props.coa === 'string'){ return (
- {this.state.coa} + {this.props.coa}
); } diff --git a/js/components/ascribe_detail/edition_container.js b/js/components/ascribe_detail/edition_container.js index 0e74e38d..2a0e7d5e 100644 --- a/js/components/ascribe_detail/edition_container.js +++ b/js/components/ascribe_detail/edition_container.js @@ -9,12 +9,16 @@ import { ResourceNotFoundError } from '../../models/errors'; import EditionActions from '../../actions/edition_actions'; import EditionStore from '../../stores/edition_store'; +import UserActions from '../../actions/user_actions'; +import UserStore from '../../stores/user_store'; + import Edition from './edition'; import AscribeSpinner from '../ascribe_spinner'; import { getLangText } from '../../utils/lang_utils'; import { setDocumentTitle } from '../../utils/dom_utils'; +import { mergeOptions } from '../../utils/general_utils'; /** @@ -30,33 +34,37 @@ let EditionContainer = React.createClass({ mixins: [History, ReactError], getInitialState() { - return EditionStore.getState(); + return mergeOptions( + EditionStore.getState(), + UserStore.getState() + ); }, componentDidMount() { EditionStore.listen(this.onChange); + UserStore.listen(this.onChange); // Every time we're entering the edition detail page, // just reset the edition that is saved in the edition store // as it will otherwise display wrong/old data once the user loads // the edition detail a second time - EditionActions.updateEdition({}); - this.loadEdition(); + EditionActions.fetchEdition(this.props.params.editionId); + + UserActions.fetchCurrentUser(); }, // This is done to update the container when the user clicks on the prev or next // button to update the URL parameter (and therefore to switch pieces) componentWillReceiveProps(nextProps) { if(this.props.params.editionId !== nextProps.params.editionId) { - EditionActions.updateEdition({}); - EditionActions.fetchOne(nextProps.params.editionId); + EditionActions.fetchEdition(this.props.params.editionId); } }, componentDidUpdate() { - const { editionError } = this.state; + const { editionMeta } = this.state; - if(editionError && editionError.status === 404) { + if(editionMeta.err && editionMeta.err.status === 404) { this.throws(new ResourceNotFoundError(getLangText("Oops, the edition you're looking for doesn't exist."))); } }, @@ -68,30 +76,27 @@ let EditionContainer = React.createClass({ onChange(state) { this.setState(state); - if (!state.edition.digital_work) { - return; - } - let isEncoding = state.edition.digital_work.isEncoding; - if (state.edition.digital_work.mime === 'video' && typeof isEncoding === 'number' && isEncoding !== 100 && !this.state.timerId) { - let timerId = window.setInterval(() => EditionActions.fetchOne(this.props.params.editionId), 10000); - this.setState({timerId: timerId}); - } - }, - loadEdition() { - EditionActions.fetchOne(this.props.params.editionId); + if(state && state.edition && state.edition.digital_work) { + let isEncoding = state.edition.digital_work.isEncoding; + if (state.edition.digital_work.mime === 'video' && typeof isEncoding === 'number' && isEncoding !== 100 && !this.state.timerId) { + let timerId = window.setInterval(() => EditionActions.fetchOne(this.props.params.editionId), 10000); + this.setState({timerId: timerId}); + } + } }, render() { - if(this.state.edition && this.state.edition.id) { + if (this.state.edition && this.state.edition.id && + this.state.currentUser && this.state.currentUser.email) { setDocumentTitle([this.state.edition.artist_name, this.state.edition.title].join(', ')); - return ( + currentUser={this.state.currentUser} + loadEdition={() => EditionActions.fetchEdition(this.props.params.editionId)} /> ); } else { return ( diff --git a/js/sources/edition_source.js b/js/sources/edition_source.js new file mode 100644 index 00000000..157b0087 --- /dev/null +++ b/js/sources/edition_source.js @@ -0,0 +1,36 @@ +'use strict'; + +import requests from '../utils/requests'; + +import EditionActions from '../actions/edition_actions'; + + +const EditionSource = { + lookupEdition: { + remote(state) { + return requests.get('edition', { bitcoin_id: state.editionMeta.idToFetch }); + }, + + success: EditionActions.successFetchEdition, + error: EditionActions.errorEdition + }, + + lookupCoa: { + remote(state) { + return requests.get('coa', { id: state.edition.coa }); + }, + + success: EditionActions.successFetchCoa, + error: EditionActions.errorCoa + }, + + performCreateCoa: { + remote(state) { + return requests.post('coa_create', {body: { bitcoin_id: state.edition.bitcoin_id }}); + }, + success: EditionActions.successFetchCoa, + error: EditionActions.errorCoa + } +}; + +export default EditionSource; \ No newline at end of file diff --git a/js/stores/coa_store.js b/js/stores/coa_store.js deleted file mode 100644 index e76e480e..00000000 --- a/js/stores/coa_store.js +++ /dev/null @@ -1,22 +0,0 @@ -'use strict'; - -import { alt } from '../alt'; -import CoaActions from '../actions/coa_actions'; - - -class CoaStore { - constructor() { - this.coa = {}; - this.bindActions(CoaActions); - } - - onUpdateCoa(coa) { - this.coa = coa; - } - - onFlushCoa() { - this.coa = {}; - } -} - -export default alt.createStore(CoaStore, 'CoaStore'); diff --git a/js/stores/edition_store.js b/js/stores/edition_store.js index 22e78d23..212dc25c 100644 --- a/js/stores/edition_store.js +++ b/js/stores/edition_store.js @@ -1,23 +1,57 @@ 'use strict'; import { alt } from '../alt'; + import EditionActions from '../actions/edition_actions'; +import EditionSource from '../sources/edition_source'; class EditionStore { constructor() { - this.edition = {}; - this.editionError = null; + this.edition = null; + this.editionMeta = { + err: null, + idToFetch: null + }; + this.coaMeta = { + err: null + }; + this.bindActions(EditionActions); + this.registerAsync(EditionSource); } - onUpdateEdition(edition) { + onFetchEdition(idToFetch) { + this.editionMeta.idToFetch = idToFetch; + + if(!this.getInstance().isLoading()) { + this.getInstance().lookupEdition(); + } + } + + onSuccessFetchEdition({ edition }) { + this.editionMeta.err = null; + this.editionMeta.idToFetch = null; this.edition = edition; - this.editionError = null; + + if(this.edition && this.edition.coa && typeof this.edition.coa.constructor !== Object) { + this.getInstance().lookupCoa(); + } else if(this.edition && !this.edition.coa) { + this.getInstance().performCreateCoa(); + } } - onEditionFailed(error) { - this.editionError = error; + onSuccessFetchCoa({ coa }) { + this.coaMeta.err = null; + this.edition.coa = coa; + } + + onEditionError(err) { + this.editionMeta.err = err; + } + + onCoaError(err) { + this.coaMeta.err = err; } } From 4fa25ca446102731971ab76c7f380d23926df6da Mon Sep 17 00:00:00 2001 From: Brett Sun Date: Tue, 8 Dec 2015 13:41:15 +0100 Subject: [PATCH 007/305] Add option to specify the max edition to fetch and update the edition list to --- js/actions/edition_list_actions.js | 20 ++++++--- js/components/piece_list.js | 2 +- js/stores/edition_list_store.js | 69 ++++++++++++++++++++---------- 3 files changed, 62 insertions(+), 29 deletions(-) diff --git a/js/actions/edition_list_actions.js b/js/actions/edition_list_actions.js index 6f9881ee..7d1e47e7 100644 --- a/js/actions/edition_list_actions.js +++ b/js/actions/edition_list_actions.js @@ -17,7 +17,7 @@ class EditionListActions { ); } - fetchEditionList(pieceId, page, pageSize, orderBy, orderAsc, filterBy) { + fetchEditionList(pieceId, page, pageSize, orderBy, orderAsc, filterBy, maxEdition) { if((!orderBy && typeof orderAsc === 'undefined') || !orderAsc) { orderBy = 'edition_number'; orderAsc = true; @@ -29,23 +29,32 @@ class EditionListActions { pageSize = 10; } + let itemsToFetch = pageSize; + // If we only want to fetch up to a specified edition, fetch all pages up to it + // as one page and adjust afterwards + if (typeof maxEdition === 'number') { + itemsToFetch = Math.ceil(maxEdition / pageSize) * pageSize; + page = 1; + } + return Q.Promise((resolve, reject) => { EditionListFetcher - .fetch(pieceId, page, pageSize, orderBy, orderAsc, filterBy) + .fetch(pieceId, page, itemsToFetch, orderBy, orderAsc, filterBy) .then((res) => { - if(res && !res.editions) { + if (res && !res.editions) { throw new Error('Piece has no editions to fetch.'); } this.actions.updateEditionList({ pieceId, + editionListOfPiece: res.editions, page, pageSize, orderBy, orderAsc, + count: res.count, filterBy, - 'editionListOfPiece': res.editions, - 'count': res.count + maxEdition }); resolve(res); }) @@ -54,7 +63,6 @@ class EditionListActions { reject(err); }); }); - } } diff --git a/js/components/piece_list.js b/js/components/piece_list.js index 4a269aa8..85706d7c 100644 --- a/js/components/piece_list.js +++ b/js/components/piece_list.js @@ -63,7 +63,7 @@ let PieceList = React.createClass({ componentDidMount() { let page = this.props.location.query.page || 1; - + PieceListStore.listen(this.onChange); EditionListStore.listen(this.onChange); diff --git a/js/stores/edition_list_store.js b/js/stores/edition_list_store.js index 6b4d64f9..4f33dc6f 100644 --- a/js/stores/edition_list_store.js +++ b/js/stores/edition_list_store.js @@ -12,7 +12,11 @@ class EditionListStore { this.bindActions(EditionsListActions); } - onUpdateEditionList({pieceId, editionListOfPiece, page, pageSize, orderBy, orderAsc, count, filterBy}) { + onUpdateEditionList({pieceId, editionListOfPiece, page, pageSize, orderBy, orderAsc, count, filterBy, maxEdition}) { + // if editionList for a specific piece does not exist yet, + // just initialize a new array + const pieceEditionList = this.editionList[pieceId] || []; + /* Basically there are two modes an edition list can be updated. @@ -20,40 +24,61 @@ class EditionListStore { 2. The elements are already defined => merge current objects with the new ones from the server */ - for(let i = 0; i < editionListOfPiece.length; i++) { - - // if editionList for a specific piece does not exist yet, - // just initialize a new array - if(!this.editionList[pieceId]) { - this.editionList[pieceId] = []; - } - - // this is the index formula for accessing an edition of a specific - // page - let storeEditionIndex = (page - 1) * pageSize + i; - let editionsForPieces = this.editionList[pieceId]; + editionListOfPiece.forEach((updatedEdition, index) => { + // this is the index formula for accessing an edition starting from a specific page + const storeEditionIndex = (page - 1) * pageSize + index; // if edition already exists, just merge - if(editionsForPieces[storeEditionIndex]) { - editionsForPieces[storeEditionIndex] = React.addons.update(editionsForPieces[storeEditionIndex], {$merge: editionListOfPiece[i]}); + if(pieceEditionList[storeEditionIndex]) { + pieceEditionList[storeEditionIndex] = React.addons.update(pieceEditionList[storeEditionIndex], {$merge: updatedEdition}); } else { // if does not exist, assign - editionsForPieces[storeEditionIndex] = editionListOfPiece[i]; + pieceEditionList[storeEditionIndex] = updatedEdition; + } + }); + + // Remove editions after specified max by finding the index of the first + // edition larger than the max edition and using that to cut off the rest of the list + if (typeof maxEdition === 'number') { + const largerThanMaxIndex = pieceEditionList.findIndex(edition => edition.edition_number > maxEdition); + + if (largerThanMaxIndex !== -1) { + // The API defines inflexible page buckets based on the page number + // and page size, so we cannot just arbitrarily cut off the end of + // a page and expect get the rest of it on the next pagination request. + // Hence, we use the max edition index as a guide for which page to + // cut off to so as to always provide complete pages. + page = Math.ceil(largerThanMaxIndex / pageSize); + + // We only want to cut off the list if there are more editions than + // there should be (ie. we're not already at the end of the editions) + const totalPageSize = page * pageSize; + if (pieceEditionList.length > totalPageSize) { + pieceEditionList.length = totalPageSize; + } } } + const lastEdition = pieceEditionList[pieceEditionList.length - 1]; + /** * page, pageSize, orderBy, orderAsc and count are specific to a single list of editions * therefore they need to be saved in relation to their parent-piece. * * Default values for both are set in the editon_list_actions. */ - this.editionList[pieceId].page = page; - this.editionList[pieceId].pageSize = pageSize; - this.editionList[pieceId].orderBy = orderBy; - this.editionList[pieceId].orderAsc = orderAsc; - this.editionList[pieceId].count = count; - this.editionList[pieceId].filterBy = filterBy; + pieceEditionList.page = page; + pieceEditionList.pageSize = pageSize; + pieceEditionList.orderBy = orderBy; + pieceEditionList.orderAsc = orderAsc; + pieceEditionList.count = count; + pieceEditionList.filterBy = filterBy; + + if (pieceEditionList.maxSeen == null || lastEdition.edition_number > pieceEditionList.maxSeen) { + pieceEditionList.maxSeen = lastEdition.edition_number; + } + + this.editionList[pieceId] = pieceEditionList; } /** From a844189e86486dbeadb35c8e5ff3cd3affdf9938 Mon Sep 17 00:00:00 2001 From: Brett Sun Date: Tue, 8 Dec 2015 13:44:10 +0100 Subject: [PATCH 008/305] Attempt to show as close as possible of the original edition list on filter/unfilter refreshes --- js/stores/edition_list_store.js | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/js/stores/edition_list_store.js b/js/stores/edition_list_store.js index 4f33dc6f..9fee842c 100644 --- a/js/stores/edition_list_store.js +++ b/js/stores/edition_list_store.js @@ -85,7 +85,7 @@ class EditionListStore { * We often just have to refresh the edition list for a certain pieceId, * this method provides exactly that functionality without any side effects */ - onRefreshEditionList({pieceId, filterBy = this.editionList[pieceId].filterBy}) { + onRefreshEditionList({pieceId, filterBy}) { const pieceEditionList = this.editionList[pieceId]; // It may happen that the user enters the site logged in already @@ -97,16 +97,21 @@ class EditionListStore { return; } + if (typeof filterBy !== 'object') { + filterBy = pieceEditionList.filterBy; + } + + const { maxSeen, orderAsc, orderBy, pageSize } = pieceEditionList; + // to clear an array, david walsh recommends to just set it's length to zero // http://davidwalsh.name/empty-array pieceEditionList.length = 0; - // refetch editions from the beginning with the previous settings EditionsListActions - .fetchEditionList(pieceId, 1, pieceEditionList.pageSize, - pieceEditionList.orderBy, - pieceEditionList.orderAsc, - filterBy) + .fetchEditionList(pieceId, 1, pageSize, + orderBy, + orderAsc, + filterBy, maxSeen) .catch(console.logGlobal); } @@ -152,7 +157,7 @@ class EditionListStore { if(!this.isEditionListOpenForPieceId[pieceId].show) { // to clear an array, david walsh recommends to just set it's length to zero // http://davidwalsh.name/empty-array - + this.editionList[pieceId].length = 0; } } From 2cc02d9599f28c6968507079ff383c18714f9a90 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Daubensch=C3=BCtz?= Date: Tue, 8 Dec 2015 14:18:31 +0100 Subject: [PATCH 009/305] Increase robustness of coa fetching routine --- js/actions/edition_actions.js | 1 + js/components/ascribe_detail/edition.js | 25 +++++++++++++++++-- .../ascribe_detail/edition_container.js | 2 ++ js/fetchers/coa_fetcher.js | 18 ------------- js/fetchers/edition_fetcher.js | 15 ----------- js/stores/edition_store.js | 17 ++++++++++--- js/utils/requests.js | 9 ++++++- 7 files changed, 48 insertions(+), 39 deletions(-) delete mode 100644 js/fetchers/coa_fetcher.js delete mode 100644 js/fetchers/edition_fetcher.js diff --git a/js/actions/edition_actions.js b/js/actions/edition_actions.js index 9563ed92..1727deff 100644 --- a/js/actions/edition_actions.js +++ b/js/actions/edition_actions.js @@ -9,6 +9,7 @@ class EditionActions { 'fetchEdition', 'successFetchEdition', 'successFetchCoa', + 'flushEdition', 'errorCoa', 'errorEdition' ); diff --git a/js/components/ascribe_detail/edition.js b/js/components/ascribe_detail/edition.js index 567c7d7f..d12d2a41 100644 --- a/js/components/ascribe_detail/edition.js +++ b/js/components/ascribe_detail/edition.js @@ -39,6 +39,7 @@ let Edition = React.createClass({ actionPanelButtonListType: React.PropTypes.func, furtherDetailsType: React.PropTypes.func, edition: React.PropTypes.object, + coaError: React.PropTypes.object, currentUser: React.PropTypes.object, loadEdition: React.PropTypes.func }, @@ -77,7 +78,9 @@ let Edition = React.createClass({ title={getLangText('Certificate of Authenticity')} show={this.props.edition.acl.acl_coa === true}> + coa={this.props.edition.coa} + coaError={this.props.coaError} + editionId={this.props.edition.bitcoin_id}/>
+

{getLangText('There was an error generating your Certificate of Authenticity.')}

+

+ {getLangText('Try to refresh the page. If this happens repeatedly, please ')} + {getLangText('contact us')}. +

+ + ); + } if(this.props.coa && this.props.coa.url_safe) { return (
diff --git a/js/components/ascribe_detail/edition_container.js b/js/components/ascribe_detail/edition_container.js index 2a0e7d5e..add06ccd 100644 --- a/js/components/ascribe_detail/edition_container.js +++ b/js/components/ascribe_detail/edition_container.js @@ -48,6 +48,7 @@ let EditionContainer = React.createClass({ // just reset the edition that is saved in the edition store // as it will otherwise display wrong/old data once the user loads // the edition detail a second time + EditionActions.flushEdition(); EditionActions.fetchEdition(this.props.params.editionId); UserActions.fetchCurrentUser(); @@ -95,6 +96,7 @@ let EditionContainer = React.createClass({ actionPanelButtonListType={this.props.actionPanelButtonListType} furtherDetailsType={this.props.furtherDetailsType} edition={this.state.edition} + coaError={this.state.coaMeta.err} currentUser={this.state.currentUser} loadEdition={() => EditionActions.fetchEdition(this.props.params.editionId)} /> ); diff --git a/js/fetchers/coa_fetcher.js b/js/fetchers/coa_fetcher.js deleted file mode 100644 index e4956c66..00000000 --- a/js/fetchers/coa_fetcher.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; - -import requests from '../utils/requests'; - -let CoaFetcher = { - /** - * Fetch one user from the API. - * If no arg is supplied, load the current user - */ - fetchOne(id) { - return requests.get('coa', {'id': id}); - }, - create(bitcoinId) { - return requests.post('coa_create', {body: {'bitcoin_id': bitcoinId}}); - } -}; - -export default CoaFetcher; diff --git a/js/fetchers/edition_fetcher.js b/js/fetchers/edition_fetcher.js deleted file mode 100644 index 2d289a3e..00000000 --- a/js/fetchers/edition_fetcher.js +++ /dev/null @@ -1,15 +0,0 @@ -'use strict'; - -import requests from '../utils/requests'; - -let EditionFetcher = { - /** - * Fetch one user from the API. - * If no arg is supplied, load the current user - */ - fetchOne(editionId) { - return requests.get('edition', {'bitcoin_id': editionId}); - } -}; - -export default EditionFetcher; diff --git a/js/stores/edition_store.js b/js/stores/edition_store.js index 212dc25c..fbe070e1 100644 --- a/js/stores/edition_store.js +++ b/js/stores/edition_store.js @@ -36,7 +36,7 @@ class EditionStore { if(this.edition && this.edition.coa && typeof this.edition.coa.constructor !== Object) { this.getInstance().lookupCoa(); - } else if(this.edition && !this.edition.coa) { + } else if(this.edition && !this.edition.coa && this.edition.acl.acl_coa) { this.getInstance().performCreateCoa(); } } @@ -46,11 +46,22 @@ class EditionStore { this.edition.coa = coa; } - onEditionError(err) { + onFlushEdition() { + this.edition = null; + this.editionMeta = { + err: null, + idToFetch: null + }; + this.coaMeta = { + err: null + }; + } + + onErrorEdition(err) { this.editionMeta.err = err; } - onCoaError(err) { + onErrorCoa(err) { this.coaMeta.err = err; } } diff --git a/js/utils/requests.js b/js/utils/requests.js index 9195661d..d3f5d964 100644 --- a/js/utils/requests.js +++ b/js/utils/requests.js @@ -12,7 +12,14 @@ import { argsToQueryParams } from '../utils/url_utils'; class Requests { unpackResponse(response) { if (response.status >= 500) { - throw new Error(response.status + ' - ' + response.statusText + ' - on URL:' + response.url); + let err = new Error(response.status + ' - ' + response.statusText + ' - on URL:' + response.url); + response + .text() + .then((resText) => JSON.parse(resText)) + .then((resJSON) => { + err = new Error(resJSON.errors.pop()); + }) + .catch(() => { throw err; }); } return Q.Promise((resolve, reject) => { From f82797bea3a9b60d7043c7092dcd9231ef6f4b09 Mon Sep 17 00:00:00 2001 From: Brett Sun Date: Tue, 8 Dec 2015 14:48:44 +0100 Subject: [PATCH 010/305] Move compnentDidUpdate for ESLint warning --- .../ascribe_buttons/create_editions_button.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/js/components/ascribe_buttons/create_editions_button.js b/js/components/ascribe_buttons/create_editions_button.js index 08fb76ce..8a0da40b 100644 --- a/js/components/ascribe_buttons/create_editions_button.js +++ b/js/components/ascribe_buttons/create_editions_button.js @@ -28,6 +28,12 @@ let CreateEditionsButton = React.createClass({ EditionListStore.listen(this.onChange); }, + componentDidUpdate() { + if(this.props.piece.num_editions === 0 && typeof this.state.pollingIntervalIndex === 'undefined') { + this.startPolling(); + } + }, + componentWillUnmount() { EditionListStore.unlisten(this.onChange); clearInterval(this.state.pollingIntervalIndex); @@ -37,12 +43,6 @@ let CreateEditionsButton = React.createClass({ this.setState(state); }, - componentDidUpdate() { - if(this.props.piece.num_editions === 0 && typeof this.state.pollingIntervalIndex === 'undefined') { - this.startPolling(); - } - }, - startPolling() { // start polling until editions are defined let pollingIntervalIndex = setInterval(() => { From 349ea8518f68cc1b09f0c74dfd1b2be43f280563 Mon Sep 17 00:00:00 2001 From: Brett Sun Date: Tue, 8 Dec 2015 14:55:04 +0100 Subject: [PATCH 011/305] Destructure params for fetchEditionList --- js/actions/edition_list_actions.js | 5 ++--- .../accordion_list_item_edition_widget.js | 11 +++++----- .../accordion_list_item_table_editions.js | 20 ++++++++++++----- .../ascribe_buttons/create_editions_button.js | 22 ++++++++++--------- js/fetchers/edition_list_fetcher.js | 2 +- js/stores/edition_list_store.js | 17 +++++++++----- 6 files changed, 46 insertions(+), 31 deletions(-) diff --git a/js/actions/edition_list_actions.js b/js/actions/edition_list_actions.js index 6f9881ee..1ea76eb1 100644 --- a/js/actions/edition_list_actions.js +++ b/js/actions/edition_list_actions.js @@ -17,7 +17,7 @@ class EditionListActions { ); } - fetchEditionList(pieceId, page, pageSize, orderBy, orderAsc, filterBy) { + fetchEditionList({pieceId, page, pageSize, orderBy, orderAsc, filterBy}) { if((!orderBy && typeof orderAsc === 'undefined') || !orderAsc) { orderBy = 'edition_number'; orderAsc = true; @@ -31,7 +31,7 @@ class EditionListActions { return Q.Promise((resolve, reject) => { EditionListFetcher - .fetch(pieceId, page, pageSize, orderBy, orderAsc, filterBy) + .fetch({pieceId, page, pageSize, orderBy, orderAsc, filterBy}) .then((res) => { if(res && !res.editions) { throw new Error('Piece has no editions to fetch.'); @@ -54,7 +54,6 @@ class EditionListActions { reject(err); }); }); - } } diff --git a/js/components/ascribe_accordion_list/accordion_list_item_edition_widget.js b/js/components/ascribe_accordion_list/accordion_list_item_edition_widget.js index 8033f239..31ae1a6e 100644 --- a/js/components/ascribe_accordion_list/accordion_list_item_edition_widget.js +++ b/js/components/ascribe_accordion_list/accordion_list_item_edition_widget.js @@ -50,14 +50,15 @@ let AccordionListItemEditionWidget = React.createClass({ * Calls the store to either show or hide the editionListTable */ toggleTable() { - let pieceId = this.props.piece.id; - let isEditionListOpen = this.state.isEditionListOpenForPieceId[pieceId] ? this.state.isEditionListOpenForPieceId[pieceId].show : false; - + const { piece: { id: pieceId } } = this.props; + const { filterBy, isEditionListOpenForPieceId } = this.state; + const isEditionListOpen = isEditionListOpenForPieceId[pieceId] ? isEditionListOpenForPieceId[pieceId].show : false; + if(isEditionListOpen) { EditionListActions.toggleEditionList(pieceId); } else { EditionListActions.toggleEditionList(pieceId); - EditionListActions.fetchEditionList(pieceId, null, null, null, null, this.state.filterBy); + EditionListActions.fetchEditionList({pieceId, filterBy}); } }, @@ -68,7 +69,7 @@ let AccordionListItemEditionWidget = React.createClass({ getGlyphicon() { let pieceId = this.props.piece.id; let isEditionListOpen = this.state.isEditionListOpenForPieceId[pieceId] ? this.state.isEditionListOpenForPieceId[pieceId].show : false; - + if(isEditionListOpen) { // this is the loading feedback for the editions // button. diff --git a/js/components/ascribe_accordion_list/accordion_list_item_table_editions.js b/js/components/ascribe_accordion_list/accordion_list_item_table_editions.js index 23cfb239..036cc143 100644 --- a/js/components/ascribe_accordion_list/accordion_list_item_table_editions.js +++ b/js/components/ascribe_accordion_list/accordion_list_item_table_editions.js @@ -66,20 +66,28 @@ let AccordionListItemTableEditions = React.createClass({ }, filterSelectedEditions() { - let selectedEditions = this.state.editionList[this.props.parentId] - .filter((edition) => edition.selected); - return selectedEditions; + return this.state + .editionList[this.props.parentId] + .filter((edition) => edition.selected); }, loadFurtherEditions() { + const { parentId: pieceId } = this.props; + const { page, pageSize, orderBy, orderAsc, filterBy } = this.state.editionList[pieceId]; + // trigger loading animation this.setState({ showMoreLoading: true }); - let editionList = this.state.editionList[this.props.parentId]; - EditionListActions.fetchEditionList(this.props.parentId, editionList.page + 1, editionList.pageSize, - editionList.orderBy, editionList.orderAsc, editionList.filterBy); + EditionListActions.fetchEditionList({ + pieceId, + page: page + 1, + pageSize, + orderBy, + orderAsc, + filterBy + }); }, render() { let selectedEditionsCount = 0; diff --git a/js/components/ascribe_buttons/create_editions_button.js b/js/components/ascribe_buttons/create_editions_button.js index 8a0da40b..c78b0d63 100644 --- a/js/components/ascribe_buttons/create_editions_button.js +++ b/js/components/ascribe_buttons/create_editions_button.js @@ -49,16 +49,18 @@ let CreateEditionsButton = React.createClass({ // requests, will try to merge the filterBy parameter with other parameters (mergeOptions). // Therefore it can't but null but instead has to be an empty object - EditionListActions.fetchEditionList(this.props.piece.id, null, null, null, null, {}) - .then((res) => { - - clearInterval(this.state.pollingIntervalIndex); - this.props.onPollingSuccess(this.props.piece.id, res.editions[0].num_editions); - - }) - .catch((err) => { - /* Ignore and keep going */ - }); + EditionListActions + .fetchEditionList({ + pieceId: this.props.piece.id, + filterBy: {} + }) + .then((res) => { + clearInterval(this.state.pollingIntervalIndex); + this.props.onPollingSuccess(this.props.piece.id, res.editions[0].num_editions); + }) + .catch((err) => { + /* Ignore and keep going */ + }); }, 5000); this.setState({ diff --git a/js/fetchers/edition_list_fetcher.js b/js/fetchers/edition_list_fetcher.js index 93e4553d..342efbff 100644 --- a/js/fetchers/edition_list_fetcher.js +++ b/js/fetchers/edition_list_fetcher.js @@ -9,7 +9,7 @@ let EditionListFetcher = { /** * Fetches a list of editions from the API. */ - fetch(pieceId, page, pageSize, orderBy, orderAsc, filterBy) { + fetch({pieceId, page, pageSize, orderBy, orderAsc, filterBy}) { let ordering = generateOrderingQueryParams(orderBy, orderAsc); let queryParams = mergeOptions( diff --git a/js/stores/edition_list_store.js b/js/stores/edition_list_store.js index 107f9af4..dcc49213 100644 --- a/js/stores/edition_list_store.js +++ b/js/stores/edition_list_store.js @@ -32,7 +32,7 @@ class EditionListStore { // page let storeEditionIndex = (page - 1) * pageSize + i; let editionsForPieces = this.editionList[pieceId]; - + // if edition already exists, just merge if(editionsForPieces[storeEditionIndex]) { editionsForPieces[storeEditionIndex] = React.addons.update(editionsForPieces[storeEditionIndex], {$merge: editionListOfPiece[i]}); @@ -88,10 +88,15 @@ class EditionListStore { this.editionList[pieceId].length = 0; // refetch editions with adjusted page size - EditionsListActions.fetchEditionList(pieceId, 1, prevEditionListLength, - this.editionList[pieceId].orderBy, - this.editionList[pieceId].orderAsc, - filterBy) + EditionsListActions + .fetchEditionList({ + pieceId, + page: 1, + pageSize: prevEditionListLength, + orderBy: this.editionList[pieceId].orderBy, + orderAsc: this.editionList[pieceId].orderAsc, + filterBy + }) .then(() => { // reset back to the normal pageSize and page this.editionList[pieceId].page = prevEditionListPage; @@ -144,7 +149,7 @@ class EditionListStore { if(!this.isEditionListOpenForPieceId[pieceId].show) { // to clear an array, david walsh recommends to just set it's length to zero // http://davidwalsh.name/empty-array - + this.editionList[pieceId].length = 0; } } From 257ff9b5d3e452904edfe46f4da71e2e9041c380 Mon Sep 17 00:00:00 2001 From: Brett Sun Date: Tue, 8 Dec 2015 15:09:03 +0100 Subject: [PATCH 012/305] Destructure params for fetchPieceList --- js/actions/piece_list_actions.js | 4 ++-- .../accordion_list_item_wallet.js | 5 +++-- .../ascribe_detail/edition_action_panel.js | 5 +++-- js/components/ascribe_detail/piece_container.js | 14 ++++++++------ js/components/piece_list.js | 13 +++++++------ js/components/register_piece.js | 13 ++++--------- .../accordion_list_item_prize.js | 10 ++++++---- .../ascribe_detail/prize_piece_container.js | 5 +++-- .../cyland_accordion_list_item.js | 5 +++-- .../cyland/cyland_detail/cyland_piece_container.js | 5 +++-- .../components/cyland/cyland_register_piece.js | 11 +++-------- .../ikonotv_accordion_list_item.js | 5 +++-- .../ikonotv_detail/ikonotv_piece_container.js | 5 +++-- .../components/ikonotv/ikonotv_register_piece.js | 11 +++-------- .../components/market/market_register_piece.js | 11 +++-------- js/fetchers/piece_list_fetcher.js | 2 +- js/stores/piece_list_store.js | 4 ++-- 17 files changed, 60 insertions(+), 68 deletions(-) diff --git a/js/actions/piece_list_actions.js b/js/actions/piece_list_actions.js index 7ef9cb59..75abfd8f 100644 --- a/js/actions/piece_list_actions.js +++ b/js/actions/piece_list_actions.js @@ -15,7 +15,7 @@ class PieceListActions { ); } - fetchPieceList(page, pageSize, search, orderBy, orderAsc, filterBy) { + fetchPieceList({page, pageSize, search, orderBy, orderAsc, filterBy}) { // To prevent flickering on a pagination request, // we overwrite the piecelist with an empty list before // pieceListCount === -1 defines the loading state @@ -34,7 +34,7 @@ class PieceListActions { // afterwards, we can load the list return Q.Promise((resolve, reject) => { PieceListFetcher - .fetch(page, pageSize, search, orderBy, orderAsc, filterBy) + .fetch({page, pageSize, search, orderBy, orderAsc, filterBy}) .then((res) => { this.actions.updatePieceList({ page, diff --git a/js/components/ascribe_accordion_list/accordion_list_item_wallet.js b/js/components/ascribe_accordion_list/accordion_list_item_wallet.js index a8cab166..aa52d8be 100644 --- a/js/components/ascribe_accordion_list/accordion_list_item_wallet.js +++ b/js/components/ascribe_accordion_list/accordion_list_item_wallet.js @@ -88,8 +88,9 @@ let AccordionListItemWallet = React.createClass({ }, onPollingSuccess(pieceId) { - PieceListActions.fetchPieceList(this.state.page, this.state.pageSize, this.state.search, - this.state.orderBy, this.state.orderAsc, this.state.filterBy); + const { filterBy, orderAsc, orderBy, page, pageSize, search } = this.state; + + PieceListActions.fetchPieceList({page, pageSize, search, orderBy, orderAsc, filterBy}); EditionListActions.toggleEditionList(pieceId); let notification = new GlobalNotificationModel('Editions successfully created', 'success', 10000); diff --git a/js/components/ascribe_detail/edition_action_panel.js b/js/components/ascribe_detail/edition_action_panel.js index 36a79e7c..04838bcd 100644 --- a/js/components/ascribe_detail/edition_action_panel.js +++ b/js/components/ascribe_detail/edition_action_panel.js @@ -79,8 +79,9 @@ let EditionActionPanel = React.createClass({ }, refreshCollection() { - PieceListActions.fetchPieceList(this.state.page, this.state.pageSize, this.state.search, - this.state.orderBy, this.state.orderAsc, this.state.filterBy); + const { filterBy, orderAsc, orderBy, page, pageSize, search } = this.state; + + PieceListActions.fetchPieceList({page, pageSize, search, orderBy, orderAsc, filterBy}); EditionListActions.refreshEditionList({pieceId: this.props.edition.parent}); }, diff --git a/js/components/ascribe_detail/piece_container.js b/js/components/ascribe_detail/piece_container.js index 74584ba3..f6a9fa7e 100644 --- a/js/components/ascribe_detail/piece_container.js +++ b/js/components/ascribe_detail/piece_container.js @@ -140,15 +140,17 @@ let PieceContainer = React.createClass({ }, handleEditionCreationSuccess() { + const { filterBy, orderAsc, orderBy, page, pageSize, search } = this.state; + PieceActions.updateProperty({key: 'num_editions', value: 0}); - PieceListActions.fetchPieceList(this.state.page, this.state.pageSize, this.state.search, - this.state.orderBy, this.state.orderAsc, this.state.filterBy); + PieceListActions.fetchPieceList({page, pageSize, search, orderBy, orderAsc, filterBy}); this.toggleCreateEditionsDialog(); }, handleDeleteSuccess(response) { - PieceListActions.fetchPieceList(this.state.page, this.state.pageSize, this.state.search, - this.state.orderBy, this.state.orderAsc, this.state.filterBy); + const { filterBy, orderAsc, orderBy, page, pageSize, search } = this.state; + + PieceListActions.fetchPieceList({page, pageSize, search, orderBy, orderAsc, filterBy}); // since we're deleting a piece, we just need to close // all editions dialogs and not reload them @@ -177,6 +179,7 @@ let PieceContainer = React.createClass({ }, handlePollingSuccess(pieceId, numEditions) { + const { filterBy, orderAsc, orderBy, page, pageSize, search } = this.state; // we need to refresh the num_editions property of the actual piece we're looking at PieceActions.updateProperty({ @@ -188,8 +191,7 @@ let PieceContainer = React.createClass({ // btw.: It's not sufficient to just set num_editions to numEditions, since a single accordion // list item also uses the firstEdition property which we can only get from the server in that case. // Therefore we need to at least refetch the changed piece from the server or on our case simply all - PieceListActions.fetchPieceList(this.state.page, this.state.pageSize, this.state.search, - this.state.orderBy, this.state.orderAsc, this.state.filterBy); + PieceListActions.fetchPieceList({page, pageSize, search, orderBy, orderAsc, filterBy}); let notification = new GlobalNotificationModel('Editions successfully created', 'success', 10000); GlobalNotificationActions.appendGlobalNotification(notification); diff --git a/js/components/piece_list.js b/js/components/piece_list.js index 9424117c..33bd4004 100644 --- a/js/components/piece_list.js +++ b/js/components/piece_list.js @@ -206,15 +206,15 @@ let PieceList = React.createClass({ }, applyOrderBy(orderBy) { - PieceListActions.fetchPieceList(this.state.page, this.state.pageSize, this.state.search, - orderBy, this.state.orderAsc, this.state.filterBy); + const { filterBy, orderAsc, page, pageSize, search } = this.state; + PieceListActions.fetchPieceList({page, pageSize, search, orderBy, orderAsc, filterBy}); }, loadPieceList({ page, filterBy = this.state.filterBy, search = this.state.search }) { + const { orderAsc, pageSize } = this.state; const orderBy = this.state.orderBy || this.props.orderBy; - return PieceListActions.fetchPieceList(page, this.state.pageSize, search, - orderBy, this.state.orderAsc, filterBy); + return PieceListActions.fetchPieceList({page, pageSize, search, orderBy, orderAsc, filterBy}); }, fetchSelectedPieceEditionList() { @@ -240,8 +240,9 @@ let PieceList = React.createClass({ }, handleAclSuccess() { - PieceListActions.fetchPieceList(this.state.page, this.state.pageSize, this.state.search, - this.state.orderBy, this.state.orderAsc, this.state.filterBy); + const { filterBy, orderBy, orderAsc, page, pageSize, search } = this.state; + + PieceListActions.fetchPieceList({page, pageSize, search, orderBy, orderAsc, filterBy}); this.fetchSelectedPieceEditionList() .forEach((pieceId) => { diff --git a/js/components/register_piece.js b/js/components/register_piece.js index 8211e91e..984b5d7c 100644 --- a/js/components/register_piece.js +++ b/js/components/register_piece.js @@ -65,20 +65,15 @@ let RegisterPiece = React.createClass( { this.setState(state); }, - handleSuccess(response){ + handleSuccess(response) { + const { filterBy, orderAsc, orderBy, page, pageSize, search } = this.state; + let notification = new GlobalNotificationModel(response.notification, 'success', 10000); GlobalNotificationActions.appendGlobalNotification(notification); // once the user was able to register a piece successfully, we need to make sure to keep // the piece list up to date - PieceListActions.fetchPieceList( - this.state.page, - this.state.pageSize, - this.state.searchTerm, - this.state.orderBy, - this.state.orderAsc, - this.state.filterBy - ); + PieceListActions.fetchPieceList({page, pageSize, search, orderBy, orderAsc, filterBy}); this.history.pushState(null, `/pieces/${response.piece.id}`); }, diff --git a/js/components/whitelabel/prize/simple_prize/components/ascribe_accordion_list/accordion_list_item_prize.js b/js/components/whitelabel/prize/simple_prize/components/ascribe_accordion_list/accordion_list_item_prize.js index 965b9012..d4f32f5f 100644 --- a/js/components/whitelabel/prize/simple_prize/components/ascribe_accordion_list/accordion_list_item_prize.js +++ b/js/components/whitelabel/prize/simple_prize/components/ascribe_accordion_list/accordion_list_item_prize.js @@ -58,8 +58,9 @@ let AccordionListItemPrize = React.createClass({ }, handleSubmitPrizeSuccess(response) { - PieceListActions.fetchPieceList(this.state.page, this.state.pageSize, this.state.search, - this.state.orderBy, this.state.orderAsc, this.state.filterBy); + const { filterBy, orderAsc, orderBy, page, pageSize, search } = this.state; + + PieceListActions.fetchPieceList({page, pageSize, search, orderBy, orderAsc, filterBy}); let notification = new GlobalNotificationModel(response.notification, 'success', 10000); GlobalNotificationActions.appendGlobalNotification(notification); @@ -138,8 +139,9 @@ let AccordionListItemPrize = React.createClass({ }, refreshPieceData() { - PieceListActions.fetchPieceList(this.state.page, this.state.pageSize, this.state.search, - this.state.orderBy, this.state.orderAsc, this.state.filterBy); + const { filterBy, orderAsc, orderBy, page, pageSize, search } = this.state; + + PieceListActions.fetchPieceList({page, pageSize, search, orderBy, orderAsc, filterBy}); }, onSelectChange(){ diff --git a/js/components/whitelabel/prize/simple_prize/components/ascribe_detail/prize_piece_container.js b/js/components/whitelabel/prize/simple_prize/components/ascribe_detail/prize_piece_container.js index 982af7b0..1cfab049 100644 --- a/js/components/whitelabel/prize/simple_prize/components/ascribe_detail/prize_piece_container.js +++ b/js/components/whitelabel/prize/simple_prize/components/ascribe_detail/prize_piece_container.js @@ -305,9 +305,10 @@ let PrizePieceRatings = React.createClass({ }, refreshPieceData() { + const { filterBy, orderAsc, orderBy, page, pageSize, search } = this.state; + this.props.loadPiece(); - PieceListActions.fetchPieceList(this.state.page, this.state.pageSize, this.state.search, - this.state.orderBy, this.state.orderAsc, this.state.filterBy); + PieceListActions.fetchPieceList({page, pageSize, search, orderBy, orderAsc, filterBy}); }, onSelectChange() { diff --git a/js/components/whitelabel/wallet/components/cyland/cyland_accordion_list/cyland_accordion_list_item.js b/js/components/whitelabel/wallet/components/cyland/cyland_accordion_list/cyland_accordion_list_item.js index 9d88408f..e3874c8b 100644 --- a/js/components/whitelabel/wallet/components/cyland/cyland_accordion_list/cyland_accordion_list_item.js +++ b/js/components/whitelabel/wallet/components/cyland/cyland_accordion_list/cyland_accordion_list_item.js @@ -52,8 +52,9 @@ let CylandAccordionListItem = React.createClass({ }, handleSubmitSuccess(response) { - PieceListActions.fetchPieceList(this.state.page, this.state.pageSize, this.state.search, - this.state.orderBy, this.state.orderAsc, this.state.filterBy); + const { filterBy, orderAsc, orderBy, page, pageSize, search } = this.state; + + PieceListActions.fetchPieceList({page, pageSize, search, orderBy, orderAsc, filterBy}); let notification = new GlobalNotificationModel(response.notification, 'success', 10000); GlobalNotificationActions.appendGlobalNotification(notification); diff --git a/js/components/whitelabel/wallet/components/cyland/cyland_detail/cyland_piece_container.js b/js/components/whitelabel/wallet/components/cyland/cyland_detail/cyland_piece_container.js index d211d3e8..a9311ad2 100644 --- a/js/components/whitelabel/wallet/components/cyland/cyland_detail/cyland_piece_container.js +++ b/js/components/whitelabel/wallet/components/cyland/cyland_detail/cyland_piece_container.js @@ -74,8 +74,9 @@ let CylandPieceContainer = React.createClass({ }, handleDeleteSuccess(response) { - PieceListActions.fetchPieceList(this.state.page, this.state.pageSize, this.state.search, - this.state.orderBy, this.state.orderAsc, this.state.filterBy); + const { filterBy, orderAsc, orderBy, page, pageSize, search } = this.state; + + PieceListActions.fetchPieceList({page, pageSize, search, orderBy, orderAsc, filterBy}); // since we're deleting a piece, we just need to close // all editions dialogs and not reload them diff --git a/js/components/whitelabel/wallet/components/cyland/cyland_register_piece.js b/js/components/whitelabel/wallet/components/cyland/cyland_register_piece.js index 42b7c1ad..eaba6e54 100644 --- a/js/components/whitelabel/wallet/components/cyland/cyland_register_piece.js +++ b/js/components/whitelabel/wallet/components/cyland/cyland_register_piece.js @@ -140,14 +140,9 @@ let CylandRegisterPiece = React.createClass({ }, refreshPieceList() { - PieceListActions.fetchPieceList( - this.state.page, - this.state.pageSize, - this.state.searchTerm, - this.state.orderBy, - this.state.orderAsc, - this.state.filterBy - ); + const { filterBy, orderAsc, orderBy, page, pageSize, search } = this.state; + + PieceListActions.fetchPieceList({page, pageSize, search, orderBy, orderAsc, filterBy}); }, changeSlide() { diff --git a/js/components/whitelabel/wallet/components/ikonotv/ikonotv_accordion_list/ikonotv_accordion_list_item.js b/js/components/whitelabel/wallet/components/ikonotv/ikonotv_accordion_list/ikonotv_accordion_list_item.js index ce8cebf5..dcbfee09 100644 --- a/js/components/whitelabel/wallet/components/ikonotv/ikonotv_accordion_list/ikonotv_accordion_list_item.js +++ b/js/components/whitelabel/wallet/components/ikonotv/ikonotv_accordion_list/ikonotv_accordion_list_item.js @@ -53,8 +53,9 @@ let IkonotvAccordionListItem = React.createClass({ }, handleSubmitSuccess(response) { - PieceListActions.fetchPieceList(this.state.page, this.state.pageSize, this.state.search, - this.state.orderBy, this.state.orderAsc, this.state.filterBy); + const { filterBy, orderAsc, orderBy, page, pageSize, search } = this.state; + + PieceListActions.fetchPieceList({page, pageSize, search, orderBy, orderAsc, filterBy}); let notification = new GlobalNotificationModel(response.notification, 'success', 10000); GlobalNotificationActions.appendGlobalNotification(notification); diff --git a/js/components/whitelabel/wallet/components/ikonotv/ikonotv_detail/ikonotv_piece_container.js b/js/components/whitelabel/wallet/components/ikonotv/ikonotv_detail/ikonotv_piece_container.js index df58b7c7..31b1d27f 100644 --- a/js/components/whitelabel/wallet/components/ikonotv/ikonotv_detail/ikonotv_piece_container.js +++ b/js/components/whitelabel/wallet/components/ikonotv/ikonotv_detail/ikonotv_piece_container.js @@ -83,8 +83,9 @@ let IkonotvPieceContainer = React.createClass({ }, handleDeleteSuccess(response) { - PieceListActions.fetchPieceList(this.state.page, this.state.pageSize, this.state.search, - this.state.orderBy, this.state.orderAsc, this.state.filterBy); + const { filterBy, orderAsc, orderBy, page, pageSize, search } = this.state; + + PieceListActions.fetchPieceList({page, pageSize, search, orderBy, orderAsc, filterBy}); // since we're deleting a piece, we just need to close // all editions dialogs and not reload them diff --git a/js/components/whitelabel/wallet/components/ikonotv/ikonotv_register_piece.js b/js/components/whitelabel/wallet/components/ikonotv/ikonotv_register_piece.js index c40d779d..7ead4fa7 100644 --- a/js/components/whitelabel/wallet/components/ikonotv/ikonotv_register_piece.js +++ b/js/components/whitelabel/wallet/components/ikonotv/ikonotv_register_piece.js @@ -147,14 +147,9 @@ let IkonotvRegisterPiece = React.createClass({ }, refreshPieceList() { - PieceListActions.fetchPieceList( - this.state.page, - this.state.pageSize, - this.state.searchTerm, - this.state.orderBy, - this.state.orderAsc, - this.state.filterBy - ); + const { filterBy, orderAsc, orderBy, page, pageSize, search } = this.state; + + PieceListActions.fetchPieceList({page, pageSize, search, orderBy, orderAsc, filterBy}); }, canSubmit() { diff --git a/js/components/whitelabel/wallet/components/market/market_register_piece.js b/js/components/whitelabel/wallet/components/market/market_register_piece.js index 387934f9..f7c46864 100644 --- a/js/components/whitelabel/wallet/components/market/market_register_piece.js +++ b/js/components/whitelabel/wallet/components/market/market_register_piece.js @@ -103,14 +103,9 @@ let MarketRegisterPiece = React.createClass({ }, refreshPieceList() { - PieceListActions.fetchPieceList( - this.state.page, - this.state.pageSize, - this.state.searchTerm, - this.state.orderBy, - this.state.orderAsc, - this.state.filterBy - ); + const { filterBy, orderAsc, orderBy, page, pageSize, search } = this.state; + + PieceListActions.fetchPieceList({page, pageSize, search, orderBy, orderAsc, filterBy}); }, render() { diff --git a/js/fetchers/piece_list_fetcher.js b/js/fetchers/piece_list_fetcher.js index 6bd4eb3a..9bea14c5 100644 --- a/js/fetchers/piece_list_fetcher.js +++ b/js/fetchers/piece_list_fetcher.js @@ -10,7 +10,7 @@ let PieceListFetcher = { * Fetches a list of pieces from the API. * Can be called with all supplied queryparams the API. */ - fetch(page, pageSize, search, orderBy, orderAsc, filterBy) { + fetch({page, pageSize, search, orderBy, orderAsc, filterBy}) { let ordering = generateOrderingQueryParams(orderBy, orderAsc); // filterBy is an object of acl key-value pairs. diff --git a/js/stores/piece_list_store.js b/js/stores/piece_list_store.js index 94c57113..bb246f9d 100644 --- a/js/stores/piece_list_store.js +++ b/js/stores/piece_list_store.js @@ -31,7 +31,7 @@ class PieceListStore { this.requestActions = {}; this.bindActions(PieceListActions); } - + onUpdatePieceList({ page, pageSize, search, pieceList, orderBy, orderAsc, pieceListCount, unfilteredPieceListCount, filterBy }) { this.page = page; this.pageSize = pageSize; @@ -66,7 +66,7 @@ class PieceListStore { show: { $set: oldPiece.show } }); } - + }); this.pieceList = pieceList; From cfae0f67c0945d7270abf23581afe7dc6f6fb203 Mon Sep 17 00:00:00 2001 From: Brett Sun Date: Tue, 8 Dec 2015 15:09:33 +0100 Subject: [PATCH 013/305] Fix unnecessary promise chain in PrizePieceRatings --- .../ascribe_detail/prize_piece_container.js | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/js/components/whitelabel/prize/simple_prize/components/ascribe_detail/prize_piece_container.js b/js/components/whitelabel/prize/simple_prize/components/ascribe_detail/prize_piece_container.js index 1cfab049..440a19e9 100644 --- a/js/components/whitelabel/prize/simple_prize/components/ascribe_detail/prize_piece_container.js +++ b/js/components/whitelabel/prize/simple_prize/components/ascribe_detail/prize_piece_container.js @@ -313,16 +313,10 @@ let PrizePieceRatings = React.createClass({ onSelectChange() { PrizeRatingActions.toggleShortlist(this.props.piece.id) - .then( - (res) => { - this.refreshPieceData(); - return res; - }) - .then( - (res) => { - this.handleShortlistSuccess(res.notification); - } - ); + .then((res) => { + this.refreshPieceData(); + this.handleShortlistSuccess(res.notification); + }); }, render(){ From e427429263d4a81310c98637d9ae7da49293309a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Daubensch=C3=BCtz?= Date: Tue, 8 Dec 2015 15:21:20 +0100 Subject: [PATCH 014/305] Implement AuthPrizeRoleRedirect --- js/components/ascribe_routes/proxy_handler.js | 16 ++++++++++-- .../components/pr_routes/pr_proxy_handler.js | 26 +++++++++++++++++++ .../prize/portfolioreview/pr_app.js | 12 ++++++++- .../whitelabel/prize/prize_routes.js | 16 ++++++++++-- .../portfolioreview_custom_style.scss | 1 - 5 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 js/components/whitelabel/prize/portfolioreview/components/pr_routes/pr_proxy_handler.js diff --git a/js/components/ascribe_routes/proxy_handler.js b/js/components/ascribe_routes/proxy_handler.js index c5c60506..06b27422 100644 --- a/js/components/ascribe_routes/proxy_handler.js +++ b/js/components/ascribe_routes/proxy_handler.js @@ -41,6 +41,7 @@ export function AuthRedirect({to, when}) { // and redirect if `true`. if(exprToValidate) { window.setTimeout(() => history.replaceState(null, to, query)); + return true; // Otherwise there can also be the case that the backend // wants to redirect the user to a specific route when the user is logged out already @@ -48,6 +49,7 @@ export function AuthRedirect({to, when}) { delete query.redirect; window.setTimeout(() => history.replaceState(null, '/' + redirect, query)); + return true; } else if(!exprToValidate && when === 'loggedOut' && redirectAuthenticated) { /* @@ -60,7 +62,9 @@ export function AuthRedirect({to, when}) { * `baseUrl` + `redirectAuthenticated`, as it gets rid of queries as well. */ window.location = AppConstants.baseUrl + redirectAuthenticated; + return true; } + return false; }; } @@ -71,7 +75,7 @@ export function AuthRedirect({to, when}) { * * @param {[function]} redirectFn A function that conditionally redirects */ -export function ProxyHandler(redirectFn) { +export function ProxyHandler(...redirectFunctions) { return (Component) => { return React.createClass({ displayName: 'ProxyHandler', @@ -97,7 +101,15 @@ export function ProxyHandler(redirectFn) { if(!UserStore.isLoading()) { const { currentUser } = this.state; const { query } = this.props.location; - redirectFn(currentUser, query); + for(let i = 0; i < redirectFunctions.length; i++) { + // if a redirectFunction redirects the user, + // it should return `true` and therefore + // stop/avoid the execution of all functions + // that follow + if(redirectFunctions[i](currentUser, query)) { + break; + } + } } }, diff --git a/js/components/whitelabel/prize/portfolioreview/components/pr_routes/pr_proxy_handler.js b/js/components/whitelabel/prize/portfolioreview/components/pr_routes/pr_proxy_handler.js new file mode 100644 index 00000000..edaa6663 --- /dev/null +++ b/js/components/whitelabel/prize/portfolioreview/components/pr_routes/pr_proxy_handler.js @@ -0,0 +1,26 @@ +'use strict'; + +import history from '../../../../../../history'; + + +export function AuthPrizeRoleRedirect({ to, when }) { + if(when.constructor !== Array && when.length) { + throw new Error('`when` of AuthPrizeRoleRedirect must be an array containing values'); + } + if(!to && to.indexOf('/') !== -1) { + throw new Error('`to` of AuthPrizeRoleRedirect must be defined and contain a valid route'); + } + + return function(currentUser, query) { + const exprToValidate = when + .map((role) => currentUser[role]) + .reduce((a, b) => a || b); + + if(exprToValidate) { + window.setTimeout(() => history.replaceState(null, to, query)); + return true; + } else { + return false; + } + }; +} \ No newline at end of file diff --git a/js/components/whitelabel/prize/portfolioreview/pr_app.js b/js/components/whitelabel/prize/portfolioreview/pr_app.js index 7e66c43c..93b1a168 100644 --- a/js/components/whitelabel/prize/portfolioreview/pr_app.js +++ b/js/components/whitelabel/prize/portfolioreview/pr_app.js @@ -4,6 +4,7 @@ import React from 'react'; import GlobalNotification from '../../../global_notification'; import Hero from './components/pr_hero'; +import Header from '../../../header'; import UserStore from '../../../../stores/user_store'; import UserActions from '../../../../actions/user_actions'; @@ -42,17 +43,26 @@ let PRApp = React.createClass({ render() { const { history, children } = this.props; const { currentUser } = this.state; + let style = {}; let subdomain = getSubdomain(); let header; + if (currentUser && currentUser.email && history.isActive(`/pieces/${getCookie(currentUser.email)}`)) { header = ; + style = { paddingTop: '0 !important' }; + } else if(history.isActive('/collection') || history.isActive('/settings')) { + header =
; + } else { + style = { paddingTop: '0 !important' }; } return (
{header} -
+
{children} diff --git a/js/components/whitelabel/prize/prize_routes.js b/js/components/whitelabel/prize/prize_routes.js index 19215f08..896939ee 100644 --- a/js/components/whitelabel/prize/prize_routes.js +++ b/js/components/whitelabel/prize/prize_routes.js @@ -23,6 +23,7 @@ import CoaVerifyContainer from '../../coa_verify_container'; import ErrorNotFoundPage from '../../error_not_found_page'; import { ProxyHandler, AuthRedirect } from '../../../components/ascribe_routes/proxy_handler'; +import { AuthPrizeRoleRedirect } from './portfolioreview/components/pr_routes/pr_proxy_handler'; const ROUTES = { @@ -52,7 +53,6 @@ const ROUTES = { path='collection' component={ProxyHandler(AuthRedirect({to: '/login', when: 'loggedOut'}))(SPPieceList)} headerTitle='COLLECTION'/> - @@ -66,9 +66,16 @@ const ROUTES = { path='register_piece' component={ProxyHandler(AuthRedirect({to: '/login', when: 'loggedOut'}))(PRRegisterPiece)} headerTitle='+ NEW WORK'/> + + component={ProxyHandler( + AuthPrizeRoleRedirect({ to: '/collection', when: ['is_admin', 'is_judge', 'is_jury'] }), + AuthRedirect({to: '/register_piece', when: 'loggedIn'}) + )(SPLoginContainer)} /> @@ -78,7 +85,12 @@ const ROUTES = { + + + ) diff --git a/sass/whitelabel/prize/portfolioreview/portfolioreview_custom_style.scss b/sass/whitelabel/prize/portfolioreview/portfolioreview_custom_style.scss index d8ccd858..5b4dd559 100644 --- a/sass/whitelabel/prize/portfolioreview/portfolioreview_custom_style.scss +++ b/sass/whitelabel/prize/portfolioreview/portfolioreview_custom_style.scss @@ -2,7 +2,6 @@ $pr--nav-fg-prim-color: black; $pr--button-color: $pr--nav-fg-prim-color; .client--portfolioreview { - padding-top: 0 !important; .btn-wide, .btn-default { From 7e5662676cb825042fdbdcc67c14b4abd6b66dbb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20Daubensch=C3=BCtz?= Date: Tue, 8 Dec 2015 15:44:46 +0100 Subject: [PATCH 015/305] Add header to jury, judge and admin role --- js/components/ascribe_routes/proxy_handler.js | 1 + js/components/header.js | 7 ++++--- js/components/whitelabel/prize/portfolioreview/pr_app.js | 6 +++--- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/js/components/ascribe_routes/proxy_handler.js b/js/components/ascribe_routes/proxy_handler.js index 06b27422..228f0f62 100644 --- a/js/components/ascribe_routes/proxy_handler.js +++ b/js/components/ascribe_routes/proxy_handler.js @@ -101,6 +101,7 @@ export function ProxyHandler(...redirectFunctions) { if(!UserStore.isLoading()) { const { currentUser } = this.state; const { query } = this.props.location; + for(let i = 0; i < redirectFunctions.length; i++) { // if a redirectFunction redirects the user, // it should return `true` and therefore diff --git a/js/components/header.js b/js/components/header.js index b3fd543e..6ca96433 100644 --- a/js/components/header.js +++ b/js/components/header.js @@ -55,10 +55,11 @@ let Header = React.createClass({ }, componentDidMount() { - UserActions.fetchCurrentUser(); UserStore.listen(this.onChange); - WhitelabelActions.fetchWhitelabel(); + UserActions.fetchCurrentUser.defer(); + WhitelabelStore.listen(this.onChange); + WhitelabelActions.fetchWhitelabel.defer(); // react-bootstrap 0.25.1 has a bug in which it doesn't // close the mobile expanded navigation after a click by itself. @@ -223,7 +224,7 @@ let Header = React.createClass({ {this.getPoweredBy()} diff --git a/js/components/whitelabel/prize/portfolioreview/pr_app.js b/js/components/whitelabel/prize/portfolioreview/pr_app.js index 93b1a168..cb40adb9 100644 --- a/js/components/whitelabel/prize/portfolioreview/pr_app.js +++ b/js/components/whitelabel/prize/portfolioreview/pr_app.js @@ -41,7 +41,7 @@ let PRApp = React.createClass({ }, render() { - const { history, children } = this.props; + const { history, children, routes } = this.props; const { currentUser } = this.state; let style = {}; let subdomain = getSubdomain(); @@ -51,8 +51,8 @@ let PRApp = React.createClass({ if (currentUser && currentUser.email && history.isActive(`/pieces/${getCookie(currentUser.email)}`)) { header = ; style = { paddingTop: '0 !important' }; - } else if(history.isActive('/collection') || history.isActive('/settings')) { - header =
; + } else if(currentUser && (currentUser.is_admin || currentUser.is_jury || currentUser.is_judge)) { + header =
; } else { style = { paddingTop: '0 !important' }; } From b02f6d769597b49f85d3623b37b7b610e117e635 Mon Sep 17 00:00:00 2001 From: Brett Sun Date: Tue, 8 Dec 2015 16:11:27 +0100 Subject: [PATCH 016/305] Merge with master --- docs/feature_list.md | 63 --- fonts/Mercury_Light.otf | Bin 53816 -> 0 bytes fonts/Mercury_Medium.otf | Bin 55692 -> 0 bytes fonts/Mercury_Regular.otf | Bin 56044 -> 0 bytes fonts/ascribe-logo.eot | Bin 2888 -> 2856 bytes fonts/ascribe-logo.svg | 7 +- fonts/ascribe-logo.ttf | Bin 2704 -> 2692 bytes fonts/ascribe-logo.woff | Bin 2780 -> 2768 bytes fonts/ascribe.eot | Bin 14532 -> 0 bytes fonts/ascribe.svg | 51 --- fonts/ascribe.ttf | Bin 14368 -> 0 bytes fonts/ascribe.woff | Bin 14444 -> 0 bytes fonts/ascribe_wortmarke_logo.svg | 83 ---- fonts/ascribe_wortmarke_logo_chunked.svg | 110 ----- img/ascribe_animated_large.gif | Bin 24891 -> 0 bytes img/ascribe_animated_medium.gif | Bin 5855 -> 0 bytes img/ascribe_animated_small.gif | Bin 2605 -> 0 bytes img/hq-favicons/android-chrome-144x144.png | Bin 11526 -> 0 bytes img/hq-favicons/android-chrome-36x36.png | Bin 2768 -> 0 bytes img/hq-favicons/android-chrome-48x48.png | Bin 3592 -> 0 bytes img/hq-favicons/android-chrome-72x72.png | Bin 5478 -> 0 bytes img/hq-favicons/android-chrome-96x96.png | Bin 7416 -> 0 bytes img/hq-favicons/apple-touch-icon-114x114.png | Bin 9153 -> 0 bytes img/hq-favicons/apple-touch-icon-120x120.png | Bin 9698 -> 0 bytes img/hq-favicons/apple-touch-icon-144x144.png | Bin 12148 -> 0 bytes img/hq-favicons/apple-touch-icon-152x152.png | Bin 12813 -> 0 bytes img/hq-favicons/apple-touch-icon-57x57.png | Bin 4532 -> 0 bytes img/hq-favicons/apple-touch-icon-60x60.png | Bin 4692 -> 0 bytes img/hq-favicons/apple-touch-icon-72x72.png | Bin 5677 -> 0 bytes img/hq-favicons/apple-touch-icon-76x76.png | Bin 5996 -> 0 bytes .../apple-touch-icon-precomposed.png | Bin 14649 -> 0 bytes img/hq-favicons/apple-touch-icon.png | Bin 12813 -> 0 bytes img/hq-favicons/browserconfig.xml | 12 - img/hq-favicons/favicon-16x16.png | Bin 1509 -> 0 bytes img/hq-favicons/favicon-32x32.png | Bin 1715 -> 0 bytes img/hq-favicons/favicon-96x96.png | Bin 6477 -> 0 bytes img/hq-favicons/favicon.ico | Bin 15086 -> 0 bytes img/hq-favicons/manifest.json | 35 -- img/hq-favicons/mstile-144x144.png | Bin 5228 -> 0 bytes img/hq-favicons/mstile-150x150.png | Bin 4921 -> 0 bytes img/hq-favicons/mstile-310x150.png | Bin 5255 -> 0 bytes img/hq-favicons/mstile-310x310.png | Bin 4796 -> 0 bytes img/hq-favicons/mstile-70x70.png | Bin 3328 -> 0 bytes js/actions/contract_agreement_list_actions.js | 40 +- js/actions/edition_actions.js | 4 +- js/actions/global_notification_actions.js | 6 +- js/actions/piece_actions.js | 4 +- .../accordion_list_item_edition_widget.js | 3 +- .../accordion_list_item_piece.js | 28 +- ...cordion_list_item_thumbnail_placeholder.js | 15 + .../accordion_list_item_wallet.js | 23 +- .../ascribe_buttons/acls/acl_button.js | 2 +- .../ascribe_buttons/form_submit_button.js | 58 +++ .../collapsible_paragraph.js | 4 +- .../ascribe_detail/detail_property.js | 1 + js/components/ascribe_detail/edition.js | 28 +- .../ascribe_detail/edition_action_panel.js | 30 +- .../ascribe_detail/edition_container.js | 25 +- .../further_details_fileuploader.js | 8 +- js/components/ascribe_detail/piece.js | 5 +- .../ascribe_detail/piece_container.js | 49 ++- .../ascribe_forms/acl_form_factory.js | 10 +- js/components/ascribe_forms/form.js | 24 +- js/components/ascribe_forms/form_consign.js | 72 +++- .../ascribe_forms/form_create_contract.js | 10 +- js/components/ascribe_forms/form_loan.js | 248 ++++-------- .../ascribe_forms/form_loan_request_answer.js | 6 +- .../ascribe_forms/form_register_piece.js | 145 +++++-- ...ent.js => form_send_contract_agreement.js} | 14 +- .../ascribe_forms/form_unconsign_request.js | 4 +- .../input_contract_agreement_checkbox.js | 206 ++++++++++ .../ascribe_forms/input_fineuploader.js | 54 +-- .../ascribe_forms/input_textarea_toggable.js | 6 + .../list_form_request_actions.js | 4 +- js/components/ascribe_forms/property.js | 200 +++++++--- .../ascribe_forms/property_collapsible.js | 96 ----- .../piece_list_bulk_modal.js | 102 +---- .../piece_list_toolbar_filter_widget.js | 10 +- .../contract_settings_update_button.js | 2 +- js/components/ascribe_spinner.js | 18 +- .../file_drag_and_drop.js | 68 ++-- .../file_drag_and_drop_preview.js | 150 ++++--- .../file_drag_and_drop_preview_image.js | 57 +-- .../file_drag_and_drop_preview_iterator.js | 32 +- .../file_drag_and_drop_preview_other.js | 59 ++- .../file_drag_and_drop_preview_progress.js | 27 +- .../ascribe_upload_button/upload_button.js | 275 ++++++++----- .../react_s3_fine_uploader.js | 224 ++++++----- .../react_s3_fine_uploader_utils.js | 9 + js/components/contract_notification.js | 36 -- js/components/error_not_found_page.js | 12 +- js/components/global_notification.js | 95 ++--- js/components/header.js | 22 +- js/components/piece_list.js | 205 ++++++++-- js/components/piece_list_filter_display.js | 2 +- js/components/register_piece.js | 25 +- .../pr_forms/pr_register_piece_form.js | 8 +- .../ascribe_buttons/submit_to_prize_button.js | 5 +- .../ascribe_detail/prize_piece_container.js | 17 +- ...cordion_list_item_thumbnail_placeholder.js | 15 + .../components/23vivi/23vivi_landing.js | 78 ++++ .../components/23vivi/23vivi_piece_list.js | 24 ++ .../ascribe_detail/wallet_piece_container.js | 2 +- .../cyland_accordion_list_item.js | 8 +- .../cyland_detail/cyland_piece_container.js | 2 +- .../cyland_additional_data_form.js | 23 +- .../components/cyland/cyland_landing.js | 4 +- .../cyland/cyland_register_piece.js | 21 +- .../ikonotv_accordion_list_item.js | 8 +- .../ikonotv_detail/ikonotv_piece_container.js | 2 +- .../ikonotv_artist_details_form.js | 8 +- .../ikonotv_artwork_details_form.js | 12 +- .../ikonotv/ikonotv_register_piece.js | 47 +-- .../components/lumenus/lumenus_landing.js | 84 ++++ .../market_buttons/market_acl_button_list.js | 74 ++++ .../market_buttons/market_submit_button.js | 160 ++++++++ .../market_detail/market_edition_container.js | 24 ++ .../market_detail/market_further_details.js | 23 ++ .../market_detail/market_piece_container.js | 21 + .../market_additional_data_form.js | 235 +++++++++++ .../components/market/market_piece_list.js | 90 +++++ .../market/market_register_piece.js | 174 ++++++++ .../wallet/constants/wallet_api_urls.js | 16 +- js/components/whitelabel/wallet/wallet_app.js | 2 +- .../whitelabel/wallet/wallet_routes.js | 89 ++++- js/constants/application_constants.js | 31 +- js/mixins/react_error.js | 16 + js/models/errors.js | 31 ++ js/stores/edition_store.js | 6 + js/stores/global_notification_store.js | 57 ++- js/stores/piece_store.js | 6 + js/utils/acl_utils.js | 22 +- js/utils/error_utils.js | 4 +- js/utils/file_utils.js | 17 + js/utils/form_utils.js | 6 + js/utils/general_utils.js | 8 +- js/utils/regex_utils.js | 7 + js/utils/requests.js | 19 +- package.json | 1 + sass/ascribe-fonts/ascribe-fonts.scss | 290 +++----------- sass/ascribe_accordion_list.scss | 32 +- sass/ascribe_acl_information.scss | 2 +- sass/ascribe_custom_style.scss | 64 +-- sass/ascribe_notification_list.scss | 7 +- sass/ascribe_notification_page.scss | 11 +- sass/ascribe_panel.scss | 7 +- sass/ascribe_piece_list_toolbar.scss | 4 + sass/ascribe_property.scss | 6 +- sass/ascribe_spinner.scss | 9 +- sass/ascribe_uploader.scss | 62 +-- sass/main.scss | 2 +- .../wallet/23vivi/23vivi_custom_style.scss | 377 ++++++++++++++++++ .../whitelabel/wallet/cc/cc_custom_style.scss | 16 + .../wallet/cyland/cyland_custom_style.scss | 108 +++-- .../wallet/ikonotv/ikonotv_custom_style.scss | 36 ++ sass/whitelabel/wallet/index.scss | 1 + 156 files changed, 3795 insertions(+), 1969 deletions(-) delete mode 100644 docs/feature_list.md delete mode 100755 fonts/Mercury_Light.otf delete mode 100755 fonts/Mercury_Medium.otf delete mode 100755 fonts/Mercury_Regular.otf delete mode 100644 fonts/ascribe.eot delete mode 100644 fonts/ascribe.svg delete mode 100644 fonts/ascribe.ttf delete mode 100644 fonts/ascribe.woff delete mode 100644 fonts/ascribe_wortmarke_logo.svg delete mode 100644 fonts/ascribe_wortmarke_logo_chunked.svg delete mode 100644 img/ascribe_animated_large.gif delete mode 100644 img/ascribe_animated_medium.gif delete mode 100644 img/ascribe_animated_small.gif delete mode 100644 img/hq-favicons/android-chrome-144x144.png delete mode 100644 img/hq-favicons/android-chrome-36x36.png delete mode 100644 img/hq-favicons/android-chrome-48x48.png delete mode 100644 img/hq-favicons/android-chrome-72x72.png delete mode 100644 img/hq-favicons/android-chrome-96x96.png delete mode 100644 img/hq-favicons/apple-touch-icon-114x114.png delete mode 100644 img/hq-favicons/apple-touch-icon-120x120.png delete mode 100644 img/hq-favicons/apple-touch-icon-144x144.png delete mode 100644 img/hq-favicons/apple-touch-icon-152x152.png delete mode 100644 img/hq-favicons/apple-touch-icon-57x57.png delete mode 100644 img/hq-favicons/apple-touch-icon-60x60.png delete mode 100644 img/hq-favicons/apple-touch-icon-72x72.png delete mode 100644 img/hq-favicons/apple-touch-icon-76x76.png delete mode 100644 img/hq-favicons/apple-touch-icon-precomposed.png delete mode 100644 img/hq-favicons/apple-touch-icon.png delete mode 100644 img/hq-favicons/browserconfig.xml delete mode 100644 img/hq-favicons/favicon-16x16.png delete mode 100644 img/hq-favicons/favicon-32x32.png delete mode 100644 img/hq-favicons/favicon-96x96.png delete mode 100644 img/hq-favicons/favicon.ico delete mode 100644 img/hq-favicons/manifest.json delete mode 100644 img/hq-favicons/mstile-144x144.png delete mode 100644 img/hq-favicons/mstile-150x150.png delete mode 100644 img/hq-favicons/mstile-310x150.png delete mode 100644 img/hq-favicons/mstile-310x310.png delete mode 100644 img/hq-favicons/mstile-70x70.png create mode 100644 js/components/ascribe_accordion_list/accordion_list_item_thumbnail_placeholder.js create mode 100644 js/components/ascribe_buttons/form_submit_button.js rename js/components/ascribe_forms/{form_contract_agreement.js => form_send_contract_agreement.js} (94%) create mode 100644 js/components/ascribe_forms/input_contract_agreement_checkbox.js delete mode 100644 js/components/ascribe_forms/property_collapsible.js delete mode 100644 js/components/contract_notification.js create mode 100644 js/components/whitelabel/wallet/components/23vivi/23vivi_accordion_list/23vivi_accordion_list_item_thumbnail_placeholder.js create mode 100644 js/components/whitelabel/wallet/components/23vivi/23vivi_landing.js create mode 100644 js/components/whitelabel/wallet/components/23vivi/23vivi_piece_list.js create mode 100644 js/components/whitelabel/wallet/components/lumenus/lumenus_landing.js create mode 100644 js/components/whitelabel/wallet/components/market/market_buttons/market_acl_button_list.js create mode 100644 js/components/whitelabel/wallet/components/market/market_buttons/market_submit_button.js create mode 100644 js/components/whitelabel/wallet/components/market/market_detail/market_edition_container.js create mode 100644 js/components/whitelabel/wallet/components/market/market_detail/market_further_details.js create mode 100644 js/components/whitelabel/wallet/components/market/market_detail/market_piece_container.js create mode 100644 js/components/whitelabel/wallet/components/market/market_forms/market_additional_data_form.js create mode 100644 js/components/whitelabel/wallet/components/market/market_piece_list.js create mode 100644 js/components/whitelabel/wallet/components/market/market_register_piece.js create mode 100644 js/mixins/react_error.js create mode 100644 js/models/errors.js create mode 100644 js/utils/regex_utils.js create mode 100644 sass/whitelabel/wallet/23vivi/23vivi_custom_style.scss diff --git a/docs/feature_list.md b/docs/feature_list.md deleted file mode 100644 index 568f7146..00000000 --- a/docs/feature_list.md +++ /dev/null @@ -1,63 +0,0 @@ -# Feature list - -This list specifies all features in Onion that ought to be tested before actually pushing live: - -- sign up & email activation -- login -- log out -- form input - + reset - + save - + disabled state -- form checkbox - + reset - + save - + disabled state -- create app - + refresh token -- loan contract - + upload - + download - + delete -- register work - + with edition - + without edition - + correct encoding of video upload -- fineuploader - + upload file - + upload multiple files - + delete file - + cancel upload of file -- create editions - + in piece list - + in piece detail -- all notes in edition/piece detail -- transfer & consign & loan & share & delete - + bulk - + single - + withdraw -- piece list - + filter (also check for correct filtering of opened edition tables) - + order - + search - + pagination - + expandable edition list for piece -- download coa - -## sluice -- hero landing page -- activation email -- submission (also check extra form fields) - + of existing pieces - + newly registered pieces -- rating - + in piece list - + in piece detail -- short listing (not yet implemented) -- piece list - + order by rating - -## Cyland -- hero landing page -- activation email -- submission (check states of submission (1,2,3)) diff --git a/fonts/Mercury_Light.otf b/fonts/Mercury_Light.otf deleted file mode 100755 index e94e7dd32afdace189dde8b142d4a4e8b66f6070..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53816 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 diff --git a/fonts/Mercury_Medium.otf b/fonts/Mercury_Medium.otf deleted file mode 100755 index fa111de90c88c27e155f43abbd3a508d8fb834a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55692 zcmdR12Y6IP*PgqZ-3@KQgbhg+_C|UW5fsD^k={FqbO|AlkV?v?ZF+-{0O`r5(mT?N z6cJGoL;)M10xCujNKla3N;coe3c`T)dopvz;~^B}B0qFuA!p&-!iJ=`!5=6zJxL1nZVoEs@^}-&?wQ z1q7eFGinqe_0}N&R1a4_@2J8!7ebyxo;u6CoP&LZw?-qY&=!Hx+u6(Y(v66v_`ZY? zt7g7F{s9%cNf+d2^*IrNWd(J2#;kk0Vb4E^Tz&~Df~xJeXP*JC$@-(}yhdxZ7FQRsEI{qF20 zz(N)2UKvLtq$-b`v?cv3)2)ad@vMw1NCOg68CMbwSzH-ck=A5IWxNhrKUx{Di`uK& zs!wdlSC#3Fs%?xoG>paWd%W1T$zlTpJr#_yZPCSdhlb@@{BUh34jbLSfMzED}Z zs+_yOle1HRpYtqNFK0gwC!g6h=&VL_P*6}OWOMiOImC?w zKy=y?7t#*bE~GO)uOc=RIh@E?;!I{CpBLhzi7W9Z9w^-j-}*pUJaN5Oi$DLy^0*>Z zk8l=pj^N*1NFdT!jqE$CF%Wf*MSKooo@m9dT3h#8dabgAALx5n4UEF-b+G(ZeRx#M zFWgsd0;kd+booGBoXAU{oN=P_ee_qS{{A}dZ_gc^a6-?Vz+pemM_2Tj_0$7tK4dn+ zzvA!1(}M{6bgHb4jfyYmt{M{;)amsIdf7q%dFPNduAHGw*$lvv)0ij)6YkX^l;^3+ z%dU_9lat>BJE5h}Oz1{V2^v8mD1~~$tKbxVP@K}D?5dR?q4^|AV>Nkh_zJcqT!mNdo+WJj71d*VPGiIy}a z%>^-!N%Bb^DIkSpE!jZUla1sZ zvWdJ$4v>T7eWAWEM9>MMpcdppL$X(J5bOmmx`(B8AP@yC1Kt7l03Wg(kNT@vWVw51%bkKd3-8RoP-^*p;gcU!7Y3!Kdb)4VI#6@YSD(LC za}iSiJD*8f%oQ6!jTvMwG{>0s7bXY}bMGU_(#NC)NhB@F ze4K5Pun{I>BTOM3aOUYqmS8i8O?EXIh|%d!){x<3GnVBoY&K&P-Ht_n2N^?ll5u1gd6VoRGe zoG_leg;AV_ahy&*Aa7&l&48@W#Kw07i~Lb+nxBvf_iM*qy#21q|! zC2nH|G{8zUQs_aBv-N?`-V)1b31(aom+c}gWCzGB*>TcG_ARb~K!4y%eBVoE2_7Uy z)|5EN79*_-nI-qf^$Xw|+|R@Hb6j`ex(?Toq@nC2;zi^Ixi9H1+eCWGJV|4j2jZ-q zS|B$Q9jAlQQbo_V#Fo><==v)#S^?1dI-?h857<>+^|+3$qM!AFqbK^r`cWOMPk)8$ zWRScR_gP=7!1`Prtp8O!V0`#1FrHNLh4F^r3i!kLX-_)KdXUk$c9FdbG$&nzY2ZtD z#QWnM+>yK~*b)VH>Cr+ z5Pn2kPUO|vAa?~_jE*XdLA;VCM%Q10(F%Z8Ctx;UBXq3z1J`=Mi!4nBx*7d8>gS&iSy!b0Lf;<3>H&sA+*5A>x0Pt-z z(aAk*mHbk130D_jCNQZI9!S58cp$E2xGqIG zM}guz@(Zbh?|X558P_l%O{j-8=r&F~x3PcU1TE#Ht*{8~HYEcYWDQ9>2CR==fUZJ1 z?lV-ylaUvY4J0oBoiN^Qg|5V1rY3FKb0W?OU0A(BA{hp>6*9?WKqu@b-GRo!F4Uck zbU>yjZvu^FTGU5KZ>+NJtUkoM;1n=W2qdq|O36TZEAWRQ1bG*enV26s*&^I)2KuA1 zo~-BJdkSBZ{{Y=EN4m&{fc8HjYp?LQ4zxBznj=e>wMPCSpnnMH*oOXWBYlCFWGhJ* zxf7`m)CC-6@8bJxlm|W4!0D^@y|-)_?lTa~GYejjO(TtD@1uPt8-?h5247EDyR8KS z?j@1BnAa_28;P52BF-Q`VlDp>G+?eX*<$M`8<(ona>Wkt#m#9F?D zSP`3ws|f8X%m|xQe1*`y;s!#8iqi-kE6yX-^1DqdP9g5b<9ePal*hw(4F;YPUQvQP z*Liq@m%UYS0B33|ffb=dBH|-v;%w6bBwU@{o8`)Gq6-9nu8$cB%C4eyH$ zS~MdioTo?f8rUe?fG6h>-r(uC5ZdxFvgKoB%W1F$4Ofxg1o>@21Iy#c<64xp1r02v zSw$JbHWgbCy7By8JP+fiEeYXaD5$mN{In&J{O(m=wzOgw(itB#Xx)sENj07ddDw)9 ztnV7M%hK80(V$(H!lYWm`>Ww&r{Vq8fX^%^>$L{GW+9tFcD#N&-Y+}OTReI4bcc$| zxa){s*rEPg2%GYFGnBRCytU(P*`ckgNMUow4y~||)o(`_KkdNJ8weRE@#KrS--L6r z30l00IFt4!sO5M7|PL%_fCG<58Oq+kQUfTP57Uf%DMBuu@*Uloww^ zym%fz)Nh7%hTZk!cm2?p8;G;n?ayoWN6lu$S)EW5A|8l#Sr}e%4Phi`2;?(J4?f?( zxr_Bz51LtAUm+o6`Sr+u1z}_bMaX7^9^7N$H6F6nUe9UPqqY)giP$U%;q`=|9u{Z4 z4&hXVpckhQXLN@07DG90p`6-KUQZbBR~Rn^eG|%t@w;KXFX1Rfp@U*063+94gB}*Y z#zR(rIC7RiN5y&+iJTN6YcZPF9L?)ljJvrSjr`;6f5Tu#M#-V z6#K$}ECP=@IJjW2So$)$Wr&9>o`R6)Dgym$j>=yFpBWzHS zh0q2$u@Yl-!mPzf2C`YP86lffw^09TgltaT0=J71vUT!SWj&ER9*qzOIiN0dZXJo> z=^WsV(+GQ)!ZbeYj=%yP1`Z7mZTUj?*f7w{s44JpgAX_9WmaUR)kZqOimK~5C zmK~Lyko_pTDf?4yEw_<3m3NZ&mXDRslI!L3MQIN zPKx%5mleGfgB4>HQx&rn!HOhBzG9Q&lH#_qzEY>`tn8~Cubiz6Rz@h}lu61Z%4N#! z%8!(%mA@*>Rce)!s*CDXRWDV4)lk)V)pV7wDn>P5wMdnrDpajeZB^}49a0@pol<=V zKC$yG+mYD`Muu-#D*<-S#mb5p+p*ZnA@E!>d_RwQ!Op<<=U}Bz^Lie<$5OCfqa0h2 z*ty}sJghv{YusnCGQ@6yKGr_llh{6Kp@F5bI#}8%p5q3-mEc>+-EUR*s`svDU!VQA z2YdKnils-7A3j*agDLmM;nA@NOaA|+)ExhNl5j6(k%@cK@vvA;iK+SR@%emD(wJ;j zNfSG-RDFApS8Q&udBkL!?P_c{V|&@-rU)o?3o_1j+^RTBd7Rn=-ii!uUPbw64V1S)#*;5*OeqlPD2p|ezr{owQ7Kj7lfdn8Cm=7!fl7NLk zGRmd^i-5(z5+D^w1JZ#EAQQ*}vVj~R7cc_rfepY$U=#2Tuo>6_Yz4LfyU@mNU=Q#v zun+X@2M*xgd%!{9ec%xA0dN@j5cmjrJ_e4U%qPH6;26@6BkeQbbKnGU61al&QlJcA znk@G0LID$CM%wL)8(0<0SQX5|xQf%lc$8_x(tOz&(&jZbY7C=j&70?=Bny@Rl zGF@01UNK!DmGzVG$ErC`*Yk=v)+9Gc| zpgr&k&JS&w&%bN#F|d zGc98oz;q2}TyIw#gDjnfEHOD^&zlx0FhdH=l~Q1a6hKP^DP!6+rb}bmGp0LxJgL|M zsW3w-%#aE*q{0lTFheTLkP0)T!VIY}Ln_RW3Nxg_45=_fD$J0ItB{JTkcz92imO;r z%ve#(SW#|ZMY%y-K*KD+6<|7%xqt`Y39x5$Z(P|ET`<6OGEA4pG@~&^YydU_n}BzK&A=95E3ggN z4(tGS0=q!lZeS1aE^q*8?*Rva_klye2f$(AL*N*29DV!@_#8L^oCK~wo5OUIWdM6h zH{*J{Vi!jFJVyCERtz(q=$T$ii5ltx4bU3XZ8Zj%c1wqQBH#o(4>Si_04;%5Kx=^M zzuF>yJD@%A3eXK01Plg-07HRcz;Iv$FcKIAj6)mafj5B(0Mk6p1v~&xzzcc2aSgyV z5MVmBAY6lSwT$9<%=H_5B$;kF0*C@)a6cA^1LA=MAQ6}kEC7;#g+MZp0xSX+151EZ zAPqd;g0xqTX=e!AM+W|||WTfDcz zLz9k?x2*8DxPDQG`y${3JP$MnS^zD9RzPcjX&|3`mA{3NzlD*%g^|BSCZVp$z!YFA zFb$Xvyba6%+|bLppwR>H1T4D%Tm9L}UxN93qjJ?}Cx#M8LJ1_Hmtf>eF!CiB`4WtL z2}ZsIBVU3!eFLL?1EYNdqkW^=s$Sb^p#-B{g3&H{=t|DCtGB=#3YaRcVw6u|ZlB^S z_zU0~J7-aFje=_wa|yaeAQ*W3a})(p3I77i13eHe) zhJrH`oT1mly;D15BgH^odNH$aIO}Km-s4FnwYS5DUZs@jwEQ2+Ri-07<|?AQ?yj76FTa zB|s{W2BZTSKqim{WCJ-sE?@*!18ab_z&c<(umRWzYy#c^HUnFLt-v;5JFo-T3G4!P z1ABmXfqlS!-~jL*a1eMOI0SqE90ooFJ_0@ljsTwkM}cF&ao{uHbKnGU5-0`A0H#GX z1Gn+)I38D-GMPO&sJdA1gudPpn#HRXcxJ~3J5R+|73PXlKuN`EfZ6Cg^v`k!lFk3v zHyMR<8&CSURV$#8NxrW~_t+)K#_pK#M4YG<;ZpPVu}bgI=MW z<&V`_^N;06PH+L?)rwoJ@A$^rhNciHygin7uN-TI<+hZ=JxjaL&GA}zefM%(VpZH> zWqBKAxSF9eX8mGmr+IyxnyRv>mvQ!3Wm~LAC7cJJp--nUVh8Y@j}^j)@DTZ{QO&;L zgIezYyRRM8RB@U2a= zmn+NM<2&c4B`*uB|J@tAs??f&s!FYS<>SM~{#I2w-V(9#MVsuedL4}WmQ_QH;1L(yY1BA;=MMia#`}#Oy@1%9iMwSYsRX$guSHlkM-|i zv{l`&qUqjuq&$MxT$1_xN4_HfvumvktJhIIjv2z{!fHzz-u+b01zd{(?zvMrUrO-C z=z%}zjVv>%gw1vKXPG&cxFrP5GQ1mNR_e^|w=TXl#77CM2uFNxiccflZw+hp4zLY% zge_=ad>ceY!WwlnEI7Ns78Ta0cr!W|HlfUIVhF6%ePG}1htDwBsRzMEG!&oFcv^^n zZDj`E#ABh^F5kp_F8*z(!0sW~9Jy!$t2zE*Ms9@XVfO2?O z4NDeFk9ythQ3udC8y2ywFGJB2=5WCJG73Ej!o3hsHi7qI5-3^(yKP4QTv*4xiyZr4 zyPCwUZj(9X>74QmPI)$`JfB;_7J|y&phN}gt?{u?$-I&p;Eoy}IUfTH#R^c|7&$fg zC}CS+hjLBuv4%y1J^Jo|PhCDv_3#e78L5w+wLwiC@V-w0d*PQ+|0@_d1uS`cp=LII zR($*v=+RizISzeN!9I5)>YPMopiXCuNj=!+x}r8Vx(aZ_4RkS21Y17Fw&0BysASx+ z;UnD$@3j3PCCo1Ywm0Ax>|XF`%*P%UDfqxv1QO5$yo*8@jgLL#APF@y`(<0sOa~D7q&R~s5yU?u(~v$XN=4BIG5{jE;k037owG9*mhfS z{@Qc?+H(F{asJwI{;D~DmGJ)f5cRORSdVkLF}QpTWsk#K!iMv@A?G#hxA1Aed9C2Q zZpeAvfb&|#d9B23w7i4v1-h!`(z~YUMQYXv=OTG=2 zt!+oISXqmQp@7+8x$j$f)#I8ESR+3y{$Se*TOM#b0G>ehNSlkR1Fj(glcHdrQ-OKY z7!uMP(!f0Xm@Csse)R_jW%&LXLSNXg%P_(+G8i>hS-;C*jamKMtC)T4UK!@+e$>wB z2Q7@tLJ!0RLBT@Q$==<=;-0TD0!lIK`_js90=bUcGUOKQ9_o9??sPCUBBmt4lvJOX z7RpS?a#Is4f64jwl-sW=nkpO`HdXmNSJ({xuWK;nQ5X1XjWqzaXuPMLu+}hdmSI>` zCc>iM11o_6o(GFyOI(aOy@Bk8&&{XsZaEE4n_uD8@~2=0FQ+C#Q}|DH=KdRl;9)Z! z76vomz2PbN2_ZtPkR&V-@`dH_*w`uT6Ap2EgR?@3a80-^Bd|HJf!~XhtfQ=pte0$n zY^dxl*>u?~SRVw*qF{fJ4GV+~vYoQ`;H&eE?4snTge;AHF8H-AheXfDDN)s zB_AXoDSuNwUG6TQCl8TF$rI%VV2AKyC+|Q{&wgY3csaZH`FQu4>F26QkyyoH6(ns?2kvx55we(SzI!Cz$de3q83-t1I4h$H}^N!_t$5zWb zj;D`vfhVV@r}MaKcgFL)mrZ&t7TO$*JFd0mt5cE#C}-MvDD;Ky+eLHuV1xXe!QGNPxr6nmVdST0sMYIwUj_hy@8Bdfz>Myw9p*N>k7Tw z)j597de=@a&b~aIMO@tBf9o~d(>0iXW1_|)0q&l&c*a@ouJF}$_h*Tg##oHAibYt% z>{`8T_Wf>)?8|^a)an!9Ixo=K)7jV8&nK8iJzf3%d1Q{CD+b4p$NRf_1~`xMa-HMs z>+bG7+uhqeAjH?%FTmZ|bC&yTd=GF%Cp?)`u8Xs$e;|ZB08YQCbXK5CfTvHWtM?qs zICsL5UX4}bD;XM4c@6Y-@7%dhXUnDkKl5I`&q=w;&Di3)jJ01#WD6*1?f}O}vR;5g z6TBdW1p+)Fg@uHjG?N8*IKhz&zD;DS0PhHFnL?@+7Fe=VCS)nGvkCwpcG91*ZVFwgVN z0#-`qptghv+XUD8 z@YKLDM5xaW(pbd>v=vSSxL9BZ$AkQQBAg*OaSLY&yh;T$7exd#7fs;q4E?IN*>#fp`cw6=6fg z2@Q^8IA_Am4JRQSHsM!-!y8VsQ1-!}3`Z2=E8v)ly%fh=c$Z;m?wRoH*p$bICW$}6nAtv*mRQOr{Os2rmFLG`@KTeZ!)we>>lGj-b3Sys1c-Szc) z*4tOVOZ^=UUT&~e-9`OTL+^%vHi~R?{kgf%{bb{7^QUdN?eC4JH$JC{vuk1JXLqnk zizdNMKCrj4f7||oLpO&-4keDm91m;9XfHIK)bvENLCsF-X6U{b$B4f=B|P8k`PIz_ zHb2=SrRCICwyjRI9@Kh6o2G4&+cs*O(Dp_~gK^sIF-*TfZFf^6^(DzOuiYQ@7dOzUlsY z_odx`fAvt0)Yk(3Gr8xBJ#W8$ve(Kt!h3u5HuuTt+pO=#e*furr2qK-HwUB-Y&CG> zpbmrf4GtL6a!BBi!$aE+jTm}#*sH@_hy6Ny`0#f|*o=r6DIb|X>eW#PMzfH#CIq4pLBfk_{nFd1WYAUW2QBjwqts~ z=||sw>+NGR#?9E{Jlc8B%rP^+a#=L1{;d73Gh9<#_qhH%yV2~?vzN?1F~?@k^f~M1 z{NQHq_PU#kTanxM?zZkj+_T*;&Q;89Gk50P)pJjJIC_ln@b!4lqr|hL=RD6+FAuLQ zuS4E;-gCXPynprSi1qZG?`Yo;-<7_{e1D&3JFn}!$a%;8>iG@#JM90u|CRu&fS|zP zfg1y_=m+Uj^?UWd1T_wF3mzPNJ7ja{_|WpO_YL#In}sipcrGF~vUTLFs8&()qK-v( zirydN6tgP_E2 zY)z(~cD6UE=Hhv(`Dxte{WgiKRxLZQ(~;Ioe)*hatCi*|gF-{~;vFYdP=08U?(xvf%vk0Zr8Q)}h2y!;|@m8vK#FF+^# zMD;XDS)89=Y$>7FNlA37Qau|(dbX-o>P*jSsDI6D{-F3QDzmf|mLH%iZ&tIdHLO69 zsJ<0fN+(~ZiKW7)zndEWCO6$Ng=q>?(+cB@t!W+ib{C{(T4|V6UwT=ZE6t`dux$kG zLmSXK)K%Q1Dh@LS=_EIdY?xm3Rp|>1MLOC_Dan#Xbd_u{JpC{{ooUA}XhUjy>AkT% zSBR-W#W6*x*6Q!kiz8+9iy-iZ?zky0+pK|H6zeJ}qpRr-X|+XE)>?=)J2AfLbzT-h zlGaK)=vqsXx21P#DXmy<_JFM0Vc_iEL5*R>y4A|!yu2dO+#KZQ>2=5(25Qy4;>yhG zAYsK#>h`nb8sv!e2~`;>V(*;z|OI?PlzsXRpy zl!qZ%tt?_W8UMo|x095?QBe_CE_})dDb#;dwswPl4kFW5Xd=^cA_}ydYmS+Zg~;+q zmGr)8u_8MzJTpY=TvH}12{J8Ksi`ck%(MkUdBfyzLr(vU)zJR55hnUv>Mp5iS7{(V z^`y>{r{qcNNH5aCqS@Yx*8fIQVfuCMjY|Vb-Jhx;e4W0e^=N%jy&nR%wu~-flaZeI zLr!&O4^52;xK>%jCIyY7!&J0w$wjKA+Ri0XTQRAP=KTK2y?RcX-d&W2(nU)3ZXe=zW&&^F*5s~A(&3@A-YfFA|q;n)|+D#fP4UnuciQJ_*ptmdS z|LLKEO}ljczSIQ!dBnMCC3#OiQ(pQ8GfPRWPfK;Amqta5@S7pdTM?c+Z$V_FLvV0p zM6!QYgoFAUbYVe3NTNioN>yE`R`dDnSXfKx7stG%mR5cRgC&jYP?od`$FVYWdcnA>o;OiExx;`>UHHI7D@9{1>}Vn z>*(0>AC*<>iV=fr`cb965m#z%$k&}?H|6wBoQ8J3afNmkO`~hf$nvqO4x`6)=s5C& zD>~EI8f#DaXqEKR?;U9uo%(%?{F~+GUYcd;kxTuwGnE)9LxLy`E?*}NGp$n?6C!hh zv8DP(`vs+mH0(}GMQCbHOulxfvLHJnKNVX}o~0I37szCAM7UwT*t$GUvNpvj@)IMn zL$$M%{^6kksUq!ur>!DvaduRpcCRwum}6Wd{$@)5tvp>3w#XP+sC`#in4OikSft&| z?G!~zA_@agG&nLcG*Oh4<#DZ0Vcz_RoFJ|Ggr!9~+&n>(9UF=DVXD$E(o>%+(&^G+ z$xZq~5opNuS_KIy%*x0D-EYtw`i7LFh)TvXLw-#~L)08yl4thI#KB=^v0IQbTzcg%rXTdA9Bq^2ryXq7kMp zisEd;N`K@uM8+FX+YsrTLY=a(%(T2rI994jj7x|!IL=iC8Bx+S2y0DVvA9}Q6pHm- zx}>Ckn2Hrk(w1Zx9XD9Ut-P&eHb5-$nOGcEKBJQnwKMnDWW`5ig=j}9L*s%XGsP1x zD`L|#qw}#Q=4RyN#){9V>1(D-n#kC6LoSYL`I(vN>EfB66xo>xg(2Dz%8;nY==f*V zGF4)1L!x41;>5nMC=3x9!3B(loXoUTap(S>lN52OIq3gZWkE)vF+%M7gCZj?Dm_H| zj2Lm&JVG;d^31V@j98;spv+BA%~&kvq-JI2uiY?XulC)&+YcLK(hXvWGCVduCQ*!t zkBScUblds%vm$7#d5mVRx6fRUHQpQ6uU)f#gV$;gkxsIEAnh43WTm;QCNwH4O!QWT zW<}@gsGl+)+z{8O@}jarbHqUszl zh0+P^*(fC;C1LS=2OmFw&pD10H_kn&D^lj?=H`p}s-lRj5M78eA~rRvcMM#9W8Re}V#Y>Qz0BsZA{xmR&Ae&(HLxoE!4n&)@&3@QQL?SY&9lSl;%IlOiD8 z7_c0x$;y0Vex`VxzOJAPrB^N6oJm{rA>uS1A|lyY?A}8}BpxE9-O{%jI*NXwkiJm; z+fP{1T+^9aSE_&csZVNWI-n`YO3z3Wzx+XA%!$FOIZGKD5givV&X_b~zalL@B9raI zAu+**9P!In6ftR8u?5;^z`Kdpr4IBJz38k8jf@V_`6=}g5kX>*N}m&1tXr-;eqiSb zai@w3+2@Y!qxG$y)zj-XbH^uQ2zz|C=mvy8ZdN@(Pp9oFpP-+|6SUjiCuk|%Srxz@ zU;I@1ywGL39nwA}o;mmhdA>hGyVp87 zo=L;k>B=YC#GeTdD<21ke9be zTtQWeg2hqB5UrasBr-BMN&Gu{vfXrat?S_5P`l-n)w;O-joMbz*-x}&{f#E3QRl~; z`hTO+QMBJ9C-mQ_>HwYjkXc%z0_R#MX)-2hF<`D+Lq~e2xhg&x=U|<;U*KHl$_e-^ z^_?5a<7yY)zpoSZH?ONz>i&MM)W%$26P}b2lLK{EPG)*;idak=D6&)Hatu%cg~mlj zVX8ery^W=TwR2&*MKgT!hI|+OLlYd85SSI38(^OmT9jCjxis5eny=!@Ta(u5X+ ztuo$R_&m{(;#m;$2Q7P29mTUC=jxr=wTs*{(8@2M3AOGn&!Aa%+No9%dr0A^ z^rXTd?G$B5bWC)D_-lvSa;T}+@*3&_e@%AwD@{b$qQLx!LW6x?WN}K4ar*)LY5R`O z`$}8&_UtG9S=XcD{v$cY1~)&8)L_!g!VR7}x`$RM@@8gCp5Q1=q^mT$w}yJJ6Qv!}ZAHYE_+5J)+3U9Y zw7yPla;T=$O2JFKKVmh@iWe;@7EOsYRaCc>yFOfVCiQ1)I8f#laVCLq)b=o4-ki%`A!gGQnW74yAbfSt{cRwpxw|H&L3t>9?s#K(z zzSy^TgX5-E#XHt4Pfl5-Tb8nXabB+V8>$3%@4#sZ!3*>YgHo*3Q{pcV)|+0uM16y7 zzP(1{ui5US19oVPc<8sZQF1_dwTyHT}9h{FHYx%ltOwuYxJo>dDo* zw*M+kK-Wx7H)?_wWrr7QZ4E1wMMh>5+(K1k$O}SOU=ti9N};Ni-ZKhkXeFm^c(QCQ zwfkNYsJLrq@tO@{61CRM37k1+qV~0Er+)cm{}-nZZ1r?oE~@({lys(p4_>_bv(3IT z7)aXF)*9zv7yV>yuklCEC5!Y!?^pYEADHW@E%ii`E8c9*EbB^%oCN(VZ{ z_ByR^YNshzK+_vms9U8h%0-_{iZiOhJY%7_OjQ()VS4>0YyxwNb(@v8mx}Uoi^ZkT z@#hBVW-EKW_0~X9A`?`BY#ame1|Fty>PgbrpJ3&kbcvq66dz=>pUcHa`ua>wVPa%% zfEEVQ;o-r_V%OBKM^c5B>VEi<+K8rMjFWm@0E~)cHrIWsB)*_2s5?5MGzUdCt&YZn_4{JZ$ z>M~Sh=Hz)0)0Hr12A|Z@Nz|SYbeYx>u3wY?25WJP5c9jHUNG~?3#=0IP&!iMy4rX1 z<~6IfZ1G+_d$x~{t4=NbDh<74I?t-GNu#4X{%U)DduL5hSa^^afVRSmU^@Nf!9CxI zCcGXE%L|4rhwUXkY08UKA>omsx*T)RL+b6u38P6t!narDrg^4un*73ujeam84ULRv z_Tw|8$qG|DR%ejT7t`Tx*SQq1-cftio}IL_G*%Ijl^2_%-KAWWxvl_qzT;?!LM@$H zc-dT+P5O3pnC%G~Ww$gJlCc8J%nj7}C~Yrl#W<# zFS85>{Y3Rn`t}W*wENchI9J}h*PBmNWdn}1nc(d2>#1AkH?wH0)_JCnKDbIkER@W< zW_y|rFu7=KcNZmv8}*D3#u`Ql8`>(V*bb@KxA&0t_;y#govf-!)69i1DhNu7fGM-8D*JpU}27C6cXV+ZsL}ZKd|tBtq>((|@eKIn@7! zcH;-X@y7ViuUKjo#MS4X~`(L8pT(%I3h4w1vSK)#vW1!adyDCC&S_oZ*MV^h} zNR|Kcz5YA3)aeH*qix_7L)-MAa!E|Ge%o2^Jy%SYtTmgKZQFc6``xYqFQ$kcQ>G5+ zp`A2y!-jzST0MA;t$|lfO-)lZYvwu^zl{YpxrZcAlG<2HZIXU~64Xh%bMNxy%SCA< zqoSCtCyWZyO^jRRDj67M2wosAkdABS2F#p0N!w%U$zM~%Us86R{7!pd+iW*XS!pq3 zqr+9+QQH&WVpdt^+_D_jql2o=g*!KYs4c(*H5M~hm+%}tZ0V*=^mOwRla?uLHy164 zvIZ|O89F&q{D8ifl z!aO!Ie2vnhuE22c3NP$thEINbf_BKPoySFrG;Td7D8}JJc3d|Jg=<g!$la)xzN^hs-h@2YSlcvfQ^hwh{9SalU{&uzo5vB zi%N}PR`^lAK`?S}BTa=bn2RDPJjZ_(vsTVvT6lE}X^7rD8YBE_Z%uf7WI}{CJ~}xi zP7GQS6q67f?{A+NvN)_b&N{xZc!5#7XLr%z6(UVG9Z@XHj4bwL42+D40t1^#XC+5^ zMv;>cnI5KfRr*8*`GbMO%3s3jtL1_unEIO9Yf{q|rx_hF5tvj+=PZjkq``7m+@ z%8*k@LUQojlVonvm!y7`^uGtcZzA4qU2zM_H804Ec8**fSA^{Hf7JNLre_Gy}%| zB`}MPhO5K>QWt|w-)g2!o;A*p8JkZ4y-r6{p%T7{;_hgzzM zw!OGTsm@|ix&nr3DeU0*Q2oafC|Yc%S68(xj>?M8jkTWV7vwq1V)7;}q)Q%Gr9zh^ zGHrnLvYyVoJosWF9oOlS&CzSr{de18QRXSM9aIA|{U>YtjNz(*k1VQz4Nwhqy(B%? zZW$a=aC_4iX>rvU8W}Lf&Ub3(s2D z)QmksFXsQR>BaEK7FoM_;6w2lz*+KOO93Cr{yyhY*kg? zC!}WO0spV6JZSyy)P4&7m-LEKJFITC9bx}1TAG-wp6LAfFVWWp%iohs{eOu(X^u&F z%v0aLMbSL^^CORJ{}vrqCfQvx`3-B~%;L3rZgthYu&+%1w>9^15T8Ggwk6avT)3E{XR(Dkt-vg-7A{z)jw}$HeSKi_So>xTM48^PqexH^Oi@$L*@zf z#Q(hUw(t~s;MZXu`in9Dye&M9Mm=&H{^w0N(YDOGG2))P%U9R#b9cGI9bz7pL+xvM z6Mvk)i9fa#-YzLY#)txgeQxCPlx*YHz4n0{w}-=W$?n=M+Ww=^_k4GVdq2uC&R=H8 zb_mTiIDMi}`#*HRLswxjYUta29N9QcK%xHv94UxZhQuOfD7;)+#{ zmk*uzMn{`S-8Jlmeqc~qMu?6MqVp8#fs6g;IjZTFDs3NEWmf9@gpZiMkJ}2II=t95!{WbyfcFp_Vo@X`d~_Q(paK_-|3xGaunGvP*R(@6ab-IdZEJ z-BY(3`L7X;?b7$P&!>=uSLlLY>EtUmXG>{F*}zg;6SLuA)(GtPIhoZ-vg+8LEuVk> zuIsQ-(_9AYJeloeFn+*?8?dZa+TQ&B*xRpl8$PRt$UMpUE!Y4tBU;+(`gc@3Kk3-G z4dT|7@4Wx9BW?KNDf}pJy^aH<=U`9wFId>nnRLKoJe2$kl>A=)ZSCXn?CpVa&2Q9x zTzvLq1ei|Mx^O*vDiX{CpXj*x>?!MM?)R7{!e>uQM{}D;9vGiJ1%1p79`8N#vnQpK z>GP*>w!NQDllw!JT`&``{wloccUvqvufJ&t$ju6MFe^+#GL*B-O#QjQl zToLyFMt8v*XZreJAdfY^XHC_?ACeMsBYp7)6be}`*f+&L_$UZVG zB``lKD=sTGBW|R-eP~R4U`A+8fPH3YaeP7MkNfR6x^En|c#`!yvxlyl0MCoIPLjQ3 z|BDlCMVsFGl@7@flZ^|FIgZrH_2SfHx`S(A2wEJI=U`YJRT!KS9Oa;%%&oUC({Grc z40A+?zb5}yYHe{BsIn;^q4Hb4H;|cXUtp%%v~@SwX*)fk+IiyiHRovU-FYdop!`k@0as_^E5l6ebt|N5R1KuPmwcmYoeFC~#-{&sz z2Hw}R{{@izX!>ezUlmGIAEKP64`WV(DM9n-{yqbKSXfluRiv`-uhW+wLU{B;nAZX- zT<%G+v4*nQ&!TLu^16`jj%saOJE^KJA_M+_!%r@L-2GeHxnr7?iyo*UEt&1Ztjqtz` z5vG4Dc2XpqNUUgA#rr$<9sb(!{HTv!>^y9A_bF?~Zkw)?tOkr7-qO)_pH%-`C)(_X zPdD!0tJ^wG5t&{9>-C+=b*ZZgBE)iM+C!7{#o=8?x6$U3tNo0*)8>uT4w!WCM3Pu$ zYOGnkta#0;AcqjZCeLJbT89Z`hq}bnY-71aF)Exi)k}~PQ5Lw)j7SY z;tr;xweAe%cD&wmkMR!2^s$~g!J<6`zfk`q?+MK-^t2hu>u=jXk^gyB`zuXbpJ?+z zS1T#dnHN9NuU43Le&@Qy^*bBe-gJVw%U@`9wYE`@FaXxtI$3Oh&8g>Hwz-_+b=_|G z7r&u|x*qXUYvZQ(sam*58+}O|$!Q1ke;)HBV$Q8z?6&P=7BhYJoj@JU;vczkMy@UZU3SlZOVAC*tGqAJ66#)Dzws+RcG6q{n9u5-tJkmqJ@QD_N7`@ z+SnCQ&~YGeBNDV*?Gzp)ZznU_8VM}N~n+DO3fciYJ6B6H7&oTboO4zj$*a;R=M zzMJFT54lP&|L_W(WkcP5u$@5<7&S#vIYG>QGcrOij#Swe|MibgtEHBD8`}E&9<-Bf zFg(@c^Ej(5?(WmdU-j&Z7((m8Dq$!Lk%t+7wmUgpGFHBe(l%F#ZTfcV4 z4v)1iE*@Ua@P=%|ZttZ{s3U3z>(*PGG80h={%KN>&YxAH7yaoQ52@rOM#+*Z!uIPssDo7Z`uX4FbPA2r z1n1-5L9u@xWGvkM&g#QE#CJFDK9c-}HFZpGdzSrsDDmZ1QlllJJ~7|Sh0WE1YhMaL-6!D zK4YE5sqWK9CiR0ia#CqeY6JK7AAh5b62xM7iZU-kf4JkNhy&ARjO?N9J7L#XDPr=w zYuBz?X8rl0kM^E*EP^+7)sR<>BNUcpWu|ydVQf)adco(klYK^Ed_ib>U>1ZpFg`Z4 zm({cC?p+u z=h8IO0*x_#X=+-*5&8m~9H=)a-998OC?PhquhbsJ(}Pj3)Fk4u^07MGncX#p)WG<- zkde|0_OZcB(0);@eL-B&lJxv9X?u_#TZs0lLyjgiEimq0KJ+lwKCec;Fh(c(L>oVL zpV}es(`|nqeTyE{(8jdB(YUbCU~~v6jK~d4HW(c6Ps@fH3`x*QJJ8|M(A@CiB%{%x zu+V5+P!y5lAlcD|0R?cyn@0oiv(5n_lAY8rB4R<1(cn-RY%~-n=jNgy9h#Sy#OjrX z(V+%oU{XZ5LrAc}un<`sXk)3qLhW{#9?^t{F9^&FqiEAUH==l9ZjR+2K^2GRz$@{2 zd;I&j=D9h^#o@UQ!3A)5T^JtWut^&FkYWYw|3_JhHGgO^wHy7_6rr(H5*%V59-gev zji4Q*=Jrwt>G|-8Bzb|=_(L{%) zhUCR8jj+#;E?AtIZ>no_PzVz$CLMt8#{UGNL}?69QUi{Z`FLpJl20*CjT0C zL6R?i=)(TT-nyK~Wr@bze4~9%b_#wj!MfjPFH$)j<4DK+LSg@fWVAQr z1|&vATEE;Ij;2i{UpyY@sb`s-o4> zKE_cR^P(j0H&_=Io`V1GkZ-UzhA&&3lWqOu*XX%DWwp5txN3g=n(%X({AXt@@K{l) zo3gMVXBj+=mxkoRXSAJp1Z{^TI3F*qOu~QUvv^NemgW?FZqCy19RdHaFE}JT5Wn~k zSP%|}(sp-7NbM|1dR0I{1d`m?s$C2_$pHhd(H&RmyV#N1mC6s%8ybB96b3oURrv;A zQJSpk`uXsSx-*vS7)7>O^iq2IF5e*1F{)3TR|RD0mSyc&^@$@Lr`oV;`8wTc%hs|C zze0f(`gLWOLBqR>(o~gisKHkk0Wz@9)M$5XsobP7HP94?z(Y1d=^JWXCDN&?p9UT6 zg5p@<_59ZsATOtt>sI;C#cv#_M(pri7NrY_a`qhoCadQ9`g?*b&XfTB&IP!5MtSk` zqd$psvT9YnaTPjLSb$wqEe$kv(9;q;?)3dxUTPYti83S`@}l!1?Q>)DQZjQsI%EIQ z>zNUG3vx3Y^0JMYDaI(H!}xD6Z!)H)Whdl2#1|&yMW%)&I&_#f|C%B%DHg6ELCT=m z=&&Sle!C7U4T~e<6T%$ggA+p2B8~A5m))=k&8Bfk7Wh#>;+f3saxK*4a?d&U?z7L{-#+L2{5+>5 z`}z4$BNu#iE|EdqFNIszF_K6gjzHxC(Jz;vGx8(v1t|&=wg#Owi8}w}1SD(%oPO4shoZgM}9!?X&a`{5L4tWg%1zr!edV_^|vPp<8 zID#fY0@C-xf#@jSsQ(bUL^Gn1PXZ!&Y){03E$Y0@CbP{ZFZc>gt&!B4m~3~dqrbDa9RBEyd{%3whM-f11*j% zjCpfLnwc`#;*(_J+_&iK0SRb0Kj8WnIXcF%LoMPAWmbYU z-D#58GE!`MTPwGM=xtG3mHG&+L=_Vsm4Pcr&u`^0=pKB4^T7X}M?=@P3F}%6@Z7tL z^}yw16zJ1M?0PxmMDotv@wm*Y#mY>r4JkhCMx%5Zvv}`e%8DC*&f+BP|h4d9u z#gAruM>_VKHh+|sRwkHKc8&?yl!=0V+f%k}+d~~KSozr|Myrq95Kc``az0;ScTw2UIh`E=~8R$M0{vcAtdABmEka+25*7g zY_>C5Lc4}rF?M&#&P7+7Zn6Kk;&p@F3j4%<$`xUYsY%NYU#%z3M?G_^U-nz}thVogo8 z#aTQrt(jgk3`Jl^_aSePH|zSs-|wD0a$_6gwcolm#ukZGM=G?s4a`5-$>{Eg5AnvI z%WxpWu}Hrhyn*|B8Sw^hvYZ*y5r#rnB&P5oBhW>3Aw$Vv(haA<2=KwwOALciMiF~_ z1LWTI@VCZuT#w=H8!+%DbiiImv%Q~${Uyy@X;q11Q!@1yJWh~ja9X38ks#vlv6ojJ zlQm8{G#FQ8WP#ACm{x&MVbWO;U3a-~ul>;=JS&_~FNW8fgyjX{{;Sr7`(v;3;1@ZZ zI-81CKlTbpu0zlbkA0jFByZ!I>w)NmN=YVl*a;|$lfLd}-j06Pc zRHgwICXzh9!l=u_WYCHS9vIfcebqvNT&G2PioPVQFNE=pC`>7*7IJ<*ifQ$5FF2gN zz$>1dFgIlIaU6J$zIHq1eml= zbZXM9EQ=+P3swV4_&Ga`m6ft`?QVGqT~cbcY{3G9RDlK@o}|%8NiJD0{;qc4>C*>3 z`}pIz3nosSw-?o6ke{|qEBY9x72OpguzG?DQVveK7S#`?2@*|7X0yzcl$mUzVH&PF z&wT46Xxvu2{|0p{vGVt2qzAfWqN;o21jqG)bCd zEiOjSepe+RZM&G-!)_$Dw{6<&+C!A zga00XZv3NL51W1-f#tAL@(#LSX$PJIY%+{h<-;Y9O_nz*Z; zZaLO9uFOA~*-GBMw^^4;g7b_CCtkqWpf-cwjwYof^v;o_{7 z+p1)u(Z5o?ec9qw29Ylgpr`P9*2!b`E1q8K+mEkCYB*xI=rtiBfjUoQgxaoghGhn( zDeQ625X6O@nY(YK#S?nC$AbE395g|C;9$ZgzDwSekuE2DgGV?$5+%GYZacisNt0v3 z1();iCqj9gVAWfoX1>2_C8nW2h{P0664 zr?6?(@!o@cmrRJFl^eNrGM5WuQRCL@T5f8-V>h*D+xn%Rde8A`Ql0AS1z5+h<=83sEK@+$MT*G5vQP9 zdPHhyszi~Z&}~r6Ci5iY+@)Uh4P2yHEeIrh{y0w9IFj=h9J^MvU@7@$e54^VCtm7^ z&yLT|NVQA%!(={;{G)GNnG^TEU0K!wK@srz+-I1m{rXuAjBs~H8k*|vjuiXDCnE*x z`-}0`Tu1OfqQJNoc6&2#-+kDL$!hhJ&&8zQ0AwwalknTf{L~Nn-3A)55%~b9KIwiYuu%=XxB0;k!n8|G@OLXh<65s2Vby0U!l zv1>9A54ef7e(47TiNr-{=H9?~vFgC3OVtZUEnB-}-8zPQ5TI{43!(2dcP{*C{7;~I zIQ}QEJD7b3i;<~|qXJc+e<9tW!yxDm?>ue*Y0KpO3v(E+rmDP(gP7R9-iK2h@a%`O z;|VkpH?>L5<2ggGx`SK3syI%a|MGL+`HL3JV~{9-vjJ2)wBY>yLg01h#9{xjqoyt$ zK6+yHHIxfljkKh*TiD_FI9nciu;UR0zAZr1iX-Pkz9$7efc?7wSIBTK-%;u{(Wo)s z+KC?<9jjHyxYQOO3>0F7=lU1&mU37y`3kIJmS?5ouh?jmZ=*0DFq$$A%&zSR3lCBc4^Qm>&uNo;`^?&VTJ3)D zMa}TRUEUYJKpEzWR`!heM$puwgh!DfLr6~q@R&{Ol7f?iHcw8Ul0VPWyRyOW76m;Y zJVKQHt@nN;Z+$vz&9VRn-b_3M9Uf8N7A#+kvAoh5ZBN^lA#oZ~vg7QYB(OD7>^U}BdLr=0Y~G$+oVb0{N&V4~TF?6BL-r0r(EXivh>Ub=?gh-TBReXK zkVNp!PsuCqZJw4KRHm+p%TX92V%9}VB4XkdX$nsWW~0RQhkXZ+nC3fb#EgSCZX7#w z856200CHA_W;(ACagq;l`O+v+q*P(nAumq~$1-havJo7>d}BE56xa|f!woQ+m{^^j z30}2!ypt#8c#$yAI4)gaG zR+fJwyD(+nupyt!oq$-S4P$FNMys2dyvFWFzB20JyP5bzt$PX!om-J82f`)IV(YKo{Es7APenPk!!LQ=F85H-!){| zq$Lw^dMDxlIcYr$*Q!^cV{?918C9953QJ}b$qLOnN-gl(rPN~hA1+jyu!k0bS9x)P zK4@)_a`EEOoGc`+4awTTiOF(QuR6tMW@_sB&u&q7E>+%OMBlU}-Iwos96lx1Dz}DP zbSAyTqH}J^w6M`n-j-xq6C5g&E?uHBg>BTSJVh|oA#ePi2YqhB{hJ=FH;fa<$Hi%N zvIutvVAM=Olu2vFXL$OJ9c_zW~3X; z)Hcj>bxMZpyoUX78x2Q=N>VVdb{kEm86hl~n$&>6`G>=<^MJm|e$eE>*41-Xu&w#8)`xFMWk%3j+Ucd;W84{ykfM z-jbiU<3F@wva(h7QqNU%Ev^Y(y$!M^_JrQ!N*9hti!VeZ)rFMu*B6Wt6Cm z@&vuAb<9(#M6ccwVTrbDC3c;|kYVvOvIE7}YR_K3KJU!%;qyKjHmr8SH3q^u7TAJT z_^SeggH^@l<+j2C2ChHt^Kw^;ATg9;S#5(dyRpr(Gq{8q9mOSsF=}CMVTs_B@XM>ZSU{>YnM>%3w`+IO7ZtGOwcA zN3*lg>~u2W&K;UE>h}glCUyPIU|)dI;4sGg(20v0w&St6~nVSsG<)2Nb#!`~%(bA#K9)oH7al*Kouv zfcv}$>48N*t~h8@S~NL{TyYR@#DC#QH~jfCAzGpl`|ns+R<>h%MMW^ONC&U;r&-UA zzxfP--PeA&@&k_@1-rOi09@+lDwmKuTv)=Tk{D-Vq<05v;;sb1>4scg-{X-Rj0CyF zqy0WWrHJi%XG(h3fuAHOv-RAsbQe@y;J0uA&9BWY7HqFg$N3kPAys5VWrS^rQA+3a z;gjjlx87agKbGH*3u%9C@hd^_Y<*;!B1Eq>@k!HEXsLtPL&0xDjro@B`o>7)7OpmeX40J04CRIk*#%QHftI$TK z$*p=RTqMg1l|f3hrPO-f_qW}XD$-p5ZO6Q`xrw8oTSdq}q)OMC<7ucT@7iM>Dd~2p zG0%W?dsUj0sG9?fC7GaZwx$`fW3!~u`7w5RiXv7@>PauYCO$^1lDV2;N8d)X;dX_% zoB)kxqfp^g$9B*PXjX)0pRF+_O)5?5p_jrS-w>maMu)^k86vH5Qc%BFq6>&7>h~~5 z$888wV`#dakXtk}*zNWwx8+{gTqU;&p%5hOvIY@?Ni`R-!&=1T-vXrb-o%Hkt#`#aCJR^J%t)|o%%Dji`+%Pnug#3077HS@ zx~O;t!~6&Qjrs(&9^;+}lRAeM-Hg4@7B=&0e`32lME$uZp<+asrQ}UAgY>>O1}d%yU03G1$JL4l z`nbmx#(5V9eNG@E0qo+dAgJRVzYe^54_Lx36kj@exUO#c*P};I_Z>0f=qyZMKI>SV zAG&&VNa&h1A$g^x`FX{R=$DHPFt&kL-pB?a`tm<$*b9oQ7c^3hb;s~gd-xptXvpG4 z^Vcx@*DS6XLVe`(De)j3>OO63tlqn~n3;1ZCA>+NzS6HTk#`#M5Rg&MBjsPmCkoEKJ3!+0NM%p$7EA zb)oC+cM&J)-+(D}@54!7#_wSud_Cz^JCK^<8x*)26D7S}&USOZ1{s2Vb3NcKe>d1S z#|`%3)8xRugM!Po2=+aZa?!biKI8`X@X2%Fp069+6BXmuyZ^iq$*W>N5X;?23GVlB z&=&+CYn{VKZgWjGRmNFy7LsYFKRL#Cq($2zux5qOY9!8*wNL#CN(b;Ub~A-jqV-A5 zY(g_{&vbFTK2{SY3vsU->|`_tH;lu9H{>S)DBz;en&{A*r6dwA@!_G{hPI)>V5PHl zvU_C+5k?ubsd^f8q=hd!ZI{EIJG=)iumiOl>Yhv#<06I^_Yp*JX7u!^yEQaNGn(U* zWGH=_{M<((WgB!kjD1B66eJ)Rm4I_Ffv?1bU7^)$kl=eFIUS2TatyduPb6pfYJ(}p zP8AF6rgV#e!PEL@4CW+zEbif%2&eg`IE_(3iCQW45Ee8}zYIZ5D@8tsalE}R!!+~X zil)VEiAjy8XZ*?O@D`*d+&;Xf>Z$!m9{hyLE2KSvG;E5v1=?* zP_bc)(IiHrrZI~bzx}^63kH=4F`D1^J5K^Tnr0|ZFvIU!&hEbc zm+c4DCgh_gTL5j!HVq=bwz`>esl3hn+Na`}&lA*cGDi7h-D9~oQ8kIKKmZ#j{% zSbUI2zTWr=`C9%vuJ4r}qBaAOLLerP^w_+Co z7OF_Af^!+pI~1JDNj=iN;M|NQkev%eD~v8Umk|qLX2H3f3=tv<&do?e;cCIT zg4oIw1?NigsZ1<5SCM|Qz6IxHh?Ok0;Jj>+y2_DSvP}i?6^Vr`tE(qC>oV2Z*RHNZ zJ-eoj8@INbJj-r~y`zh}-5@6)SI>rao!#8*coH8wZzmroZ$Br;hW(wq9cFmX8sao{ zhMT=NPtH@fu`9S@S8%ED*oK$=7Z*o3dHc9{de}8-*tl`ySBw6vpq#>-Ey>P zK%A*WC)7FvdF>H11XqjxDy;3#y4s-Bx0k`FELsZ7QP_^R=ltxooFh1`K4`BegvE|D z0sV|0jbEeS)%sp9<@GvUz!5vN)()KZ=KOR5KUwQt5$8#!Ap9#n7au>9uy4bH(pc|! zf%3w>aX^{wuTjhfKjfW5R;6H6R%0Uo(@Yhj6xiHXhESfSFfBX2{Uay82v$NZp}NqL zTolxTLQo1H39T`vpOGiTD10K+7U~Ffg?d7Lp@HzJ@R`t%{7fDTorLy6XY!j+6?2t> zC@~|LqxQ0xNy=fyu^<&lMN$d#hb5^()R=dw5^G{ZY>9?cBh>|!U@4dj6@@C~62#Yq zOamj`&}0uZ+>1;HTYSLk84$sl#2-R8o6I2rB#;D=U=l)fLK%SwWra#;T21l^sSieW zCw<8{5=KHvIEloJH;*j9T$ezSNHSSO7Lvte30X%rk_}`N*+MpxL*y%Rm>dzx3B3ia zAPN?OT&O_y3pRqaU`w*eEujOcLk0+agf>DKp{r0s=qdCS1_%R%UP3>irtq=QgUlz} z$?xP>p_|ZOuoF58-N_5`AM#WfPPC*3=|cvR9fBap&?g4+2gw!M34_QfGFfOUR3j3} z$DErfl*byFN1h9()(i<)8Nyd<|WHkALT*XRphkQ$ZAm5RP zo1HIoCH_FM+g!UWg6Kj*)6$VzD|BXe%P*xovoeLuBKgWyT*2H z?7G=)tWmQ@?V7Th%9<5wR<3DVQ(Ln^&0aMp)pYvgjAUjsf-XA@yf&C<#$vF{AyjosM@p5pt*5olo!7xJ_^4 zlM{)Q0{V=Q^}tTx06B{AKZrIjg0eWTQV5K}mKb$iAZx#iVT$04UWySG2x&;Q zTv#ix@(Mn}dSSD$z3^Ajqkwi6{Rk=eRl+>*>X$k&j-H}FrwLbK1Aivk?6(o=*J1<7@3HXHwm&n z8H@7QnAp!?Aw5k-kbPtnIml(-G>U)1hpV3XE0& zw039o0`-6jKuy2{=u=2PYXe71w28H&C|H~R3O|t^@<+JN+FA(K=AvNjFXRE^!(V~% zq>wL+Hw-_3Ka8K|q^_(586>Mrn&Q|@W=)z3L&2A(_}!5V5~>5$NLiT@$BJZ-yb{tP zURIB%AH?zq4!HI!j^j{IJ6t0;o+lp*-=m!JxEHvMx~ihi5+HX(8b(JUI)a`8niySw z2}UabTB`xm01KhI@pl}}fzMc6A^ofk9Nj=8Ye!MAHvJU_kXG`!sDriDfwXLWsv3%%uRq0j_UwFpNI1Rqy@m!&p4_ePD5N|A0Z#^4TWjQ zcMthyk-k7(VICO+XoVf1VF&nj6vqXK2V_oUxXcfIR2StD(iMH^f}LVLoHr-8L5~~a zf5#ZHBh@)PkaixKC|e1hMUnPgRzfhJEXVJ7(3Qo}T6P^g?hUyrPg-*s?~UsnF^+nZ z>OgZ@ZBhqEmZm;v8UXZS^kI%^ihAq-TcDBbEBtmqI?z)D^$X5h;KNCR=PC zW&KjPTQ=?jUyJ`>e_i$_5rl7)gqWM1$9}i6@fJcWV=ls~#(fB_jXxl?F&;-~%R`M( z!g)30ZiLRpUl6(*e?#cUQ_kjj=NNMk6TssGjn{Dg%$SAnH)A%!T;n3_tj&xM5mq)n zMp)H&7NHH&;Le$c8sh_;S2JcJtZvLhSjTt|p)<-?phlM059KQet5HGb@R$IeGLWAK z^K+f?1+G3Z-a+_`pXVCSV@GL*7$wSN=TA_hIVgFG&I)-k5z+!-7z!}(K&%s?BMhO<60Zc znQT-*e{Di&4gOR>E&CAKg8m9zDk`AWc{pc%Q~|ZH^s{*klZpzcbW>Ux3D3guTuUD*h2cxY?9f^!Y>Rz_XyygKNw3_ct|=xls~&>eME zM!mlwWUZ@=8d+(9JSG@aRVF%6RT=$$9^r31O)fZKiP|?HEDzbX1PxCST7gTJpn;v+ zpae^_l$~opk0oe$jIg@#KEgW2IE2nT-W@esf`;=5XQ3`jP?Ci(0JU49e_08SL8m2X zNJq%{phoR45SB;08nxd+$fQw?+8-liy{Sg+EQZOa8nv?+XOyYttyZH(cFtO@hFr0f ztnF&FouzyN`qii_3wNz%h_T{)wn8m0*nKRnTA`M^2yKl9gc^)!E7bB6!sX6*Xq#+zNG71;-X4bVlD*MQL{s z&VX!GMJu)7N;Q;I7;Z zrCFoKJcJsQW{n!N5wfvhjg${?-)?3+gs?m$&;}_p5n6!*HaxuzpLuMMD*`cWEZcz2 zdkANMS{u;03E?c1W&@tH64)$c13KANCT}*NGZ&$b=X#7@wgH_i*;ezye;>}nuC zXEPzzZE(*PwX^UEMyoAqXLYgKHK_ds!ty+1wQErO4+yQ%3JsTh4WuF$=hZR)Yd{Z6 z?~Hb7c;9J2$sL?C+0%fA2MF0n*MNpc2%n)}G?0fJXi3b_>S|mbs-dMUx5Ztzy+tS1v+#9?!;3bMH=KzNkM~0_IHMdE!{osk<*+aivxGC~WbsdU%4aCene*QnoH+t5ku&OYM|&S4 zWF@#GWe!4?(wkrPMvYH#&Q@D*q+#cbT5nFRH(H&Cb2guNqs+(H%e}gVQ_%@zSm);w&F5bG!Ce*y`=hmh?6pI`=f zfY1ix=m}Nbtd1Dm9%8(7LPLMjxHz+L^eA|bR&APd$F%ID@em)yBMlNb+@l5t| zA$wT}b%??47Ft^^v?YR@y{`v$Z0y++)0VL-0(%yRIGk~q;fWU06_qpZP-QC-Y#n*( z`GOtvb?pjtQvT3MMF|rYvH1BSNLAYmsN)DuD0w`SsPg|*$A1V%v%;BTOeB` zTaV{v=VjMq_hgS{xpE>eE3YEg${WkO$a~3$$j8a2$i3vD(D<#E?~$L8-;_TwBW7jI zs+eib>Y6n*YiHKOY?#?(GiNgoGhegWW+7&gW-(@oX3NYro9#5)XLi`^qS;NeCkmpd ztgu$pSF}@fQS?)cP)t%xQ}`-^6j6#q#UjOO#a6{W#W}@o#WST$*-kk?IZ5fQ3|FQo z*DCiZ&na&!pQ&W3DyrJ5)~Y_LaVig$uWGg`L=~xuS7oR+s=iVkSDjI1s&1=(RQ;;T zH!mkJ5ejfP7c4=&n#@1-IyOQD83%+ZXBQ6`GDTj}x zH&Y78n}_sF&e*Q-%@i!=Day-6Nl#Hy@%6D%Se>jS1I~T`jf@($Q(*f90def!frV^^ zW-A6;m)WerVwoJ}A@&+#uklz$SuQUHdR?CS2roq{h8M4L=EMFfo!VAbYi+PMuR&tDh)NHJkCM6q1GSu)GdD!SL?yQiSKk0fuXQiRA zG-)jOO3T(+w#u?~m9465O~s1J)>8qiserXqz)H&2Q30!{z}C>xl>YzI6qP@rV1{LK zQ}nzz$texz*xYjvCH)z)73wTT$v(*MZAheP-p?xb?632^TFPtVx$;HyJoIR={IHgd zF`K09VcxE6OBlZdV{h}2C@~Vs0_?7#3cxg8Oy9*cTui^EMH&&X18M*@fscV&z$ZX$ zfZcu9Mc#TqeV_%<66gu^0(t{|fWAOKpg%AG7zm6+eWL(-)HfM$K%I_&6To(>)36e{ z0&W1i1Mt9+=}`Ouwj*Wt18kSgbZbFC2*B>XLvbw(2nQm7NMJ4y1%Y9n1_bFf+Umh8oWb!;q&UdjAf3_YQjZ4tn1K2h;~z04;%@Krf&-&1Au|RP+%A^92fzxyYp#~BUiu;V0V`u zIQjxi!^!lUGXZ~qX*p+OBr**r({D1JUl0%iusiiolobYq0}((ZFc*jd<^j>bd>{s8 z#R3a}I3ONK01|;DKo2AXDL^Wa2BZTSz#3pJunt%cYydU_n}E&07GNu|4cHFs0Cs}z zUBH*XZqU64*bD3f4xlXufv<3W2sjKJ0geL4faAak;3V333iulBJPn)y&Z6vZz_0Vb z1t1g10vvNF5wHVl05yS+fm*;PKy85OE9)X(J)l0&0%!^J1bP9zfj&TApdZj57yt|e zhN8}4z;Iv$FcNX20DIIw8E^m%j(`)>d4P-4Alt5h8^G?{J#b{&QGbBxN11k%X-Ptn zHVg;{B7jI>E)WIG1EPWXKn(K50tgC2t_$zKsXQqL;`bxC}18C z4a^5(P);nc0Eh$Pfdn8CNCNagGLQnK0%<@xkO8bgooj)0z5D)@{B3~E~4nzQvz+4~- zmv-hEu>(`8OWZLWYD-~lkrqdyReYhge*5CKF2bAc#e9uN)82V#&m7FYnp z0r5ZrkO(9JdLS7{0aAf9ARWj6HUJxeO~7Vg3$PW~25bj*0B38;f0v8a zmv(2Fi`M6&_0VVn@jwEQ2qXb|AQ?yjQh_ue9moLQoHcU6ja+ae7u?7NH*&#^TyP^7 z+{gtta$lP@Uf*@*LS}MHF>B;PW^%DR$i?m;7rTR8a5=Zw8HDL~p8`z7n+H6{edaJ6 zWlCRm$Dy({UxFtbw$N<;W?W>(#B>9z(@quwEQsv>BgH(*h z9DFzN_UwC^lv_L&{xZH`r5c~09(Fg$c!E-m*~Tl#pACMT$2^S>%6j}~9{k4s9(maF zN=6Z*kpDu=3(RvY$7}rHDWBph(+RNaFHpm8#-DJ!%Sy+LWr{VhBl~d5um8Q%*&kp1{0?H9*+yRc6+WiB5?M9wNP8++%B?U)D^#imu7xf?x ze0xxkr@&&=RQB6L69w2${bOI0*I z|IIv8Ui%<5lg{7R2;g8Xf2AK@%YdI~`|W~01Q+ldv=p1?RVn3?kCgWd=_)+FSwmqA z8^Ne84?HgHvqvwlJ;2(+KQG4;qr)Wm4_=OF$Q-oQ1s}BY&oN}m%kt!LDP=i-dCA9D z_-o3JRp8|Z63_SszMFDjEiBc?cnR(K#gw$LO@+T+r>(F+^l5Hk-Gyx}yjI-NR4(tC zEVK!H!p@sujBQ0pTZ_wqtBg-94J4kQ#TCw;oHz4%+#O>SA2U2Hiz)oz4&mhoqi6?8 z+Wn?PfOcq%F@GzNScT_Q@G620j1u-JwV^|509)Sbu;1+hd%B*m6>bO{uPKOghCe}n z?%Xm6&v(6Ht;_rfhTuu(Y*_0uFM{DD1mBVH7KkIGU{{=md>dfj>j9hIeMox}cExjG zXM7H+AK{DVmUt2uf@fyWNf@{3kAltbP*@xbpo958l!1K;^KJ-6iO`&ZW;0H+IZ~9x zR}TB23W$T%4q8$L_6+7&kLsX3tQEGr6}5RQ8t_&$=7?Vl*gP0NZ*-|1{Vh?n8QL6DPP2`m6w3ZPM|~u>do;r zQOUf;%5yGTfZ_@-DOP~uDoClumwAy{AzxK|&0!&8jkeq1TNdr92LF%h_?AP<>Y$_s zc&?~`O?PvY-vaGapq(91a!2%;8E>ruEgFI{hoVg?^vEcbIU2UpWnlR|8KpVEdb%8X zXA1H<<7>gaMJ##mTH=|%J7{Fwsmy!2BA(LwkV@Ql1lCR97c7hLt-|{r);{=Jao$x0 z??TW59lq9(gJ_h@Y|Je=H!Z=<)hK5TY``mX$*_dw_m?P#$%mSA*@{a^RoHi*K?zJ& zEIG$vwE`atSgqg-TMk%t+cFOi*zhu65Dk|bb72@P#;w5VcHn~<^j}JRnVhgM>w_v> zQp)031u=}{7M$bdILFO7$6-l^Z+XsfD?G!kjdB>@E5n|&K5{XRmj#yxB4qrv;QTGe z`D@PkTb}dRigVTsGUNunGoGq25127G0l^~V=hdiYl5{DplX zz8{eQd>^Ie~K6SX6Q@ ztHEVv7x)c4T2!3Zl{l{}abC+guVtLql{l~EoY&Ss z!biyry!M5+mNnw0;b?>7EJ2A>{ye1uhF47-14zY}^EIVU`dkL<{l4B4GvGYQ7W> z2uFqU!e!wGOdEa{p38`=95-;VgMmX+SqE8nSs&R**#ww5c*tgQLx)t^GTBDim$E}} zsJbeg+ky)5FQNtG&YvU#G4P_PEfkAoTXM_wCNlyPI-! zcl7kNcW`j>@a=BO)sq*|6V9aW_NEKHO(}c7OxfF%vTuZU%cj_y(%bV!+ndrj@H7s*Y{!C-@y&^!!zq_>+UaExPNrN_ zc@a~K(BfiB>0-L>TI7lwufdI%=T;=%gU5UDc#k6So~DvKi#Eucr}Zw9%A4o&;qg8N z-0~@M-IrhYEfO=sRPGGMtrTFi(KPs(}48Hk&a59MRzK z2NyK5U4Rn{R!t$n409~`QYNG*vA7D01x(b!QiA0Z{;Zhm*o?hQAhCk5Tuu%XVYM9I zY2=7ZST83h1OauOA_Dv#GYGt7Nf#TevE*w3YXmkn!d3xuCG#VUC&CVay(VCnfVq=g z5QNxr<(4Bn;Wl1w-#VCy6tlEX<)I3~c!O*lc=s|~IRa6KhAh;ULMNrLdT9Dbj| zIRSorm_y+sLvG82OgXtH2$uIx(RJYlei z9x!2L%k5$+N=2E$trTP7?P*qmY6 zz~%+(GL}E=IkEg=O~u-Q1qIto>~Y8pfw&6T7-3Dt<_i9O*lNNX5t||GHwoO3+YxMN zq1S`kA9g;(OTbPQ%PDraa00}FL)sJUv$4U#$_uAp=JC0TzzY#>jRM-PAjDq478eT@ zHb=O3!175dm4VwLJQ3lrjQtrLm*KyR4HFhRY_qVcV->@00IrGfV#J0*xF=u>2;X7h zz5riGtVy^Z5Pl@^a1tJt6GpN%(hM6Wwy}g8qR;{cdY5H(vc-|yRtNz^vBN}}D>3~nSe^%?Wz=oeTT-Zq7XnLc|jaxT9*u=KU_$IrW zS~VTs^lr0G&E__v&8Ig1vPI_>t6R!i_G-DOm9~|x)y38;Klf`hu5G_|wc7pG{!)hx z9V0qT>y+C$rHj~Qd)IDV&vqNq?dR@MJ=8r?dsghZw%5eos@|h|ukBO5k7J*0eXI5D z)AvHZru~xp8Tvc*e>fmyV9kN62UQ$2dyrvp$lzx~Mh^LI=&WH@!=i>s!*wGXjretB z`lw!`PL3Wl`o@?sV{VM~82kG;&vAc@Pn}>lVfDmj6W2^?G%4A>sr}N)pHKeEVU~lz zafj0gr*Nn3PIsr2pVEKIf+^>xR-8I%>ei`0IBT7|I!|+6@BG;1W0$cm>s)fDRh{uB*Lkh-;=Rb!+Dq;%0F7bzka!)*whf)0<5Xp8k#ZN8bIskNLFq+3IWVJ9kE(8S7^J;Mc(~%5S^h-I*0e6I*F=<$NRIeA za>?AlsE~P9^R7oXiXI<*VSb1CDf4f~OpcYsc8{GG`((k81@jhMj+-3!O?;Dhm-s6Q z{Sp=?JWA}F7@PPY$ug;P(sKRB`r7*b`8F2$Mhh0&SY&?TN5@|=jF>6V$9aO9T1t-< zQj${YDaEOSA`^o$G~1NvNl7Vj;$_-bK~E|#OMMj~aYF>b6b;M%UFy+Lp8;?L>RtqvdD~Dje<9c9j?x zoEnx9w@z=J78jd3FU6deonG^SR8=Dllq{rAB`?XDek3)ceQ4DOXQ}NeF(WZFHBd8E z8KjE{3>PhaFKEzpL!Ik#dfJLkpmk{->Pn|ecC?n{EK2>5w4fQuA!*v9*=oa8YNMj< zev!&bouzg)rE*eh(PIAmD|FFSs$TG~=6Sw;7)A=S`Gwc622v?FbkLp8J}l^y8W zZk-q(q}MG@Sd(m>5|@xXH_e=?oEzPhY%~^GXvn22^zKY1JGXM=PgkgeQozpjCgSK} zdP_QN5|s61L8F3u)6AetFX%;#TN8tL5sT zR9%{Otuj418QI&R0m*^d0{Sf)hhNF7GgDZZLl<0^8@lHWQD^9q1GFB>fKZg4pRDRQ za(u^jlXhRxu2wD7=~>2rkkC1zmrAN|ts7ce?%RvhQfslsR3+==v@g_wDJfx#G<%d8 z35!!gMd`S~jIO7L6{#uVivuuf{DZ@EI#IfS!ABo}9^Ranf{+YBC}=DVQC+#Nu;@Ae zN}e591hG%IN>4Tk2+JjXpQloCNpe#L{wa>>S__&{K+sjgs;hE3DQ~zsEdumwM!hPx zYn5q?tI-f%*Zdxe(70q>nr1H|ll5^Tbv5*e&cCYQU4oRXX2yRVm^~UC(gjC|k}lsv zVezP-wi`4LL@rsX)+HqCGBjKN>@ywY+0!I}`6pG<_l9!{eWWfqNHgxw`GEC2`iT)_ zxU91HHT;UX)2j^=~jS1Oso9ihlCo zJ8Dg>o8FT?5u-b)A0HpuwDFJ;^+jnC-KDhnser!ghE9;3tVDHk=%Q%7e(6$cy?*|} z(4>(EthZ%udi1xlVe;vE?)cIj2ereGs@)wObdDOSVlzx+ z9cib#7;2VOeNVEKI`x^=W!hlTen+T2ASP62<3BSrbbgRN)W+f)H08)Ox(ZFXNq@L2 zH*}_F)sL25&-u-kR%&!lve8Nj${;pI*i>s8RGhVR18u3I1EnpBki_)RG|iXFg^3xd zVWJe3r%>NNI`s3_gGM$KrNMNS(&8YRID)!%&aV9P9eOEe_-)Ibh7JZ%EmhdiZ{e`@ zQD!z4j6?{I<&QQ9;nB-0?Em|3J23uuKlw7!NmqU1KUd^j>w zs=QXTaE7FbR|FadmhWWKX)30;)tCU1F`dSmWNEr8Fa<-NI=?ViVv$MHu2ZJ#ne3XY zEFOku=hfxY%^x{(ng^k3_{&53nP_k*oL9IwWGqMuOVu32;;v7Q6=_++ zZH2{Y6Xk|gi`5~C$>Hgcgp9<6OcG|&N7S9(RHP<_FAUI3!rT%b5-vi3S4rLJDn&}T zE-?_%0pW9klSJw!-IV;LM~dLE#5ox#Bt1DXB~he<=}v`3cma2oUYGxoH(H$%5rUjf z%7BP~AS8*xlp{qj=}bo-rLuufBUCiX&_j`y7?BZxlz}1PA(&;xNk)Z5*!(Mo>?^{B zd+NCnp+SMR?y4ZR_8LZGwMb4E*Q(OE6jW9k${UU;5I6OEwQ9M;&p-a$5q-oYDQ{q$g*e-pTUD%?l>d?r9;1tbj zWm;mqK2f~*M3Isdo)(NLHZUw)7x|$oUP=3@gLI+c5n{(iijdI6fOO0N8OceB3F4uz z4-HU+CnSeuASyjE1FK<&9~FraAxS}+55$INw36C++MWrTk*?E5&J}~BlfqIoi@}n_ zLY_fjIx{VVKXbx}KcqmRxjS0s9nuVSU*Ub}WN9jUmeJHwy)2?baZyz`JmEP;u zty;Nm{qz;?A{}k@M%)MD3vH33PDx5k6*s6-!V*KYQUG@E;US`{Di|}A_5;ukX(doWmby&!--NWwQ-F@_E3b-%gh5%8~qGyz!ul5J9yA(+h|d;GV`6ac*XL?OO`KR?C;AQVvyEfIWs7E;hJq5moF3J;^X6E5~GrAin(*z-R$K(n1!J_ z?iDProaXy_!`d72yt~-gr?d5K4O`!^-HXMpK3mD7_>vc>&2O&s3l0km74zG_XsZYb zPYg)Io!T-?hkB8k)BXy&O6srV6Rg2bx$x!QagJ7cNEa!kGegyMwn3%HSE>HZ8!XAk zaJR(S>R-I!le!qr;m(XrS=WA4r0Byl0yVe?(1l@A8#!>~DNI?qqyR((h6jY`#jB0j zq=uc2#rL>78Z(aVQ!Agl0fslU+(RD>Qcs^9;H903Eplj(=&QnhEknCddH%qbi{cR# zm8D)kdxVxVfAya8AKc7}mj2TCKcvrSn>pI|cI&z+uje~)1h>v~F_+;#atw9fe)lYG z8myYb?pv^9OV%yao{+96`I3&?X}Xd&Q)Q$iXNW7=5{|p!W;B4>C~5m=AN~%TeoW_- zxQu_0d;45!Q{uq*AQj_wJ>s2~@ee~y8>)CG@%tdu?4<#vT)RI=^-z#if9u-)VQQ^M z=c=bo_nzjuYWl|YYgTR8=(*DEb&b}3>2r0eJ~7R-@CCDlFHpZ|&AQdA7K#aRNr`E; zt5vb8q_^s`=p)>77b>dWREp8xls>+*JzQ-kY@T{f`+ushn)l#uZf5>3m1|x9Q%xN_ zFA=wW%h~QXZGpI!suURu!jc0u?#emgp@H+nzoRQ#Lwl7tCH@W7Tk5S6=efU8+EO~? zohGlpQNP3W(>1{ zFh0!Qq1+l$`;xgZ!lW6dGAKyP({pNRr%Baks01}C)ZJ^@#ETn;8+413R=%8?7?&QN zViT|;JT)*jB*LcICW@w3 zyQt0HKP9JV=YJ@J@1Lf6)TflI?fb8rmZ4SNx+=f_Dr?d5>ae+Sx)f-Mp}kE`6t6#1 zBqc9sbDd>R0Np(3n7d_|nm9~)*}v{ zcfX-2e3JIi=Z^hZ@le6e&v{1>7j<&}r$`L@bqmp6T%_|%+^WzQ7!-_x|)-({-L+wxhRBJ)>R9EK*XTwoMI7 z3ewI}&X|+(#qPEHSFaThf4T159ou)dhk2hCA0CFjC62cDSzkTF=2A-ddo@LodX-{} z_Ii#g~r|X(iJ$#G8L@f%`t5A?|=JU5{+KE1Sx>X&AE%>}7bY z{^bqh%%UcOT51my!Ta}cuVT~mTV^8IS^e{|;f)&(9aXQuM6mAMtciZqIqN8GQ+ew( znsC|jz&`q19XK}`rq(Nzi&B#_;>5kF+jnGYuI(M&T?|#t@%D&vnl~fbEygR_ywSWa zW18BwIz9N;NbMKVsq>e`Y>Yj;aKlb>=k!hfn=~0p%YgJ`eH!fF(qP-^7nr_GOI=k| z(ejcc)ap8*xsR4Mm-efNE^u12-}d0!HT$*%gpPlLdQ&Y9UA2q z9Xx+VjJd_|h%9?QLyt@vIJ0t2Hr`t^O^Q(K<0AtsT>n$|X@V za*X%XsUp)LGLu>_W?32}LR}oJhgH^UMw~u5Rg9(Is&_6wy!)i)$K$Q+Bw={l2EB(L z-x(lUG>ypY0Tb-h%*qEZTW&Sfp^w$^!D*4Haj+Cli(ilum12I=v*+N5<2qK{9tY1A{fCTl>K|=hf8O9bf7s?8zxya!dpdfL)3PD2 zHtXPJx*g533@|kLLLIEvrGwBkeM%~`42Jz-5SkIl?GIB_Tc(a#IZ`8uEhRIlc8n<1 ziMcHaw7TZ_(GA8)unJckOo$M5`j^6B*DExtWVZO#dM zugVQ|@$hc6?*z}mnp(rJ{Q~xV2Mame)NWQ$v(F#H&bme`n6Zjdqwi`_@!^f5x7KLW zSFs`dy*gv?!fEK;sS7g)S&Y?2vH2A2rj^3cp^bl|+NPDlHUsS>E(P z3w6QK;yfu!J%0A+5j`{wM%?=2kK^AK@^T{D$;DBCI4;eW(?)s2)TyCRX~Td!G$dGj z(cUC&Xif?`kzQ2oUv%uNZ!|gk$F&uuFIB-Q@G-!}WOi|vihk7Tilpo_)WywRYa!i3 z=@Bz&m4^bAU6KF3Tpi5J2@6siMyYs3Fj{66dDFh?sjH`N-n?ejmMxyEot?eBrlN@N zq~V!)GG0b1?a=LFx7+fKQYE%s3ueag$zjZvJ@er1i=yEmD=!Fy2Zo`%{DUfwS+m@= z%kx$gQ*Lb&WvMfToXc{9r(v2pIVBRd|#^Ji!;$xRWO1YZcv7FeS%Oolc3RGOr)ke<%Z%4;;U@{R1yw6$d>on@7-=MzaP zGw*j(THf`Vm9a)Ne8 z@<8gmFny3_x-vL~wQ`gSJWYK`Q>N;ue%GF3n&Ues4-=)!>|&aBWdXrgRmYMJZQZT; zdW+Lwelew>HIP%9t$Nh+oBCr$dO1wfZuJ?pZkWbl%p6Bo(ZVDmCQ24%TV4YhUTVud zsnMY@F2|h2I**aT=A=R?$%2#|KlF{}=H9VwL_9NjMM`!;N;+JXl)Z<$O@oy5j$mUz zz`SwlvYf7k!LZe1N@#srw-zNBy%j%!E~>6n|FJ}ia2kBf;A*i!^R2> zlOganrl!DsgOA@Y%wCyW+Z4{Nuhe%qn@xI;4UMD@YCif|ZZ_xHs4Q=$GEV}O4s(8t zL|4VuDPvZSDjeT@+Pf>ss8)02_=Zg@#V2Nkv);{DW<6;UB%;e@-Z;z59C%%@S!SIw zBZ>9iMb)vDM>d?+EP-7pmV|X!F)&BXQVtq0(al$!w^w1gH8nacB>-}RMI;zAT=~dz zeP}n@n||6OQ#f>KnCjre#kaTf2LU*1~R?pCJ;&ueM6l>yzQuF~l%hks2SF zK1bsWc89}*OKO~ND>XLQDw5~w5`z#uCo(V?7VJavM=Nx3dS>bNgilEVePD=G2Zn{h z4E@u5SuKN1k%laR8aSYY1_z<=8u?=sx&_QQj=56kVf6l!q2iPLiil*s0fC+ZVKs;1rH?bclpn!qgG5e;MHFwx>O zX_#N$STM(XoqB{+RpAd?N^ea>P;6|77#ORIhzgGIv5pFk4^E9Tk6fG)ouN6lW!1iA zB3)>Bs7Or+PY(pMn0b7pC^gAfNDU1NMM@+i2+`q;hZa%|ElCGHohP|MzYx zR~UX#C(mVO|D%;bbAxmV;)Obj(8Of86v7}rE`=Gy|8KP@#t_YJ(Yd94dU6sh?QcF+ zBqc^>1fhx8jOrr(*IM+2!Ke-j4TrI7+d7J{@HmqNe|!SWVNYb9=mBHb_y}&nAD597 zF1CfxMucLT_#f-HpA7rePF{P*z4Q!Vwo!|?XF#mDC@v{^>4r7qzk0d3hVZ#keYb=@nYZK&d zD4izyuX@8pVlZ4JPQ30S;Xi%i|C$)?&J#-B=brCHTO7-pe0CM>RQYH&P0F#HVEEOr zK;3@e)ZtFz(P;xVchuDBJgm8oXd-s`OYP9MO&2w{caG`-?U1F1Nk7y!%DQ1xmkCX5 zTb>)jbwkO}4egA*xqRJe^PxM=x?I;hynf`?8u3*{0<;kBObc<_q=m@PCoL4$LkrRR zXQ`sra*1>^f1tWR6$F*hhTXRNx2!nERYvo<%4h*s8AVQ-FlFdmb8O8c)S3E2nRlU; z7{as?|B^aKYEGw@xc>fIw3yNH>NI^K7Rnsc9w1QT3BO3Tln(7P^c)sSxa1%zFft%4 zQOv1>rBok|-E>ptH!{9Z`L&<>jp*L?EY;Hgi0XdorSpq(%uA{Fdb=vkI;$2fGYhxR zMO1ztTsKBluz4!cShA=VvVbH*BfJzsvME6&XBiOVpeU--GaTBlD!NdNIi)PB;~Q90 zRdn6>J-_w;nMzNpXONe;P5$tjMX4=aRN~nB7szN}fDY{)Hl+UoX&=$3cN+2k0%^f8 z?0CbSloq$)`|!lfpzGecNBi&;NE(AxF$VGfsNzM7W8)TT13Yz}-nQd6PC2h#^2%e> z+3Yduie1}|tXeDTlNB-SW4my1>awI2=C3ZrZ|d~_8}#jxEsg%0d(mRaZp>7$H&bJv z?!Z&7bUjlYyQ`#1wc1M+B(q*;u0?3mqV>t?&~9ZUhvFRt_WI3k-)Qb+?)_H$TIJ+5 z$bAf+`Ly_*eoAZKg$h;Nd)UWmtJu_Rr|*c}gES3?w5UX&R+ z^O~~%kGCrOGwARVC*!|WVCsVsXVt$|-csuDPV?j6s-!<1Rm$n)Zxu`H|N7RM;kCkO zixTeun2VXA>no3Ipz)7TO`GoJ>|oli_sKh3%wv|7Y{<9%sDzl#D+kqZz6X{SXQ-->OjJ1oD9& zgwaobeW!iThbC({?eq_|dLNj=oB6clVf}udG6ukFy(C@x`>Dwj9ug(#z~4_zv+2Bd zTI$|U?Z;^Me<)q=hmLx16D!@;{{7U4JM|iGU8UboHT7s^CPr|3ff0bo?d7)uw->y1 zio3mhXID}R3lGyH`g8mdyU8q>-p~p@@YDfpFH>?ewwL+Ap zNsAP7)`e}^Y0DqbYo$53`wtI|35L7O9P6a;^w`9t1E;LLw(OaGK!ZpAxwQTn|KqM- zif67DILpjjSl}!(xSL|llnIN+;RSA=;Dupz`z#)^ev)WGx6VCJ>lbMJj$~8)4a=K( zR?zr0?>C{3lX!7rkL^7*QiVDu^MQxVd?4%m)=Rs@p4%@>zNh)|IxK;TRp413cvFSP z42iV)itg$=r`t2@g8>~{HXXpN55B&BU&L!GtG=qMd%utCsiGA7+xKc9F!P0V$&>1P zZe)Y3cUl1ddrTRAFtjRh(*EzEmf9IUexD3?f17&si0ZeLlc%rPauX8mdp03?)nX;S z&AI-Mbg(P=uQ72sDP1UeF!{{CM0Z`J;g>33yGmDHopi-yLRb-GMwAiA;(LEJtLwl5o$v^o`T(CWW+ zJUJY8orVqRXAj-BrRGg8O68?84g27&!T*X84joCGmg3gsUoZ!v=J`LB+#?^*W=Q(P z@U+C8=4|Eb}{JMB6@Bu#S+zm{?j_yMW#H6*`vU-$v5maOt%NnNU! z_+&-bi_6fy%^n62(Hc$BE-V((^IVp4Uzt1Y0Vf9xd1JeBiw_o?UiyndS`TwSlNFynIYUdI z!JZKYtDdUhaF``(rG3&<1>LL6U^;IY?7@{lD@`|?E|CH6yUtdIUGKJeDzH|3Uv2N1 z*R`03Fn-||>35ff{nzRDx8*b(D#MV7h(IXZe5@07sdG~kpPjJYW52s~d{^_0-aWr+ zs*&vK)s(79>c@EfKDGVjG3}Ni#-z_*o@PsHjlDnOk~V8cNoDDdz~u16xl89PpJg7c^31=euG{1Cqn|UcK7Mq$ zbKRO<`g~Sss-0y}F+Uh)kh=|z2Mw9y0kf257QD<3`#*&y<#-`Gd<*rBYTWK;Xo~rCJW^50*cu0O!p?X__?kf1SFnJ70#@qU{ z-~&?NqJ!6B!?w6S^~wM5Li@oOl6@QDD-WHsl z9_ZQ8eMCvg_y%F~QH8L71>hZLa;Hc&_0oMf@1&$~<8z26N{5^*+n~kYXIT6XbM8QR z_5{DYCfUONn=5WptDD#Gp90Hief64sn`xEE8|G=z>>YN@RX`UsY;Gs7fudBCj#V7_ z@_6P|+nixXnl&FjxZ}93y|$0U8wc7A8c@qtDs#Ivt@7=aT_^Ty4|ReOIP-|vq+A@o z2ydj$pF!KGzq@eo#(w;fg*00+%wg!19-2?b9K9*#8XBs%u35Kp=Q>Zvab9CaP1X9Z zoRqoE))2eIRUh4Ucx)Q#lmp#>wvE- zTZYh6hUaR_PH#5|)>wv=WD}g1c6#<{R^I8nD=6>nuO3HvCB1#zaDvK&ht%v_Y9^=k z^O}`%&ytscY(G)6yDVFS=jO#^EACz6hAZa;YJ_oBQ8TI6?P$@&jn@#mYrUG?{_gqt(GC4QQWK*)g+<>H7h}t_l?^0-tgB;DCW)KtOWk< zaKq-kclHXj)xKN%M&rxFY}+@l-1$ zfhT4`Q$x)U<`P{OYJ(|?^Jhj4HG5>;`&VQTk z?3@b!nG=ZDUE?o-u%nSaKUtZ!I@_04w_HXyym41!dHBsY#OihNx=8J4@4jOO6x@~M zn_c--ogTh0J|XQE?O>gdI(JcEf@hj_K;oRRh`_E=du#aU1f++XTjX2OpQuu}Miug} zktHG{uB0qC4a?Oo9v&{vYrQsYTDyAlCXcl)qD8)C1Xa*r6mZay?o~zg%5uQVE{tCe!Z#r{kgblp(2dd38pDA3XiUv33KhqibS0Y@%yI|S7 zuo4X33V3Y?Y2g9J{>W)Z{uTA6wVuw-9_&9LS8v|DcFiVq<*SAKxB_Kh`?DGMJovwj z2v!DrcVxj|dTmA>E*>bOfUlc9)_|||K!@S@6=8c$CRNtENtL(c)Pef4|9MKq19kTI zL&r9)J-c7rx9Q;5F_+A#b!@#GQYGeqSYNV85Cdb_UlL)%iFeoM?6~mDy%WP);(x)0 zO`S5$$Gq!^;ln%FZm(Mm?FIE#-i>)fJ>Tb94m^M?6q%g1RUc$pac2dI#sp)MYM z$BN@zMh}SYYA#vN`x*Ziq@m*7$J8Q1OpgYK;6oY!_u94&JwIta_~_jjG3Mx&ts7UE zUpjo`$TeF>wB*e;=a>D-kcK~8N>7MSJx7~b$EVFp2~L=)w+>1Oni~<^UTSC^5gZqk z76I`si%H%^9h49l85z_^YHA%B6dRHnu{6{=Eg~&0A@w?K$fQ3lC;=MdId=`|tl0SY zw6_;aM+BBC9g3vK@}`xldTB&@snYQ#(XypWi+%dBQl>3+{Zbe`htaFo$6{poFR{j7 zCq;*bO2egL);jh+yim$c@lJmHS<{jw*2&59(n9sp=d_u%1+oUxt!n9Wsaa^~JnZ#t zmiQxKj9za;htpwteGD8eZ6uuX|6>ZZ@%Pv1V)_3uO{53ktx|(6ZSqdUPBaXBH(Ccu zP2Q=A&3ErpN9bY$lOvV|S*PF;X+ny@DzAlgLdv|Uiw0~uGuTsibt?OJ3VzFrSN+w51G(vzmCX|t zl(1xZ!;p;s4H-`sq&ZcvE}cAi>C&K+UAqn%)KzPd zUmepCpXE=mSzbZ!zBv_JNRd~r%C8v8t0jM0MzZ~`jW#JPV_tI7q73V#q!{>^n76xF z7k@=I*_KXzLMz<3s7=;Kr-dcW&alS6M9d2dGjG-guXM1L{BffYNoV2@*p8w!>Mxa{ zw#{y8!;%7Gbz!puti!^haYt@`quUeMMNYPrCfCLNN;fT}6pl=b0<7`BIk8De=HK1K z8!2rmE6uO-<-D+L;lVZe19#J8OnvcoL%dF6x#_(RQm4E=v=fU;M^pxT6$JmwMa=Op zb90K0@<_5Y{y?w>9 zZAbuj@^t(?3jgP@K&6w}^GnKQ$baSG`sLz_LniCfs89B!$!as6OVn{}W&3CSNGsAR>n>76i zc9%s5os-ia3`?->PDsI9UQB=7BhZS9z@h4&;4N$#VZd+=vmWVPWEW(sAoM)`~YQ~CGP~mS;OqD0#UxNgiMFr*G zrAKKIAq|Hi-WfbqA$j+gc@IRsU^fUG5jqCQs?2EzUzU|%C*WBA+RrI&!*P{0w z`CjwGkd?vFmg_rRHFb?|mPev#4R`_P^Ou?Z8P~VIFm!G zbIPF%DLCxlp|h2Uh+^*|BI>H5-l5|xBBGD*EKV=x>b|>>(wd0 zrMnP^<0V3L9qBpV7D6zRMP9RX2o+l?VFL03=rk%m9eGexW}O8cV`E$StF?{Q82kL! zD`1BEfB8vxcT`2iRS=`9kEd@1OepJkv$CibKCiB<==4(|0CZwM4b3`naBtSBM7}gp zoVg=$^A3KzBsBJK%VsH1(Q*m<#J8g75WhK-)^VMnFe=s*y;+gTY_XV80C2zMt9=&~ zRR;rS@DWjAF{>0anPC%`j2Kb;>9_o0=E%{lIotU#`yu5q#pT>1S9!=r5n9y8e4ET9 zQ!#=5HW|s0vl226M8jY_2cs#5oWW;GY-mm#&h(_~h>J+J3uh$I^N0JWeB=3WFzLyW zU6P2XD5Y|vH4B$tUqb=3E18aBjNzqE&WiS5fR5!tKp_f}!U@(tV)5G9ictYo_rE(? zdAnpU@+R>qdSi?^d3T0~F*(%~Ym(Nj@H;(PL8K!*ajARzR$p-W{_2HW+j(PBj9E>o zj&uecDjWWp6tEBk!;q{t2!hZl8%BcgGYmiYFa8gY^UV`nQ6{q+>4xmY6Y+0cKJe2G zc$kPR58d!H2De|)D!&2CW);DJ%l~jxd15ilD~H}#>-Uhx<#pWU5lR(kQ_ZOGxSz46 zTFrXi3%ZL-wj9kbmfxCkeke!07=+mnW9*7kv)<&Gka0Ez?tx^`CDfjTc9OFPSIu7# zvMKn218TDok1$mz`nlzmWiG|F#%<%9O z=V(;hGvYdE(xq!SFp>wXMxSa%UJnu2#N;Q58tZ`cAUZvk7rIJJ#&k1R&ZHY-^vJ~V zCxX}!*v09|#?*90IW8G(71rx@c#)P~1V5o3Cb5Y%vHBQ|!tE;*TJ{v7HS~26{DlpV1?M4X`V0zKx9P4q1IIB=l{3YTs)X)_}{knkkYWX?O~ zaedz7gzE(-7dd=!v)SQ`C)hQnMJGMZ)g?Zjd;R1o4>NVS%@LXC#cxc|YNaHL)Uo~- z;vZbRaN)v(gbV%`{o@Du6LSyeVJkBN_pUlSpZNL-T`%^}scN)^S2OQPtxBAmRxdinvlD?oO$ z8oFHI?P*#oWk-ot8=?&SsE~QHdn>#r6#^5+gCFX$S*g#3RMj}H<}#Zy;g~g{oCsQc|tRdgivrSNSW-5}#{Ye0*^o zu-Cz(J^e&X{*_aygDf4%5Axa`~2iTkH12^4snT)epOQtm^wukooGS& z7%F>g$%yB*_?B-u5!t2p=|bfsbiyq-gCvBB^7bRHa?uo@Pz6J{^)(sE#uJX?Kg<#;)H1W(zDvq$Po9Eq0rZ1>+= zDR&$Cg4*pAQoEt7Z4!IuRMS-(M}C!z&011>TaLbWDodnm$G=D3k(16#rKlk0P*`Y0t3f;d|s5FfWm@pOZ zj#DJ+iBepP6hSO>q0i5;%&V+;s0;LCYVz_L8;*ZEo?9S^bZR!+O%^+US^{n(u95cS zjlWJH9XQete_V|Qw+59t@X5K6K+FrZakt5kP6)Z%Mvh_swk{%+^K*KkN;E%h23N+^ zo;_8=3rX;f#AxbKjn{N zBhvh+@bE@`R20(ej3X6dydvsF)6mER$uXzit{d*O{i*C>=?U0fa#SkFij|B zM}M-+XWW(L#j(6SJ}V(3aYyozj2$`BHMTt)b}1~*cjIn5?hv=vuHboot5{ND7vyYm&74lbX=Z<1_KeQpR>B&>*E%T4Xh?%%oPQ0BIT z#7u5S((cr)HtAeRTxfX6+}NmiWx~cp>F3F7x9-7MY5+XB47-X&=dQq7tY0MRo_{cG z94?vfG>w1s!`IbFMc?7W8k9o5;W~Li!8i41FP2rD@*n--qJT*_SN{njYoJ%PNQe?9 zv7eDXVzQLUg+Ai3?({!{9my$2#ubB)N@gCJ6dRQqZI6{@8*H(*^kl277#4~l_?0vE z*bI8+5}x_qX@hMU;IYhc{OMPZjbjSIFU1y<5t$+jPm4;4(#NS}Ge{7v$jfIUQ=*@r z@y2n`mItP!Qz80V;eL&%xDIaByA;4bS+e#K;h`6Jeur!6S_t<7o_La8eQ|{i=Y)Rl zRy=dai3|L~7;EGPU&!y$6jA=;uB1{KI$$lN|)s3jXN9yEY&N7zDBZpq_RH z_Jm{PcNh9I7|&3rcB5LOLk_HhmOf&GPN#~N)94-HUAROh(=lkJLgo}tA=e;{1sz-$ zlj{=N)Ul|dxU3R9YdQ*H4X9Qrf`x3Sb=FO&y-j7obWy4#Ogv})G5}Zwd;rWpp&#@o zqG#mYq0NJ02Ig0b3U0wS7z$d2YWC~Ush3GR1qoY3wvk@Re9~~s ztQ`T;;YaTT-cvx2N6!!h;rcux^1t}bUKYkD!=H}BD0p{MUHpN-O#c+MU7wM<$LwKC zP05JKkdly=RMu-^>C-s=QElaehn182^cgp05a;HDw#wCrAQZ_t9Q?`*d><$CrKCviP*FYTkg0|rp$klIs&+QySS`*4qVtUl8z8%W zVS@|gp?lfm$zAB&xVYT+5P$06fx;p=bm&t_Bt+sliFBBDAmC&O=NG(i+9+K69uI+D z91z#<>gEjk%lKLSJbfN<0?o&zY!h9EQwifRC5ENh%p&ZW*D>dF?y|z zUmEyj_}t}ML!2f}Ygc-t>Mfg0X?wQr-@SdGl&nX1!VjPnV_0rhkq8PZT)-P|0DrzE zKDF=g(TnnH)6a|?Hf8=KjR_rJd{+cfjYR%Ha?YN7MZxYbLY64kEnCf#{=`*`^q3ko za;2$F=x&4km0HoeJi7$#OZGy?j^GErpHy`EUg#(Uv&TY@1)8}|PmWl#_wJWh`5YQP ze0q?do>RwT;}p9Xv}J1|zbASBjx&nnQ%B!%1F49rJC>@uTa4mjrz| zb5>~1PCajp)26AA`a^?cc}e_qQ^mr&ica5uTbo0H z%_-?-VNJiDq?$wK%YS=-s0=-z&4yp21$X-9KiROuf=PJGkT$zT zi)pjl|70<4xAd3c!*cMs3`5FA`Iw8V_~jZfRW2}5@MRm$UAxgVuWIz@c|IdYoSV?V zgWC02_R>!SluLtxl*i7T$v$!nk)+m9FG`MbmTYvC%)*ipOM@0iV9Bf_xqQnU;zNyR zqgjU-tx3N*$uXJ+QaiS3j2kdRVT_D(jHX0=CA@zXrd@^JNTSTtJgxbn=4owF^|Kn6 zEBSxuH(FS-|BqEmNPVdRK`SFxh4VS#D>8!>&l_`ee`ZcLzbboQM6QDNz;D|{X1f2| zv6o@8)f6V9859IbX$HlCll6pNPHzD-Efk+4y+}{V%SjdJNqVC+xFa>=Pz!|Kl9zvV z?RA$r$Yt9uari9oFQ-@0mVSA;G}fW68VlogwKYycT`cV2F5O8*2-O@Uxc;VoJzlL} zkN>@X1wXJFO+4n`wymSELW0GDkjelL_<#&BtL+KT0aWx-WGEEn_?Rh5Z<4LsrlC-U zT1K!eh5`f7uR`Pk6M9hBd-aT=iC?PdLAfU6vDukoB&^hrZag zV)?4D&pF|3*X7P*2M;@sE#okV@N#w>b@sIAN6?N#Pmbcm7{ei4+o=LvD@64|dnAiS zpPYt=v|Q_pa%#$K*NO)HJLg~g4k(gYi+)RTniair4+ugp#c?;Q!xTm_MbJ)+VIw{O z3)TS{!d2WD=6C~U?rf@bSp=r)J8|YaW`I?|-@`>wf!mwB5!+BPft~VJt!JF*J(AtxY7MU&6XpOUD z<6DpgK)|mxJ=w0a%Azunhd4P}D{H~BVy!{1SIOO02>anWYt^S~)3_FI*b!}tjMJ%Q zQ4u;-a->x+6Ff*l3w~AlxJaW)W{WVY?Qt0ETpsO zADLr0cuKr1G4|wCtIV2{nqjc0Qf1^EMx^+)rlwh9GGwZp7;9v*Iz~pYECO=|t;Tti z`f67FVi=-l_AmO_>8@cMhAM759AwP~lO}~DPr*x_8W|U(lBrh3U}R>Ek-<6g4#BS~ z#-L7(mRVP&s_b!=R2hPdUSe}fn#qj!I1iDS!x1FtKX<`dhYWNkHR#@9G&=aqY2ygg zJ1iHIYBc5Hrc9`9?t!sQOf8GqU05Jo7DGmBM;0%lu$d_?Bi783watv!7Na$8RD8;8 z)as&;S9fhIBaYR?MQdr0LmB(sZt1QIH)=$Mjlvl8wtsG3!y@IcJ9(4LCZ6{PKV862 zA>I@NX%m)5XyS7kP9vc7p2TLbZb;=k_fD*V4sz)G@E#^|-+Jgx`jQS4$9aZw8)6Kq zC^>nL*82Z1L{;Gzu_ z-oq`dO_Eu;K_%Q(=b^T$`(SF7_CV9$DdE3E4Ue{{MMp7#7aetvaUZdZa0)-BEQ|}(hr9P%$WHZf9bP;;$eyp zM^7W|c;PMg`oevC^As14EcNkOx^#Bn%Dwe-`Mg8Lo##|pTETKzy!pG2lmFd3*5i$4IB)(1MbkLBtFk@j)#q_N$;~> ziYYT!h2UN$vMEz3^mq1uPmH9;yTF$MVYl1t+YwH8bn9+36wIsmF@6CHeEHTXk}sno zzof_>?c~*HRG42bW6I8+uHfBvk&l$W;vV9If`Wbd{2c~*w5%6LretVrio=)&ve=MV zdwcU^u{{-IR2rsh^^rI-46VBfD+D10x7M^l;kFWilJm8Q@baKO>PKZiV%V0XWDOMw4qFr$iQJ!=Q@_0{&n`xE=o53O@ z)8U5Lf<(lT3f$Hq+*ZPn2+_?y!amdTE*a@4UGhhWWL}a+1Jm#CgG`nrrzEAN$(yAp z!;(RjE72TOxZbxUQ6J1P%Ba5u%Uh+4At@#~mW##E_ut-`?kdz7g%~4*85t62ln8O1kvIDP01V;(uK)l5 diff --git a/fonts/ascribe-logo.eot b/fonts/ascribe-logo.eot index 609770bc0093849b766fea8d58a5d970d28e9176..039f93f5ee7157c3b1b51d3a5f0dfe90dad39a4c 100644 GIT binary patch delta 665 zcmZva!D|yi6vn^F?rgHVkcc#~l(H;Xwe`@Zr8b3D43dMkP(dMAyQIM^c6VbFA&8J3 ziijTCu!o`uUOeLwc%a7GAw_b-*FF^M7zPo$2mf{Tq!Xei#gGc}VtYg}h!pL4Yqc+KJJ zr=8y6XjeY^vI2+>VC*#N-rA6_UjZ^1*3C5-7&?DuhPq5W)(G02g*~xLy+%F19@V_` zQ{yG|D{3e3I!!p@GIg?#8+t+g#gh4l`jC4(X-2I!&%)2{V2#mWBCN zPwg5voxdNXqdkWNq$ru!R3#1H+tizVkhp?|V}^Dp~gn!2ZZuU)njX zmGRHxL86By5(L?*z;tFnE-e;jhf^4z>FkRuR5MRj zcmhu~HmKj#*d#vC*g^p{jcw|I#xBbE%<+Ypr{Xd42j?(_=NcQ-A7*$+lSwkx0ShH8 zX>3#9)!0QHC$iT}f^D@B#(sR+mK!SR1#wheU0grZ$L0S_SJZ#>)n`69!MZ{@t{ kV$YWHcSD(Ai(PyU8giuMe-iJ-QNQY|NF}nLeso*E0VdCf&j0`b diff --git a/fonts/ascribe-logo.svg b/fonts/ascribe-logo.svg index 28ab9458..2a9bb79b 100644 --- a/fonts/ascribe-logo.svg +++ b/fonts/ascribe-logo.svg @@ -3,7 +3,7 @@ Generated by IcoMoon - \ No newline at end of file diff --git a/fonts/ascribe-logo.ttf b/fonts/ascribe-logo.ttf index 79acfe895e713ec580619e42c55e85873beaf105..61cdce038efc5e33c752040e0e88b55930f8ae6f 100644 GIT binary patch delta 625 zcmZvY%WD%+7{$-cJTfzZq)5|>lwm*-RH$jGta7%>l@@-Xpr7l{ou5A>$UW1oIZ@0OtQp-{ft#h)grnVKC~J$^ zp>?gFR|?1>k9E~mBhM<<$z8<;-?^;Vq`#`z!6oeTw}fufDKh!bIdWaGMqX5`leZ=J zSzusHzQcL3$zV;fgBiRJYe|$OF+$XkAmU08SA$kNOk!_pvVtlCw9w`O2JAD1NmPbb d4Kr`VYeBu+^jo|&;HX_R;iEO|XqiP}mi5vG`hNFOnTx+!Q83!);{65Q#{K|$Pz8<%$FKX5C4Q%AZgI53>=bEf6#t;A|@el@TH*PJ} zi^r`MD)0H<^?I^jZhn0Vhzj|JFXKLIi9D^gAB^sO-1@yuJ_M{zN6GfI@#Q-(u}6P7 z6{b&@&M{ghuXcKa;c{Dy$kQ2(KzpmwylB0qkT$IJoD<0pyD%=0r^iVfPT)y~4HR%W!zS@ohVwjPHNzJ5 zZiXGq;uCik<`F7oI)8BvNAWVl2KAd6Hi>sqJm!NuPGTuDEE<~`cF@3{jJ>GaQVW6h zH6&tqh&Z+dg#`rA@S&S3in}^=>x(rsX+(^5X@$I99gC+jEn<%!R}Kedl}4<7cs3EIhisumAxbr;A+g zewOY!qi-%8@7$3w26Cw2Lw*b0*h>sGA4G+e3dhWS47*16c0OG`bu z;#}-SKD}`+e=hZI$=*95A@FVj-;8eErd@s%C?hRe}hn(JvzqbDTk|6K&jx{Ut>4r6} z8}o3}ZR?by-DFbs=F{KS*-lnPKn7W?si_)yMzKzAD>nEmii%D8%ZeSG#0zK;x=km~ zOrJC4s$z|NRk2QfD!Ic311I=J`VA%%tBM^=<3mtMq9lnCpn?Pul^`zrjb@OgK) delta 677 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 Y;Jy{zyTHuhNB - - -Generated by IcoMoon - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/fonts/ascribe.ttf b/fonts/ascribe.ttf deleted file mode 100644 index ad66907533b9f204cbfd7934e14932773a23e1a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14368 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 diff --git a/fonts/ascribe.woff b/fonts/ascribe.woff deleted file mode 100644 index 9e1a8cee027c33a212b31bc166c5e2c88e47f910..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14444 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 - - - - - - - - - - - - - - diff --git a/fonts/ascribe_wortmarke_logo_chunked.svg b/fonts/ascribe_wortmarke_logo_chunked.svg deleted file mode 100644 index 03dccf2c..00000000 --- a/fonts/ascribe_wortmarke_logo_chunked.svg +++ /dev/null @@ -1,110 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/img/ascribe_animated_large.gif b/img/ascribe_animated_large.gif deleted file mode 100644 index bb3c620d334cc005b24fe10b0136e158a49e284b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24891 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 z∨8hVH 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 diff --git a/img/ascribe_animated_small.gif b/img/ascribe_animated_small.gif deleted file mode 100644 index 7d249c1ea2e820af1430e626b688cab7bdf6c692..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2605 zcmZ?wbhEHb6l0KJ_`t~U|Nnmm1_s5SEUY37j0}qZx&2&2f}I@$T#fV$m>GdmIzY?- zQp~{Q-@_}(^}K&l%7#@ItL-+wo!dBFc#`k4ME~P+?nKO5FFt#v?&=vP_igquZ?fw? zy`jSSTY~b_u1>GNb=*txXRUEsVdcA4Y|Dp;JI`Nw+)3qSg<8vku%pTK<|&U`r@e2V zfw&7~HyAKSc&xhkB=O|QS-cHAr(}hlcN8vBYD=wJ^zZ+pY1 z>Gt2cqcOgkE<(}U6_-ma^_(2~I{4I6{ihe}RTJ}uEYHiuNoSJcc42W#$(l`CrLm@w3_U$+8iJLrS`7*oDj{0>e`XP+QNF<&xo92X>5AFD`JA# z4%XD;*Rnixeob*xzm$2&cYa8Y$gP;Ptr4j~RXJ&eK2dGl-~JrR-nQLhYW3M~S@R~q zB7qGlG$5`BxN|n}&bb@kzrdZtoRqQZ;xkZaARH17cZf8|Az7E#UVm=o`r&(qK;fZ; zO$ExIW*luW{=E6mGMCo@mbGT-jx)l4v=q5`8M!hD)Vi}a9oTEKe%IGcXXKLK{w(ki zhJ_0=!a0qQ$bqR3zCj=Pc)j7RhcXOcb^AC=DxT< z1Lj8)4mNDsH2KXuhnMGn#HhvFPP?`}CCSFE;N_;jGx{D)o$k(5a__^lU&-GcxS)}O z)ACsASzg4jKsU~>`fHo9Rbl1jFOt;?uyo0e@Ol$4F?ilO?Q{Fg&X2F}{rL757zp5u z!yH$!>caB`l$c0|$ArAzc7fcsTm1$S^J20V-?-SLc=6(nIS0C&G(HGQnXX*ALL}s_ z-j+S7d^;;I9a*pbadl*}yH=mk+h>)q#c_9zUnq zKQB4iBC*c&E@wFdiy?4vgjO!NVa<}^7+F$wr>Ck^sgil?1+IB3 zt-80~dUeU*j``_B&mT*29+3wIykX&4c7_j&T<0Hu8l2I(E$mQ2>!!=QeAN9S-zFZs z6#C)n&RA_&z%wG!Km#xh0Lvmem4XA}+X0JeWQ*yYz6WVGM=5OSQr;m)0*dYQDC!4U bwTD*rAg4)ai-duJnI6pnG>6c;abyhu@l9n% diff --git a/img/hq-favicons/android-chrome-144x144.png b/img/hq-favicons/android-chrome-144x144.png deleted file mode 100644 index a4777f6dbdec0270f43e54092cd9c9e24ae1ca3b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11526 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 diff --git a/img/hq-favicons/android-chrome-72x72.png b/img/hq-favicons/android-chrome-72x72.png deleted file mode 100644 index 410570d2492efa7670c8fdeb58f3328eac38db9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5478 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 ajia6a|KCB0D8vcv08jyID3rgk4F4a|ig_#m diff --git a/img/hq-favicons/android-chrome-96x96.png b/img/hq-favicons/android-chrome-96x96.png deleted file mode 100644 index 9a56e62e7fc9961aaa227d605ad5fa80ffb3f957..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7416 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 diff --git a/img/hq-favicons/apple-touch-icon-114x114.png b/img/hq-favicons/apple-touch-icon-114x114.png deleted file mode 100644 index 023f0f5909be3b3674366a6dc043d821ee0ce529..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9153 zcma)iWmFtZwC#`}!G{oZ2rdDFLy+K3aCf($gS!(vxNC5N>!5=(xVr~;cjxlGfA7az z@Ag{V)m`1Ex~u9`*WSBMn1Y-HItn2Q002Ojk`z^XOCA2(f$!dq3QVIGZwb7)kgN~@ zP#ul>WQg!~O=>KuBntp|Py+ydzW{)Tw=BOs0Kl0U05~uJ0C-XW06e>lW<}n&8;C~I z5~8pFXG7MwU4F|!a*~o2L;8n=frfx_k`%2E0Fc9^M1@q`7LPMsH9pM|zK#u#o{Xw3 z);Iy-#d@M}s*O48fvDdCIBv38dhv}>XYFjNMJubVju5P@@j-+LqAK}elID2x{IzVC zkDFWWJ})P&17I^a*SVuzOcLTh?($2gS$vmSw@@TQ{9r@;wGRK0K&=)y45BI+nHrKy zphy|U5n_nO=XrFDYMv?(k&&|jCs)rwhpk=cjQ`3Su=IUP=l|kCKg||6H6uX(`{Ml6 z&eUrYDrKS5vIQa9k%9vgOYY+7)j}TSQfHf=zCTPu3p^DLX?>Zo>+;{Hq{`5n@UsGk zfy+W^c}Vd8$VDdb;%NV-B-4zop?3sxnO{m;H$CC4p3ZA`;+o*6jgo{z#XS5>fbcvT zElW4(7qNdn?V;8PmFy$!FqVH!jDP6~&8-$~WH}x|&mCtjH=sW+AcNGQF7!^9yL>NT zPbM_l&zkm7>Wdks&ZWQ1AeNUkePHc*#cv!Ug%`~Z>iPrvv3{1}36V#034F zrj6PCg?=7}T?RXSEVyJlpN$+vtqdLa`|2<5B!d-wk30yU90N2#;=&9Nl(52#_ddf4 zpQ-wDo+Gi1kS=^}pUQ%mcN716B^WJoY)MTNwR~T!qKZp~-Q2`& zyo_0o{_4#DNWT{|V7T5z+6JKo?{LcBBa+(0Qws(L>p?-XC*MX2^_gFdHp*8RrPpxC zmtxRP^PUFok|cxbX73FfzG!9~)&W|x+rNBfKuqtzwrZG2n{U;K(28B}tuv*C*>X$4 z^1@bnqb-RYeEUwn{ypJWO2wPlr?+gEHSw8)K zFI@q;RAD-={>NXJ0}Ga?lf*+5;eEUK@;IvUjNg@~etB5ynH|r1|2*`nBQ;^%PS>rHrcvvM;Rei*b}yD&Y5Zq< zSHDZr4O3K{9MdhFRZmsGb;D_nm=h@zg+Y0x$e9oikzRwrw`ZxC3(9*xJi`z8tZ)vI z5)gOHKaZ%O(}zu?E~sPXZL{0eaay)16J5xbQkq|9;uTCLMcEM# zcU{n>x1-PasYCH>&tnYRQ8?*v4d{e&>yS=Cs~-oj>o~@6Kw+OqW1+%T=u$*@Bkv(d4WaadGvMD{ zYzT}uK%K}O$TKH&8Rx%>iQCSfrX1x156*z}iCNmFE4&qLc#9(Z=@s7w+EwAhXa5+n zJKTYsfzI%gHdJjnY)D+|`vFq?x`rDXWdSc0qoA!3N(GTSYR!eh05I?A`5zRpYeh_% z9R{X0*&>;0ocMi%5FmMKb)D_Zj<(c9zq5xI2Lg5PUXiV)lO$1 zIg_-ix<6c2e@AZ9$PcK>+X*b{WH$l&Hhk=aoWqb=sLYNxl-uzS3mb1bMXNj!K;=EFNZ8 zkIN})P_Lw?V6?K@Q7fBBp7NmUubG5Kqfl>Zw_RQLTYXyA32aYfgt)vmt^-Ry3m)Ld zEyS`4KNiy+tp%3MZ%Fu_raXFf5r==wM?fX?{Q5!W)}!Z?TF2t}r5aX^cIQi~#$ui_ zJ}84illKpetRA#yEw3C?anm%sSEQTjGE${e3-|JD85cXb;y0$ES7^tYfMy<^niBjI zM?c^!cE43>!Ho0#X_pu(ZY*rO=17^5X%$lz6&$%Jj?`D&#)L7^kTX^6WfjGR_maa# zU;O?{Z60}+jwJ7xl{H~*v?up~p^A?w=l>)7bNt=8Ll7{-tN|YTA&Fv>)8&Io>B8{rz#>{w!l z7naW69bHjQljrY{#NUqJf?cszVq6jkCt9IP&XuTHPV*&k6{q_O?4W*ditr5tEKH&3S9`U-Hk(8QgH8S?DL8!N@nM8lQ3vwo z)a5d+Ng>K&CqjBDQDe8~10{#3Zlc9pU zfB3|M8gO(I(Zz>4<)phyrxXH<#LtZtH5Gj1#CV&c`_~t<7Df_e1l>=oYiey*%J_s| z)1$@8-gj8VB;kp&bNqgUL?5^fbRx++A(hxq8GG=RLtHjrFw}`%Von9z0;asS?>j>> zY3MkIMzhV`_cKrl(ewf(l6ht@{t`7E>cGw#=<+~(iOsM!zryx4UW>{CBs^naaIuIzn#n03( zSFbn7^dS}Q)wZ!Y>v%$7$_-4cmUUSOY&&&i=%k5iS95!f=NLs8Tn_+G816~m)Vp&R zc0Snn4v$xsSxnk_*P(q+*OYx3R(a@JZ!I~9GcIZP~9M`Fv z#$&ZF3kBSQcmDmdwBTQ!XZ6&Rge2TY3;qFiqmzhBSo~PQ0DGlzFWI!jDS0&QH-QqI<@wRvx{!Oo_pIaOXrDWf=aeorZUewSwX_SIwDW?un4>9IA0?{E+(A zE>Hw*DTR_cbzv03-newdUF>%7Xq3{~lz2hdh!P<9{abzTl#HjxTH1Rm?F)yd(MlHH zx!J6oKl*l4_dgD;Ob!A*hjN(bSk%6Zrri_}xLcgwe2n;=$w1!+{tr{KvMy~W^*#Iz zn(Sn>fw}*rV606rO@O5>0ey&Du0Yj7*o2sXJ!p@BkIaRS@qE?Y}|b$e}M|`(g(p!=nVPC zs_j0PwtpcJ{%Tmk40mLs{cb`sRUSaL7wI_fl5^&<_H$W9Tq_#l&ETYzrb^LOA`hBFKcu` z1OAUA;kQP@(I4z`(+Bg~v=7E8FOa0RjaXLjjoKL=X=$K+-nVhB%^Uu2bh8^jSYdUi zPcLct;hj4FZr80B&D)-WHiqs{QOd!7^wF*{r{H7$&U$}%yRuzz&HSa#2~Qn5s8$yT z`{TzokLTW}#dK9{sn3E07!*^s6>ee5Xmf=6vaCvrhtpi+Q;X>{^)$0`Yut^#R-rrP zmWLpI`<0FZjty^~)ucuqD%q#rk(KWvE{LsGowKIz1A_xAJ1TsnOjpb!;{A7nAb7g8|9XJ6id!8sljKDJR=+v@`EOfdexcEyu zPr;3)DF+(S#D>#5Q^Ov9A6)KeTOyxX_Y@@r%#5mr^6)~QxT49ASLYC-sKQ3wZq|GK zZ)voWAMMZ5)$USGu}5)IcTjTWqPm)m9gSo;_LeO%a1vuEeiJG6i$q(X?MyDR)lGcu zj3&q04M+0RIm_=!m0>ylE>}#FY{rOR8T z3%w9MBOJ#dD(Qhr1x4ejcA%ZHMM^e*q$1Fw=^ulUwPU#6V) zpLqHK7m8{~HS2hJGR7~zCD)c)JYc~+55e+l!K>WA_G?~TZ`5kope-5`9pFrdWz_T9 zes?D_Pwj4t-VkDEN%>3j+-ws-C2sZye>jj`RidzC7uB4 zE(a(w~yY;9lw17!?h=j63{;zxCO84gc(C(8t4CzTnSVU@qh8 z2Fq4Os6<;$Dks0_;6V{kxCEb}_T-A^y151#UpupE$`@JfByZVj$`BF@sPrUg*o)t5 zSflA!SRYF!RWk9=pvxji{-F~31gJj-rw8?;9tFom!3(0HE+PblCdKf_DjVVS?Vf9k3We$>2*OokjjYmX_+bJin$oM8{exR)PO%nQInw4*v?VY8Vb=@S zi4=xj#CxA8DJMI?w^JDQ!&$>C`8hN)`SHTuW?_H0HR8tZ9d{GnNw{IZCbNaPE=vE1 zVHavblc(-vI4VBLR4Exz7EQEL>>}n5JX^tb^(MrNxL@D5%xhR|>?;i3+7`@8t#sCa zbl1AxzsPhyKUYK-5Hns4dk?0+{PU>md1HXHrbIvC8WA>9ec|L*P4(EAF^}Mq1@VBe z9rr?#JjCdfmo<)V?v12?;68=1!(>xO5u30sytMMTwSu85*-sb zFTivo_(tX37!z7meWEP#3_Fzh`uJ{bKL`TLKmIn;PqzQM60bML;iqdR=-WA(ec1^x z$YE+a(aKG^Ug{L7uu>N*o@eUYLf2W6gBp?R#tJ~5z>#G?|9P$P+ebm^@TLxvGIO!RPrL6IG(mhoW*wgtZ98&z65rL2*KG_168f5f zw?TdS5dwCn!8oW~&?~5oSTJbHpoII|ST`)#h-y|W+jh_X&a;d`4bbt2_A|HjbLVA2 zf`Ea$CT2Y*B?Ws%$oyPxlNeQ+y1H3h29c!>Z7D}IdA-i;%y7BnmPZ}XOe?Wow0-04 zx1s8m`GsB1^b`}TUIOnTKkM?&`O10vvsJ`3>jyZjJF+X>=(FKlA%>xJ(4*dtpxHGc*a1p zqZ9k`2_=r5%ljo6{R8eTa=UFqq%CW+tkOW;$I>qe@VBe+6b z%9`k^UoH2ryn(Nb6XKBqSVkKPuy-;e@+M$}=>1~?9V*&py?&Ys(9&!{5oF0?+L}Ku z8-;d&>tm%-l8K${AH>#@R)4R+bd9G^$Gw}?4YHV=WfK`Q8`G4R%r|PCUh4q+xd-P- z&0yJ396i=xT=FHLn)-HE=w!xap-yY8H$%8sN-60#a{Zd=eV#eot^|J2cn$h}TnpA> zjpa1{&{e+XNKmhZjQm5#=Dvqmxz}^YB-K4_`;FqOmP1F)`vqo2v&YXHBXUIbE)aq% z7t79g*#{a3O=B<$ha(nxY}VT1XmAI0&p}(rKP})9d!TxhdriY2pZVYfXx-jMO?Tvd zx*+i~DddRx>P`3@Y0f7}Pfopzei<*PWaPXV9zU4ct{@N#j!!d6;o&dFP=lRqr6Z&zD!1Ge_K3vrwaPhnS`No<5pXikv4%8f8OWBr>tNXyNd8 zt+Vlhw!3%V9LiN>1G2?ATSd9e2QH$|7F?ggG(bYR>Jn{uZ8FYdXp(CCy{N${F8F&5 z9$hmjvuJCAT_qKTA@;HPBAl7*6C5u@e-TZITt-RHu1_Wiba&H^`Yx{nEkTzev0f(S zYuYB12i8 z>rZ@0<;)P9*XFwudd%i2sY&aS!dO+%XL_N{aTm@=Z*fJ0ZcZ<@zRIs1n(aCapzNL@ z+uNS-(^ar?6fh529K%#0oj5N?rYOj0SUSKFwB%5p0qZ>@PS8iI`2Pe&Lwu!?)e-~H zo5p|L$!%lAF$(E*@!yco{3buFAak{Ev_Mx+=4Y?BA~zt{TqxVVZ+oGg`=Nod_%x5c zc@@H-+;XTgLu5Pra4F3y*4#z4Twv2JE^7A%vkuyjK@>kbIbi6#i}u?l$Mu6&rjQ*B z9XW&Ca=~}=i!JTex!ODl2r@oq$j-U&XdYYeK+R0+u+54T`GV7(t z5_f}i?$<5+jsf0NP_2Q`BKNSq5{36XnB2HNfE=E-C-ly z)`!1X&b84dK~RQ^EwRmxT(g`$(ae)Dunux$v!1aiOC#;{yx{uLH*eh1y!-_P^pQSa zidK&{wjmS`l7Lg&5YW~=)V$b~7$%Q+Ft8|7aZQfeNy^-iiuw|^weoJ!SSZ`);%iWY zess2tuvUgrH}sMDOS3%(yH&_d$VZc(T5xq=7Po0fVs_ zPKd_LmX#(%V;jF>q2XD|kYpl$HPkvV9bX5||LCIKN7A|pz z?@~Q|A(|-vwh`W7!It0S_p;h-o-Y!2KcEe|%I81twf0tBnYtEHOJeU0zWkkf8DII4 z32ok#k00D^=f(v48G=#Ud6gY-l%Jx|kJrB{IL!CF#LWNIKz}6Q<~!*7HJSSa@75D- zg?vUjID9{t>zB!B<1WIY=4tGUNdV(D>{Z_z>HDx-<8+~|EF6aYrXeX&DGy0)KlUk# zhD@aI3GbPoRqVK8%PI7psU!D&AvBDbM>#okxM>}LPOi{wh;xj#3HaW_!=RK!`J z!z0&s3RpK7?-bMz8IOMtAiIZwnHu+oRWL*$AAG_aLF(Y&x3i z8q<Dii0wfs67eB4kCeT%)~ALsgY#X>U8L_f0z*zUMm{wAlf(<>B z5;qU2xPsCJ9!Iv>D(w{&Yv35G@5r{O1{b8R46}Fq+t6YM*zPRUiI=jqbXhqmmaD`a zF+7qP=xfm#7!%b;`A+O}CdP;ztjpK(A)W)c=~Bt-O|A#oE%c2z)l1($c#D3pKOo#Z8Ql?}xN|BeeR%DNuT(Gb=)1;VzOZD{6+8FJ@4I8hls>2k^t9hQ^3N z4CbT^feg8>?hK4KYPkR4XGS5_x>V(F@@HCE7U)^|$-5xI)KLe;lk@g@D5{*~BWDNF zg@2WFweZ^P#<{koZt-rh*L6aTaT09x73a)*!IZTAw>~jGIWN;g?ztKn!{}AmW+m*D zzKaFnm2+26kJ7hFBW&mL!fiL!A)n$4LP7SgX%_H4Ecm$&v$duf`8wsP*dcErXitGR zeAy-~^ZU@RgYHZH^k96S0LG?=A1%oK`cSjtTzHF4cK??7c5u8}SE3H1d#&t|Mj4Pb zz`d(SXITMTZ({2wbg`8((29#l-2j-k2lT+!{qkE7H&@A;Qpr!Wi}(E*0Z+t2j~B+} zBUWh&o6}#iq!X#i%16EmU(Dr*106Embs~P+6`MFPC6ugX-SR2sZHbi337CSsSZL{N zJM-vEThV+Q<;K=iw_@OEFM^IFqb_h)HAT8zW2lt8Ge}<##WN)!3Dfw8q_^*R<(TLx zg$R`k49(>(psB$#I1<`p;*y`VQfVAw(z_)`q0}E7yL9ny39W@_&jFsF?|M)sZu6&T z57hF-^P3&s)W$y-xm|~a!rdwr)sppLOYdYDB#*SeV5)4PaUD4++D|^GQN>o?1g+d@ zHj%f5)o+|5uDX0|8ER8@^TvBRni8t`D9?aaY4#_t!^O|F^(L9e#z7x?<)_}#%ho5> ze0+OyE+0d?m6xgc3TnnbLaarR$I=W&W;RoAt;a4mjKbim9#UZZl71lR3kKuCpu@;R1C@4%^b#OwU?J(d0sJFK}}0t1RF z&s$~PyO8kfc9sI>LyO}jx&J~0u6d@cpXZY$(3l{H4(4eJ-fnN@g}TSQ(WqrF1Y1En z-N&vVq~U&~Q)7FAe(hc+FjQ7Df=#3^RJcGtXc;()HFn!V;}+_Qb0e6P3(!H#nH>tT zwBqV{NLH}VW)i`VdRrX*ec^V=AMmA=N+Q*xlgkT73>Fu(2%APe2w#6Al9A-iteRJD z>}aVGN9)l51W8Jt53Mk5Qnrhmi_y2}2lBh2l>inFfr(9^Z=xML?{`wdAhm4sDi%^u zbuGtLNFSM+^!|H2e{-jA^Jp8zyj7X^8Et)KroCjer0`+FZGgZIO1&?vs0$%Uftj-{ zQM<-n|3!0jOB^;koSnZd{r&I4JN`d$AWtMYmrvD1Jx4olh?L4nOvA~<(8-j?*unHI z0kAT&a4;})GO)0#u(0wlbMUaR(=)%FFz1ZTz5ZVYHeeGAGxz_u!FU{4Z+$I_`8B6Dv%He002;>rNopVsq4QR0~+$&OYrK0B(P?}^1=W>WhC;8 z0UYF;+(=4E9sqEs0swsd0e~k+mhS-o;KTv|9O(l9Uy}d;JiD|eMLtLYyrHb5*!zDM zlKTA$BnQD!T3#Gs9RUpm4(%)vcC#U~ItE5`Rov-o!a3Qsr(R^c zUd(y5i^hsc^|_#z+uqoScZ17b8oL=rO1^mtyv<4jY+(-XMqfC;J@Qhx>?UpvQDPV4 zPcEhatqB`#V14Fl1GbHDvpww!$a!0-0q(Rf&+dQvV+YA9RKZ7FY`^81PZyu0Slku2 z2Rw%CuHabJJfeveN~g@GJ{8%!^W=TP!w5R~?hZvDGM>Hs{kQ|^D@iE8AsS`Qgah+6 z+zZY;*cd30?OFQW6|Fg#?1NdBmR)ECOdTKUsiG9?Qg|yiK?L9SH;Hw_XE)^ur4wK5ZkK8i z(2GV;qnMPQGva+>6d8BA+w=?Oh1HmYxvVF12{j>#DVQFMdzF^q}26_kjBpw zzeGOj1qVvF{|W-4KMClsn(Y6ghz=;6n5?&H6}(lq{KBX7vM7{!%%BQL3?dK-wzU&^$?O zW$?E<`{R^HjuHR#OO5bbDJOB)G{dU^wEKWKWIamfd`vF8*2W3AsnknU}uSaT1EKB5ZNEK1EASD+d->JbCFaO zA_d8{M~j~J1uAM0Bc%}oB|TnzVyn!s8vffv#N+k5UspV1hvlNBNNQ!|wScW>7<+6` z*G14c{+x_+g`EHJ!uZ4RME!z%4Q%d5^a>1PrUm#hUmA??GE z`03+=!~EbI#i4I*G3sI{MH^U``MS1(Y-adoi4`OJVW-HcDVhh{^qf8F%Gus{IAY-? zg3JxZFamx~hA4ZBbIcTV^+9XAamt_*3ErDd>{DY)bQ8mb_Waa$ zsym8KjK{*~5ZtsUC%iI6VJ8ZW{!?MN?&VSbZ&OhhDF`^J1bV)cFlGvgGgb3=AXs#D8`#vO?q) z(yYG)4n=O#l>WuYSoM|Wi>d_Y*S_RI(Ph|6iD2j!*^9c9Uo|-D(0ANTkpMuZfRs2U z4)YjM&aHu3c5OWHX3Sw#V0P=MU#zyVz4Z??_`0Y2{KW&CbhcQ7B0EULE4q_jGMwBGB%46&(GgdaY&!ykG|rF@)sGw(_Mj~Az=R*{g? z=>USUwT@dcv&h~75~crE9zuDNAN@_Tq1Jn^sR5bo6GyU~23p z;ASX7zHrk;lNC)?>9b@AqppWw{E!4ZGxp^q_Q~&@ehXe3VJ<1U1g#y@w{z;aHk_{O zf|>T2n$lra%&%OMf$lc9BwUADhxbqtb0)b+za}PgYT)p0MBlM4WDOrHZZp0l-lC;E z28%lj(&&Y3wl6ldf(d^2yU;4{+V6j}n44d*zj?6ge+_)o8aUMFE>ppYMzq)cAtpc> z(H&nh8TvrH6DY-vv&a&isGIZbt5E&b$NV&PE^-i;KzK&9$<{y8R@MNATIgAU zB=`3*x{#IGeUz=8qt2&p{6Q}D#UcS|w!R!#qs=ZmlS)gLy`>|p{CM;A>*ji_E06_S*r}uioZU^A3m!{(_Dtw#NML--Rui6-x$x zjK7A-J020aIJMI@M)n5kpN6mnQ_eRGPo=wy$XD6oa;kzLTNWZyZLGvYFIRB8defPa za!HG6onrb7hBXie;N?&4=Pm|0jl%9!mUP{$q?Hu?XcaO{wQT!qW6mzxzp_d` z*>~`(pv{4s?_P0^z&=r#wb~Z=i^r-7HouGM%*v?>_O=VsQE8XHcQesN5kJ47Lv?rx zB~ebfMEwk$k3Dnouc6-MftBswb+Ub5g9B$s)UnoAWj5sgcQnPBBire`%_6o>$}iU` zY}Dc=w2nVkqT=DzP^K{D_OD)wV!c6B1D}`_Ho>hcm`=jCEPGLnmPAT4&!8idMWpD<)?(}RUptOGV<~( zM%-e^7C)vpI+|YuImq0y$@qxe&7Gfi{o?6(IFWPN!pC4qqy)@YesD0=`R1rRv(1JJ zVs^Pfc^z$O49px|pC~xQH5)6+P~}=b)+u2aE~E^WPQaAB9~O9^tgIn^t?6BB1>rf9 z&@V7QVkg7FgU#iZ{T4kfQE=ArY#5&hUP|oiZtLt6ZvqO&ucJ=*=jGWt0Lta#T~_Cmyf0&*r&aN?~nlt}}d#Qk@QRn9&tAB~8*PscN+Cjr1MR^TY z9!sS>4I4KJs0jN__=@R)dvuxUZ^7&yOum&R+iW=C=Atjt4J1aJmYjvjF>sGB<@6RWdRxWEf zK}KvJno7fP_7AUPHXcbCA9Xjq(9iqIMKVAf9SdOOta;yRavcJ3QmPozSBt_a*gptI zaGX!i!GW;1RZVJW!D|c)yIFsH#_-Tz2iT!x4Yyk71ahYa;RcQ9nQ+|q1CCS+4NL0- zsHxg{F&FY4Lo*Rd`&a6m2m-v!^+DbgZ19%MufJ7uv3GwsR@boKR@pBU2svPoJcV4R zwHqxE4q9ex>dT({#!o61 z^iHiAY9EDFA^cE*TL#A~oOR2XMpj6m8r!_7cLkcKoO}1{+#h=zE6~V^5*E31UyON5 zW$km=IzUqo?FtI3RCg}1v`MTj4UKE$JislzC(r74Kc`%`x^G{(8S^dMf?|{Qk|pSB z50c1Q^1c>()D4z(eUnX5IOY_+nLsvc5(js9#wZ7=2&!ca>sc|(+88d0G;_WDvj6c3 znK!VXycXbFP;;0F*D%kx0(qkx(p&b8JB0eV-y|Wr>hLnba~a zOHg6`%DxuNK;Vm!-yIw;H^j&Vim7T;gow`$^W~cpIjysU_JZJA02e z=1cwVT1DsygTPaav3IGok(ej(}PbAklJhQK2 z$8(dhl1_~2>pOq&2j88lUOV)LW>WXNPp6O}eH)HZtE5s{ADXOwAWPGnfQ(DGN$1WQ zM`yK^uCr=dyQ2mUU*e5>ZJ77M00rayU>9r+MV^)v;3&#_AWs z_d12nT2q?FZ1YH}o5*XmiwUwnxR03^xO63^5p`c)i1*IKUnxHQ7E!U%aIM|`t<}{h za|;Z->npm7{fk~OQa-}0u)%oS|W6q(}r`V45iL;OU01!>~IU(hKFV{lG(x*)`2UXS4 zUB_D2;6UF-)I@P!h!Vn2r~rh30CH%6n4kZr%F(mJ)GMO?e%D8Yr+OGqa?=;>&mVgH z%)OdIhw{jFymNGvJa##UVM`r4gxalNzk>et3PY4m(z$!Cf5<>z`8U%8t1uc1J`qDzeDM# zSh=s$GEX!lis>RMsp%9tgNLwXiPK6l&bGgGbC^smmIt~bHdjw$nbEFNP{;hfQxSbC zMtZ=k5xf=|E&J1A6ZR6iGLEMCO)tRRVWF3%Fky?ET#SMs zgPY6~ST?8CIk1kvmZkY?ni*-nir{2USnmQ>du(*lrf9W>z1XyW*>Z@dhg8-|M*?bn zP8@EJ+slZBG!BZ0zcxJ5-t-F8I%deF@u{qSYM7RPQS6V<2}gU)8Zc7yjGWBXrh~eo zs;r(Oe;VdzbveINyG?xBNx(D`Vbd|rV$Uz+SO8SuxhdBX-}j5g9pE%|8}ZMj()F}Q z#qeAPVFHOAjhGWo+|qv*V23US0DfT(GAt6{4HQ$03GG|by`a~l+?g+M- zf!YNZWIoJE zpcPly-n9a*lf^YywWknHT~k^v+S=k)Zt^pna0ggIt`%a7+v&IlVSwZf5 zKy;YEQ)HR!#`S_|m( zYEfb(S}Q#lL5HE-fL}x$$mpsw^^ZP}m*4uxZ=Ag5;O8D-3SDICmhpnuijP0^O`s@g}1(6P^s z4#00wU2MW%1AGVAq^M3w7U7bUcy@e7jfW^)18Gf>^=I7CnVj8&XU0+HEc{@1AfTcu zCSQ`~tTW{LcjwY3%29u-xlshC>7dc?^gU=hsGG_$U|aCE2&Gmly};9IHC-lZM(EY# z`|IXB01&wBqVQYPk=(0ns|dohz(m)oPLMI51aNk@K>^e?s(jDTb^Z8sJdOkoduuY% z2#t{~b{XcF6>4^T$EY08pJ+$*JvJMmQhhTzWICAqJB2fgg|?bBx@uspw>3^OT+_F{ zx?5cpJ^18m+p7Ghbj10Hu*i&ToeDcl1nBNxXq76?X-yJ!lIhp~LaR*F->CBU*?}gD zi=2J7QU_xpEv=+`%gCE*wh@(UM~_E;^c98&(WNEJB2O72pkv*|<8Di;znz;Y{E_F3 zX+q|t9ihkv%^u);X8M?^+A@JlR!}Nu?AWA#h!r#Rm)0BVNKj15Mee(D4Aas%K^C&e zQ(sgLZ8-!&C`zFr*8YN-A;Sjo*0}-x$%cf0AHEq;{kQx?PtGc=8Xng5Uo?3_&2hPJ zw1#mvdgbbJIgJpzuHCT%-0f=J{awx7IyyO-MQErv%W6_84+m6tIXYnsEFdesOFYy%@fRv3MsQ}ejT z(rhx55;!he$C`!*an6MM^--$ikI*5q!Itd_m%js(oWZ}dS(ztj#gaforc<4Y%;Ybe zE29T0gMv-#Y^peJg#B^&>{6->Z(_CIfvFP0;HwAPjC%rOK#5sCBS+{q$F4)F&-klC z2f6v&RED=q|1LdBe@#xZ0P7AyT`+HWiD#>nS(v}zqS5iN|fsC3^<2SIZ9%LyH z9!4y|LZg7QGyWD#^w~0CcwxV^9%N!z6-Zl6mp6V#kcGa?^fOSIaiB0gFvZdq4o{(| zenx_AmAG5qW4ya-o&OwZIn%PzwzR%14%0}Uej^-iPD^-SKNfn-;m!FbpgJxUBBDG5 zdZ;Tx9w00-m90E#Vi>hV+-fa$D!#FyYkRL`1)2ET4ka)&>F!!St}*^npyh7UplCBH zKWqr$7_cn|UyNT0J8i%=7g!QsA5!1N&g?HwGhx)xJN~6dN2Gwt2fT%E6nxMI&rN6NnYCR(|se zY&xz&`a|!LqI721{Hq?Bsu~FzgeC+=Ew=75fAijoL6d+B%pHQM1KgR0Y|}lv?k0X~ z%Xb>f`XhzLb9$g|kkxXsGk)WXT}VG)hS5~DIxQ9idlaidGEF8kZbh&=ju52Qt>Hc? zfnFAa8s|uC+?cr)bEBq-!zBYc(H9I>>X?1)qsEH;rPUn{76o#I6Zsy1I#OhY%;JGs zYPSMiu|(9|3sk=am2PgRCe~Eg&e&VZT_cN~Z5~Ie8E14X<2Ezwui>`Hed_#W5j}GB zjMgV$I%T5@hCW{Z&Yf42Q$syP9?4gJQt2iB6={O#6w6d#&AKUUA#As$*^f2M$6Z{HDcP82@IT=SQ=s8FVk&VYXLZj#oaqfW(iQn+M4c=>KFP2d%!~zAYXB zs|12yF&WnE-kS^8!F{2(*;7xU;hS1^C-|?c@i1DaPK*+pF1NS0`>GgXkgQe}DB|8bek;vhfsx`I7OHSxt0t>i7gh zER?mX2chp_H>9l74$-!;XY>L5e9O!A<<(x7WBOhrHh1O@8h?xGQ{m+s<|PSHng!l>@1biC_5gk@w9jWi^%{&UfW$r=&Gzic@& zPq~leaGWQW#m9`F31Slx^hM^K>HIVQt(17Mh5(-!Wvhgz*L zCaK8oYqgQ9x_Uxy3nHy;;e_+M(g6}(G=M=*Nu78WQjw5zxz&~&ME|* zBZ2g*Ho8_PKvBNAnXMqq=$4M`%UwU^#laOK#c!?#(Bd-|5t&*4^>+xZ>_zgo zjtnuRGu=|zF(+>Mix)$N-mkPnTntRyUVci~%TXyG8|9t?EP-(THigz=Gl)4EH4J@< z*;_NCM~{Fjn`D~N8Lzi4yhWh<&8+6G&OZ$A)z_w*bfLud2nSn6rR7wAjBS)j%XW}u zj7iVtL&^ihi}@wmSXY|lb^R~UmMaC!6!)jswo(#~MuVS6SwELis552cG06x0wkOv) zwJK`^slj;>m&fyI!(A=@v!Kat{G>$ z@e^l`B|*bAIg34YT@J$5DZ9p@6Ym94)`!&yRwgMc7>%i(nZQIi^&v!{4>>8w}rnrd00S=vLl9BNQ zsB#lgQ@@6#u>SnYzxt{8*X$W(yv9kUCg?oZPpcQkIHpsLuc{UO`Dp`TLC}|Bg4ogd zM*ZE#;yE^*fom*7$+jrE{OLYjVkI`)Sy9t>D0({!q7-eZgjg9wnZxb zYvQR$coH2O{QSi4=wV^JsCixAw^*NW*i@{$(oiz2@+%Z5XCGM8#6b7P*XMoR^H}wG z$*ODamrR~F5xyBN-$RdT5ZG$yLB;Fdvo zY+O#gq4aJ+(uTm+)MgoS$yOFxzO~Q-uq+~S8cg^bosj%rIBH?4XrcQYBxESp8=%ft zw+Qa*zG;RpYaYo~DPLeXn&uGDuy*IcFTSvY=$%+9Xj6nDg#)@T z?69wB38Xj5?pNJ%7dUGIHYOc~ZO#CSQ$ynLrW%8w)EZBMTQJ zD~Adz+gBFOudE#OERYwLtnvBx|Eq$vt+BbO+yA@5M2xK{qyj)%TtTc{L?85j0QE-& Ao&W#< diff --git a/img/hq-favicons/apple-touch-icon-144x144.png b/img/hq-favicons/apple-touch-icon-144x144.png deleted file mode 100644 index 67f32eb8df340fdb53466ce15d22acd8e79f8daf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12148 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 diff --git a/img/hq-favicons/apple-touch-icon-152x152.png b/img/hq-favicons/apple-touch-icon-152x152.png deleted file mode 100644 index b743be73987e8a6dc3738ce3f2e437cbd5981149..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12813 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 OB`c*QS@Xpx=>Gt}AFeI{ diff --git a/img/hq-favicons/apple-touch-icon-57x57.png b/img/hq-favicons/apple-touch-icon-57x57.png deleted file mode 100644 index 0be0361a2a12deebed450f2f41a3bc80a8930a4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4532 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 RA`K4!D9WnIRKGV5{tsFw^SS^4 diff --git a/img/hq-favicons/apple-touch-icon-76x76.png b/img/hq-favicons/apple-touch-icon-76x76.png deleted file mode 100644 index 4e578567695b6d284b28372b99d3dde90d00850c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5996 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 diff --git a/img/hq-favicons/apple-touch-icon-precomposed.png b/img/hq-favicons/apple-touch-icon-precomposed.png deleted file mode 100644 index e19914f7472d6f93a100643a6e11a775f695b153..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14649 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 diff --git a/img/hq-favicons/apple-touch-icon.png b/img/hq-favicons/apple-touch-icon.png deleted file mode 100644 index b743be73987e8a6dc3738ce3f2e437cbd5981149..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12813 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 OB`c*QS@Xpx=>Gt}AFeI{ diff --git a/img/hq-favicons/browserconfig.xml b/img/hq-favicons/browserconfig.xml deleted file mode 100644 index e20a379b..00000000 --- a/img/hq-favicons/browserconfig.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - #00aba9 - - - diff --git a/img/hq-favicons/favicon-16x16.png b/img/hq-favicons/favicon-16x16.png deleted file mode 100644 index 8d5ac098eae85fdd504e7e444c0bc8997d40dfd6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1509 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 diff --git a/img/hq-favicons/favicon.ico b/img/hq-favicons/favicon.ico deleted file mode 100644 index 0ef49205db60e47d9394eef0d3b7e8ce89287ed4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 zcmd6u32;rbwN%z? z7eU2US6q)R&sBHTXjWqm4qX*;0EzL|-5tauXw2;I|7LpZ>3Nf60IQs;U%FrS*I$3# z@9VGoy_tAkmY41I=;4v(dGmJiyhA;$7>F3f~}&>5}-+44B-W^|B07k-2*Ky9yr z|3Va6;XRPv99Raj<9M|v?F0|PmoNmz!)7RlGeCW6Ty-!Q#=!sJ&yWq$`4ZH^?r;I9 z&)JrJ=Ws3iE`?n|y4S)UARUi^`pAQ+@EugZ$#ENplUJWhLGn+*CJ4prrC0jZkM!RN z(zhgDKasrVtps+4f5Lj`8?PTsUgO&cM}g*0bKVvD!ZYwSOn?C(pLiZRtGzztXMyJM zGq@9U?=A<8qXqr|>U%!O)&;SavA7ef*G+pPx6t#VpTKS8@to$OSe(g2>rtTiGp)cYu5%CzF1HWYM8@d^I#c zE13S;OXVjkV0e(;j+D_>V}2GiHoHGvYYwzld` z3v7K_Ur)na7zukpPv`@(^+dQAJ_fs;=Hj>2Y1Wo&1G0)sT2r=;Dz2wP+I>!X=tJ>f zG&}@apGJp#<1Du?_nLW9`dr0!zTi$w%iHopwt30I0EKaSb8Z4dI* zR$Ym)*-eqr9&5&+dvbu0A%C+~r`VRbKkYnj(`S9PYI>p^HVPrM&!sw67 zhAIC#E-N28*3^@i4;cOH$@}`P`dO4Iwo67abF5W&7T3C`ru~oP6;CD@8Kqpy57bt2 zk}ov%+YJ=gjSl&P z)*Gk1^dIU+LnWAYiZPQ-3-X77&bX%jJX7bU$czN}zme5F*Idtm5On4&sFW_h1uyx9x)z3?yIeG;?0L_str~NSD+vE=h z$r+iIRkZ~vd$!%b^2m<`_2KF_dfZfg{{Zwiy2vYb(qE!)-Ipn*zP%LL-f%Ij0^2X` zz7=oeTW3JRr^zdB6@%u@$gg1Ri8Dfb{hNB)%Z@4VJ6Hx<7x#eH^s&&>$SUPp=OW2| z1Ez1S+hMlcw&vGtEKFHDMi+hT3$ju7!}P5))pR4%(Udk_p?77?#G|no5?-T_?e7$dqEYL zar{7DdyCf6255o^xP3}~D`*`a5;U%kl+pG?u>Hr_(N?N^{wBC zhx(yEk77Q0A36%=K;k{ceq8)aAD(lvIWzChoDGHX@M}083Sk`V54qKKlQUj3KafC=c+zYZdC|0z! zp0#(?!Cip=x4&<1ugz+|s%B~y{fz>xeZ{=CZ0u;A_5tlnBP#1Bwz;2d&loCW=dyY9 zvuOv}?T$}-iuR?%Sz~+bwcDbz7c7Bq!R^<+)?TEz`#!t{Z-CCfHJ~-oo}Vdh-vfzr zqHV{vrfvwNZzd&8$IW1G$tJhEJ zM0?rxeLx>uDbqX-tK>N(Q{9s1z9<$9hlfD>ziqq8KT7%T+oGR#$AZqMMwdwy(~F3C z{(F#Z(QUUum!2(kZqOcK`Y@?{c5zjGLDD-JyM0ieHa+3R0DW3tS21^KpR;&Als(#O zkAR~==a>-dA@SXl+o#^QAaf>Y?Hk)os&zlrZPV6uT$g;r=rHM>*b(@y8QDQ_8N3Wy zpL(X#z0y9h0iJ?$A@G@9=L+i10qxhOKa;*jS<-uvboL{c3$nqqHE9K91Kf6e58RpZ zIiQ%CE~XeA@`qJ$8vd7ZKPcC;)P?fvAk*go z$=?D=&!@77vc2GSFk?0;^HTVfsy%>R#Lp zDRF=@om=I5c3b)LEZbH$PrcUOt4=%VxI9319OWMe$Vy)KZyi)aJ!swAwwSzP^A)S= zrzPzjd{-zto(pL62=DxNc5N}&$ZHLL;IxZyeYlZP%Dbm*%Cz4aJ4`A+eF7$c{6K4I zAk2X0A!skr9E`K|D^Jxtm{#74^W*q8Rh z-k|lq6l|N6*F6|%H)O5qobgD2Y_Tn8=aD@H+}QOrWl8VGxSj=Cf3_X+*OZuO>sKC` zAyDVEm7WU&WG@SlV+~9Sd~QSbB>2&3lVTV3Gr_gLl)Wt_mbf-mH2UvtZ+H5T{rA&8 zc^$|6!CeET$OiU9c_FxdQBGOX_i|j11FdU&{j%uieA$Qd7aCG=I3k5=NdUX zt={1Oma-@HBj8ZTs|c{YqTYWdy^ebK{%YI@+d3;_&omEH?v8V@Ef%g{OXM+>c>9@;~y9`|4lP>M`XS2TtK8M*l zOun+le@{A-c8bNeJ<99(aH5elDP`JA6$5N}wdWVR?SJC$Z60&l8(rT}{vaI2`-h}? zvo&+pl`js4n?ZJ(_I7$Z&v40Sx4Hs7(*^bYII?N`v-?&a9s5C9nto-&=kPe34`CP% z!(c4ThChPNsjj~p`(L3h@x7?&pRx(yj#n}6H%6wTDQymd*TM7|lxiQ-`u-H;Uy4CN zG1YEcg-p_!Q#Mi79i9SPR{3}E*_5$%WE`~BbB*>j_iXL<(UEJ7^&gOKZ_vGT{a*L) z%8uBYPKNe+mbwTO+tc|&d-i`p+Z!S2dC2rhc|HWK@wJpEelKU_Gfk`OCS{>V``h*K zF1Yg)WWVNHarb^W5(3|)Q7%7~Pq{k2qby^;Z)G(Vxjr?kG z=UvyUV6ffSFC~v%J>X)HZw1-jK>0Dh6nl*w#K11tH5FcfbnC}Ir*RQeHNxT=!gO1?>-tL3)l>>}v(L zjeD*0)O`^6ytzGgt1aIzD8Br)19rG}wRf#EhGPC~-Vb-!A2S^f`t>}Zc+j3b9j({8 zRcyQj`ekZQrt-vT&3``J0&78MwT}3OJs#P-30A_X5cm!xQ`<6;=lhCI#F9PfTYHYy z<^Av~{2S!+I)7?ye+b%x-vXVlwa#aN)^*zN&N8uON61#z`Ohcau&F-`g%KcMI}rAP zUXb?Oup?~ne=HQ`2TIXW{dmapf2^dm+4I6mBObpfA}#g!brETCD3Yy|pEPAD&7u`) zE3He5Jg+5}pFR0$BoqnrKU1O796t?vSdQDF0B0tS-$oJDwB%dd& z$Tgwna6Apg(w1179ZMHw#nSv(+8jnba?PPKzg=@E>g&Oti1cD#gZgRBiWXl(8ub?W zc0`L~b}_!}W^7};zP*e;q;Y6;8kgp&I2ud+aYv&q{ygvlEPq}aqQ$wYZ}@4xigaDd Q53^$BW`4u|wG>kRe{Ig~^#A|> diff --git a/img/hq-favicons/manifest.json b/img/hq-favicons/manifest.json deleted file mode 100644 index 503e5f7b..00000000 --- a/img/hq-favicons/manifest.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "name": "Ascribe", - "icons": [ - { - "src": "images\/hq-favicons\/android-chrome-36x36.png", - "sizes": "36x36", - "type": "image\/png", - "density": "0.75" - }, - { - "src": "images\/hq-favicons\/android-chrome-48x48.png", - "sizes": "48x48", - "type": "image\/png", - "density": "1.0" - }, - { - "src": "images\/hq-favicons\/android-chrome-72x72.png", - "sizes": "72x72", - "type": "image\/png", - "density": "1.5" - }, - { - "src": "images\/hq-favicons\/android-chrome-96x96.png", - "sizes": "96x96", - "type": "image\/png", - "density": "2.0" - }, - { - "src": "images\/hq-favicons\/android-chrome-144x144.png", - "sizes": "144x144", - "type": "image\/png", - "density": "3.0" - } - ] -} diff --git a/img/hq-favicons/mstile-144x144.png b/img/hq-favicons/mstile-144x144.png deleted file mode 100644 index 0a70e96b675157374a2ecc10918621c605a38bbc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5228 zcmV-y6qD004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 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 $Ww(%^FQ)jEEmI$RmW+=cEF5y(h_z2}q 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 F{|}(hBkKSF diff --git a/img/hq-favicons/mstile-310x150.png b/img/hq-favicons/mstile-310x150.png deleted file mode 100644 index 9ac302ef8ed473c06136dd90b75ba4aa1f5c6b32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5255 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
n2f4QRZQ#GNL=uJMerSl^5;0(L4sK?I6}R$ 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 diff --git a/img/hq-favicons/mstile-70x70.png b/img/hq-favicons/mstile-70x70.png deleted file mode 100644 index 1ebd9d1d45a2570d575f5dde235a06c2f7a67557..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3328 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 0) { this.actions.updateContractAgreementList(contractAgreementList.results); resolve(contractAgreementList.results); - } - else{ + } else { resolve(null); } }) @@ -35,13 +34,13 @@ class ContractAgreementListActions { ); } - fetchAvailableContractAgreementList(issuer, createContractAgreement) { + fetchAvailableContractAgreementList(issuer, createPublicContractAgreement) { return Q.Promise((resolve, reject) => { OwnershipFetcher.fetchContractAgreementList(issuer, true, null) .then((acceptedContractAgreementList) => { // if there is at least an accepted contract agreement, we're going to // use it - if(acceptedContractAgreementList.count > 0) { + if (acceptedContractAgreementList.count > 0) { this.actions.updateContractAgreementList(acceptedContractAgreementList.results); } else { // otherwise, we're looking for contract agreements that are still pending @@ -50,15 +49,13 @@ class ContractAgreementListActions { // overcomplicate the method OwnershipFetcher.fetchContractAgreementList(issuer, null, true) .then((pendingContractAgreementList) => { - if(pendingContractAgreementList.count > 0) { + if (pendingContractAgreementList.count > 0) { this.actions.updateContractAgreementList(pendingContractAgreementList.results); - } else { + } else if (createPublicContractAgreement) { // if there was neither a pending nor an active contractAgreement - // found and createContractAgreement is set to true, we create a - // new contract agreement - if(createContractAgreement) { - this.actions.createContractAgreementFromPublicContract(issuer); - } + // found and createPublicContractAgreement is set to true, we create a + // new public contract agreement + this.actions.createContractAgreementFromPublicContract(issuer); } }) .catch((err) => { @@ -81,8 +78,7 @@ class ContractAgreementListActions { // create an agreement with the public contract if there is one if (publicContract && publicContract.length > 0) { return this.actions.createContractAgreement(null, publicContract[0]); - } - else { + } else { /* contractAgreementList in the store is already set to null; */ @@ -91,21 +87,17 @@ class ContractAgreementListActions { if (publicContracAgreement) { this.actions.updateContractAgreementList([publicContracAgreement]); } - }).catch((err) => { - console.logGlobal(err); - }); + }).catch(console.logGlobal); } createContractAgreement(issuer, contract){ return Q.Promise((resolve, reject) => { - OwnershipFetcher.createContractAgreement(issuer, contract).then( - (contractAgreement) => { - resolve(contractAgreement); - } - ).catch((err) => { - console.logGlobal(err); - reject(err); - }); + OwnershipFetcher + .createContractAgreement(issuer, contract).then(resolve) + .catch((err) => { + console.logGlobal(err); + reject(err); + }); }); } } diff --git a/js/actions/edition_actions.js b/js/actions/edition_actions.js index 4bdf093a..3f659524 100644 --- a/js/actions/edition_actions.js +++ b/js/actions/edition_actions.js @@ -7,7 +7,8 @@ import EditionFetcher from '../fetchers/edition_fetcher'; class EditionActions { constructor() { this.generateActions( - 'updateEdition' + 'updateEdition', + 'editionFailed' ); } @@ -18,6 +19,7 @@ class EditionActions { }) .catch((err) => { console.logGlobal(err); + this.actions.editionFailed(err.json); }); } } diff --git a/js/actions/global_notification_actions.js b/js/actions/global_notification_actions.js index 2bb8d6e6..73aa9815 100644 --- a/js/actions/global_notification_actions.js +++ b/js/actions/global_notification_actions.js @@ -2,13 +2,15 @@ import { alt } from '../alt'; - class GlobalNotificationActions { constructor() { this.generateActions( 'appendGlobalNotification', + 'showNextGlobalNotification', 'shiftGlobalNotification', - 'emulateEmptyStore' + 'cooldownGlobalNotifications', + 'pauseGlobalNotifications', + 'resumeGlobalNotifications' ); } } diff --git a/js/actions/piece_actions.js b/js/actions/piece_actions.js index 7aed13fc..9002e8c5 100644 --- a/js/actions/piece_actions.js +++ b/js/actions/piece_actions.js @@ -8,7 +8,8 @@ class PieceActions { constructor() { this.generateActions( 'updatePiece', - 'updateProperty' + 'updateProperty', + 'pieceFailed' ); } @@ -19,6 +20,7 @@ class PieceActions { }) .catch((err) => { console.logGlobal(err); + this.actions.pieceFailed(err.json); }); } } diff --git a/js/components/ascribe_accordion_list/accordion_list_item_edition_widget.js b/js/components/ascribe_accordion_list/accordion_list_item_edition_widget.js index 5d3e033f..8033f239 100644 --- a/js/components/ascribe_accordion_list/accordion_list_item_edition_widget.js +++ b/js/components/ascribe_accordion_list/accordion_list_item_edition_widget.js @@ -78,7 +78,6 @@ let AccordionListItemEditionWidget = React.createClass({ return ( ); } else { @@ -137,4 +136,4 @@ let AccordionListItemEditionWidget = React.createClass({ } }); -export default AccordionListItemEditionWidget; \ No newline at end of file +export default AccordionListItemEditionWidget; diff --git a/js/components/ascribe_accordion_list/accordion_list_item_piece.js b/js/components/ascribe_accordion_list/accordion_list_item_piece.js index 4547ce3b..006479c5 100644 --- a/js/components/ascribe_accordion_list/accordion_list_item_piece.js +++ b/js/components/ascribe_accordion_list/accordion_list_item_piece.js @@ -4,6 +4,7 @@ import React from 'react'; import { Link } from 'react-router'; import AccordionListItem from './accordion_list_item'; +import AccordionListItemThumbnailPlacholder from './accordion_list_item_thumbnail_placeholder'; import { getLangText } from '../../utils/lang_utils'; @@ -19,7 +20,14 @@ let AccordionListItemPiece = React.createClass({ ]), subsubheading: React.PropTypes.object, buttons: React.PropTypes.object, - badge: React.PropTypes.object + badge: React.PropTypes.object, + thumbnailPlaceholder: React.PropTypes.func + }, + + getDefaultProps() { + return { + thumbnailPlaceholder: AccordionListItemThumbnailPlacholder + }; }, getLinkData() { @@ -34,19 +42,23 @@ let AccordionListItemPiece = React.createClass({ }, render() { - const { className, piece, artistName, buttons, badge, children, subsubheading } = this.props; + const { + artistName, + badge, + buttons, + children, + className, + piece, + subsubheading, + thumbnailPlaceholder: ThumbnailPlaceholder } = this.props; const { url, url_safe } = piece.thumbnail; let thumbnail; // Since we're going to refactor the thumbnail generation anyway at one point, // for not use the annoying ascribe_spiral.png, we're matching the url against // this name and replace it with a CSS version of the new logo. - if(url.match(/https:\/\/.*\/media\/thumbnails\/ascribe_spiral.png/)) { - thumbnail = ( - - A - - ); + if (url.match(/https:\/\/.*\/media\/thumbnails\/ascribe_spiral.png/)) { + thumbnail = (); } else { thumbnail = (
diff --git a/js/components/ascribe_accordion_list/accordion_list_item_thumbnail_placeholder.js b/js/components/ascribe_accordion_list/accordion_list_item_thumbnail_placeholder.js new file mode 100644 index 00000000..37c98371 --- /dev/null +++ b/js/components/ascribe_accordion_list/accordion_list_item_thumbnail_placeholder.js @@ -0,0 +1,15 @@ +'use strict' + +import React from 'react'; + +let AccordionListItemThumbnailPlaceholder = React.createClass({ + render() { + return ( + + A + + ); + } +}); + +export default AccordionListItemThumbnailPlaceholder; diff --git a/js/components/ascribe_accordion_list/accordion_list_item_wallet.js b/js/components/ascribe_accordion_list/accordion_list_item_wallet.js index da45d1e8..a8cab166 100644 --- a/js/components/ascribe_accordion_list/accordion_list_item_wallet.js +++ b/js/components/ascribe_accordion_list/accordion_list_item_wallet.js @@ -31,6 +31,7 @@ let AccordionListItemWallet = React.createClass({ propTypes: { className: React.PropTypes.string, content: React.PropTypes.object, + thumbnailPlaceholder: React.PropTypes.func, children: React.PropTypes.oneOfType([ React.PropTypes.arrayOf(React.PropTypes.element), React.PropTypes.element @@ -123,32 +124,36 @@ let AccordionListItemWallet = React.createClass({ }, render() { + const { children, className, content, thumbnailPlaceholder } = this.props; return ( - {Moment(this.props.content.date_created, 'YYYY-MM-DD').year()} + {Moment(content.date_created, 'YYYY-MM-DD').year()} {this.getLicences()} -
} +
+ } buttons={
-
} - badge={this.getGlyphicon()}> +
+ } + badge={this.getGlyphicon()} + thumbnailPlaceholder={thumbnailPlaceholder}> {this.getCreateEditionsDialog()} {/* this.props.children is AccordionListItemTableEditions */} - {this.props.children} + {children} ); } diff --git a/js/components/ascribe_buttons/acls/acl_button.js b/js/components/ascribe_buttons/acls/acl_button.js index 6a3df7b2..97f2e173 100644 --- a/js/components/ascribe_buttons/acls/acl_button.js +++ b/js/components/ascribe_buttons/acls/acl_button.js @@ -26,7 +26,7 @@ export default function ({ action, displayName, title, tooltip }) { availableAcls: React.PropTypes.object.isRequired, buttonAcceptName: React.PropTypes.string, buttonAcceptClassName: React.PropTypes.string, - currentUser: React.PropTypes.object.isRequired, + currentUser: React.PropTypes.object, email: React.PropTypes.string, pieceOrEditions: React.PropTypes.oneOfType([ React.PropTypes.object, diff --git a/js/components/ascribe_buttons/form_submit_button.js b/js/components/ascribe_buttons/form_submit_button.js new file mode 100644 index 00000000..087061d9 --- /dev/null +++ b/js/components/ascribe_buttons/form_submit_button.js @@ -0,0 +1,58 @@ +'use strict'; + +import React from 'react/addons'; + +const { string, object } = React.PropTypes; + +/** + * Originally, this button was introduced for `RegisterPieceForm`. + * The underlying problem that lead to the implementation was that multiple `InputFineuploader`s + * where displayed in one form. + * For the form's submit button always to represent an applicable state we had to save + * the ready states of the multiple uploaders in `RegisterPieceForm`. + * However, on each invocation of `this.setState`, we were re-rendering the form again, + * which caused (if the user had the file-selector open) a detachment between user input and + * displayed page. + * + * This button helps to outsource the state of the form's readiness to another component, + * to solve the problem. + */ +const FormSubmitButton = React.createClass({ + propTypes: { + defaultReadyStates: object.isRequired, + label: string.isRequired + }, + + getInitialState() { + return { + readyStates: this.props.defaultReadyStates + }; + }, + + setReadyStateForKey(key, state) { + const readyStates = React.addons.update(this.state.readyStates, { [key]: { $set: state } }); + this.setState({ readyStates }); + }, + + render() { + const { label } = this.props; + const { readyStates } = this.state; + + // Reduce all readyStates to a single boolean + const ready = Object.keys(readyStates) + .reduce((defaultState, stateKey) => { + return defaultState && readyStates[stateKey]; + }, true); + + return ( + + ); + } +}); + +export default FormSubmitButton; \ No newline at end of file diff --git a/js/components/ascribe_collapsible/collapsible_paragraph.js b/js/components/ascribe_collapsible/collapsible_paragraph.js index e146b42b..7ad8d0af 100644 --- a/js/components/ascribe_collapsible/collapsible_paragraph.js +++ b/js/components/ascribe_collapsible/collapsible_paragraph.js @@ -12,7 +12,9 @@ const CollapsibleParagraph = React.createClass({ React.PropTypes.object, React.PropTypes.array ]), - iconName: React.PropTypes.string + iconName: React.PropTypes.string, + show: React.PropTypes.bool, + defaultExpanded: React.PropTypes.bool }, getDefaultProps() { diff --git a/js/components/ascribe_detail/detail_property.js b/js/components/ascribe_detail/detail_property.js index 9ea37285..8b0f50b5 100644 --- a/js/components/ascribe_detail/detail_property.js +++ b/js/components/ascribe_detail/detail_property.js @@ -7,6 +7,7 @@ let DetailProperty = React.createClass({ propTypes: { label: React.PropTypes.string, value: React.PropTypes.oneOfType([ + React.PropTypes.number, React.PropTypes.string, React.PropTypes.element ]), diff --git a/js/components/ascribe_detail/edition.js b/js/components/ascribe_detail/edition.js index 254746a6..bc2f0cfa 100644 --- a/js/components/ascribe_detail/edition.js +++ b/js/components/ascribe_detail/edition.js @@ -41,12 +41,20 @@ import { getLangText } from '../../utils/lang_utils'; */ let Edition = React.createClass({ propTypes: { + actionPanelButtonListType: React.PropTypes.func, + furtherDetailsType: React.PropTypes.func, edition: React.PropTypes.object, loadEdition: React.PropTypes.func }, mixins: [History], + getDefaultProps() { + return { + furtherDetailsType: FurtherDetails + }; + }, + getInitialState() { return UserStore.getState(); }, @@ -74,6 +82,8 @@ let Edition = React.createClass({ }, render() { + let FurtherDetailsType = this.props.furtherDetailsType; + return ( @@ -89,6 +99,7 @@ let Edition = React.createClass({
@@ -136,7 +147,7 @@ let Edition = React.createClass({ currentUser={this.state.currentUser}/> {return {'bitcoin_id': this.props.edition.bitcoin_id}; }} - label={getLangText('Edition note (public)')} + label={getLangText('Personal note (public)')} defaultValue={this.props.edition.public_note ? this.props.edition.public_note : null} placeholder={getLangText('Enter your comments ...')} editable={!!this.props.edition.acl.acl_edit} @@ -150,7 +161,7 @@ let Edition = React.createClass({ show={this.props.edition.acl.acl_edit || Object.keys(this.props.edition.extra_data).length > 0 || this.props.edition.other_data.length > 0}> - 0){ - let statusStr = this.props.edition.status.join().replace(/_/, ' '); + let statusStr = this.props.edition.status.join(', ').replace(/_/g, ' '); status = ; if (this.props.edition.pending_new_owner && this.props.edition.acl.acl_withdraw_transfer){ status = ( @@ -195,7 +207,7 @@ let EditionSummary = React.createClass({ }, render() { - let { edition, currentUser } = this.props; + let { actionPanelButtonListType, edition, currentUser } = this.props; return (
{this.getStatus()} - + {/* + `acl_view` is always available in `edition.acl`, therefore if it has + no more than 1 key, we're hiding the `DetailProperty` actions as otherwise + `AclInformation` would show up + */} + 1}> diff --git a/js/components/ascribe_detail/edition_action_panel.js b/js/components/ascribe_detail/edition_action_panel.js index 2ef753fa..36a79e7c 100644 --- a/js/components/ascribe_detail/edition_action_panel.js +++ b/js/components/ascribe_detail/edition_action_panel.js @@ -36,6 +36,7 @@ import { getLangText } from '../../utils/lang_utils'; */ let EditionActionPanel = React.createClass({ propTypes: { + actionPanelButtonListType: React.PropTypes.func, edition: React.PropTypes.object, currentUser: React.PropTypes.object, handleSuccess: React.PropTypes.func @@ -43,6 +44,12 @@ let EditionActionPanel = React.createClass({ mixins: [History], + getDefaultProps() { + return { + actionPanelButtonListType: AclButtonList + }; + }, + getInitialState() { return PieceListStore.getState(); }, @@ -87,7 +94,10 @@ let EditionActionPanel = React.createClass({ }, render(){ - let {edition, currentUser} = this.props; + const { + actionPanelButtonListType: ActionPanelButtonListType, + edition, + currentUser } = this.props; if (edition && edition.notifications && @@ -104,7 +114,7 @@ let EditionActionPanel = React.createClass({ return ( -
}> + label={labels.email || getLangText('Email')} + editable={!defaultEmail} + onChange={this.handleEmailOnChange} + overrideForm={!!defaultEmail}> + label={labels.message || getLangText('Personal Message')} + editable + overrideForm> + + + diff --git a/js/components/ascribe_forms/form_create_contract.js b/js/components/ascribe_forms/form_create_contract.js index aac4c5ea..fcd874da 100644 --- a/js/components/ascribe_forms/form_create_contract.js +++ b/js/components/ascribe_forms/form_create_contract.js @@ -51,9 +51,9 @@ let CreateContractForm = React.createClass({ this.refs.form.reset(); }, - submitFileName(fileName) { + submitFile({ originalName }) { this.setState({ - contractName: fileName + contractName: originalName }); this.refs.form.submit(); @@ -69,7 +69,7 @@ let CreateContractForm = React.createClass({ name="blob" label={getLangText('Contract file (*.pdf only, max. 50MB per contract)')}>
- {getLangText('Download contract')} - - {/* We still need to send the server information that we're accepting */} - - - ); - } else { - return ( - - - - {getLangText('I agree to the')}  - - {getLangText('terms of ')} {contract.issuer} - - - - - ); - } - } else { - return ( - - ); - } - }, - - getAppendix() { - if(this.state.contractAgreementList && this.state.contractAgreementList.length > 0) { - let appendix = this.state.contractAgreementList[0].appendix; - if (appendix && appendix.default) { - return ( - -
{appendix.default}
-
- ); - } - } - return null; + getFormData() { + return this.props.id; }, getButtons() { @@ -214,14 +104,31 @@ let LoanForm = React.createClass({ }, render() { + const { email } = this.state; + const { + children, + createPublicContractAgreement, + email: defaultEmail, + handleSuccess, + gallery, + loanHeading, + message, + showPersonalMessage, + endDate, + startDate, + showEndDate, + showStartDate, + showPassword, + url } = this.props; + return ( @@ -229,18 +136,18 @@ let LoanForm = React.createClass({

}> -
-

{this.props.loanHeading}

+
+

{loanHeading}

+ editable={!defaultEmail} + onChange={this.handleEmailOnChange} + overrideForm={!!defaultEmail}> @@ -248,31 +155,31 @@ let LoanForm = React.createClass({ + editable={!gallery} + overrideForm={!!gallery}> + + - {this.getContractCheckbox()} - {this.getAppendix()} - {this.props.children} + {children} ); } diff --git a/js/components/ascribe_forms/form_loan_request_answer.js b/js/components/ascribe_forms/form_loan_request_answer.js index 1bfe90db..349b4efc 100644 --- a/js/components/ascribe_forms/form_loan_request_answer.js +++ b/js/components/ascribe_forms/form_loan_request_answer.js @@ -65,8 +65,8 @@ let LoanRequestAnswerForm = React.createClass({ url={this.props.url} email={this.state.loanRequest ? this.state.loanRequest.new_owner : null} gallery={this.state.loanRequest ? this.state.loanRequest.gallery : null} - startdate={startDate} - enddate={endDate} + startDate={startDate} + endDate={endDate} showPassword={true} showPersonalMessage={false} handleSuccess={this.props.handleSuccess}/> @@ -76,4 +76,4 @@ let LoanRequestAnswerForm = React.createClass({ } }); -export default LoanRequestAnswerForm; \ No newline at end of file +export default LoanRequestAnswerForm; diff --git a/js/components/ascribe_forms/form_register_piece.js b/js/components/ascribe_forms/form_register_piece.js index b09d29ac..83d38b50 100644 --- a/js/components/ascribe_forms/form_register_piece.js +++ b/js/components/ascribe_forms/form_register_piece.js @@ -8,6 +8,8 @@ import UserActions from '../../actions/user_actions'; import Form from './form'; import Property from './property'; import InputFineUploader from './input_fineuploader'; +import UploadButton from '../ascribe_uploader/ascribe_upload_button/upload_button'; +import FormSubmitButton from '../ascribe_buttons/form_submit_button'; import ApiUrls from '../../constants/api_urls'; import AppConstants from '../../constants/application_constants'; @@ -26,7 +28,7 @@ let RegisterPieceForm = React.createClass({ isFineUploaderActive: React.PropTypes.bool, isFineUploaderEditable: React.PropTypes.bool, enableLocalHashing: React.PropTypes.bool, - onLoggedOut: React.PropTypes.func, + enableSeparateThumbnail: React.PropTypes.bool, // For this form to work with SlideContainer, we sometimes have to disable it disabled: React.PropTypes.bool, @@ -41,14 +43,15 @@ let RegisterPieceForm = React.createClass({ return { headerMessage: getLangText('Register your work'), submitMessage: getLangText('Register work'), - enableLocalHashing: true + enableLocalHashing: true, + enableSeparateThumbnail: true }; }, getInitialState(){ return mergeOptions( { - isUploadReady: false + digitalWorkFile: null }, UserStore.getState() ); @@ -67,31 +70,89 @@ let RegisterPieceForm = React.createClass({ this.setState(state); }, - setIsUploadReady(isReady) { - this.setState({ - isUploadReady: isReady - }); + /** + * This method is overloaded so that we can track the ready-state + * of each uploader in the component + * @param {string} uploaderKey Name of the uploader's key to track + */ + setIsUploadReady(uploaderKey) { + return (isUploadReady) => { + // See documentation of `FormSubmitButton` for more detailed information + // on this. + this.refs.submitButton.setReadyStateForKey(uploaderKey, isUploadReady); + }; + }, + + handleChangedDigitalWork(digitalWorkFile) { + if (digitalWorkFile && + (digitalWorkFile.status === 'deleted' || digitalWorkFile.status === 'canceled')) { + this.refs.form.refs.thumbnail_file.reset(); + + // Manually we need to set the ready state for `thumbnailKeyReady` back + // to `true` as `ReactS3Fineuploader`'s `reset` method triggers + // `setIsUploadReady` with `false` + this.refs.submitButton.setReadyStateForKey('thumbnailKeyReady', true); + this.setState({ digitalWorkFile: null }); + } else { + this.setState({ digitalWorkFile }); + } + }, + + handleChangedThumbnail(thumbnailFile) { + const { digitalWorkFile } = this.state; + const { fineuploader } = this.refs.digitalWorkFineUploader.refs; + + fineuploader.setThumbnailForFileId( + digitalWorkFile.id, + // if thumbnail was delete, we delete it from the display as well + thumbnailFile.status !== 'deleted' ? thumbnailFile.url : null + ); + }, + + isThumbnailDialogExpanded() { + const { enableSeparateThumbnail } = this.props; + const { digitalWorkFile } = this.state; + + if(digitalWorkFile && enableSeparateThumbnail) { + const { type: mimeType } = digitalWorkFile; + const mimeSubType = mimeType && mimeType.split('/').length ? mimeType.split('/')[1] + : 'unknown'; + return AppConstants.supportedThumbnailFileFormats.indexOf(mimeSubType) === -1; + } else { + return false; + } }, render() { - let currentUser = this.state.currentUser; - let enableLocalHashing = currentUser && currentUser.profile ? currentUser.profile.hash_locally : false; - enableLocalHashing = enableLocalHashing && this.props.enableLocalHashing; + const { disabled, + handleSuccess, + submitMessage, + headerMessage, + isFineUploaderActive, + isFineUploaderEditable, + location, + children, + enableLocalHashing } = this.props; + const { currentUser} = this.state; + + const profileHashLocally = currentUser && currentUser.profile ? currentUser.profile.hash_locally : false; + const hashLocally = profileHashLocally && enableLocalHashing; return (
- {this.props.submitMessage} - + } spinner={ @@ -99,12 +160,14 @@ let RegisterPieceForm = React.createClass({ }>
-

{this.props.headerMessage}

+

{headerMessage}

+ ignoreFocus={true} + label={getLangText('Your Work')}> this.refs.digitalWorkFineUploader = ref} keyRoutine={{ url: AppConstants.serverUrl + 's3/key/', fileClass: 'digitalwork' @@ -113,13 +176,43 @@ let RegisterPieceForm = React.createClass({ url: ApiUrls.blob_digitalworks }} validation={AppConstants.fineUploader.validation.registerWork} - setIsUploadReady={this.setIsUploadReady} + setIsUploadReady={this.setIsUploadReady('digitalWorkKeyReady')} isReadyForFormSubmission={formSubmissionValidation.atLeastOneUploadedFile} - isFineUploaderActive={this.props.isFineUploaderActive} - onLoggedOut={this.props.onLoggedOut} - disabled={!this.props.isFineUploaderEditable} + isFineUploaderActive={isFineUploaderActive} + disabled={!isFineUploaderEditable} + enableLocalHashing={hashLocally} + uploadMethod={location.query.method} + handleChangedFile={this.handleChangedDigitalWork}/> + + + this.refs.thumbnailFineUploader = ref} + fileInputElement={UploadButton({ className: 'btn btn-secondary btn-sm' })} + createBlobRoutine={{ + url: ApiUrls.blob_thumbnails + }} + handleChangedFile={this.handleChangedThumbnail} + isReadyForFormSubmission={formSubmissionValidation.fileOptional} + keyRoutine={{ + url: AppConstants.serverUrl + 's3/key/', + fileClass: 'thumbnail' + }} + validation={{ + itemLimit: AppConstants.fineUploader.validation.registerWork.itemLimit, + sizeLimit: AppConstants.fineUploader.validation.additionalData.sizeLimit, + allowedExtensions: ['png', 'jpg', 'jpeg', 'gif'] + }} + setIsUploadReady={this.setIsUploadReady('thumbnailKeyReady')} + fileClassToUpload={{ + singular: getLangText('Select representative image'), + plural: getLangText('Select representative images') + }} + isFineUploaderActive={isFineUploaderActive} + disabled={!isFineUploaderEditable} enableLocalHashing={enableLocalHashing} - uploadMethod={this.props.location.query.method} /> + uploadMethod={location.query.method} /> - {this.props.children} + {children} ); } diff --git a/js/components/ascribe_forms/form_contract_agreement.js b/js/components/ascribe_forms/form_send_contract_agreement.js similarity index 94% rename from js/components/ascribe_forms/form_contract_agreement.js rename to js/components/ascribe_forms/form_send_contract_agreement.js index fa73fe42..74331e09 100644 --- a/js/components/ascribe_forms/form_contract_agreement.js +++ b/js/components/ascribe_forms/form_send_contract_agreement.js @@ -11,7 +11,6 @@ import GlobalNotificationActions from '../../actions/global_notification_actions import Form from './form'; import Property from './property'; -import PropertyCollapsible from './property_collapsible'; import InputTextAreaToggable from './input_textarea_toggable'; import ApiUrls from '../../constants/api_urls'; @@ -21,7 +20,7 @@ import { getLangText } from '../../utils/lang_utils'; import { mergeOptions } from '../../utils/general_utils'; -let ContractAgreementForm = React.createClass({ +let SendContractAgreementForm = React.createClass({ propTypes: { handleSuccess: React.PropTypes.func }, @@ -55,7 +54,7 @@ let ContractAgreementForm = React.createClass({ }, handleSubmitSuccess() { - let notification = 'Contract agreement send'; + let notification = 'Contract agreement sent'; notification = new GlobalNotificationModel(notification, 'success', 10000); GlobalNotificationActions.appendGlobalNotification(notification); @@ -122,9 +121,10 @@ let ContractAgreementForm = React.createClass({ required/>
{this.getContracts()} - + checkboxLabel={getLangText('Add appendix to the contract')} + expanded={false}> {getLangText('Appendix')} {/* We're using disabled on a form here as PropertyCollapsible currently does not support the disabled + overrideForm functionality */} @@ -132,7 +132,7 @@ let ContractAgreementForm = React.createClass({ rows={1} disabled={false} placeholder={getLangText('This will be appended to the contract selected above')}/> - + ); } @@ -148,4 +148,4 @@ let ContractAgreementForm = React.createClass({ } }); -export default ContractAgreementForm; \ No newline at end of file +export default SendContractAgreementForm; diff --git a/js/components/ascribe_forms/form_unconsign_request.js b/js/components/ascribe_forms/form_unconsign_request.js index 2cf6ba32..173649e1 100644 --- a/js/components/ascribe_forms/form_unconsign_request.js +++ b/js/components/ascribe_forms/form_unconsign_request.js @@ -57,7 +57,7 @@ let UnConsignRequestForm = React.createClass({ rows={1} defaultValue={this.props.message} placeholder={getLangText('Enter a message...')} - required="required"/> + required />
@@ -65,4 +65,4 @@ let UnConsignRequestForm = React.createClass({ } }); -export default UnConsignRequestForm; \ No newline at end of file +export default UnConsignRequestForm; diff --git a/js/components/ascribe_forms/input_contract_agreement_checkbox.js b/js/components/ascribe_forms/input_contract_agreement_checkbox.js new file mode 100644 index 00000000..61235631 --- /dev/null +++ b/js/components/ascribe_forms/input_contract_agreement_checkbox.js @@ -0,0 +1,206 @@ +'use strict'; + +import React from 'react/addons'; + +import InputCheckbox from './input_checkbox'; + +import ContractAgreementListStore from '../../stores/contract_agreement_list_store'; +import ContractAgreementListActions from '../../actions/contract_agreement_list_actions'; + +import { getLangText } from '../../utils/lang_utils'; +import { mergeOptions } from '../../utils/general_utils'; +import { isEmail } from '../../utils/regex_utils'; + + +const InputContractAgreementCheckbox = React.createClass({ + propTypes: { + createPublicContractAgreement: React.PropTypes.bool, + email: React.PropTypes.string, + + required: React.PropTypes.bool, + + // provided by Property + disabled: React.PropTypes.bool, + onChange: React.PropTypes.func, + name: React.PropTypes.string, + setExpanded: React.PropTypes.func, + + // can be used to style the component from the outside + style: React.PropTypes.object + }, + + getDefaultProps() { + return { + createPublicContractAgreement: true + }; + }, + + getInitialState() { + return mergeOptions( + ContractAgreementListStore.getState(), + { + value: { + terms: null, + contract_agreement_id: null + } + } + ); + }, + + componentDidMount() { + ContractAgreementListStore.listen(this.onStoreChange); + this.getContractAgreementsOrCreatePublic(this.props.email); + }, + + componentWillReceiveProps({ email: nextEmail }) { + if (this.props.email !== nextEmail) { + if (isEmail(nextEmail)) { + this.getContractAgreementsOrCreatePublic(nextEmail); + } else if (this.getContractAgreement()) { + ContractAgreementListActions.flushContractAgreementList(); + } + } + }, + + componentWillUnmount() { + ContractAgreementListStore.unlisten(this.onStoreChange); + }, + + onStoreChange(state) { + const contractAgreement = this.getContractAgreement(state.contractAgreementList); + + // If there is no contract available, hide this `Property` from the user + this.props.setExpanded(!!contractAgreement); + + state = mergeOptions(state, { + value: { + // If `email` is defined in this component, `getContractAgreementsOrCreatePublic` + // is either: + // + // - fetching a already existing contract agreement; or + // - trying to create a contract agreement + // + // If both attempts result in `contractAgreement` being not defined, + // it means that the receiver hasn't defined a contract, which means + // a contract agreement cannot be created, which means we don't have to + // specify `contract_agreement_id` when sending a request to the server. + contract_agreement_id: contractAgreement ? contractAgreement.id : null, + // If the receiver hasn't set a contract or the contract was + // previously accepted, we set the terms to `true` + // as we always need to at least give a boolean value for `terms` + // to the API endpoint + terms: !contractAgreement || !!contractAgreement.datetime_accepted + } + }); + + this.setState(state); + }, + + onChange(event) { + // Sync the value between our `InputCheckbox` and this component's `terms` + // so the parent `Property` is able to get the correct value of this component + // when the `Form` queries it. + this.setState({ + value: React.addons.update(this.state.value, { + terms: { $set: event.target.value } + }) + }); + + // Propagate change events from the checkbox up to the parent `Property` + this.props.onChange(event); + }, + + getContractAgreement(contractAgreementList = this.state.contractAgreementList) { + if (contractAgreementList && contractAgreementList.length) { + return contractAgreementList[0]; + } + }, + + getContractAgreementsOrCreatePublic(email) { + ContractAgreementListActions.flushContractAgreementList.defer(); + + if (email) { + // fetch the available contractagreements (pending/accepted) + ContractAgreementListActions.fetchAvailableContractAgreementList(email, this.props.createPublicContractAgreement); + } + }, + + getAppendix() { + const contractAgreement = this.getContractAgreement(); + + if (contractAgreement && + contractAgreement.appendix && + contractAgreement.appendix.default) { + return ( +
+

{getLangText('Appendix')}

+
{contractAgreement.appendix.default}
+
+ ); + } + }, + + getContractCheckbox() { + const contractAgreement = this.getContractAgreement(); + + if(contractAgreement) { + const { + datetime_accepted: datetimeAccepted, + contract: { + issuer: contractIssuer, + blob: { url_safe: contractUrl } + } + } = contractAgreement; + + if(datetimeAccepted) { + return ( + + ); + } else { + const { + name, + disabled, + style } = this.props; + + return ( + + + {getLangText('I agree to the')}  + + {getLangText('terms of ')} {contractIssuer} + + + + ); + } + } + }, + + render() { + return ( +
+ {this.getContractCheckbox()} + {this.getAppendix()} +
+ ); + } +}); + +export default InputContractAgreementCheckbox; diff --git a/js/components/ascribe_forms/input_fineuploader.js b/js/components/ascribe_forms/input_fineuploader.js index 948521c0..db5bae05 100644 --- a/js/components/ascribe_forms/input_fineuploader.js +++ b/js/components/ascribe_forms/input_fineuploader.js @@ -10,13 +10,13 @@ import AppConstants from '../../constants/application_constants'; import { getCookie } from '../../utils/fetch_api_utils'; -const { func, bool, object, shape, string, number, arrayOf } = React.PropTypes; +const { func, bool, shape, string, number, arrayOf } = React.PropTypes; const InputFineUploader = React.createClass({ propTypes: { setIsUploadReady: func, isReadyForFormSubmission: func, - submitFileName: func, + submitFile: func, fileInputElement: func, areAssetsDownloadable: bool, @@ -38,7 +38,6 @@ const InputFineUploader = React.createClass({ // a user is actually not logged in already to prevent him from droping files // before login in isFineUploaderActive: bool, - onLoggedOut: func, enableLocalHashing: bool, uploadMethod: string, @@ -51,7 +50,11 @@ const InputFineUploader = React.createClass({ fileClassToUpload: shape({ singular: string, plural: string - }) + }), + handleChangedFile: func, + + // Provided by `Property` + onChange: React.PropTypes.func }, getDefaultProps() { @@ -77,8 +80,8 @@ const InputFineUploader = React.createClass({ this.props.onChange({ target: { value: this.state.value } }); } - if(typeof this.props.submitFileName === 'function') { - this.props.submitFileName(file.originalName); + if(typeof this.props.submitFile === 'function') { + this.props.submitFile(file); } }, @@ -94,23 +97,26 @@ const InputFineUploader = React.createClass({ }, render() { - const { fileInputElement, - keyRoutine, - createBlobRoutine, - validation, - setIsUploadReady, - isReadyForFormSubmission, - areAssetsDownloadable, - onLoggedOut, - enableLocalHashing, - fileClassToUpload, - location } = this.props; - let editable = this.props.isFineUploaderActive; + const { + areAssetsDownloadable, + enableLocalHashing, + createBlobRoutine, + disabled, + fileClassToUpload, + fileInputElement, + isFineUploaderActive, + isReadyForFormSubmission, + keyRoutine, + setIsUploadReady, + uploadMethod, + validation, + handleChangedFile } = this.props; + let editable = isFineUploaderActive; // if disabled is actually set by property, we want to override // isFineUploaderActive - if(typeof this.props.disabled !== 'undefined') { - editable = !this.props.disabled; + if(typeof disabled !== 'undefined') { + editable = !disabled; } return ( @@ -139,10 +145,10 @@ const InputFineUploader = React.createClass({ 'X-CSRFToken': getCookie(AppConstants.csrftoken) } }} - onInactive={this.props.onLoggedOut} - enableLocalHashing={this.props.enableLocalHashing} - uploadMethod={this.props.uploadMethod} - fileClassToUpload={this.props.fileClassToUpload} /> + enableLocalHashing={enableLocalHashing} + uploadMethod={uploadMethod} + fileClassToUpload={fileClassToUpload} + handleChangedFile={handleChangedFile}/> ); } }); diff --git a/js/components/ascribe_forms/input_textarea_toggable.js b/js/components/ascribe_forms/input_textarea_toggable.js index c17a0e5a..0be8b87a 100644 --- a/js/components/ascribe_forms/input_textarea_toggable.js +++ b/js/components/ascribe_forms/input_textarea_toggable.js @@ -7,6 +7,7 @@ import TextareaAutosize from 'react-textarea-autosize'; let InputTextAreaToggable = React.createClass({ propTypes: { + autoFocus: React.PropTypes.bool, disabled: React.PropTypes.bool, rows: React.PropTypes.number.isRequired, required: React.PropTypes.bool, @@ -23,6 +24,10 @@ let InputTextAreaToggable = React.createClass({ }, componentDidMount() { + if (this.props.autoFocus) { + this.refs.textarea.focus(); + } + this.setState({ value: this.props.defaultValue }); @@ -51,6 +56,7 @@ let InputTextAreaToggable = React.createClass({ className = className + ' ascribe-textarea-editable'; textarea = ( { - return ReactAddons.addons.cloneWithProps(child, { - style, - onChange: this.handleChange, - onFocus: this.handleFocus, - onBlur: this.handleBlur, - disabled: !this.props.editable, - ref: 'input', - name: this.props.name + // Input's props should only be cloned and propagated down the tree, + // if the component is actually being shown (!== 'expanded === false') + if((this.state.expanded && this.props.checkboxLabel) || !this.props.checkboxLabel) { + return ReactAddons.Children.map(this.props.children, (child) => { + // Since refs will be overriden by this functions return statement, + // we still want to be able to define refs for nested `Form` or `Property` + // children, which is why we're upfront simply invoking the callback-ref- + // function before overriding it. + if(typeof child.ref === 'function' && this.refs.input) { + child.ref(this.refs.input); + } + + return React.cloneElement(child, { + style, + onChange: this.handleChange, + onFocus: this.handleFocus, + onBlur: this.handleBlur, + disabled: !this.props.editable, + ref: 'input', + name: this.props.name, + setExpanded: this.setExpanded + }); }); - }); + } + }, + + getLabelAndErrors() { + if(this.props.label || this.state.errors) { + return ( +

+ {this.props.label} + {this.state.errors} +

+ ); + } else { + return null; + } + }, + + getCheckbox() { + const { checkboxLabel } = this.props; + + if(checkboxLabel) { + return ( +
+ + {' ' + checkboxLabel} +
+ ); + } else { + return null; + } }, render() { let footer = null; - let tooltip = ; - let style = this.props.style ? mergeOptions({}, this.props.style) : {}; - if(this.props.tooltip){ - tooltip = ( - - {this.props.tooltip} - ); - } - if(this.props.footer){ footer = (
{this.props.footer} -
); - } - - if(!this.props.editable) { - style.cursor = 'not-allowed'; +
+ ); } return (
- + style={this.props.style}> + {this.getCheckbox()} +
-

- {this.props.label} - {this.state.errors} -

- {this.renderChildren(style)} + {this.getLabelAndErrors()} + {this.renderChildren(this.props.style)} {footer}
-
+
); } diff --git a/js/components/ascribe_forms/property_collapsible.js b/js/components/ascribe_forms/property_collapsible.js deleted file mode 100644 index 92970583..00000000 --- a/js/components/ascribe_forms/property_collapsible.js +++ /dev/null @@ -1,96 +0,0 @@ -'use strict'; - -import React from 'react'; -import ReactAddons from 'react/addons'; - -import OverlayTrigger from 'react-bootstrap/lib/OverlayTrigger'; -import Tooltip from 'react-bootstrap/lib/Tooltip'; -import Panel from 'react-bootstrap/lib/Panel'; - - -let PropertyCollapsile = React.createClass({ - propTypes: { - children: React.PropTypes.arrayOf(React.PropTypes.element), - checkboxLabel: React.PropTypes.string, - tooltip: React.PropTypes.string - }, - - getInitialState() { - return { - show: false - }; - }, - - handleFocus() { - this.refs.checkboxCollapsible.getDOMNode().checked = !this.refs.checkboxCollapsible.getDOMNode().checked; - this.setState({ - show: this.refs.checkboxCollapsible.getDOMNode().checked - }); - }, - - handleChange(event) { - this.setState({value: event.target.value}); - }, - - renderChildren() { - if(this.state.show) { - return ReactAddons.Children.map(this.props.children, (child) => { - return ReactAddons.addons.cloneWithProps(child, { - onChange: this.handleChange - }); - }); - } - }, - - reset() { - // If the child input is a native HTML element, it will be reset automatically - // by the DOM. - // However, we need to collapse this component again. - this.setState(this.getInitialState()); - }, - - render() { - let tooltip = ; - if (this.props.tooltip){ - tooltip = ( - - {this.props.tooltip} - ); - } - - let style = this.state.show ? {} : {paddingBottom: 0}; - - return ( -
- -
- - {/* PLEASE LEAVE THE SPACE BETWEEN LABEL and this.props.label */} - {this.props.checkboxLabel} -
-
- -
- {this.renderChildren()} -
-
-
- ); - } -}); - -export default PropertyCollapsile; \ No newline at end of file diff --git a/js/components/ascribe_piece_list_bulk_modal/piece_list_bulk_modal.js b/js/components/ascribe_piece_list_bulk_modal/piece_list_bulk_modal.js index 2eedbd4c..c9c7f9f4 100644 --- a/js/components/ascribe_piece_list_bulk_modal/piece_list_bulk_modal.js +++ b/js/components/ascribe_piece_list_bulk_modal/piece_list_bulk_modal.js @@ -4,77 +4,24 @@ import React from 'react'; import { mergeOptions } from '../../utils/general_utils'; -import EditionListStore from '../../stores/edition_list_store'; import EditionListActions from '../../actions/edition_list_actions'; -import UserStore from '../../stores/user_store'; -import UserActions from '../../actions/user_actions'; - -import PieceListStore from '../../stores/piece_list_store'; -import PieceListActions from '../../actions/piece_list_actions'; - import PieceListBulkModalSelectedEditionsWidget from './piece_list_bulk_modal_selected_editions_widget'; -import AclButtonList from '../ascribe_buttons/acl_button_list'; -import DeleteButton from '../ascribe_buttons/delete_button'; -import { getAvailableAcls } from '../../utils/acl_utils'; import { getLangText } from '../../utils/lang_utils.js'; let PieceListBulkModal = React.createClass({ propTypes: { - className: React.PropTypes.string - }, - - getInitialState() { - return mergeOptions( - EditionListStore.getState(), - UserStore.getState(), - PieceListStore.getState() - ); - }, - - - - componentDidMount() { - EditionListStore.listen(this.onChange); - UserStore.listen(this.onChange); - PieceListStore.listen(this.onChange); - - UserActions.fetchCurrentUser(); - PieceListActions.fetchPieceList(this.state.page, this.state.pageSize, this.state.search, - this.state.orderBy, this.state.orderAsc, this.state.filterBy); - }, - - componentWillUnmount() { - EditionListStore.unlisten(this.onChange); - PieceListStore.unlisten(this.onChange); - UserStore.unlisten(this.onChange); - }, - - onChange(state) { - this.setState(state); - }, - - fetchSelectedPieceEditionList() { - let filteredPieceIdList = Object.keys(this.state.editionList) - .filter((pieceId) => { - return this.state.editionList[pieceId] - .filter((edition) => edition.selected).length > 0; - }); - return filteredPieceIdList; - }, - - fetchSelectedEditionList() { - let selectedEditionList = []; - - Object - .keys(this.state.editionList) - .forEach((pieceId) => { - let filteredEditionsForPiece = this.state.editionList[pieceId].filter((edition) => edition.selected); - selectedEditionList = selectedEditionList.concat(filteredEditionsForPiece); - }); - - return selectedEditionList; + availableAcls: React.PropTypes.object.isRequired, + className: React.PropTypes.string, + selectedEditions: React.PropTypes.oneOfType([ + React.PropTypes.object, + React.PropTypes.array + ]), + children: React.PropTypes.oneOfType([ + React.PropTypes.arrayOf(React.PropTypes.element), + React.PropTypes.element + ]) }, clearAllSelections() { @@ -82,22 +29,8 @@ let PieceListBulkModal = React.createClass({ EditionListActions.closeAllEditionLists(); }, - handleSuccess() { - PieceListActions.fetchPieceList(this.state.page, this.state.pageSize, this.state.search, - this.state.orderBy, this.state.orderAsc, this.state.filterBy); - - this.fetchSelectedPieceEditionList() - .forEach((pieceId) => { - EditionListActions.refreshEditionList({pieceId, filterBy: {}}); - }); - EditionListActions.clearAllEditionSelections(); - }, - render() { - let selectedEditions = this.fetchSelectedEditionList(); - let availableAcls = getAvailableAcls(selectedEditions, (aclName) => aclName !== 'acl_view'); - - if(Object.keys(availableAcls).length > 0) { + if (Object.keys(this.props.availableAcls).length) { return (
@@ -106,7 +39,7 @@ let PieceListBulkModal = React.createClass({
+ numberOfSelectedEditions={this.props.selectedEditions.length} />          

- - - + {this.props.children}
@@ -132,7 +57,6 @@ let PieceListBulkModal = React.createClass({ } else { return null; } - } }); diff --git a/js/components/ascribe_piece_list_toolbar/piece_list_toolbar_filter_widget.js b/js/components/ascribe_piece_list_toolbar/piece_list_toolbar_filter_widget.js index 38de2af6..c463330c 100644 --- a/js/components/ascribe_piece_list_toolbar/piece_list_toolbar_filter_widget.js +++ b/js/components/ascribe_piece_list_toolbar/piece_list_toolbar_filter_widget.js @@ -28,7 +28,7 @@ let PieceListToolbarFilterWidget = React.createClass({ }, generateFilterByStatement(param) { - let filterBy = this.props.filterBy; + const filterBy = Object.assign({}, this.props.filterBy); if(filterBy) { // we need hasOwnProperty since the values are all booleans @@ -56,13 +56,13 @@ let PieceListToolbarFilterWidget = React.createClass({ */ filterBy(param) { return () => { - let filterBy = this.generateFilterByStatement(param); + const filterBy = this.generateFilterByStatement(param); this.props.applyFilterBy(filterBy); }; }, isFilterActive() { - let trueValuesOnly = Object.keys(this.props.filterBy).filter((acl) => acl); + const trueValuesOnly = Object.keys(this.props.filterBy).filter((acl) => acl); // We're hiding the star in that complicated matter so that, // the surrounding button is not resized up on appearance @@ -74,7 +74,7 @@ let PieceListToolbarFilterWidget = React.createClass({ }, render() { - let filterIcon = ( + const filterIcon = ( * @@ -140,4 +140,4 @@ let PieceListToolbarFilterWidget = React.createClass({ } }); -export default PieceListToolbarFilterWidget; \ No newline at end of file +export default PieceListToolbarFilterWidget; diff --git a/js/components/ascribe_settings/contract_settings_update_button.js b/js/components/ascribe_settings/contract_settings_update_button.js index aa13264a..7649e5b0 100644 --- a/js/components/ascribe_settings/contract_settings_update_button.js +++ b/js/components/ascribe_settings/contract_settings_update_button.js @@ -55,7 +55,7 @@ let ContractSettingsUpdateButton = React.createClass({ render() { return ( -
-
A
+ className={classNames('spinner-wrapper-' + size, + color ? 'spinner-wrapper-' + color : null, + classes)}> +
+
A
); } diff --git a/js/components/ascribe_uploader/ascribe_file_drag_and_drop/file_drag_and_drop.js b/js/components/ascribe_uploader/ascribe_file_drag_and_drop/file_drag_and_drop.js index 0cc7ff5e..1157a540 100644 --- a/js/components/ascribe_uploader/ascribe_file_drag_and_drop/file_drag_and_drop.js +++ b/js/components/ascribe_uploader/ascribe_file_drag_and_drop/file_drag_and_drop.js @@ -15,7 +15,6 @@ let FileDragAndDrop = React.createClass({ className: React.PropTypes.string, onDrop: React.PropTypes.func.isRequired, onDragOver: React.PropTypes.func, - onInactive: React.PropTypes.func, filesToUpload: React.PropTypes.array, handleDeleteFile: React.PropTypes.func, handleCancelFile: React.PropTypes.func, @@ -60,28 +59,21 @@ let FileDragAndDrop = React.createClass({ handleDrop(event) { event.preventDefault(); event.stopPropagation(); - let files; - if(this.props.dropzoneInactive) { - // if there is a handle function for doing stuff - // when the dropzone is inactive, then call it - if(this.props.onInactive) { - this.props.onInactive(); + if (!this.props.dropzoneInactive) { + let files; + + // handle Drag and Drop + if(event.dataTransfer && event.dataTransfer.files.length > 0) { + files = event.dataTransfer.files; + } else if(event.target.files) { // handle input type file + files = event.target.files; } - return; - } - // handle Drag and Drop - if(event.dataTransfer && event.dataTransfer.files.length > 0) { - files = event.dataTransfer.files; - } else if(event.target.files) { // handle input type file - files = event.target.files; + if(typeof this.props.onDrop === 'function' && files) { + this.props.onDrop(files); + } } - - if(typeof this.props.onDrop === 'function' && files) { - this.props.onDrop(files); - } - }, handleDeleteFile(fileId) { @@ -113,31 +105,25 @@ let FileDragAndDrop = React.createClass({ }, handleOnClick() { - let evt; - // when multiple is set to false and the user already uploaded a piece, - // do not propagate event - if(this.props.dropzoneInactive) { - // if there is a handle function for doing stuff - // when the dropzone is inactive, then call it - if(this.props.onInactive) { - this.props.onInactive(); + // do not propagate event if the drop zone's inactive, + // for example when multiple is set to false and the user already uploaded a piece + if (!this.props.dropzoneInactive) { + let evt; + + try { + evt = new MouseEvent('click', { + view: window, + bubbles: true, + cancelable: true + }); + } catch(e) { + // For browsers that do not support the new MouseEvent syntax + evt = document.createEvent('MouseEvents'); + evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null); } - return; - } - try { - evt = new MouseEvent('click', { - view: window, - bubbles: true, - cancelable: true - }); - } catch(e) { - // For browsers that do not support the new MouseEvent syntax - evt = document.createEvent('MouseEvents'); - evt.initMouseEvent('click', true, true, window, 0, 0, 0, 80, 20, false, false, false, false, 0, null); + this.refs.fileSelector.getDOMNode().dispatchEvent(evt); } - - this.refs.fileSelector.getDOMNode().dispatchEvent(evt); }, render: function () { diff --git a/js/components/ascribe_uploader/ascribe_file_drag_and_drop/file_drag_and_drop_preview.js b/js/components/ascribe_uploader/ascribe_file_drag_and_drop/file_drag_and_drop_preview.js index 86d4135e..ca1be2d2 100644 --- a/js/components/ascribe_uploader/ascribe_file_drag_and_drop/file_drag_and_drop_preview.js +++ b/js/components/ascribe_uploader/ascribe_file_drag_and_drop/file_drag_and_drop_preview.js @@ -5,22 +5,31 @@ import React from 'react'; import FileDragAndDropPreviewImage from './file_drag_and_drop_preview_image'; import FileDragAndDropPreviewOther from './file_drag_and_drop_preview_other'; - import { getLangText } from '../../../utils/lang_utils'; +import { truncateTextAtCharIndex } from '../../../utils/general_utils'; +import { extractFileExtensionFromString } from '../../../utils/file_utils'; -let FileDragAndDropPreview = React.createClass({ +const { shape, string, number, func, bool } = React.PropTypes; + +const FileDragAndDropPreview = React.createClass({ propTypes: { - file: React.PropTypes.shape({ - url: React.PropTypes.string, - type: React.PropTypes.string + file: shape({ + url: string, + type: string, + progress: number, + id: number, + status: string, + s3Url: string, + s3UrlSafe: string }).isRequired, - handleDeleteFile: React.PropTypes.func, - handleCancelFile: React.PropTypes.func, - handlePauseFile: React.PropTypes.func, - handleResumeFile: React.PropTypes.func, - areAssetsDownloadable: React.PropTypes.bool, - areAssetsEditable: React.PropTypes.bool + handleDeleteFile: func, + handleCancelFile: func, + handlePauseFile: func, + handleResumeFile: func, + areAssetsDownloadable: bool, + areAssetsEditable: bool, + numberOfDisplayedFiles: number }, toggleUploadProcess() { @@ -32,14 +41,21 @@ let FileDragAndDropPreview = React.createClass({ }, handleDeleteFile() { - // handleDeleteFile is optional, so if its not submitted, - // don't run it - // On the other hand, if the files progress is not yet at a 100%, - // just run fineuploader.cancel - if(this.props.handleDeleteFile && this.props.file.progress === 100) { - this.props.handleDeleteFile(this.props.file.id); - } else if(this.props.handleCancelFile && this.props.file.progress !== 100) { - this.props.handleCancelFile(this.props.file.id); + const { handleDeleteFile, + handleCancelFile, + file } = this.props; + // `handleDeleteFile` is optional, so if its not submitted, don't run it + // + // For delete though, we only want to trigger it, when we're sure that + // the file has *completely* been uploaded to S3 and call now also be + // deleted using an HTTP DELETE request. + if (handleDeleteFile && + file.progress === 100 && + (file.status === 'upload successful' || file.status === 'online') && + file.s3UrlSafe) { + handleDeleteFile(file.id); + } else if(handleCancelFile) { + handleCancelFile(file.id); } }, @@ -50,44 +66,80 @@ let FileDragAndDropPreview = React.createClass({ } }, + getFileName() { + const { numberOfDisplayedFiles, file } = this.props; + + if(numberOfDisplayedFiles === 1) { + return ( + + {truncateTextAtCharIndex(file.name, 30, '(...).' + extractFileExtensionFromString(file.name))} + + ); + } else { + return null; + } + }, + + getRemoveButton() { + if(this.props.areAssetsEditable) { + return ( +
+
+ ); + } else { + return null; + } + }, + render() { + const { file, + areAssetsDownloadable, + numberOfDisplayedFiles } = this.props; + const innerStyle = numberOfDisplayedFiles === 1 ? { verticalAlign: 'middle' } : null; + const outerStyle = numberOfDisplayedFiles !== 1 ? { display: 'inline-block' } : null; + let previewElement; - let removeBtn; // Decide whether an image or a placeholder picture should be displayed - if(this.props.file.type.split('/')[0] === 'image') { - previewElement = (); + // If a file has its `thumbnailUrl` defined, then we display it also as an image + if(file.type.split('/')[0] === 'image' || file.thumbnailUrl) { + previewElement = ( + 1} /> + ); } else { - previewElement = (); - } - - if(this.props.areAssetsEditable) { - removeBtn = (
-
); + previewElement = ( + 1} /> + ); } return ( -
- {removeBtn} - {previewElement} +
+
+ {this.getRemoveButton()} + {previewElement} +
+ {this.getFileName()}
); } diff --git a/js/components/ascribe_uploader/ascribe_file_drag_and_drop/file_drag_and_drop_preview_image.js b/js/components/ascribe_uploader/ascribe_file_drag_and_drop/file_drag_and_drop_preview_image.js index c21c91f9..927a5b22 100644 --- a/js/components/ascribe_uploader/ascribe_file_drag_and_drop/file_drag_and_drop_preview_image.js +++ b/js/components/ascribe_uploader/ascribe_file_drag_and_drop/file_drag_and_drop_preview_image.js @@ -3,16 +3,21 @@ import React from 'react'; import ProgressBar from 'react-bootstrap/lib/ProgressBar'; +import AclProxy from '../../acl_proxy'; import AscribeSpinner from '../../ascribe_spinner'; import { getLangText } from '../../../utils/lang_utils'; -let FileDragAndDropPreviewImage = React.createClass({ + +const { number, string, func, bool } = React.PropTypes; + +const FileDragAndDropPreviewImage = React.createClass({ propTypes: { - progress: React.PropTypes.number, - url: React.PropTypes.string, - toggleUploadProcess: React.PropTypes.func, - downloadUrl: React.PropTypes.string, - areAssetsDownloadable: React.PropTypes.bool + progress: number, + url: string, + toggleUploadProcess: func, + downloadUrl: string, + areAssetsDownloadable: bool, + showProgress: bool }, getInitialState() { @@ -33,40 +38,44 @@ let FileDragAndDropPreviewImage = React.createClass({ }, render() { - let imageStyle = { - backgroundImage: 'url("' + this.props.url + '")', + const { url, + progress, + areAssetsDownloadable, + downloadUrl, + showProgress } = this.props; + const imageStyle = { + backgroundImage: 'url("' + url + '")', backgroundSize: 'cover' }; let actionSymbol; - if(this.props.progress > 0 && this.props.progress < 99 && this.state.paused) { - actionSymbol =