diff options
author | Chi Kei Chan <chikeichan@gmail.com> | 2017-12-08 01:54:37 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-12-08 01:54:37 +0800 |
commit | 41d281a52714ad432b115d94a272156d51cd7bad (patch) | |
tree | 36c1a9ad91600f48496157b45c9fa3019206467d | |
parent | 7dba114feb428f7f2f78fee5611377b04bff5be6 (diff) | |
parent | e0d0e19c925224bddf56a4088fb9c402d995d79f (diff) | |
download | tangerine-wallet-browser-41d281a52714ad432b115d94a272156d51cd7bad.tar tangerine-wallet-browser-41d281a52714ad432b115d94a272156d51cd7bad.tar.gz tangerine-wallet-browser-41d281a52714ad432b115d94a272156d51cd7bad.tar.bz2 tangerine-wallet-browser-41d281a52714ad432b115d94a272156d51cd7bad.tar.lz tangerine-wallet-browser-41d281a52714ad432b115d94a272156d51cd7bad.tar.xz tangerine-wallet-browser-41d281a52714ad432b115d94a272156d51cd7bad.tar.zst tangerine-wallet-browser-41d281a52714ad432b115d94a272156d51cd7bad.zip |
Merge branch 'NewUI-flat' into cb-372
162 files changed, 21152 insertions, 152 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index ee9548606..009cd5f7c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,12 @@ ## Current Master +## 3.12.1 2017-11-29 + +- Fix bug where a user could be shown two different seed phrases. +- Detect when multiple web3 extensions are active, and provide useful error. +- Adds notice about seed phrase backup. + ## 3.12.0 2017-10-25 - Add support for alternative ENS TLDs (Ethereum Name Service Top-Level Domains). diff --git a/ISSUE_TEMPLATE b/ISSUE_TEMPLATE index d0ff3c08e..b56d08d95 100644 --- a/ISSUE_TEMPLATE +++ b/ISSUE_TEMPLATE @@ -1,7 +1,7 @@ <!-- -FAQ: - BEFORE SUBMITTING, please make sure your question hasn't been answered in our FAQ: https://github.com/MetaMask/faq - Common questions such as "Where is my ether?" or "Where did my tokens go?" are answered in the FAQ. + +BEFORE SUBMITTING, please make sure your question hasn't been answered in our support center: https://support.metamask.io +Common questions such as "Where is my ether?" or "Where did my tokens go?" are answered there. Bug Reports: diff --git a/app/scripts/background.js b/app/scripts/background.js index 3e560d302..da022c490 100644 --- a/app/scripts/background.js +++ b/app/scripts/background.js @@ -1,10 +1,11 @@ const urlUtil = require('url') const endOfStream = require('end-of-stream') -const pipe = require('pump') +const pump = require('pump') const log = require('loglevel') const extension = require('extensionizer') const LocalStorageStore = require('obs-store/lib/localStorage') const storeTransform = require('obs-store/lib/transform') +const asStream = require('obs-store/lib/asStream') const ExtensionPlatform = require('./platforms/extension') const Migrator = require('./lib/migrator/') const migrations = require('./migrations/') @@ -72,10 +73,10 @@ function setupController (initState) { global.metamaskController = controller // setup state persistence - pipe( - controller.store, + pump( + asStream(controller.store), storeTransform(versionifyData), - diskStore + asStream(diskStore) ) function versionifyData (state) { diff --git a/app/scripts/controllers/network.js b/app/scripts/controllers/network.js index 23afdc12b..045bfcc5d 100644 --- a/app/scripts/controllers/network.js +++ b/app/scripts/controllers/network.js @@ -53,7 +53,7 @@ module.exports = class NetworkController extends EventEmitter { lookupNetwork () { // Prevent firing when provider is not defined. if (!this.ethQuery || !this.ethQuery.sendAsync) { - return + return log.warn('NetworkController - lookupNetwork aborted due to missing ethQuery') } this.ethQuery.sendAsync({ method: 'net_version' }, (err, network) => { if (err) return this.setNetworkState('loading') diff --git a/app/scripts/controllers/preferences.js b/app/scripts/controllers/preferences.js index 0aed4dbdf..de9006044 100644 --- a/app/scripts/controllers/preferences.js +++ b/app/scripts/controllers/preferences.js @@ -10,6 +10,7 @@ class PreferencesController { currentAccountTab: 'history', tokens: [], useBlockie: false, + featureFlags: {}, }, opts.initState) this.store = new ObservableStore(initState) } @@ -100,6 +101,22 @@ class PreferencesController { getFrequentRpcList () { return this.store.getState().frequentRpcList } + + setFeatureFlag (feature, activated) { + const currentFeatureFlags = this.store.getState().featureFlags + const updatedFeatureFlags = { + ...currentFeatureFlags, + [feature]: activated, + } + + this.store.updateState({ featureFlags: updatedFeatureFlags }) + + return Promise.resolve(updatedFeatureFlags) + } + + getFeatureFlags () { + return this.store.getState().featureFlags + } // // PRIVATE METHODS // diff --git a/app/scripts/controllers/transactions.js b/app/scripts/controllers/transactions.js index a861c0342..ce709bd28 100644 --- a/app/scripts/controllers/transactions.js +++ b/app/scripts/controllers/transactions.js @@ -72,6 +72,12 @@ module.exports = class TransactionController extends EventEmitter { }) this.pendingTxTracker.on('tx:failed', this.txStateManager.setTxStatusFailed.bind(this.txStateManager)) this.pendingTxTracker.on('tx:confirmed', this.txStateManager.setTxStatusConfirmed.bind(this.txStateManager)) + this.pendingTxTracker.on('tx:block-update', (txMeta, latestBlockNumber) => { + if (!txMeta.firstRetryBlockNumber) { + txMeta.firstRetryBlockNumber = latestBlockNumber + this.txStateManager.updateTx(txMeta, 'transactions/pending-tx-tracker#event: tx:block-update') + } + }) this.pendingTxTracker.on('tx:retry', (txMeta) => { if (!('retryCount' in txMeta)) txMeta.retryCount = 0 txMeta.retryCount++ diff --git a/app/scripts/inpage.js b/app/scripts/inpage.js index b6889b00f..9261e7d64 100644 --- a/app/scripts/inpage.js +++ b/app/scripts/inpage.js @@ -31,6 +31,13 @@ var inpageProvider = new MetamaskInpageProvider(metamaskStream) // setup web3 // +if (typeof window.web3 !== 'undefined') { + throw new Error(`MetaMask detected another web3. + MetaMask will not work reliably with another web3 extension. + This usually happens if you have two MetaMasks installed, + or MetaMask and another web3 extension. Please remove one + and try again.`) +} var web3 = new Web3(inpageProvider) web3.setProvider = function () { log.debug('MetaMask - overrode web3.setProvider') diff --git a/app/scripts/lib/inpage-provider.js b/app/scripts/lib/inpage-provider.js index da75c4be2..99cc5d2cf 100644 --- a/app/scripts/lib/inpage-provider.js +++ b/app/scripts/lib/inpage-provider.js @@ -3,6 +3,7 @@ const RpcEngine = require('json-rpc-engine') const createIdRemapMiddleware = require('json-rpc-engine/src/idRemapMiddleware') const createStreamMiddleware = require('json-rpc-middleware-stream') const LocalStorageStore = require('obs-store') +const asStream = require('obs-store/lib/asStream') const ObjectMultiplex = require('obj-multiplex') module.exports = MetamaskInpageProvider @@ -21,9 +22,10 @@ function MetamaskInpageProvider (connectionStream) { // subscribe to metamask public config (one-way) self.publicConfigStore = new LocalStorageStore({ storageKey: 'MetaMask-Config' }) + pump( mux.createStream('publicConfig'), - self.publicConfigStore, + asStream(self.publicConfigStore), (err) => logStreamDisconnectWarning('MetaMask PublicConfigStore', err) ) diff --git a/app/scripts/lib/pending-tx-tracker.js b/app/scripts/lib/pending-tx-tracker.js index 0d7c6a92c..dc6e526fd 100644 --- a/app/scripts/lib/pending-tx-tracker.js +++ b/app/scripts/lib/pending-tx-tracker.js @@ -65,11 +65,11 @@ module.exports = class PendingTransactionTracker extends EventEmitter { } - resubmitPendingTxs () { + resubmitPendingTxs (block) { const pending = this.getPendingTransactions() // only try resubmitting if their are transactions to resubmit if (!pending.length) return - pending.forEach((txMeta) => this._resubmitTx(txMeta).catch((err) => { + pending.forEach((txMeta) => this._resubmitTx(txMeta, block.number).catch((err) => { /* Dont marked as failed if the error is a "known" transaction warning "there is already a transaction with the same sender-nonce @@ -101,13 +101,25 @@ module.exports = class PendingTransactionTracker extends EventEmitter { })) } - async _resubmitTx (txMeta) { + async _resubmitTx (txMeta, latestBlockNumber) { + if (!txMeta.firstRetryBlockNumber) { + this.emit('tx:block-update', txMeta, latestBlockNumber) + } + if (Date.now() > txMeta.time + this.retryTimePeriod) { const hours = (this.retryTimePeriod / 3.6e+6).toFixed(1) const err = new Error(`Gave up submitting after ${hours} hours.`) return this.emit('tx:failed', txMeta.id, err) } + const firstRetryBlockNumber = txMeta.firstRetryBlockNumber || latestBlockNumber + const txBlockDistance = Number.parseInt(latestBlockNumber, 16) - Number.parseInt(firstRetryBlockNumber, 16) + + const retryCount = txMeta.retryCount || 0 + + // Exponential backoff to limit retries at publishing + if (txBlockDistance <= Math.pow(2, retryCount) - 1) return + // Only auto-submit already-signed txs: if (!('rawTx' in txMeta)) return diff --git a/app/scripts/metamask-controller.js b/app/scripts/metamask-controller.js index 4dce89e3a..018eb2c76 100644 --- a/app/scripts/metamask-controller.js +++ b/app/scripts/metamask-controller.js @@ -3,6 +3,7 @@ const extend = require('xtend') const pump = require('pump') const Dnode = require('dnode') const ObservableStore = require('obs-store') +const asStream = require('obs-store/lib/asStream') const AccountTracker = require('./lib/account-tracker') const EthQuery = require('eth-query') const RpcEngine = require('json-rpc-engine') @@ -31,6 +32,7 @@ const ConfigManager = require('./lib/config-manager') const nodeify = require('./lib/nodeify') const accountImporter = require('./account-import-strategies') const getBuyEthUrl = require('./lib/buy-eth-url') +const Mutex = require('await-semaphore').Mutex const version = require('../manifest.json').version module.exports = class MetamaskController extends EventEmitter { @@ -38,10 +40,12 @@ module.exports = class MetamaskController extends EventEmitter { constructor (opts) { super() + this.sendUpdate = debounce(this.privateSendUpdate.bind(this), 200) this.opts = opts const initState = opts.initState || {} + this.recordFirstTimeInfo(initState) // platform-specific api this.platform = opts.platform @@ -49,6 +53,9 @@ module.exports = class MetamaskController extends EventEmitter { // observable state store this.store = new ObservableStore(initState) + // lock to ensure only one vault created at once + this.createVaultMutex = new Mutex() + // network store this.networkController = new NetworkController(initState.NetworkController) @@ -144,6 +151,8 @@ module.exports = class MetamaskController extends EventEmitter { // notices this.noticeController = new NoticeController({ initState: initState.NoticeController, + version, + firstVersion: initState.firstTimeInfo.version, }) this.noticeController.updateNoticesList() // to be uncommented when retrieving notices from a remote server. @@ -341,6 +350,7 @@ module.exports = class MetamaskController extends EventEmitter { addToken: nodeify(preferencesController.addToken, preferencesController), removeToken: nodeify(preferencesController.removeToken, preferencesController), setCurrentAccountTab: nodeify(preferencesController.setCurrentAccountTab, preferencesController), + setFeatureFlag: nodeify(preferencesController.setFeatureFlag, preferencesController), // AddressController setAddressBook: nodeify(addressBookController.setAddressBook, addressBookController), @@ -453,7 +463,7 @@ module.exports = class MetamaskController extends EventEmitter { setupPublicConfig (outStream) { pump( - this.publicConfigStore, + asStream(this.publicConfigStore), outStream, (err) => { if (err) log.error(err) @@ -469,15 +479,34 @@ module.exports = class MetamaskController extends EventEmitter { // Vault Management // - async createNewVaultAndKeychain (password, cb) { - const vault = await this.keyringController.createNewVaultAndKeychain(password) - this.selectFirstIdentity(vault) + async createNewVaultAndKeychain (password) { + const release = await this.createVaultMutex.acquire() + let vault + + try { + const accounts = await this.keyringController.getAccounts() + + if (accounts.length > 0) { + vault = await this.keyringController.fullUpdate() + + } else { + vault = await this.keyringController.createNewVaultAndKeychain(password) + this.selectFirstIdentity(vault) + } + release() + } catch (err) { + release() + throw err + } + return vault } - async createNewVaultAndRestore (password, seed, cb) { + async createNewVaultAndRestore (password, seed) { + const release = await this.createVaultMutex.acquire() const vault = await this.keyringController.createNewVaultAndRestore(password, seed) this.selectFirstIdentity(vault) + release() return vault } @@ -784,4 +813,13 @@ module.exports = class MetamaskController extends EventEmitter { } } + recordFirstTimeInfo (initState) { + if (!('firstTimeInfo' in initState)) { + initState.firstTimeInfo = { + version, + date: Date.now(), + } + } + } + } diff --git a/app/scripts/migrations/020.js b/app/scripts/migrations/020.js new file mode 100644 index 000000000..8159b3e70 --- /dev/null +++ b/app/scripts/migrations/020.js @@ -0,0 +1,41 @@ +const version = 20 + +/* + +This migration ensures previous installations +get a `firstTimeInfo` key on the metamask state, +so that we can version notices in the future. + +*/ + +const clone = require('clone') + +module.exports = { + version, + + migrate: function (originalVersionedData) { + const versionedData = clone(originalVersionedData) + versionedData.meta.version = version + try { + const state = versionedData.data + const newState = transformState(state) + versionedData.data = newState + } catch (err) { + console.warn(`MetaMask Migration #${version}` + err.stack) + } + return Promise.resolve(versionedData) + }, +} + +function transformState (state) { + const newState = state + if ('metamask' in newState && + !('firstTimeInfo' in newState.metamask)) { + newState.metamask.firstTimeInfo = { + version: '3.12.0', + date: Date.now(), + } + } + return newState +} + diff --git a/app/scripts/migrations/index.js b/app/scripts/migrations/index.js index e9cbd7b98..9d0631042 100644 --- a/app/scripts/migrations/index.js +++ b/app/scripts/migrations/index.js @@ -30,4 +30,5 @@ module.exports = [ require('./017'), require('./018'), require('./019'), + require('./020'), ] diff --git a/app/scripts/notice-controller.js b/app/scripts/notice-controller.js index 57aad40c5..db2b8c4f4 100644 --- a/app/scripts/notice-controller.js +++ b/app/scripts/notice-controller.js @@ -1,13 +1,17 @@ const EventEmitter = require('events').EventEmitter +const semver = require('semver') const extend = require('xtend') const ObservableStore = require('obs-store') const hardCodedNotices = require('../../notices/notices.json') +const uniqBy = require('lodash.uniqby') module.exports = class NoticeController extends EventEmitter { constructor (opts) { super() this.noticePoller = null + this.firstVersion = opts.firstVersion + this.version = opts.version const initState = extend({ noticesList: [], }, opts.initState) @@ -30,9 +34,9 @@ module.exports = class NoticeController extends EventEmitter { return unreadNotices[unreadNotices.length - 1] } - setNoticesList (noticesList) { + async setNoticesList (noticesList) { this.store.updateState({ noticesList }) - return Promise.resolve(true) + return true } markNoticeRead (noticeToMark, cb) { @@ -50,12 +54,14 @@ module.exports = class NoticeController extends EventEmitter { } } - updateNoticesList () { - return this._retrieveNoticeData().then((newNotices) => { - var oldNotices = this.getNoticesList() - var combinedNotices = this._mergeNotices(oldNotices, newNotices) - return Promise.resolve(this.setNoticesList(combinedNotices)) - }) + async updateNoticesList () { + const newNotices = await this._retrieveNoticeData() + const oldNotices = this.getNoticesList() + const combinedNotices = this._mergeNotices(oldNotices, newNotices) + const filteredNotices = this._filterNotices(combinedNotices) + const result = this.setNoticesList(filteredNotices) + this._updateMemstore() + return result } startPolling () { @@ -68,22 +74,30 @@ module.exports = class NoticeController extends EventEmitter { } _mergeNotices (oldNotices, newNotices) { - var noticeMap = this._mapNoticeIds(oldNotices) - newNotices.forEach((notice) => { - if (noticeMap.indexOf(notice.id) === -1) { - oldNotices.push(notice) + return uniqBy(oldNotices.concat(newNotices), 'id') + } + + _filterNotices(notices) { + return notices.filter((newNotice) => { + if ('version' in newNotice) { + const satisfied = semver.satisfies(this.version, newNotice.version) + return satisfied + } + if ('firstVersion' in newNotice) { + const satisfied = semver.satisfies(this.firstVersion, newNotice.firstVersion) + return satisfied } + return true }) - return oldNotices } _mapNoticeIds (notices) { return notices.map((notice) => notice.id) } - _retrieveNoticeData () { + async _retrieveNoticeData () { // Placeholder for the API. - return Promise.resolve(hardCodedNotices) + return hardCodedNotices } _updateMemstore () { diff --git a/app/scripts/popup.js b/app/scripts/popup.js index 5f17f0651..d0952af6a 100644 --- a/app/scripts/popup.js +++ b/app/scripts/popup.js @@ -1,5 +1,6 @@ const injectCss = require('inject-css') -const MetaMaskUiCss = require('../../ui/css') +const OldMetaMaskUiCss = require('../../old-ui/css') +const NewMetaMaskUiCss = require('../../ui/css') const startPopup = require('./popup-core') const PortStream = require('./lib/port-stream.js') const isPopupOrNotification = require('./lib/is-popup-or-notification') @@ -11,10 +12,6 @@ const notificationManager = new NotificationManager() // create platform global global.platform = new ExtensionPlatform() -// inject css -const css = MetaMaskUiCss() -injectCss(css) - // identify window type (popup, notification) const windowType = isPopupOrNotification() global.METAMASK_UI_TYPE = windowType @@ -28,8 +25,21 @@ const connectionStream = new PortStream(extensionPort) const container = document.getElementById('app-content') startPopup({ container, connectionStream }, (err, store) => { if (err) return displayCriticalError(err) + + let betaUIState = store.getState().metamask.featureFlags.betaUI + let css = betaUIState ? NewMetaMaskUiCss() : OldMetaMaskUiCss() + let deleteInjectedCss = injectCss(css) + let newBetaUIState + store.subscribe(() => { const state = store.getState() + newBetaUIState = state.metamask.featureFlags.betaUI + if (newBetaUIState !== betaUIState) { + deleteInjectedCss() + betaUIState = newBetaUIState + css = betaUIState ? NewMetaMaskUiCss() : OldMetaMaskUiCss() + deleteInjectedCss = injectCss(css) + } if (state.appState.shouldClose) notificationManager.closePopup() }) }) diff --git a/gulpfile.js b/gulpfile.js index 620b9b663..195e3f3ca 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -126,11 +126,17 @@ gulp.task('manifest:production', function() { './dist/firefox/manifest.json', './dist/chrome/manifest.json', './dist/edge/manifest.json', + './dist/opera/manifest.json', ],{base: './dist/'}) + + // Exclude chromereload script in production: .pipe(gulpif(!debug,jsoneditor(function(json) { - json.background.scripts = ["scripts/background.js"] + json.background.scripts = json.background.scripts.filter((script) => { + return !script.includes('chromereload') + }) return json }))) + .pipe(gulp.dest('./dist/', { overwrite: true })) }) diff --git a/mascara/src/app/first-time/notice-screen.js b/mascara/src/app/first-time/notice-screen.js index 713f3f242..d09070a95 100644 --- a/mascara/src/app/first-time/notice-screen.js +++ b/mascara/src/app/first-time/notice-screen.js @@ -64,7 +64,7 @@ class NoticeScreen extends Component { <Identicon address={address} diameter={70} /> <div className="tou__title">{title}</div> <Markdown - className="tou__body" + className="tou__body markdown" source={body} skipHtml /> diff --git a/notices/archive/notice_3.md b/notices/archive/notice_3.md new file mode 100644 index 000000000..59dd0f5c7 --- /dev/null +++ b/notices/archive/notice_3.md @@ -0,0 +1,11 @@ +Please take a moment to [back up your seed phrase again](https://support.metamask.io/kb/article/28-abbu-always-be-backed-up-how-to-make-sure-your-12-word-metamask-seed-phrase-is-backed-up). + +MetaMask has become aware of a previous issue where a very small number of users were shown the wrong seed phrase to back up. The only way to protect yourself from this issue, is to back up your seed phrase again now. + +You can follow the guide at this link: + +[https://support.metamask.io/kb/article/28-abbu-always-be-backed-up-how-to-make-sure-your-12-word-metamask-seed-phrase-is-backed-up](https://support.metamask.io/kb/article/28-abbu-always-be-backed-up-how-to-make-sure-your-12-word-metamask-seed-phrase-is-backed-up) + +We have fixed the known issue, but will be issuing ongoing bug bounties to help prevent this kind of problem in the future. + +For more information on this issue, [see this blog post](https://medium.com/metamask/seed-phrase-issue-bounty-awarded-e1986e811021) diff --git a/notices/notice-nonce.json b/notices/notice-nonce.json index e440e5c84..bf0d87ab1 100644 --- a/notices/notice-nonce.json +++ b/notices/notice-nonce.json @@ -1 +1 @@ -3
\ No newline at end of file +4
\ No newline at end of file diff --git a/notices/notices.json b/notices/notices.json index e7f74c925..c1fe64f4e 100644 --- a/notices/notices.json +++ b/notices/notices.json @@ -1 +1 @@ -[{"read":false,"date":"Thu Feb 09 2017","title":"Terms of Use","body":"# Terms of Use #\n\n**THIS AGREEMENT IS SUBJECT TO BINDING ARBITRATION AND A WAIVER OF CLASS ACTION RIGHTS AS DETAILED IN SECTION 13. PLEASE READ THE AGREEMENT CAREFULLY.**\n\n_Our Terms of Use have been updated as of September 5, 2016_\n\n## 1. Acceptance of Terms ##\n\nMetaMask provides a platform for managing Ethereum (or \"ETH\") accounts, and allowing ordinary websites to interact with the Ethereum blockchain, while keeping the user in control over what transactions they approve, through our website located at[ ](http://metamask.io)[https://metamask.io/](https://metamask.io/) and browser plugin (the \"Site\") — which includes text, images, audio, code and other materials (collectively, the “Content”) and all of the features, and services provided. The Site, and any other features, tools, materials, or other services offered from time to time by MetaMask are referred to here as the “Service.” Please read these Terms of Use (the “Terms” or “Terms of Use”) carefully before using the Service. By using or otherwise accessing the Services, or clicking to accept or agree to these Terms where that option is made available, you (1) accept and agree to these Terms (2) consent to the collection, use, disclosure and other handling of information as described in our Privacy Policy and (3) any additional terms, rules and conditions of participation issued by MetaMask from time to time. If you do not agree to the Terms, then you may not access or use the Content or Services.\n\n## 2. Modification of Terms of Use ##\n\nExcept for Section 13, providing for binding arbitration and waiver of class action rights, MetaMask reserves the right, at its sole discretion, to modify or replace the Terms of Use at any time. The most current version of these Terms will be posted on our Site. You shall be responsible for reviewing and becoming familiar with any such modifications. Use of the Services by you after any modification to the Terms constitutes your acceptance of the Terms of Use as modified.\n\n\n\n## 3. Eligibility ##\n\nYou hereby represent and warrant that you are fully able and competent to enter into the terms, conditions, obligations, affirmations, representations and warranties set forth in these Terms and to abide by and comply with these Terms.\n\nMetaMask is a global platform and by accessing the Content or Services, you are representing and warranting that, you are of the legal age of majority in your jurisdiction as is required to access such Services and Content and enter into arrangements as provided by the Service. You further represent that you are otherwise legally permitted to use the service in your jurisdiction including owning cryptographic tokens of value, and interacting with the Services or Content in any way. You further represent you are responsible for ensuring compliance with the laws of your jurisdiction and acknowledge that MetaMask is not liable for your compliance with such laws.\n\n## 4 Account Password and Security ##\n\nWhen setting up an account within MetaMask, you will be responsible for keeping your own account secrets, which may be a twelve-word seed phrase, an account file, or other locally stored secret information. MetaMask encrypts this information locally with a password you provide, that we never send to our servers. You agree to (a) never use the same password for MetaMask that you have ever used outside of this service; (b) keep your secret information and password confidential and do not share them with anyone else; (c) immediately notify MetaMask of any unauthorized use of your account or breach of security. MetaMask cannot and will not be liable for any loss or damage arising from your failure to comply with this section.\n\n## 5. Representations, Warranties, and Risks ##\n\n### 5.1. Warranty Disclaimer ###\n\nYou expressly understand and agree that your use of the Service is at your sole risk. The Service (including the Service and the Content) are provided on an \"AS IS\" and \"as available\" basis, without warranties of any kind, either express or implied, including, without limitation, implied warranties of merchantability, fitness for a particular purpose or non-infringement. You acknowledge that MetaMask has no control over, and no duty to take any action regarding: which users gain access to or use the Service; what effects the Content may have on you; how you may interpret or use the Content; or what actions you may take as a result of having been exposed to the Content. You release MetaMask from all liability for you having acquired or not acquired Content through the Service. MetaMask makes no representations concerning any Content contained in or accessed through the Service, and MetaMask will not be responsible or liable for the accuracy, copyright compliance, legality or decency of material contained in or accessed through the Service.\n\n### 5.2 Sophistication and Risk of Cryptographic Systems ###\n\nBy utilizing the Service or interacting with the Content or platform in any way, you represent that you understand the inherent risks associated with cryptographic systems; and warrant that you have an understanding of the usage and intricacies of native cryptographic tokens, like Ether (ETH) and Bitcoin (BTC), smart contract based tokens such as those that follow the Ethereum Token Standard (https://github.com/ethereum/EIPs/issues/20), and blockchain-based software systems.\n\n### 5.3 Risk of Regulatory Actions in One or More Jurisdictions ###\n\nMetaMask and ETH could be impacted by one or more regulatory inquiries or regulatory action, which could impede or limit the ability of MetaMask to continue to develop, or which could impede or limit your ability to access or use the Service or Ethereum blockchain.\n\n### 5.4 Risk of Weaknesses or Exploits in the Field of Cryptography ###\n\nYou acknowledge and understand that Cryptography is a progressing field. Advances in code cracking or technical advances such as the development of quantum computers may present risks to cryptocurrencies and Services of Content, which could result in the theft or loss of your cryptographic tokens or property. To the extent possible, MetaMask intends to update the protocol underlying Services to account for any advances in cryptography and to incorporate additional security measures, but does not guarantee or otherwise represent full security of the system. By using the Service or accessing Content, you acknowledge these inherent risks.\n\n### 5.5 Volatility of Crypto Currencies ###\n\nYou understand that Ethereum and other blockchain technologies and associated currencies or tokens are highly volatile due to many factors including but not limited to adoption, speculation, technology and security risks. You also acknowledge that the cost of transacting on such technologies is variable and may increase at any time causing impact to any activities taking place on the Ethereum blockchain. You acknowledge these risks and represent that MetaMask cannot be held liable for such fluctuations or increased costs.\n\n### 5.6 Application Security ###\n\nYou acknowledge that Ethereum applications are code subject to flaws and acknowledge that you are solely responsible for evaluating any code provided by the Services or Content and the trustworthiness of any third-party websites, products, smart-contracts, or Content you access or use through the Service. You further expressly acknowledge and represent that Ethereum applications can be written maliciously or negligently, that MetaMask cannot be held liable for your interaction with such applications and that such applications may cause the loss of property or even identity. This warning and others later provided by MetaMask in no way evidence or represent an on-going duty to alert you to all of the potential risks of utilizing the Service or Content.\n\n## 6. Indemnity ##\n\nYou agree to release and to indemnify, defend and hold harmless MetaMask and its parents, subsidiaries, affiliates and agencies, as well as the officers, directors, employees, shareholders and representatives of any of the foregoing entities, from and against any and all losses, liabilities, expenses, damages, costs (including attorneys’ fees and court costs) claims or actions of any kind whatsoever arising or resulting from your use of the Service, your violation of these Terms of Use, and any of your acts or omissions that implicate publicity rights, defamation or invasion of privacy. MetaMask reserves the right, at its own expense, to assume exclusive defense and control of any matter otherwise subject to indemnification by you and, in such case, you agree to cooperate with MetaMask in the defense of such matter.\n\n## 7. Limitation on liability ##\n\nYOU ACKNOWLEDGE AND AGREE THAT YOU ASSUME FULL RESPONSIBILITY FOR YOUR USE OF THE SITE AND SERVICE. YOU ACKNOWLEDGE AND AGREE THAT ANY INFORMATION YOU SEND OR RECEIVE DURING YOUR USE OF THE SITE AND SERVICE MAY NOT BE SECURE AND MAY BE INTERCEPTED OR LATER ACQUIRED BY UNAUTHORIZED PARTIES. YOU ACKNOWLEDGE AND AGREE THAT YOUR USE OF THE SITE AND SERVICE IS AT YOUR OWN RISK. RECOGNIZING SUCH, YOU UNDERSTAND AND AGREE THAT, TO THE FULLEST EXTENT PERMITTED BY APPLICABLE LAW, NEITHER METAMASK NOR ITS SUPPLIERS OR LICENSORS WILL BE LIABLE TO YOU FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY OR OTHER DAMAGES OF ANY KIND, INCLUDING WITHOUT LIMITATION DAMAGES FOR LOSS OF PROFITS, GOODWILL, USE, DATA OR OTHER TANGIBLE OR INTANGIBLE LOSSES OR ANY OTHER DAMAGES BASED ON CONTRACT, TORT, STRICT LIABILITY OR ANY OTHER THEORY (EVEN IF METAMASK HAD BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES), RESULTING FROM THE SITE OR SERVICE; THE USE OR THE INABILITY TO USE THE SITE OR SERVICE; UNAUTHORIZED ACCESS TO OR ALTERATION OF YOUR TRANSMISSIONS OR DATA; STATEMENTS OR CONDUCT OF ANY THIRD PARTY ON THE SITE OR SERVICE; ANY ACTIONS WE TAKE OR FAIL TO TAKE AS A RESULT OF COMMUNICATIONS YOU SEND TO US; HUMAN ERRORS; TECHNICAL MALFUNCTIONS; FAILURES, INCLUDING PUBLIC UTILITY OR TELEPHONE OUTAGES; OMISSIONS, INTERRUPTIONS, LATENCY, DELETIONS OR DEFECTS OF ANY DEVICE OR NETWORK, PROVIDERS, OR SOFTWARE (INCLUDING, BUT NOT LIMITED TO, THOSE THAT DO NOT PERMIT PARTICIPATION IN THE SERVICE); ANY INJURY OR DAMAGE TO COMPUTER EQUIPMENT; INABILITY TO FULLY ACCESS THE SITE OR SERVICE OR ANY OTHER WEBSITE; THEFT, TAMPERING, DESTRUCTION, OR UNAUTHORIZED ACCESS TO, IMAGES OR OTHER CONTENT OF ANY KIND; DATA THAT IS PROCESSED LATE OR INCORRECTLY OR IS INCOMPLETE OR LOST; TYPOGRAPHICAL, PRINTING OR OTHER ERRORS, OR ANY COMBINATION THEREOF; OR ANY OTHER MATTER RELATING TO THE SITE OR SERVICE.\n\nSOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF CERTAIN WARRANTIES OR THE LIMITATION OR EXCLUSION OF LIABILITY FOR INCIDENTAL OR CONSEQUENTIAL DAMAGES. ACCORDINGLY, SOME OF THE ABOVE LIMITATIONS MAY NOT APPLY TO YOU.\n\n## 8. Our Proprietary Rights ##\n\nAll title, ownership and intellectual property rights in and to the Service are owned by MetaMask or its licensors. You acknowledge and agree that the Service contains proprietary and confidential information that is protected by applicable intellectual property and other laws. Except as expressly authorized by MetaMask, you agree not to copy, modify, rent, lease, loan, sell, distribute, perform, display or create derivative works based on the Service, in whole or in part. MetaMask issues a license for MetaMask, found [here](https://github.com/MetaMask/metamask-plugin/blob/master/LICENSE). For information on other licenses utilized in the development of MetaMask, please see our attribution page at: [https://metamask.io/attributions.html](https://metamask.io/attributions.html)\n\n## 9. Links ##\n\nThe Service provides, or third parties may provide, links to other World Wide Web or accessible sites, applications or resources. Because MetaMask has no control over such sites, applications and resources, you acknowledge and agree that MetaMask is not responsible for the availability of such external sites, applications or resources, and does not endorse and is not responsible or liable for any content, advertising, products or other materials on or available from such sites or resources. You further acknowledge and agree that MetaMask shall not be responsible or liable, directly or indirectly, for any damage or loss caused or alleged to be caused by or in connection with use of or reliance on any such content, goods or services available on or through any such site or resource.\n\n## 10. Termination and Suspension ##\n\nMetaMask may terminate or suspend all or part of the Service and your MetaMask access immediately, without prior notice or liability, if you breach any of the terms or conditions of the Terms. Upon termination of your access, your right to use the Service will immediately cease.\n\nThe following provisions of the Terms survive any termination of these Terms: INDEMNITY; WARRANTY DISCLAIMERS; LIMITATION ON LIABILITY; OUR PROPRIETARY RIGHTS; LINKS; TERMINATION; NO THIRD PARTY BENEFICIARIES; BINDING ARBITRATION AND CLASS ACTION WAIVER; GENERAL INFORMATION.\n\n## 11. No Third Party Beneficiaries ##\n\nYou agree that, except as otherwise expressly provided in these Terms, there shall be no third party beneficiaries to the Terms.\n\n## 12. Notice and Procedure For Making Claims of Copyright Infringement ##\n\nIf you believe that your copyright or the copyright of a person on whose behalf you are authorized to act has been infringed, please provide MetaMask’s Copyright Agent a written Notice containing the following information:\n\n· an electronic or physical signature of the person authorized to act on behalf of the owner of the copyright or other intellectual property interest;\n\n· a description of the copyrighted work or other intellectual property that you claim has been infringed;\n\n· a description of where the material that you claim is infringing is located on the Service;\n\n· your address, telephone number, and email address;\n\n· a statement by you that you have a good faith belief that the disputed use is not authorized by the copyright owner, its agent, or the law;\n\n· a statement by you, made under penalty of perjury, that the above information in your Notice is accurate and that you are the copyright or intellectual property owner or authorized to act on the copyright or intellectual property owner's behalf.\n\nMetaMask’s Copyright Agent can be reached at:\n\nEmail: copyright [at] metamask [dot] io\n\nMail:\n\nAttention:\n\nMetaMask Copyright ℅ ConsenSys\n\n49 Bogart Street\n\nBrooklyn, NY 11206\n\n## 13. Binding Arbitration and Class Action Waiver ##\n\nPLEASE READ THIS SECTION CAREFULLY – IT MAY SIGNIFICANTLY AFFECT YOUR LEGAL RIGHTS, INCLUDING YOUR RIGHT TO FILE A LAWSUIT IN COURT\n\n### 13.1 Initial Dispute Resolution ###\n\nThe parties shall use their best efforts to engage directly to settle any dispute, claim, question, or disagreement and engage in good faith negotiations which shall be a condition to either party initiating a lawsuit or arbitration.\n\n### 13.2 Binding Arbitration ###\n\nIf the parties do not reach an agreed upon solution within a period of 30 days from the time informal dispute resolution under the Initial Dispute Resolution provision begins, then either party may initiate binding arbitration as the sole means to resolve claims, subject to the terms set forth below. Specifically, all claims arising out of or relating to these Terms (including their formation, performance and breach), the parties’ relationship with each other and/or your use of the Service shall be finally settled by binding arbitration administered by the American Arbitration Association in accordance with the provisions of its Commercial Arbitration Rules and the supplementary procedures for consumer related disputes of the American Arbitration Association (the \"AAA\"), excluding any rules or procedures governing or permitting class actions.\n\nThe arbitrator, and not any federal, state or local court or agency, shall have exclusive authority to resolve all disputes arising out of or relating to the interpretation, applicability, enforceability or formation of these Terms, including, but not limited to any claim that all or any part of these Terms are void or voidable, or whether a claim is subject to arbitration. The arbitrator shall be empowered to grant whatever relief would be available in a court under law or in equity. The arbitrator’s award shall be written, and binding on the parties and may be entered as a judgment in any court of competent jurisdiction.\n\nThe parties understand that, absent this mandatory provision, they would have the right to sue in court and have a jury trial. They further understand that, in some instances, the costs of arbitration could exceed the costs of litigation and the right to discovery may be more limited in arbitration than in court.\n\n### 13.3 Location ###\n\nBinding arbitration shall take place in New York. You agree to submit to the personal jurisdiction of any federal or state court in New York County, New York, in order to compel arbitration, to stay proceedings pending arbitration, or to confirm, modify, vacate or enter judgment on the award entered by the arbitrator.\n\n### 13.4 Class Action Waiver ###\n\nThe parties further agree that any arbitration shall be conducted in their individual capacities only and not as a class action or other representative action, and the parties expressly waive their right to file a class action or seek relief on a class basis. YOU AND METAMASK AGREE THAT EACH MAY BRING CLAIMS AGAINST THE OTHER ONLY IN YOUR OR ITS INDIVIDUAL CAPACITY, AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED CLASS OR REPRESENTATIVE PROCEEDING. If any court or arbitrator determines that the class action waiver set forth in this paragraph is void or unenforceable for any reason or that an arbitration can proceed on a class basis, then the arbitration provision set forth above shall be deemed null and void in its entirety and the parties shall be deemed to have not agreed to arbitrate disputes.\n\n### 13.5 Exception - Litigation of Intellectual Property and Small Claims Court Claims ###\n\nNotwithstanding the parties' decision to resolve all disputes through arbitration, either party may bring an action in state or federal court to protect its intellectual property rights (\"intellectual property rights\" means patents, copyrights, moral rights, trademarks, and trade secrets, but not privacy or publicity rights). Either party may also seek relief in a small claims court for disputes or claims within the scope of that court’s jurisdiction.\n\n### 13.6 30-Day Right to Opt Out ###\n\nYou have the right to opt-out and not be bound by the arbitration and class action waiver provisions set forth above by sending written notice of your decision to opt-out to the following address: MetaMask ℅ ConsenSys, 49 Bogart Street, Brooklyn NY 11206 and via email at legal-opt@metamask.io. The notice must be sent within 30 days of September 6, 2016 or your first use of the Service, whichever is later, otherwise you shall be bound to arbitrate disputes in accordance with the terms of those paragraphs. If you opt-out of these arbitration provisions, MetaMask also will not be bound by them.\n\n### 13.7 Changes to This Section ###\n\nMetaMask will provide 60-days’ notice of any changes to this section. Changes will become effective on the 60th day, and will apply prospectively only to any claims arising after the 60th day.\n\nFor any dispute not subject to arbitration you and MetaMask agree to submit to the personal and exclusive jurisdiction of and venue in the federal and state courts located in New York, New York. You further agree to accept service of process by mail, and hereby waive any and all jurisdictional and venue defenses otherwise available.\n\nThe Terms and the relationship between you and MetaMask shall be governed by the laws of the State of New York without regard to conflict of law provisions.\n\n## 14. General Information ##\n\n### 14.1 Entire Agreement ###\n\nThese Terms (and any additional terms, rules and conditions of participation that MetaMask may post on the Service) constitute the entire agreement between you and MetaMask with respect to the Service and supersedes any prior agreements, oral or written, between you and MetaMask. In the event of a conflict between these Terms and the additional terms, rules and conditions of participation, the latter will prevail over the Terms to the extent of the conflict.\n\n### 14.2 Waiver and Severability of Terms ###\n\nThe failure of MetaMask to exercise or enforce any right or provision of the Terms shall not constitute a waiver of such right or provision. If any provision of the Terms is found by an arbitrator or court of competent jurisdiction to be invalid, the parties nevertheless agree that the arbitrator or court should endeavor to give effect to the parties' intentions as reflected in the provision, and the other provisions of the Terms remain in full force and effect.\n\n### 14.3 Statute of Limitations ###\n\nYou agree that regardless of any statute or law to the contrary, any claim or cause of action arising out of or related to the use of the Service or the Terms must be filed within one (1) year after such claim or cause of action arose or be forever barred.\n\n### 14.4 Section Titles ###\n\nThe section titles in the Terms are for convenience only and have no legal or contractual effect.\n\n### 14.5 Communications ###\n\nUsers with questions, complaints or claims with respect to the Service may contact us using the relevant contact information set forth above and at communications@metamask.io.\n\n## 15 Related Links ##\n\n**[Terms of Use](https://metamask.io/terms.html)**\n\n**[Privacy](https://metamask.io/privacy.html)**\n\n**[Attributions](https://metamask.io/attributions.html)**\n\n","id":0},{"read":false,"date":"Mon May 08 2017","title":"Privacy Notice","body":"MetaMask is beta software. \n\nWhen you log in to MetaMask, your current account is visible to every new site you visit.\n\nFor your privacy, for now, please sign out of MetaMask when you're done using a site.\n\nAlso, by default, you will be signed in to a test network. To use real Ether, you must connect to the main network manually in the top left network menu.\n\n","id":2}]
\ No newline at end of file +[{"read":false,"date":"Thu Feb 09 2017","title":"Terms of Use","body":"# Terms of Use #\n\n**THIS AGREEMENT IS SUBJECT TO BINDING ARBITRATION AND A WAIVER OF CLASS ACTION RIGHTS AS DETAILED IN SECTION 13. PLEASE READ THE AGREEMENT CAREFULLY.**\n\n_Our Terms of Use have been updated as of September 5, 2016_\n\n## 1. Acceptance of Terms ##\n\nMetaMask provides a platform for managing Ethereum (or \"ETH\") accounts, and allowing ordinary websites to interact with the Ethereum blockchain, while keeping the user in control over what transactions they approve, through our website located at[ ](http://metamask.io)[https://metamask.io/](https://metamask.io/) and browser plugin (the \"Site\") — which includes text, images, audio, code and other materials (collectively, the “Content”) and all of the features, and services provided. The Site, and any other features, tools, materials, or other services offered from time to time by MetaMask are referred to here as the “Service.” Please read these Terms of Use (the “Terms” or “Terms of Use”) carefully before using the Service. By using or otherwise accessing the Services, or clicking to accept or agree to these Terms where that option is made available, you (1) accept and agree to these Terms (2) consent to the collection, use, disclosure and other handling of information as described in our Privacy Policy and (3) any additional terms, rules and conditions of participation issued by MetaMask from time to time. If you do not agree to the Terms, then you may not access or use the Content or Services.\n\n## 2. Modification of Terms of Use ##\n\nExcept for Section 13, providing for binding arbitration and waiver of class action rights, MetaMask reserves the right, at its sole discretion, to modify or replace the Terms of Use at any time. The most current version of these Terms will be posted on our Site. You shall be responsible for reviewing and becoming familiar with any such modifications. Use of the Services by you after any modification to the Terms constitutes your acceptance of the Terms of Use as modified.\n\n\n\n## 3. Eligibility ##\n\nYou hereby represent and warrant that you are fully able and competent to enter into the terms, conditions, obligations, affirmations, representations and warranties set forth in these Terms and to abide by and comply with these Terms.\n\nMetaMask is a global platform and by accessing the Content or Services, you are representing and warranting that, you are of the legal age of majority in your jurisdiction as is required to access such Services and Content and enter into arrangements as provided by the Service. You further represent that you are otherwise legally permitted to use the service in your jurisdiction including owning cryptographic tokens of value, and interacting with the Services or Content in any way. You further represent you are responsible for ensuring compliance with the laws of your jurisdiction and acknowledge that MetaMask is not liable for your compliance with such laws.\n\n## 4 Account Password and Security ##\n\nWhen setting up an account within MetaMask, you will be responsible for keeping your own account secrets, which may be a twelve-word seed phrase, an account file, or other locally stored secret information. MetaMask encrypts this information locally with a password you provide, that we never send to our servers. You agree to (a) never use the same password for MetaMask that you have ever used outside of this service; (b) keep your secret information and password confidential and do not share them with anyone else; (c) immediately notify MetaMask of any unauthorized use of your account or breach of security. MetaMask cannot and will not be liable for any loss or damage arising from your failure to comply with this section.\n\n## 5. Representations, Warranties, and Risks ##\n\n### 5.1. Warranty Disclaimer ###\n\nYou expressly understand and agree that your use of the Service is at your sole risk. The Service (including the Service and the Content) are provided on an \"AS IS\" and \"as available\" basis, without warranties of any kind, either express or implied, including, without limitation, implied warranties of merchantability, fitness for a particular purpose or non-infringement. You acknowledge that MetaMask has no control over, and no duty to take any action regarding: which users gain access to or use the Service; what effects the Content may have on you; how you may interpret or use the Content; or what actions you may take as a result of having been exposed to the Content. You release MetaMask from all liability for you having acquired or not acquired Content through the Service. MetaMask makes no representations concerning any Content contained in or accessed through the Service, and MetaMask will not be responsible or liable for the accuracy, copyright compliance, legality or decency of material contained in or accessed through the Service.\n\n### 5.2 Sophistication and Risk of Cryptographic Systems ###\n\nBy utilizing the Service or interacting with the Content or platform in any way, you represent that you understand the inherent risks associated with cryptographic systems; and warrant that you have an understanding of the usage and intricacies of native cryptographic tokens, like Ether (ETH) and Bitcoin (BTC), smart contract based tokens such as those that follow the Ethereum Token Standard (https://github.com/ethereum/EIPs/issues/20), and blockchain-based software systems.\n\n### 5.3 Risk of Regulatory Actions in One or More Jurisdictions ###\n\nMetaMask and ETH could be impacted by one or more regulatory inquiries or regulatory action, which could impede or limit the ability of MetaMask to continue to develop, or which could impede or limit your ability to access or use the Service or Ethereum blockchain.\n\n### 5.4 Risk of Weaknesses or Exploits in the Field of Cryptography ###\n\nYou acknowledge and understand that Cryptography is a progressing field. Advances in code cracking or technical advances such as the development of quantum computers may present risks to cryptocurrencies and Services of Content, which could result in the theft or loss of your cryptographic tokens or property. To the extent possible, MetaMask intends to update the protocol underlying Services to account for any advances in cryptography and to incorporate additional security measures, but does not guarantee or otherwise represent full security of the system. By using the Service or accessing Content, you acknowledge these inherent risks.\n\n### 5.5 Volatility of Crypto Currencies ###\n\nYou understand that Ethereum and other blockchain technologies and associated currencies or tokens are highly volatile due to many factors including but not limited to adoption, speculation, technology and security risks. You also acknowledge that the cost of transacting on such technologies is variable and may increase at any time causing impact to any activities taking place on the Ethereum blockchain. You acknowledge these risks and represent that MetaMask cannot be held liable for such fluctuations or increased costs.\n\n### 5.6 Application Security ###\n\nYou acknowledge that Ethereum applications are code subject to flaws and acknowledge that you are solely responsible for evaluating any code provided by the Services or Content and the trustworthiness of any third-party websites, products, smart-contracts, or Content you access or use through the Service. You further expressly acknowledge and represent that Ethereum applications can be written maliciously or negligently, that MetaMask cannot be held liable for your interaction with such applications and that such applications may cause the loss of property or even identity. This warning and others later provided by MetaMask in no way evidence or represent an on-going duty to alert you to all of the potential risks of utilizing the Service or Content.\n\n## 6. Indemnity ##\n\nYou agree to release and to indemnify, defend and hold harmless MetaMask and its parents, subsidiaries, affiliates and agencies, as well as the officers, directors, employees, shareholders and representatives of any of the foregoing entities, from and against any and all losses, liabilities, expenses, damages, costs (including attorneys’ fees and court costs) claims or actions of any kind whatsoever arising or resulting from your use of the Service, your violation of these Terms of Use, and any of your acts or omissions that implicate publicity rights, defamation or invasion of privacy. MetaMask reserves the right, at its own expense, to assume exclusive defense and control of any matter otherwise subject to indemnification by you and, in such case, you agree to cooperate with MetaMask in the defense of such matter.\n\n## 7. Limitation on liability ##\n\nYOU ACKNOWLEDGE AND AGREE THAT YOU ASSUME FULL RESPONSIBILITY FOR YOUR USE OF THE SITE AND SERVICE. YOU ACKNOWLEDGE AND AGREE THAT ANY INFORMATION YOU SEND OR RECEIVE DURING YOUR USE OF THE SITE AND SERVICE MAY NOT BE SECURE AND MAY BE INTERCEPTED OR LATER ACQUIRED BY UNAUTHORIZED PARTIES. YOU ACKNOWLEDGE AND AGREE THAT YOUR USE OF THE SITE AND SERVICE IS AT YOUR OWN RISK. RECOGNIZING SUCH, YOU UNDERSTAND AND AGREE THAT, TO THE FULLEST EXTENT PERMITTED BY APPLICABLE LAW, NEITHER METAMASK NOR ITS SUPPLIERS OR LICENSORS WILL BE LIABLE TO YOU FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY OR OTHER DAMAGES OF ANY KIND, INCLUDING WITHOUT LIMITATION DAMAGES FOR LOSS OF PROFITS, GOODWILL, USE, DATA OR OTHER TANGIBLE OR INTANGIBLE LOSSES OR ANY OTHER DAMAGES BASED ON CONTRACT, TORT, STRICT LIABILITY OR ANY OTHER THEORY (EVEN IF METAMASK HAD BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES), RESULTING FROM THE SITE OR SERVICE; THE USE OR THE INABILITY TO USE THE SITE OR SERVICE; UNAUTHORIZED ACCESS TO OR ALTERATION OF YOUR TRANSMISSIONS OR DATA; STATEMENTS OR CONDUCT OF ANY THIRD PARTY ON THE SITE OR SERVICE; ANY ACTIONS WE TAKE OR FAIL TO TAKE AS A RESULT OF COMMUNICATIONS YOU SEND TO US; HUMAN ERRORS; TECHNICAL MALFUNCTIONS; FAILURES, INCLUDING PUBLIC UTILITY OR TELEPHONE OUTAGES; OMISSIONS, INTERRUPTIONS, LATENCY, DELETIONS OR DEFECTS OF ANY DEVICE OR NETWORK, PROVIDERS, OR SOFTWARE (INCLUDING, BUT NOT LIMITED TO, THOSE THAT DO NOT PERMIT PARTICIPATION IN THE SERVICE); ANY INJURY OR DAMAGE TO COMPUTER EQUIPMENT; INABILITY TO FULLY ACCESS THE SITE OR SERVICE OR ANY OTHER WEBSITE; THEFT, TAMPERING, DESTRUCTION, OR UNAUTHORIZED ACCESS TO, IMAGES OR OTHER CONTENT OF ANY KIND; DATA THAT IS PROCESSED LATE OR INCORRECTLY OR IS INCOMPLETE OR LOST; TYPOGRAPHICAL, PRINTING OR OTHER ERRORS, OR ANY COMBINATION THEREOF; OR ANY OTHER MATTER RELATING TO THE SITE OR SERVICE.\n\nSOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF CERTAIN WARRANTIES OR THE LIMITATION OR EXCLUSION OF LIABILITY FOR INCIDENTAL OR CONSEQUENTIAL DAMAGES. ACCORDINGLY, SOME OF THE ABOVE LIMITATIONS MAY NOT APPLY TO YOU.\n\n## 8. Our Proprietary Rights ##\n\nAll title, ownership and intellectual property rights in and to the Service are owned by MetaMask or its licensors. You acknowledge and agree that the Service contains proprietary and confidential information that is protected by applicable intellectual property and other laws. Except as expressly authorized by MetaMask, you agree not to copy, modify, rent, lease, loan, sell, distribute, perform, display or create derivative works based on the Service, in whole or in part. MetaMask issues a license for MetaMask, found [here](https://github.com/MetaMask/metamask-plugin/blob/master/LICENSE). For information on other licenses utilized in the development of MetaMask, please see our attribution page at: [https://metamask.io/attributions.html](https://metamask.io/attributions.html)\n\n## 9. Links ##\n\nThe Service provides, or third parties may provide, links to other World Wide Web or accessible sites, applications or resources. Because MetaMask has no control over such sites, applications and resources, you acknowledge and agree that MetaMask is not responsible for the availability of such external sites, applications or resources, and does not endorse and is not responsible or liable for any content, advertising, products or other materials on or available from such sites or resources. You further acknowledge and agree that MetaMask shall not be responsible or liable, directly or indirectly, for any damage or loss caused or alleged to be caused by or in connection with use of or reliance on any such content, goods or services available on or through any such site or resource.\n\n## 10. Termination and Suspension ##\n\nMetaMask may terminate or suspend all or part of the Service and your MetaMask access immediately, without prior notice or liability, if you breach any of the terms or conditions of the Terms. Upon termination of your access, your right to use the Service will immediately cease.\n\nThe following provisions of the Terms survive any termination of these Terms: INDEMNITY; WARRANTY DISCLAIMERS; LIMITATION ON LIABILITY; OUR PROPRIETARY RIGHTS; LINKS; TERMINATION; NO THIRD PARTY BENEFICIARIES; BINDING ARBITRATION AND CLASS ACTION WAIVER; GENERAL INFORMATION.\n\n## 11. No Third Party Beneficiaries ##\n\nYou agree that, except as otherwise expressly provided in these Terms, there shall be no third party beneficiaries to the Terms.\n\n## 12. Notice and Procedure For Making Claims of Copyright Infringement ##\n\nIf you believe that your copyright or the copyright of a person on whose behalf you are authorized to act has been infringed, please provide MetaMask’s Copyright Agent a written Notice containing the following information:\n\n· an electronic or physical signature of the person authorized to act on behalf of the owner of the copyright or other intellectual property interest;\n\n· a description of the copyrighted work or other intellectual property that you claim has been infringed;\n\n· a description of where the material that you claim is infringing is located on the Service;\n\n· your address, telephone number, and email address;\n\n· a statement by you that you have a good faith belief that the disputed use is not authorized by the copyright owner, its agent, or the law;\n\n· a statement by you, made under penalty of perjury, that the above information in your Notice is accurate and that you are the copyright or intellectual property owner or authorized to act on the copyright or intellectual property owner's behalf.\n\nMetaMask’s Copyright Agent can be reached at:\n\nEmail: copyright [at] metamask [dot] io\n\nMail:\n\nAttention:\n\nMetaMask Copyright ℅ ConsenSys\n\n49 Bogart Street\n\nBrooklyn, NY 11206\n\n## 13. Binding Arbitration and Class Action Waiver ##\n\nPLEASE READ THIS SECTION CAREFULLY – IT MAY SIGNIFICANTLY AFFECT YOUR LEGAL RIGHTS, INCLUDING YOUR RIGHT TO FILE A LAWSUIT IN COURT\n\n### 13.1 Initial Dispute Resolution ###\n\nThe parties shall use their best efforts to engage directly to settle any dispute, claim, question, or disagreement and engage in good faith negotiations which shall be a condition to either party initiating a lawsuit or arbitration.\n\n### 13.2 Binding Arbitration ###\n\nIf the parties do not reach an agreed upon solution within a period of 30 days from the time informal dispute resolution under the Initial Dispute Resolution provision begins, then either party may initiate binding arbitration as the sole means to resolve claims, subject to the terms set forth below. Specifically, all claims arising out of or relating to these Terms (including their formation, performance and breach), the parties’ relationship with each other and/or your use of the Service shall be finally settled by binding arbitration administered by the American Arbitration Association in accordance with the provisions of its Commercial Arbitration Rules and the supplementary procedures for consumer related disputes of the American Arbitration Association (the \"AAA\"), excluding any rules or procedures governing or permitting class actions.\n\nThe arbitrator, and not any federal, state or local court or agency, shall have exclusive authority to resolve all disputes arising out of or relating to the interpretation, applicability, enforceability or formation of these Terms, including, but not limited to any claim that all or any part of these Terms are void or voidable, or whether a claim is subject to arbitration. The arbitrator shall be empowered to grant whatever relief would be available in a court under law or in equity. The arbitrator’s award shall be written, and binding on the parties and may be entered as a judgment in any court of competent jurisdiction.\n\nThe parties understand that, absent this mandatory provision, they would have the right to sue in court and have a jury trial. They further understand that, in some instances, the costs of arbitration could exceed the costs of litigation and the right to discovery may be more limited in arbitration than in court.\n\n### 13.3 Location ###\n\nBinding arbitration shall take place in New York. You agree to submit to the personal jurisdiction of any federal or state court in New York County, New York, in order to compel arbitration, to stay proceedings pending arbitration, or to confirm, modify, vacate or enter judgment on the award entered by the arbitrator.\n\n### 13.4 Class Action Waiver ###\n\nThe parties further agree that any arbitration shall be conducted in their individual capacities only and not as a class action or other representative action, and the parties expressly waive their right to file a class action or seek relief on a class basis. YOU AND METAMASK AGREE THAT EACH MAY BRING CLAIMS AGAINST THE OTHER ONLY IN YOUR OR ITS INDIVIDUAL CAPACITY, AND NOT AS A PLAINTIFF OR CLASS MEMBER IN ANY PURPORTED CLASS OR REPRESENTATIVE PROCEEDING. If any court or arbitrator determines that the class action waiver set forth in this paragraph is void or unenforceable for any reason or that an arbitration can proceed on a class basis, then the arbitration provision set forth above shall be deemed null and void in its entirety and the parties shall be deemed to have not agreed to arbitrate disputes.\n\n### 13.5 Exception - Litigation of Intellectual Property and Small Claims Court Claims ###\n\nNotwithstanding the parties' decision to resolve all disputes through arbitration, either party may bring an action in state or federal court to protect its intellectual property rights (\"intellectual property rights\" means patents, copyrights, moral rights, trademarks, and trade secrets, but not privacy or publicity rights). Either party may also seek relief in a small claims court for disputes or claims within the scope of that court’s jurisdiction.\n\n### 13.6 30-Day Right to Opt Out ###\n\nYou have the right to opt-out and not be bound by the arbitration and class action waiver provisions set forth above by sending written notice of your decision to opt-out to the following address: MetaMask ℅ ConsenSys, 49 Bogart Street, Brooklyn NY 11206 and via email at legal-opt@metamask.io. The notice must be sent within 30 days of September 6, 2016 or your first use of the Service, whichever is later, otherwise you shall be bound to arbitrate disputes in accordance with the terms of those paragraphs. If you opt-out of these arbitration provisions, MetaMask also will not be bound by them.\n\n### 13.7 Changes to This Section ###\n\nMetaMask will provide 60-days’ notice of any changes to this section. Changes will become effective on the 60th day, and will apply prospectively only to any claims arising after the 60th day.\n\nFor any dispute not subject to arbitration you and MetaMask agree to submit to the personal and exclusive jurisdiction of and venue in the federal and state courts located in New York, New York. You further agree to accept service of process by mail, and hereby waive any and all jurisdictional and venue defenses otherwise available.\n\nThe Terms and the relationship between you and MetaMask shall be governed by the laws of the State of New York without regard to conflict of law provisions.\n\n## 14. General Information ##\n\n### 14.1 Entire Agreement ###\n\nThese Terms (and any additional terms, rules and conditions of participation that MetaMask may post on the Service) constitute the entire agreement between you and MetaMask with respect to the Service and supersedes any prior agreements, oral or written, between you and MetaMask. In the event of a conflict between these Terms and the additional terms, rules and conditions of participation, the latter will prevail over the Terms to the extent of the conflict.\n\n### 14.2 Waiver and Severability of Terms ###\n\nThe failure of MetaMask to exercise or enforce any right or provision of the Terms shall not constitute a waiver of such right or provision. If any provision of the Terms is found by an arbitrator or court of competent jurisdiction to be invalid, the parties nevertheless agree that the arbitrator or court should endeavor to give effect to the parties' intentions as reflected in the provision, and the other provisions of the Terms remain in full force and effect.\n\n### 14.3 Statute of Limitations ###\n\nYou agree that regardless of any statute or law to the contrary, any claim or cause of action arising out of or related to the use of the Service or the Terms must be filed within one (1) year after such claim or cause of action arose or be forever barred.\n\n### 14.4 Section Titles ###\n\nThe section titles in the Terms are for convenience only and have no legal or contractual effect.\n\n### 14.5 Communications ###\n\nUsers with questions, complaints or claims with respect to the Service may contact us using the relevant contact information set forth above and at communications@metamask.io.\n\n## 15 Related Links ##\n\n**[Terms of Use](https://metamask.io/terms.html)**\n\n**[Privacy](https://metamask.io/privacy.html)**\n\n**[Attributions](https://metamask.io/attributions.html)**\n\n","id":0},{"read":false,"date":"Mon May 08 2017","title":"Privacy Notice","body":"MetaMask is beta software. \n\nWhen you log in to MetaMask, your current account is visible to every new site you visit.\n\nFor your privacy, for now, please sign out of MetaMask when you're done using a site.\n\nAlso, by default, you will be signed in to a test network. To use real Ether, you must connect to the main network manually in the top left network menu.\n\n","id":2},{"read":false,"date":"Tue Nov 28 2017","title":"Seed Phrase Alert","firstVersion":"<=3.12.0","body":"Please take a moment to [back up your seed phrase again](https://support.metamask.io/kb/article/28-abbu-always-be-backed-up-how-to-make-sure-your-12-word-metamask-seed-phrase-is-backed-up).\n\nMetaMask has become aware of a previous issue where a very small number of users were shown the wrong seed phrase to back up. The only way to protect yourself from this issue, is to back up your seed phrase again now.\n\nYou can follow the guide at this link:\n\n[https://support.metamask.io/kb/article/28-abbu-always-be-backed-up-how-to-make-sure-your-12-word-metamask-seed-phrase-is-backed-up](https://support.metamask.io/kb/article/28-abbu-always-be-backed-up-how-to-make-sure-your-12-word-metamask-seed-phrase-is-backed-up)\n\nWe have fixed the known issue, but will be issuing ongoing bug bounties to help prevent this kind of problem in the future.\n\nFor more information on this issue, [see this blog post](https://medium.com/metamask/seed-phrase-issue-bounty-awarded-e1986e811021)","id":3}] diff --git a/old-ui/.gitignore b/old-ui/.gitignore new file mode 100644 index 000000000..c6b1254b5 --- /dev/null +++ b/old-ui/.gitignore @@ -0,0 +1,66 @@ + +# Created by https://www.gitignore.io/api/osx,node + +### OSX ### +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon
+ +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + + +### Node ### +# Logs +logs +*.log +npm-debug.log* + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release + +# Dependency directory +# https://docs.npmjs.com/misc/faq#should-i-check-my-node-modules-folder-into-git +node_modules + +# Optional npm cache directory +.npm + +# Optional REPL history +.node_repl_history + diff --git a/old-ui/app/account-detail.js b/old-ui/app/account-detail.js new file mode 100644 index 000000000..933f6d6a4 --- /dev/null +++ b/old-ui/app/account-detail.js @@ -0,0 +1,291 @@ +const inherits = require('util').inherits +const extend = require('xtend') +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const actions = require('../../ui/app/actions') +const valuesFor = require('./util').valuesFor +const Identicon = require('./components/identicon') +const EthBalance = require('./components/eth-balance') +const TransactionList = require('./components/transaction-list') +const ExportAccountView = require('./components/account-export') +const ethUtil = require('ethereumjs-util') +const EditableLabel = require('./components/editable-label') +const TabBar = require('./components/tab-bar') +const TokenList = require('./components/token-list') +const AccountDropdowns = require('./components/account-dropdowns').AccountDropdowns + +module.exports = connect(mapStateToProps)(AccountDetailScreen) + +function mapStateToProps (state) { + return { + metamask: state.metamask, + identities: state.metamask.identities, + accounts: state.metamask.accounts, + address: state.metamask.selectedAddress, + accountDetail: state.appState.accountDetail, + network: state.metamask.network, + unapprovedMsgs: valuesFor(state.metamask.unapprovedMsgs), + shapeShiftTxList: state.metamask.shapeShiftTxList, + transactions: state.metamask.selectedAddressTxList || [], + conversionRate: state.metamask.conversionRate, + currentCurrency: state.metamask.currentCurrency, + currentAccountTab: state.metamask.currentAccountTab, + tokens: state.metamask.tokens, + computedBalances: state.metamask.computedBalances, + } +} + +inherits(AccountDetailScreen, Component) +function AccountDetailScreen () { + Component.call(this) +} + +AccountDetailScreen.prototype.render = function () { + var props = this.props + var selected = props.address || Object.keys(props.accounts)[0] + var checksumAddress = selected && ethUtil.toChecksumAddress(selected) + var identity = props.identities[selected] + var account = props.accounts[selected] + const { network, conversionRate, currentCurrency } = props + + return ( + + h('.account-detail-section.full-flex-height', [ + + // identicon, label, balance, etc + h('.account-data-subsection', { + style: { + margin: '0 20px', + flex: '1 0 auto', + }, + }, [ + + // header - identicon + nav + h('div', { + style: { + paddingTop: '20px', + display: 'flex', + justifyContent: 'flex-start', + alignItems: 'flex-start', + }, + }, [ + + // large identicon and addresses + h('.identicon-wrapper.select-none', [ + h(Identicon, { + diameter: 62, + address: selected, + }), + ]), + h('flex-column', { + style: { + lineHeight: '10px', + marginLeft: '15px', + width: '100%', + }, + }, [ + h(EditableLabel, { + textValue: identity ? identity.name : '', + state: { + isEditingLabel: false, + }, + saveText: (text) => { + props.dispatch(actions.saveAccountLabel(selected, text)) + }, + }, [ + + // What is shown when not editing + edit text: + h('label.editing-label', [h('.edit-text', 'edit')]), + h( + 'div', + { + style: { + display: 'flex', + justifyContent: 'flex-start', + alignItems: 'center', + }, + }, + [ + h( + 'div.font-medium.color-forest', + { + name: 'edit', + style: { + }, + }, + [ + h('h2', { + style: { + maxWidth: '180px', + overflow: 'hidden', + textOverflow: 'ellipsis', + padding: '5px 0px', + lineHeight: '25px', + }, + }, [ + identity && identity.name, + ]), + ] + ), + h( + AccountDropdowns, + { + style: { + marginRight: '8px', + marginLeft: 'auto', + cursor: 'pointer', + }, + selected, + network, + identities: props.identities, + enableAccountOptions: true, + }, + ), + ] + ), + ]), + h('.flex-row', { + style: { + width: '15em', + justifyContent: 'space-between', + alignItems: 'baseline', + }, + }, [ + + // address + + h('div', { + style: { + overflow: 'hidden', + textOverflow: 'ellipsis', + paddingTop: '3px', + width: '5em', + fontSize: '13px', + fontFamily: 'Montserrat Light', + textRendering: 'geometricPrecision', + marginBottom: '15px', + color: '#AEAEAE', + }, + }, checksumAddress), + ]), + + // account ballence + + ]), + ]), + h('.flex-row', { + style: { + justifyContent: 'space-between', + alignItems: 'flex-start', + }, + }, [ + + h(EthBalance, { + value: account && account.balance, + conversionRate, + currentCurrency, + style: { + lineHeight: '7px', + marginTop: '10px', + }, + }), + + h('.flex-grow'), + + h('button', { + onClick: () => props.dispatch(actions.buyEthView(selected)), + style: { marginRight: '10px' }, + }, 'BUY'), + + h('button', { + onClick: () => props.dispatch(actions.showSendPage()), + style: { + marginBottom: '20px', + marginRight: '8px', + }, + }, 'SEND'), + + ]), + ]), + + // subview (tx history, pk export confirm, buy eth warning) + this.subview(), + + ]) + ) +} + +AccountDetailScreen.prototype.subview = function () { + var subview + try { + subview = this.props.accountDetail.subview + } catch (e) { + subview = null + } + + switch (subview) { + case 'transactions': + return this.tabSections() + case 'export': + var state = extend({key: 'export'}, this.props) + return h(ExportAccountView, state) + default: + return this.tabSections() + } +} + +AccountDetailScreen.prototype.tabSections = function () { + const { currentAccountTab } = this.props + + return h('section.tabSection.full-flex-height.grow-tenx', [ + + h(TabBar, { + tabs: [ + { content: 'Sent', key: 'history' }, + { content: 'Tokens', key: 'tokens' }, + ], + defaultTab: currentAccountTab || 'history', + tabSelected: (key) => { + this.props.dispatch(actions.setCurrentAccountTab(key)) + }, + }), + + this.tabSwitchView(), + ]) +} + +AccountDetailScreen.prototype.tabSwitchView = function () { + const props = this.props + const { address, network } = props + const { currentAccountTab, tokens } = this.props + + switch (currentAccountTab) { + case 'tokens': + return h(TokenList, { + userAddress: address, + network, + tokens, + addToken: () => this.props.dispatch(actions.showAddTokenPage()), + }) + default: + return this.transactionList() + } +} + +AccountDetailScreen.prototype.transactionList = function () { + const {transactions, unapprovedMsgs, address, + network, shapeShiftTxList, conversionRate } = this.props + + return h(TransactionList, { + transactions: transactions.sort((a, b) => b.time - a.time), + network, + unapprovedMsgs, + conversionRate, + address, + shapeShiftTxList, + viewPendingTx: (txId) => { + this.props.dispatch(actions.viewPendingTx(txId)) + }, + }) +} diff --git a/old-ui/app/accounts/import/index.js b/old-ui/app/accounts/import/index.js new file mode 100644 index 000000000..3502efe93 --- /dev/null +++ b/old-ui/app/accounts/import/index.js @@ -0,0 +1,101 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const actions = require('../../../../ui/app/actions') +import Select from 'react-select' + +// Subviews +const JsonImportView = require('./json.js') +const PrivateKeyImportView = require('./private-key.js') + +const menuItems = [ + 'Private Key', + 'JSON File', +] + +module.exports = connect(mapStateToProps)(AccountImportSubview) + +function mapStateToProps (state) { + return { + menuItems, + } +} + +inherits(AccountImportSubview, Component) +function AccountImportSubview () { + Component.call(this) +} + +AccountImportSubview.prototype.render = function () { + const props = this.props + const state = this.state || {} + const { menuItems } = props + const { type } = state + + return ( + h('div', { + style: { + }, + }, [ + h('.section-title.flex-row.flex-center', [ + h('i.fa.fa-arrow-left.fa-lg.cursor-pointer', { + onClick: (event) => { + props.dispatch(actions.goHome()) + }, + }), + h('h2.page-subtitle', 'Import Accounts'), + ]), + h('div', { + style: { + padding: '10px', + color: 'rgb(174, 174, 174)', + }, + }, [ + + h('h3', { style: { padding: '3px' } }, 'SELECT TYPE'), + + h('style', ` + .has-value.Select--single > .Select-control .Select-value .Select-value-label, .Select-value-label { + color: rgb(174,174,174); + } + `), + + h(Select, { + name: 'import-type-select', + clearable: false, + value: type || menuItems[0], + options: menuItems.map((type) => { + return { + value: type, + label: type, + } + }), + onChange: (opt) => { + props.dispatch(actions.showImportPage()) + this.setState({ type: opt.value }) + }, + }), + ]), + + this.renderImportView(), + ]) + ) +} + +AccountImportSubview.prototype.renderImportView = function () { + const props = this.props + const state = this.state || {} + const { type } = state + const { menuItems } = props + const current = type || menuItems[0] + + switch (current) { + case 'Private Key': + return h(PrivateKeyImportView) + case 'JSON File': + return h(JsonImportView) + default: + return h(JsonImportView) + } +} diff --git a/old-ui/app/accounts/import/json.js b/old-ui/app/accounts/import/json.js new file mode 100644 index 000000000..8d6bd7f7b --- /dev/null +++ b/old-ui/app/accounts/import/json.js @@ -0,0 +1,100 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const actions = require('../../../../ui/app/actions') +const FileInput = require('react-simple-file-input').default + +const HELP_LINK = 'https://github.com/MetaMask/faq/blob/master/README.md#q-i-cant-use-the-import-feature-for-uploading-a-json-file-the-window-keeps-closing-when-i-try-to-select-a-file' + +module.exports = connect(mapStateToProps)(JsonImportSubview) + +function mapStateToProps (state) { + return { + error: state.appState.warning, + } +} + +inherits(JsonImportSubview, Component) +function JsonImportSubview () { + Component.call(this) +} + +JsonImportSubview.prototype.render = function () { + const { error } = this.props + + return ( + h('div', { + style: { + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + padding: '5px 15px 0px 15px', + }, + }, [ + + h('p', 'Used by a variety of different clients'), + h('a.warning', { href: HELP_LINK, target: '_blank' }, 'File import not working? Click here!'), + + h(FileInput, { + readAs: 'text', + onLoad: this.onLoad.bind(this), + style: { + margin: '20px 0px 12px 20px', + fontSize: '15px', + }, + }), + + h('input.large-input.letter-spacey', { + type: 'password', + placeholder: 'Enter password', + id: 'json-password-box', + onKeyPress: this.createKeyringOnEnter.bind(this), + style: { + width: 260, + marginTop: 12, + }, + }), + + h('button.primary', { + onClick: this.createNewKeychain.bind(this), + style: { + margin: 12, + }, + }, 'Import'), + + error ? h('span.error', error) : null, + ]) + ) +} + +JsonImportSubview.prototype.onLoad = function (event, file) { + this.setState({file: file, fileContents: event.target.result}) +} + +JsonImportSubview.prototype.createKeyringOnEnter = function (event) { + if (event.key === 'Enter') { + event.preventDefault() + this.createNewKeychain() + } +} + +JsonImportSubview.prototype.createNewKeychain = function () { + const state = this.state + const { fileContents } = state + + if (!fileContents) { + const message = 'You must select a file to import.' + return this.props.dispatch(actions.displayWarning(message)) + } + + const passwordInput = document.getElementById('json-password-box') + const password = passwordInput.value + + if (!password) { + const message = 'You must enter a password for the selected file.' + return this.props.dispatch(actions.displayWarning(message)) + } + + this.props.dispatch(actions.importNewAccount('JSON File', [ fileContents, password ])) +} diff --git a/old-ui/app/accounts/import/private-key.js b/old-ui/app/accounts/import/private-key.js new file mode 100644 index 000000000..105191105 --- /dev/null +++ b/old-ui/app/accounts/import/private-key.js @@ -0,0 +1,67 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const actions = require('../../../../ui/app/actions') + +module.exports = connect(mapStateToProps)(PrivateKeyImportView) + +function mapStateToProps (state) { + return { + error: state.appState.warning, + } +} + +inherits(PrivateKeyImportView, Component) +function PrivateKeyImportView () { + Component.call(this) +} + +PrivateKeyImportView.prototype.render = function () { + const { error } = this.props + + return ( + h('div', { + style: { + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + padding: '5px 15px 0px 15px', + }, + }, [ + h('span', 'Paste your private key string here'), + + h('input.large-input.letter-spacey', { + type: 'password', + id: 'private-key-box', + onKeyPress: this.createKeyringOnEnter.bind(this), + style: { + width: 260, + marginTop: 12, + }, + }), + + h('button.primary', { + onClick: this.createNewKeychain.bind(this), + style: { + margin: 12, + }, + }, 'Import'), + + error ? h('span.error', error) : null, + ]) + ) +} + +PrivateKeyImportView.prototype.createKeyringOnEnter = function (event) { + if (event.key === 'Enter') { + event.preventDefault() + this.createNewKeychain() + } +} + +PrivateKeyImportView.prototype.createNewKeychain = function () { + const input = document.getElementById('private-key-box') + const privateKey = input.value + this.props.dispatch(actions.importNewAccount('Private Key', [ privateKey ])) +} diff --git a/old-ui/app/accounts/import/seed.js b/old-ui/app/accounts/import/seed.js new file mode 100644 index 000000000..b4a7c0afa --- /dev/null +++ b/old-ui/app/accounts/import/seed.js @@ -0,0 +1,30 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect + +module.exports = connect(mapStateToProps)(SeedImportSubview) + +function mapStateToProps (state) { + return {} +} + +inherits(SeedImportSubview, Component) +function SeedImportSubview () { + Component.call(this) +} + +SeedImportSubview.prototype.render = function () { + return ( + h('div', { + style: { + }, + }, [ + `Paste your seed phrase here!`, + h('textarea'), + h('br'), + h('button', 'Submit'), + ]) + ) +} + diff --git a/old-ui/app/actions.js b/old-ui/app/actions.js new file mode 100644 index 000000000..d070548fc --- /dev/null +++ b/old-ui/app/actions.js @@ -0,0 +1,1128 @@ +const getBuyEthUrl = require('../../app/scripts/lib/buy-eth-url') + +var actions = { + _setBackgroundConnection: _setBackgroundConnection, + + GO_HOME: 'GO_HOME', + goHome: goHome, + // menu state + getNetworkStatus: 'getNetworkStatus', + // transition state + TRANSITION_FORWARD: 'TRANSITION_FORWARD', + TRANSITION_BACKWARD: 'TRANSITION_BACKWARD', + transitionForward, + transitionBackward, + // remote state + UPDATE_METAMASK_STATE: 'UPDATE_METAMASK_STATE', + updateMetamaskState: updateMetamaskState, + // notices + MARK_NOTICE_READ: 'MARK_NOTICE_READ', + markNoticeRead: markNoticeRead, + SHOW_NOTICE: 'SHOW_NOTICE', + showNotice: showNotice, + CLEAR_NOTICES: 'CLEAR_NOTICES', + clearNotices: clearNotices, + markAccountsFound, + // intialize screen + CREATE_NEW_VAULT_IN_PROGRESS: 'CREATE_NEW_VAULT_IN_PROGRESS', + SHOW_CREATE_VAULT: 'SHOW_CREATE_VAULT', + SHOW_RESTORE_VAULT: 'SHOW_RESTORE_VAULT', + FORGOT_PASSWORD: 'FORGOT_PASSWORD', + forgotPassword: forgotPassword, + SHOW_INIT_MENU: 'SHOW_INIT_MENU', + SHOW_NEW_VAULT_SEED: 'SHOW_NEW_VAULT_SEED', + SHOW_INFO_PAGE: 'SHOW_INFO_PAGE', + SHOW_IMPORT_PAGE: 'SHOW_IMPORT_PAGE', + unlockMetamask: unlockMetamask, + unlockFailed: unlockFailed, + showCreateVault: showCreateVault, + showRestoreVault: showRestoreVault, + showInitializeMenu: showInitializeMenu, + showImportPage, + createNewVaultAndKeychain: createNewVaultAndKeychain, + createNewVaultAndRestore: createNewVaultAndRestore, + createNewVaultInProgress: createNewVaultInProgress, + addNewKeyring, + importNewAccount, + addNewAccount, + NEW_ACCOUNT_SCREEN: 'NEW_ACCOUNT_SCREEN', + navigateToNewAccountScreen, + showNewVaultSeed: showNewVaultSeed, + showInfoPage: showInfoPage, + // seed recovery actions + REVEAL_SEED_CONFIRMATION: 'REVEAL_SEED_CONFIRMATION', + revealSeedConfirmation: revealSeedConfirmation, + requestRevealSeed: requestRevealSeed, + // unlock screen + UNLOCK_IN_PROGRESS: 'UNLOCK_IN_PROGRESS', + UNLOCK_FAILED: 'UNLOCK_FAILED', + UNLOCK_METAMASK: 'UNLOCK_METAMASK', + LOCK_METAMASK: 'LOCK_METAMASK', + tryUnlockMetamask: tryUnlockMetamask, + lockMetamask: lockMetamask, + unlockInProgress: unlockInProgress, + // error handling + displayWarning: displayWarning, + DISPLAY_WARNING: 'DISPLAY_WARNING', + HIDE_WARNING: 'HIDE_WARNING', + hideWarning: hideWarning, + // accounts screen + SET_SELECTED_ACCOUNT: 'SET_SELECTED_ACCOUNT', + SHOW_ACCOUNT_DETAIL: 'SHOW_ACCOUNT_DETAIL', + SHOW_ACCOUNTS_PAGE: 'SHOW_ACCOUNTS_PAGE', + SHOW_CONF_TX_PAGE: 'SHOW_CONF_TX_PAGE', + SHOW_CONF_MSG_PAGE: 'SHOW_CONF_MSG_PAGE', + SET_CURRENT_FIAT: 'SET_CURRENT_FIAT', + setCurrentCurrency: setCurrentCurrency, + setCurrentAccountTab, + // account detail screen + SHOW_SEND_PAGE: 'SHOW_SEND_PAGE', + showSendPage: showSendPage, + ADD_TO_ADDRESS_BOOK: 'ADD_TO_ADDRESS_BOOK', + addToAddressBook: addToAddressBook, + REQUEST_ACCOUNT_EXPORT: 'REQUEST_ACCOUNT_EXPORT', + requestExportAccount: requestExportAccount, + EXPORT_ACCOUNT: 'EXPORT_ACCOUNT', + exportAccount: exportAccount, + SHOW_PRIVATE_KEY: 'SHOW_PRIVATE_KEY', + showPrivateKey: showPrivateKey, + SAVE_ACCOUNT_LABEL: 'SAVE_ACCOUNT_LABEL', + saveAccountLabel: saveAccountLabel, + // tx conf screen + COMPLETED_TX: 'COMPLETED_TX', + TRANSACTION_ERROR: 'TRANSACTION_ERROR', + NEXT_TX: 'NEXT_TX', + PREVIOUS_TX: 'PREV_TX', + signMsg: signMsg, + cancelMsg: cancelMsg, + signPersonalMsg, + cancelPersonalMsg, + signTypedMsg, + cancelTypedMsg, + signTx: signTx, + updateAndApproveTx, + cancelTx: cancelTx, + completedTx: completedTx, + txError: txError, + nextTx: nextTx, + previousTx: previousTx, + cancelAllTx: cancelAllTx, + viewPendingTx: viewPendingTx, + VIEW_PENDING_TX: 'VIEW_PENDING_TX', + // app messages + confirmSeedWords: confirmSeedWords, + showAccountDetail: showAccountDetail, + BACK_TO_ACCOUNT_DETAIL: 'BACK_TO_ACCOUNT_DETAIL', + backToAccountDetail: backToAccountDetail, + showAccountsPage: showAccountsPage, + showConfTxPage: showConfTxPage, + // config screen + SHOW_CONFIG_PAGE: 'SHOW_CONFIG_PAGE', + SET_RPC_TARGET: 'SET_RPC_TARGET', + SET_DEFAULT_RPC_TARGET: 'SET_DEFAULT_RPC_TARGET', + SET_PROVIDER_TYPE: 'SET_PROVIDER_TYPE', + showConfigPage, + SHOW_ADD_TOKEN_PAGE: 'SHOW_ADD_TOKEN_PAGE', + showAddTokenPage, + addToken, + setRpcTarget: setRpcTarget, + setProviderType: setProviderType, + // loading overlay + SHOW_LOADING: 'SHOW_LOADING_INDICATION', + HIDE_LOADING: 'HIDE_LOADING_INDICATION', + showLoadingIndication: showLoadingIndication, + hideLoadingIndication: hideLoadingIndication, + // buy Eth with coinbase + onboardingBuyEthView, + ONBOARDING_BUY_ETH_VIEW: 'ONBOARDING_BUY_ETH_VIEW', + BUY_ETH: 'BUY_ETH', + buyEth: buyEth, + buyEthView: buyEthView, + buyWithShapeShift, + BUY_ETH_VIEW: 'BUY_ETH_VIEW', + COINBASE_SUBVIEW: 'COINBASE_SUBVIEW', + coinBaseSubview: coinBaseSubview, + SHAPESHIFT_SUBVIEW: 'SHAPESHIFT_SUBVIEW', + shapeShiftSubview: shapeShiftSubview, + PAIR_UPDATE: 'PAIR_UPDATE', + pairUpdate: pairUpdate, + coinShiftRquest: coinShiftRquest, + SHOW_SUB_LOADING_INDICATION: 'SHOW_SUB_LOADING_INDICATION', + showSubLoadingIndication: showSubLoadingIndication, + HIDE_SUB_LOADING_INDICATION: 'HIDE_SUB_LOADING_INDICATION', + hideSubLoadingIndication: hideSubLoadingIndication, +// QR STUFF: + SHOW_QR: 'SHOW_QR', + showQrView: showQrView, + reshowQrCode: reshowQrCode, + SHOW_QR_VIEW: 'SHOW_QR_VIEW', +// FORGOT PASSWORD: + BACK_TO_INIT_MENU: 'BACK_TO_INIT_MENU', + goBackToInitView: goBackToInitView, + RECOVERY_IN_PROGRESS: 'RECOVERY_IN_PROGRESS', + BACK_TO_UNLOCK_VIEW: 'BACK_TO_UNLOCK_VIEW', + backToUnlockView: backToUnlockView, + // SHOWING KEYCHAIN + SHOW_NEW_KEYCHAIN: 'SHOW_NEW_KEYCHAIN', + showNewKeychain: showNewKeychain, + + callBackgroundThenUpdate, + forceUpdateMetamaskState, + + // Feature Flags + setFeatureFlag, + updateFeatureFlags, + UPDATE_FEATURE_FLAGS: 'UPDATE_FEATURE_FLAGS', +} + +module.exports = actions + +var background = null +function _setBackgroundConnection (backgroundConnection) { + background = backgroundConnection +} + +function goHome () { + return { + type: actions.GO_HOME, + } +} + +// async actions + +function tryUnlockMetamask (password) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + dispatch(actions.unlockInProgress()) + log.debug(`background.submitPassword`) + background.submitPassword(password, (err) => { + dispatch(actions.hideLoadingIndication()) + if (err) { + dispatch(actions.unlockFailed(err.message)) + } else { + dispatch(actions.transitionForward()) + forceUpdateMetamaskState(dispatch) + } + }) + } +} + +function transitionForward () { + return { + type: this.TRANSITION_FORWARD, + } +} + +function transitionBackward () { + return { + type: this.TRANSITION_BACKWARD, + } +} + +function confirmSeedWords () { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + log.debug(`background.clearSeedWordCache`) + return new Promise((resolve, reject) => { + background.clearSeedWordCache((err, account) => { + dispatch(actions.hideLoadingIndication()) + if (err) { + dispatch(actions.displayWarning(err.message)) + reject(err) + } + + log.info('Seed word cache cleared. ' + account) + dispatch(actions.showAccountsPage()) + resolve(account) + }) + }) + } +} + +function createNewVaultAndRestore (password, seed) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + log.debug(`background.createNewVaultAndRestore`) + + return new Promise((resolve, reject) => { + background.createNewVaultAndRestore(password, seed, (err) => { + + dispatch(actions.hideLoadingIndication()) + + if (err) { + dispatch(actions.displayWarning(err.message)) + return reject(err) + } + + dispatch(actions.showAccountsPage()) + resolve() + }) + }) + } +} + +function createNewVaultAndKeychain (password) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + log.debug(`background.createNewVaultAndKeychain`) + + return new Promise((resolve, reject) => { + background.createNewVaultAndKeychain(password, (err) => { + if (err) { + dispatch(actions.displayWarning(err.message)) + return reject(err) + } + log.debug(`background.placeSeedWords`) + background.placeSeedWords((err) => { + if (err) { + dispatch(actions.displayWarning(err.message)) + return reject(err) + } + dispatch(actions.hideLoadingIndication()) + forceUpdateMetamaskState(dispatch) + resolve() + }) + }) + }) + + } +} + +function revealSeedConfirmation () { + return { + type: this.REVEAL_SEED_CONFIRMATION, + } +} + +function requestRevealSeed (password) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + log.debug(`background.submitPassword`) + background.submitPassword(password, (err) => { + if (err) { + return dispatch(actions.displayWarning(err.message)) + } + log.debug(`background.placeSeedWords`) + background.placeSeedWords((err, result) => { + if (err) return dispatch(actions.displayWarning(err.message)) + dispatch(actions.hideLoadingIndication()) + dispatch(actions.showNewVaultSeed(result)) + }) + }) + } +} + +function addNewKeyring (type, opts) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + log.debug(`background.addNewKeyring`) + background.addNewKeyring(type, opts, (err) => { + dispatch(actions.hideLoadingIndication()) + if (err) return dispatch(actions.displayWarning(err.message)) + dispatch(actions.showAccountsPage()) + }) + } +} + +function importNewAccount (strategy, args) { + return (dispatch) => { + dispatch(actions.showLoadingIndication('This may take a while, be patient.')) + log.debug(`background.importAccountWithStrategy`) + return new Promise((resolve, reject) => { + background.importAccountWithStrategy(strategy, args, (err) => { + if (err) { + dispatch(actions.displayWarning(err.message)) + return reject(err) + } + log.debug(`background.getState`) + background.getState((err, newState) => { + dispatch(actions.hideLoadingIndication()) + if (err) { + dispatch(actions.displayWarning(err.message)) + return reject(err) + } + dispatch(actions.updateMetamaskState(newState)) + dispatch({ + type: actions.SHOW_ACCOUNT_DETAIL, + value: newState.selectedAddress, + }) + resolve(newState) + }) + }) + }) + } +} + +function navigateToNewAccountScreen () { + return { + type: this.NEW_ACCOUNT_SCREEN, + } +} + +function addNewAccount () { + log.debug(`background.addNewAccount`) + return callBackgroundThenUpdate(background.addNewAccount) +} + +function showInfoPage () { + return { + type: actions.SHOW_INFO_PAGE, + } +} + +function setCurrentCurrency (currencyCode) { + return (dispatch) => { + dispatch(this.showLoadingIndication()) + log.debug(`background.setCurrentCurrency`) + background.setCurrentCurrency(currencyCode, (err, data) => { + dispatch(this.hideLoadingIndication()) + if (err) { + log.error(err.stack) + return dispatch(actions.displayWarning(err.message)) + } + dispatch({ + type: this.SET_CURRENT_FIAT, + value: { + currentCurrency: data.currentCurrency, + conversionRate: data.conversionRate, + conversionDate: data.conversionDate, + }, + }) + }) + } +} + +function signMsg (msgData) { + log.debug('action - signMsg') + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + + log.debug(`actions calling background.signMessage`) + background.signMessage(msgData, (err, newState) => { + log.debug('signMessage called back') + dispatch(actions.updateMetamaskState(newState)) + dispatch(actions.hideLoadingIndication()) + + if (err) log.error(err) + if (err) return dispatch(actions.displayWarning(err.message)) + + dispatch(actions.completedTx(msgData.metamaskId)) + }) + } +} + +function signPersonalMsg (msgData) { + log.debug('action - signPersonalMsg') + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + + log.debug(`actions calling background.signPersonalMessage`) + background.signPersonalMessage(msgData, (err, newState) => { + log.debug('signPersonalMessage called back') + dispatch(actions.updateMetamaskState(newState)) + dispatch(actions.hideLoadingIndication()) + + if (err) log.error(err) + if (err) return dispatch(actions.displayWarning(err.message)) + + dispatch(actions.completedTx(msgData.metamaskId)) + }) + } +} + +function signTypedMsg (msgData) { + log.debug('action - signTypedMsg') + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + + log.debug(`actions calling background.signTypedMessage`) + background.signTypedMessage(msgData, (err, newState) => { + log.debug('signTypedMessage called back') + dispatch(actions.updateMetamaskState(newState)) + dispatch(actions.hideLoadingIndication()) + + if (err) log.error(err) + if (err) return dispatch(actions.displayWarning(err.message)) + + dispatch(actions.completedTx(msgData.metamaskId)) + }) + } +} + +function signTx (txData) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + global.ethQuery.sendTransaction(txData, (err, data) => { + dispatch(actions.hideLoadingIndication()) + if (err) dispatch(actions.displayWarning(err.message)) + dispatch(this.goHome()) + }) + dispatch(actions.showConfTxPage()) + } +} + +function updateAndApproveTx (txData) { + log.info('actions: updateAndApproveTx: ' + JSON.stringify(txData)) + return (dispatch) => { + log.debug(`actions calling background.updateAndApproveTx`) + background.updateAndApproveTransaction(txData, (err) => { + dispatch(actions.hideLoadingIndication()) + if (err) { + dispatch(actions.txError(err)) + dispatch(actions.goHome()) + return log.error(err.message) + } + dispatch(actions.completedTx(txData.id)) + }) + } +} + +function completedTx (id) { + return { + type: actions.COMPLETED_TX, + value: id, + } +} + +function txError (err) { + return { + type: actions.TRANSACTION_ERROR, + message: err.message, + } +} + +function cancelMsg (msgData) { + log.debug(`background.cancelMessage`) + background.cancelMessage(msgData.id) + return actions.completedTx(msgData.id) +} + +function cancelPersonalMsg (msgData) { + const id = msgData.id + background.cancelPersonalMessage(id) + return actions.completedTx(id) +} + +function cancelTypedMsg (msgData) { + const id = msgData.id + background.cancelTypedMessage(id) + return actions.completedTx(id) +} + +function cancelTx (txData) { + return (dispatch) => { + log.debug(`background.cancelTransaction`) + background.cancelTransaction(txData.id, () => { + dispatch(actions.completedTx(txData.id)) + }) + } +} + +function cancelAllTx (txsData) { + return (dispatch) => { + txsData.forEach((txData, i) => { + background.cancelTransaction(txData.id, () => { + dispatch(actions.completedTx(txData.id)) + i === txsData.length - 1 ? dispatch(actions.goHome()) : null + }) + }) + } +} +// +// initialize screen +// + +function showCreateVault () { + return { + type: actions.SHOW_CREATE_VAULT, + } +} + +function showRestoreVault () { + return { + type: actions.SHOW_RESTORE_VAULT, + } +} + +function forgotPassword () { + return { + type: actions.FORGOT_PASSWORD, + } +} + +function showInitializeMenu () { + return { + type: actions.SHOW_INIT_MENU, + } +} + +function showImportPage () { + return { + type: actions.SHOW_IMPORT_PAGE, + } +} + +function createNewVaultInProgress () { + return { + type: actions.CREATE_NEW_VAULT_IN_PROGRESS, + } +} + +function showNewVaultSeed (seed) { + return { + type: actions.SHOW_NEW_VAULT_SEED, + value: seed, + } +} + +function backToUnlockView () { + return { + type: actions.BACK_TO_UNLOCK_VIEW, + } +} + +function showNewKeychain () { + return { + type: actions.SHOW_NEW_KEYCHAIN, + } +} + +// +// unlock screen +// + +function unlockInProgress () { + return { + type: actions.UNLOCK_IN_PROGRESS, + } +} + +function unlockFailed (message) { + return { + type: actions.UNLOCK_FAILED, + value: message, + } +} + +function unlockMetamask (account) { + return { + type: actions.UNLOCK_METAMASK, + value: account, + } +} + +function updateMetamaskState (newState) { + return { + type: actions.UPDATE_METAMASK_STATE, + value: newState, + } +} + +function lockMetamask () { + log.debug(`background.setLocked`) + return callBackgroundThenUpdate(background.setLocked) +} + +function setCurrentAccountTab (newTabName) { + log.debug(`background.setCurrentAccountTab: ${newTabName}`) + return callBackgroundThenUpdateNoSpinner(background.setCurrentAccountTab, newTabName) +} + +function showAccountDetail (address) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + log.debug(`background.setSelectedAddress`) + background.setSelectedAddress(address, (err) => { + dispatch(actions.hideLoadingIndication()) + if (err) { + return dispatch(actions.displayWarning(err.message)) + } + dispatch({ + type: actions.SHOW_ACCOUNT_DETAIL, + value: address, + }) + }) + } +} + +function backToAccountDetail (address) { + return { + type: actions.BACK_TO_ACCOUNT_DETAIL, + value: address, + } +} + +function showAccountsPage () { + return { + type: actions.SHOW_ACCOUNTS_PAGE, + } +} + +function showConfTxPage (transForward = true) { + return { + type: actions.SHOW_CONF_TX_PAGE, + transForward: transForward, + } +} + +function nextTx () { + return { + type: actions.NEXT_TX, + } +} + +function viewPendingTx (txId) { + return { + type: actions.VIEW_PENDING_TX, + value: txId, + } +} + +function previousTx () { + return { + type: actions.PREVIOUS_TX, + } +} + +function showConfigPage (transitionForward = true) { + return { + type: actions.SHOW_CONFIG_PAGE, + value: transitionForward, + } +} + +function showAddTokenPage (transitionForward = true) { + return { + type: actions.SHOW_ADD_TOKEN_PAGE, + value: transitionForward, + } +} + +function addToken (address, symbol, decimals) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + background.addToken(address, symbol, decimals, (err) => { + dispatch(actions.hideLoadingIndication()) + if (err) { + return dispatch(actions.displayWarning(err.message)) + } + setTimeout(() => { + dispatch(actions.goHome()) + }, 250) + }) + } +} + +function goBackToInitView () { + return { + type: actions.BACK_TO_INIT_MENU, + } +} + +// +// notice +// + +function markNoticeRead (notice) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + log.debug(`background.markNoticeRead`) + return new Promise((resolve, reject) => { + background.markNoticeRead(notice, (err, notice) => { + dispatch(actions.hideLoadingIndication()) + if (err) { + dispatch(actions.displayWarning(err)) + return reject(err) + } + if (notice) { + dispatch(actions.showNotice(notice)) + resolve() + } else { + dispatch(actions.clearNotices()) + resolve() + } + }) + }) + } +} + +function showNotice (notice) { + return { + type: actions.SHOW_NOTICE, + value: notice, + } +} + +function clearNotices () { + return { + type: actions.CLEAR_NOTICES, + } +} + +function markAccountsFound () { + log.debug(`background.markAccountsFound`) + return callBackgroundThenUpdate(background.markAccountsFound) +} + +// +// config +// + +function setProviderType (type) { + return (dispatch) => { + log.debug(`background.setProviderType`) + background.setProviderType(type, (err, result) => { + if (err) { + log.error(err) + return dispatch(self.displayWarning('Had a problem changing networks!')) + } + }) + return { + type: actions.SET_PROVIDER_TYPE, + value: type, + } + } +} + +function setRpcTarget (newRpc) { + log.debug(`background.setRpcTarget: ${newRpc}`) + return (dispatch) => { + background.setCustomRpc(newRpc, (err, result) => { + if (err) { + log.error(err) + return dispatch(self.displayWarning('Had a problem changing networks!')) + } + }) + } +} + +// Calls the addressBookController to add a new address. +function addToAddressBook (recipient, nickname) { + log.debug(`background.addToAddressBook`) + return (dispatch) => { + background.setAddressBook(recipient, nickname, (err, result) => { + if (err) { + log.error(err) + return dispatch(self.displayWarning('Address book failed to update')) + } + }) + } +} + +function showLoadingIndication (message) { + return { + type: actions.SHOW_LOADING, + value: message, + } +} + +function hideLoadingIndication () { + return { + type: actions.HIDE_LOADING, + } +} + +function showSubLoadingIndication () { + return { + type: actions.SHOW_SUB_LOADING_INDICATION, + } +} + +function hideSubLoadingIndication () { + return { + type: actions.HIDE_SUB_LOADING_INDICATION, + } +} + +function displayWarning (text) { + return { + type: actions.DISPLAY_WARNING, + value: text, + } +} + +function hideWarning () { + return { + type: actions.HIDE_WARNING, + } +} + +function requestExportAccount () { + return { + type: actions.REQUEST_ACCOUNT_EXPORT, + } +} + +function exportAccount (password, address) { + var self = this + + return function (dispatch) { + dispatch(self.showLoadingIndication()) + + log.debug(`background.submitPassword`) + background.submitPassword(password, function (err) { + if (err) { + log.error('Error in submiting password.') + dispatch(self.hideLoadingIndication()) + return dispatch(self.displayWarning('Incorrect Password.')) + } + log.debug(`background.exportAccount`) + background.exportAccount(address, function (err, result) { + dispatch(self.hideLoadingIndication()) + + if (err) { + log.error(err) + return dispatch(self.displayWarning('Had a problem exporting the account.')) + } + + dispatch(self.showPrivateKey(result)) + }) + }) + } +} + +function showPrivateKey (key) { + return { + type: actions.SHOW_PRIVATE_KEY, + value: key, + } +} + +function saveAccountLabel (account, label) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + log.debug(`background.saveAccountLabel`) + background.saveAccountLabel(account, label, (err) => { + dispatch(actions.hideLoadingIndication()) + if (err) { + return dispatch(actions.displayWarning(err.message)) + } + dispatch({ + type: actions.SAVE_ACCOUNT_LABEL, + value: { account, label }, + }) + }) + } +} + +function showSendPage () { + return { + type: actions.SHOW_SEND_PAGE, + } +} + +function buyEth (opts) { + return (dispatch) => { + const url = getBuyEthUrl(opts) + global.platform.openWindow({ url }) + dispatch({ + type: actions.BUY_ETH, + }) + } +} + +function onboardingBuyEthView (address) { + return { + type: actions.ONBOARDING_BUY_ETH_VIEW, + value: address, + } +} + +function buyEthView (address) { + return { + type: actions.BUY_ETH_VIEW, + value: address, + } +} + +function coinBaseSubview () { + return { + type: actions.COINBASE_SUBVIEW, + } +} + +function pairUpdate (coin) { + return (dispatch) => { + dispatch(actions.showSubLoadingIndication()) + dispatch(actions.hideWarning()) + shapeShiftRequest('marketinfo', {pair: `${coin.toLowerCase()}_eth`}, (mktResponse) => { + dispatch(actions.hideSubLoadingIndication()) + dispatch({ + type: actions.PAIR_UPDATE, + value: { + marketinfo: mktResponse, + }, + }) + }) + } +} + +function shapeShiftSubview (network) { + var pair = 'btc_eth' + + return (dispatch) => { + dispatch(actions.showSubLoadingIndication()) + shapeShiftRequest('marketinfo', {pair}, (mktResponse) => { + shapeShiftRequest('getcoins', {}, (response) => { + dispatch(actions.hideSubLoadingIndication()) + if (mktResponse.error) return dispatch(actions.displayWarning(mktResponse.error)) + dispatch({ + type: actions.SHAPESHIFT_SUBVIEW, + value: { + marketinfo: mktResponse, + coinOptions: response, + }, + }) + }) + }) + } +} + +function coinShiftRquest (data, marketData) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + shapeShiftRequest('shift', { method: 'POST', data}, (response) => { + dispatch(actions.hideLoadingIndication()) + if (response.error) return dispatch(actions.displayWarning(response.error)) + var message = ` + Deposit your ${response.depositType} to the address bellow:` + log.debug(`background.createShapeShiftTx`) + background.createShapeShiftTx(response.deposit, response.depositType) + dispatch(actions.showQrView(response.deposit, [message].concat(marketData))) + }) + } +} + +function buyWithShapeShift (data) { + return dispatch => new Promise((resolve, reject) => { + shapeShiftRequest('shift', { method: 'POST', data}, (response) => { + if (response.error) { + return reject(response.error) + } + background.createShapeShiftTx(response.deposit, response.depositType) + return resolve(response) + }) + }) +} + +function showQrView (data, message) { + return { + type: actions.SHOW_QR_VIEW, + value: { + message: message, + data: data, + }, + } +} +function reshowQrCode (data, coin) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + shapeShiftRequest('marketinfo', {pair: `${coin.toLowerCase()}_eth`}, (mktResponse) => { + if (mktResponse.error) return dispatch(actions.displayWarning(mktResponse.error)) + + var message = [ + `Deposit your ${coin} to the address bellow:`, + `Deposit Limit: ${mktResponse.limit}`, + `Deposit Minimum:${mktResponse.minimum}`, + ] + + dispatch(actions.hideLoadingIndication()) + return dispatch(actions.showQrView(data, message)) + }) + } +} + +function shapeShiftRequest (query, options, cb) { + var queryResponse, method + !options ? options = {} : null + options.method ? method = options.method : method = 'GET' + + var requestListner = function (request) { + try { + queryResponse = JSON.parse(this.responseText) + cb ? cb(queryResponse) : null + return queryResponse + } catch (e) { + cb ? cb({error: e}) : null + return e + } + } + + var shapShiftReq = new XMLHttpRequest() + shapShiftReq.addEventListener('load', requestListner) + shapShiftReq.open(method, `https://shapeshift.io/${query}/${options.pair ? options.pair : ''}`, true) + + if (options.method === 'POST') { + var jsonObj = JSON.stringify(options.data) + shapShiftReq.setRequestHeader('Content-Type', 'application/json') + return shapShiftReq.send(jsonObj) + } else { + return shapShiftReq.send() + } +} + +function setFeatureFlag (feature, activated) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + return new Promise((resolve, reject) => { + background.setFeatureFlag(feature, activated, (err, updatedFeatureFlags) => { + dispatch(actions.hideLoadingIndication()) + if (err) { + dispatch(actions.displayWarning(err.message)) + reject(err) + } + dispatch(actions.updateFeatureFlags(updatedFeatureFlags)) + resolve(updatedFeatureFlags) + }) + }) + } +} + +function updateFeatureFlags (updatedFeatureFlags) { + return { + type: actions.UPDATE_FEATURE_FLAGS, + value: updatedFeatureFlags, + } +} + +// Call Background Then Update +// +// A function generator for a common pattern wherein: +// We show loading indication. +// We call a background method. +// We hide loading indication. +// If it errored, we show a warning. +// If it didn't, we update the state. +function callBackgroundThenUpdateNoSpinner (method, ...args) { + return (dispatch) => { + method.call(background, ...args, (err) => { + if (err) { + return dispatch(actions.displayWarning(err.message)) + } + forceUpdateMetamaskState(dispatch) + }) + } +} + +function callBackgroundThenUpdate (method, ...args) { + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + method.call(background, ...args, (err) => { + dispatch(actions.hideLoadingIndication()) + if (err) { + return dispatch(actions.displayWarning(err.message)) + } + forceUpdateMetamaskState(dispatch) + }) + } +} + +function forceUpdateMetamaskState (dispatch) { + log.debug(`background.getState`) + background.getState((err, newState) => { + if (err) { + return dispatch(actions.displayWarning(err.message)) + } + dispatch(actions.updateMetamaskState(newState)) + }) +} diff --git a/old-ui/app/add-token.js b/old-ui/app/add-token.js new file mode 100644 index 000000000..8778f312e --- /dev/null +++ b/old-ui/app/add-token.js @@ -0,0 +1,238 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const actions = require('../../ui/app/actions') +const Tooltip = require('./components/tooltip.js') + + +const ethUtil = require('ethereumjs-util') +const abi = require('human-standard-token-abi') +const Eth = require('ethjs-query') +const EthContract = require('ethjs-contract') + +const emptyAddr = '0x0000000000000000000000000000000000000000' + +module.exports = connect(mapStateToProps)(AddTokenScreen) + +function mapStateToProps (state) { + return { + identities: state.metamask.identities, + } +} + +inherits(AddTokenScreen, Component) +function AddTokenScreen () { + this.state = { + warning: null, + address: null, + symbol: 'TOKEN', + decimals: 18, + } + Component.call(this) +} + +AddTokenScreen.prototype.render = function () { + const state = this.state + const props = this.props + const { warning, symbol, decimals } = state + + return ( + h('.flex-column.flex-grow', [ + + // subtitle and nav + h('.section-title.flex-row.flex-center', [ + h('i.fa.fa-arrow-left.fa-lg.cursor-pointer', { + onClick: (event) => { + props.dispatch(actions.goHome()) + }, + }), + h('h2.page-subtitle', 'Add Token'), + ]), + + h('.error', { + style: { + display: warning ? 'block' : 'none', + padding: '0 20px', + textAlign: 'center', + }, + }, warning), + + // conf view + h('.flex-column.flex-justify-center.flex-grow.select-none', [ + h('.flex-space-around', { + style: { + padding: '20px', + }, + }, [ + + h('div', [ + h(Tooltip, { + position: 'top', + title: 'The contract of the actual token contract. Click for more info.', + }, [ + h('a', { + style: { fontWeight: 'bold', paddingRight: '10px'}, + href: 'https://support.metamask.io/kb/article/24-what-is-a-token-contract-address', + target: '_blank', + }, [ + h('span', 'Token Contract Address '), + h('i.fa.fa-question-circle'), + ]), + ]), + ]), + + h('section.flex-row.flex-center', [ + h('input#token-address', { + name: 'address', + placeholder: 'Token Contract Address', + onChange: this.tokenAddressDidChange.bind(this), + style: { + width: 'inherit', + flex: '1 0 auto', + height: '30px', + margin: '8px', + }, + }), + ]), + + h('div', [ + h('span', { + style: { fontWeight: 'bold', paddingRight: '10px'}, + }, 'Token Symbol'), + ]), + + h('div', { style: {display: 'flex'} }, [ + h('input#token_symbol', { + placeholder: `Like "ETH"`, + value: symbol, + style: { + width: 'inherit', + flex: '1 0 auto', + height: '30px', + margin: '8px', + }, + onChange: (event) => { + var element = event.target + var symbol = element.value + this.setState({ symbol }) + }, + }), + ]), + + h('div', [ + h('span', { + style: { fontWeight: 'bold', paddingRight: '10px'}, + }, 'Decimals of Precision'), + ]), + + h('div', { style: {display: 'flex'} }, [ + h('input#token_decimals', { + value: decimals, + type: 'number', + min: 0, + max: 36, + style: { + width: 'inherit', + flex: '1 0 auto', + height: '30px', + margin: '8px', + }, + onChange: (event) => { + var element = event.target + var decimals = element.value.trim() + this.setState({ decimals }) + }, + }), + ]), + + h('button', { + style: { + alignSelf: 'center', + }, + onClick: (event) => { + const valid = this.validateInputs() + if (!valid) return + + const { address, symbol, decimals } = this.state + this.props.dispatch(actions.addToken(address.trim(), symbol.trim(), decimals)) + }, + }, 'Add'), + ]), + ]), + ]) + ) +} + +AddTokenScreen.prototype.componentWillMount = function () { + if (typeof global.ethereumProvider === 'undefined') return + + this.eth = new Eth(global.ethereumProvider) + this.contract = new EthContract(this.eth) + this.TokenContract = this.contract(abi) +} + +AddTokenScreen.prototype.tokenAddressDidChange = function (event) { + const el = event.target + const address = el.value.trim() + if (ethUtil.isValidAddress(address) && address !== emptyAddr) { + this.setState({ address }) + this.attemptToAutoFillTokenParams(address) + } +} + +AddTokenScreen.prototype.validateInputs = function () { + let msg = '' + const state = this.state + const identitiesList = Object.keys(this.props.identities) + const { address, symbol, decimals } = state + const standardAddress = ethUtil.addHexPrefix(address).toLowerCase() + + const validAddress = ethUtil.isValidAddress(address) + if (!validAddress) { + msg += 'Address is invalid. ' + } + + const validDecimals = decimals >= 0 && decimals < 36 + if (!validDecimals) { + msg += 'Decimals must be at least 0, and not over 36. ' + } + + const symbolLen = symbol.trim().length + const validSymbol = symbolLen > 0 && symbolLen < 10 + if (!validSymbol) { + msg += 'Symbol must be between 0 and 10 characters.' + } + + const ownAddress = identitiesList.includes(standardAddress) + if (ownAddress) { + msg = 'Personal address detected. Input the token contract address.' + } + + const isValid = validAddress && validDecimals && !ownAddress + + if (!isValid) { + this.setState({ + warning: msg, + }) + } else { + this.setState({ warning: null }) + } + + return isValid +} + +AddTokenScreen.prototype.attemptToAutoFillTokenParams = async function (address) { + const contract = this.TokenContract.at(address) + + const results = await Promise.all([ + contract.symbol(), + contract.decimals(), + ]) + + const [ symbol, decimals ] = results + if (symbol && decimals) { + console.log('SETTING SYMBOL AND DECIMALS', { symbol, decimals }) + this.setState({ symbol: symbol[0], decimals: decimals[0].toString() }) + } +} diff --git a/old-ui/app/app.js b/old-ui/app/app.js new file mode 100644 index 000000000..b1a9d68ba --- /dev/null +++ b/old-ui/app/app.js @@ -0,0 +1,682 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const connect = require('react-redux').connect +const h = require('react-hyperscript') +const actions = require('../../ui/app/actions') +// mascara +const MascaraFirstTime = require('../../mascara/src/app/first-time').default +const MascaraBuyEtherScreen = require('../../mascara/src/app/first-time/buy-ether-screen').default +// init +const InitializeMenuScreen = require('./first-time/init-menu') +const NewKeyChainScreen = require('./new-keychain') +// unlock +const UnlockScreen = require('./unlock') +// accounts +const AccountDetailScreen = require('./account-detail') +const SendTransactionScreen = require('./send') +const ConfirmTxScreen = require('./conf-tx') +// notice +const NoticeScreen = require('./components/notice') +const generateLostAccountsNotice = require('../lib/lost-accounts-notice') +// other views +const ConfigScreen = require('./config') +const AddTokenScreen = require('./add-token') +const Import = require('./accounts/import') +const InfoScreen = require('./info') +const Loading = require('./components/loading') +const SandwichExpando = require('sandwich-expando') +const Dropdown = require('./components/dropdown').Dropdown +const DropdownMenuItem = require('./components/dropdown').DropdownMenuItem +const NetworkIndicator = require('./components/network') +const BuyView = require('./components/buy-button-subview') +const QrView = require('./components/qr-code') +const HDCreateVaultComplete = require('./keychains/hd/create-vault-complete') +const HDRestoreVaultScreen = require('./keychains/hd/restore-vault') +const RevealSeedConfirmation = require('./keychains/hd/recover-seed/confirmation') +const AccountDropdowns = require('./components/account-dropdowns').AccountDropdowns + +module.exports = connect(mapStateToProps)(App) + +inherits(App, Component) +function App () { Component.call(this) } + +function mapStateToProps (state) { + const { + identities, + accounts, + address, + keyrings, + isInitialized, + noActiveNotices, + seedWords, + featureFlags, + } = state.metamask + const selected = address || Object.keys(accounts)[0] + + return { + // state from plugin + isLoading: state.appState.isLoading, + loadingMessage: state.appState.loadingMessage, + noActiveNotices: state.metamask.noActiveNotices, + isInitialized: state.metamask.isInitialized, + isUnlocked: state.metamask.isUnlocked, + currentView: state.appState.currentView, + activeAddress: state.appState.activeAddress, + transForward: state.appState.transForward, + isMascara: state.metamask.isMascara, + isOnboarding: Boolean(!noActiveNotices || seedWords || !isInitialized), + seedWords: state.metamask.seedWords, + unapprovedTxs: state.metamask.unapprovedTxs, + unapprovedMsgs: state.metamask.unapprovedMsgs, + menuOpen: state.appState.menuOpen, + network: state.metamask.network, + provider: state.metamask.provider, + forgottenPassword: state.appState.forgottenPassword, + lastUnreadNotice: state.metamask.lastUnreadNotice, + lostAccounts: state.metamask.lostAccounts, + frequentRpcList: state.metamask.frequentRpcList || [], + featureFlags, + + // state needed to get account dropdown temporarily rendering from app bar + identities, + selected, + keyrings, + } +} + +App.prototype.render = function () { + var props = this.props + const { isLoading, loadingMessage, transForward, network } = props + const isLoadingNetwork = network === 'loading' && props.currentView.name !== 'config' + const loadMessage = loadingMessage || isLoadingNetwork ? + `Connecting to ${this.getNetworkName()}` : null + log.debug('Main ui render function') + + return ( + h('.old-ui', [ + h('.flex-column.full-height', { + style: { + // Windows was showing a vertical scroll bar: + overflow: 'hidden', + position: 'relative', + alignItems: 'center', + }, + }, [ + + // app bar + this.renderAppBar(), + this.renderNetworkDropdown(), + this.renderDropdown(), + + this.renderLoadingIndicator({ isLoading, isLoadingNetwork, loadMessage }), + + // panel content + h('.app-primary' + (transForward ? '.from-right' : '.from-left'), { + style: { + width: '100%', + }, + }, [ + this.renderPrimary(), + ]), + ]) + ]) + ) +} + +App.prototype.renderAppBar = function () { + if (window.METAMASK_UI_TYPE === 'notification') { + return null + } + + const props = this.props + const state = this.state || {} + const isNetworkMenuOpen = state.isNetworkMenuOpen || false + const {isMascara, isOnboarding} = props + + // Do not render header if user is in mascara onboarding + if (isMascara && isOnboarding) { + return null + } + + // Do not render header if user is in mascara buy ether + if (isMascara && props.currentView.name === 'buyEth') { + return null + } + + return ( + + h('.full-width', { + height: '38px', + }, [ + + h('.app-header.flex-row.flex-space-between', { + style: { + alignItems: 'center', + visibility: props.isUnlocked ? 'visible' : 'none', + background: props.isUnlocked ? 'white' : 'none', + height: '38px', + position: 'relative', + zIndex: 12, + }, + }, [ + + h('div.left-menu-section', { + style: { + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + }, + }, [ + + // mini logo + h('img', { + height: 24, + width: 24, + src: '/images/icon-128.png', + }), + + h(NetworkIndicator, { + network: this.props.network, + provider: this.props.provider, + onClick: (event) => { + event.preventDefault() + event.stopPropagation() + this.setState({ isNetworkMenuOpen: !isNetworkMenuOpen }) + }, + }), + ]), + + props.isUnlocked && h('div', { + style: { + display: 'flex', + flexDirection: 'row', + alignItems: 'center', + }, + }, [ + + props.isUnlocked && h(AccountDropdowns, { + style: {}, + enableAccountsSelector: true, + identities: this.props.identities, + selected: this.props.currentView.context, + network: this.props.network, + keyrings: this.props.keyrings, + }, []), + + // hamburger + props.isUnlocked && h(SandwichExpando, { + className: 'sandwich-expando', + width: 16, + barHeight: 2, + padding: 0, + isOpen: state.isMainMenuOpen, + color: 'rgb(247,146,30)', + onClick: () => { + this.setState({ + isMainMenuOpen: !state.isMainMenuOpen, + }) + }, + }), + ]), + ]), + ]) + ) +} + +App.prototype.renderNetworkDropdown = function () { + const props = this.props + const { provider: { type: providerType, rpcTarget: activeNetwork } } = props + const rpcList = props.frequentRpcList + const state = this.state || {} + const isOpen = state.isNetworkMenuOpen + + return h(Dropdown, { + useCssTransition: true, + isOpen, + onClickOutside: (event) => { + const { classList } = event.target + const isNotToggleElement = [ + classList.contains('menu-icon'), + classList.contains('network-name'), + classList.contains('network-indicator'), + ].filter(bool => bool).length === 0 + // classes from three constituent nodes of the toggle element + + if (isNotToggleElement) { + this.setState({ isNetworkMenuOpen: false }) + } + }, + zIndex: 11, + style: { + position: 'absolute', + left: '2px', + top: '36px', + }, + innerStyle: { + padding: '2px 16px 2px 0px', + }, + }, [ + + h( + DropdownMenuItem, + { + key: 'main', + closeMenu: () => this.setState({ isNetworkMenuOpen: !isOpen }), + onClick: () => props.dispatch(actions.setProviderType('mainnet')), + style: { + fontSize: '18px', + }, + }, + [ + h('.menu-icon.diamond'), + 'Main Ethereum Network', + providerType === 'mainnet' ? h('.check', '✓') : null, + ] + ), + + h( + DropdownMenuItem, + { + key: 'ropsten', + closeMenu: () => this.setState({ isNetworkMenuOpen: !isOpen }), + onClick: () => props.dispatch(actions.setProviderType('ropsten')), + style: { + fontSize: '18px', + }, + }, + [ + h('.menu-icon.red-dot'), + 'Ropsten Test Network', + providerType === 'ropsten' ? h('.check', '✓') : null, + ] + ), + + h( + DropdownMenuItem, + { + key: 'kovan', + closeMenu: () => this.setState({ isNetworkMenuOpen: !isOpen }), + onClick: () => props.dispatch(actions.setProviderType('kovan')), + style: { + fontSize: '18px', + }, + }, + [ + h('.menu-icon.hollow-diamond'), + 'Kovan Test Network', + providerType === 'kovan' ? h('.check', '✓') : null, + ] + ), + + h( + DropdownMenuItem, + { + key: 'rinkeby', + closeMenu: () => this.setState({ isNetworkMenuOpen: !isOpen }), + onClick: () => props.dispatch(actions.setProviderType('rinkeby')), + style: { + fontSize: '18px', + }, + }, + [ + h('.menu-icon.golden-square'), + 'Rinkeby Test Network', + providerType === 'rinkeby' ? h('.check', '✓') : null, + ] + ), + + h( + DropdownMenuItem, + { + key: 'default', + closeMenu: () => this.setState({ isNetworkMenuOpen: !isOpen }), + onClick: () => props.dispatch(actions.setProviderType('localhost')), + style: { + fontSize: '18px', + }, + }, + [ + h('i.fa.fa-question-circle.fa-lg.menu-icon'), + 'Localhost 8545', + activeNetwork === 'http://localhost:8545' ? h('.check', '✓') : null, + ] + ), + + this.renderCustomOption(props.provider), + this.renderCommonRpc(rpcList, props.provider), + + h( + DropdownMenuItem, + { + closeMenu: () => this.setState({ isNetworkMenuOpen: !isOpen }), + onClick: () => this.props.dispatch(actions.showConfigPage()), + style: { + fontSize: '18px', + }, + }, + [ + h('i.fa.fa-question-circle.fa-lg.menu-icon'), + 'Custom RPC', + activeNetwork === 'custom' ? h('.check', '✓') : null, + ] + ), + + ]) +} + +App.prototype.renderDropdown = function () { + const state = this.state || {} + const isOpen = state.isMainMenuOpen + + return h(Dropdown, { + useCssTransition: true, + isOpen: isOpen, + zIndex: 11, + onClickOutside: (event) => { + const classList = event.target.classList + const parentClassList = event.target.parentElement.classList + + const isToggleElement = classList.contains('sandwich-expando') || + parentClassList.contains('sandwich-expando') + + if (isOpen && !isToggleElement) { + this.setState({ isMainMenuOpen: false }) + } + }, + style: { + position: 'absolute', + right: '2px', + top: '38px', + }, + innerStyle: {}, + }, [ + h(DropdownMenuItem, { + closeMenu: () => this.setState({ isMainMenuOpen: !isOpen }), + onClick: () => { this.props.dispatch(actions.showConfigPage()) }, + }, 'Settings'), + + h(DropdownMenuItem, { + closeMenu: () => this.setState({ isMainMenuOpen: !isOpen }), + onClick: () => { this.props.dispatch(actions.lockMetamask()) }, + }, 'Lock'), + + h(DropdownMenuItem, { + closeMenu: () => this.setState({ isMainMenuOpen: !isOpen }), + onClick: () => { this.props.dispatch(actions.showInfoPage()) }, + }, 'Info/Help'), + + h(DropdownMenuItem, { + closeMenu: () => this.setState({ isMainMenuOpen: !isOpen }), + onClick: () => { this.props.dispatch(actions.setFeatureFlag('betaUI', true)) }, + }, 'Try Beta!'), + ]) +} + +App.prototype.renderLoadingIndicator = function ({ isLoading, isLoadingNetwork, loadMessage }) { + const { isMascara } = this.props + + return isMascara + ? null + : h(Loading, { + isLoading: isLoading || isLoadingNetwork, + loadingMessage: loadMessage, + }) +} + +App.prototype.renderBackButton = function (style, justArrow = false) { + var props = this.props + return ( + h('.flex-row', { + key: 'leftArrow', + style: style, + onClick: () => props.dispatch(actions.goBackToInitView()), + }, [ + h('i.fa.fa-arrow-left.cursor-pointer'), + justArrow ? null : h('div.cursor-pointer', { + style: { + marginLeft: '3px', + }, + onClick: () => props.dispatch(actions.goBackToInitView()), + }, 'BACK'), + ]) + ) +} + +App.prototype.renderPrimary = function () { + log.debug('rendering primary') + var props = this.props + const {isMascara, isOnboarding} = props + + if (isMascara && isOnboarding) { + return h(MascaraFirstTime) + } + + // notices + if (!props.noActiveNotices) { + log.debug('rendering notice screen for unread notices.') + return h(NoticeScreen, { + notice: props.lastUnreadNotice, + key: 'NoticeScreen', + onConfirm: () => props.dispatch(actions.markNoticeRead(props.lastUnreadNotice)), + }) + } else if (props.lostAccounts && props.lostAccounts.length > 0) { + log.debug('rendering notice screen for lost accounts view.') + return h(NoticeScreen, { + notice: generateLostAccountsNotice(props.lostAccounts), + key: 'LostAccountsNotice', + onConfirm: () => props.dispatch(actions.markAccountsFound()), + }) + } + + if (props.seedWords) { + log.debug('rendering seed words') + return h(HDCreateVaultComplete, {key: 'HDCreateVaultComplete'}) + } + + // show initialize screen + if (!props.isInitialized || props.forgottenPassword) { + // show current view + log.debug('rendering an initialize screen') + switch (props.currentView.name) { + + case 'restoreVault': + log.debug('rendering restore vault screen') + return h(HDRestoreVaultScreen, {key: 'HDRestoreVaultScreen'}) + + default: + log.debug('rendering menu screen') + return h(InitializeMenuScreen, {key: 'menuScreenInit'}) + } + } + + // show unlock screen + if (!props.isUnlocked) { + switch (props.currentView.name) { + + case 'restoreVault': + log.debug('rendering restore vault screen') + return h(HDRestoreVaultScreen, {key: 'HDRestoreVaultScreen'}) + + case 'config': + log.debug('rendering config screen from unlock screen.') + return h(ConfigScreen, {key: 'config'}) + + default: + log.debug('rendering locked screen') + return h(UnlockScreen, {key: 'locked'}) + } + } + + // show current view + switch (props.currentView.name) { + + case 'accountDetail': + log.debug('rendering account detail screen') + return h(AccountDetailScreen, {key: 'account-detail'}) + + case 'sendTransaction': + log.debug('rendering send tx screen') + return h(SendTransactionScreen, {key: 'send-transaction'}) + + case 'newKeychain': + log.debug('rendering new keychain screen') + return h(NewKeyChainScreen, {key: 'new-keychain'}) + + case 'confTx': + log.debug('rendering confirm tx screen') + return h(ConfirmTxScreen, {key: 'confirm-tx'}) + + case 'add-token': + log.debug('rendering add-token screen from unlock screen.') + return h(AddTokenScreen, {key: 'add-token'}) + + case 'config': + log.debug('rendering config screen') + return h(ConfigScreen, {key: 'config'}) + + case 'import-menu': + log.debug('rendering import screen') + return h(Import, {key: 'import-menu'}) + + case 'reveal-seed-conf': + log.debug('rendering reveal seed confirmation screen') + return h(RevealSeedConfirmation, {key: 'reveal-seed-conf'}) + + case 'info': + log.debug('rendering info screen') + return h(InfoScreen, {key: 'info'}) + + case 'buyEth': + log.debug('rendering buy ether screen') + return h(BuyView, {key: 'buyEthView'}) + + case 'onboardingBuyEth': + log.debug('rendering onboarding buy ether screen') + return h(MascaraBuyEtherScreen, {key: 'buyEthView'}) + + case 'qr': + log.debug('rendering show qr screen') + console.log(`QrView`, QrView); + return h('div', { + style: { + position: 'absolute', + height: '100%', + top: '0px', + left: '0px', + }, + }, [ + h('i.fa.fa-arrow-left.fa-lg.cursor-pointer.color-orange', { + onClick: () => props.dispatch(actions.backToAccountDetail(props.activeAddress)), + style: { + marginLeft: '10px', + marginTop: '50px', + }, + }), + h('div', { + style: { + position: 'absolute', + left: '44px', + width: '285px', + }, + }, [ + h(QrView, {key: 'qr'}), + ]), + ]) + + default: + log.debug('rendering default, account detail screen') + return h(AccountDetailScreen, {key: 'account-detail'}) + } +} + +App.prototype.toggleMetamaskActive = function () { + if (!this.props.isUnlocked) { + // currently inactive: redirect to password box + var passwordBox = document.querySelector('input[type=password]') + if (!passwordBox) return + passwordBox.focus() + } else { + // currently active: deactivate + this.props.dispatch(actions.lockMetamask(false)) + } +} + +App.prototype.renderCustomOption = function (provider) { + const { rpcTarget, type } = provider + const props = this.props + + if (type !== 'rpc') return null + + // Concatenate long URLs + let label = rpcTarget + if (rpcTarget.length > 31) { + label = label.substr(0, 34) + '...' + } + + switch (rpcTarget) { + + case 'http://localhost:8545': + return null + + default: + return h( + DropdownMenuItem, + { + key: rpcTarget, + onClick: () => props.dispatch(actions.setRpcTarget(rpcTarget)), + closeMenu: () => this.setState({ isNetworkMenuOpen: false }), + }, + [ + h('i.fa.fa-question-circle.fa-lg.menu-icon'), + label, + h('.check', '✓'), + ] + ) + } +} + +App.prototype.getNetworkName = function () { + const { provider } = this.props + const providerName = provider.type + + let name + + if (providerName === 'mainnet') { + name = 'Main Ethereum Network' + } else if (providerName === 'ropsten') { + name = 'Ropsten Test Network' + } else if (providerName === 'kovan') { + name = 'Kovan Test Network' + } else if (providerName === 'rinkeby') { + name = 'Rinkeby Test Network' + } else { + name = 'Unknown Private Network' + } + + return name +} + +App.prototype.renderCommonRpc = function (rpcList, provider) { + const props = this.props + const rpcTarget = provider.rpcTarget + + return rpcList.map((rpc) => { + if ((rpc === 'http://localhost:8545') || (rpc === rpcTarget)) { + return null + } else { + return h( + DropdownMenuItem, + { + key: `common${rpc}`, + closeMenu: () => this.setState({ isNetworkMenuOpen: false }), + onClick: () => props.dispatch(actions.setRpcTarget(rpc)), + }, + [ + h('i.fa.fa-question-circle.fa-lg.menu-icon'), + rpc, + rpcTarget === rpc ? h('.check', '✓') : null, + ] + ) + } + }) +} diff --git a/old-ui/app/components/account-dropdowns.js b/old-ui/app/components/account-dropdowns.js new file mode 100644 index 000000000..c0ebe3c60 --- /dev/null +++ b/old-ui/app/components/account-dropdowns.js @@ -0,0 +1,320 @@ +const Component = require('react').Component +const PropTypes = require('react').PropTypes +const h = require('react-hyperscript') +const actions = require('../../../ui/app/actions') +const genAccountLink = require('etherscan-link').createAccountLink +const connect = require('react-redux').connect +const Dropdown = require('./dropdown').Dropdown +const DropdownMenuItem = require('./dropdown').DropdownMenuItem +const Identicon = require('./identicon') +const ethUtil = require('ethereumjs-util') +const copyToClipboard = require('copy-to-clipboard') + +class AccountDropdowns extends Component { + constructor (props) { + super(props) + this.state = { + accountSelectorActive: false, + optionsMenuActive: false, + } + this.accountSelectorToggleClassName = 'accounts-selector' + this.optionsMenuToggleClassName = 'fa-ellipsis-h' + } + + renderAccounts () { + const { identities, selected, keyrings } = this.props + + return Object.keys(identities).map((key, index) => { + const identity = identities[key] + const isSelected = identity.address === selected + + const simpleAddress = identity.address.substring(2).toLowerCase() + + const keyring = keyrings.find((kr) => { + return kr.accounts.includes(simpleAddress) || + kr.accounts.includes(identity.address) + }) + + return h( + DropdownMenuItem, + { + closeMenu: () => {}, + onClick: () => { + this.props.actions.showAccountDetail(identity.address) + }, + style: { + marginTop: index === 0 ? '5px' : '', + fontSize: '24px', + }, + }, + [ + h( + Identicon, + { + address: identity.address, + diameter: 32, + style: { + marginLeft: '10px', + }, + }, + ), + this.indicateIfLoose(keyring), + h('span', { + style: { + marginLeft: '20px', + fontSize: '24px', + maxWidth: '145px', + whiteSpace: 'nowrap', + overflow: 'hidden', + textOverflow: 'ellipsis', + }, + }, identity.name || ''), + h('span', { style: { marginLeft: '20px', fontSize: '24px' } }, isSelected ? h('.check', '✓') : null), + ] + ) + }) + } + + indicateIfLoose (keyring) { + try { // Sometimes keyrings aren't loaded yet: + const type = keyring.type + const isLoose = type !== 'HD Key Tree' + return isLoose ? h('.keyring-label', 'LOOSE') : null + } catch (e) { return } + } + + renderAccountSelector () { + const { actions } = this.props + const { accountSelectorActive } = this.state + + return h( + Dropdown, + { + useCssTransition: true, // Hardcoded because account selector is temporarily in app-header + style: { + marginLeft: '-238px', + marginTop: '38px', + minWidth: '180px', + overflowY: 'auto', + maxHeight: '300px', + width: '300px', + }, + innerStyle: { + padding: '8px 25px', + }, + isOpen: accountSelectorActive, + onClickOutside: (event) => { + const { classList } = event.target + const isNotToggleElement = !classList.contains(this.accountSelectorToggleClassName) + if (accountSelectorActive && isNotToggleElement) { + this.setState({ accountSelectorActive: false }) + } + }, + }, + [ + ...this.renderAccounts(), + h( + DropdownMenuItem, + { + closeMenu: () => {}, + onClick: () => actions.addNewAccount(), + }, + [ + h( + Identicon, + { + style: { + marginLeft: '10px', + }, + diameter: 32, + }, + ), + h('span', { style: { marginLeft: '20px', fontSize: '24px' } }, 'Create Account'), + ], + ), + h( + DropdownMenuItem, + { + closeMenu: () => {}, + onClick: () => actions.showImportPage(), + }, + [ + h( + Identicon, + { + style: { + marginLeft: '10px', + }, + diameter: 32, + }, + ), + h('span', { + style: { + marginLeft: '20px', + fontSize: '24px', + marginBottom: '5px', + }, + }, 'Import Account'), + ] + ), + ] + ) + } + + renderAccountOptions () { + const { actions } = this.props + const { optionsMenuActive } = this.state + + return h( + Dropdown, + { + style: { + marginLeft: '-215px', + minWidth: '180px', + }, + isOpen: optionsMenuActive, + onClickOutside: () => { + const { classList } = event.target + const isNotToggleElement = !classList.contains(this.optionsMenuToggleClassName) + if (optionsMenuActive && isNotToggleElement) { + this.setState({ optionsMenuActive: false }) + } + }, + }, + [ + h( + DropdownMenuItem, + { + closeMenu: () => {}, + onClick: () => { + const { selected, network } = this.props + const url = genAccountLink(selected, network) + global.platform.openWindow({ url }) + }, + }, + 'View account on Etherscan', + ), + h( + DropdownMenuItem, + { + closeMenu: () => {}, + onClick: () => { + const { selected, identities } = this.props + var identity = identities[selected] + actions.showQrView(selected, identity ? identity.name : '') + }, + }, + 'Show QR Code', + ), + h( + DropdownMenuItem, + { + closeMenu: () => {}, + onClick: () => { + const { selected } = this.props + const checkSumAddress = selected && ethUtil.toChecksumAddress(selected) + copyToClipboard(checkSumAddress) + }, + }, + 'Copy Address to clipboard', + ), + h( + DropdownMenuItem, + { + closeMenu: () => {}, + onClick: () => { + actions.requestAccountExport() + }, + }, + 'Export Private Key', + ), + ] + ) + } + + render () { + const { style, enableAccountsSelector, enableAccountOptions } = this.props + const { optionsMenuActive, accountSelectorActive } = this.state + + return h( + 'span', + { + style: style, + }, + [ + enableAccountsSelector && h( + // 'i.fa.fa-angle-down', + 'div.cursor-pointer.color-orange.accounts-selector', + { + style: { + // fontSize: '1.8em', + background: 'url(images/switch_acc.svg) white center center no-repeat', + height: '25px', + width: '25px', + transform: 'scale(0.75)', + marginRight: '3px', + }, + onClick: (event) => { + event.stopPropagation() + this.setState({ + accountSelectorActive: !accountSelectorActive, + optionsMenuActive: false, + }) + }, + }, + this.renderAccountSelector(), + ), + enableAccountOptions && h( + 'i.fa.fa-ellipsis-h', + { + style: { + marginRight: '0.5em', + fontSize: '1.8em', + }, + onClick: (event) => { + event.stopPropagation() + this.setState({ + accountSelectorActive: false, + optionsMenuActive: !optionsMenuActive, + }) + }, + }, + this.renderAccountOptions() + ), + ] + ) + } +} + +AccountDropdowns.defaultProps = { + enableAccountsSelector: false, + enableAccountOptions: false, +} + +AccountDropdowns.propTypes = { + identities: PropTypes.objectOf(PropTypes.object), + selected: PropTypes.string, + keyrings: PropTypes.array, + actions: PropTypes.objectOf(PropTypes.func), + network: PropTypes.string, + style: PropTypes.object, + enableAccountOptions: PropTypes.bool, + enableAccountsSelector: PropTypes.bool, +} + +const mapDispatchToProps = (dispatch) => { + return { + actions: { + showConfigPage: () => dispatch(actions.showConfigPage()), + requestAccountExport: () => dispatch(actions.requestExportAccount()), + showAccountDetail: (address) => dispatch(actions.showAccountDetail(address)), + addNewAccount: () => dispatch(actions.addNewAccount()), + showImportPage: () => dispatch(actions.showImportPage()), + showQrView: (selected, identity) => dispatch(actions.showQrView(selected, identity)), + }, + } +} + +module.exports = { + AccountDropdowns: connect(null, mapDispatchToProps)(AccountDropdowns), +} diff --git a/old-ui/app/components/account-export.js b/old-ui/app/components/account-export.js new file mode 100644 index 000000000..51b85b786 --- /dev/null +++ b/old-ui/app/components/account-export.js @@ -0,0 +1,132 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const exportAsFile = require('../util').exportAsFile +const copyToClipboard = require('copy-to-clipboard') +const actions = require('../../../ui/app/actions') +const ethUtil = require('ethereumjs-util') +const connect = require('react-redux').connect + +module.exports = connect(mapStateToProps)(ExportAccountView) + +inherits(ExportAccountView, Component) +function ExportAccountView () { + Component.call(this) +} + +function mapStateToProps (state) { + return { + warning: state.appState.warning, + } +} + +ExportAccountView.prototype.render = function () { + const state = this.props + const accountDetail = state.accountDetail + const nickname = state.identities[state.address].name + + if (!accountDetail) return h('div') + const accountExport = accountDetail.accountExport + + const notExporting = accountExport === 'none' + const exportRequested = accountExport === 'requested' + const accountExported = accountExport === 'completed' + + if (notExporting) return h('div') + + if (exportRequested) { + const warning = `Export private keys at your own risk.` + return ( + h('div', { + style: { + display: 'inline-block', + textAlign: 'center', + }, + }, + [ + h('div', { + key: 'exporting', + style: { + margin: '0 20px', + }, + }, [ + h('p.error', warning), + h('input#exportAccount.sizing-input', { + type: 'password', + placeholder: 'confirm password', + onKeyPress: this.onExportKeyPress.bind(this), + style: { + position: 'relative', + top: '1.5px', + marginBottom: '7px', + }, + }), + ]), + h('div', { + key: 'buttons', + style: { + margin: '0 20px', + }, + }, + [ + h('button', { + onClick: () => this.onExportKeyPress({ key: 'Enter', preventDefault: () => {} }), + style: { + marginRight: '10px', + }, + }, 'Submit'), + h('button', { + onClick: () => this.props.dispatch(actions.backToAccountDetail(this.props.address)), + }, 'Cancel'), + ]), + (this.props.warning) && ( + h('span.error', { + style: { + margin: '20px', + }, + }, this.props.warning.split('-')) + ), + ]) + ) + } + + if (accountExported) { + const plainKey = ethUtil.stripHexPrefix(accountDetail.privateKey) + + return h('div.privateKey', { + style: { + margin: '0 20px', + }, + }, [ + h('label', 'Your private key (click to copy):'), + h('p.error.cursor-pointer', { + style: { + textOverflow: 'ellipsis', + overflow: 'hidden', + webkitUserSelect: 'text', + maxWidth: '275px', + }, + onClick: function (event) { + copyToClipboard(ethUtil.stripHexPrefix(accountDetail.privateKey)) + }, + }, plainKey), + h('button', { + onClick: () => this.props.dispatch(actions.backToAccountDetail(this.props.address)), + }, 'Done'), + h('button', { + style: { + marginLeft: '10px', + }, + onClick: () => exportAsFile(`MetaMask ${nickname} Private Key`, plainKey), + }, 'Save as File'), + ]) + } +} + +ExportAccountView.prototype.onExportKeyPress = function (event) { + if (event.key !== 'Enter') return + event.preventDefault() + + const input = document.getElementById('exportAccount').value + this.props.dispatch(actions.exportAccount(input, this.props.address)) +} diff --git a/old-ui/app/components/account-panel.js b/old-ui/app/components/account-panel.js new file mode 100644 index 000000000..abaaf8163 --- /dev/null +++ b/old-ui/app/components/account-panel.js @@ -0,0 +1,86 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const Identicon = require('./identicon') +const formatBalance = require('../util').formatBalance +const addressSummary = require('../util').addressSummary + +module.exports = AccountPanel + + +inherits(AccountPanel, Component) +function AccountPanel () { + Component.call(this) +} + +AccountPanel.prototype.render = function () { + var state = this.props + var identity = state.identity || {} + var account = state.account || {} + var isFauceting = state.isFauceting + + var panelState = { + key: `accountPanel${identity.address}`, + identiconKey: identity.address, + identiconLabel: identity.name || '', + attributes: [ + { + key: 'ADDRESS', + value: addressSummary(identity.address), + }, + balanceOrFaucetingIndication(account, isFauceting), + ], + } + + return ( + + h('.identity-panel.flex-row.flex-space-between', { + style: { + flex: '1 0 auto', + cursor: panelState.onClick ? 'pointer' : undefined, + }, + onClick: panelState.onClick, + }, [ + + // account identicon + h('.identicon-wrapper.flex-column.select-none', [ + h(Identicon, { + address: panelState.identiconKey, + imageify: state.imageifyIdenticons, + }), + h('span.font-small', panelState.identiconLabel.substring(0, 7) + '...'), + ]), + + // account address, balance + h('.identity-data.flex-column.flex-justify-center.flex-grow.select-none', [ + + panelState.attributes.map((attr) => { + return h('.flex-row.flex-space-between', { + key: '' + Math.round(Math.random() * 1000000), + }, [ + h('label.font-small.no-select', attr.key), + h('span.font-small', attr.value), + ]) + }), + ]), + + ]) + + ) +} + +function balanceOrFaucetingIndication (account, isFauceting) { + // Temporarily deactivating isFauceting indication + // because it shows fauceting for empty restored accounts. + if (/* isFauceting*/ false) { + return { + key: 'Account is auto-funding.', + value: 'Please wait.', + } + } else { + return { + key: 'BALANCE', + value: formatBalance(account.balance), + } + } +} diff --git a/old-ui/app/components/balance.js b/old-ui/app/components/balance.js new file mode 100644 index 000000000..57ca84564 --- /dev/null +++ b/old-ui/app/components/balance.js @@ -0,0 +1,89 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const formatBalance = require('../util').formatBalance +const generateBalanceObject = require('../util').generateBalanceObject +const Tooltip = require('./tooltip.js') +const FiatValue = require('./fiat-value.js') + +module.exports = EthBalanceComponent + +inherits(EthBalanceComponent, Component) +function EthBalanceComponent () { + Component.call(this) +} + +EthBalanceComponent.prototype.render = function () { + var props = this.props + let { value } = props + var style = props.style + var needsParse = this.props.needsParse !== undefined ? this.props.needsParse : true + value = value ? formatBalance(value, 6, needsParse) : '...' + var width = props.width + + return ( + + h('.ether-balance.ether-balance-amount', { + style: style, + }, [ + h('div', { + style: { + display: 'inline', + width: width, + }, + }, this.renderBalance(value)), + ]) + + ) +} +EthBalanceComponent.prototype.renderBalance = function (value) { + var props = this.props + if (value === 'None') return value + if (value === '...') return value + var balanceObj = generateBalanceObject(value, props.shorten ? 1 : 3) + var balance + var splitBalance = value.split(' ') + var ethNumber = splitBalance[0] + var ethSuffix = splitBalance[1] + const showFiat = 'showFiat' in props ? props.showFiat : true + + if (props.shorten) { + balance = balanceObj.shortBalance + } else { + balance = balanceObj.balance + } + + var label = balanceObj.label + + return ( + h(Tooltip, { + position: 'bottom', + title: `${ethNumber} ${ethSuffix}`, + }, h('div.flex-column', [ + h('.flex-row', { + style: { + alignItems: 'flex-end', + lineHeight: '13px', + fontFamily: 'Montserrat Light', + textRendering: 'geometricPrecision', + }, + }, [ + h('div', { + style: { + width: '100%', + textAlign: 'right', + }, + }, this.props.incoming ? `+${balance}` : balance), + h('div', { + style: { + color: ' #AEAEAE', + fontSize: '12px', + marginLeft: '5px', + }, + }, label), + ]), + + showFiat ? h(FiatValue, { value: props.value }) : null, + ])) + ) +} diff --git a/old-ui/app/components/binary-renderer.js b/old-ui/app/components/binary-renderer.js new file mode 100644 index 000000000..0b6a1f5c2 --- /dev/null +++ b/old-ui/app/components/binary-renderer.js @@ -0,0 +1,46 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const ethUtil = require('ethereumjs-util') +const extend = require('xtend') + +module.exports = BinaryRenderer + +inherits(BinaryRenderer, Component) +function BinaryRenderer () { + Component.call(this) +} + +BinaryRenderer.prototype.render = function () { + const props = this.props + const { value, style } = props + const text = this.hexToText(value) + + const defaultStyle = extend({ + width: '315px', + maxHeight: '210px', + resize: 'none', + border: 'none', + background: 'white', + padding: '3px', + }, style) + + return ( + h('textarea.font-small', { + readOnly: true, + style: defaultStyle, + defaultValue: text, + }) + ) +} + +BinaryRenderer.prototype.hexToText = function (hex) { + try { + const stripped = ethUtil.stripHexPrefix(hex) + const buff = Buffer.from(stripped, 'hex') + return buff.toString('utf8') + } catch (e) { + return hex + } +} + diff --git a/old-ui/app/components/bn-as-decimal-input.js b/old-ui/app/components/bn-as-decimal-input.js new file mode 100644 index 000000000..22e37602e --- /dev/null +++ b/old-ui/app/components/bn-as-decimal-input.js @@ -0,0 +1,181 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const ethUtil = require('ethereumjs-util') +const BN = ethUtil.BN +const extend = require('xtend') + +module.exports = BnAsDecimalInput + +inherits(BnAsDecimalInput, Component) +function BnAsDecimalInput () { + this.state = { invalid: null } + Component.call(this) +} + +/* Bn as Decimal Input + * + * A component for allowing easy, decimal editing + * of a passed in bn string value. + * + * On change, calls back its `onChange` function parameter + * and passes it an updated bn string. + */ + +BnAsDecimalInput.prototype.render = function () { + const props = this.props + const state = this.state + + const { value, scale, precision, onChange, min, max } = props + + const suffix = props.suffix + const style = props.style + const valueString = value.toString(10) + const newMin = min && this.downsize(min.toString(10), scale) + const newMax = max && this.downsize(max.toString(10), scale) + const newValue = this.downsize(valueString, scale) + + return ( + h('.flex-column', [ + h('.flex-row', { + style: { + alignItems: 'flex-end', + lineHeight: '13px', + fontFamily: 'Montserrat Light', + textRendering: 'geometricPrecision', + }, + }, [ + h('input.hex-input', { + type: 'number', + step: 'any', + required: true, + min: newMin, + max: newMax, + style: extend({ + display: 'block', + textAlign: 'right', + backgroundColor: 'transparent', + border: '1px solid #bdbdbd', + + }, style), + value: newValue, + onBlur: (event) => { + this.updateValidity(event) + }, + onChange: (event) => { + this.updateValidity(event) + const value = (event.target.value === '') ? '' : event.target.value + + + const scaledNumber = this.upsize(value, scale, precision) + const precisionBN = new BN(scaledNumber, 10) + onChange(precisionBN, event.target.checkValidity()) + }, + onInvalid: (event) => { + const msg = this.constructWarning() + if (msg === state.invalid) { + return + } + this.setState({ invalid: msg }) + event.preventDefault() + return false + }, + }), + h('div', { + style: { + color: ' #AEAEAE', + fontSize: '12px', + marginLeft: '5px', + marginRight: '6px', + width: '20px', + }, + }, suffix), + ]), + + state.invalid ? h('span.error', { + style: { + position: 'absolute', + right: '0px', + textAlign: 'right', + transform: 'translateY(26px)', + padding: '3px', + background: 'rgba(255,255,255,0.85)', + zIndex: '1', + textTransform: 'capitalize', + border: '2px solid #E20202', + }, + }, state.invalid) : null, + ]) + ) +} + +BnAsDecimalInput.prototype.setValid = function (message) { + this.setState({ invalid: null }) +} + +BnAsDecimalInput.prototype.updateValidity = function (event) { + const target = event.target + const value = this.props.value + const newValue = target.value + + if (value === newValue) { + return + } + + const valid = target.checkValidity() + + if (valid) { + this.setState({ invalid: null }) + } +} + +BnAsDecimalInput.prototype.constructWarning = function () { + const { name, min, max, scale, suffix } = this.props + const newMin = min && this.downsize(min.toString(10), scale) + const newMax = max && this.downsize(max.toString(10), scale) + let message = name ? name + ' ' : '' + + if (min && max) { + message += `must be greater than or equal to ${newMin} ${suffix} and less than or equal to ${newMax} ${suffix}.` + } else if (min) { + message += `must be greater than or equal to ${newMin} ${suffix}.` + } else if (max) { + message += `must be less than or equal to ${newMax} ${suffix}.` + } else { + message += 'Invalid input.' + } + + return message +} + + +BnAsDecimalInput.prototype.downsize = function (number, scale) { + // if there is no scaling, simply return the number + if (scale === 0) { + return Number(number) + } else { + // if the scale is the same as the precision, account for this edge case. + var adjustedNumber = number + while (adjustedNumber.length < scale) { + adjustedNumber = '0' + adjustedNumber + } + return Number(adjustedNumber.slice(0, -scale) + '.' + adjustedNumber.slice(-scale)) + } +} + +BnAsDecimalInput.prototype.upsize = function (number, scale, precision) { + var stringArray = number.toString().split('.') + var decimalLength = stringArray[1] ? stringArray[1].length : 0 + var newString = stringArray[0] + + // If there is scaling and decimal parts exist, integrate them in. + if ((scale !== 0) && (decimalLength !== 0)) { + newString += stringArray[1].slice(0, precision) + } + + // Add 0s to account for the upscaling. + for (var i = decimalLength; i < scale; i++) { + newString += '0' + } + return newString +} diff --git a/old-ui/app/components/buy-button-subview.js b/old-ui/app/components/buy-button-subview.js new file mode 100644 index 000000000..843627c33 --- /dev/null +++ b/old-ui/app/components/buy-button-subview.js @@ -0,0 +1,262 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const connect = require('react-redux').connect +const actions = require('../../../ui/app/actions') +const CoinbaseForm = require('./coinbase-form') +const ShapeshiftForm = require('./shapeshift-form') +const Loading = require('./loading') +const AccountPanel = require('./account-panel') +const RadioList = require('./custom-radio-list') +const networkNames = require('../../../app/scripts/config.js').networkNames + +module.exports = connect(mapStateToProps)(BuyButtonSubview) + +function mapStateToProps (state) { + return { + identity: state.appState.identity, + account: state.metamask.accounts[state.appState.buyView.buyAddress], + warning: state.appState.warning, + buyView: state.appState.buyView, + network: state.metamask.network, + provider: state.metamask.provider, + context: state.appState.currentView.context, + isSubLoading: state.appState.isSubLoading, + } +} + +inherits(BuyButtonSubview, Component) +function BuyButtonSubview () { + Component.call(this) +} + +BuyButtonSubview.prototype.render = function () { + return ( + h('div', { + style: { + width: '100%', + }, + }, [ + this.headerSubview(), + this.primarySubview(), + ]) + ) +} + +BuyButtonSubview.prototype.headerSubview = function () { + const props = this.props + const isLoading = props.isSubLoading + return ( + + h('.flex-column', { + style: { + alignItems: 'center', + }, + }, [ + + // header bar (back button, label) + h('.flex-row', { + style: { + alignItems: 'center', + justifyContent: 'center', + }, + }, [ + h('i.fa.fa-arrow-left.fa-lg.cursor-pointer.color-orange', { + onClick: this.backButtonContext.bind(this), + style: { + position: 'absolute', + left: '10px', + }, + }), + h('h2.text-transform-uppercase.flex-center', { + style: { + width: '100vw', + background: 'rgb(235, 235, 235)', + color: 'rgb(174, 174, 174)', + paddingTop: '4px', + paddingBottom: '4px', + }, + }, 'Buy Eth'), + ]), + + // loading indication + h('div', { + style: { + position: 'absolute', + top: '57vh', + left: '49vw', + }, + }, [ + h(Loading, { isLoading }), + ]), + + // account panel + h('div', { + style: { + width: '80%', + }, + }, [ + h(AccountPanel, { + showFullAddress: true, + identity: props.identity, + account: props.account, + }), + ]), + + h('.flex-row', { + style: { + alignItems: 'center', + justifyContent: 'center', + }, + }, [ + h('h3.text-transform-uppercase.flex-center', { + style: { + paddingLeft: '15px', + width: '100vw', + background: 'rgb(235, 235, 235)', + color: 'rgb(174, 174, 174)', + paddingTop: '4px', + paddingBottom: '4px', + }, + }, 'Select Service'), + ]), + + ]) + + ) +} + + +BuyButtonSubview.prototype.primarySubview = function () { + const props = this.props + const network = props.network + + switch (network) { + case 'loading': + return + + case '1': + return this.mainnetSubview() + + // Ropsten, Rinkeby, Kovan + case '3': + case '4': + case '42': + const networkName = networkNames[network] + const label = `${networkName} Test Faucet` + return ( + h('div.flex-column', { + style: { + alignItems: 'center', + margin: '20px 50px', + }, + }, [ + h('button.text-transform-uppercase', { + onClick: () => this.props.dispatch(actions.buyEth({ network })), + style: { + marginTop: '15px', + }, + }, label), + // Kovan only: Dharma loans beta + network === '42' ? ( + h('button.text-transform-uppercase', { + onClick: () => this.navigateTo('https://borrow.dharma.io/'), + style: { + marginTop: '15px', + }, + }, 'Borrow With Dharma (Beta)') + ) : null, + ]) + ) + + default: + return ( + h('h2.error', 'Unknown network ID') + ) + + } +} + +BuyButtonSubview.prototype.mainnetSubview = function () { + const props = this.props + + return ( + + h('.flex-column', { + style: { + alignItems: 'center', + }, + }, [ + + h('.flex-row.selected-exchange', { + style: { + position: 'relative', + right: '35px', + marginTop: '20px', + marginBottom: '20px', + }, + }, [ + h(RadioList, { + defaultFocus: props.buyView.subview, + labels: [ + 'Coinbase', + 'ShapeShift', + ], + subtext: { + 'Coinbase': 'Crypto/FIAT (USA only)', + 'ShapeShift': 'Crypto', + }, + onClick: this.radioHandler.bind(this), + }), + ]), + + h('h3.text-transform-uppercase', { + style: { + paddingLeft: '15px', + fontFamily: 'Montserrat Light', + width: '100vw', + background: 'rgb(235, 235, 235)', + color: 'rgb(174, 174, 174)', + paddingTop: '4px', + paddingBottom: '4px', + }, + }, props.buyView.subview), + + this.formVersionSubview(), + ]) + + ) +} + +BuyButtonSubview.prototype.formVersionSubview = function () { + const network = this.props.network + if (network === '1') { + if (this.props.buyView.formView.coinbase) { + return h(CoinbaseForm, this.props) + } else if (this.props.buyView.formView.shapeshift) { + return h(ShapeshiftForm, this.props) + } + } +} + +BuyButtonSubview.prototype.navigateTo = function (url) { + global.platform.openWindow({ url }) +} + +BuyButtonSubview.prototype.backButtonContext = function () { + if (this.props.context === 'confTx') { + this.props.dispatch(actions.showConfTxPage(false)) + } else { + console.log(`actions.goHome`, actions.goHome); + this.props.dispatch(actions.goHome()) + } +} + +BuyButtonSubview.prototype.radioHandler = function (event) { + switch (event.target.title) { + case 'Coinbase': + return this.props.dispatch(actions.coinBaseSubview()) + case 'ShapeShift': + return this.props.dispatch(actions.shapeShiftSubview(this.props.provider.type)) + } +} diff --git a/old-ui/app/components/coinbase-form.js b/old-ui/app/components/coinbase-form.js new file mode 100644 index 000000000..35b2111ff --- /dev/null +++ b/old-ui/app/components/coinbase-form.js @@ -0,0 +1,63 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const connect = require('react-redux').connect +const actions = require('../../../ui/app/actions') + +module.exports = connect(mapStateToProps)(CoinbaseForm) + +function mapStateToProps (state) { + return { + warning: state.appState.warning, + } +} + +inherits(CoinbaseForm, Component) + +function CoinbaseForm () { + Component.call(this) +} + +CoinbaseForm.prototype.render = function () { + var props = this.props + + return h('.flex-column', { + style: { + marginTop: '35px', + padding: '25px', + width: '100%', + }, + }, [ + h('.flex-row', { + style: { + justifyContent: 'space-around', + margin: '33px', + marginTop: '0px', + }, + }, [ + h('button.btn-green', { + onClick: this.toCoinbase.bind(this), + }, 'Continue to Coinbase'), + + h('button.btn-red', { + onClick: () => props.dispatch(actions.backTobuyView(props.accounts.address)), + }, 'Cancel'), + ]), + ]) +} + +CoinbaseForm.prototype.toCoinbase = function () { + const props = this.props + const address = props.buyView.buyAddress + props.dispatch(actions.buyEth({ network: '1', address, amount: 0 })) +} + +CoinbaseForm.prototype.renderLoading = function () { + return h('img', { + style: { + width: '27px', + marginRight: '-27px', + }, + src: 'images/loading.svg', + }) +} diff --git a/old-ui/app/components/copyButton.js b/old-ui/app/components/copyButton.js new file mode 100644 index 000000000..a25d0719c --- /dev/null +++ b/old-ui/app/components/copyButton.js @@ -0,0 +1,59 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const copyToClipboard = require('copy-to-clipboard') + +const Tooltip = require('./tooltip') + +module.exports = CopyButton + +inherits(CopyButton, Component) +function CopyButton () { + Component.call(this) +} + +// As parameters, accepts: +// "value", which is the value to copy (mandatory) +// "title", which is the text to show on hover (optional, defaults to 'Copy') +CopyButton.prototype.render = function () { + const props = this.props + const state = this.state || {} + + const value = props.value + const copied = state.copied + + const message = copied ? 'Copied' : props.title || ' Copy ' + + return h('.copy-button', { + style: { + display: 'flex', + alignItems: 'center', + }, + }, [ + + h(Tooltip, { + title: message, + }, [ + h('i.fa.fa-clipboard.cursor-pointer.color-orange', { + style: { + margin: '5px', + }, + onClick: (event) => { + event.preventDefault() + event.stopPropagation() + copyToClipboard(value) + this.debounceRestore() + }, + }), + ]), + + ]) +} + +CopyButton.prototype.debounceRestore = function () { + this.setState({ copied: true }) + clearTimeout(this.timeout) + this.timeout = setTimeout(() => { + this.setState({ copied: false }) + }, 850) +} diff --git a/old-ui/app/components/copyable.js b/old-ui/app/components/copyable.js new file mode 100644 index 000000000..a4f6f4bc6 --- /dev/null +++ b/old-ui/app/components/copyable.js @@ -0,0 +1,46 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits + +const Tooltip = require('./tooltip') +const copyToClipboard = require('copy-to-clipboard') + +module.exports = Copyable + +inherits(Copyable, Component) +function Copyable () { + Component.call(this) + this.state = { + copied: false, + } +} + +Copyable.prototype.render = function () { + const props = this.props + const state = this.state + const { value, children } = props + const { copied } = state + + return h(Tooltip, { + title: copied ? 'Copied!' : 'Copy', + position: 'bottom', + }, h('span', { + style: { + cursor: 'pointer', + }, + onClick: (event) => { + event.preventDefault() + event.stopPropagation() + copyToClipboard(value) + this.debounceRestore() + }, + }, children)) +} + +Copyable.prototype.debounceRestore = function () { + this.setState({ copied: true }) + clearTimeout(this.timeout) + this.timeout = setTimeout(() => { + this.setState({ copied: false }) + }, 850) +} diff --git a/old-ui/app/components/custom-radio-list.js b/old-ui/app/components/custom-radio-list.js new file mode 100644 index 000000000..a4c525396 --- /dev/null +++ b/old-ui/app/components/custom-radio-list.js @@ -0,0 +1,60 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits + +module.exports = RadioList + +inherits(RadioList, Component) +function RadioList () { + Component.call(this) +} + +RadioList.prototype.render = function () { + const props = this.props + const activeClass = '.custom-radio-selected' + const inactiveClass = '.custom-radio-inactive' + const { + labels, + defaultFocus, + } = props + + + return ( + h('.flex-row', { + style: { + fontSize: '12px', + }, + }, [ + h('.flex-column.custom-radios', { + style: { + marginRight: '5px', + }, + }, + labels.map((lable, i) => { + let isSelcted = (this.state !== null) + isSelcted = isSelcted ? (this.state.selected === lable) : (defaultFocus === lable) + return h(isSelcted ? activeClass : inactiveClass, { + title: lable, + onClick: (event) => { + this.setState({selected: event.target.title}) + props.onClick(event) + }, + }) + }) + ), + h('.text', {}, + labels.map((lable) => { + if (props.subtext) { + return h('.flex-row', {}, [ + h('.radio-titles', lable), + h('.radio-titles-subtext', `- ${props.subtext[lable]}`), + ]) + } else { + return h('.radio-titles', lable) + } + }) + ), + ]) + ) +} + diff --git a/old-ui/app/components/dropdown.js b/old-ui/app/components/dropdown.js new file mode 100644 index 000000000..cdd864cc3 --- /dev/null +++ b/old-ui/app/components/dropdown.js @@ -0,0 +1,98 @@ +const Component = require('react').Component +const PropTypes = require('react').PropTypes +const h = require('react-hyperscript') +const MenuDroppo = require('./menu-droppo') +const extend = require('xtend') + +const noop = () => {} + +class Dropdown extends Component { + render () { + const { isOpen, onClickOutside, style, innerStyle, children, useCssTransition } = this.props + + const innerStyleDefaults = extend({ + borderRadius: '4px', + padding: '8px 16px', + background: 'rgba(0, 0, 0, 0.8)', + boxShadow: 'rgba(0, 0, 0, 0.15) 0px 2px 2px 2px', + }, innerStyle) + + return h( + MenuDroppo, + { + useCssTransition, + isOpen, + zIndex: 11, + onClickOutside, + style, + innerStyle: innerStyleDefaults, + }, + [ + h( + 'style', + ` + li.dropdown-menu-item:hover { color:rgb(225, 225, 225); } + li.dropdown-menu-item { color: rgb(185, 185, 185); position: relative } + ` + ), + ...children, + ] + ) + } +} + +Dropdown.defaultProps = { + isOpen: false, + onClick: noop, + useCssTransition: false, +} + +Dropdown.propTypes = { + isOpen: PropTypes.bool.isRequired, + onClick: PropTypes.func.isRequired, + children: PropTypes.node, + style: PropTypes.object.isRequired, + onClickOutside: PropTypes.func, + innerStyle: PropTypes.object, + useCssTransition: PropTypes.bool, +} + +class DropdownMenuItem extends Component { + render () { + const { onClick, closeMenu, children, style } = this.props + + return h( + 'li.dropdown-menu-item', + { + onClick: () => { + onClick() + closeMenu() + }, + style: Object.assign({ + listStyle: 'none', + padding: '8px 0px 8px 0px', + fontSize: '18px', + fontStyle: 'normal', + fontFamily: 'Montserrat Regular', + cursor: 'pointer', + display: 'flex', + justifyContent: 'flex-start', + alignItems: 'center', + }, style), + }, + children + ) + } +} + +DropdownMenuItem.propTypes = { + closeMenu: PropTypes.func.isRequired, + onClick: PropTypes.func.isRequired, + children: PropTypes.node, + style: PropTypes.object, +} + +module.exports = { + Dropdown, + DropdownMenuItem, +} diff --git a/old-ui/app/components/editable-label.js b/old-ui/app/components/editable-label.js new file mode 100644 index 000000000..8a5c8954f --- /dev/null +++ b/old-ui/app/components/editable-label.js @@ -0,0 +1,57 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const findDOMNode = require('react-dom').findDOMNode + +module.exports = EditableLabel + +inherits(EditableLabel, Component) +function EditableLabel () { + Component.call(this) +} + +EditableLabel.prototype.render = function () { + const props = this.props + const state = this.state + + if (state && state.isEditingLabel) { + return h('div.editable-label', [ + h('input.sizing-input', { + defaultValue: props.textValue, + maxLength: '20', + onKeyPress: (event) => { + this.saveIfEnter(event) + }, + }), + h('button.editable-button', { + onClick: () => this.saveText(), + }, 'Save'), + ]) + } else { + return h('div.name-label', { + onClick: (event) => { + const nameAttribute = event.target.getAttribute('name') + // checks for class to handle smaller CTA above the account name + const classAttribute = event.target.getAttribute('class') + if (nameAttribute === 'edit' || classAttribute === 'edit-text') { + this.setState({ isEditingLabel: true }) + } + }, + }, this.props.children) + } +} + +EditableLabel.prototype.saveIfEnter = function (event) { + if (event.key === 'Enter') { + this.saveText() + } +} + +EditableLabel.prototype.saveText = function () { + // eslint-disable-next-line react/no-find-dom-node + var container = findDOMNode(this) + var text = container.querySelector('.editable-label input').value + var truncatedText = text.substring(0, 20) + this.props.saveText(truncatedText) + this.setState({ isEditingLabel: false, textLabel: truncatedText }) +} diff --git a/old-ui/app/components/ens-input.js b/old-ui/app/components/ens-input.js new file mode 100644 index 000000000..c85a23514 --- /dev/null +++ b/old-ui/app/components/ens-input.js @@ -0,0 +1,170 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const extend = require('xtend') +const debounce = require('debounce') +const copyToClipboard = require('copy-to-clipboard') +const ENS = require('ethjs-ens') +const networkMap = require('ethjs-ens/lib/network-map.json') +const ensRE = /.+\..+$/ +const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000' + + +module.exports = EnsInput + +inherits(EnsInput, Component) +function EnsInput () { + Component.call(this) +} + +EnsInput.prototype.render = function () { + const props = this.props + const opts = extend(props, { + list: 'addresses', + onChange: () => { + const network = this.props.network + const networkHasEnsSupport = getNetworkEnsSupport(network) + if (!networkHasEnsSupport) return + + const recipient = document.querySelector('input[name="address"]').value + if (recipient.match(ensRE) === null) { + return this.setState({ + loadingEns: false, + ensResolution: null, + ensFailure: null, + }) + } + + this.setState({ + loadingEns: true, + }) + this.checkName() + }, + }) + return h('div', { + style: { width: '100%' }, + }, [ + h('input.large-input', opts), + // The address book functionality. + h('datalist#addresses', + [ + // Corresponds to the addresses owned. + Object.keys(props.identities).map((key) => { + const identity = props.identities[key] + return h('option', { + value: identity.address, + label: identity.name, + key: identity.address, + }) + }), + // Corresponds to previously sent-to addresses. + props.addressBook.map((identity) => { + return h('option', { + value: identity.address, + label: identity.name, + key: identity.address, + }) + }), + ]), + this.ensIcon(), + ]) +} + +EnsInput.prototype.componentDidMount = function () { + const network = this.props.network + const networkHasEnsSupport = getNetworkEnsSupport(network) + this.setState({ ensResolution: ZERO_ADDRESS }) + + if (networkHasEnsSupport) { + const provider = global.ethereumProvider + this.ens = new ENS({ provider, network }) + this.checkName = debounce(this.lookupEnsName.bind(this), 200) + } +} + +EnsInput.prototype.lookupEnsName = function () { + const recipient = document.querySelector('input[name="address"]').value + const { ensResolution } = this.state + + log.info(`ENS attempting to resolve name: ${recipient}`) + this.ens.lookup(recipient.trim()) + .then((address) => { + if (address === ZERO_ADDRESS) throw new Error('No address has been set for this name.') + if (address !== ensResolution) { + this.setState({ + loadingEns: false, + ensResolution: address, + nickname: recipient.trim(), + hoverText: address + '\nClick to Copy', + ensFailure: false, + }) + } + }) + .catch((reason) => { + log.error(reason) + return this.setState({ + loadingEns: false, + ensResolution: ZERO_ADDRESS, + ensFailure: true, + hoverText: reason.message, + }) + }) +} + +EnsInput.prototype.componentDidUpdate = function (prevProps, prevState) { + const state = this.state || {} + const ensResolution = state.ensResolution + // If an address is sent without a nickname, meaning not from ENS or from + // the user's own accounts, a default of a one-space string is used. + const nickname = state.nickname || ' ' + if (prevState && ensResolution && this.props.onChange && + ensResolution !== prevState.ensResolution) { + this.props.onChange(ensResolution, nickname) + } +} + +EnsInput.prototype.ensIcon = function (recipient) { + const { hoverText } = this.state || {} + return h('span', { + title: hoverText, + style: { + position: 'absolute', + padding: '9px', + transform: 'translatex(-40px)', + }, + }, this.ensIconContents(recipient)) +} + +EnsInput.prototype.ensIconContents = function (recipient) { + const { loadingEns, ensFailure, ensResolution } = this.state || { ensResolution: ZERO_ADDRESS} + + if (loadingEns) { + return h('img', { + src: 'images/loading.svg', + style: { + width: '30px', + height: '30px', + transform: 'translateY(-6px)', + }, + }) + } + + if (ensFailure) { + return h('i.fa.fa-warning.fa-lg.warning') + } + + if (ensResolution && (ensResolution !== ZERO_ADDRESS)) { + return h('i.fa.fa-check-circle.fa-lg.cursor-pointer', { + style: { color: 'green' }, + onClick: (event) => { + event.preventDefault() + event.stopPropagation() + copyToClipboard(ensResolution) + }, + }) + } +} + +function getNetworkEnsSupport (network) { + return Boolean(networkMap[network]) +} diff --git a/old-ui/app/components/eth-balance.js b/old-ui/app/components/eth-balance.js new file mode 100644 index 000000000..4f538fd31 --- /dev/null +++ b/old-ui/app/components/eth-balance.js @@ -0,0 +1,89 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const formatBalance = require('../util').formatBalance +const generateBalanceObject = require('../util').generateBalanceObject +const Tooltip = require('./tooltip.js') +const FiatValue = require('./fiat-value.js') + +module.exports = EthBalanceComponent + +inherits(EthBalanceComponent, Component) +function EthBalanceComponent () { + Component.call(this) +} + +EthBalanceComponent.prototype.render = function () { + var props = this.props + let { value } = props + const { style, width } = props + var needsParse = this.props.needsParse !== undefined ? this.props.needsParse : true + value = value ? formatBalance(value, 6, needsParse) : '...' + + return ( + + h('.ether-balance.ether-balance-amount', { + style, + }, [ + h('div', { + style: { + display: 'inline', + width, + }, + }, this.renderBalance(value)), + ]) + + ) +} +EthBalanceComponent.prototype.renderBalance = function (value) { + var props = this.props + const { conversionRate, shorten, incoming, currentCurrency } = props + if (value === 'None') return value + if (value === '...') return value + var balanceObj = generateBalanceObject(value, shorten ? 1 : 3) + var balance + var splitBalance = value.split(' ') + var ethNumber = splitBalance[0] + var ethSuffix = splitBalance[1] + const showFiat = 'showFiat' in props ? props.showFiat : true + + if (shorten) { + balance = balanceObj.shortBalance + } else { + balance = balanceObj.balance + } + + var label = balanceObj.label + + return ( + h(Tooltip, { + position: 'bottom', + title: `${ethNumber} ${ethSuffix}`, + }, h('div.flex-column', [ + h('.flex-row', { + style: { + alignItems: 'flex-end', + lineHeight: '13px', + fontFamily: 'Montserrat Light', + textRendering: 'geometricPrecision', + }, + }, [ + h('div', { + style: { + width: '100%', + textAlign: 'right', + }, + }, incoming ? `+${balance}` : balance), + h('div', { + style: { + color: ' #AEAEAE', + fontSize: '12px', + marginLeft: '5px', + }, + }, label), + ]), + + showFiat ? h(FiatValue, { value: props.value, conversionRate, currentCurrency }) : null, + ])) + ) +} diff --git a/old-ui/app/components/fiat-value.js b/old-ui/app/components/fiat-value.js new file mode 100644 index 000000000..d69f41d11 --- /dev/null +++ b/old-ui/app/components/fiat-value.js @@ -0,0 +1,64 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const formatBalance = require('../util').formatBalance + +module.exports = FiatValue + +inherits(FiatValue, Component) +function FiatValue () { + Component.call(this) +} + +FiatValue.prototype.render = function () { + const props = this.props + const { conversionRate, currentCurrency } = props + const renderedCurrency = currentCurrency || '' + + const value = formatBalance(props.value, 6) + + if (value === 'None') return value + var fiatDisplayNumber, fiatTooltipNumber + var splitBalance = value.split(' ') + + if (conversionRate !== 0) { + fiatTooltipNumber = Number(splitBalance[0]) * conversionRate + fiatDisplayNumber = fiatTooltipNumber.toFixed(2) + } else { + fiatDisplayNumber = 'N/A' + fiatTooltipNumber = 'Unknown' + } + + return fiatDisplay(fiatDisplayNumber, renderedCurrency.toUpperCase()) +} + +function fiatDisplay (fiatDisplayNumber, fiatSuffix) { + if (fiatDisplayNumber !== 'N/A') { + return h('.flex-row', { + style: { + alignItems: 'flex-end', + lineHeight: '13px', + fontFamily: 'Montserrat Light', + textRendering: 'geometricPrecision', + }, + }, [ + h('div', { + style: { + width: '100%', + textAlign: 'right', + fontSize: '12px', + color: '#333333', + }, + }, fiatDisplayNumber), + h('div', { + style: { + color: '#AEAEAE', + marginLeft: '5px', + fontSize: '12px', + }, + }, fiatSuffix), + ]) + } else { + return h('div') + } +} diff --git a/old-ui/app/components/hex-as-decimal-input.js b/old-ui/app/components/hex-as-decimal-input.js new file mode 100644 index 000000000..4a71e9585 --- /dev/null +++ b/old-ui/app/components/hex-as-decimal-input.js @@ -0,0 +1,154 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const ethUtil = require('ethereumjs-util') +const BN = ethUtil.BN +const extend = require('xtend') + +module.exports = HexAsDecimalInput + +inherits(HexAsDecimalInput, Component) +function HexAsDecimalInput () { + this.state = { invalid: null } + Component.call(this) +} + +/* Hex as Decimal Input + * + * A component for allowing easy, decimal editing + * of a passed in hex string value. + * + * On change, calls back its `onChange` function parameter + * and passes it an updated hex string. + */ + +HexAsDecimalInput.prototype.render = function () { + const props = this.props + const state = this.state + + const { value, onChange, min, max } = props + + const toEth = props.toEth + const suffix = props.suffix + const decimalValue = decimalize(value, toEth) + const style = props.style + + return ( + h('.flex-column', [ + h('.flex-row', { + style: { + alignItems: 'flex-end', + lineHeight: '13px', + fontFamily: 'Montserrat Light', + textRendering: 'geometricPrecision', + }, + }, [ + h('input.hex-input', { + type: 'number', + required: true, + min: min, + max: max, + style: extend({ + display: 'block', + textAlign: 'right', + backgroundColor: 'transparent', + border: '1px solid #bdbdbd', + + }, style), + value: parseInt(decimalValue), + onBlur: (event) => { + this.updateValidity(event) + }, + onChange: (event) => { + this.updateValidity(event) + const hexString = (event.target.value === '') ? '' : hexify(event.target.value) + onChange(hexString) + }, + onInvalid: (event) => { + const msg = this.constructWarning() + if (msg === state.invalid) { + return + } + this.setState({ invalid: msg }) + event.preventDefault() + return false + }, + }), + h('div', { + style: { + color: ' #AEAEAE', + fontSize: '12px', + marginLeft: '5px', + marginRight: '6px', + width: '20px', + }, + }, suffix), + ]), + + state.invalid ? h('span.error', { + style: { + position: 'absolute', + right: '0px', + textAlign: 'right', + transform: 'translateY(26px)', + padding: '3px', + background: 'rgba(255,255,255,0.85)', + zIndex: '1', + textTransform: 'capitalize', + border: '2px solid #E20202', + }, + }, state.invalid) : null, + ]) + ) +} + +HexAsDecimalInput.prototype.setValid = function (message) { + this.setState({ invalid: null }) +} + +HexAsDecimalInput.prototype.updateValidity = function (event) { + const target = event.target + const value = this.props.value + const newValue = target.value + + if (value === newValue) { + return + } + + const valid = target.checkValidity() + if (valid) { + this.setState({ invalid: null }) + } +} + +HexAsDecimalInput.prototype.constructWarning = function () { + const { name, min, max } = this.props + let message = name ? name + ' ' : '' + + if (min && max) { + message += `must be greater than or equal to ${min} and less than or equal to ${max}.` + } else if (min) { + message += `must be greater than or equal to ${min}.` + } else if (max) { + message += `must be less than or equal to ${max}.` + } else { + message += 'Invalid input.' + } + + return message +} + +function hexify (decimalString) { + const hexBN = new BN(parseInt(decimalString), 10) + return '0x' + hexBN.toString('hex') +} + +function decimalize (input, toEth) { + if (input === '') { + return '' + } else { + const strippedInput = ethUtil.stripHexPrefix(input) + const inputBN = new BN(strippedInput, 'hex') + return inputBN.toString(10) + } +} diff --git a/old-ui/app/components/identicon.js b/old-ui/app/components/identicon.js new file mode 100644 index 000000000..bb476ca7b --- /dev/null +++ b/old-ui/app/components/identicon.js @@ -0,0 +1,74 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const isNode = require('detect-node') +const findDOMNode = require('react-dom').findDOMNode +const jazzicon = require('jazzicon') +const iconFactoryGen = require('../../lib/icon-factory') +const iconFactory = iconFactoryGen(jazzicon) + +module.exports = IdenticonComponent + +inherits(IdenticonComponent, Component) +function IdenticonComponent () { + Component.call(this) + + this.defaultDiameter = 46 +} + +IdenticonComponent.prototype.render = function () { + var props = this.props + var diameter = props.diameter || this.defaultDiameter + return ( + h('div', { + key: 'identicon-' + this.props.address, + style: { + display: 'flex', + alignItems: 'center', + justifyContent: 'center', + height: diameter, + width: diameter, + borderRadius: diameter / 2, + overflow: 'hidden', + }, + }) + ) +} + +IdenticonComponent.prototype.componentDidMount = function () { + var props = this.props + const { address } = props + + if (!address) return + + // eslint-disable-next-line react/no-find-dom-node + var container = findDOMNode(this) + + var diameter = props.diameter || this.defaultDiameter + if (!isNode) { + var img = iconFactory.iconForAddress(address, diameter) + container.appendChild(img) + } +} + +IdenticonComponent.prototype.componentDidUpdate = function () { + var props = this.props + const { address } = props + + if (!address) return + + // eslint-disable-next-line react/no-find-dom-node + var container = findDOMNode(this) + + var children = container.children + for (var i = 0; i < children.length; i++) { + container.removeChild(children[i]) + } + + var diameter = props.diameter || this.defaultDiameter + if (!isNode) { + var img = iconFactory.iconForAddress(address, diameter) + container.appendChild(img) + } +} + diff --git a/old-ui/app/components/loading.js b/old-ui/app/components/loading.js new file mode 100644 index 000000000..163792584 --- /dev/null +++ b/old-ui/app/components/loading.js @@ -0,0 +1,45 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') + + +inherits(LoadingIndicator, Component) +module.exports = LoadingIndicator + +function LoadingIndicator () { + Component.call(this) +} + +LoadingIndicator.prototype.render = function () { + const { isLoading, loadingMessage } = this.props + + return ( + isLoading ? h('.full-flex-height', { + style: { + left: '0px', + zIndex: 10, + position: 'absolute', + flexDirection: 'column', + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + height: '100%', + width: '100%', + background: 'rgba(255, 255, 255, 0.8)', + }, + }, [ + h('img', { + src: 'images/loading.svg', + }), + + h('br'), + + showMessageIfAny(loadingMessage), + ]) : null + ) +} + +function showMessageIfAny (loadingMessage) { + if (!loadingMessage) return null + return h('span', loadingMessage) +} diff --git a/old-ui/app/components/mascot.js b/old-ui/app/components/mascot.js new file mode 100644 index 000000000..973ec2cad --- /dev/null +++ b/old-ui/app/components/mascot.js @@ -0,0 +1,59 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const metamaskLogo = require('metamask-logo') +const debounce = require('debounce') + +module.exports = Mascot + +inherits(Mascot, Component) +function Mascot () { + Component.call(this) + this.logo = metamaskLogo({ + followMouse: true, + pxNotRatio: true, + width: 200, + height: 200, + }) + + this.refollowMouse = debounce(this.logo.setFollowMouse.bind(this.logo, true), 1000) + this.unfollowMouse = this.logo.setFollowMouse.bind(this.logo, false) +} + +Mascot.prototype.render = function () { + // this is a bit hacky + // the event emitter is on `this.props` + // and we dont get that until render + this.handleAnimationEvents() + + return h('#metamask-mascot-container', { + style: { zIndex: 0 }, + }) +} + +Mascot.prototype.componentDidMount = function () { + var targetDivId = 'metamask-mascot-container' + var container = document.getElementById(targetDivId) + container.appendChild(this.logo.container) +} + +Mascot.prototype.componentWillUnmount = function () { + this.animations = this.props.animationEventEmitter + this.animations.removeAllListeners() + this.logo.container.remove() + this.logo.stopAnimation() +} + +Mascot.prototype.handleAnimationEvents = function () { + // only setup listeners once + if (this.animations) return + this.animations = this.props.animationEventEmitter + this.animations.on('point', this.lookAt.bind(this)) + this.animations.on('setFollowMouse', this.logo.setFollowMouse.bind(this.logo)) +} + +Mascot.prototype.lookAt = function (target) { + this.unfollowMouse() + this.logo.lookAt(target) + this.refollowMouse() +} diff --git a/old-ui/app/components/menu-droppo.js b/old-ui/app/components/menu-droppo.js new file mode 100644 index 000000000..e6276f3b1 --- /dev/null +++ b/old-ui/app/components/menu-droppo.js @@ -0,0 +1,132 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const findDOMNode = require('react-dom').findDOMNode +const ReactCSSTransitionGroup = require('react-addons-css-transition-group') + +module.exports = MenuDroppoComponent + + +inherits(MenuDroppoComponent, Component) +function MenuDroppoComponent () { + Component.call(this) +} + +MenuDroppoComponent.prototype.render = function () { + const speed = this.props.speed || '300ms' + const useCssTransition = this.props.useCssTransition + const zIndex = ('zIndex' in this.props) ? this.props.zIndex : 0 + + this.manageListeners() + + const style = this.props.style || {} + if (!('position' in style)) { + style.position = 'fixed' + } + style.zIndex = zIndex + + return ( + h('.menu-droppo-container', { + style, + }, [ + h('style', ` + .menu-droppo-enter { + transition: transform ${speed} ease-in-out; + transform: translateY(-200%); + } + + .menu-droppo-enter.menu-droppo-enter-active { + transition: transform ${speed} ease-in-out; + transform: translateY(0%); + } + + .menu-droppo-leave { + transition: transform ${speed} ease-in-out; + transform: translateY(0%); + } + + .menu-droppo-leave.menu-droppo-leave-active { + transition: transform ${speed} ease-in-out; + transform: translateY(-200%); + } + `), + + useCssTransition + ? h(ReactCSSTransitionGroup, { + className: 'css-transition-group', + transitionName: 'menu-droppo', + transitionEnterTimeout: parseInt(speed), + transitionLeaveTimeout: parseInt(speed), + }, this.renderPrimary()) + : this.renderPrimary(), + ]) + ) +} + +MenuDroppoComponent.prototype.renderPrimary = function () { + const isOpen = this.props.isOpen + if (!isOpen) { + return null + } + + const innerStyle = this.props.innerStyle || {} + + return ( + h('.menu-droppo', { + key: 'menu-droppo-drawer', + style: innerStyle, + }, + [ this.props.children ]) + ) +} + +MenuDroppoComponent.prototype.manageListeners = function () { + const isOpen = this.props.isOpen + const onClickOutside = this.props.onClickOutside + + if (isOpen) { + this.outsideClickHandler = onClickOutside + } else if (isOpen) { + this.outsideClickHandler = null + } +} + +MenuDroppoComponent.prototype.componentDidMount = function () { + if (this && document.body) { + this.globalClickHandler = this.globalClickOccurred.bind(this) + document.body.addEventListener('click', this.globalClickHandler) + // eslint-disable-next-line react/no-find-dom-node + var container = findDOMNode(this) + this.container = container + } +} + +MenuDroppoComponent.prototype.componentWillUnmount = function () { + if (this && document.body) { + document.body.removeEventListener('click', this.globalClickHandler) + } +} + +MenuDroppoComponent.prototype.globalClickOccurred = function (event) { + const target = event.target + // eslint-disable-next-line react/no-find-dom-node + const container = findDOMNode(this) + + if (target !== container && + !isDescendant(this.container, event.target) && + this.outsideClickHandler) { + this.outsideClickHandler(event) + } +} + +function isDescendant (parent, child) { + var node = child.parentNode + while (node !== null) { + if (node === parent) { + return true + } + node = node.parentNode + } + + return false +} diff --git a/old-ui/app/components/mini-account-panel.js b/old-ui/app/components/mini-account-panel.js new file mode 100644 index 000000000..c09cf5b7a --- /dev/null +++ b/old-ui/app/components/mini-account-panel.js @@ -0,0 +1,74 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const Identicon = require('./identicon') + +module.exports = AccountPanel + + +inherits(AccountPanel, Component) +function AccountPanel () { + Component.call(this) +} + +AccountPanel.prototype.render = function () { + var props = this.props + var picOrder = props.picOrder || 'left' + const { imageSeed } = props + + return ( + + h('.identity-panel.flex-row.flex-left', { + style: { + cursor: props.onClick ? 'pointer' : undefined, + }, + onClick: props.onClick, + }, [ + + this.genIcon(imageSeed, picOrder), + + h('div.flex-column.flex-justify-center', { + style: { + lineHeight: '15px', + order: 2, + display: 'flex', + alignItems: picOrder === 'left' ? 'flex-begin' : 'flex-end', + }, + }, this.props.children), + ]) + ) +} + +AccountPanel.prototype.genIcon = function (seed, picOrder) { + const props = this.props + + // When there is no seed value, this is a contract creation. + // We then show the contract icon. + if (!seed) { + return h('.identicon-wrapper.flex-column.select-none', { + style: { + order: picOrder === 'left' ? 1 : 3, + }, + }, [ + h('i.fa.fa-file-text-o.fa-lg', { + style: { + fontSize: '42px', + transform: 'translate(0px, -16px)', + }, + }), + ]) + } + + // If there was a seed, we return an identicon for that address. + return h('.identicon-wrapper.flex-column.select-none', { + style: { + order: picOrder === 'left' ? 1 : 3, + }, + }, [ + h(Identicon, { + address: seed, + imageify: props.imageifyIdenticons, + }), + ]) +} + diff --git a/old-ui/app/components/network.js b/old-ui/app/components/network.js new file mode 100644 index 000000000..0dbe37cdd --- /dev/null +++ b/old-ui/app/components/network.js @@ -0,0 +1,129 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits + +module.exports = Network + +inherits(Network, Component) + +function Network () { + Component.call(this) +} + +Network.prototype.render = function () { + const props = this.props + const networkNumber = props.network + let providerName + try { + providerName = props.provider.type + } catch (e) { + providerName = null + } + let iconName, hoverText + + if (networkNumber === 'loading') { + return h('span.pointer', { + style: { + display: 'flex', + alignItems: 'center', + flexDirection: 'row', + }, + onClick: (event) => this.props.onClick(event), + }, [ + h('img', { + title: 'Attempting to connect to blockchain.', + style: { + width: '27px', + }, + src: 'images/loading.svg', + }), + h('i.fa.fa-caret-down'), + ]) + } else if (providerName === 'mainnet') { + hoverText = 'Main Ethereum Network' + iconName = 'ethereum-network' + } else if (providerName === 'ropsten') { + hoverText = 'Ropsten Test Network' + iconName = 'ropsten-test-network' + } else if (parseInt(networkNumber) === 3) { + hoverText = 'Ropsten Test Network' + iconName = 'ropsten-test-network' + } else if (providerName === 'kovan') { + hoverText = 'Kovan Test Network' + iconName = 'kovan-test-network' + } else if (providerName === 'rinkeby') { + hoverText = 'Rinkeby Test Network' + iconName = 'rinkeby-test-network' + } else { + hoverText = 'Unknown Private Network' + iconName = 'unknown-private-network' + } + + return ( + h('#network_component.pointer', { + title: hoverText, + onClick: (event) => this.props.onClick(event), + }, [ + (function () { + switch (iconName) { + case 'ethereum-network': + return h('.network-indicator', [ + h('.menu-icon.diamond'), + h('.network-name', { + style: { + color: '#039396', + }}, + 'Main Network'), + h('i.fa.fa-caret-down.fa-lg'), + ]) + case 'ropsten-test-network': + return h('.network-indicator', [ + h('.menu-icon.red-dot'), + h('.network-name', { + style: { + color: '#ff6666', + }}, + 'Ropsten Test Net'), + h('i.fa.fa-caret-down.fa-lg'), + ]) + case 'kovan-test-network': + return h('.network-indicator', [ + h('.menu-icon.hollow-diamond'), + h('.network-name', { + style: { + color: '#690496', + }}, + 'Kovan Test Net'), + h('i.fa.fa-caret-down.fa-lg'), + ]) + case 'rinkeby-test-network': + return h('.network-indicator', [ + h('.menu-icon.golden-square'), + h('.network-name', { + style: { + color: '#e7a218', + }}, + 'Rinkeby Test Net'), + h('i.fa.fa-caret-down.fa-lg'), + ]) + default: + return h('.network-indicator', [ + h('i.fa.fa-question-circle.fa-lg', { + style: { + margin: '10px', + color: 'rgb(125, 128, 130)', + }, + }), + + h('.network-name', { + style: { + color: '#AEAEAE', + }}, + 'Private Network'), + h('i.fa.fa-caret-down.fa-lg'), + ]) + } + })(), + ]) + ) +} diff --git a/old-ui/app/components/notice.js b/old-ui/app/components/notice.js new file mode 100644 index 000000000..09d461c7b --- /dev/null +++ b/old-ui/app/components/notice.js @@ -0,0 +1,132 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const ReactMarkdown = require('react-markdown') +const linker = require('extension-link-enabler') +const findDOMNode = require('react-dom').findDOMNode + +module.exports = Notice + +inherits(Notice, Component) +function Notice () { + Component.call(this) +} + +Notice.prototype.render = function () { + const { notice, onConfirm } = this.props + const { title, date, body } = notice + const state = this.state || { disclaimerDisabled: true } + const disabled = state.disclaimerDisabled + + return ( + h('.flex-column.flex-center.flex-grow', { + style: { + width: '100%', + }, + }, [ + h('h3.flex-center.text-transform-uppercase.terms-header', { + style: { + background: '#EBEBEB', + color: '#AEAEAE', + width: '100%', + fontSize: '20px', + textAlign: 'center', + padding: 6, + }, + }, [ + title, + ]), + + h('h5.flex-center.text-transform-uppercase.terms-header', { + style: { + background: '#EBEBEB', + color: '#AEAEAE', + marginBottom: 24, + width: '100%', + fontSize: '20px', + textAlign: 'center', + padding: 6, + }, + }, [ + date, + ]), + + h('style', ` + + .markdown { + overflow-x: hidden; + } + + .markdown h1, .markdown h2, .markdown h3 { + margin: 10px 0; + font-weight: bold; + } + + .markdown strong { + font-weight: bold; + } + .markdown em { + font-style: italic; + } + + .markdown p { + margin: 10px 0; + } + + .markdown a { + color: #df6b0e; + } + + `), + + h('div.markdown', { + onScroll: (e) => { + var object = e.currentTarget + if (object.offsetHeight + object.scrollTop + 100 >= object.scrollHeight) { + this.setState({disclaimerDisabled: false}) + } + }, + style: { + background: 'rgb(235, 235, 235)', + height: '310px', + padding: '6px', + width: '90%', + overflowY: 'scroll', + scroll: 'auto', + }, + }, [ + h(ReactMarkdown, { + className: 'notice-box', + source: body, + skipHtml: true, + }), + ]), + + h('button', { + disabled, + onClick: () => { + this.setState({disclaimerDisabled: true}) + onConfirm() + }, + style: { + marginTop: '18px', + }, + }, 'Accept'), + ]) + ) +} + +Notice.prototype.componentDidMount = function () { + // eslint-disable-next-line react/no-find-dom-node + var node = findDOMNode(this) + linker.setupListener(node) + if (document.getElementsByClassName('notice-box')[0].clientHeight < 310) { + this.setState({disclaimerDisabled: false}) + } +} + +Notice.prototype.componentWillUnmount = function () { + // eslint-disable-next-line react/no-find-dom-node + var node = findDOMNode(this) + linker.teardownListener(node) +} diff --git a/old-ui/app/components/pending-msg-details.js b/old-ui/app/components/pending-msg-details.js new file mode 100644 index 000000000..718a22de0 --- /dev/null +++ b/old-ui/app/components/pending-msg-details.js @@ -0,0 +1,50 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits + +const AccountPanel = require('./account-panel') + +module.exports = PendingMsgDetails + +inherits(PendingMsgDetails, Component) +function PendingMsgDetails () { + Component.call(this) +} + +PendingMsgDetails.prototype.render = function () { + var state = this.props + var msgData = state.txData + + var msgParams = msgData.msgParams || {} + var address = msgParams.from || state.selectedAddress + var identity = state.identities[address] || { address: address } + var account = state.accounts[address] || { address: address } + + return ( + h('div', { + key: msgData.id, + style: { + margin: '10px 20px', + }, + }, [ + + // account that will sign + h(AccountPanel, { + showFullAddress: true, + identity: identity, + account: account, + imageifyIdenticons: state.imageifyIdenticons, + }), + + // message data + h('.tx-data.flex-column.flex-justify-center.flex-grow.select-none', [ + h('.flex-column.flex-space-between', [ + h('label.font-small', 'MESSAGE'), + h('span.font-small', msgParams.data), + ]), + ]), + + ]) + ) +} + diff --git a/old-ui/app/components/pending-msg.js b/old-ui/app/components/pending-msg.js new file mode 100644 index 000000000..834719c53 --- /dev/null +++ b/old-ui/app/components/pending-msg.js @@ -0,0 +1,70 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const PendingTxDetails = require('./pending-msg-details') + +module.exports = PendingMsg + +inherits(PendingMsg, Component) +function PendingMsg () { + Component.call(this) +} + +PendingMsg.prototype.render = function () { + var state = this.props + var msgData = state.txData + + return ( + + h('div', { + key: msgData.id, + style: { + maxWidth: '350px', + }, + }, [ + + // header + h('h3', { + style: { + fontWeight: 'bold', + textAlign: 'center', + }, + }, 'Sign Message'), + + h('.error', { + style: { + margin: '10px', + }, + }, [ + `Signing this message can have + dangerous side effects. Only sign messages from + sites you fully trust with your entire account. + This dangerous method will be removed in a future version. `, + h('a', { + href: 'https://medium.com/metamask/the-new-secure-way-to-sign-data-in-your-browser-6af9dd2a1527', + style: { color: 'rgb(247, 134, 28)' }, + onClick: (event) => { + event.preventDefault() + const url = 'https://medium.com/metamask/the-new-secure-way-to-sign-data-in-your-browser-6af9dd2a1527' + global.platform.openWindow({ url }) + }, + }, 'Read more here.'), + ]), + + // message details + h(PendingTxDetails, state), + + // sign + cancel + h('.flex-row.flex-space-around', [ + h('button', { + onClick: state.cancelMessage, + }, 'Cancel'), + h('button', { + onClick: state.signMessage, + }, 'Sign'), + ]), + ]) + + ) +} + diff --git a/old-ui/app/components/pending-personal-msg-details.js b/old-ui/app/components/pending-personal-msg-details.js new file mode 100644 index 000000000..1050513f2 --- /dev/null +++ b/old-ui/app/components/pending-personal-msg-details.js @@ -0,0 +1,60 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits + +const AccountPanel = require('./account-panel') +const BinaryRenderer = require('./binary-renderer') + +module.exports = PendingMsgDetails + +inherits(PendingMsgDetails, Component) +function PendingMsgDetails () { + Component.call(this) +} + +PendingMsgDetails.prototype.render = function () { + var state = this.props + var msgData = state.txData + + var msgParams = msgData.msgParams || {} + var address = msgParams.from || state.selectedAddress + var identity = state.identities[address] || { address: address } + var account = state.accounts[address] || { address: address } + + var { data } = msgParams + + return ( + h('div', { + key: msgData.id, + style: { + margin: '10px 20px', + }, + }, [ + + // account that will sign + h(AccountPanel, { + showFullAddress: true, + identity: identity, + account: account, + imageifyIdenticons: state.imageifyIdenticons, + }), + + // message data + h('div', { + style: { + height: '260px', + }, + }, [ + h('label.font-small', { style: { display: 'block' } }, 'MESSAGE'), + h(BinaryRenderer, { + value: data, + style: { + height: '215px', + }, + }), + ]), + + ]) + ) +} + diff --git a/old-ui/app/components/pending-personal-msg.js b/old-ui/app/components/pending-personal-msg.js new file mode 100644 index 000000000..4542adb28 --- /dev/null +++ b/old-ui/app/components/pending-personal-msg.js @@ -0,0 +1,47 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const PendingTxDetails = require('./pending-personal-msg-details') + +module.exports = PendingMsg + +inherits(PendingMsg, Component) +function PendingMsg () { + Component.call(this) +} + +PendingMsg.prototype.render = function () { + var state = this.props + var msgData = state.txData + + return ( + + h('div', { + key: msgData.id, + }, [ + + // header + h('h3', { + style: { + fontWeight: 'bold', + textAlign: 'center', + }, + }, 'Sign Message'), + + // message details + h(PendingTxDetails, state), + + // sign + cancel + h('.flex-row.flex-space-around', [ + h('button', { + onClick: state.cancelPersonalMessage, + }, 'Cancel'), + h('button', { + onClick: state.signPersonalMessage, + }, 'Sign'), + ]), + ]) + + ) +} + diff --git a/old-ui/app/components/pending-tx.js b/old-ui/app/components/pending-tx.js new file mode 100644 index 000000000..366121ce0 --- /dev/null +++ b/old-ui/app/components/pending-tx.js @@ -0,0 +1,500 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const actions = require('../../../ui/app/actions') +const clone = require('clone') + +const ethUtil = require('ethereumjs-util') +const BN = ethUtil.BN +const hexToBn = require('../../../app/scripts/lib/hex-to-bn') +const util = require('../util') +const MiniAccountPanel = require('./mini-account-panel') +const Copyable = require('./copyable') +const EthBalance = require('./eth-balance') +const addressSummary = util.addressSummary +const nameForAddress = require('../../lib/contract-namer') +const BNInput = require('./bn-as-decimal-input') + +// corresponds with 0.1 GWEI +const MIN_GAS_PRICE_BN = new BN('100000000') +const MIN_GAS_LIMIT_BN = new BN('21000') + +module.exports = PendingTx +inherits(PendingTx, Component) +function PendingTx () { + Component.call(this) + this.state = { + valid: true, + txData: null, + submitting: false, + } +} + +PendingTx.prototype.render = function () { + const props = this.props + const { currentCurrency, blockGasLimit } = props + + const conversionRate = props.conversionRate + const txMeta = this.gatherTxMeta() + const txParams = txMeta.txParams || {} + + // Account Details + const address = txParams.from || props.selectedAddress + const identity = props.identities[address] || { address: address } + const account = props.accounts[address] + const balance = account ? account.balance : '0x0' + + // recipient check + const isValidAddress = !txParams.to || util.isValidAddress(txParams.to) + + // Gas + const gas = txParams.gas + const gasBn = hexToBn(gas) + const gasLimit = new BN(parseInt(blockGasLimit)) + const safeGasLimitBN = this.bnMultiplyByFraction(gasLimit, 19, 20) + const saferGasLimitBN = this.bnMultiplyByFraction(gasLimit, 18, 20) + const safeGasLimit = safeGasLimitBN.toString(10) + + // Gas Price + const gasPrice = txParams.gasPrice || MIN_GAS_PRICE_BN.toString(16) + const gasPriceBn = hexToBn(gasPrice) + + const txFeeBn = gasBn.mul(gasPriceBn) + const valueBn = hexToBn(txParams.value) + const maxCost = txFeeBn.add(valueBn) + + const dataLength = txParams.data ? (txParams.data.length - 2) / 2 : 0 + + const balanceBn = hexToBn(balance) + const insufficientBalance = balanceBn.lt(maxCost) + const dangerousGasLimit = gasBn.gte(saferGasLimitBN) + const gasLimitSpecified = txMeta.gasLimitSpecified + const buyDisabled = insufficientBalance || !this.state.valid || !isValidAddress || this.state.submitting + const showRejectAll = props.unconfTxListLength > 1 + + this.inputs = [] + + return ( + + h('div', { + key: txMeta.id, + }, [ + + h('form#pending-tx-form', { + onSubmit: this.onSubmit.bind(this), + + }, [ + + // tx info + h('div', [ + + h('.flex-row.flex-center', { + style: { + maxWidth: '100%', + }, + }, [ + + h(MiniAccountPanel, { + imageSeed: address, + picOrder: 'right', + }, [ + h('span.font-small', { + style: { + fontFamily: 'Montserrat Bold, Montserrat, sans-serif', + }, + }, identity.name), + + h(Copyable, { + value: ethUtil.toChecksumAddress(address), + }, [ + h('span.font-small', { + style: { + fontFamily: 'Montserrat Light, Montserrat, sans-serif', + }, + }, addressSummary(address, 6, 4, false)), + ]), + + h('span.font-small', { + style: { + fontFamily: 'Montserrat Light, Montserrat, sans-serif', + }, + }, [ + h(EthBalance, { + value: balance, + conversionRate, + currentCurrency, + inline: true, + labelColor: '#F7861C', + }), + ]), + ]), + + forwardCarrat(), + + this.miniAccountPanelForRecipient(), + ]), + + h('style', ` + .table-box { + margin: 7px 0px 0px 0px; + width: 100%; + } + .table-box .row { + margin: 0px; + background: rgb(236,236,236); + display: flex; + justify-content: space-between; + font-family: Montserrat Light, sans-serif; + font-size: 13px; + padding: 5px 25px; + } + .table-box .row .value { + font-family: Montserrat Regular; + } + `), + + h('.table-box', [ + + // Ether Value + // Currently not customizable, but easily modified + // in the way that gas and gasLimit currently are. + h('.row', [ + h('.cell.label', 'Amount'), + h(EthBalance, { value: txParams.value, currentCurrency, conversionRate }), + ]), + + // Gas Limit (customizable) + h('.cell.row', [ + h('.cell.label', 'Gas Limit'), + h('.cell.value', { + }, [ + h(BNInput, { + name: 'Gas Limit', + value: gasBn, + precision: 0, + scale: 0, + // The hard lower limit for gas. + min: MIN_GAS_LIMIT_BN, + max: safeGasLimit, + suffix: 'UNITS', + style: { + position: 'relative', + top: '5px', + }, + onChange: this.gasLimitChanged.bind(this), + + ref: (hexInput) => { this.inputs.push(hexInput) }, + }), + ]), + ]), + + // Gas Price (customizable) + h('.cell.row', [ + h('.cell.label', 'Gas Price'), + h('.cell.value', { + }, [ + h(BNInput, { + name: 'Gas Price', + value: gasPriceBn, + precision: 9, + scale: 9, + suffix: 'GWEI', + min: MIN_GAS_PRICE_BN, + style: { + position: 'relative', + top: '5px', + }, + onChange: this.gasPriceChanged.bind(this), + ref: (hexInput) => { this.inputs.push(hexInput) }, + }), + ]), + ]), + + // Max Transaction Fee (calculated) + h('.cell.row', [ + h('.cell.label', 'Max Transaction Fee'), + h(EthBalance, { value: txFeeBn.toString(16), currentCurrency, conversionRate }), + ]), + + h('.cell.row', { + style: { + fontFamily: 'Montserrat Regular', + background: 'white', + padding: '10px 25px', + }, + }, [ + h('.cell.label', 'Max Total'), + h('.cell.value', { + style: { + display: 'flex', + alignItems: 'center', + }, + }, [ + h(EthBalance, { + value: maxCost.toString(16), + currentCurrency, + conversionRate, + inline: true, + labelColor: 'black', + fontSize: '16px', + }), + ]), + ]), + + // Data size row: + h('.cell.row', { + style: { + background: '#f7f7f7', + paddingBottom: '0px', + }, + }, [ + h('.cell.label'), + h('.cell.value', { + style: { + fontFamily: 'Montserrat Light', + fontSize: '11px', + }, + }, `Data included: ${dataLength} bytes`), + ]), + ]), // End of Table + + ]), + + h('style', ` + .conf-buttons button { + margin-left: 10px; + text-transform: uppercase; + } + `), + h('.cell.row', { + style: { + textAlign: 'center', + }, + }, [ + txMeta.simulationFails ? + h('.error', { + style: { + fontSize: '0.9em', + }, + }, 'Transaction Error. Exception thrown in contract code.') + : null, + + !isValidAddress ? + h('.error', { + style: { + fontSize: '0.9em', + }, + }, 'Recipient address is invalid. Sending this transaction will result in a loss of ETH.') + : null, + + insufficientBalance ? + h('span.error', { + style: { + fontSize: '0.9em', + }, + }, 'Insufficient balance for transaction') + : null, + + (dangerousGasLimit && !gasLimitSpecified) ? + h('span.error', { + style: { + fontSize: '0.9em', + }, + }, 'Gas limit set dangerously high. Approving this transaction is likely to fail.') + : null, + ]), + + + // send + cancel + h('.flex-row.flex-space-around.conf-buttons', { + style: { + display: 'flex', + justifyContent: 'flex-end', + margin: '14px 25px', + }, + }, [ + h('button', { + onClick: (event) => { + this.resetGasFields() + event.preventDefault() + }, + }, 'Reset'), + + // Accept Button or Buy Button + insufficientBalance ? h('button.btn-green', { onClick: props.buyEth }, 'Buy Ether') : + h('input.confirm.btn-green', { + type: 'submit', + value: 'SUBMIT', + style: { marginLeft: '10px' }, + disabled: buyDisabled, + }), + + h('button.cancel.btn-red', { + onClick: props.cancelTransaction, + }, 'Reject'), + ]), + showRejectAll ? h('.flex-row.flex-space-around.conf-buttons', { + style: { + display: 'flex', + justifyContent: 'flex-end', + margin: '14px 25px', + }, + }, [ + h('button.cancel.btn-red', { + onClick: props.cancelAllTransactions, + }, 'Reject All'), + ]) : null, + ]), + ]) + ) +} + +PendingTx.prototype.miniAccountPanelForRecipient = function () { + const props = this.props + const txData = props.txData + const txParams = txData.txParams || {} + const isContractDeploy = !('to' in txParams) + + // If it's not a contract deploy, send to the account + if (!isContractDeploy) { + return h(MiniAccountPanel, { + imageSeed: txParams.to, + picOrder: 'left', + }, [ + + h('span.font-small', { + style: { + fontFamily: 'Montserrat Bold, Montserrat, sans-serif', + }, + }, nameForAddress(txParams.to, props.identities)), + + h(Copyable, { + value: ethUtil.toChecksumAddress(txParams.to), + }, [ + h('span.font-small', { + style: { + fontFamily: 'Montserrat Light, Montserrat, sans-serif', + }, + }, addressSummary(txParams.to, 6, 4, false)), + ]), + + ]) + } else { + return h(MiniAccountPanel, { + picOrder: 'left', + }, [ + + h('span.font-small', { + style: { + fontFamily: 'Montserrat Bold, Montserrat, sans-serif', + }, + }, 'New Contract'), + + ]) + } +} + +PendingTx.prototype.gasPriceChanged = function (newBN, valid) { + log.info(`Gas price changed to: ${newBN.toString(10)}`) + const txMeta = this.gatherTxMeta() + txMeta.txParams.gasPrice = '0x' + newBN.toString('hex') + this.setState({ + txData: clone(txMeta), + valid, + }) +} + +PendingTx.prototype.gasLimitChanged = function (newBN, valid) { + log.info(`Gas limit changed to ${newBN.toString(10)}`) + const txMeta = this.gatherTxMeta() + txMeta.txParams.gas = '0x' + newBN.toString('hex') + this.setState({ + txData: clone(txMeta), + valid, + }) +} + +PendingTx.prototype.resetGasFields = function () { + log.debug(`pending-tx resetGasFields`) + + this.inputs.forEach((hexInput) => { + if (hexInput) { + hexInput.setValid() + } + }) + + this.setState({ + txData: null, + valid: true, + }) +} + +PendingTx.prototype.onSubmit = function (event) { + event.preventDefault() + const txMeta = this.gatherTxMeta() + const valid = this.checkValidity() + this.setState({ valid, submitting: true }) + if (valid && this.verifyGasParams()) { + this.props.sendTransaction(txMeta, event) + } else { + this.props.dispatch(actions.displayWarning('Invalid Gas Parameters')) + this.setState({ submitting: false }) + } +} + +PendingTx.prototype.checkValidity = function () { + const form = this.getFormEl() + const valid = form.checkValidity() + return valid +} + +PendingTx.prototype.getFormEl = function () { + const form = document.querySelector('form#pending-tx-form') + // Stub out form for unit tests: + if (!form) { + return { checkValidity () { return true } } + } + return form +} + +// After a customizable state value has been updated, +PendingTx.prototype.gatherTxMeta = function () { + log.debug(`pending-tx gatherTxMeta`) + const props = this.props + const state = this.state + const txData = clone(state.txData) || clone(props.txData) + + log.debug(`UI has defaulted to tx meta ${JSON.stringify(txData)}`) + return txData +} + +PendingTx.prototype.verifyGasParams = function () { + // We call this in case the gas has not been modified at all + if (!this.state) { return true } + return ( + this._notZeroOrEmptyString(this.state.gas) && + this._notZeroOrEmptyString(this.state.gasPrice) + ) +} + +PendingTx.prototype._notZeroOrEmptyString = function (obj) { + return obj !== '' && obj !== '0x0' +} + +PendingTx.prototype.bnMultiplyByFraction = function (targetBN, numerator, denominator) { + const numBN = new BN(numerator) + const denomBN = new BN(denominator) + return targetBN.mul(numBN).div(denomBN) +} + +function forwardCarrat () { + return ( + h('img', { + src: 'images/forward-carrat.svg', + style: { + padding: '5px 6px 0px 10px', + height: '37px', + }, + }) + ) +} diff --git a/old-ui/app/components/pending-typed-msg-details.js b/old-ui/app/components/pending-typed-msg-details.js new file mode 100644 index 000000000..b5fd29f71 --- /dev/null +++ b/old-ui/app/components/pending-typed-msg-details.js @@ -0,0 +1,59 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits + +const AccountPanel = require('./account-panel') +const TypedMessageRenderer = require('./typed-message-renderer') + +module.exports = PendingMsgDetails + +inherits(PendingMsgDetails, Component) +function PendingMsgDetails () { + Component.call(this) +} + +PendingMsgDetails.prototype.render = function () { + var state = this.props + var msgData = state.txData + + var msgParams = msgData.msgParams || {} + var address = msgParams.from || state.selectedAddress + var identity = state.identities[address] || { address: address } + var account = state.accounts[address] || { address: address } + + var { data } = msgParams + + return ( + h('div', { + key: msgData.id, + style: { + margin: '10px 20px', + }, + }, [ + + // account that will sign + h(AccountPanel, { + showFullAddress: true, + identity: identity, + account: account, + imageifyIdenticons: state.imageifyIdenticons, + }), + + // message data + h('div', { + style: { + height: '260px', + }, + }, [ + h('label.font-small', { style: { display: 'block' } }, 'YOU ARE SIGNING'), + h(TypedMessageRenderer, { + value: data, + style: { + height: '215px', + }, + }), + ]), + + ]) + ) +} diff --git a/old-ui/app/components/pending-typed-msg.js b/old-ui/app/components/pending-typed-msg.js new file mode 100644 index 000000000..f8926d0a3 --- /dev/null +++ b/old-ui/app/components/pending-typed-msg.js @@ -0,0 +1,46 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const PendingTxDetails = require('./pending-typed-msg-details') + +module.exports = PendingMsg + +inherits(PendingMsg, Component) +function PendingMsg () { + Component.call(this) +} + +PendingMsg.prototype.render = function () { + var state = this.props + var msgData = state.txData + + return ( + + h('div', { + key: msgData.id, + }, [ + + // header + h('h3', { + style: { + fontWeight: 'bold', + textAlign: 'center', + }, + }, 'Sign Message'), + + // message details + h(PendingTxDetails, state), + + // sign + cancel + h('.flex-row.flex-space-around', [ + h('button', { + onClick: state.cancelTypedMessage, + }, 'Cancel'), + h('button', { + onClick: state.signTypedMessage, + }, 'Sign'), + ]), + ]) + + ) +} diff --git a/old-ui/app/components/qr-code.js b/old-ui/app/components/qr-code.js new file mode 100644 index 000000000..fa38dcd92 --- /dev/null +++ b/old-ui/app/components/qr-code.js @@ -0,0 +1,80 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const qrCode = require('qrcode-npm').qrcode +const inherits = require('util').inherits +const connect = require('react-redux').connect +const isHexPrefixed = require('ethereumjs-util').isHexPrefixed +const CopyButton = require('./copyButton') + +module.exports = connect(mapStateToProps)(QrCodeView) + +function mapStateToProps (state) { + return { + Qr: state.appState.Qr, + buyView: state.appState.buyView, + warning: state.appState.warning, + } +} + +inherits(QrCodeView, Component) + +function QrCodeView () { + Component.call(this) +} + +QrCodeView.prototype.render = function () { + const props = this.props + const Qr = props.Qr + console.log(`QrCodeView Qr`, Qr); + const address = `${isHexPrefixed(Qr.data) ? 'ethereum:' : ''}${Qr.data}` + const qrImage = qrCode(4, 'M') + qrImage.addData(address) + qrImage.make() + return h('.main-container.flex-column', { + key: 'qr', + style: { + justifyContent: 'center', + paddingBottom: '45px', + paddingLeft: '45px', + paddingRight: '45px', + alignItems: 'center', + }, + }, [ + Array.isArray(Qr.message) ? h('.message-container', this.renderMultiMessage()) : h('.qr-header', Qr.message), + + this.props.warning ? this.props.warning && h('span.error.flex-center', { + style: { + textAlign: 'center', + width: '229px', + height: '82px', + }, + }, + this.props.warning) : null, + + h('#qr-container.flex-column', { + style: { + marginTop: '25px', + marginBottom: '15px', + }, + dangerouslySetInnerHTML: { + __html: qrImage.createTableTag(4), + }, + }), + h('.flex-row', [ + h('h3.ellip-address', { + style: { + width: '247px', + }, + }, Qr.data), + h(CopyButton, { + value: Qr.data, + }), + ]), + ]) +} + +QrCodeView.prototype.renderMultiMessage = function () { + var Qr = this.props.Qr + var multiMessage = Qr.message.map((message) => h('.qr-message', message)) + return multiMessage +} diff --git a/old-ui/app/components/range-slider.js b/old-ui/app/components/range-slider.js new file mode 100644 index 000000000..823f5eb01 --- /dev/null +++ b/old-ui/app/components/range-slider.js @@ -0,0 +1,58 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits + +module.exports = RangeSlider + +inherits(RangeSlider, Component) +function RangeSlider () { + Component.call(this) +} + +RangeSlider.prototype.render = function () { + const state = this.state || {} + const props = this.props + const onInput = props.onInput || function () {} + const name = props.name + const { + min = 0, + max = 100, + increment = 1, + defaultValue = 50, + mirrorInput = false, + } = this.props.options + const {container, input, range} = props.style + + return ( + h('.flex-row', { + style: container, + }, [ + h('input', { + type: 'range', + name: name, + min: min, + max: max, + step: increment, + style: range, + value: state.value || defaultValue, + onChange: mirrorInput ? this.mirrorInputs.bind(this, event) : onInput, + }), + + // Mirrored input for range + mirrorInput ? h('input.large-input', { + type: 'number', + name: `${name}Mirror`, + min: min, + max: max, + value: state.value || defaultValue, + step: increment, + style: input, + onChange: this.mirrorInputs.bind(this, event), + }) : null, + ]) + ) +} + +RangeSlider.prototype.mirrorInputs = function (event) { + this.setState({value: event.target.value}) +} diff --git a/old-ui/app/components/shapeshift-form.js b/old-ui/app/components/shapeshift-form.js new file mode 100644 index 000000000..a54987c04 --- /dev/null +++ b/old-ui/app/components/shapeshift-form.js @@ -0,0 +1,308 @@ +const PersistentForm = require('../../lib/persistent-form') +const h = require('react-hyperscript') +const inherits = require('util').inherits +const connect = require('react-redux').connect +const actions = require('../../../ui/app/actions') +const Qr = require('./qr-code') +const isValidAddress = require('../util').isValidAddress +module.exports = connect(mapStateToProps)(ShapeshiftForm) + +function mapStateToProps (state) { + return { + warning: state.appState.warning, + isSubLoading: state.appState.isSubLoading, + qrRequested: state.appState.qrRequested, + } +} + +inherits(ShapeshiftForm, PersistentForm) + +function ShapeshiftForm () { + PersistentForm.call(this) + this.persistentFormParentId = 'shapeshift-buy-form' +} + +ShapeshiftForm.prototype.render = function () { + return this.props.qrRequested ? h(Qr, {key: 'qr'}) : this.renderMain() +} + +ShapeshiftForm.prototype.renderMain = function () { + const marketinfo = this.props.buyView.formView.marketinfo + const coinOptions = this.props.buyView.formView.coinOptions + var coin = marketinfo.pair.split('_')[0].toUpperCase() + + return h('.flex-column', { + style: { + position: 'relative', + padding: '25px', + paddingTop: '5px', + width: '90%', + minHeight: '215px', + alignItems: 'center', + overflowY: 'auto', + }, + }, [ + h('.flex-row', { + style: { + justifyContent: 'center', + alignItems: 'baseline', + height: '42px', + }, + }, [ + h('img', { + src: coinOptions[coin].image, + width: '25px', + height: '25px', + style: { + marginRight: '5px', + }, + }), + + h('.input-container', { + position: 'relative', + }, [ + h('input#fromCoin.buy-inputs.ex-coins', { + type: 'text', + list: 'coinList', + autoFocus: true, + dataset: { + persistentFormId: 'input-coin', + }, + style: { + boxSizing: 'border-box', + }, + onChange: this.handleLiveInput.bind(this), + defaultValue: 'BTC', + }), + + this.renderCoinList(), + + h('i.fa.fa-pencil-square-o.edit-text', { + style: { + fontSize: '12px', + color: '#F7861C', + position: 'absolute', + }, + }), + ]), + + h('.icon-control', { + style: { + position: 'relative', + }, + }, [ + // Not visible on the screen, can't see it on master. + + // h('i.fa.fa-refresh.fa-4.orange', { + // style: { + // bottom: '5px', + // left: '5px', + // color: '#F7861C', + // }, + // onClick: this.updateCoin.bind(this), + // }), + h('i.fa.fa-chevron-right.fa-4.orange', { + style: { + position: 'absolute', + bottom: '35%', + left: '0%', + color: '#F7861C', + }, + onClick: this.updateCoin.bind(this), + }), + ]), + + h('#toCoin.ex-coins', marketinfo.pair.split('_')[1].toUpperCase()), + + h('img', { + src: coinOptions[marketinfo.pair.split('_')[1].toUpperCase()].image, + width: '25px', + height: '25px', + style: { + marginLeft: '5px', + }, + }), + ]), + + h('.flex-column', { + style: { + marginTop: '1%', + alignItems: 'flex-start', + }, + }, [ + this.props.warning ? + this.props.warning && + h('span.error.flex-center', { + style: { + textAlign: 'center', + width: '229px', + height: '82px', + }, + }, this.props.warning) + : this.renderInfo(), + + this.renderRefundAddressForCoin(coin), + ]), + + ]) +} + +ShapeshiftForm.prototype.renderRefundAddressForCoin = function (coin) { + return h(this.activeToggle('.input-container'), { + style: { + marginTop: '1%', + }, + }, [ + + h('div', `${coin} Address:`), + + h('input#fromCoinAddress.buy-inputs', { + type: 'text', + placeholder: `Your ${coin} Refund Address`, + dataset: { + persistentFormId: 'refund-address', + + }, + style: { + boxSizing: 'border-box', + width: '227px', + height: '30px', + padding: ' 5px ', + }, + }), + + h('i.fa.fa-pencil-square-o.edit-text', { + style: { + fontSize: '12px', + color: '#F7861C', + position: 'absolute', + }, + }), + h('div.flex-row', { + style: { + justifyContent: 'flex-start', + }, + }, [ + h('button', { + onClick: this.shift.bind(this), + style: { + marginTop: '1%', + }, + }, + 'Submit'), + ]), + ]) +} + +ShapeshiftForm.prototype.shift = function () { + var props = this.props + var withdrawal = this.props.buyView.buyAddress + var returnAddress = document.getElementById('fromCoinAddress').value + var pair = this.props.buyView.formView.marketinfo.pair + var data = { + 'withdrawal': withdrawal, + 'pair': pair, + 'returnAddress': returnAddress, + // Public api key + 'apiKey': '803d1f5df2ed1b1476e4b9e6bcd089e34d8874595dda6a23b67d93c56ea9cc2445e98a6748b219b2b6ad654d9f075f1f1db139abfa93158c04e825db122c14b6', + } + var message = [ + `Deposit Limit: ${props.buyView.formView.marketinfo.limit}`, + `Deposit Minimum:${props.buyView.formView.marketinfo.minimum}`, + ] + if (isValidAddress(withdrawal)) { + this.props.dispatch(actions.coinShiftRquest(data, message)) + } +} + +ShapeshiftForm.prototype.renderCoinList = function () { + var list = Object.keys(this.props.buyView.formView.coinOptions).map((item) => { + return h('option', { + value: item, + }, item) + }) + + return h('datalist#coinList', { + onClick: (event) => { + event.preventDefault() + }, + }, list) +} + +ShapeshiftForm.prototype.updateCoin = function (event) { + event.preventDefault() + const props = this.props + var coinOptions = this.props.buyView.formView.coinOptions + var coin = document.getElementById('fromCoin').value + + if (!coinOptions[coin.toUpperCase()] || coin.toUpperCase() === 'ETH') { + var message = 'Not a valid coin' + return props.dispatch(actions.displayWarning(message)) + } else { + return props.dispatch(actions.pairUpdate(coin)) + } +} + +ShapeshiftForm.prototype.handleLiveInput = function () { + const props = this.props + var coinOptions = this.props.buyView.formView.coinOptions + var coin = document.getElementById('fromCoin').value + + if (!coinOptions[coin.toUpperCase()] || coin.toUpperCase() === 'ETH') { + return null + } else { + return props.dispatch(actions.pairUpdate(coin)) + } +} + +ShapeshiftForm.prototype.renderInfo = function () { + const marketinfo = this.props.buyView.formView.marketinfo + const coinOptions = this.props.buyView.formView.coinOptions + var coin = marketinfo.pair.split('_')[0].toUpperCase() + + return h('span', { + style: { + }, + }, [ + h('h3.flex-row.text-transform-uppercase', { + style: { + color: '#868686', + paddingTop: '4px', + justifyContent: 'space-around', + textAlign: 'center', + fontSize: '17px', + }, + }, `Market Info for ${marketinfo.pair.replace('_', ' to ').toUpperCase()}:`), + h('.marketinfo', ['Status : ', `${coinOptions[coin].status}`]), + h('.marketinfo', ['Exchange Rate: ', `${marketinfo.rate}`]), + h('.marketinfo', ['Limit: ', `${marketinfo.limit}`]), + h('.marketinfo', ['Minimum : ', `${marketinfo.minimum}`]), + ]) +} + +ShapeshiftForm.prototype.activeToggle = function (elementType) { + if (!this.props.buyView.formView.response || this.props.warning) return elementType + return `${elementType}.inactive` +} + +ShapeshiftForm.prototype.renderLoading = function () { + return h('span', { + style: { + position: 'absolute', + left: '70px', + bottom: '194px', + background: 'transparent', + width: '229px', + height: '82px', + display: 'flex', + justifyContent: 'center', + }, + }, [ + h('img', { + style: { + width: '60px', + }, + src: 'images/loading.svg', + }), + ]) +} diff --git a/old-ui/app/components/shift-list-item.js b/old-ui/app/components/shift-list-item.js new file mode 100644 index 000000000..5454a90bc --- /dev/null +++ b/old-ui/app/components/shift-list-item.js @@ -0,0 +1,204 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const vreme = new (require('vreme'))() +const explorerLink = require('etherscan-link').createExplorerLink +const actions = require('../../../ui/app/actions') +const addressSummary = require('../util').addressSummary + +const CopyButton = require('./copyButton') +const EthBalance = require('./eth-balance') +const Tooltip = require('./tooltip') + + +module.exports = connect(mapStateToProps)(ShiftListItem) + +function mapStateToProps (state) { + return { + conversionRate: state.metamask.conversionRate, + currentCurrency: state.metamask.currentCurrency, + } +} + +inherits(ShiftListItem, Component) + +function ShiftListItem () { + Component.call(this) +} + +ShiftListItem.prototype.render = function () { + return ( + h('.transaction-list-item.flex-row', { + style: { + paddingTop: '20px', + paddingBottom: '20px', + justifyContent: 'space-around', + alignItems: 'center', + }, + }, [ + h('div', { + style: { + width: '0px', + position: 'relative', + bottom: '19px', + }, + }, [ + h('img', { + src: 'https://info.shapeshift.io/sites/default/files/logo.png', + style: { + height: '35px', + width: '132px', + position: 'absolute', + clip: 'rect(0px,23px,34px,0px)', + }, + }), + ]), + + this.renderInfo(), + this.renderUtilComponents(), + ]) + ) +} + +function formatDate (date) { + return vreme.format(new Date(date), 'March 16 2014 14:30') +} + +ShiftListItem.prototype.renderUtilComponents = function () { + var props = this.props + const { conversionRate, currentCurrency } = props + + switch (props.response.status) { + case 'no_deposits': + return h('.flex-row', [ + h(CopyButton, { + value: this.props.depositAddress, + }), + h(Tooltip, { + title: 'QR Code', + }, [ + h('i.fa.fa-qrcode.pointer.pop-hover', { + onClick: () => props.dispatch(actions.reshowQrCode(props.depositAddress, props.depositType)), + style: { + margin: '5px', + marginLeft: '23px', + marginRight: '12px', + fontSize: '20px', + color: '#F7861C', + }, + }), + ]), + ]) + case 'received': + return h('.flex-row') + + case 'complete': + return h('.flex-row', [ + h(CopyButton, { + value: this.props.response.transaction, + }), + h(EthBalance, { + value: `${props.response.outgoingCoin}`, + conversionRate, + currentCurrency, + width: '55px', + shorten: true, + needsParse: false, + incoming: true, + style: { + fontSize: '15px', + color: '#01888C', + }, + }), + ]) + + case 'failed': + return '' + default: + return '' + } +} + +ShiftListItem.prototype.renderInfo = function () { + var props = this.props + switch (props.response.status) { + case 'no_deposits': + return h('.flex-column', { + style: { + width: '200px', + overflow: 'hidden', + }, + }, [ + h('div', { + style: { + fontSize: 'x-small', + color: '#ABA9AA', + width: '100%', + }, + }, `${props.depositType} to ETH via ShapeShift`), + h('div', 'No deposits received'), + h('div', { + style: { + fontSize: 'x-small', + color: '#ABA9AA', + width: '100%', + }, + }, formatDate(props.time)), + ]) + case 'received': + return h('.flex-column', { + style: { + width: '200px', + overflow: 'hidden', + }, + }, [ + h('div', { + style: { + fontSize: 'x-small', + color: '#ABA9AA', + width: '100%', + }, + }, `${props.depositType} to ETH via ShapeShift`), + h('div', 'Conversion in progress'), + h('div', { + style: { + fontSize: 'x-small', + color: '#ABA9AA', + width: '100%', + }, + }, formatDate(props.time)), + ]) + case 'complete': + var url = explorerLink(props.response.transaction, parseInt('1')) + + return h('.flex-column.pointer', { + style: { + width: '200px', + overflow: 'hidden', + }, + onClick: () => global.platform.openWindow({ url }), + }, [ + h('div', { + style: { + fontSize: 'x-small', + color: '#ABA9AA', + width: '100%', + }, + }, 'From ShapeShift'), + h('div', formatDate(props.time)), + h('div', { + style: { + fontSize: 'x-small', + color: '#ABA9AA', + width: '100%', + }, + }, addressSummary(props.response.transaction)), + ]) + + case 'failed': + return h('span.error', '(Failed)') + default: + return '' + } +} diff --git a/old-ui/app/components/tab-bar.js b/old-ui/app/components/tab-bar.js new file mode 100644 index 000000000..bef444a48 --- /dev/null +++ b/old-ui/app/components/tab-bar.js @@ -0,0 +1,37 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits + +module.exports = TabBar + +inherits(TabBar, Component) +function TabBar () { + Component.call(this) +} + +TabBar.prototype.render = function () { + const props = this.props + const state = this.state || {} + const { tabs = [], defaultTab, tabSelected } = props + const { subview = defaultTab } = state + + return ( + h('.flex-row.space-around.text-transform-uppercase', { + style: { + background: '#EBEBEB', + color: '#AEAEAE', + paddingTop: '4px', + minHeight: '30px', + }, + }, tabs.map((tab) => { + const { key, content } = tab + return h(subview === key ? '.activeForm' : '.inactiveForm.pointer', { + onClick: () => { + this.setState({ subview: key }) + tabSelected(key) + }, + }, content) + })) + ) +} + diff --git a/old-ui/app/components/template.js b/old-ui/app/components/template.js new file mode 100644 index 000000000..b6ed8eaa0 --- /dev/null +++ b/old-ui/app/components/template.js @@ -0,0 +1,18 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits + +module.exports = NewComponent + +inherits(NewComponent, Component) +function NewComponent () { + Component.call(this) +} + +NewComponent.prototype.render = function () { + const props = this.props + + return ( + h('span', props.message) + ) +} diff --git a/old-ui/app/components/token-cell.js b/old-ui/app/components/token-cell.js new file mode 100644 index 000000000..19d7139bb --- /dev/null +++ b/old-ui/app/components/token-cell.js @@ -0,0 +1,72 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const Identicon = require('./identicon') +const prefixForNetwork = require('../../lib/etherscan-prefix-for-network') + +module.exports = TokenCell + +inherits(TokenCell, Component) +function TokenCell () { + Component.call(this) +} + +TokenCell.prototype.render = function () { + const props = this.props + const { address, symbol, string, network, userAddress } = props + + return ( + h('li.token-cell', { + style: { cursor: network === '1' ? 'pointer' : 'default' }, + onClick: this.view.bind(this, address, userAddress, network), + }, [ + + h(Identicon, { + diameter: 50, + address, + network, + }), + + h('h3', `${string || 0} ${symbol}`), + + h('span', { style: { flex: '1 0 auto' } }), + + /* + h('button', { + onClick: this.send.bind(this, address), + }, 'SEND'), + */ + + ]) + ) +} + +TokenCell.prototype.send = function (address, event) { + event.preventDefault() + event.stopPropagation() + const url = tokenFactoryFor(address) + if (url) { + navigateTo(url) + } +} + +TokenCell.prototype.view = function (address, userAddress, network, event) { + const url = etherscanLinkFor(address, userAddress, network) + if (url) { + navigateTo(url) + } +} + +function navigateTo (url) { + global.platform.openWindow({ url }) +} + +function etherscanLinkFor (tokenAddress, address, network) { + const prefix = prefixForNetwork(network) + return `https://${prefix}etherscan.io/token/${tokenAddress}?a=${address}` +} + +function tokenFactoryFor (tokenAddress) { + return `https://tokenfactory.surge.sh/#/token/${tokenAddress}` +} + diff --git a/old-ui/app/components/token-list.js b/old-ui/app/components/token-list.js new file mode 100644 index 000000000..998ec901d --- /dev/null +++ b/old-ui/app/components/token-list.js @@ -0,0 +1,207 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const TokenTracker = require('eth-token-tracker') +const TokenCell = require('./token-cell.js') + +module.exports = TokenList + +inherits(TokenList, Component) +function TokenList () { + this.state = { + tokens: [], + isLoading: true, + network: null, + } + Component.call(this) +} + +TokenList.prototype.render = function () { + const state = this.state + const { tokens, isLoading, error } = state + const { userAddress, network } = this.props + + if (isLoading) { + return this.message('Loading') + } + + if (error) { + log.error(error) + return h('.hotFix', { + style: { + padding: '80px', + }, + }, [ + 'We had trouble loading your token balances. You can view them ', + h('span.hotFix', { + style: { + color: 'rgba(247, 134, 28, 1)', + cursor: 'pointer', + }, + onClick: () => { + global.platform.openWindow({ + url: `https://ethplorer.io/address/${userAddress}`, + }) + }, + }, 'here'), + ]) + } + + const tokenViews = tokens.map((tokenData) => { + tokenData.network = network + tokenData.userAddress = userAddress + return h(TokenCell, tokenData) + }) + + return h('.full-flex-height', [ + this.renderTokenStatusBar(), + + h('ol.full-flex-height.flex-column', { + style: { + overflowY: 'auto', + display: 'flex', + flexDirection: 'column', + }, + }, [ + h('style', ` + + li.token-cell { + display: flex; + flex-direction: row; + align-items: center; + padding: 10px; + min-height: 50px; + } + + li.token-cell > h3 { + margin-left: 12px; + } + + li.token-cell:hover { + background: white; + cursor: pointer; + } + + `), + ...tokenViews, + h('.flex-grow'), + ]), + ]) +} + +TokenList.prototype.renderTokenStatusBar = function () { + const { tokens } = this.state + + let msg + if (tokens.length === 1) { + msg = `You own 1 token` + } else if (tokens.length > 1) { + msg = `You own ${tokens.length} tokens` + } else { + msg = `No tokens found` + } + + return h('div', { + style: { + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center', + minHeight: '70px', + padding: '10px', + }, + }, [ + h('span', msg), + h('button', { + key: 'reveal-account-bar', + onClick: (event) => { + event.preventDefault() + this.props.addToken() + }, + style: { + display: 'flex', + height: '40px', + padding: '10px', + justifyContent: 'center', + alignItems: 'center', + }, + }, [ + 'ADD TOKEN', + ]), + ]) +} + +TokenList.prototype.message = function (body) { + return h('div', { + style: { + display: 'flex', + height: '250px', + alignItems: 'center', + justifyContent: 'center', + padding: '30px', + }, + }, body) +} + +TokenList.prototype.componentDidMount = function () { + this.createFreshTokenTracker() +} + +TokenList.prototype.createFreshTokenTracker = function () { + if (this.tracker) { + // Clean up old trackers when refreshing: + this.tracker.stop() + this.tracker.removeListener('update', this.balanceUpdater) + this.tracker.removeListener('error', this.showError) + } + + if (!global.ethereumProvider) return + const { userAddress } = this.props + this.tracker = new TokenTracker({ + userAddress, + provider: global.ethereumProvider, + tokens: this.props.tokens, + pollingInterval: 8000, + }) + + + // Set up listener instances for cleaning up + this.balanceUpdater = this.updateBalances.bind(this) + this.showError = (error) => { + this.setState({ error, isLoading: false }) + } + this.tracker.on('update', this.balanceUpdater) + this.tracker.on('error', this.showError) + + this.tracker.updateBalances() + .then(() => { + this.updateBalances(this.tracker.serialize()) + }) + .catch((reason) => { + log.error(`Problem updating balances`, reason) + this.setState({ isLoading: false }) + }) +} + +TokenList.prototype.componentWillUpdate = function (nextProps) { + if (nextProps.network === 'loading') return + const oldNet = this.props.network + const newNet = nextProps.network + + if (oldNet && newNet && newNet !== oldNet) { + this.setState({ isLoading: true }) + this.createFreshTokenTracker() + } +} + +TokenList.prototype.updateBalances = function (tokens) { + const heldTokens = tokens.filter(token => { + return token.balance !== '0' && token.string !== '0.000' + }) + this.setState({ tokens: heldTokens, isLoading: false }) +} + +TokenList.prototype.componentWillUnmount = function () { + if (!this.tracker) return + this.tracker.stop() +} + diff --git a/old-ui/app/components/tooltip.js b/old-ui/app/components/tooltip.js new file mode 100644 index 000000000..efab2c497 --- /dev/null +++ b/old-ui/app/components/tooltip.js @@ -0,0 +1,22 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const ReactTooltip = require('react-tooltip-component') + +module.exports = Tooltip + +inherits(Tooltip, Component) +function Tooltip () { + Component.call(this) +} + +Tooltip.prototype.render = function () { + const props = this.props + const { position, title, children } = props + + return h(ReactTooltip, { + position: position || 'left', + title, + fixed: true, + }, children) +} diff --git a/old-ui/app/components/transaction-list-item-icon.js b/old-ui/app/components/transaction-list-item-icon.js new file mode 100644 index 000000000..f442b05af --- /dev/null +++ b/old-ui/app/components/transaction-list-item-icon.js @@ -0,0 +1,68 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const Tooltip = require('./tooltip') + +const Identicon = require('./identicon') + +module.exports = TransactionIcon + +inherits(TransactionIcon, Component) +function TransactionIcon () { + Component.call(this) +} + +TransactionIcon.prototype.render = function () { + const { transaction, txParams, isMsg } = this.props + switch (transaction.status) { + case 'unapproved': + return h(!isMsg ? '.unapproved-tx-icon' : 'i.fa.fa-certificate.fa-lg') + + case 'rejected': + return h('i.fa.fa-exclamation-triangle.fa-lg.warning', { + style: { + width: '24px', + }, + }) + + case 'failed': + return h('i.fa.fa-exclamation-triangle.fa-lg.error', { + style: { + width: '24px', + }, + }) + + case 'submitted': + return h(Tooltip, { + title: 'Pending', + position: 'right', + }, [ + h('i.fa.fa-ellipsis-h', { + style: { + fontSize: '27px', + }, + }), + ]) + } + + if (isMsg) { + return h('i.fa.fa-certificate.fa-lg', { + style: { + width: '24px', + }, + }) + } + + if (txParams.to) { + return h(Identicon, { + diameter: 24, + address: txParams.to || transaction.hash, + }) + } else { + return h('i.fa.fa-file-text-o.fa-lg', { + style: { + width: '24px', + }, + }) + } +} diff --git a/old-ui/app/components/transaction-list-item.js b/old-ui/app/components/transaction-list-item.js new file mode 100644 index 000000000..891d5e227 --- /dev/null +++ b/old-ui/app/components/transaction-list-item.js @@ -0,0 +1,175 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits + +const EthBalance = require('./eth-balance') +const addressSummary = require('../util').addressSummary +const explorerLink = require('etherscan-link').createExplorerLink +const CopyButton = require('./copyButton') +const vreme = new (require('vreme'))() +const Tooltip = require('./tooltip') +const numberToBN = require('number-to-bn') + +const TransactionIcon = require('./transaction-list-item-icon') +const ShiftListItem = require('./shift-list-item') +module.exports = TransactionListItem + +inherits(TransactionListItem, Component) +function TransactionListItem () { + Component.call(this) +} + +TransactionListItem.prototype.render = function () { + const { transaction, network, conversionRate, currentCurrency } = this.props + if (transaction.key === 'shapeshift') { + if (network === '1') return h(ShiftListItem, transaction) + } + var date = formatDate(transaction.time) + + let isLinkable = false + const numericNet = parseInt(network) + isLinkable = numericNet === 1 || numericNet === 3 || numericNet === 4 || numericNet === 42 + + var isMsg = ('msgParams' in transaction) + var isTx = ('txParams' in transaction) + var isPending = transaction.status === 'unapproved' + let txParams + if (isTx) { + txParams = transaction.txParams + } else if (isMsg) { + txParams = transaction.msgParams + } + + const nonce = txParams.nonce ? numberToBN(txParams.nonce).toString(10) : '' + + const isClickable = ('hash' in transaction && isLinkable) || isPending + return ( + h(`.transaction-list-item.flex-row.flex-space-between${isClickable ? '.pointer' : ''}`, { + onClick: (event) => { + if (isPending) { + this.props.showTx(transaction.id) + } + event.stopPropagation() + if (!transaction.hash || !isLinkable) return + var url = explorerLink(transaction.hash, parseInt(network)) + global.platform.openWindow({ url }) + }, + style: { + padding: '20px 0', + }, + }, [ + + h('.identicon-wrapper.flex-column.flex-center.select-none', [ + h(TransactionIcon, { txParams, transaction, isTx, isMsg }), + ]), + + h(Tooltip, { + title: 'Transaction Number', + position: 'right', + }, [ + h('span', { + style: { + display: 'flex', + cursor: 'normal', + flexDirection: 'column', + alignItems: 'center', + justifyContent: 'center', + padding: '10px', + }, + }, nonce), + ]), + + h('.flex-column', {style: {width: '200px', overflow: 'hidden'}}, [ + domainField(txParams), + h('div', date), + recipientField(txParams, transaction, isTx, isMsg), + ]), + + // Places a copy button if tx is successful, else places a placeholder empty div. + transaction.hash ? h(CopyButton, { value: transaction.hash }) : h('div', {style: { display: 'flex', alignItems: 'center', width: '26px' }}), + + isTx ? h(EthBalance, { + value: txParams.value, + conversionRate, + currentCurrency, + width: '55px', + shorten: true, + showFiat: false, + style: {fontSize: '15px'}, + }) : h('.flex-column'), + ]) + ) +} + +function domainField (txParams) { + return h('div', { + style: { + fontSize: 'x-small', + color: '#ABA9AA', + overflow: 'hidden', + textOverflow: 'ellipsis', + width: '100%', + }, + }, [ + txParams.origin, + ]) +} + +function recipientField (txParams, transaction, isTx, isMsg) { + let message + + if (isMsg) { + message = 'Signature Requested' + } else if (txParams.to) { + message = addressSummary(txParams.to) + } else { + message = 'Contract Published' + } + + return h('div', { + style: { + fontSize: 'x-small', + color: '#ABA9AA', + }, + }, [ + message, + renderErrorOrWarning(transaction), + ]) +} + +function formatDate (date) { + return vreme.format(new Date(date), 'March 16 2014 14:30') +} + +function renderErrorOrWarning (transaction) { + const { status, err, warning } = transaction + + // show rejected + if (status === 'rejected') { + return h('span.error', ' (Rejected)') + } + + // show error + if (err) { + const message = err.message || '' + return ( + h(Tooltip, { + title: message, + position: 'bottom', + }, [ + h(`span.error`, ` (Failed)`), + ]) + ) + } + + // show warning + if (warning) { + const message = warning.message + return h(Tooltip, { + title: message, + position: 'bottom', + }, [ + h(`span.warning`, ` (Warning)`), + ]) + } +} diff --git a/old-ui/app/components/transaction-list.js b/old-ui/app/components/transaction-list.js new file mode 100644 index 000000000..69b72614c --- /dev/null +++ b/old-ui/app/components/transaction-list.js @@ -0,0 +1,87 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits + +const TransactionListItem = require('./transaction-list-item') + +module.exports = TransactionList + + +inherits(TransactionList, Component) +function TransactionList () { + Component.call(this) +} + +TransactionList.prototype.render = function () { + const { transactions, network, unapprovedMsgs, conversionRate } = this.props + + var shapeShiftTxList + if (network === '1') { + shapeShiftTxList = this.props.shapeShiftTxList + } + const txsToRender = !shapeShiftTxList ? transactions.concat(unapprovedMsgs) : transactions.concat(unapprovedMsgs, shapeShiftTxList) + .sort((a, b) => b.time - a.time) + + return ( + + h('section.transaction-list.full-flex-height', { + style: { + justifyContent: 'center', + }, + }, [ + + h('style', ` + .transaction-list .transaction-list-item:not(:last-of-type) { + border-bottom: 1px solid #D4D4D4; + } + .transaction-list .transaction-list-item .ether-balance-label { + display: block !important; + font-size: small; + } + `), + + h('.tx-list', { + style: { + overflowY: 'auto', + height: '100%', + padding: '0 20px', + textAlign: 'center', + }, + }, [ + + txsToRender.length + ? txsToRender.map((transaction, i) => { + let key + switch (transaction.key) { + case 'shapeshift': + const { depositAddress, time } = transaction + key = `shift-tx-${depositAddress}-${time}-${i}` + break + default: + key = `tx-${transaction.id}-${i}` + } + return h(TransactionListItem, { + transaction, i, network, key, + conversionRate, + showTx: (txId) => { + this.props.viewPendingTx(txId) + }, + }) + }) + : h('.flex-center.full-flex-height', { + style: { + flexDirection: 'column', + justifyContent: 'center', + }, + }, [ + h('p', { + style: { + marginTop: '50px', + }, + }, 'No transaction history.'), + ]), + ]), + ]) + ) +} + diff --git a/old-ui/app/components/typed-message-renderer.js b/old-ui/app/components/typed-message-renderer.js new file mode 100644 index 000000000..d170d63b7 --- /dev/null +++ b/old-ui/app/components/typed-message-renderer.js @@ -0,0 +1,42 @@ +const Component = require('react').Component +const h = require('react-hyperscript') +const inherits = require('util').inherits +const extend = require('xtend') + +module.exports = TypedMessageRenderer + +inherits(TypedMessageRenderer, Component) +function TypedMessageRenderer () { + Component.call(this) +} + +TypedMessageRenderer.prototype.render = function () { + const props = this.props + const { value, style } = props + const text = renderTypedData(value) + + const defaultStyle = extend({ + width: '315px', + maxHeight: '210px', + resize: 'none', + border: 'none', + background: 'white', + padding: '3px', + overflow: 'scroll', + }, style) + + return ( + h('div.font-small', { + style: defaultStyle, + }, text) + ) +} + +function renderTypedData (values) { + return values.map(function (value) { + return h('div', {}, [ + h('strong', {style: {display: 'block', fontWeight: 'bold'}}, String(value.name) + ':'), + h('div', {}, value.value), + ]) + }) +} diff --git a/old-ui/app/conf-tx.js b/old-ui/app/conf-tx.js new file mode 100644 index 000000000..15c937b1c --- /dev/null +++ b/old-ui/app/conf-tx.js @@ -0,0 +1,235 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const actions = require('../../ui/app/actions') +const NetworkIndicator = require('./components/network') +const txHelper = require('../lib/tx-helper') +const isPopupOrNotification = require('../../app/scripts/lib/is-popup-or-notification') + +const PendingTx = require('./components/pending-tx') +const PendingMsg = require('./components/pending-msg') +const PendingPersonalMsg = require('./components/pending-personal-msg') +const PendingTypedMsg = require('./components/pending-typed-msg') +const Loading = require('./components/loading') + +module.exports = connect(mapStateToProps)(ConfirmTxScreen) + +function mapStateToProps (state) { + return { + identities: state.metamask.identities, + accounts: state.metamask.accounts, + selectedAddress: state.metamask.selectedAddress, + unapprovedTxs: state.metamask.unapprovedTxs, + unapprovedMsgs: state.metamask.unapprovedMsgs, + unapprovedPersonalMsgs: state.metamask.unapprovedPersonalMsgs, + unapprovedTypedMessages: state.metamask.unapprovedTypedMessages, + index: state.appState.currentView.context, + warning: state.appState.warning, + network: state.metamask.network, + provider: state.metamask.provider, + conversionRate: state.metamask.conversionRate, + currentCurrency: state.metamask.currentCurrency, + blockGasLimit: state.metamask.currentBlockGasLimit, + computedBalances: state.metamask.computedBalances, + } +} + +inherits(ConfirmTxScreen, Component) +function ConfirmTxScreen () { + Component.call(this) +} + +ConfirmTxScreen.prototype.render = function () { + const props = this.props + const { network, provider, unapprovedTxs, currentCurrency, computedBalances, + unapprovedMsgs, unapprovedPersonalMsgs, unapprovedTypedMessages, conversionRate, blockGasLimit } = props + + var unconfTxList = txHelper(unapprovedTxs, unapprovedMsgs, unapprovedPersonalMsgs, unapprovedTypedMessages, network) + + var txData = unconfTxList[props.index] || {} + var txParams = txData.params || {} + var isNotification = isPopupOrNotification() === 'notification' + + log.info(`rendering a combined ${unconfTxList.length} unconf msg & txs`) + if (unconfTxList.length === 0) return h(Loading, { isLoading: true }) + + const unconfTxListLength = unconfTxList.length + + return ( + + h('.flex-column.flex-grow', [ + + // subtitle and nav + h('.section-title.flex-row.flex-center', [ + !isNotification ? h('i.fa.fa-arrow-left.fa-lg.cursor-pointer', { + onClick: this.goHome.bind(this), + }) : null, + h('h2.page-subtitle', 'Confirm Transaction'), + isNotification ? h(NetworkIndicator, { + network: network, + provider: provider, + }) : null, + ]), + + h('h3', { + style: { + alignSelf: 'center', + display: unconfTxList.length > 1 ? 'block' : 'none', + }, + }, [ + h('i.fa.fa-arrow-left.fa-lg.cursor-pointer', { + style: { + display: props.index === 0 ? 'none' : 'inline-block', + }, + onClick: () => props.dispatch(actions.previousTx()), + }), + ` ${props.index + 1} of ${unconfTxList.length} `, + h('i.fa.fa-arrow-right.fa-lg.cursor-pointer', { + style: { + display: props.index + 1 === unconfTxList.length ? 'none' : 'inline-block', + }, + onClick: () => props.dispatch(actions.nextTx()), + }), + ]), + + warningIfExists(props.warning), + + currentTxView({ + // Properties + txData: txData, + key: txData.id, + selectedAddress: props.selectedAddress, + accounts: props.accounts, + identities: props.identities, + conversionRate, + currentCurrency, + blockGasLimit, + unconfTxListLength, + computedBalances, + // Actions + buyEth: this.buyEth.bind(this, txParams.from || props.selectedAddress), + sendTransaction: this.sendTransaction.bind(this), + cancelTransaction: this.cancelTransaction.bind(this, txData), + cancelAllTransactions: this.cancelAllTransactions.bind(this, unconfTxList), + signMessage: this.signMessage.bind(this, txData), + signPersonalMessage: this.signPersonalMessage.bind(this, txData), + signTypedMessage: this.signTypedMessage.bind(this, txData), + cancelMessage: this.cancelMessage.bind(this, txData), + cancelPersonalMessage: this.cancelPersonalMessage.bind(this, txData), + cancelTypedMessage: this.cancelTypedMessage.bind(this, txData), + }), + ]) + ) +} + +function currentTxView (opts) { + log.info('rendering current tx view') + const { txData } = opts + const { txParams, msgParams, type } = txData + + if (txParams) { + log.debug('txParams detected, rendering pending tx') + return h(PendingTx, opts) + } else if (msgParams) { + log.debug('msgParams detected, rendering pending msg') + + if (type === 'eth_sign') { + log.debug('rendering eth_sign message') + return h(PendingMsg, opts) + } else if (type === 'personal_sign') { + log.debug('rendering personal_sign message') + return h(PendingPersonalMsg, opts) + } else if (type === 'eth_signTypedData') { + log.debug('rendering eth_signTypedData message') + return h(PendingTypedMsg, opts) + } + } +} + +ConfirmTxScreen.prototype.buyEth = function (address, event) { + event.preventDefault() + this.props.dispatch(actions.buyEthView(address)) +} + +ConfirmTxScreen.prototype.sendTransaction = function (txData, event) { + this.stopPropagation(event) + this.props.dispatch(actions.updateAndApproveTx(txData)) +} + +ConfirmTxScreen.prototype.cancelTransaction = function (txData, event) { + this.stopPropagation(event) + event.preventDefault() + this.props.dispatch(actions.cancelTx(txData)) +} + +ConfirmTxScreen.prototype.cancelAllTransactions = function (unconfTxList, event) { + this.stopPropagation(event) + event.preventDefault() + this.props.dispatch(actions.cancelAllTx(unconfTxList)) +} + +ConfirmTxScreen.prototype.signMessage = function (msgData, event) { + log.info('conf-tx.js: signing message') + var params = msgData.msgParams + params.metamaskId = msgData.id + this.stopPropagation(event) + this.props.dispatch(actions.signMsg(params)) +} + +ConfirmTxScreen.prototype.stopPropagation = function (event) { + if (event.stopPropagation) { + event.stopPropagation() + } +} + +ConfirmTxScreen.prototype.signPersonalMessage = function (msgData, event) { + log.info('conf-tx.js: signing personal message') + var params = msgData.msgParams + params.metamaskId = msgData.id + this.stopPropagation(event) + this.props.dispatch(actions.signPersonalMsg(params)) +} + +ConfirmTxScreen.prototype.signTypedMessage = function (msgData, event) { + log.info('conf-tx.js: signing typed message') + var params = msgData.msgParams + params.metamaskId = msgData.id + this.stopPropagation(event) + this.props.dispatch(actions.signTypedMsg(params)) +} + +ConfirmTxScreen.prototype.cancelMessage = function (msgData, event) { + log.info('canceling message') + this.stopPropagation(event) + this.props.dispatch(actions.cancelMsg(msgData)) +} + +ConfirmTxScreen.prototype.cancelPersonalMessage = function (msgData, event) { + log.info('canceling personal message') + this.stopPropagation(event) + this.props.dispatch(actions.cancelPersonalMsg(msgData)) +} + +ConfirmTxScreen.prototype.cancelTypedMessage = function (msgData, event) { + log.info('canceling typed message') + this.stopPropagation(event) + this.props.dispatch(actions.cancelTypedMsg(msgData)) +} + +ConfirmTxScreen.prototype.goHome = function (event) { + this.stopPropagation(event) + this.props.dispatch(actions.goHome()) +} + +function warningIfExists (warning) { + if (warning && + // Do not display user rejections on this screen: + warning.indexOf('User denied transaction signature') === -1) { + return h('.error', { + style: { + margin: 'auto', + }, + }, warning) + } +} diff --git a/old-ui/app/config.js b/old-ui/app/config.js new file mode 100644 index 000000000..acd101947 --- /dev/null +++ b/old-ui/app/config.js @@ -0,0 +1,222 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const actions = require('../../ui/app/actions') +const infuraCurrencies = require('./infura-conversion.json').objects.sort((a, b) => { + return a.quote.name.toLocaleLowerCase().localeCompare(b.quote.name.toLocaleLowerCase()) + }) +const validUrl = require('valid-url') +const exportAsFile = require('./util').exportAsFile +const Modal = require('../../ui/app/components/modals/index').Modal + +module.exports = connect(mapStateToProps)(ConfigScreen) + +function mapStateToProps (state) { + return { + metamask: state.metamask, + warning: state.appState.warning, + } +} + +inherits(ConfigScreen, Component) +function ConfigScreen () { + Component.call(this) +} + +ConfigScreen.prototype.render = function () { + var state = this.props + var metamaskState = state.metamask + var warning = state.warning + + return ( + h('.flex-column.flex-grow', [ + + h(Modal, {}, []), + + // subtitle and nav + h('.section-title.flex-row.flex-center', [ + h('i.fa.fa-arrow-left.fa-lg.cursor-pointer', { + onClick: (event) => { + state.dispatch(actions.goHome()) + }, + }), + h('h2.page-subtitle', 'Settings'), + ]), + + h('.error', { + style: { + display: warning ? 'block' : 'none', + padding: '0 20px', + textAlign: 'center', + }, + }, warning), + + // conf view + h('.flex-column.flex-justify-center.flex-grow.select-none', [ + h('.flex-space-around', { + style: { + padding: '20px', + }, + }, [ + + currentProviderDisplay(metamaskState), + + h('div', { style: {display: 'flex'} }, [ + h('input#new_rpc', { + placeholder: 'New RPC URL', + style: { + width: 'inherit', + flex: '1 0 auto', + height: '30px', + margin: '8px', + }, + onKeyPress (event) { + if (event.key === 'Enter') { + var element = event.target + var newRpc = element.value + rpcValidation(newRpc, state) + } + }, + }), + h('button', { + style: { + alignSelf: 'center', + }, + onClick (event) { + event.preventDefault() + var element = document.querySelector('input#new_rpc') + var newRpc = element.value + rpcValidation(newRpc, state) + }, + }, 'Save'), + ]), + + h('hr.horizontal-line'), + + currentConversionInformation(metamaskState, state), + + h('hr.horizontal-line'), + + h('div', { + style: { + marginTop: '20px', + }, + }, [ + h('p', { + style: { + fontFamily: 'Montserrat Light', + fontSize: '13px', + }, + }, `State logs contain your public account addresses and sent transactions.`), + h('br'), + h('button', { + style: { + alignSelf: 'center', + }, + onClick (event) { + window.logStateString((err, result) => { + if (err) { + state.dispatch(actions.displayWarning('Error in retrieving state logs.')) + } else { + exportAsFile('MetaMask State Logs', result) + } + }) + }, + }, 'Download State Logs'), + ]), + + h('hr.horizontal-line'), + + h('div', { + style: { + marginTop: '20px', + }, + }, [ + h('button', { + style: { + alignSelf: 'center', + }, + onClick (event) { + event.preventDefault() + state.dispatch(actions.revealSeedConfirmation()) + }, + }, 'Reveal Seed Words'), + ]), + + ]), + ]), + ]) + ) +} + +function rpcValidation (newRpc, state) { + if (validUrl.isWebUri(newRpc)) { + state.dispatch(actions.setRpcTarget(newRpc)) + } else { + var appendedRpc = `http://${newRpc}` + if (validUrl.isWebUri(appendedRpc)) { + state.dispatch(actions.displayWarning('URIs require the appropriate HTTP/HTTPS prefix.')) + } else { + state.dispatch(actions.displayWarning('Invalid RPC URI')) + } + } +} + +function currentConversionInformation (metamaskState, state) { + var currentCurrency = metamaskState.currentCurrency + var conversionDate = metamaskState.conversionDate + return h('div', [ + h('span', {style: { fontWeight: 'bold', paddingRight: '10px'}}, 'Current Conversion'), + h('span', {style: { fontWeight: 'bold', paddingRight: '10px', fontSize: '13px'}}, `Updated ${Date(conversionDate)}`), + h('select#currentCurrency', { + onChange (event) { + event.preventDefault() + var element = document.getElementById('currentCurrency') + var newCurrency = element.value + state.dispatch(actions.setCurrentCurrency(newCurrency)) + }, + defaultValue: currentCurrency, + }, infuraCurrencies.map((currency) => { + return h('option', {key: currency.quote.code, value: currency.quote.code}, `${currency.quote.code.toUpperCase()} - ${currency.quote.name}`) + }) + ), + ]) +} + +function currentProviderDisplay (metamaskState) { + var provider = metamaskState.provider + var title, value + + switch (provider.type) { + + case 'mainnet': + title = 'Current Network' + value = 'Main Ethereum Network' + break + + case 'ropsten': + title = 'Current Network' + value = 'Ropsten Test Network' + break + + case 'kovan': + title = 'Current Network' + value = 'Kovan Test Network' + break + + case 'rinkeby': + title = 'Current Network' + value = 'Rinkeby Test Network' + break + + default: + title = 'Current RPC' + value = metamaskState.provider.rpcTarget + } + + return h('div', [ + h('span', {style: { fontWeight: 'bold', paddingRight: '10px'}}, title), + h('span', value), + ]) +} diff --git a/old-ui/app/css/debug.css b/old-ui/app/css/debug.css new file mode 100644 index 000000000..3e125bcd4 --- /dev/null +++ b/old-ui/app/css/debug.css @@ -0,0 +1,21 @@ +/* +debug / dev +*/ + +#app-content { + border: 2px solid green; +} + +#design-container { + position: absolute; + left: 360px; + top: -42px; + width: calc(100vw - 360px); + height: 100vh; + overflow: scroll; +} + +#design-container img { + width: 2000px; + margin-right: 600px; +}
\ No newline at end of file diff --git a/old-ui/app/css/fonts.css b/old-ui/app/css/fonts.css new file mode 100644 index 000000000..3b9f581b9 --- /dev/null +++ b/old-ui/app/css/fonts.css @@ -0,0 +1,36 @@ +@import url(https://fonts.googleapis.com/css?family=Roboto:300,500); +@import url(https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css); + +@font-face { + font-family: 'Montserrat Regular'; + src: url('/fonts/Montserrat/Montserrat-Regular.woff') format('woff'); + src: url('/fonts/Montserrat/Montserrat-Regular.ttf') format('truetype'); + font-weight: normal; + font-style: normal; + font-size: 'small'; + +} + +@font-face { + font-family: 'Montserrat Bold'; + src: url('/fonts/Montserrat/Montserrat-Bold.woff') format('woff'); + src: url('/fonts/Montserrat/Montserrat-Bold.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Montserrat Light'; + src: url('/fonts/Montserrat/Montserrat-Light.woff') format('woff'); + src: url('/fonts/Montserrat/Montserrat-Light.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} + +@font-face { + font-family: 'Montserrat UltraLight'; + src: url('/fonts/Montserrat/Montserrat-UltraLight.woff') format('woff'); + src: url('/fonts/Montserrat/Montserrat-UltraLight.ttf') format('truetype'); + font-weight: normal; + font-style: normal; +} diff --git a/old-ui/app/css/index.css b/old-ui/app/css/index.css new file mode 100644 index 000000000..c2f2b6070 --- /dev/null +++ b/old-ui/app/css/index.css @@ -0,0 +1,754 @@ +/* +faint orange (textfield shades) #FAF6F0 +light orange (button shades): #F5C26D +dark orange (text): #F5A623 +borders/font/any gray: #4A4A4A +*/ + +/* +application specific styles +*/ + +* { + box-sizing: border-box; +} + +html, body { + font-family: 'Montserrat Regular', Arial; + color: #4D4D4D; + font-weight: 300; + line-height: 1.4em; + background: #F7F7F7; + margin: 0; + padding: 0; +} + +html { + min-height: 500px; +} + +.app-root { + overflow: hidden; + position: relative +} + +.app-primary { + display: flex; +} + +input:focus, textarea:focus { + outline: none; +} + +.full-size { + height: 100%; + width: 100%; +} + +.full-width { + width: 100%; +} + +.full-height { + height: 100%; +} + +.full-flex-height { + display: flex; + flex: 1 1 auto; + flex-direction: column; +} + +#app-content { + overflow-x: hidden; + min-width: 357px; + height: 100%; + display: flex; + flex-direction: column; +} + +button, input[type="submit"] { + font-family: 'Montserrat Bold'; + outline: none; + cursor: pointer; + padding: 8px 12px; + border: none; + color: white; + transform-origin: center center; + transition: transform 50ms ease-in; + /* default orange */ + background: rgba(247, 134, 28, 1); + box-shadow: 0px 3px 6px rgba(247, 134, 28, 0.36); +} + +.btn-green, input[type="submit"].btn-green { + background: rgba(106, 195, 96, 1); + box-shadow: 0px 3px 6px rgba(106, 195, 96, 0.36); +} + +.btn-red { + background: rgba(254, 35, 17, 1); + box-shadow: 0px 3px 6px rgba(254, 35, 17, 0.36); +} + +button[disabled], input[type="submit"][disabled] { + cursor: not-allowed; + background: rgba(197, 197, 197, 1); + box-shadow: 0px 3px 6px rgba(197, 197, 197, 0.36); +} + +button.spaced { + margin: 2px; +} + +button:not([disabled]):hover, input[type="submit"]:not([disabled]):hover { + transform: scale(1.1); +} +button:not([disabled]):active, input[type="submit"]:not([disabled]):active { + transform: scale(0.95); +} + +a { + text-decoration: none; + color: inherit; +} + +a:hover{ + color: #df6b0e; +} + +/* +app +*/ + +.active { + color: #909090; +} + +button.primary { + padding: 8px 12px; + background: #F7861C; + box-shadow: 0px 3px 6px rgba(247, 134, 28, 0.36); + color: white; + font-size: 1.1em; + font-family: 'Montserrat Regular'; + text-transform: uppercase; +} + +button.btn-thin { + border: 1px solid; + border-color: #4D4D4D; + color: #4D4D4D; + background: rgb(255, 174, 41); + border-radius: 4px; + min-width: 200px; + margin: 12px 0; + padding: 6px; + font-size: 13px; +} + +.app-header { + padding: 6px 8px; +} + +.app-header h1 { + font-family: 'Montserrat Regular'; + text-transform: uppercase; + color: #AEAEAE; +} + +h2.page-subtitle { + font-family: 'Montserrat Regular'; + text-transform: uppercase; + color: #AEAEAE; + font-size: 1em; + margin: 12px; +} + +.app-footer { + padding-bottom: 10px; + align-items: center; +} + +.identicon { + height: 46px; + width: 46px; + background-size: cover; + border-radius: 100%; + border: 3px solid gray; +} + +textarea.twelve-word-phrase { + padding: 12px; + width: 300px; + height: 140px; + font-size: 16px; + background: white; + resize: none; +} + +.network-indicator { + display: flex; + align-items: center; + font-size: 0.6em; + +} + +.network-name { + width: 5.2em; + line-height: 9px; + text-rendering: geometricPrecision; +} + +.check { + margin-left: 12px; + color: #F7861C; + flex: 1 0 auto; + display: flex; + justify-content: flex-end; +} +/* +app sections +*/ + +/* initialize */ + +.initialize-screen hr { + width: 60px; + margin: 12px; + border-color: #F7861C; + border-style: solid; +} + +.initialize-screen label { + margin-top: 20px; +} + +.initialize-screen button.create-vault { + margin-top: 40px; +} + +.initialize-screen .warning { + font-size: 14px; + margin: 0 16px; +} + +/* unlock */ +.error { + color: #f7861c; + margin-bottom: 9px; +} + +.warning { + color: #FFAE00; +} + +.lock { + width: 50px; + height: 50px; +} + +.lock.locked { + transform: scale(1.5); + opacity: 0.0; + transition: opacity 400ms ease-in, transform 400ms ease-in; +} +.lock.unlocked { + transform: scale(1); + opacity: 1; + transition: opacity 500ms ease-out, transform 500ms ease-out, background 200ms ease-in; +} + +.lock.locked .lock-top { + transform: scaleX(1) translateX(0); + transition: transform 250ms ease-in; +} +.lock.unlocked .lock-top { + transform: scaleX(-1) translateX(-12px); + transition: transform 250ms ease-in; +} +.lock.unlocked:hover { + border-radius: 4px; + background: #e5e5e5; + border: 1px solid #b1b1b1; +} +.lock.unlocked:active { + background: #c3c3c3; +} + +.section-title .fa-arrow-left { + margin: -2px 8px 0px -8px; +} + +.unlock-screen #metamask-mascot-container { + margin-top: 24px; +} + +.unlock-screen h1 { + margin-top: -28px; + margin-bottom: 42px; +} + +.unlock-screen input[type=password] { + width: 260px; + /*height: 36px; + margin-bottom: 24px; + padding: 8px;*/ +} + +.sizing-input{ + font-size: 14px; + height: 30px; + padding-left: 5px; +} +.editable-label{ + display: flex; +} +/* Webkit */ +.unlock-screen input::-webkit-input-placeholder { + text-align: center; + font-size: 1.2em; +} +/* Firefox 18- */ +.unlock-screen input:-moz-placeholder { + text-align: center; + font-size: 1.2em; +} +/* Firefox 19+ */ +.unlock-screen input::-moz-placeholder { + text-align: center; + font-size: 1.2em; +} +/* IE */ +.unlock-screen input:-ms-input-placeholder { + text-align: center; + font-size: 1.2em; +} + +input.large-input, textarea.large-input { + /*margin-bottom: 24px;*/ + padding: 8px; +} + +input.large-input { + height: 36px; +} + +.letter-spacey { + letter-spacing: 0.1em; +} + + + +/* accounts */ + +.accounts-section { + margin: 0 0px; +} + +.accounts-section .horizontal-line { + margin: 0px 18px; +} + +.accounts-list-option { + height: 120px; +} + +.accounts-list-option .identicon-wrapper { + width: 100px; +} + +.unconftx-link { + margin-top: 24px; + cursor: pointer; +} + +.unconftx-link .fa-arrow-right { + margin: 0px -8px 0px 8px; +} + +/* identity panel */ + +.identity-panel { + font-weight: 500; +} + +.identity-panel .identicon-wrapper { + margin: 4px; + margin-top: 8px; + display: flex; + align-items: center; +} + +.identity-panel .identicon-wrapper span { + margin: 0 auto; +} + +.identity-panel .identity-data { + margin: 8px 8px 8px 18px; +} + +.identity-panel i { + margin-top: 32px; + margin-right: 6px; + color: #B9B9B9; +} + +.identity-panel .arrow-right { + padding-left: 18px; + width: 42px; + min-width: 18px; + height: 100%; +} + +.identity-copy.flex-column { + flex: 0.25 0 auto; + justify-content: center; +} + +/* accounts screen */ + +.identity-section { + +} + +.identity-section .identity-panel { + background: #E9E9E9; + border-bottom: 1px solid #B1B1B1; + cursor: pointer; +} + +.identity-section .identity-panel.selected { + background: white; + color: #F3C83E; +} + +.identity-section .identity-panel.selected .identicon { + border-color: orange; +} + +.identity-section .accounts-list-option:hover, +.identity-section .accounts-list-option.selected { + background:white; +} + +/* account detail screen */ + +.account-detail-section { + display: flex; + flex-wrap: wrap; + overflow-y: auto; + flex-direction: inherit; +} + +.grow-tenx { + flex-grow: 10; +} + +.name-label{ + +} + +.unapproved-tx-icon { + height: 16px; + width: 16px; + background: rgb(47, 174, 244); + border-color: #AEAEAE; + border-radius: 13px; +} + +.edit-text { + height: 100%; + visibility: hidden; +} +.editing-label { + display: flex; + justify-content: flex-start; + margin-left: 50px; + margin-bottom: 2px; + font-size: 11px; + text-rendering: geometricPrecision; + color: #F7861C; +} +.name-label:hover .edit-text { + visibility: visible; +} +/* tx confirm */ + +.unconftx-section input[type=password] { + height: 22px; + padding: 2px; + margin: 12px; + margin-bottom: 24px; + border-radius: 4px; + border: 2px solid #F3C83E; + background: #FAF6F0; +} + +/* Send Screen */ + +.send-screen { + +} + +.send-screen section { + margin: 8px 16px; +} + +.send-screen input { + width: 100%; + font-size: 12px; +} + +/* Ether Balance Widget */ + +.ether-balance-amount { + color: #F7861C; +} + +.ether-balance-label { + color: #ABA9AA; +} + +/* Info screen */ +.info-gray{ + font-family: 'Montserrat Regular'; + text-transform: uppercase; + color: #AEAEAE; +} + +.icon-size{ + width: 20px; +} + +.info{ + font-family: 'Montserrat Regular', Arial; + padding-bottom: 10px; + display: inline-block; + padding-left: 5px; +} + +/* buy eth warning screen */ +.custom-radios { + justify-content: space-around; + align-items: center; +} + + +.custom-radio-selected { + width: 17px; + height: 17px; + border: solid; + border-style: double; + border-radius: 15px; + border-width: 5px; + background: rgba(247, 134, 28, 1); + border-color: #F7F7F7; +} + +.custom-radio-inactive { + width: 14px; + height: 14px; + border: solid; + border-width: 1px; + border-radius: 24px; + border-color: #AEAEAE; +} + +.radio-titles { + color: rgba(247, 134, 28, 1); +} + +.radio-titles-subtext { + +} + +.selected-exchange { + +} + +.buy-radio { + +} + +.eth-warning{ + transition: opacity 400ms ease-in, transform 400ms ease-in; +} + +.buy-subview{ + transition: opacity 400ms ease-in, transform 400ms ease-in; +} + +.input-container:hover .edit-text{ + visibility: visible; +} + +.buy-inputs{ + font-family: 'Montserrat Light'; + font-size: 13px; + height: 20px; + background: transparent; + box-sizing: border-box; + border: solid; + border-color: transparent; + border-width: 0.5px; + border-radius: 2px; + +} +.input-container:hover .buy-inputs{ + box-sizing: inherit; + border: solid; + border-color: #F7861C; + border-width: 0.5px; + border-radius: 2px; +} + +.buy-inputs:focus{ + border: solid; + border-color: #F7861C; + border-width: 0.5px; + border-radius: 2px; +} + +.activeForm { + background: #F7F7F7; + border: none; + border-radius: 8px 8px 0px 0px; + width: 50%; + text-align: center; + padding-bottom: 4px; + +} + +.inactiveForm { + border: none; + border-radius: 8px 8px 0px 0px; + width: 50%; + text-align: center; + padding-bottom: 4px; +} + +.ex-coins { + font-family: 'Montserrat Regular'; + text-transform: uppercase; + text-align: center; + font-size: 33px; + width: 118px; + height: 42px; + padding: 1px; + color: #4D4D4D; +} + +.marketinfo{ + font-family: 'Montserrat light'; + color: #AEAEAE; + font-size: 15px; + line-height: 17px; +} + +#fromCoin::-webkit-calendar-picker-indicator { + display: none; +} + +#coinList { + width: 400px; + height: 500px; + overflow: scroll; +} + +.icon-control .fa-refresh{ + visibility: hidden; +} + +.icon-control:hover .fa-refresh{ + visibility: visible; +} + +.icon-control:hover .fa-chevron-right{ + visibility: hidden; +} + +.inactive { + color: #AEAEAE; +} + +.inactive button{ + background: #AEAEAE; + color: white; +} + +.ellip-address { + overflow: hidden; + text-overflow: ellipsis; + width: 5em; + font-size: 14px; + font-family: "Montserrat Light"; + margin-left: 5px; +} + +.qr-header { + font-size: 25px; + margin-top: 40px; +} + +.qr-message { + font-size: 12px; + color: #F7861C; +} + +div.message-container > div:first-child { + margin-top: 18px; + font-size: 15px; + color: #4D4D4D; +} + +.pop-hover:hover { + transform: scale(1.1); +} + +//Notification Modal + +.notification-modal-wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; + position: relative; + border: 1px solid #dedede; + box-shadow: 0 0 2px 2px #dedede; + font-family: Roboto; +} + +.notification-modal-header { + background: #f6f6f6; + width: 100%; + display: flex; + justify-content: center; + padding: 30px; + font-size: 22px; + color: #1b344d; + height: 79px; +} + +.notification-modal-message { + padding: 20px; +} + +.notification-modal-message { + width: 100%; + display: flex; + justify-content: center; + font-size: 17px; + color: #1b344d; +} + +.modal-close-x::after { + content: '\00D7'; + font-size: 2em; + color: #9b9b9b; + position: absolute; + top: 25px; + right: 17.5px; + font-family: sans-serif; + cursor: pointer; +}
\ No newline at end of file diff --git a/old-ui/app/css/lib.css b/old-ui/app/css/lib.css new file mode 100644 index 000000000..f3acbee76 --- /dev/null +++ b/old-ui/app/css/lib.css @@ -0,0 +1,306 @@ +/* color */ + +.color-orange { + color: #F7861C; +} + +.color-forest { + color: #0A5448; +} + +/* lib */ + +.full-width { + width: 100%; +} + +.full-height { + height: 100%; +} + +.flex-column { + display: flex; + flex-direction: column; +} + +.space-between { + justify-content: space-between; +} + +.space-around { + justify-content: space-around; +} + +.flex-column-bottom { + display: flex; + flex-direction: column-reverse; +} + +.flex-row { + display: flex; + flex-direction: row; +} + +.flex-space-between { + justify-content: space-between; +} + +.flex-space-around { + justify-content: space-around; +} + +.flex-right { + display: flex; + flex-direction: row; + justify-content: flex-end; +} + +.flex-left { + display: flex; + flex-direction: row; + justify-content: flex-start; +} + +.flex-fixed { + flex: none; +} + +.flex-basis-auto { + flex-basis: auto; +} + +.flex-grow { + flex: 1 1 auto; +} + +.flex-wrap { + flex-wrap: wrap; +} + +.flex-center { + display: flex; + justify-content: center; + align-items: center; +} + +.flex-justify-center { + justify-content: center; +} + +.flex-align-center { + align-items: center; +} + +.flex-self-end { + align-self: flex-end; +} + +.flex-self-stretch { + align-self: stretch; +} + +.flex-vertical { + flex-direction: column; +} + +.z-bump { + z-index: 1; +} + +.select-none { + cursor: inherit; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.pointer { + cursor: pointer; +} +.cursor-pointer { + cursor: pointer; + transform-origin: center center; + transition: transform 50ms ease-in-out; +} +.cursor-pointer:hover { + transform: scale(1.1); +} +.cursor-pointer:active { + transform: scale(0.95); +} + +.cursor-disabled { + cursor: not-allowed; +} + +.margin-bottom-sml { + margin-bottom: 20px; +} + +.margin-bottom-med { + margin-bottom: 40px; +} + +.margin-right-left { + margin: 0 20px; +} + +.bold { + font-weight: bold; +} + +.text-transform-uppercase { + text-transform: uppercase; +} + +.font-small { + font-size: 12px; +} + +.font-medium { + font-size: 1.2em; +} + +hr.horizontal-line { + display: block; + height: 1px; + border: 0; + border-top: 1px solid #ccc; + margin: 1em 0; + padding: 0; +} + +.hover-white:hover { + background: white; +} + +.red-dot { + background: #E91550; + color: white; + border-radius: 10px; +} + +.diamond { + transform: rotate(45deg); + background: #038789; +} + +.hollow-diamond { + transform: rotate(45deg); + border: 3px solid #690496; +} + +.golden-square { + background: #EBB33F; +} + +.pending-dot { + background: red; + left: 14px; + top: 14px; + color: white; + border-radius: 10px; + height: 20px; + min-width: 20px; + position: relative; + display: flex; + align-items: center; + justify-content: center; + padding: 4px; + z-index: 1; +} + +.keyring-label { + z-index: 1; + font-size: 11px; + background: rgba(255,0,0,0.8); + color: white; + bottom: 0px; + left: -8px; + border-radius: 10px; + height: 20px; + min-width: 20px; + position: absolute; + display: flex; + align-items: center; + justify-content: center; + padding: 4px; +} + +.ether-balance { + display: flex; + align-items: center; +} + +.tabSection { + min-width: 350px; +} + +.menu-icon { + display: inline-block; + height: 12px; + min-width: 12px; + margin: 13px; +} + +i.fa.fa-question-circle.fa-lg.menu-icon { + font-size: 18px; +} + +.ether-icon { + background: rgb(0, 163, 68); + border-radius: 20px; +} +.testnet-icon { + background: #2465E1; +} + +.drop-menu-item { + display: flex; + align-items: center; +} + +.invisible { + visibility: hidden; +} + +.one-line-concat { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.critical-error { + text-align: center; + margin-top: 20px; + color: red; +} + +/* + Hacky breakpoint fix for account + tab sections + Resolves issue from @frankiebee in + https://github.com/MetaMask/metamask-extension/pull/1835 + Please remove this when integrating new designs + */ + +@media screen and (min-width: 575px) and (max-width: 800px) { + .account-data-subsection { + flex: 0 0 auto !important; // reset flex + margin-left: 10px !important; // create additional horizontal space + margin-right: 10px !important; + width: 40%; + } + + .tabSection { + flex: 0 0 auto !important; + margin-left: 10px !important; + margin-right: 10px !important; + min-width: 285px; + width: 49%; + } + + .name-label { + width: 80%; + } +} diff --git a/old-ui/app/css/output/index.css b/old-ui/app/css/output/index.css new file mode 100644 index 000000000..84ceb3bd7 --- /dev/null +++ b/old-ui/app/css/output/index.css @@ -0,0 +1,5385 @@ +@charset "UTF-8"; +/* + ITCSS + + http://www.creativebloq.com/web-design/manage-large-css-projects-itcss-101517528 + https://www.xfive.co/blog/itcss-scalable-maintainable-css-architecture/ + */ +/* + Variables + */ +/* + Colors + http://chir.ag/projects/name-that-color + */ +/* + Z-Indicies + */ +/* + Z Indicies - Current + app - 11 + hex/bn as decimal input - 1 - remove? + dropdown - 11 + loading - 10 - higher? + mascot - 0 - remove? + */ +/* + Responsive Breakpoints + */ +@import url("https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900"); +@import url("https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css"); +@font-face { + font-family: 'Montserrat Regular'; + src: url("/fonts/Montserrat/Montserrat-Regular.woff") format("woff"); + src: url("/fonts/Montserrat/Montserrat-Regular.ttf") format("truetype"); + font-weight: 400; + font-style: normal; + font-size: 'small'; } + +@font-face { + font-family: 'Montserrat Bold'; + src: url("/fonts/Montserrat/Montserrat-Bold.woff") format("woff"); + src: url("/fonts/Montserrat/Montserrat-Bold.ttf") format("truetype"); + font-weight: 400; + font-style: normal; } + +@font-face { + font-family: 'Montserrat Light'; + src: url("/fonts/Montserrat/Montserrat-Light.woff") format("woff"); + src: url("/fonts/Montserrat/Montserrat-Light.ttf") format("truetype"); + font-weight: 400; + font-style: normal; } + +@font-face { + font-family: 'Montserrat UltraLight'; + src: url("/fonts/Montserrat/Montserrat-UltraLight.woff") format("woff"); + src: url("/fonts/Montserrat/Montserrat-UltraLight.ttf") format("truetype"); + font-weight: 400; + font-style: normal; } + +@font-face { + font-family: 'DIN OT'; + src: url("/fonts/DIN_OT/DINOT-2.otf") format("opentype"); + font-weight: 400; + font-style: normal; } + +@font-face { + font-family: 'DIN OT Light'; + src: url("/fonts/DIN_OT/DINOT-2.otf") format("opentype"); + font-weight: 200; + font-style: normal; } + +@font-face { + font-family: 'DIN NEXT'; + src: url("/fonts/DIN NEXT/DIN NEXT W01 Regular.otf") format("opentype"); + font-weight: 400; + font-style: normal; } + +@font-face { + font-family: 'DIN NEXT Light'; + src: url("/fonts/DIN NEXT/DIN NEXT W10 Light.otf") format("opentype"); + font-weight: 400; + font-style: normal; } + +@font-face { + font-family: 'Lato'; + src: url("/fonts/Lato/Lato-Regular.ttf") format("truetype"); + font-weight: 400; + font-style: normal; } + +/* + Utility Classes + */ +/* color */ +.color-orange { + color: #f7861c; } + +.color-forest { + color: #0a5448; } + +/* lib */ +.full-size { + height: 100%; + width: 100%; } + +.full-width { + width: 100%; } + +.full-flex-height { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; } + +.full-height { + height: 100%; } + +.flex-column { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; } + +.space-between { + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; } + +.space-around { + -ms-flex-pack: distribute; + justify-content: space-around; } + +.flex-column-bottom { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: reverse; + -ms-flex-direction: column-reverse; + flex-direction: column-reverse; } + +.flex-row { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; } + +.flex-space-between { + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; } + +.flex-space-around { + -ms-flex-pack: distribute; + justify-content: space-around; } + +.flex-right { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; } + +.flex-left { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; } + +.flex-fixed { + -webkit-box-flex: 0; + -ms-flex: none; + flex: none; } + +.flex-basis-auto { + -ms-flex-preferred-size: auto; + flex-basis: auto; } + +.flex-grow { + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; } + +.flex-wrap { + -ms-flex-wrap: wrap; + flex-wrap: wrap; } + +.flex-center { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } + +.flex-justify-center { + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; } + +.flex-align-center { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } + +.flex-self-end { + -ms-flex-item-align: end; + align-self: flex-end; } + +.flex-self-stretch { + -ms-flex-item-align: stretch; + align-self: stretch; } + +.flex-vertical { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; } + +.z-bump { + z-index: 1; } + +.select-none { + cursor: inherit; + -moz-user-select: none; + -webkit-user-select: none; + -ms-user-select: none; + user-select: none; } + +.pointer { + cursor: pointer; } + +.cursor-pointer { + cursor: pointer; + -webkit-transform-origin: center center; + transform-origin: center center; + -webkit-transition: -webkit-transform 50ms ease-in-out; + transition: -webkit-transform 50ms ease-in-out; + transition: transform 50ms ease-in-out; + transition: transform 50ms ease-in-out, -webkit-transform 50ms ease-in-out; } + +.cursor-pointer:hover { + -webkit-transform: scale(1.1); + transform: scale(1.1); } + +.cursor-pointer:active { + -webkit-transform: scale(0.95); + transform: scale(0.95); } + +.cursor-disabled { + cursor: not-allowed; } + +.margin-bottom-sml { + margin-bottom: 20px; } + +.margin-bottom-med { + margin-bottom: 40px; } + +.margin-right-left { + margin: 0 20px; } + +.bold { + font-weight: 700; } + +.text-transform-uppercase { + text-transform: uppercase; } + +.font-small { + font-size: 12px; } + +.font-medium { + font-size: 1.2em; } + +hr.horizontal-line { + display: block; + height: 1px; + border: 0; + border-top: 1px solid #ccc; + margin: 1em 0; + padding: 0; } + +.hover-white:hover { + background: #fff; } + +.red-dot { + background: #e91550; + color: #fff; + border-radius: 10px; } + +.diamond { + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + background: #038789; } + +.hollow-diamond { + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + border: 3px solid #690496; } + +.golden-square { + background: #ebb33f; } + +.pending-dot { + background: #f00; + left: 14px; + top: 14px; + color: #fff; + border-radius: 10px; + height: 20px; + min-width: 20px; + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + padding: 4px; + z-index: 1; } + +.keyring-label { + z-index: 1; + font-size: 8px; + line-height: 8px; + background: rgba(255, 255, 255, 0.4); + color: #fff; + border-radius: 10px; + padding: 4px; + text-align: center; + height: 15px; } + +.ether-balance { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } + +.tabSection { + min-width: 350px; } + +.menu-icon { + display: inline-block; + height: 12px; + min-width: 12px; + margin: 13px; } + +.ether-icon { + background: #00a344; + border-radius: 20px; } + +.testnet-icon { + background: #2465e1; } + +.drop-menu-item { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } + +.invisible { + visibility: hidden; } + +.one-line-concat { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; } + +.critical-error { + text-align: center; + margin-top: 20px; + color: #f00; } + +/* + Misc + */ +.letter-spacey { + letter-spacing: .1em; } + +.active { + color: #909090; } + +.check { + margin-left: 7px; + color: #f7861c; + -webkit-box-flex: 1; + -ms-flex: 1 0 auto; + flex: 1 0 auto; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; } + +/* + Generic + */ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ +html, +body, +div, +span, +applet, +object, +iframe, +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +pre, +a, +abbr, +acronym, +address, +big, +cite, +code, +del, +dfn, +em, +img, +ins, +kbd, +q, +s, +samp, +small, +strike, +strong, +sub, +sup, +tt, +var, +b, +u, +i, +center, +dl, +dt, +dd, +ol, +ul, +li, +fieldset, +form, +label, +legend, +table, +caption, +tbody, +tfoot, +thead, +tr, +th, +td, +article, +aside, +canvas, +details, +embed, +figure, +figcaption, +footer, +header, +hgroup, +menu, +nav, +output, +ruby, +section, +summary, +time, +mark, +audio, +video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + /* stylelint-disable */ + font: inherit; + /* stylelint-enable */ + vertical-align: baseline; } + +/* HTML5 display-role reset for older browsers */ +/* stylelint-disable */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section { + display: block; } + +body { + line-height: 1; } + +ol, +ul { + list-style: none; } + +blockquote, +q { + quotes: none; } + +blockquote:before, +blockquote:after, +q:before, +q:after { + content: ''; + content: none; } + +table { + border-collapse: collapse; + border-spacing: 0; } + +button { + border-style: none; + cursor: pointer; } + +/* stylelint-enable */ +* { + -webkit-box-sizing: border-box; + box-sizing: border-box; } + +html, +body { + font-family: Roboto, Arial; + color: #4d4d4d; + font-weight: 300; + line-height: 1.4em; + background: #f7f7f7; + width: 100%; + height: 100%; + margin: 0; + padding: 0; } + +html { + min-height: 500px; } + +.app-root { + overflow: hidden; + position: relative; } + +.app-primary { + display: -webkit-box; + display: -ms-flexbox; + display: flex; } + +input:focus, +textarea:focus { + outline: none; } + +/* stylelint-disable */ +#app-content { + overflow-x: hidden; + height: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; } + @media screen and (max-width: 575px) { + #app-content { + background-color: #fff; } } + +/* stylelint-enable */ +a { + text-decoration: none; + color: inherit; } + +a:hover { + color: #df6b0e; } + +input.large-input, +textarea.large-input { + padding: 8px; } + +input.large-input { + height: 36px; } + +/* + Buttons + */ +.btn-green { + background-color: #02c9b1; } + +button.btn-clear { + background: #fff; + border: 1px solid; } + +button[disabled], +input[type="submit"][disabled] { + cursor: not-allowed; + opacity: .5; } + +button.primary { + padding: 8px 12px; + background: #f7861c; + -webkit-box-shadow: 0 3px 6px rgba(247, 134, 28, 0.36); + box-shadow: 0 3px 6px rgba(247, 134, 28, 0.36); + color: #fff; + font-size: 1.1em; + font-family: Roboto; + text-transform: uppercase; } + +.btn-light { + padding: 8px 12px; + -webkit-box-shadow: 0 3px 6px rgba(247, 134, 28, 0.36); + box-shadow: 0 3px 6px rgba(247, 134, 28, 0.36); + color: #585d67; + font-size: 1.1em; + font-family: Roboto; + text-transform: uppercase; + text-align: center; + line-height: 20px; + border-radius: 2px; + border: 1px solid #979797; + opacity: .5; } + +button.btn-thin { + border: 1px solid; + border-color: #4d4d4d; + color: #4d4d4d; + background: #ffae29; + border-radius: 4px; + min-width: 200px; + margin: 12px 0; + padding: 6px; + font-size: 13px; } + +.btn-secondary { + border: 1px solid #979797; + border-radius: 2px; + background-color: #fff; + font-size: 16px; + line-height: 24px; + padding: 16px 42px; } + .btn-secondary[disabled] { + background-color: #fff !important; + opacity: .5; } + +.btn-tertiary { + border: 1px solid transparent; + border-radius: 2px; + background-color: transparent; + font-size: 16px; + line-height: 24px; + padding: 16px 42px; } + +.app-header { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + visibility: visible; + background: #efefef; + position: relative; + z-index: 12; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; } + @media screen and (max-width: 575px) { + .app-header { + padding: 12px; + width: 100%; + -webkit-box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.08); + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.08); + z-index: 26; } } + @media screen and (min-width: 576px) { + .app-header { + height: 75px; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; } + .app-header::after { + content: ''; + position: absolute; + width: 100%; + height: 32px; + background: #efefef; + bottom: -32px; } } + .app-header .metafox-icon { + cursor: pointer; } + +.app-header-contents { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + width: 100%; + height: 6.9vh; } + @media screen and (max-width: 575px) { + .app-header-contents { + height: 100%; } } + @media screen and (min-width: 576px) { + .app-header-contents { + width: 85vw; } } + @media screen and (min-width: 769px) { + .app-header-contents { + width: 80vw; } } + @media screen and (min-width: 1281px) { + .app-header-contents { + width: 65vw; } } + +.app-header h1 { + font-family: Roboto; + text-transform: uppercase; + font-weight: 400; + color: #22232c; + line-height: 29px; } + @media screen and (max-width: 575px) { + .app-header h1 { + display: none; } } + +h2.page-subtitle { + text-transform: uppercase; + color: #aeaeae; + font-size: 1em; + margin: 12px; } + +.network-component-wrapper { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } + +.left-menu-wrapper { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + cursor: pointer; } + +.header__right-actions { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } + .header__right-actions .identicon { + cursor: pointer; } + +.app-footer { + padding-bottom: 10px; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } + +.network-component--disabled { + cursor: default; } + .network-component--disabled .fa-caret-down { + opacity: 0; } + +.network-component.pointer { + border: 1px solid #22232c; + border-radius: 82px; + padding: 6px; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + .network-component.pointer.ethereum-network { + border-color: #038789; } + .network-component.pointer.ethereum-network .menu-icon-circle div { + background-color: rgba(3, 135, 137, 0.7) !important; } + .network-component.pointer.ropsten-test-network { + border-color: #e91550; } + .network-component.pointer.ropsten-test-network .menu-icon-circle div { + background-color: rgba(233, 21, 80, 0.7) !important; } + .network-component.pointer.kovan-test-network { + border-color: #690496; } + .network-component.pointer.kovan-test-network .menu-icon-circle div { + background-color: rgba(105, 4, 150, 0.7) !important; } + .network-component.pointer.rinkeby-test-network { + border-color: #ebb33f; } + .network-component.pointer.rinkeby-test-network .menu-icon-circle div { + background-color: rgba(235, 179, 63, 0.7) !important; } + +.dropdown-menu-item .menu-icon-circle, +.dropdown-menu-item .menu-icon-circle--active { + margin: 0 14px; } + +.network-indicator { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-size: .6em; } + .network-indicator .fa-caret-down { + line-height: 15px; + font-size: 12px; + padding: 0 4px; } + +.network-name { + line-height: 15px; + padding: 0 4px; + font-family: Roboto; + font-size: 12px; + -webkit-box-flex: 1; + -ms-flex: 1 0 auto; + flex: 1 0 auto; } + +.network-droppo { + right: 2px; } + @media screen and (min-width: 576px) { + .network-droppo { + right: calc(((100% - 85vw) / 2) + 2px); } } + @media screen and (min-width: 769px) { + .network-droppo { + right: calc(((100% - 80vw) / 2) + 2px); } } + @media screen and (min-width: 1281px) { + .network-droppo { + right: calc(((100% - 65vw) / 2) + 2px); } } + +.network-name-item { + font-weight: 100; + -webkit-box-flex: 1; + -ms-flex: 1 0 auto; + flex: 1 0 auto; + color: #9b9b9b; } + +.network-check, +.network-check__transparent { + color: #fff; + margin-left: 7px; } + +.network-check__transparent { + opacity: 0; + width: 16px; + margin: 0; } + +.menu-icon-circle, +.menu-icon-circle--active { + background: none; + border-radius: 22px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + border: 1px solid transparent; + margin: 0 4px; } + +.menu-icon-circle--active { + border: 1px solid #fff; + background: rgba(100, 100, 100, 0.4); } + +.menu-icon-circle div, +.menu-icon-circle--active div { + height: 12px; + width: 12px; + border-radius: 17px; } + +.menu-icon-circle--active div { + opacity: 1; } + +.network-dropdown-header { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + width: 100%; } + +.network-dropdown-divider { + width: 100%; + height: 1px; + margin: 10px 0; + background-color: #5d5d5d; } + +.network-dropdown-title { + height: 25px; + width: 75px; + color: #fff; + font-family: Roboto; + font-size: 18px; + line-height: 25px; + text-align: center; } + +.network-dropdown-content { + height: 36px; + width: 265px; + color: #9b9b9b; + font-family: Roboto; + font-size: 14px; + line-height: 18px; } + +.modal > div:focus { + outline: none !important; } + +.buy-modal-content { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + text-align: center; + font-family: Roboto; + padding: 0 16px; } + +.buy-modal-content-option { + cursor: pointer; + color: #5B5D67; } + +.qr-ellip-address, .ellip-address { + width: 247px; + border: none; + font-family: Roboto; + font-size: 14px; } + +@media screen and (max-width: 575px) { + .buy-modal-content-title-wrapper { + -ms-flex-pack: distribute; + justify-content: space-around; + width: 100%; + height: 100px; } + .buy-modal-content-title { + font-size: 26px; + margin-top: 15px; } + .buy-modal-content-options { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + padding: 5% 33%; } + .buy-modal-content-footer { + text-transform: uppercase; + width: 100%; + height: 50px; } + div.buy-modal-content-option { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + width: 80vw; + height: 15vh; + margin: 10px; + text-align: center; + border-radius: 6px; + border: 1px solid #000; + padding: 0% 7%; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; } + div.buy-modal-content-option div.buy-modal-content-option-title { + font-size: 20px; } + div.buy-modal-content-option div.buy-modal-content-option-subtitle { + font-size: 16px; } } + +@media screen and (min-width: 576px) { + .buy-modal-content-title-wrapper { + -ms-flex-pack: distribute; + justify-content: space-around; + width: 100%; + height: 110px; } + .buy-modal-content-title { + font-size: 26px; + margin-top: 15px; } + .buy-modal-content-footer { + text-transform: uppercase; + width: 100%; + height: 50px; } + .buy-modal-content-options { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + margin: 20px 0 60px; } + div.buy-modal-content-option { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + width: 20vw; + height: 120px; + text-align: center; + border-radius: 6px; + border: 1px solid #000; + margin: 0 8px; + padding: 18px 0; } + div.buy-modal-content-option div.buy-modal-content-option-title { + font-size: 20px; + margin-bottom: 12px; } } + @media screen and (min-width: 576px) and (max-width: 679px) { + div.buy-modal-content-option div.buy-modal-content-option-title { + font-size: 14px; } } + @media screen and (min-width: 576px) and (min-width: 1281px) { + div.buy-modal-content-option div.buy-modal-content-option-title { + font-size: 20px; } } + +@media screen and (min-width: 576px) { + div.buy-modal-content-option div.buy-modal-content-option-subtitle { + font-size: 16px; + padding: 0 10px; + height: 25%; } } + @media screen and (min-width: 576px) and (max-width: 679px) { + div.buy-modal-content-option div.buy-modal-content-option-subtitle { + font-size: 10px; + padding: 0 10px; + margin-bottom: 5px; + line-height: 15px; } } + @media screen and (min-width: 576px) and (min-width: 680px) { + div.buy-modal-content-option div.buy-modal-content-option-subtitle { + font-size: 14px; + padding: 0 4px; + margin-bottom: 2px; } } + @media screen and (min-width: 576px) and (min-width: 1281px) { + div.buy-modal-content-option div.buy-modal-content-option-subtitle { + font-size: 16px; + padding: 0; } } + +@media screen and (min-width: 576px) { + div.buy-modal-content-option div.buy-modal-content-footer { + margin-top: 8vh; } } + +.edit-account-name-modal-content { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + position: relative; } + +.edit-account-name-modal-cancel { + position: absolute; + top: 12px; + right: 20px; + font-size: 25px; } + +.edit-account-name-modal-title { + margin: 15px; } + +.edit-account-name-modal-save-button { + width: 33%; + height: 45px; + margin: 15px; + font-weight: 700; + margin-top: 25px; } + +.edit-account-name-modal-input { + width: 90%; + height: 50px; + text-align: left; + margin: 10px; + padding: 10px; + font-size: 18px; } + +.account-modal-container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + position: relative; + padding: 5px 0 31px 0; + border: 1px solid #cdcdcd; + border-radius: 4px; + font-family: Roboto; } + .account-modal-container button { + cursor: pointer; } + +.account-modal-back { + color: #9b9b9b; + position: absolute; + top: 13px; + left: 17px; + cursor: pointer; } + .account-modal-back__text { + margin-top: 2px; + font-family: Roboto; + font-size: 14px; + line-height: 18px; } + +.account-modal-close::after { + content: '\00D7'; + font-size: 40px; + color: #9b9b9b; + position: absolute; + top: 10px; + right: 12px; + cursor: pointer; } + +.account-modal-container .identicon { + position: relative; + left: 0; + right: 0; + margin: 0 auto; + top: -32px; + margin-bottom: -32px; } + +.account-modal-container .qr-header { + margin-top: 9px; + font-size: 20px; } + +.account-modal-container .qr-wrapper { + margin-top: 5px; } + +.account-modal-container .ellip-address-wrapper { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + border: 1px solid #dedede; + padding: 5px 10px; + font-family: Roboto; + margin-top: 7px; + width: 286px; } + +.account-modal-container .btn-clear { + min-height: 28px; + font-size: 14px; + border-color: #2f9ae0; + color: #2f9ae0; + border-radius: 2px; + -ms-flex-preferred-size: 100%; + flex-basis: 100%; + width: 75%; + margin-top: 17px; + padding: 10px 22px; + height: 44px; + width: 235px; + font-family: Roboto; } + +.account-modal-divider { + width: 100%; + height: 1px; + margin: 19px 0 8px 0; + background-color: #dedede; } + +.account-modal-container .account-name { + margin-top: 9px; + font-size: 20px; } + +.account-modal-container .modal-body-title { + margin-top: 16px; + margin-bottom: 16px; + font-size: 18px; } + +.account-modal__name { + margin-top: 9px; + font-size: 20px; } + +.private-key-password { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; } + +.private-key-password-label, .private-key-password-error { + color: #5d5d5d; + font-size: 14px; + line-height: 18px; + margin-bottom: 10px; } + +.private-key-password-error { + color: #e91550; + margin-bottom: 0; } + +.private-key-password-input { + padding: 10px 0 13px 17px; + font-size: 16px; + line-height: 21px; + width: 291px; + height: 44px; } + +.private-key-password::-webkit-input-placeholder { + color: #9b9b9b; + font-family: Roboto; } + +.private-key-password-warning { + border-radius: 8px; + background-color: #FFF6F6; + font-size: 12px; + font-weight: 500; + line-height: 15px; + color: #e91550; + width: 292px; + padding: 9px 15px; + margin-top: 18px; + font-family: Roboto; } + +.export-private-key-buttons { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; } + .export-private-key-buttons .btn-clear { + width: 141px; + height: 54px; } + .export-private-key-buttons .btn-cancel { + margin-right: 15px; + border-color: #9b9b9b; + color: #5d5d5d; } + +.private-key-password-display-wrapper { + height: 80px; + width: 291px; + border: 1px solid #cdcdcd; + border-radius: 2px; } + +.private-key-password-display-textarea { + color: #e91550; + font-family: Roboto; + font-size: 16px; + line-height: 21px; + border: none; + height: 75px; + width: 100%; + overflow: hidden; + resize: none; + padding: 9px 13px 8px; + text-transform: uppercase; + font-weight: 300; } + +.new-account-modal-wrapper { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + position: relative; + border: 1px solid #dedede; + -webkit-box-shadow: 0 0 2px 2px #dedede; + box-shadow: 0 0 2px 2px #dedede; + font-family: Roboto; } + +.new-account-modal-header { + background: #f6f6f6; + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + padding: 30px; + font-size: 22px; + color: #1b344d; + height: 79px; } + +.modal-close-x::after { + content: '\00D7'; + font-size: 2em; + color: #9b9b9b; + position: absolute; + top: 25px; + right: 17.5px; + font-family: sans-serif; + cursor: pointer; } + +.new-account-modal-content { + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + margin-top: 15px; + font-size: 17px; + color: #1b344d; } + +.new-account-modal-content.after-input { + margin-top: 15px; + line-height: 25px; } + +.new-account-input-wrapper { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + width: 100%; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + padding-bottom: 2px; + margin-top: 13px; } + +.new-account-input { + padding: 15px; + padding-bottom: 20px; + border-radius: 8px; + border: 1px solid #dedede; + width: 100%; + font-size: 1em; + color: #9b9b9b; + font-family: Roboto; + font-size: 17px; + margin: 0 60px; } + +.new-account-input::-webkit-input-placeholder { + color: #9b9b9b; } + +.new-account-input:-moz-placeholder { + color: #9b9b9b; + opacity: 1; } + +.new-account-input::-moz-placeholder { + color: #9b9b9b; + opacity: 1; } + +.new-account-input:-ms-input-placeholder { + color: #9b9b9b; } + +.new-account-input::-ms-input-placeholder { + color: #9b9b9b; } + +.new-account-modal-content.button { + margin-top: 22px; + margin-bottom: 30px; + width: 113px; + height: 44px; } + +.new-account-modal-wrapper .btn-clear { + font-size: 14px; + font-weight: 700; + background: #fff; + border: 1px solid; + border-radius: 2px; + color: #4d4d4d; + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; } + +.hide-token-confirmation { + min-height: 250.72px; + width: 374.49px; + border-radius: 4px; + background-color: #FFFFFF; + -webkit-box-shadow: 0 1px 7px 0 rgba(0, 0, 0, 0.5); + box-shadow: 0 1px 7px 0 rgba(0, 0, 0, 0.5); } + .hide-token-confirmation__container { + padding: 24px 27px 21px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } + .hide-token-confirmation__identicon { + margin-bottom: 10px; } + .hide-token-confirmation__symbol { + color: #4d4d4d; + font-family: Roboto; + font-size: 16px; + line-height: 24px; + text-align: center; + margin-bottom: 7.5px; } + .hide-token-confirmation__title { + height: 30px; + width: 271.28px; + color: #4d4d4d; + font-family: Roboto; + font-size: 22px; + line-height: 30px; + text-align: center; + margin-bottom: 10.5px; } + .hide-token-confirmation__copy { + height: 41px; + width: 318px; + color: #5d5d5d; + font-family: Roboto; + font-size: 14px; + line-height: 18px; + text-align: center; } + .hide-token-confirmation__buttons { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + margin-top: 15px; + width: 100%; } + .hide-token-confirmation__buttons button { + height: 44px; + width: 113px; + border: 1px solid #5d5d5d; + border-radius: 2px; + color: #4d4d4d; + font-family: Roboto; + font-size: 14px; + line-height: 20px; + text-align: center; + margin-left: 4px; + margin-right: 4px; } + +/* + NewUI Container Elements + */ +.main-container { + z-index: 18; + font-family: Roboto; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; } + +.main-container::-webkit-scrollbar { + display: none; } + +.tx-view { + -webkit-box-flex: 63.5; + -ms-flex: 63.5 0 66.5%; + flex: 63.5 0 66.5%; + background: #fff; } + @media screen and (max-width: 575px) { + .tx-view .identicon-wrapper { + display: none; } + .tx-view .account-name { + display: none; } } + +.wallet-view { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-flex: 33.5; + -ms-flex: 33.5 1 33.5%; + flex: 33.5 1 33.5%; + width: 0; + background: #f6f6f6; + z-index: 200; + position: relative; } + @media screen and (min-width: 576px) { + .wallet-view { + overflow-y: scroll; + overflow-x: hidden; } } + .wallet-view .wallet-view-account-details { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + .wallet-view__name-container { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + cursor: pointer; + width: 100%; } + .wallet-view__keyring-label { + height: 40px; + color: #9b9b9b; + font-family: Roboto; + font-size: 10px; + line-height: 40px; + text-align: right; + padding: 0 20px; } + .wallet-view__details-button { + color: #2f9ae0; + font-size: 10px; + line-height: 13px; + text-align: center; + border: 1px solid #2f9ae0; + border-radius: 10.5px; + background-color: transparent; + margin: 0 auto; + padding: 4px 12px; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + .wallet-view__address { + border-radius: 3px; + background-color: #dedede; + color: #5d5d5d; + font-size: 14px; + line-height: 12px; + padding: 4px 12px; + margin: 24px auto; + font-weight: 300; + cursor: pointer; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + @media screen and (max-width: 575px) { + .wallet-view__sidebar-close::after { + content: '\00D7'; + font-size: 40px; + color: #4d4d4d; + position: absolute; + top: 12px; + left: 12px; + cursor: pointer; } } + .wallet-view__add-token-button { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + color: #9b9b9b; + font-size: 14px; + line-height: 19px; + text-align: center; + margin: 36px auto; + border: 1px solid #9b9b9b; + border-radius: 2px; + font-weight: 300; + background: none; + padding: 9px 30px; } + +@media screen and (min-width: 576px) { + .wallet-view::-webkit-scrollbar { + display: none; } } + +.wallet-view-title-wrapper { + -webkit-box-flex: 0; + -ms-flex: 0 0 25px; + flex: 0 0 25px; } + +.wallet-view-title { + margin-left: 15px; + font-size: 16px; } + @media screen and (max-width: 575px) { + .wallet-view-title { + display: none; } } + +.wallet-view.sidebar { + -webkit-box-flex: 1; + -ms-flex: 1 0 230px; + flex: 1 0 230px; + background: #fafafa; + z-index: 26; + position: fixed; + top: 56px; + left: 0; + right: 0; + bottom: 0; + opacity: 1; + visibility: visible; + will-change: transform; + overflow-y: auto; + -webkit-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 4px; + box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 4px; + width: 85%; + height: calc(100% - 56px); } + +.sidebar-overlay { + z-index: 25; + position: fixed; + height: 100%; + width: 100%; + left: 0; + right: 0; + bottom: 0; + opacity: 1; + visibility: visible; + background-color: rgba(0, 0, 0, 0.3); } + +@media screen and (min-width: 576px) { + .lap-visible { + display: -webkit-box; + display: -ms-flexbox; + display: flex; } + .phone-visible { + display: none; } + .main-container { + width: 85%; + height: 90vh; + -webkit-box-shadow: 0 0 7px 0 rgba(0, 0, 0, 0.08); + box-shadow: 0 0 7px 0 rgba(0, 0, 0, 0.08); } } + +@media screen and (min-width: 769px) { + .main-container { + width: 80%; + height: 82vh; + -webkit-box-shadow: 0 0 7px 0 rgba(0, 0, 0, 0.08); + box-shadow: 0 0 7px 0 rgba(0, 0, 0, 0.08); } } + +@media screen and (min-width: 1281px) { + .main-container { + width: 65%; + height: 82vh; + -webkit-box-shadow: 0 0 7px 0 rgba(0, 0, 0, 0.08); + box-shadow: 0 0 7px 0 rgba(0, 0, 0, 0.08); } } + +@media screen and (max-width: 575px) { + .lap-visible { + display: none; } + .phone-visible { + display: -webkit-box; + display: -ms-flexbox; + display: flex; } + .main-container { + height: 100%; + width: 100%; + overflow-y: auto; + background-color: #fff; } + button.btn-clear { + width: 93px; + height: 50px; + font-size: .7em; + background: #fff; + border: 1px solid; } } + +.account-name { + font-size: 24px; + font-weight: 200; + line-height: 20px; + color: #5d5d5d; + margin-top: 8px; + margin-bottom: 24px; + white-space: nowrap; + text-overflow: ellipsis; + overflow: hidden; + width: 100%; + padding: 0 8px; + text-align: center; } + +.account-options-menu { + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + margin: 5% 7% 0%; } + +.fiat-amount { + text-transform: uppercase; } + +.token-balance__amount { + padding-right: 6px; } + +.account-dropdown-name { + font-family: Roboto; } + +.account-dropdown-balance { + color: #9b9b9b; + line-height: 19px; } + +.account-dropdown-edit-button { + color: #9b9b9b; + font-family: Roboto; } + .account-dropdown-edit-button:hover { + color: #fff; } + +.account-list-item__top-row { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + margin-top: 10px; + margin-left: 8px; + position: relative; } + +.account-list-item__account-balances { + height: auto; + border: none; + background-color: transparent; + color: #9b9b9b; + margin-left: 34px; + margin-top: 4px; + position: relative; } + +.account-list-item__account-name { + font-size: 16px; + margin-left: 8px; } + +.account-list-item__icon { + position: absolute; + right: 12px; + top: 1px; } + +.account-list-item__account-primary-balance, .account-list-item__account-secondary-balance { + font-family: Roboto; + line-height: 16px; + font-size: 12px; + font-weight: 300; } + +.account-list-item__account-primary-balance { + color: #5d5d5d; + border: none; + outline: 0 !important; } + +.account-list-item__account-secondary-balance { + color: #9b9b9b; } + +.account-list-item__account-address { + margin-left: 35px; + width: 80%; + overflow: hidden; + text-overflow: ellipsis; } + +.account-list-item__dropdown:hover { + background: rgba(222, 222, 222, 0.2); + cursor: pointer; } + .account-list-item__dropdown:hover input { + background: rgba(222, 222, 222, 0.1); } + +.send-screen-wrapper { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + z-index: 25; + font-family: Roboto; } + @media screen and (max-width: 575px) { + .send-screen-wrapper { + width: 100%; + overflow-y: auto; } } + .send-screen-wrapper section { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + +.send-screen-card { + background-color: #fff; + -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08); + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08); + padding: 46px 40.5px 26px; + position: relative; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + width: 498px; + -webkit-box-flex: 1; + -ms-flex: 1 0 auto; + flex: 1 0 auto; } + @media screen and (max-width: 575px) { + .send-screen-card { + top: 0; + width: 100%; + -webkit-box-shadow: none; + box-shadow: none; + padding: 12px; } } + +/* Send Screen */ +.send-screen section { + margin: 4px 16px; } + +.send-screen input { + width: 100%; + font-size: 12px; } + +.send-eth-icon { + border-radius: 50%; + width: 70px; + height: 70px; + border: 1px solid #dedede; + -webkit-box-shadow: 0 0 4px 0 rgba(0, 0, 0, 0.2); + box-shadow: 0 0 4px 0 rgba(0, 0, 0, 0.2); + position: absolute; + top: -35px; + z-index: 25; + padding: 4px; + background-color: #fff; } + @media screen and (max-width: 575px) { + .send-eth-icon { + position: relative; + top: 0; } } + +.send-screen-input-wrapper { + width: 95%; + position: relative; } + .send-screen-input-wrapper .fa-bolt { + padding-right: 4px; } + .send-screen-input-wrapper .large-input { + border: 1px solid #9b9b9b; + border-radius: 4px; + margin: 4px 0 20px; + font-size: 16px; + line-height: 22.4px; + font-family: Roboto; } + .send-screen-input-wrapper .send-screen-gas-input { + border: 1px solid transparent; } + .send-screen-input-wrapper__error-message { + display: none; } + .send-screen-input-wrapper--error input, + .send-screen-input-wrapper--error .send-screen-gas-input { + border-color: #f00 !important; } + .send-screen-input-wrapper--error .send-screen-input-wrapper__error-message { + display: block; + position: absolute; + bottom: 4px; + font-size: 12px; + line-height: 12px; + left: 8px; + color: #f00; } + .send-screen-input-wrapper .send-screen-input-wrapper__error-message { + display: block; + position: absolute; + bottom: 4px; + font-size: 12px; + line-height: 12px; + left: 8px; + color: #f00; } + +.send-screen-input { + width: 100%; } + +.send-screen-gas-input { + width: 100%; + height: 41px; + border-radius: 3px; + background-color: #f3f3f3; + border-width: 0; + border-style: none; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding-left: 10px; + padding-right: 12px; + font-size: 16px; + color: #5d5d5d; } + +.send-screen-amount-labels { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; } + +.send-screen-gas-labels { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; } + +.currency-toggle__item { + color: #2f9ae0; + cursor: pointer; } + .currency-toggle__item--selected { + color: #000; + cursor: default; } + +.send-screen-gas-input-customize { + color: #2f9ae0; + font-size: 12px; + cursor: pointer; } + +.gas-tooltip-close-area { + position: fixed; + top: 0; + left: 0; + z-index: 1000; + width: 100%; + height: 100%; } + +.customize-gas-tooltip-container { + position: absolute; + bottom: 50px; + width: 237px; + height: 307px; + background-color: #fff; + opacity: 1; + -webkit-box-shadow: #dedede 0 0 5px; + box-shadow: #dedede 0 0 5px; + z-index: 1050; + padding: 13px 19px; + font-size: 16px; + border-radius: 4px; + font-family: "Lato"; + font-weight: 500; } + +.gas-tooltip-arrow { + height: 25px; + width: 25px; + z-index: 1200; + background: #fff; + position: absolute; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + left: 107px; + top: 294px; + -webkit-box-shadow: 2px 2px 2px #dedede; + box-shadow: 2px 2px 2px #dedede; } + +.customize-gas-tooltip-container input[type="number"]::-webkit-inner-spin-button { + -webkit-appearance: none; + display: none; } + +.customize-gas-tooltip-container input[type="number"]:hover::-webkit-inner-spin-button { + -webkit-appearance: none; + display: none; } + +.customize-gas-tooltip { + position: relative; } + +.gas-tooltip { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; } + +.gas-tooltip-label { + font-size: 16px; + color: #4d4d4d; } + +.gas-tooltip-header { + padding-bottom: 12px; } + +.gas-tooltip-input-label { + margin-bottom: 5px; } + +.gas-tooltip-input-label i { + color: #aeaeae; + margin-left: 6px; } + +.customize-gas-input { + width: 178px; + height: 28px; + border: 1px solid #dedede; + font-size: 16px; + color: #1b344d; + padding-left: 8px; } + +.customize-gas-input-wrapper { + position: relative; } + +.gas-tooltip-input-detail { + position: absolute; + top: 4px; + right: 26px; + font-size: 12px; + color: #aeaeae; } + +.gas-tooltip-input-arrows { + position: absolute; + top: 0; + right: 4px; + width: 17px; + height: 28px; + border: 1px solid #dadada; + border-left: 0; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + color: #9b9b9b; + font-size: .8em; + padding: 1px 4px; + cursor: pointer; } + +.token-gas__amount { + display: inline-block; + margin-right: 4px; } + +.token-gas__symbol { + display: inline-block; } + +.send-screen__title { + color: #5d5d5d; + font-size: 18px; + line-height: 29px; } + +.send-screen__subtitle { + margin: 10px 0 20px; + font-size: 14px; + line-height: 24px; } + +.send-screen__send-button, .send-screen__cancel-button { + width: 163px; + text-align: center; } + +.send-screen__send-button__disabled { + opacity: .5; + cursor: auto; } + +.send-token { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + z-index: 25; + font-family: Roboto; } + .send-token__content { + width: 498px; + height: 605px; + background-color: #fff; + -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08); + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08); + padding: 46px 40.5px 26px; + position: relative; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + -webkit-box-flex: 1; + -ms-flex: 1 0 auto; + flex: 1 0 auto; } + @media screen and (max-width: 575px) { + .send-token__content { + top: 0; + width: 100%; + -webkit-box-shadow: none; + box-shadow: none; + padding: 12px; } } + .send-token .identicon { + position: absolute; + top: -35px; + z-index: 25; } + @media screen and (max-width: 575px) { + .send-token .identicon { + position: relative; + top: 0; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } } + .send-token__title { + color: #5d5d5d; + font-size: 18px; + line-height: 29px; } + .send-token__description, .send-token__balance-text, .send-token__token-symbol { + margin-top: 10px; + font-size: 14px; + line-height: 24px; + text-align: center; } + .send-token__token-balance { + font-size: 40px; + line-height: 40px; + margin-top: 13px; } + .send-token__token-balance .token-balance__amount { + padding-right: 12px; } + .send-token__button-group { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + @media screen and (max-width: 575px) { + .send-token__button-group { + margin-top: 24px; } } + .send-token__button-group button { + width: 163px; } + +.confirm-send-token__hero-amount-wrapper { + width: 100%; } + +.send-v2__container { + width: 380px; + border-radius: 8px; + background-color: #fff; + -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08); + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + z-index: 25; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-family: Roboto; + position: relative; } + @media screen and (max-width: 575px) { + .send-v2__container { + width: 100%; + top: 0; + -webkit-box-shadow: none; + box-shadow: none; + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; } } + +.send-v2__send-header-icon-container { + z-index: 25; } + @media screen and (max-width: 575px) { + .send-v2__send-header-icon-container { + position: relative; + top: 0; } } + +.send-v2__send-header-icon { + border-radius: 50%; + width: 48px; + height: 48px; + border: 1px solid #dedede; + z-index: 25; + padding: 4px; + background-color: #fff; } + +.send-v2__send-arrow-icon { + color: #f28930; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + position: absolute; + top: -2px; + left: 0; + font-size: 1.12em; } + +.send-v2__arrow-background { + background-color: #fff; + height: 14px; + width: 14px; + position: absolute; + top: 52px; + left: 199px; + border-radius: 50%; + z-index: 100; } + @media screen and (max-width: 575px) { + .send-v2__arrow-background { + top: 36px; } } + +.send-v2__header { + height: 88px; + width: 380px; + background-color: #e9edf0; + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } + @media screen and (max-width: 575px) { + .send-v2__header { + height: 59px; + width: 100vw; } } + +.send-v2__header-tip { + height: 25px; + width: 25px; + background: #e9edf0; + position: absolute; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + left: 178px; + top: 75px; } + @media screen and (max-width: 575px) { + .send-v2__header-tip { + top: 46px; + left: 0; + right: 0; + margin: 0 auto; } } + +.send-v2__title { + color: #5d5d5d; + font-size: 22px; + line-height: 29px; + text-align: center; + margin-top: 25px; } + +.send-v2__copy { + color: #808080; + font-size: 14px; + font-weight: 300; + line-height: 19px; + text-align: center; + margin-top: 10px; + width: 287px; } + +.send-v2__error { + font-size: 12px; + line-height: 12px; + left: 8px; + color: #f00; } + +.send-v2__error-border { + color: #f00; } + +.send-v2__form { + margin: 13px 0; + width: 100%; } + @media screen and (max-width: 575px) { + .send-v2__form { + padding: 13px 0; + margin: 0; + height: 0; + overflow-y: auto; + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; } } + +.send-v2__form-header, .send-v2__form-header-copy { + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column; + flex-flow: column; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } + +.send-v2__form-row { + margin: 14.5px 18px 0px; + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row; + flex-flow: row; + -webkit-box-flex: 1; + -ms-flex: 1 0 auto; + flex: 1 0 auto; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; } + +.send-v2__form-field { + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; } + +.send-v2__form-label { + color: #5d5d5d; + font-family: Roboto; + font-size: 16px; + line-height: 22px; + width: 88px; } + +.send-v2__from-dropdown { + height: 73px; + width: 100%; + border: 1px solid #dedede; + border-radius: 4px; + background-color: #fff; + font-family: Roboto; + line-height: 16px; + font-size: 12px; + color: #4d4d4d; + position: relative; } + .send-v2__from-dropdown__close-area { + position: fixed; + top: 0; + left: 0; + z-index: 1000; + width: 100%; + height: 100%; } + .send-v2__from-dropdown__list { + z-index: 1050; + position: absolute; + height: 220px; + width: 100%; + border: 1px solid #d2d8dd; + border-radius: 4px; + background-color: #fff; + -webkit-box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.11); + box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.11); + margin-top: 11px; + margin-left: -1px; + overflow-y: scroll; } + +.send-v2__to-autocomplete { + position: relative; } + .send-v2__to-autocomplete__down-caret { + position: absolute; + top: 18px; + right: 12px; } + +.send-v2__to-autocomplete__input, .send-v2__memo-text-area__input { + height: 54px; + width: 100%; + border: 1px solid #dedede; + border-radius: 4px; + background-color: #fff; + color: #9b9b9b; + padding: 10px; + font-family: Roboto; + font-size: 16px; + line-height: 21px; + font-weight: 300; } + +.send-v2__amount-max { + color: #2f9ae0; + font-family: Roboto; + font-size: 12px; + left: 8px; + border: none; + cursor: pointer; } + +.send-v2__gas-fee-display { + width: 100%; } + +.send-v2__sliders-icon-container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + height: 24px; + width: 24px; + border: 1px solid #2f9ae0; + border-radius: 4px; + background-color: #fff; + padding: 5px; + position: absolute; + right: 15px; + top: 14px; + cursor: pointer; } + +.send-v2__sliders-icon { + color: #2f9ae0; } + +.send-v2__memo-text-area__input { + padding: 6px 10px; } + +.send-v2__footer { + height: 92px; + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: space-evenly; + -ms-flex-pack: space-evenly; + justify-content: space-evenly; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + border-top: 1px solid #dedede; + background: #fff; + padding: 0 12px; } + +.send-v2__next-btn, .send-v2__cancel-btn, .send-v2__next-btn__disabled { + width: 163px; + text-align: center; + height: 55px; + border-radius: 2px; + background-color: #fff; + font-family: Roboto; + font-size: 16px; + font-weight: 300; + line-height: 21px; + border: 1px solid; + margin: 0 4px; } + +.send-v2__next-btn, .send-v2__next-btn__disabled { + color: #2f9ae0; + border-color: #2f9ae0; } + +.send-v2__next-btn__disabled { + opacity: .5; + cursor: auto; } + +.send-v2__cancel-btn { + color: #9b9b9b; + border-color: #9b9b9b; } + +.send-v2__customize-gas { + border: 1px solid #D8D8D8; + border-radius: 4px; + background-color: #FFFFFF; + -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.14); + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.14); + font-family: Roboto; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column; + flex-flow: column; } + @media screen and (max-width: 575px) { + .send-v2__customize-gas { + width: 100vw; + height: 100vh; } } + .send-v2__customize-gas__header { + height: 52px; + border-bottom: 1px solid #dedede; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + font-size: 22px; } + @media screen and (max-width: 575px) { + .send-v2__customize-gas__header { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } } + .send-v2__customize-gas__title { + margin-left: 19.25px; } + .send-v2__customize-gas__close::after { + content: '\00D7'; + font-size: 1.8em; + color: #9b9b9b; + font-family: sans-serif; + cursor: pointer; + margin-right: 19.25px; } + .send-v2__customize-gas__content { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + height: 100%; } + .send-v2__customize-gas__body { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + margin-bottom: 24px; } + @media screen and (max-width: 575px) { + .send-v2__customize-gas__body { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column; + flex-flow: column; + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; } } + .send-v2__customize-gas__footer { + height: 75px; + border-top: 1px solid #dedede; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + font-size: 22px; + position: relative; } + @media screen and (max-width: 575px) { + .send-v2__customize-gas__footer { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } } + .send-v2__customize-gas__buttons { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + width: 181.75px; + margin-right: 21.25px; } + .send-v2__customize-gas__revert, .send-v2__customize-gas__cancel, .send-v2__customize-gas__save, .send-v2__customize-gas__save__error { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + cursor: pointer; } + .send-v2__customize-gas__revert { + color: #aeaeae; + font-size: 16px; + margin-left: 21.25px; } + .send-v2__customize-gas__cancel, .send-v2__customize-gas__save, .send-v2__customize-gas__save__error { + height: 34.64px; + width: 85.74px; + border: 1px solid #9b9b9b; + border-radius: 2px; + font-family: 'DIN OT'; + font-size: 12px; + color: #9b9b9b; } + .send-v2__customize-gas__save__error { + opacity: 0.5; + cursor: auto; } + .send-v2__customize-gas__error-message { + display: block; + position: absolute; + top: 4px; + right: 4px; + font-size: 12px; + line-height: 12px; + color: #f00; } + +.send-v2__gas-modal-card { + width: 360px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column; + flex-flow: column; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; + padding-left: 20px; } + .send-v2__gas-modal-card__title { + height: 26px; + color: #4d4d4d; + font-family: Roboto; + font-size: 20px; + font-weight: 300; + line-height: 26px; + margin-top: 17px; } + .send-v2__gas-modal-card__copy { + height: 38px; + width: 314px; + color: #4d4d4d; + font-family: Roboto; + font-size: 14px; + line-height: 19px; + margin-top: 17px; } + .send-v2__gas-modal-card .customize-gas-input-wrapper { + margin-top: 17px; } + .send-v2__gas-modal-card .customize-gas-input { + height: 54px; + width: 315px; + border: 1px solid #d2d8dd; + background-color: #fff; + padding-left: 15px; } + .send-v2__gas-modal-card .gas-tooltip-input-arrows { + width: 32px; + height: 54px; + border-left: 1px solid #dadada; + font-size: 18px; + color: #4d4d4d; + right: 0px; + padding: 1px 4px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-pack: distribute; + justify-content: space-around; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } + .send-v2__gas-modal-card input[type="number"]::-webkit-inner-spin-button { + -webkit-appearance: none; + display: none; } + .send-v2__gas-modal-card input[type="number"]:hover::-webkit-inner-spin-button { + -webkit-appearance: none; + display: none; } + +.confirm-screen-container { + position: relative; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-family: Roboto; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08); + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08); + border-radius: 8px; } + @media screen and (max-width: 575px) { + .confirm-screen-container { + width: 100%; } } + +@media screen and (max-width: 575px) { + .notification .confirm-screen-wrapper { + height: calc(100vh - 85px); } } + +.confirm-screen-wrapper { + height: 100%; + width: 380px; + background-color: #fff; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + z-index: 25; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-family: Roboto; + position: relative; + overflow-y: auto; + overflow-x: hidden; + border-top-left-radius: 8px; + border-top-right-radius: 8px; } + @media screen and (max-width: 575px) { + .confirm-screen-wrapper { + width: 100%; + overflow-x: hidden; + overflow-y: auto; + top: 0; + -webkit-box-shadow: none; + box-shadow: none; + height: calc(100vh - 58px - 85px); + border-top-left-radius: 0; + border-top-right-radius: 0; } } + +.confirm-screen-wrapper > .confirm-screen-total-box { + margin-left: 10px; + margin-right: 10px; } + +.confirm-screen-wrapper > .confirm-memo-wrapper { + margin: 0; } + +.confirm-screen-header { + height: 88px; + background-color: #e9edf0; + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-size: 22px; + line-height: 29px; + width: 100%; + padding: 25px 0; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + @media screen and (max-width: 575px) { + .confirm-screen-header { + font-size: 20px; } } + +.confirm-screen-header-tip { + height: 25px; + width: 25px; + background: #e9edf0; + position: absolute; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + top: 71px; + left: 0; + right: 0; + margin: 0 auto; } + +.confirm-screen-title { + line-height: 27px; } + @media screen and (max-width: 575px) { + .confirm-screen-title { + margin-left: 22px; + margin-right: 8px; } } + +.confirm-screen-back-button { + background: transparent; + border: 1px solid #2f9ae0; + left: 24px; + position: absolute; + text-align: center; + color: #2f9ae0; + padding: 6px 13px 7px 12px; + border-radius: 2px; + height: 30px; + width: 54px; } + @media screen and (max-width: 575px) { + .confirm-screen-back-button { + margin-right: 12px; } } + +.confirm-screen-account-wrapper { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } + +.confirm-screen-account-name { + margin-top: 12px; + font-size: 14px; + line-height: 19px; + color: #5d5d5d; + text-align: center; } + +.confirm-screen-row-info { + font-size: 16px; + line-height: 21px; } + +.confirm-screen-account-number { + font-size: 10px; + line-height: 16px; + color: #9b9b9b; + text-align: center; + height: 16px; } + +.confirm-send-ether i.fa-arrow-right, +.confirm-send-token i.fa-arrow-right { + -ms-flex-item-align: start; + align-self: start; + margin: 24px 14px 0 !important; } + +.confirm-screen-identicons { + margin-top: 24px; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + .confirm-screen-identicons i.fa-arrow-right { + -ms-flex-item-align: start; + align-self: start; + margin: 42px 14px 0; } + .confirm-screen-identicons i.fa-file-text-o { + font-size: 60px; + margin: 16px 8px 0 8px; + text-align: center; } + +.confirm-screen-sending-to-message { + text-align: center; + font-size: 16px; + margin-top: 30px; + font-family: 'DIN NEXT Light'; } + +.confirm-screen-send-amount { + color: #5d5d5d; + margin-top: 12px; + text-align: center; + font-size: 40px; + font-weight: 300; + line-height: 53px; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + +.confirm-screen-send-amount-currency { + font-size: 20px; + line-height: 20px; + text-align: center; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + +.confirm-memo-wrapper { + min-height: 24px; + width: 100%; + border-bottom: 1px solid #dedede; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + +.confirm-screen-send-memo { + color: #5d5d5d; + font-size: 16px; + line-height: 19px; + font-weight: 400; } + +.confirm-screen-label { + font-size: 18px; + line-height: 40px; + color: #5d5d5d; + text-align: left; } + +section .confirm-screen-account-name, +section .confirm-screen-account-number, +.confirm-screen-row-info, +.confirm-screen-row-detail { + text-align: left; } + +.confirm-screen-rows { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + width: 100%; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + +.confirm-screen-section-column { + -webkit-box-flex: .5; + -ms-flex: .5; + flex: .5; } + +.confirm-screen-row { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + border-bottom: 1px solid #dedede; + width: 100%; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding: 12px; + padding-left: 35px; + font-size: 16px; + line-height: 22px; + font-weight: 300; } + +.confirm-screen-row-detail { + font-size: 12px; + line-height: 16px; + color: #9b9b9b; } + +.confirm-screen-total-box { + background-color: #f6f6f6; + padding: 20px; + padding-left: 35px; + border-bottom: 1px solid #dedede; } + .confirm-screen-total-box .confirm-screen-label { + line-height: 18px; } + .confirm-screen-total-box .confirm-screen-row-detail { + color: #5d5d5d; } + .confirm-screen-total-box__subtitle { + font-size: 12px; + line-height: 22px; } + .confirm-screen-total-box .confirm-screen-row-info { + font-size: 16px; + font-weight: 500; + line-height: 21px; } + +.confirm-screen-confirm-button { + height: 62px; + border-radius: 2px; + background-color: #02c9b1; + font-size: 16px; + color: #fff; + text-align: center; + font-family: Roboto; + padding-top: 15px; + padding-bottom: 15px; + border-width: 0; + -webkit-box-shadow: none; + box-shadow: none; + -webkit-box-flex: 1; + -ms-flex: 1 0 auto; + flex: 1 0 auto; + font-weight: 300; + margin: 0 8px; } + +.btn-light.confirm-screen-cancel-button { + height: 62px; + background: none; + border: none; + opacity: 1; + font-family: Roboto; + border-width: 0; + padding-top: 15px; + padding-bottom: 15px; + font-size: 16px; + line-height: 32px; + -webkit-box-shadow: none; + box-shadow: none; + cursor: pointer; + -webkit-box-flex: 1; + -ms-flex: 1 0 auto; + flex: 1 0 auto; + font-weight: 300; + margin: 0 8px; } + +#pending-tx-form { + -webkit-box-flex: 1; + -ms-flex: 1 0 auto; + flex: 1 0 auto; + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + background-color: #fff; + padding: 12px 18px; + border-bottom-left-radius: 8px; + border-bottom-right-radius: 8px; + width: 100%; } + @media screen and (max-width: 575px) { + #pending-tx-form { + border-top: 1px solid #dedede; + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; } } + +.loading-overlay { + left: 0px; + z-index: 50; + position: absolute; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + width: 100%; + background: rgba(255, 255, 255, 0.8); } + @media screen and (max-width: 575px) { + .loading-overlay { + margin-top: 56px; + height: calc(100% - 56px); } } + @media screen and (min-width: 576px) { + .loading-overlay { + margin-top: 75px; + height: calc(100% - 75px); } } + +@media screen and (max-width: 575px) { + .hero-balance { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + margin: .3em .9em 0; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } } + +@media screen and (min-width: 576px) { + .hero-balance { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + margin: 2.8em 2.37em .8em; } } + +.hero-balance .balance-container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + margin: 0; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } + @media screen and (max-width: 575px) { + .hero-balance .balance-container { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } } + @media screen and (min-width: 576px) { + .hero-balance .balance-container { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-flex: 3; + -ms-flex-positive: 3; + flex-grow: 3; } } + +@media screen and (max-width: 575px) { + .hero-balance .balance-display { + text-align: center; } + .hero-balance .balance-display .token-amount { + font-size: 175%; + margin-top: 12.5%; } + .hero-balance .balance-display .fiat-amount { + font-size: 115%; + margin-top: 8.5%; + color: #a0a0a0; } } + +@media screen and (min-width: 576px) { + .hero-balance .balance-display { + margin-left: 3%; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; } + .hero-balance .balance-display .token-amount { + font-size: 135%; } + .hero-balance .balance-display .fiat-amount { + margin-top: .25%; + font-size: 105%; } } + +.hero-balance .balance-icon { + border-radius: 25px; + width: 45px; + height: 45px; + border: 1px solid #dedede; } + +@media screen and (max-width: 575px) { + .hero-balance .hero-balance-buttons { + width: 100%; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + padding: 16px 0; } } + +@media screen and (min-width: 576px) { + .hero-balance .hero-balance-buttons { + -webkit-box-flex: 2; + -ms-flex-positive: 2; + flex-grow: 2; + -webkit-box-pack: end; + -ms-flex-pack: end; + justify-content: flex-end; } } + +.hero-balance .hero-balance-buttons button.btn-clear { + background: #fff; + border: 1px solid; + border-radius: 2px; + font-size: 12px; } + @media screen and (max-width: 575px) { + .hero-balance .hero-balance-buttons button.btn-clear { + border-color: #2f9ae0; + color: #2f9ae0; + height: 36px; } } + @media screen and (min-width: 576px) { + .hero-balance .hero-balance-buttons button.btn-clear { + border-color: #2f9ae0; + color: #2f9ae0; + padding: 0; + width: 85px; + height: 34px; } } + +.wallet-balance-wrapper { + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + -webkit-transition: linear 200ms; + transition: linear 200ms; + background: rgba(231, 231, 231, 0); } + .wallet-balance-wrapper--active { + background: #e7e7e7; } + +.wallet-balance { + background: inherit; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + cursor: pointer; + border-top: 1px solid #e7e7e7; } + .wallet-balance .balance-container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + margin: 20px 24px; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-flex: 3; + -ms-flex-positive: 3; + flex-grow: 3; } + @media screen and (min-width: 576px) and (max-width: 890px) { + .wallet-balance .balance-container { + margin: 10% 4%; } } + .wallet-balance .balance-display { + margin-left: 15px; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; } + .wallet-balance .balance-display .token-amount { + font-size: 135%; } + .wallet-balance .balance-display .fiat-amount { + margin-top: .25%; + font-size: 105%; } + @media screen and (min-width: 576px) and (max-width: 890px) { + .wallet-balance .balance-display { + margin-left: 4%; } + .wallet-balance .balance-display .token-amount { + font-size: 105%; } + .wallet-balance .balance-display .fiat-amount { + font-size: 95%; } } + .wallet-balance .balance-icon { + border-radius: 25px; + width: 45px; + height: 45px; + border: 1px solid #dedede; } + +.tx-list-container { + height: 87.5%; } + @media screen and (min-width: 576px) { + .tx-list-container { + overflow-y: scroll; } } + +.tx-list-header { + text-transform: capitalize; } + +@media screen and (max-width: 575px) { + .tx-list-header-wrapper { + margin-top: .2em; + margin-bottom: .6em; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + .tx-list-header { + -ms-flex-item-align: center; + align-self: center; + font-size: 12px; + color: #9b9b9b; + font-family: Roboto; + text-transform: uppercase; } } + +@media screen and (min-width: 576px) { + .tx-list-header-wrapper { + -webkit-box-flex: 0; + -ms-flex: 0 0 55px; + flex: 0 0 55px; } + .tx-list-header { + font-size: 16px; + margin: 1.5em 2.37em; } + .tx-list-container::-webkit-scrollbar { + display: none; } } + +.tx-list-content-divider { + height: 1px; + background: #e7e7e7; + -webkit-box-flex: 0; + -ms-flex: 0 0 1px; + flex: 0 0 1px; } + @media screen and (max-width: 575px) { + .tx-list-content-divider { + margin: .1em 0; } } + @media screen and (min-width: 576px) { + .tx-list-content-divider { + margin: .1em 2.37em; } } + +.tx-list-item-wrapper { + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + width: 0; + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; } + @media screen and (max-width: 575px) { + .tx-list-item-wrapper { + padding: 0 1.3em .8em; } } + @media screen and (min-width: 576px) { + .tx-list-item-wrapper { + padding-bottom: 12px; } } + +.tx-list-clickable { + cursor: pointer; } + .tx-list-clickable:hover { + background: rgba(222, 222, 222, 0.2); } + +.tx-list-pending-item-container { + cursor: pointer; + opacity: .5; } + +.tx-list-date-wrapper { + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; } + @media screen and (max-width: 575px) { + .tx-list-date-wrapper { + margin-top: 6px; } } + @media screen and (min-width: 576px) { + .tx-list-date-wrapper { + margin-top: 12px; } } + +.tx-list-content-wrapper { + -webkit-box-align: stretch; + -ms-flex-align: stretch; + align-items: stretch; + margin-bottom: 4px; + margin-top: 2px; + -webkit-box-flex: 1; + -ms-flex: 1 0 auto; + flex: 1 0 auto; + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; } + @media screen and (max-width: 575px) { + .tx-list-content-wrapper { + font-size: 12px; } + .tx-list-content-wrapper .tx-list-status { + font-size: 14px !important; } + .tx-list-content-wrapper .tx-list-account { + font-size: 14px !important; } + .tx-list-content-wrapper .tx-list-value { + font-size: 14px; + line-height: 18px; } + .tx-list-content-wrapper .tx-list-fiat-value { + font-size: 12px; + line-height: 16px; } } + +.tx-list-date { + color: #9b9b9b; + font-size: 12px; + font-family: Roboto; } + +.tx-list-identicon-wrapper { + -ms-flex-item-align: center; + align-self: center; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + margin-right: 16px; } + +.tx-list-account-and-status-wrapper { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row wrap; + flex-flow: row wrap; + width: 0; } + @media screen and (max-width: 575px) { + .tx-list-account-and-status-wrapper { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; + -ms-flex-item-align: center; + align-self: center; } + .tx-list-account-and-status-wrapper .tx-list-account-wrapper { + height: 18px; } + .tx-list-account-and-status-wrapper .tx-list-account-wrapper .tx-list-account { + line-height: 14px; } } + @media screen and (min-width: 576px) { + .tx-list-account-and-status-wrapper { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } + .tx-list-account-and-status-wrapper .tx-list-account-wrapper { + -webkit-box-flex: 1.3; + -ms-flex: 1.3 2 auto; + flex: 1.3 2 auto; + min-width: 153px; } + .tx-list-account-and-status-wrapper .tx-list-status-wrapper { + -webkit-box-flex: 6; + -ms-flex: 6 6 auto; + flex: 6 6 auto; } } + .tx-list-account-and-status-wrapper .tx-list-account { + font-size: 16px; + color: #5d5d5d; } + .tx-list-account-and-status-wrapper .tx-list-status { + color: #9b9b9b; + font-size: 16px; + text-transform: capitalize; } + .tx-list-account-and-status-wrapper .tx-list-status--rejected, + .tx-list-account-and-status-wrapper .tx-list-status--failed { + color: #d0021b; } + +.tx-list-item { + border-top: 1px solid #e7e7e7; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; } + @media screen and (min-width: 576px) { + .tx-list-item { + margin: 0 2.37em; } } + .tx-list-item:last-of-type { + border-bottom: 1px solid #e7e7e7; + margin-bottom: 32px; } + .tx-list-item__wrapper { + -ms-flex-item-align: center; + align-self: center; + -webkit-box-flex: 2; + -ms-flex: 2 2 auto; + flex: 2 2 auto; + color: #9b9b9b; } + .tx-list-item__wrapper .tx-list-value { + font-size: 16px; + text-align: right; } + .tx-list-item__wrapper .tx-list-value--confirmed { + color: #02c9b1; } + .tx-list-item__wrapper .tx-list-fiat-value { + font-size: 12px; + text-align: right; } + .tx-list-item--empty { + text-align: center; + border-bottom: none !important; + padding: 16px; } + +.tx-list-details-wrapper { + overflow: hidden; + -webkit-box-flex: 0; + -ms-flex: 0 0 35%; + flex: 0 0 35%; } + +.tx-list-value { + font-size: 16px; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; } + +.tx-list-fiat-value { + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden; } + +.tx-list-value--confirmed { + color: #02c9b1; } + +/* stylelint-disable */ +/* +App Sections + TODO: Move into separate files. +*/ +/* initialize */ +textarea.twelve-word-phrase { + padding: 12px; + width: 300px; + height: 140px; + font-size: 16px; + background: #fff; + resize: none; } + +.initialize-screen hr { + width: 60px; + margin: 12px; + border-color: #f7861c; + border-style: solid; } + +.initialize-screen label { + margin-top: 20px; } + +.initialize-screen button.create-vault { + margin-top: 40px; } + +.initialize-screen .warning { + font-size: 14px; + margin: 0 16px; } + +/* unlock */ +.error { + color: #f7861c; + margin-bottom: 9px; } + +.warning { + color: #ffae00; } + +.lock { + width: 50px; + height: 50px; } + +.lock.locked { + -webkit-transform: scale(1.5); + transform: scale(1.5); + opacity: 0; + -webkit-transition: opacity 400ms ease-in, -webkit-transform 400ms ease-in; + transition: opacity 400ms ease-in, -webkit-transform 400ms ease-in; + transition: opacity 400ms ease-in, transform 400ms ease-in; + transition: opacity 400ms ease-in, transform 400ms ease-in, -webkit-transform 400ms ease-in; } + +.lock.unlocked { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 1; + -webkit-transition: opacity 500ms ease-out, background 200ms ease-in, -webkit-transform 500ms ease-out; + transition: opacity 500ms ease-out, background 200ms ease-in, -webkit-transform 500ms ease-out; + transition: opacity 500ms ease-out, transform 500ms ease-out, background 200ms ease-in; + transition: opacity 500ms ease-out, transform 500ms ease-out, background 200ms ease-in, -webkit-transform 500ms ease-out; } + +.lock.locked .lock-top { + -webkit-transform: scaleX(1) translateX(0); + transform: scaleX(1) translateX(0); + -webkit-transition: -webkit-transform 250ms ease-in; + transition: -webkit-transform 250ms ease-in; + transition: transform 250ms ease-in; + transition: transform 250ms ease-in, -webkit-transform 250ms ease-in; } + +.lock.unlocked .lock-top { + -webkit-transform: scaleX(-1) translateX(-12px); + transform: scaleX(-1) translateX(-12px); + -webkit-transition: -webkit-transform 250ms ease-in; + transition: -webkit-transform 250ms ease-in; + transition: transform 250ms ease-in; + transition: transform 250ms ease-in, -webkit-transform 250ms ease-in; } + +.lock.unlocked:hover { + border-radius: 4px; + background: #e5e5e5; + border: 1px solid #b1b1b1; } + +.lock.unlocked:active { + background: #c3c3c3; } + +.section-title .fa-arrow-left { + margin: -2px 8px 0px -8px; } + +.unlock-screen #metamask-mascot-container { + margin-top: 24px; } + +.unlock-screen h1 { + margin-top: -28px; + margin-bottom: 42px; } + +.unlock-screen input[type=password] { + width: 260px; } + +.sizing-input { + font-size: 14px; + height: 30px; + padding-left: 5px; } + +.editable-label { + display: -webkit-box; + display: -ms-flexbox; + display: flex; } + +/* Webkit */ +.unlock-screen input::-webkit-input-placeholder { + text-align: center; + font-size: 1.2em; } + +/* Firefox 18- */ +.unlock-screen input:-moz-placeholder { + text-align: center; + font-size: 1.2em; } + +/* Firefox 19+ */ +.unlock-screen input::-moz-placeholder { + text-align: center; + font-size: 1.2em; } + +/* IE */ +.unlock-screen input:-ms-input-placeholder { + text-align: center; + font-size: 1.2em; } + +/* accounts */ +.accounts-section { + margin: 0 0px; } + +.accounts-section .horizontal-line { + margin: 0 18px; } + +.accounts-list-option { + height: 120px; } + +.accounts-list-option .identicon-wrapper { + width: 100px; } + +.unconftx-link { + margin-top: 24px; + cursor: pointer; } + +.unconftx-link .fa-arrow-right { + margin: 0 -8px 0px 8px; } + +/* identity panel */ +.identity-panel { + font-weight: 500; } + +.identity-panel .identicon-wrapper { + margin: 4px; + margin-top: 8px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } + +.identity-panel .identicon-wrapper span { + margin: 0 auto; } + +.identity-panel .identity-data { + margin: 8px 8px 8px 18px; } + +.identity-panel i { + margin-top: 32px; + margin-right: 6px; + color: #b9b9b9; } + +.identity-panel .arrow-right { + padding-left: 18px; + width: 42px; + min-width: 18px; + height: 100%; } + +.identity-copy.flex-column { + -webkit-box-flex: .25; + -ms-flex: .25 0 auto; + flex: .25 0 auto; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; } + +/* accounts screen */ +.identity-section .identity-panel { + background: #e9e9e9; + border-bottom: 1px solid #b1b1b1; + cursor: pointer; } + +.identity-section .identity-panel.selected { + background: #fff; + color: #f3c83e; } + +.identity-section .identity-panel.selected .identicon { + border-color: #ffa500; } + +.identity-section .accounts-list-option:hover, +.identity-section .accounts-list-option.selected { + background: #fff; } + +/* account detail screen */ +.account-detail-section { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -ms-flex-wrap: wrap; + flex-wrap: wrap; + overflow-y: auto; + -webkit-box-orient: inherit; + -webkit-box-direction: inherit; + -ms-flex-direction: inherit; + flex-direction: inherit; } + +.grow-tenx { + -webkit-box-flex: 10; + -ms-flex-positive: 10; + flex-grow: 10; } + +.unapproved-tx-icon { + height: 16px; + width: 16px; + background: #2faef4; + border-color: #aeaeae; + border-radius: 13px; } + +.edit-text { + height: 100%; + visibility: hidden; } + +.editing-label { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + margin-left: 50px; + margin-bottom: 2px; + font-size: 11px; + text-rendering: geometricPrecision; + color: #f7861c; } + +.name-label:hover .edit-text { + visibility: visible; } + +/* tx confirm */ +.unconftx-section input[type=password] { + height: 22px; + padding: 2px; + margin: 12px; + margin-bottom: 24px; + border-radius: 4px; + border: 2px solid #f3c83e; + background: #faf6f0; } + +/* Ether Balance Widget */ +.ether-balance-amount { + color: #f7861c; } + +.ether-balance-label { + color: #aba9aa; } + +/* Info screen */ +.info-gray { + font-family: Roboto; + text-transform: uppercase; + color: #aeaeae; } + +.icon-size { + width: 20px; } + +.info { + font-family: Roboto, Arial; + padding-bottom: 10px; + display: inline-block; + padding-left: 5px; } + +/* buy eth warning screen */ +.custom-radios { + -ms-flex-pack: distribute; + justify-content: space-around; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } + +.custom-radio-selected { + width: 17px; + height: 17px; + border: solid; + border-style: double; + border-radius: 15px; + border-width: 5px; + background: #f7861c; + border-color: #f7f7f7; } + +.custom-radio-inactive { + width: 14px; + height: 14px; + border: solid; + border-width: 1px; + border-radius: 24px; + border-color: #aeaeae; } + +.radio-titles { + color: #f7861c; } + +.eth-warning { + -webkit-transition: opacity 400ms ease-in, -webkit-transform 400ms ease-in; + transition: opacity 400ms ease-in, -webkit-transform 400ms ease-in; + transition: opacity 400ms ease-in, transform 400ms ease-in; + transition: opacity 400ms ease-in, transform 400ms ease-in, -webkit-transform 400ms ease-in; } + +.buy-subview { + -webkit-transition: opacity 400ms ease-in, -webkit-transform 400ms ease-in; + transition: opacity 400ms ease-in, -webkit-transform 400ms ease-in; + transition: opacity 400ms ease-in, transform 400ms ease-in; + transition: opacity 400ms ease-in, transform 400ms ease-in, -webkit-transform 400ms ease-in; } + +.input-container:hover .edit-text { + visibility: visible; } + +.buy-inputs { + font-family: Roboto; + font-size: 13px; + height: 20px; + background: transparent; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border: solid; + border-color: transparent; + border-width: .5px; + border-radius: 2px; } + +.input-container:hover .buy-inputs { + -webkit-box-sizing: inherit; + box-sizing: inherit; + border: solid; + border-color: #f7861c; + border-width: .5px; + border-radius: 2px; } + +.buy-inputs:focus { + border: solid; + border-color: #f7861c; + border-width: .5px; + border-radius: 2px; } + +.activeForm { + background: #f7f7f7; + border: none; + border-radius: 8px 8px 0px 0px; + width: 50%; + text-align: center; + padding-bottom: 4px; } + +.inactiveForm { + border: none; + border-radius: 8px 8px 0px 0px; + width: 50%; + text-align: center; + padding-bottom: 4px; } + +.ex-coins { + font-family: Roboto; + text-transform: uppercase; + text-align: center; + font-size: 33px; + width: 118px; + height: 42px; + padding: 1px; + color: #4d4d4d; } + +.marketinfo { + font-family: Roboto; + color: #aeaeae; + font-size: 15px; + line-height: 17px; } + +#fromCoin::-webkit-calendar-picker-indicator { + display: none; } + +#coinList { + width: 400px; + height: 500px; + overflow: scroll; } + +.icon-control .fa-refresh { + visibility: hidden; } + +.icon-control:hover .fa-refresh { + visibility: visible; } + +.icon-control:hover .fa-chevron-right { + visibility: hidden; } + +.inactive { + color: #aeaeae; } + +.inactive button { + background: #aeaeae; + color: #fff; } + +.qr-ellip-address, .ellip-address { + overflow: hidden; + text-overflow: ellipsis; } + +.qr-header { + font-size: 25px; + margin-top: 40px; } + +.qr-message { + font-size: 12px; + color: #f7861c; } + +div.message-container > div:first-child { + margin-top: 18px; + font-size: 15px; + color: #4d4d4d; } + +.pop-hover:hover { + -webkit-transform: scale(1.1); + transform: scale(1.1); } + +/* stylelint-enable */ +.token-list-item { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding: 20px 24px; + cursor: pointer; + -webkit-transition: linear 200ms; + transition: linear 200ms; + background-color: rgba(231, 231, 231, 0); + position: relative; } + .token-list-item__token-balance { + font-size: 130%; } + @media screen and (min-width: 576px) and (max-width: 890px) { + .token-list-item__token-balance { + font-size: 105%; } } + .token-list-item__fiat-amount { + margin-top: .25%; + font-size: 105%; + text-transform: uppercase; } + @media screen and (min-width: 576px) and (max-width: 890px) { + .token-list-item__fiat-amount { + font-size: 95%; } } + @media screen and (min-width: 576px) and (max-width: 890px) { + .token-list-item { + padding: 10% 4%; } } + .token-list-item--active { + background-color: #e7e7e7; } + .token-list-item__identicon { + margin-right: 15px; + border: '1px solid #dedede'; } + @media screen and (min-width: 576px) and (max-width: 890px) { + .token-list-item__identicon { + margin-right: 4%; } } + .token-list-item__ellipsis { + line-height: 45px; } + .token-list-item__balance-wrapper { + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; } + +.token-menu-dropdown { + height: 55px; + width: 191px; + border-radius: 4px; + background-color: rgba(0, 0, 0, 0.82); + -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.5); + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.5); + position: fixed; + margin-top: 20px; + margin-left: 105px; + z-index: 2000; } + .token-menu-dropdown__close-area { + position: fixed; + top: 0; + left: 0; + z-index: 2100; + width: 100%; + height: 100%; + cursor: default; } + .token-menu-dropdown__container { + padding: 16px 34px 32px; + z-index: 2200; + position: relative; } + .token-menu-dropdown__options { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; } + .token-menu-dropdown__option { + color: #fff; + font-family: Roboto; + font-size: 16px; + line-height: 21px; + text-align: center; } + +.add-token { + width: 498px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + position: relative; + z-index: 12; + font-family: 'DIN Next Light'; } + .add-token__wrapper { + background-color: #fff; + -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08); + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + .add-token__title-container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding: 30px 60px 12px; + border-bottom: 1px solid #efefef; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + .add-token__title { + color: #5d5d5d; + font-size: 20px; + line-height: 26px; + text-align: center; + font-weight: 600; + margin-bottom: 12px; } + .add-token__description { + text-align: center; } + .add-token__description + .add-token__description { + margin-top: 24px; } + .add-token__confirmation-description { + margin: 12px 0; } + .add-token__content-container { + width: 100%; + border-bottom: 1px solid #efefef; } + .add-token__input-container { + padding: 11px 0; + width: 263px; + margin: 0 auto; + position: relative; } + .add-token__search-input-error-message { + position: absolute; + bottom: -10px; + font-size: 12px; + width: 100%; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + color: #f00; } + .add-token__input { + width: 100%; + border: 2px solid #efefef; + border-radius: 4px; + padding: 5px 15px; + font-size: 14px; + line-height: 19px; } + .add-token__input::-webkit-input-placeholder { + color: #cdcdcd; } + .add-token__input:-ms-input-placeholder { + color: #cdcdcd; } + .add-token__input::-ms-input-placeholder { + color: #cdcdcd; } + .add-token__input::placeholder { + color: #cdcdcd; } + .add-token__footers { + width: 100%; } + .add-token__add-custom { + color: #5d5d5d; + font-size: 18px; + line-height: 24px; + text-align: center; + padding: 12px 0; + font-weight: 600; + cursor: pointer; } + .add-token__add-custom:hover { + background-color: rgba(0, 0, 0, 0.05); } + .add-token__add-custom:active { + background-color: rgba(0, 0, 0, 0.1); } + .add-token__add-custom .fa { + position: absolute; + right: 24px; + font-size: 24px; + line-height: 24px; } + .add-token__add-custom-form { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + margin: 8px 0 51px; } + .add-token__add-custom-field { + width: 290px; + margin: 0 auto; + position: relative; } + .add-token__add-custom-field--error .add-token__add-custom-input { + border-color: #f00; } + .add-token__add-custom-error-message { + position: absolute; + bottom: -21px; + font-size: 12px; + width: 100%; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + color: #f00; } + .add-token__add-custom-label { + font-size: 16px; + line-height: 21px; + margin-bottom: 8px; } + .add-token__add-custom-input { + width: 100%; + border: 1px solid #cdcdcd; + padding: 5px 15px; + font-size: 14px; + line-height: 19px; } + .add-token__add-custom-input::-webkit-input-placeholder { + color: #cdcdcd; } + .add-token__add-custom-input:-ms-input-placeholder { + color: #cdcdcd; } + .add-token__add-custom-input::-ms-input-placeholder { + color: #cdcdcd; } + .add-token__add-custom-input::placeholder { + color: #cdcdcd; } + .add-token__add-custom-field + .add-token__add-custom-field { + margin-top: 21px; } + .add-token__buttons { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + margin: 30px 0 51px; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + .add-token__token-icons-container { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row wrap; + flex-flow: row wrap; } + .add-token__token-wrapper { + -webkit-transition: 200ms ease-in-out; + transition: 200ms ease-in-out; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -webkit-box-flex: 0; + -ms-flex: 0 0 42.5%; + flex: 0 0 42.5%; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + padding: 12px; + margin: 2.5%; + -webkit-box-sizing: border-box; + box-sizing: border-box; + border-radius: 10px; + cursor: pointer; + border: 2px solid transparent; + position: relative; } + .add-token__token-wrapper:hover { + border: 2px solid rgba(122, 201, 253, 0.5); } + .add-token__token-wrapper--selected { + border: 2px solid #7ac9fd !important; } + .add-token__token-wrapper--disabled { + opacity: .4; + pointer-events: none; } + .add-token__token-data { + -ms-flex-item-align: start; + align-self: flex-start; } + .add-token__token-name { + font-size: 14px; + line-height: 19px; } + .add-token__token-symbol { + font-size: 22px; + line-height: 29px; + font-weight: 600; } + .add-token__token-icon { + width: 60px; + height: 60px; + background-repeat: no-repeat; + background-size: contain; + background-position: center; + border-radius: 50%; + background-color: #fff; + -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.24); + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.24); + margin-right: 12px; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + .add-token__token-message { + position: absolute; + color: #02c9b1; + font-size: 11px; + bottom: 0; + left: 85px; } + .add-token__confirmation-token-list { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; } + .add-token__confirmation-token-list .token-balance { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -webkit-box-align: start; + -ms-flex-align: start; + align-items: flex-start; } + .add-token__confirmation-token-list .token-balance__amount { + color: #5d5d5d; + font-size: 43px; + font-weight: 300; + line-height: 43px; + margin-right: 8px; } + .add-token__confirmation-token-list .token-balance__symbol { + color: #5d5d5d; + font-size: 16px; + line-height: 24px; } + .add-token__confirmation-title { + padding: 30px 120px 12px; } + @media screen and (max-width: 575px) { + .add-token__confirmation-title { + padding: 20px 0; + width: 100%; } } + .add-token__confirmation-content { + padding-bottom: 60px; } + .add-token__confirmation-token-list-item { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + margin: 0 auto; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } + .add-token__confirmation-token-list-item + .add-token__confirmation-token-list-item { + margin-top: 30px; } + .add-token__confirmation-token-icon { + margin-right: 18px; } + @media screen and (max-width: 575px) { + .add-token { + top: 0; + width: 100%; + overflow: hidden; + height: 100%; } + .add-token__wrapper { + -webkit-box-shadow: none !important; + box-shadow: none !important; + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + width: 100%; + overflow-y: auto; } + .add-token__footers { + border-bottom: 1px solid #efefef; } + .add-token__token-icon { + width: 50px; + height: 50px; } + .add-token__token-symbol { + font-size: 18px; + line-height: 24px; } + .add-token__token-name { + font-size: 12px; + line-height: 16px; } + .add-token__buttons { + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + width: 100%; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + padding: 12px 0; + margin: 0; + border-top: 1px solid #efefef; } + .add-token__buttons button { + -webkit-box-flex: 1; + -ms-flex: 1 0 auto; + flex: 1 0 auto; + margin: 0 12px; } } + +.currency-display { + height: 54px; + width: 100%ß; + border: 1px solid #dedede; + border-radius: 4px; + background-color: #fff; + color: #9b9b9b; + font-family: Roboto; + font-size: 16px; + font-weight: 300; + padding: 8px 10px; + position: relative; } + .currency-display__primary-row { + display: -webkit-box; + display: -ms-flexbox; + display: flex; } + .currency-display__input { + color: #5d5d5d; + font-family: Roboto; + font-size: 16px; + line-height: 22px; + border: none; + outline: 0 !important; + max-width: 100%; } + .currency-display__primary-currency { + color: #5d5d5d; + font-weight: 400; + font-family: Roboto; + font-size: 16px; + line-height: 22px; } + .currency-display__converted-row { + display: -webkit-box; + display: -ms-flexbox; + display: flex; } + .currency-display__converted-value, .currency-display__converted-currency { + color: #9b9b9b; + font-family: Roboto; + font-size: 12px; + line-height: 12px; } + .currency-display__input-wrapper { + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; } + .currency-display__currency-symbol { + margin-top: 1px; } + +.account-menu { + position: fixed; + z-index: 100; + top: 58px; + width: 310px; } + @media screen and (max-width: 575px) { + .account-menu { + right: calc(((100vw - 100%) / 2) + 8px); } } + @media screen and (min-width: 576px) { + .account-menu { + right: calc((100vw - 85vw) / 2); } } + @media screen and (min-width: 769px) { + .account-menu { + right: calc((100vw - 80vw) / 2); } } + @media screen and (min-width: 1281px) { + .account-menu { + right: calc((100vw - 65vw) / 2); } } + .account-menu__icon { + margin-left: 20px; + cursor: pointer; } + .account-menu__header { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; } + .account-menu__logout-button { + border: 1px solid #9b9b9b; + background-color: transparent; + color: #fff; + border-radius: 4px; + font-size: 12px; + line-height: 23px; + padding: 0 24px; + font-weight: 200; } + .account-menu img { + width: 16px; + height: 16px; } + .account-menu__accounts { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + overflow-y: auto; + max-height: 240px; + position: relative; + z-index: 200; } + .account-menu__accounts::-webkit-scrollbar { + display: none; } + @media screen and (max-width: 575px) { + .account-menu__accounts { + max-height: 215px; } } + .account-menu__accounts .keyring-label { + margin-top: 5px; + background-color: #000; + color: #9b9b9b; } + .account-menu__account { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + padding: 16px 14px; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + @media screen and (max-width: 575px) { + .account-menu__account { + padding: 12px 14px; } } + .account-menu__account-info { + -webkit-box-flex: 1; + -ms-flex: 1 0 auto; + flex: 1 0 auto; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + padding-top: 4px; } + .account-menu__check-mark { + width: 14px; + margin-right: 12px; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + .account-menu__check-mark-icon { + background-image: url("images/check-white.svg"); + height: 18px; + width: 18px; + background-repeat: no-repeat; + background-position: center; + background-size: contain; + margin: 3px 0; } + .account-menu .identicon { + margin: 0 12px 0 0; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + .account-menu__name { + color: #fff; + font-size: 18px; + font-weight: 200; + line-height: 16px; } + .account-menu__balance { + color: #9b9b9b; + font-size: 14px; + line-height: 19px; } + .account-menu__action { + font-size: 16px; + line-height: 18px; + font-weight: 200; + cursor: pointer; } + +.menu { + border-radius: 4px; + background: rgba(0, 0, 0, 0.8); + -webkit-box-shadow: rgba(0, 0, 0, 0.15) 0 2px 2px 2px; + box-shadow: rgba(0, 0, 0, 0.15) 0 2px 2px 2px; + min-width: 150px; + color: #fff; } + .menu__item { + padding: 18px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-flow: row nowrap; + flex-flow: row nowrap; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + position: relative; + z-index: 200; + font-weight: 200; } + @media screen and (max-width: 575px) { + .menu__item { + padding: 14px; } } + .menu__item--clickable { + cursor: pointer; } + .menu__item--clickable:hover { + background-color: rgba(255, 255, 255, 0.05); } + .menu__item--clickable:active { + background-color: rgba(255, 255, 255, 0.1); } + .menu__item__icon { + height: 16px; + width: 16px; + margin-right: 14px; } + .menu__item__text { + font-size: 16px; + line-height: 21px; } + .menu__divider { + background-color: #5d5d5d; + width: 100%; + height: 1px; } + .menu__close-area { + position: fixed; + width: 100%; + height: 100%; + top: 0; + left: 0; + z-index: 100; } + +.gas-slider { + position: relative; + width: 313px; } + .gas-slider__input { + width: 317px; + margin-left: -2px; + z-index: 2; } + .gas-slider input[type=range] { + -webkit-appearance: none !important; } + .gas-slider input[type=range]::-webkit-slider-thumb { + -webkit-appearance: none !important; + height: 26px; + width: 26px; + border: 2px solid #B8B8B8; + background-color: #FFFFFF; + -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08); + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08); + border-radius: 50%; + position: relative; + z-index: 10; } + .gas-slider__bar { + height: 6px; + width: 313px; + background: #dedede; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + position: absolute; + top: 11px; + z-index: 0; } + .gas-slider__low, .gas-slider__high { + height: 6px; + width: 49px; + z-index: 1; } + .gas-slider__low { + background-color: #e91550; } + .gas-slider__high { + background-color: #02c9b1; } + +.settings { + position: relative; + background: #fff; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + height: auto; + overflow: auto; } + +.settings__header { + padding: 25px; } + +.settings__close-button::after { + content: '\00D7'; + font-size: 40px; + color: #9b9b9b; + position: absolute; + top: 25px; + right: 30px; + cursor: pointer; } + +.settings__error { + padding-bottom: 20px; + text-align: center; + color: #e91550; } + +.settings__content { + padding: 0 25px; } + +.settings__content-row { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + padding: 10px 0 20px; } + @media screen and (max-width: 575px) { + .settings__content-row { + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + padding: 10px 0; } } + +.settings__content-item { + -webkit-box-flex: 1; + -ms-flex: 1; + flex: 1; + min-width: 0; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; + padding: 0 5px; + height: 71px; } + @media screen and (max-width: 575px) { + .settings__content-item { + height: initial; + padding: 5px 0; } } + .settings__content-item--without-height { + height: initial; } + +.settings__content-item-col { + max-width: 300px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-direction: column; + flex-direction: column; } + @media screen and (max-width: 575px) { + .settings__content-item-col { + max-width: 100%; + width: 100%; } } + +.settings__content-description { + font-size: 14px; + color: #9b9b9b; + padding-top: 5px; } + +.settings__input { + padding-left: 10px; + font-size: 14px; + height: 40px; + border: 1px solid #dedede; } + +.settings__input::-webkit-input-placeholder { + font-weight: 100; + color: #9b9b9b; } + +.settings__input::-moz-placeholder { + font-weight: 100; + color: #9b9b9b; } + +.settings__input:-ms-input-placeholder { + font-weight: 100; + color: #9b9b9b; } + +.settings__input:-moz-placeholder { + font-weight: 100; + color: #9b9b9b; } + +.settings__provider-wrapper { + font-size: 16px; + border: 1px solid #dedede; + border-radius: 2px; + padding: 15px; + background-color: #fff; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; } + +.settings__provider-icon { + height: 10px; + width: 10px; + margin-right: 10px; + border-radius: 10px; } + +.settings__rpc-save-button { + -ms-flex-item-align: end; + align-self: flex-end; + padding: 5px; + text-transform: uppercase; + color: #9b9b9b; + cursor: pointer; } + +.settings__clear-button { + font-size: 16px; + border: 1px solid #2f9ae0; + color: #2f9ae0; + border-radius: 2px; + padding: 18px; + background-color: #fff; + text-transform: uppercase; } + +.settings__clear-button--red { + border: 1px solid #d0021b; + color: #d0021b; } + +.settings__info-logo-wrapper { + height: 80px; + margin-bottom: 20px; } + +.settings__info-logo { + max-height: 100%; + max-width: 100%; } + +.settings__info-item { + padding: 10px 0; } + +.settings__info-link-header { + padding-bottom: 15px; } + @media screen and (max-width: 575px) { + .settings__info-link-header { + padding-bottom: 5px; } } + +.settings__info-link-item { + padding: 15px 0; } + @media screen and (max-width: 575px) { + .settings__info-link-item { + padding: 5px 0; } } + +.settings__info-version-number { + padding-top: 5px; + font-size: 13px; + color: #9b9b9b; } + +.settings__info-about { + color: #9b9b9b; + margin-bottom: 15px; } + +.settings__info-link { + color: #2f9ae0; } + +.settings__info-separator { + margin: 15px 0; + width: 80px; + border-color: #dedede; + border: none; + height: 1px; + background-color: #dedede; + color: #dedede; } + +.tab-bar { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: horizontal; + -webkit-box-direction: normal; + -ms-flex-direction: row; + flex-direction: row; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: end; + -ms-flex-align: end; + align-items: flex-end; } + +.tab-bar__tab { + min-width: 0; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + padding: 15px 25px; + border-bottom: 1px solid #dedede; + -webkit-box-sizing: border-box; + box-sizing: border-box; + font-size: 18px; } + +.tab-bar__tab--active { + border-color: #000; } + +.tab-bar__grow-tab { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; } + +.simple-dropdown { + height: 56px; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: start; + -ms-flex-pack: start; + justify-content: flex-start; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + border: 1px solid #dedede; + border-radius: 4px; + background-color: #fff; + font-size: 16px; + color: #4d4d4d; + cursor: pointer; + position: relative; } + +.simple-dropdown__caret { + color: #cdcdcd; + padding: 0 10px; } + +.simple-dropdown__selected { + -webkit-box-flex: 1; + -ms-flex-positive: 1; + flex-grow: 1; + padding: 0 15px; } + +.simple-dropdown__options { + z-index: 1050; + position: absolute; + height: 220px; + width: 100%; + border: 1px solid #d2d8dd; + border-radius: 4px; + background-color: #fff; + -webkit-box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.11); + box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.11); + margin-top: 10px; + overflow-y: scroll; + left: 0; + top: 100%; } + +.simple-dropdown__option { + padding: 10px; } + .simple-dropdown__option:hover { + background-color: #efefef; } + +.simple-dropdown__option--selected { + background-color: #dedede; } + .simple-dropdown__option--selected:hover { + background-color: #dedede; + cursor: default; } + +.simple-dropdown__close-area { + position: fixed; + top: 0; + left: 0; + z-index: 1000; + width: 100%; + height: 100%; } + +.request-signature__container { + width: 380px; + border-radius: 8px; + background-color: #fff; + -webkit-box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08); + box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.08); + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column nowrap; + flex-flow: column nowrap; + z-index: 25; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + font-family: Roboto; + position: relative; + height: 100%; } + @media screen and (max-width: 575px) { + .request-signature__container { + width: 100%; + top: 0; + -webkit-box-shadow: none; + box-shadow: none; } } + @media screen and (min-width: 576px) { + .request-signature__container { + max-height: 620px; } } + +.request-signature__header { + height: 64px; + width: 100%; + position: relative; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column; + flex-flow: column; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; } + +.request-signature__header-background { + position: absolute; + background-color: #e9edf0; + z-index: 2; + width: 100%; + height: 100%; } + +.request-signature__header__text { + height: 29px; + width: 179px; + color: #5B5D67; + font-family: Roboto; + font-size: 22px; + font-weight: 300; + line-height: 29px; + z-index: 3; } + +.request-signature__header__tip-container { + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; } + +.request-signature__header__tip { + height: 25px; + width: 25px; + background: #e9edf0; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + position: absolute; + bottom: -8px; + z-index: 1; } + +.request-signature__account-info { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: justify; + -ms-flex-pack: justify; + justify-content: space-between; + margin-top: 18px; + margin-bottom: 20px; } + +.request-signature__account { + color: #9b9b9b; + margin-left: 17px; } + +.request-signature__account-text { + font-size: 14px; } + +.request-signature__balance { + color: #9b9b9b; + margin-right: 17px; + width: 124px; } + +.request-signature__balance-text { + text-align: right; + font-size: 14px; } + +.request-signature__balance-value { + text-align: right; + margin-top: 2.5px; } + +.request-signature__request-icon { + margin-top: 25px; } + +.request-signature__body { + width: 100%; + height: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column; + flex-flow: column; + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; + height: 0; } + +.request-signature__request-info { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; } + +.request-signature__headline { + height: 48px; + width: 240px; + color: #4d4d4d; + font-family: Roboto; + font-size: 18px; + font-weight: 300; + line-height: 24px; + text-align: center; + margin-top: 20px; } + +.request-signature__notice, .request-signature__warning { + font-family: "Avenir Next"; + font-size: 14px; + line-height: 19px; + text-align: center; + margin-top: 41px; + margin-bottom: 11px; + width: 100%; } + +.request-signature__notice { + color: #9b9b9b; } + +.request-signature__warning { + color: #e91550; } + +.request-signature__rows { + height: 100%; + overflow-y: scroll; + overflow-x: hidden; + border-top: 1px solid #d2d8dd; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column; + flex-flow: column; } + +.request-signature__row { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-orient: vertical; + -webkit-box-direction: normal; + -ms-flex-flow: column; + flex-flow: column; } + +.request-signature__row-title { + width: 80px; + color: #9b9b9b; + font-family: Roboto; + font-size: 16px; + line-height: 22px; + margin-top: 12px; + margin-left: 18px; + width: 100%; } + +.request-signature__row-value { + color: #5d5d5d; + font-family: Roboto; + font-size: 14px; + line-height: 19px; + width: 100%; + overflow-wrap: break-word; + border-bottom: 1px solid #d2d8dd; + padding: 6px 18px 15px; } + +.request-signature__footer { + width: 100%; + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: space-evenly; + -ms-flex-pack: space-evenly; + justify-content: space-evenly; + font-size: 22px; + position: relative; + -webkit-box-flex: 0; + -ms-flex: 0 0 auto; + flex: 0 0 auto; + border-top: 1px solid #d2d8dd; } + .request-signature__footer__cancel-button, .request-signature__footer__sign-button { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + -webkit-box-flex: 1; + -ms-flex: 1 0 auto; + flex: 1 0 auto; + font-family: Roboto; + font-size: 16px; + font-weight: 300; + height: 55px; + line-height: 32px; + cursor: pointer; + border-radius: 2px; + -webkit-box-shadow: none; + box-shadow: none; + max-width: 162px; + margin: 12px; } + .request-signature__footer__cancel-button { + background: none; + border: 1px solid #9b9b9b; + margin-right: 6px; } + .request-signature__footer__sign-button { + background-color: #02c9b1; + border-width: 0; + color: #fff; + margin-left: 6px; } + +.account-dropdown-mini { + height: 22px; + background-color: #fff; + font-family: Roboto; + line-height: 16px; + font-size: 12px; + width: 124px; } + .account-dropdown-mini__close-area { + position: fixed; + top: 0; + left: 0; + z-index: 1000; + width: 100%; + height: 100%; } + .account-dropdown-mini__list { + z-index: 1050; + position: absolute; + height: 180px; + width: 96pxpx; + border: 1px solid #d2d8dd; + border-radius: 4px; + background-color: #fff; + -webkit-box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.11); + box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.11); + overflow-y: scroll; } + .account-dropdown-mini .account-list-item { + margin-top: 6px; } + .account-dropdown-mini .account-list-item__account-name { + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + width: 80px; } + .account-dropdown-mini .account-list-item__top-row { + margin: 0; } + .account-dropdown-mini .account-list-item__icon { + position: initial; } + +.editable-label { + display: -webkit-box; + display: -ms-flexbox; + display: flex; + -webkit-box-align: center; + -ms-flex-align: center; + align-items: center; + -webkit-box-pack: center; + -ms-flex-pack: center; + justify-content: center; + position: relative; } + .editable-label__value { + max-width: 250px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; } + .editable-label__input { + width: 250px; + font-size: 14px; + text-align: center; + border: 1px solid #dedede; } + .editable-label__input--error { + border: 1px solid #d0021b; } + .editable-label__icon-wrapper { + position: absolute; + margin-left: 10px; + left: 100%; } + .editable-label__icon { + cursor: pointer; + color: #9b9b9b; } + +/* + Trumps + */ +/* universal */ +.app-primary .main-enter { + position: absolute; + width: 100%; } + +/* center position */ +.app-primary.from-right .main-enter-active, +.app-primary.from-left .main-enter-active { + overflow-x: hidden; + -webkit-transform: translateX(0); + transform: translateX(0); + -webkit-transition: -webkit-transform 300ms ease-in; + transition: -webkit-transform 300ms ease-in; + transition: transform 300ms ease-in; + transition: transform 300ms ease-in, -webkit-transform 300ms ease-in; } + +/* exited positions */ +.app-primary.from-left .main-leave-active { + -webkit-transform: translateX(360px); + transform: translateX(360px); + -webkit-transition: -webkit-transform 300ms ease-in; + transition: -webkit-transform 300ms ease-in; + transition: transform 300ms ease-in; + transition: transform 300ms ease-in, -webkit-transform 300ms ease-in; } + +.app-primary.from-right .main-leave-active { + -webkit-transform: translateX(-360px); + transform: translateX(-360px); + -webkit-transition: -webkit-transform 300ms ease-in; + transition: -webkit-transform 300ms ease-in; + transition: transform 300ms ease-in; + transition: transform 300ms ease-in, -webkit-transform 300ms ease-in; } + +.sidebar.from-left { + -webkit-transform: translateX(-320px); + transform: translateX(-320px); + -webkit-transition: -webkit-transform 300ms ease-in; + transition: -webkit-transform 300ms ease-in; + transition: transform 300ms ease-in; + transition: transform 300ms ease-in, -webkit-transform 300ms ease-in; } + +/* loader transitions */ +.loader-enter, +.loader-leave-active { + opacity: 0; + -webkit-transition: opacity 150 ease-in; + transition: opacity 150 ease-in; } + +.loader-enter-active, +.loader-leave { + opacity: 1; + -webkit-transition: opacity 150 ease-in; + transition: opacity 150 ease-in; } + +/* entering positions */ +.app-primary.from-right .main-enter:not(.main-enter-active) { + -webkit-transform: translateX(360px); + transform: translateX(360px); } + +.app-primary.from-left .main-enter:not(.main-enter-active) { + -webkit-transform: translateX(-360px); + transform: translateX(-360px); } + +i.fa.fa-question-circle.fa-lg.menu-icon { + font-size: 18px; } + +/* stylelint-disable */ +#buy-modal-content-footer-text { + font-family: 'DIN OT'; + font-size: 16px; } + +/* stylelint-enable */ + +/*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY3NzIiwic291cmNlcyI6WyJpbmRleC5zY3NzIiwiaXRjc3Mvc2V0dGluZ3MvaW5kZXguc2NzcyIsIml0Y3NzL3NldHRpbmdzL3ZhcmlhYmxlcy5zY3NzIiwiaXRjc3Mvc2V0dGluZ3MvdHlwb2dyYXBoeS5zY3NzIiwiaXRjc3MvdG9vbHMvaW5kZXguc2NzcyIsIml0Y3NzL3Rvb2xzL3V0aWxpdGllcy5zY3NzIiwiaXRjc3MvZ2VuZXJpYy9pbmRleC5zY3NzIiwiaXRjc3MvZ2VuZXJpYy9yZXNldC5zY3NzIiwiaXRjc3MvYmFzZS9pbmRleC5zY3NzIiwiaXRjc3Mvb2JqZWN0cy9pbmRleC5zY3NzIiwiaXRjc3MvY29tcG9uZW50cy9pbmRleC5zY3NzIiwiaXRjc3MvY29tcG9uZW50cy9idXR0b25zLnNjc3MiLCJpdGNzcy9jb21wb25lbnRzL2hlYWRlci5zY3NzIiwiaXRjc3MvY29tcG9uZW50cy9mb290ZXIuc2NzcyIsIml0Y3NzL2NvbXBvbmVudHMvbmV0d29yay5zY3NzIiwiaXRjc3MvY29tcG9uZW50cy9tb2RhbC5zY3NzIiwiaXRjc3MvY29tcG9uZW50cy9uZXd1aS1zZWN0aW9ucy5zY3NzIiwiaXRjc3MvY29tcG9uZW50cy9hY2NvdW50LWRyb3Bkb3duLnNjc3MiLCJpdGNzcy9jb21wb25lbnRzL3NlbmQuc2NzcyIsIml0Y3NzL2NvbXBvbmVudHMvY29uZmlybS5zY3NzIiwiaXRjc3MvY29tcG9uZW50cy9sb2FkaW5nLW92ZXJsYXkuc2NzcyIsIml0Y3NzL2NvbXBvbmVudHMvaGVyby1iYWxhbmNlLnNjc3MiLCJpdGNzcy9jb21wb25lbnRzL3dhbGxldC1iYWxhbmNlLnNjc3MiLCJpdGNzcy9jb21wb25lbnRzL3RyYW5zYWN0aW9uLWxpc3Quc2NzcyIsIml0Y3NzL2NvbXBvbmVudHMvc2VjdGlvbnMuc2NzcyIsIml0Y3NzL2NvbXBvbmVudHMvdG9rZW4tbGlzdC5zY3NzIiwiaXRjc3MvY29tcG9uZW50cy9hZGQtdG9rZW4uc2NzcyIsIml0Y3NzL2NvbXBvbmVudHMvY3VycmVuY3ktZGlzcGxheS5zY3NzIiwiaXRjc3MvY29tcG9uZW50cy9hY2NvdW50LW1lbnUuc2NzcyIsIml0Y3NzL2NvbXBvbmVudHMvbWVudS5zY3NzIiwiaXRjc3MvY29tcG9uZW50cy9nYXMtc2xpZGVyLnNjc3MiLCJpdGNzcy9jb21wb25lbnRzL3NldHRpbmdzLnNjc3MiLCJpdGNzcy9jb21wb25lbnRzL3RhYi1iYXIuc2NzcyIsIml0Y3NzL2NvbXBvbmVudHMvc2ltcGxlLWRyb3Bkb3duLnNjc3MiLCJpdGNzcy9jb21wb25lbnRzL3JlcXVlc3Qtc2lnbmF0dXJlLnNjc3MiLCJpdGNzcy9jb21wb25lbnRzL2FjY291bnQtZHJvcGRvd24tbWluaS5zY3NzIiwiaXRjc3MvY29tcG9uZW50cy9lZGl0YWJsZS1sYWJlbC5zY3NzIiwiaXRjc3MvdHJ1bXBzL2luZGV4LnNjc3MiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAgSVRDU1NcblxuICBodHRwOi8vd3d3LmNyZWF0aXZlYmxvcS5jb20vd2ViLWRlc2lnbi9tYW5hZ2UtbGFyZ2UtY3NzLXByb2plY3RzLWl0Y3NzLTEwMTUxNzUyOFxuICBodHRwczovL3d3dy54Zml2ZS5jby9ibG9nL2l0Y3NzLXNjYWxhYmxlLW1haW50YWluYWJsZS1jc3MtYXJjaGl0ZWN0dXJlL1xuICovXG5AaW1wb3J0ICcuL2l0Y3NzL3NldHRpbmdzL2luZGV4LnNjc3MnO1xuQGltcG9ydCAnLi9pdGNzcy90b29scy9pbmRleC5zY3NzJztcbkBpbXBvcnQgJy4vaXRjc3MvZ2VuZXJpYy9pbmRleC5zY3NzJztcbkBpbXBvcnQgJy4vaXRjc3MvYmFzZS9pbmRleC5zY3NzJztcbkBpbXBvcnQgJy4vaXRjc3Mvb2JqZWN0cy9pbmRleC5zY3NzJztcbkBpbXBvcnQgJy4vaXRjc3MvY29tcG9uZW50cy9pbmRleC5zY3NzJztcbkBpbXBvcnQgJy4vaXRjc3MvdHJ1bXBzL2luZGV4LnNjc3MnO1xuIiwiQGltcG9ydCAnLi92YXJpYWJsZXMuc2Nzcyc7XG5cbkBpbXBvcnQgJy4vdHlwb2dyYXBoeS5zY3NzJztcbiIsIi8qXG4gIFZhcmlhYmxlc1xuICovXG5cbi8vIEJhc2UgQ29sb3JzXG4kd2hpdGU6ICNmZmY7XG4kYmxhY2s6ICMwMDA7XG4kb3JhbmdlOiAjZmZhNTAwO1xuJHJlZDogI2YwMDtcbiRncmF5OiAjODA4MDgwO1xuXG4vKlxuICBDb2xvcnNcbiAgaHR0cDovL2NoaXIuYWcvcHJvamVjdHMvbmFtZS10aGF0LWNvbG9yXG4gKi9cbiR3aGl0ZS1saW5lbjogI2ZhZjZmMDsgLy8gZm9ybWVybHkgJ2ZhaW50IG9yYW5nZSAodGV4dGZpZWxkIHNoYWRlcyknXG4kcmFqYWg6ICNmNWMyNmQ7IC8vIGZvcm1lcmx5ICdsaWdodCBvcmFuZ2UgKGJ1dHRvbiBzaGFkZXMpJ1xuJGJ1dHRlcmN1cDogI2Y1YTYyMzsgLy8gZm9ybWVybHkgJ2Rhcmsgb3JhbmdlICh0ZXh0KSdcbiR0dW5kb3JhOiAjNGE0YTRhOyAvLyBmb3JtZXJseSAnYm9yZGVycy9mb250L2FueSBncmF5J1xuJGdhbGxlcnk6ICNlZmVmZWY7XG4kYWxhYmFzdGVyOiAjZjdmN2Y3O1xuJHNoYXJrOiAjMjIyMzJjO1xuJHdpbGQtc2FuZDogI2Y2ZjZmNjtcbiR3aGl0ZTogI2ZmZjtcbiRkdXN0eS1ncmF5OiAjOWI5YjliO1xuJGFsdG86ICNkZWRlZGU7XG4kYWxhYmFzdGVyOiAjZmFmYWZhO1xuJHNpbHZlci1jaGFsaWNlOiAjYWVhZWFlO1xuJGN1cmlvdXMtYmx1ZTogIzJmOWFlMDtcbiRjb25jcmV0ZTogI2YzZjNmMztcbiR0dW5kb3JhOiAjNGQ0ZDRkO1xuJG5pbGUtYmx1ZTogIzFiMzQ0ZDtcbiRzY29ycGlvbjogIzVkNWQ1ZDtcbiRzaWx2ZXI6ICNjZGNkY2Q7XG4kY2FyaWJiZWFuLWdyZWVuOiAjMDJjOWIxO1xuJG1vbnpvOiAjZDAwMjFiO1xuJGNyaW1zb246ICNlOTE1NTA7XG4kYmx1ZS1sYWdvb246ICMwMzg3ODk7XG4kcHVycGxlOiAjNjkwNDk2O1xuJHR1bGlwLXRyZWU6ICNlYmIzM2Y7XG4kbWFsaWJ1LWJsdWU6ICM3YWM5ZmQ7XG4kYXRoZW5zLWdyZXk6ICNlOWVkZjA7XG4kamFmZmE6ICNmMjg5MzA7XG4kZ2V5c2VyOiAjZDJkOGRkO1xuXG4vKlxuICBaLUluZGljaWVzXG4gKi9cbiRkcm9wZG93bi16LWluZGV4OiAzMDtcbiR0b2tlbi1pY29uLXotaW5kZXg6IDE1O1xuJGNvbnRhaW5lci16LWluZGV4OiAxNTtcbiRoZWFkZXItei1pbmRleDogMTI7XG4kbW9iaWxlLWhlYWRlci16LWluZGV4OiAyNjtcbiRtYWluLWNvbnRhaW5lci16LWluZGV4OiAxODtcbiRzZW5kLWNhcmQtei1pbmRleDogMjA7XG4kc2lkZWJhci16LWluZGV4OiAyNjtcbiRzaWRlYmFyLW92ZXJsYXktei1pbmRleDogMjU7XG5cbi8qXG4gIFogSW5kaWNpZXMgLSBDdXJyZW50XG4gIGFwcCAtIDExXG4gIGhleC9ibiBhcyBkZWNpbWFsIGlucHV0IC0gMSAtIHJlbW92ZT9cbiAgZHJvcGRvd24gLSAxMVxuICBsb2FkaW5nIC0gMTAgLSBoaWdoZXI/XG4gIG1hc2NvdCAtIDAgLSByZW1vdmU/XG4gKi9cblxuLypcbiAgUmVzcG9uc2l2ZSBCcmVha3BvaW50c1xuICovXG4kYnJlYWstc21hbGw6IDU3NXB4O1xuJGJyZWFrLW1pZHBvaW50OiA3ODBweDtcbiRicmVhay1sYXJnZTogNTc2cHg7XG5cblxuJHByaW1hcnktZm9udC10eXBlOiBSb2JvdG87XG5cbiIsIkBpbXBvcnQgdXJsKCdodHRwczovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9Um9ib3RvOjEwMCwzMDAsNDAwLDUwMCw3MDAsOTAwJyk7XG5cbkBpbXBvcnQgdXJsKCdodHRwczovL21heGNkbi5ib290c3RyYXBjZG4uY29tL2ZvbnQtYXdlc29tZS80LjQuMC9jc3MvZm9udC1hd2Vzb21lLm1pbi5jc3MnKTtcblxuQGZvbnQtZmFjZSB7XG4gIGZvbnQtZmFtaWx5OiAnTW9udHNlcnJhdCBSZWd1bGFyJztcbiAgc3JjOiB1cmwoJy9mb250cy9Nb250c2VycmF0L01vbnRzZXJyYXQtUmVndWxhci53b2ZmJykgZm9ybWF0KCd3b2ZmJyk7XG4gIHNyYzogdXJsKCcvZm9udHMvTW9udHNlcnJhdC9Nb250c2VycmF0LVJlZ3VsYXIudHRmJykgZm9ybWF0KCd0cnVldHlwZScpO1xuICBmb250LXdlaWdodDogNDAwO1xuICBmb250LXN0eWxlOiBub3JtYWw7XG4gIGZvbnQtc2l6ZTogJ3NtYWxsJztcbn1cblxuQGZvbnQtZmFjZSB7XG4gIGZvbnQtZmFtaWx5OiAnTW9udHNlcnJhdCBCb2xkJztcbiAgc3JjOiB1cmwoJy9mb250cy9Nb250c2VycmF0L01vbnRzZXJyYXQtQm9sZC53b2ZmJykgZm9ybWF0KCd3b2ZmJyk7XG4gIHNyYzogdXJsKCcvZm9udHMvTW9udHNlcnJhdC9Nb250c2VycmF0LUJvbGQudHRmJykgZm9ybWF0KCd0cnVldHlwZScpO1xuICBmb250LXdlaWdodDogNDAwO1xuICBmb250LXN0eWxlOiBub3JtYWw7XG59XG5cbkBmb250LWZhY2Uge1xuICBmb250LWZhbWlseTogJ01vbnRzZXJyYXQgTGlnaHQnO1xuICBzcmM6IHVybCgnL2ZvbnRzL01vbnRzZXJyYXQvTW9udHNlcnJhdC1MaWdodC53b2ZmJykgZm9ybWF0KCd3b2ZmJyk7XG4gIHNyYzogdXJsKCcvZm9udHMvTW9udHNlcnJhdC9Nb250c2VycmF0LUxpZ2h0LnR0ZicpIGZvcm1hdCgndHJ1ZXR5cGUnKTtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xufVxuXG5AZm9udC1mYWNlIHtcbiAgZm9udC1mYW1pbHk6ICdNb250c2VycmF0IFVsdHJhTGlnaHQnO1xuICBzcmM6IHVybCgnL2ZvbnRzL01vbnRzZXJyYXQvTW9udHNlcnJhdC1VbHRyYUxpZ2h0LndvZmYnKSBmb3JtYXQoJ3dvZmYnKTtcbiAgc3JjOiB1cmwoJy9mb250cy9Nb250c2VycmF0L01vbnRzZXJyYXQtVWx0cmFMaWdodC50dGYnKSBmb3JtYXQoJ3RydWV0eXBlJyk7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcbn1cblxuQGZvbnQtZmFjZSB7XG4gIGZvbnQtZmFtaWx5OiAnRElOIE9UJztcbiAgc3JjOiB1cmwoJy9mb250cy9ESU5fT1QvRElOT1QtMi5vdGYnKSBmb3JtYXQoJ29wZW50eXBlJyk7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcbn1cblxuQGZvbnQtZmFjZSB7XG4gIGZvbnQtZmFtaWx5OiAnRElOIE9UIExpZ2h0JztcbiAgc3JjOiB1cmwoJy9mb250cy9ESU5fT1QvRElOT1QtMi5vdGYnKSBmb3JtYXQoJ29wZW50eXBlJyk7XG4gIGZvbnQtd2VpZ2h0OiAyMDA7XG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcbn1cblxuQGZvbnQtZmFjZSB7XG4gIGZvbnQtZmFtaWx5OiAnRElOIE5FWFQnO1xuICBzcmM6IHVybCgnL2ZvbnRzL0RJTiBORVhUL0RJTiBORVhUIFcwMSBSZWd1bGFyLm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKTtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xufVxuXG5AZm9udC1mYWNlIHtcbiAgZm9udC1mYW1pbHk6ICdESU4gTkVYVCBMaWdodCc7XG4gIHNyYzogdXJsKCcvZm9udHMvRElOIE5FWFQvRElOIE5FWFQgVzEwIExpZ2h0Lm90ZicpIGZvcm1hdCgnb3BlbnR5cGUnKTtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xufVxuXG5AZm9udC1mYWNlIHtcbiAgZm9udC1mYW1pbHk6ICdMYXRvJztcbiAgc3JjOiB1cmwoJy9mb250cy9MYXRvL0xhdG8tUmVndWxhci50dGYnKSBmb3JtYXQoJ3RydWV0eXBlJyk7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcbn1cbiIsIkBpbXBvcnQgJy4vdXRpbGl0aWVzLnNjc3MnO1xuIiwiLypcbiAgVXRpbGl0eSBDbGFzc2VzXG4gKi9cblxuLyogY29sb3IgKi9cblxuLmNvbG9yLW9yYW5nZSB7XG4gIGNvbG9yOiAjZjc4NjFjOyAvLyBUT0RPOiBtb3ZlIHRvIHNldHRpbmdzL3ZhcmlhYmxlc1xufVxuXG4uY29sb3ItZm9yZXN0IHtcbiAgY29sb3I6ICMwYTU0NDg7IC8vIFRPRE86IG1vdmUgdG8gc2V0dGluZ3MvdmFyaWFibGVzXG59XG5cbi8qIGxpYiAqL1xuXG4uZnVsbC1zaXplIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogMTAwJTtcbn1cblxuLmZ1bGwtd2lkdGgge1xuICB3aWR0aDogMTAwJTtcbn1cblxuLmZ1bGwtZmxleC1oZWlnaHQge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4OiAxIDEgYXV0bztcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbn1cblxuLmZ1bGwtaGVpZ2h0IHtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG4uZmxleC1jb2x1bW4ge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xufVxuXG4uc3BhY2UtYmV0d2VlbiB7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2Vlbjtcbn1cblxuLnNwYWNlLWFyb3VuZCB7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kO1xufVxuXG4uZmxleC1jb2x1bW4tYm90dG9tIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlO1xufVxuXG4uZmxleC1yb3cge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xufVxuXG4uZmxleC1zcGFjZS1iZXR3ZWVuIHtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xufVxuXG4uZmxleC1zcGFjZS1hcm91bmQge1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDtcbn1cblxuLmZsZXgtcmlnaHQge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xufVxuXG4uZmxleC1sZWZ0IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xufVxuXG4uZmxleC1maXhlZCB7XG4gIGZsZXg6IG5vbmU7XG59XG5cbi5mbGV4LWJhc2lzLWF1dG8ge1xuICBmbGV4LWJhc2lzOiBhdXRvO1xufVxuXG4uZmxleC1ncm93IHtcbiAgZmxleDogMSAxIGF1dG87XG59XG5cbi5mbGV4LXdyYXAge1xuICBmbGV4LXdyYXA6IHdyYXA7XG59XG5cbi5mbGV4LWNlbnRlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4uZmxleC1qdXN0aWZ5LWNlbnRlciB7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xufVxuXG4uZmxleC1hbGlnbi1jZW50ZXIge1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4uZmxleC1zZWxmLWVuZCB7XG4gIGFsaWduLXNlbGY6IGZsZXgtZW5kO1xufVxuXG4uZmxleC1zZWxmLXN0cmV0Y2gge1xuICBhbGlnbi1zZWxmOiBzdHJldGNoO1xufVxuXG4uZmxleC12ZXJ0aWNhbCB7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG59XG5cbi56LWJ1bXAge1xuICB6LWluZGV4OiAxO1xufVxuXG4uc2VsZWN0LW5vbmUge1xuICBjdXJzb3I6IGluaGVyaXQ7XG4gIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7XG4gIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7XG4gIC1tcy11c2VyLXNlbGVjdDogbm9uZTtcbiAgdXNlci1zZWxlY3Q6IG5vbmU7XG59XG5cbi5wb2ludGVyIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uY3Vyc29yLXBvaW50ZXIge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSA1MG1zIGVhc2UtaW4tb3V0O1xufVxuXG4uY3Vyc29yLXBvaW50ZXI6aG92ZXIge1xuICB0cmFuc2Zvcm06IHNjYWxlKDEuMSk7XG59XG5cbi5jdXJzb3ItcG9pbnRlcjphY3RpdmUge1xuICB0cmFuc2Zvcm06IHNjYWxlKC45NSk7XG59XG5cbi5jdXJzb3ItZGlzYWJsZWQge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xufVxuXG4ubWFyZ2luLWJvdHRvbS1zbWwge1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufVxuXG4ubWFyZ2luLWJvdHRvbS1tZWQge1xuICBtYXJnaW4tYm90dG9tOiA0MHB4O1xufVxuXG4ubWFyZ2luLXJpZ2h0LWxlZnQge1xuICBtYXJnaW46IDAgMjBweDtcbn1cblxuLmJvbGQge1xuICBmb250LXdlaWdodDogNzAwO1xufVxuXG4udGV4dC10cmFuc2Zvcm0tdXBwZXJjYXNlIHtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbn1cblxuLmZvbnQtc21hbGwge1xuICBmb250LXNpemU6IDEycHg7XG59XG5cbi5mb250LW1lZGl1bSB7XG4gIGZvbnQtc2l6ZTogMS4yZW07XG59XG5cbmhyLmhvcml6b250YWwtbGluZSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBoZWlnaHQ6IDFweDtcbiAgYm9yZGVyOiAwO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgI2NjYztcbiAgbWFyZ2luOiAxZW0gMDtcbiAgcGFkZGluZzogMDtcbn1cblxuLmhvdmVyLXdoaXRlOmhvdmVyIHtcbiAgYmFja2dyb3VuZDogJHdoaXRlO1xufVxuXG4ucmVkLWRvdCB7XG4gIGJhY2tncm91bmQ6ICNlOTE1NTA7XG4gIGNvbG9yOiAkd2hpdGU7XG4gIGJvcmRlci1yYWRpdXM6IDEwcHg7XG59XG5cbi5kaWFtb25kIHtcbiAgdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpO1xuICBiYWNrZ3JvdW5kOiAjMDM4Nzg5O1xufVxuXG4uaG9sbG93LWRpYW1vbmQge1xuICB0cmFuc2Zvcm06IHJvdGF0ZSg0NWRlZyk7XG4gIGJvcmRlcjogM3B4IHNvbGlkICM2OTA0OTY7XG59XG5cbi5nb2xkZW4tc3F1YXJlIHtcbiAgYmFja2dyb3VuZDogI2ViYjMzZjtcbn1cblxuLnBlbmRpbmctZG90IHtcbiAgYmFja2dyb3VuZDogJHJlZDtcbiAgbGVmdDogMTRweDtcbiAgdG9wOiAxNHB4O1xuICBjb2xvcjogJHdoaXRlO1xuICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICBoZWlnaHQ6IDIwcHg7XG4gIG1pbi13aWR0aDogMjBweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgcGFkZGluZzogNHB4O1xuICB6LWluZGV4OiAxO1xufVxuXG4ua2V5cmluZy1sYWJlbCB7XG4gIHotaW5kZXg6IDE7XG4gIGZvbnQtc2l6ZTogOHB4O1xuICBsaW5lLWhlaWdodDogOHB4O1xuICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNCk7XG4gIGNvbG9yOiAjZmZmO1xuICBib3JkZXItcmFkaXVzOiAxMHB4O1xuICBwYWRkaW5nOiA0cHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgaGVpZ2h0OiAxNXB4O1xufVxuXG4uZXRoZXItYmFsYW5jZSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi50YWJTZWN0aW9uIHtcbiAgbWluLXdpZHRoOiAzNTBweDtcbn1cblxuLm1lbnUtaWNvbiB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgaGVpZ2h0OiAxMnB4O1xuICBtaW4td2lkdGg6IDEycHg7XG4gIG1hcmdpbjogMTNweDtcbn1cblxuLmV0aGVyLWljb24ge1xuICBiYWNrZ3JvdW5kOiByZ2IoMCwgMTYzLCA2OCk7XG4gIGJvcmRlci1yYWRpdXM6IDIwcHg7XG59XG5cbi50ZXN0bmV0LWljb24ge1xuICBiYWNrZ3JvdW5kOiAjMjQ2NWUxO1xufVxuXG4uZHJvcC1tZW51LWl0ZW0ge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xufVxuXG4uaW52aXNpYmxlIHtcbiAgdmlzaWJpbGl0eTogaGlkZGVuO1xufVxuXG4ub25lLWxpbmUtY29uY2F0IHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5jcml0aWNhbC1lcnJvciB7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgbWFyZ2luLXRvcDogMjBweDtcbiAgY29sb3I6ICRyZWQ7XG59XG5cbi8qXG4gIE1pc2NcbiAqL1xuXG4vLyBUT0RPOiBtb3ZlIGludG8gY29tcG9uZW50LWxldmVsIGNvbnRleHR1YWwgJ2FjdGl2ZScgc3RhdGVcbi5sZXR0ZXItc3BhY2V5IHtcbiAgbGV0dGVyLXNwYWNpbmc6IC4xZW07XG59XG5cbi5hY3RpdmUge1xuICBjb2xvcjogIzkwOTA5MDtcbn1cblxuLmNoZWNrIHtcbiAgbWFyZ2luLWxlZnQ6IDdweDtcbiAgY29sb3I6ICNmNzg2MWM7XG4gIGZsZXg6IDEgMCBhdXRvO1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xufVxuIiwiLypcbiAgR2VuZXJpY1xuICovXG5cbkBpbXBvcnQgJy4vcmVzZXQuc2Nzcyc7XG5cbioge1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xufVxuXG5odG1sLFxuYm9keSB7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIEFyaWFsO1xuICBjb2xvcjogIzRkNGQ0ZDtcbiAgZm9udC13ZWlnaHQ6IDMwMDtcbiAgbGluZS1oZWlnaHQ6IDEuNGVtO1xuICBiYWNrZ3JvdW5kOiAjZjdmN2Y3O1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG59XG5cbmh0bWwge1xuICBtaW4taGVpZ2h0OiA1MDBweDtcbn1cblxuLmFwcC1yb290IHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uYXBwLXByaW1hcnkge1xuICBkaXNwbGF5OiBmbGV4O1xufVxuXG5pbnB1dDpmb2N1cyxcbnRleHRhcmVhOmZvY3VzIHtcbiAgb3V0bGluZTogbm9uZTtcbn1cblxuLyogc3R5bGVsaW50LWRpc2FibGUgKi9cbiNhcHAtY29udGVudCB7XG4gIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgaGVpZ2h0OiAxMDAlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuXG4gIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6ICRicmVhay1zbWFsbCkge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICR3aGl0ZTtcbiAgfVxufVxuLyogc3R5bGVsaW50LWVuYWJsZSAqL1xuXG5hIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBjb2xvcjogaW5oZXJpdDtcbn1cblxuYTpob3ZlciB7XG4gIGNvbG9yOiAjZGY2YjBlO1xufVxuXG5pbnB1dC5sYXJnZS1pbnB1dCxcbnRleHRhcmVhLmxhcmdlLWlucHV0IHtcbiAgcGFkZGluZzogOHB4O1xufVxuXG5pbnB1dC5sYXJnZS1pbnB1dCB7XG4gIGhlaWdodDogMzZweDtcbn1cbiIsIi8qIGh0dHA6Ly9tZXllcndlYi5jb20vZXJpYy90b29scy9jc3MvcmVzZXQvXG4gICB2Mi4wIHwgMjAxMTAxMjZcbiAgIExpY2Vuc2U6IG5vbmUgKHB1YmxpYyBkb21haW4pXG4qL1xuXG5odG1sLFxuYm9keSxcbmRpdixcbnNwYW4sXG5hcHBsZXQsXG5vYmplY3QsXG5pZnJhbWUsXG5oMSxcbmgyLFxuaDMsXG5oNCxcbmg1LFxuaDYsXG5wLFxuYmxvY2txdW90ZSxcbnByZSxcbmEsXG5hYmJyLFxuYWNyb255bSxcbmFkZHJlc3MsXG5iaWcsXG5jaXRlLFxuY29kZSxcbmRlbCxcbmRmbixcbmVtLFxuaW1nLFxuaW5zLFxua2JkLFxucSxcbnMsXG5zYW1wLFxuc21hbGwsXG5zdHJpa2UsXG5zdHJvbmcsXG5zdWIsXG5zdXAsXG50dCxcbnZhcixcbmIsXG51LFxuaSxcbmNlbnRlcixcbmRsLFxuZHQsXG5kZCxcbm9sLFxudWwsXG5saSxcbmZpZWxkc2V0LFxuZm9ybSxcbmxhYmVsLFxubGVnZW5kLFxudGFibGUsXG5jYXB0aW9uLFxudGJvZHksXG50Zm9vdCxcbnRoZWFkLFxudHIsXG50aCxcbnRkLFxuYXJ0aWNsZSxcbmFzaWRlLFxuY2FudmFzLFxuZGV0YWlscyxcbmVtYmVkLFxuZmlndXJlLFxuZmlnY2FwdGlvbixcbmZvb3RlcixcbmhlYWRlcixcbmhncm91cCxcbm1lbnUsXG5uYXYsXG5vdXRwdXQsXG5ydWJ5LFxuc2VjdGlvbixcbnN1bW1hcnksXG50aW1lLFxubWFyayxcbmF1ZGlvLFxudmlkZW8ge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGJvcmRlcjogMDtcbiAgZm9udC1zaXplOiAxMDAlO1xuICAvKiBzdHlsZWxpbnQtZGlzYWJsZSAqL1xuICBmb250OiBpbmhlcml0O1xuICAvKiBzdHlsZWxpbnQtZW5hYmxlICovXG4gIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTtcbn1cblxuLyogSFRNTDUgZGlzcGxheS1yb2xlIHJlc2V0IGZvciBvbGRlciBicm93c2VycyAqL1xuXG4vKiBzdHlsZWxpbnQtZGlzYWJsZSAqL1xuXG5hcnRpY2xlLFxuYXNpZGUsXG5kZXRhaWxzLFxuZmlnY2FwdGlvbixcbmZpZ3VyZSxcbmZvb3RlcixcbmhlYWRlcixcbmhncm91cCxcbm1lbnUsXG5uYXYsXG5zZWN0aW9uIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbmJvZHkge1xuICBsaW5lLWhlaWdodDogMTtcbn1cblxub2wsXG51bCB7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG59XG5cbmJsb2NrcXVvdGUsXG5xIHtcbiAgcXVvdGVzOiBub25lO1xufVxuXG5ibG9ja3F1b3RlOmJlZm9yZSxcbmJsb2NrcXVvdGU6YWZ0ZXIsXG5xOmJlZm9yZSxcbnE6YWZ0ZXIge1xuICBjb250ZW50OiAnJztcbiAgY29udGVudDogbm9uZTtcbn1cblxudGFibGUge1xuICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xuICBib3JkZXItc3BhY2luZzogMDtcbn1cblxuYnV0dG9uIHtcbiAgYm9yZGVyLXN0eWxlOiBub25lO1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi8qIHN0eWxlbGludC1lbmFibGUgKi9cbiIsIi8vIEJhc2VcbiIsIi8vIE9iamVjdHNcbiIsIkBpbXBvcnQgJy4vYnV0dG9ucy5zY3NzJztcblxuQGltcG9ydCAnLi9oZWFkZXIuc2Nzcyc7XG5cbkBpbXBvcnQgJy4vZm9vdGVyLnNjc3MnO1xuXG5AaW1wb3J0ICcuL25ldHdvcmsuc2Nzcyc7XG5cbkBpbXBvcnQgJy4vbW9kYWwuc2Nzcyc7XG5cbkBpbXBvcnQgJy4vbmV3dWktc2VjdGlvbnMuc2Nzcyc7XG5cbkBpbXBvcnQgJy4vYWNjb3VudC1kcm9wZG93bi5zY3NzJztcblxuQGltcG9ydCAnLi9zZW5kLnNjc3MnO1xuXG5AaW1wb3J0ICcuL2NvbmZpcm0uc2Nzcyc7XG5cbkBpbXBvcnQgJy4vbG9hZGluZy1vdmVybGF5LnNjc3MnO1xuXG4vLyBCYWxhbmNlc1xuQGltcG9ydCAnLi9oZXJvLWJhbGFuY2Uuc2Nzcyc7XG5cbkBpbXBvcnQgJy4vd2FsbGV0LWJhbGFuY2Uuc2Nzcyc7XG5cbi8vIFR4IExpc3QgYW5kIFNlY3Rpb25zXG5AaW1wb3J0ICcuL3RyYW5zYWN0aW9uLWxpc3Quc2Nzcyc7XG5cbkBpbXBvcnQgJy4vc2VjdGlvbnMuc2Nzcyc7XG5cbkBpbXBvcnQgJy4vdG9rZW4tbGlzdC5zY3NzJztcblxuQGltcG9ydCAnLi9hZGQtdG9rZW4uc2Nzcyc7XG5cbkBpbXBvcnQgJy4vY3VycmVuY3ktZGlzcGxheS5zY3NzJztcblxuQGltcG9ydCAnLi9hY2NvdW50LW1lbnUuc2Nzcyc7XG5cbkBpbXBvcnQgJy4vbWVudS5zY3NzJztcblxuQGltcG9ydCAnLi9nYXMtc2xpZGVyLnNjc3MnO1xuXG5AaW1wb3J0ICcuL3NldHRpbmdzLnNjc3MnO1xuXG5AaW1wb3J0ICcuL3RhYi1iYXIuc2Nzcyc7XG5cbkBpbXBvcnQgJy4vc2ltcGxlLWRyb3Bkb3duLnNjc3MnO1xuXG5AaW1wb3J0ICcuL3JlcXVlc3Qtc2lnbmF0dXJlLnNjc3MnO1xuXG5AaW1wb3J0ICcuL2FjY291bnQtZHJvcGRvd24tbWluaS5zY3NzJztcblxuQGltcG9ydCAnLi9lZGl0YWJsZS1sYWJlbC5zY3NzJztcbiIsIi8qXG4gIEJ1dHRvbnNcbiAqL1xuXG4uYnRuLWdyZWVuIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzAyYzliMTsgLy8gVE9ETzogcmV1c2FibGUgY29sb3IgaW4gY29sb3JzLmNzc1xufVxuXG5idXR0b24uYnRuLWNsZWFyIHtcbiAgYmFja2dyb3VuZDogJHdoaXRlO1xuICBib3JkZXI6IDFweCBzb2xpZDtcbn1cblxuLy8gTm8gbG9uZ2VyIHVzZWQgaW4gZmxhdCBkZXNpZ24sIHJlbW92ZSB3aGVuIG1vZGFsIGJ1dHRvbnMgZG9uZVxuLy8gZGl2LndhbGxldC1idG4ge1xuLy8gICBib3JkZXI6IDFweCBzb2xpZCByZ2IoOTEsIDkzLCAxMDMpO1xuLy8gICBib3JkZXItcmFkaXVzOiAycHg7XG4vLyAgIGhlaWdodDogMzBweDtcbi8vICAgd2lkdGg6IDc1cHg7XG4vLyAgIGZvbnQtc2l6ZTogMC44ZW07XG4vLyAgIHRleHQtYWxpZ246IGNlbnRlcjtcbi8vICAgbGluZS1oZWlnaHQ6IDI1cHg7XG4vLyB9XG5cbi8vIC5idG4tcmVkIHtcbi8vICAgYmFja2dyb3VuZDogcmdiYSgyNTQsIDM1LCAxNywgMSk7XG4vLyAgIGJveC1zaGFkb3c6IDBweCAzcHggNnB4IHJnYmEoMjU0LCAzNSwgMTcsIDAuMzYpO1xuLy8gfVxuXG5idXR0b25bZGlzYWJsZWRdLFxuaW5wdXRbdHlwZT1cInN1Ym1pdFwiXVtkaXNhYmxlZF0ge1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xuICBvcGFjaXR5OiAuNTtcbiAgLy8gYmFja2dyb3VuZDogcmdiYSgxOTcsIDE5NywgMTk3LCAxKTtcbiAgLy8gYm94LXNoYWRvdzogMCAzcHggNnB4IHJnYmEoMTk3LCAxOTcsIDE5NywgLjM2KTtcbn1cblxuLy8gYnV0dG9uLnNwYWNlZCB7XG4vLyAgIG1hcmdpbjogMnB4O1xuLy8gfVxuXG4vLyBidXR0b246bm90KFtkaXNhYmxlZF0pOmhvdmVyLCBpbnB1dFt0eXBlPVwic3VibWl0XCJdOm5vdChbZGlzYWJsZWRdKTpob3ZlciB7XG4vLyAgIHRyYW5zZm9ybTogc2NhbGUoMS4xKTtcbi8vIH1cbi8vIGJ1dHRvbjpub3QoW2Rpc2FibGVkXSk6YWN0aXZlLCBpbnB1dFt0eXBlPVwic3VibWl0XCJdOm5vdChbZGlzYWJsZWRdKTphY3RpdmUge1xuLy8gICB0cmFuc2Zvcm06IHNjYWxlKDAuOTUpO1xuLy8gfVxuXG5idXR0b24ucHJpbWFyeSB7XG4gIHBhZGRpbmc6IDhweCAxMnB4O1xuICBiYWNrZ3JvdW5kOiAjZjc4NjFjO1xuICBib3gtc2hhZG93OiAwIDNweCA2cHggcmdiYSgyNDcsIDEzNCwgMjgsIC4zNik7XG4gIGNvbG9yOiAkd2hpdGU7XG4gIGZvbnQtc2l6ZTogMS4xZW07XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG87XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG59XG5cbi5idG4tbGlnaHQge1xuICBwYWRkaW5nOiA4cHggMTJweDtcbiAgLy8gYmFja2dyb3VuZDogI0ZGRkZGRjsgLy8gJGJnLXdoaXRlXG4gIGJveC1zaGFkb3c6IDAgM3B4IDZweCByZ2JhKDI0NywgMTM0LCAyOCwgLjM2KTtcbiAgY29sb3I6ICM1ODVkNjc7IC8vIFRPRE86IG1ha2UgcmV1c2FibGUgbGlnaHQgYnV0dG9uIGNvbG9yXG4gIGZvbnQtc2l6ZTogMS4xZW07XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG87XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgbGluZS1oZWlnaHQ6IDIwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgYm9yZGVyOiAxcHggc29saWQgIzk3OTc5NzsgLy8gI1RPRE86IG1ha2UgcmV1c2FibGUgbGlnaHQgYm9yZGVyIGNvbG9yXG4gIG9wYWNpdHk6IC41O1xufVxuXG4vLyBUT0RPOiBjbGVhbnVwOiBub3QgdXNlZCBhbnl3aGVyZVxuYnV0dG9uLmJ0bi10aGluIHtcbiAgYm9yZGVyOiAxcHggc29saWQ7XG4gIGJvcmRlci1jb2xvcjogIzRkNGQ0ZDtcbiAgY29sb3I6ICM0ZDRkNGQ7XG4gIGJhY2tncm91bmQ6IHJnYigyNTUsIDE3NCwgNDEpO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIG1pbi13aWR0aDogMjAwcHg7XG4gIG1hcmdpbjogMTJweCAwO1xuICBwYWRkaW5nOiA2cHg7XG4gIGZvbnQtc2l6ZTogMTNweDtcbn1cblxuLmJ0bi1zZWNvbmRhcnkge1xuICBib3JkZXI6IDFweCBzb2xpZCAjOTc5Nzk3O1xuICBib3JkZXItcmFkaXVzOiAycHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICR3aGl0ZTtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBsaW5lLWhlaWdodDogMjRweDtcbiAgcGFkZGluZzogMTZweCA0MnB4O1xuXG4gICZbZGlzYWJsZWRdIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkd2hpdGUgIWltcG9ydGFudDtcbiAgICBvcGFjaXR5OiAuNTtcbiAgfVxufVxuXG4uYnRuLXRlcnRpYXJ5IHtcbiAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgbGluZS1oZWlnaHQ6IDI0cHg7XG4gIHBhZGRpbmc6IDE2cHggNDJweDtcbn1cbiIsIi5hcHAtaGVhZGVyIHtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgdmlzaWJpbGl0eTogdmlzaWJsZTtcbiAgYmFja2dyb3VuZDogJGdhbGxlcnk7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgei1pbmRleDogJGhlYWRlci16LWluZGV4O1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWZsb3c6IGNvbHVtbiBub3dyYXA7XG5cbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNTc1cHgpIHtcbiAgICBwYWRkaW5nOiAxMnB4O1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJveC1zaGFkb3c6IDAgMCAwIDFweCByZ2JhKDAsIDAsIDAsIC4wOCk7XG4gICAgei1pbmRleDogJG1vYmlsZS1oZWFkZXItei1pbmRleDtcbiAgfVxuXG4gIEBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDU3NnB4KSB7XG4gICAgaGVpZ2h0OiA3NXB4O1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuXG4gICAgJjo6YWZ0ZXIge1xuICAgICAgY29udGVudDogJyc7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGhlaWdodDogMzJweDtcbiAgICAgIGJhY2tncm91bmQ6ICRnYWxsZXJ5O1xuICAgICAgYm90dG9tOiAtMzJweDtcbiAgICB9XG4gIH1cblxuICAubWV0YWZveC1pY29uIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbn1cblxuLmFwcC1oZWFkZXItY29udGVudHMge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gIGZsZXgtZmxvdzogcm93IG5vd3JhcDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogNi45dmg7XG5cbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNTc1cHgpIHtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gIH1cblxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA1NzZweCkge1xuICAgIHdpZHRoOiA4NXZ3O1xuICB9XG5cbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNzY5cHgpIHtcbiAgICB3aWR0aDogODB2dztcbiAgfVxuXG4gIEBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDEyODFweCkge1xuICAgIHdpZHRoOiA2NXZ3O1xuICB9XG59XG5cbi5hcHAtaGVhZGVyIGgxIHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bztcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgZm9udC13ZWlnaHQ6IDQwMDtcbiAgY29sb3I6ICMyMjIzMmM7IC8vICRzaGFya1xuICBsaW5lLWhlaWdodDogMjlweDtcblxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA1NzVweCkge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbn1cblxuaDIucGFnZS1zdWJ0aXRsZSB7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIGNvbG9yOiAjYWVhZWFlO1xuICBmb250LXNpemU6IDFlbTtcbiAgbWFyZ2luOiAxMnB4O1xufVxuXG4ubmV0d29yay1jb21wb25lbnQtd3JhcHBlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi5sZWZ0LW1lbnUtd3JhcHBlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLmhlYWRlcl9fcmlnaHQtYWN0aW9ucyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZmxvdzogcm93IG5vd3JhcDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAuaWRlbnRpY29uIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cbn1cbiIsIi5hcHAtZm9vdGVyIHtcbiAgcGFkZGluZy1ib3R0b206IDEwcHg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG4iLCIubmV0d29yay1jb21wb25lbnQtLWRpc2FibGVkIHtcbiAgLy8gYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50O1xuICBjdXJzb3I6IGRlZmF1bHQ7XG5cbiAgLmZhLWNhcmV0LWRvd24ge1xuICAgIG9wYWNpdHk6IDA7XG4gIH1cbn1cblxuLm5ldHdvcmstY29tcG9uZW50LnBvaW50ZXIge1xuICBib3JkZXI6IDFweCBzb2xpZCAkc2hhcms7XG4gIGJvcmRlci1yYWRpdXM6IDgycHg7XG4gIHBhZGRpbmc6IDZweDtcbiAgZmxleDogMCAwIGF1dG87XG5cbiAgJi5ldGhlcmV1bS1uZXR3b3JrIHtcbiAgICBib3JkZXItY29sb3I6IHJnYigzLCAxMzUsIDEzNyk7XG5cbiAgICAubWVudS1pY29uLWNpcmNsZSBkaXYge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgzLCAxMzUsIDEzNywgLjcpICFpbXBvcnRhbnQ7XG4gICAgfVxuICB9XG5cbiAgJi5yb3BzdGVuLXRlc3QtbmV0d29yayB7XG4gICAgYm9yZGVyLWNvbG9yOiByZ2IoMjMzLCAyMSwgODApO1xuXG4gICAgLm1lbnUtaWNvbi1jaXJjbGUgZGl2IHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjMzLCAyMSwgODAsIC43KSAhaW1wb3J0YW50O1xuICAgIH1cbiAgfVxuXG4gICYua292YW4tdGVzdC1uZXR3b3JrIHtcbiAgICBib3JkZXItY29sb3I6IHJnYigxMDUsIDQsIDE1MCk7XG5cbiAgICAubWVudS1pY29uLWNpcmNsZSBkaXYge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgxMDUsIDQsIDE1MCwgLjcpICFpbXBvcnRhbnQ7XG4gICAgfVxuICB9XG5cbiAgJi5yaW5rZWJ5LXRlc3QtbmV0d29yayB7XG4gICAgYm9yZGVyLWNvbG9yOiByZ2IoMjM1LCAxNzksIDYzKTtcblxuICAgIC5tZW51LWljb24tY2lyY2xlIGRpdiB7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDIzNSwgMTc5LCA2MywgLjcpICFpbXBvcnRhbnQ7XG4gICAgfVxuICB9XG59XG5cbi5kcm9wZG93bi1tZW51LWl0ZW0ge1xuICAubWVudS1pY29uLWNpcmNsZSxcbiAgLm1lbnUtaWNvbi1jaXJjbGUtLWFjdGl2ZSB7XG4gICAgbWFyZ2luOiAwIDE0cHg7XG4gIH1cbn1cblxuLm5ldHdvcmstaW5kaWNhdG9yIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZm9udC1zaXplOiAuNmVtO1xuXG4gIC5mYS1jYXJldC1kb3duIHtcbiAgICBsaW5lLWhlaWdodDogMTVweDtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgcGFkZGluZzogMCA0cHg7XG4gIH1cbn1cblxuLm5ldHdvcmstbmFtZSB7XG4gIGxpbmUtaGVpZ2h0OiAxNXB4O1xuICBwYWRkaW5nOiAwIDRweDtcbiAgZm9udC1mYW1pbHk6IFJvYm90bztcbiAgZm9udC1zaXplOiAxMnB4O1xuICBmbGV4OiAxIDAgYXV0bztcbn1cblxuLm5ldHdvcmstZHJvcHBvIHtcbiAgcmlnaHQ6IDJweDtcblxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA1NzZweCkge1xuICAgIHJpZ2h0OiBjYWxjKCgoMTAwJSAtIDg1dncpIC8gMikgKyAycHgpO1xuICB9XG5cbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNzY5cHgpIHtcbiAgICByaWdodDogY2FsYygoKDEwMCUgLSA4MHZ3KSAvIDIpICsgMnB4KTtcbiAgfVxuXG4gIEBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDEyODFweCkge1xuICAgIHJpZ2h0OiBjYWxjKCgoMTAwJSAtIDY1dncpIC8gMikgKyAycHgpO1xuICB9XG59XG5cbi5uZXR3b3JrLW5hbWUtaXRlbSB7XG4gIGZvbnQtd2VpZ2h0OiAxMDA7XG4gIGZsZXg6IDEgMCBhdXRvO1xuICBjb2xvcjogJGR1c3R5LWdyYXk7XG59XG5cbi5uZXR3b3JrLWNoZWNrLFxuLm5ldHdvcmstY2hlY2tfX3RyYW5zcGFyZW50IHtcbiAgY29sb3I6ICR3aGl0ZTtcbiAgbWFyZ2luLWxlZnQ6IDdweDtcbn1cblxuLm5ldHdvcmstY2hlY2tfX3RyYW5zcGFyZW50IHtcbiAgb3BhY2l0eTogMDtcbiAgd2lkdGg6IDE2cHg7XG4gIG1hcmdpbjogMDtcbn1cblxuLm1lbnUtaWNvbi1jaXJjbGUsXG4ubWVudS1pY29uLWNpcmNsZS0tYWN0aXZlIHtcbiAgYmFja2dyb3VuZDogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogMjJweDtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICBtYXJnaW46IDAgNHB4O1xufVxuXG4ubWVudS1pY29uLWNpcmNsZS0tYWN0aXZlIHtcbiAgYm9yZGVyOiAxcHggc29saWQgJHdoaXRlO1xuICBiYWNrZ3JvdW5kOiByZ2JhKDEwMCwgMTAwLCAxMDAsIC40KTtcbn1cblxuLm1lbnUtaWNvbi1jaXJjbGUgZGl2LFxuLm1lbnUtaWNvbi1jaXJjbGUtLWFjdGl2ZSBkaXYge1xuICBoZWlnaHQ6IDEycHg7XG4gIHdpZHRoOiAxMnB4O1xuICBib3JkZXItcmFkaXVzOiAxN3B4O1xufVxuXG4ubWVudS1pY29uLWNpcmNsZS0tYWN0aXZlIGRpdiB7XG4gIG9wYWNpdHk6IDE7XG59XG5cbi5uZXR3b3JrLWRyb3Bkb3duLWhlYWRlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4ubmV0d29yay1kcm9wZG93bi1kaXZpZGVyIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMXB4O1xuICBtYXJnaW46IDEwcHggMDtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHNjb3JwaW9uO1xufVxuXG4ubmV0d29yay1kcm9wZG93bi10aXRsZSB7XG4gIGhlaWdodDogMjVweDtcbiAgd2lkdGg6IDc1cHg7XG4gIGNvbG9yOiAkd2hpdGU7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG87XG4gIGZvbnQtc2l6ZTogMThweDtcbiAgbGluZS1oZWlnaHQ6IDI1cHg7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbn1cblxuLm5ldHdvcmstZHJvcGRvd24tY29udGVudCB7XG4gIGhlaWdodDogMzZweDtcbiAgd2lkdGg6IDI2NXB4O1xuICBjb2xvcjogJGR1c3R5LWdyYXk7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG87XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgbGluZS1oZWlnaHQ6IDE4cHg7XG59XG5cbiIsIi5tb2RhbCA+IGRpdjpmb2N1cyB7XG4gIG91dGxpbmU6IG5vbmUgIWltcG9ydGFudDtcbn1cblxuLy8gQnV5IE1vZGFsXG4uYnV5LW1vZGFsLWNvbnRlbnQge1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LWZhbWlseTogUm9ib3RvO1xuICBwYWRkaW5nOiAwIDE2cHg7XG59XG5cbi5idXktbW9kYWwtY29udGVudC1vcHRpb24ge1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGNvbG9yOiAjNUI1RDY3O1xufVxuXG4ucXItZWxsaXAtYWRkcmVzcywgLmVsbGlwLWFkZHJlc3Mge1xuICB3aWR0aDogMjQ3cHg7XG4gIGJvcmRlcjogbm9uZTtcbiAgZm9udC1mYW1pbHk6IFJvYm90bztcbiAgZm9udC1zaXplOiAxNHB4O1xufVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA1NzVweCkge1xuICAuYnV5LW1vZGFsLWNvbnRlbnQtdGl0bGUtd3JhcHBlciB7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDBweDtcbiAgfVxuXG4gIC5idXktbW9kYWwtY29udGVudC10aXRsZSB7XG4gICAgZm9udC1zaXplOiAyNnB4O1xuICAgIG1hcmdpbi10b3A6IDE1cHg7XG4gIH1cblxuICAuYnV5LW1vZGFsLWNvbnRlbnQtb3B0aW9ucyB7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBwYWRkaW5nOiA1JSAzMyU7XG4gIH1cblxuICAuYnV5LW1vZGFsLWNvbnRlbnQtZm9vdGVyIHtcbiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogNTBweDtcbiAgfVxuXG4gIGRpdi5idXktbW9kYWwtY29udGVudC1vcHRpb24ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICB3aWR0aDogODB2dztcbiAgICBoZWlnaHQ6IDE1dmg7XG4gICAgbWFyZ2luOiAxMHB4O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgJGJsYWNrO1xuICAgIHBhZGRpbmc6IDAlIDclO1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuXG4gICAgZGl2LmJ1eS1tb2RhbC1jb250ZW50LW9wdGlvbi10aXRsZSB7XG4gICAgICBmb250LXNpemU6IDIwcHg7XG4gICAgfVxuXG4gICAgZGl2LmJ1eS1tb2RhbC1jb250ZW50LW9wdGlvbi1zdWJ0aXRsZSB7XG4gICAgICBmb250LXNpemU6IDE2cHg7XG4gICAgfVxuICB9XG59XG5cbkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDU3NnB4KSB7XG4gIC5idXktbW9kYWwtY29udGVudC10aXRsZS13cmFwcGVyIHtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDExMHB4O1xuICB9XG5cbiAgLmJ1eS1tb2RhbC1jb250ZW50LXRpdGxlIHtcbiAgICBmb250LXNpemU6IDI2cHg7XG4gICAgbWFyZ2luLXRvcDogMTVweDtcbiAgfVxuXG4gIC5idXktbW9kYWwtY29udGVudC1mb290ZXIge1xuICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiA1MHB4O1xuICB9XG5cbiAgLmJ1eS1tb2RhbC1jb250ZW50LW9wdGlvbnMge1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgbWFyZ2luOiAyMHB4IDAgNjBweDtcbiAgfVxuXG4gIGRpdi5idXktbW9kYWwtY29udGVudC1vcHRpb24ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICB3aWR0aDogMjB2dztcbiAgICBoZWlnaHQ6IDEyMHB4O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBib3JkZXItcmFkaXVzOiA2cHg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgJGJsYWNrO1xuICAgIG1hcmdpbjogMCA4cHg7XG4gICAgcGFkZGluZzogMThweCAwO1xuXG4gICAgZGl2LmJ1eS1tb2RhbC1jb250ZW50LW9wdGlvbi10aXRsZSB7XG4gICAgICBmb250LXNpemU6IDIwcHg7XG4gICAgICBtYXJnaW4tYm90dG9tOiAxMnB4O1xuXG4gICAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA2NzlweCkge1xuICAgICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICB9XG5cbiAgICAgIEBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDEyODFweCkge1xuICAgICAgICBmb250LXNpemU6IDIwcHg7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZGl2LmJ1eS1tb2RhbC1jb250ZW50LW9wdGlvbi1zdWJ0aXRsZSB7XG4gICAgICBmb250LXNpemU6IDE2cHg7XG4gICAgICBwYWRkaW5nOiAwIDEwcHg7XG4gICAgICBoZWlnaHQ6IDI1JTtcblxuICAgICAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNjc5cHgpIHtcbiAgICAgICAgZm9udC1zaXplOiAxMHB4O1xuICAgICAgICBwYWRkaW5nOiAwIDEwcHg7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDVweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDE1cHg7XG4gICAgICB9XG5cbiAgICAgIEBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDY4MHB4KSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgcGFkZGluZzogMCA0cHg7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDJweDtcbiAgICAgIH1cblxuICAgICAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMTI4MXB4KSB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICAgICAgcGFkZGluZzogMDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBkaXYuYnV5LW1vZGFsLWNvbnRlbnQtZm9vdGVyIHtcbiAgICAgIG1hcmdpbi10b3A6IDh2aDtcbiAgICB9XG4gIH1cbn1cblxuLy8gRWRpdCBBY2NvdW50IE5hbWUgTW9kYWxcbi5lZGl0LWFjY291bnQtbmFtZS1tb2RhbC1jb250ZW50IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5lZGl0LWFjY291bnQtbmFtZS1tb2RhbC1jYW5jZWwge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMTJweDtcbiAgcmlnaHQ6IDIwcHg7XG4gIGZvbnQtc2l6ZTogMjVweDtcbn1cblxuLmVkaXQtYWNjb3VudC1uYW1lLW1vZGFsLXRpdGxlIHtcbiAgbWFyZ2luOiAxNXB4O1xufVxuXG4uZWRpdC1hY2NvdW50LW5hbWUtbW9kYWwtc2F2ZS1idXR0b24ge1xuICB3aWR0aDogMzMlO1xuICBoZWlnaHQ6IDQ1cHg7XG4gIG1hcmdpbjogMTVweDtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgbWFyZ2luLXRvcDogMjVweDtcbn1cblxuLmVkaXQtYWNjb3VudC1uYW1lLW1vZGFsLWlucHV0IHtcbiAgd2lkdGg6IDkwJTtcbiAgaGVpZ2h0OiA1MHB4O1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xuICBtYXJnaW46IDEwcHg7XG4gIHBhZGRpbmc6IDEwcHg7XG4gIGZvbnQtc2l6ZTogMThweDtcbn1cblxuLy8gQWNjb3VudCBNb2RhbCBDb250YWluZXJcbi5hY2NvdW50LW1vZGFsLWNvbnRhaW5lciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBwYWRkaW5nOiA1cHggMCAzMXB4IDA7XG4gIGJvcmRlcjogMXB4IHNvbGlkICRzaWx2ZXI7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgZm9udC1mYW1pbHk6IFJvYm90bztcblxuICBidXR0b24ge1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgfVxufVxuXG4uYWNjb3VudC1tb2RhbC1iYWNrIHtcbiAgY29sb3I6ICRkdXN0eS1ncmF5O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMTNweDtcbiAgbGVmdDogMTdweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuXG4gICZfX3RleHQge1xuICAgIG1hcmdpbi10b3A6IDJweDtcbiAgICBmb250LWZhbWlseTogUm9ib3RvO1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICBsaW5lLWhlaWdodDogMThweDtcbiAgfVxufVxuXG4uYWNjb3VudC1tb2RhbC1jbG9zZTo6YWZ0ZXIge1xuICBjb250ZW50OiAnXFwwMEQ3JztcbiAgZm9udC1zaXplOiA0MHB4O1xuICBjb2xvcjogJGR1c3R5LWdyYXk7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAxMHB4O1xuICByaWdodDogMTJweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uYWNjb3VudC1tb2RhbC1jb250YWluZXIgLmlkZW50aWNvbiB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbGVmdDogMDtcbiAgcmlnaHQ6IDA7XG4gIG1hcmdpbjogMCBhdXRvO1xuICB0b3A6IC0zMnB4O1xuICBtYXJnaW4tYm90dG9tOiAtMzJweDtcbn1cblxuXG4vLyBBY2NvdW50IERldGFpbHMgTW9kYWxcblxuLmFjY291bnQtbW9kYWwtY29udGFpbmVyIHtcblxuICAucXItaGVhZGVyIHtcbiAgICBtYXJnaW4tdG9wOiA5cHg7XG4gICAgZm9udC1zaXplOiAyMHB4O1xuICB9XG5cbiAgLnFyLXdyYXBwZXIge1xuICAgIG1hcmdpbi10b3A6IDVweDtcbiAgfVxuXG4gIC5lbGxpcC1hZGRyZXNzLXdyYXBwZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYm9yZGVyOiAxcHggc29saWQgJGFsdG87XG4gICAgcGFkZGluZzogNXB4IDEwcHg7XG4gICAgZm9udC1mYW1pbHk6IFJvYm90bztcbiAgICBtYXJnaW4tdG9wOiA3cHg7XG4gICAgd2lkdGg6IDI4NnB4O1xuICB9XG5cbiAgLmJ0bi1jbGVhciB7XG4gICAgbWluLWhlaWdodDogMjhweDtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgYm9yZGVyLWNvbG9yOiAkY3VyaW91cy1ibHVlO1xuICAgIGNvbG9yOiAkY3VyaW91cy1ibHVlO1xuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICBmbGV4LWJhc2lzOiAxMDAlO1xuICAgIHdpZHRoOiA3NSU7XG4gICAgbWFyZ2luLXRvcDogMTdweDtcbiAgICBwYWRkaW5nOiAxMHB4IDIycHg7XG4gICAgaGVpZ2h0OiA0NHB4O1xuICAgIHdpZHRoOiAyMzVweDtcbiAgICBmb250LWZhbWlseTogUm9ib3RvO1xuICB9XG59XG5cbi5hY2NvdW50LW1vZGFsLWRpdmlkZXIge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxcHg7XG4gIG1hcmdpbjogMTlweCAwIDhweCAwO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkYWx0bztcbn1cblxuLy8gRXhwb3J0IFByaXZhdGUgS2V5IE1vZGFsXG5cbi5hY2NvdW50LW1vZGFsLWNvbnRhaW5lciAuYWNjb3VudC1uYW1lIHtcbiAgbWFyZ2luLXRvcDogOXB4O1xuICBmb250LXNpemU6IDIwcHg7XG59XG5cbi5hY2NvdW50LW1vZGFsLWNvbnRhaW5lciAubW9kYWwtYm9keS10aXRsZSB7XG4gIG1hcmdpbi10b3A6IDE2cHg7XG4gIG1hcmdpbi1ib3R0b206IDE2cHg7XG4gIGZvbnQtc2l6ZTogMThweDtcbn1cblxuLmFjY291bnQtbW9kYWxfX25hbWUge1xuICBtYXJnaW4tdG9wOiA5cHg7XG4gIGZvbnQtc2l6ZTogMjBweDtcbn1cblxuLnByaXZhdGUta2V5LXBhc3N3b3JkIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbn1cblxuLnByaXZhdGUta2V5LXBhc3N3b3JkLWxhYmVsLCAucHJpdmF0ZS1rZXktcGFzc3dvcmQtZXJyb3Ige1xuICBjb2xvcjogJHNjb3JwaW9uO1xuICBmb250LXNpemU6IDE0cHg7XG4gIGxpbmUtaGVpZ2h0OiAxOHB4O1xuICBtYXJnaW4tYm90dG9tOiAxMHB4O1xufVxuXG4ucHJpdmF0ZS1rZXktcGFzc3dvcmQtZXJyb3Ige1xuICBjb2xvcjogJGNyaW1zb247XG4gIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbi5wcml2YXRlLWtleS1wYXNzd29yZC1pbnB1dCB7XG4gIHBhZGRpbmc6IDEwcHggMCAxM3B4IDE3cHg7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgbGluZS1oZWlnaHQ6IDIxcHg7XG4gIHdpZHRoOiAyOTFweDtcbiAgaGVpZ2h0OiA0NHB4O1xufVxuXG4ucHJpdmF0ZS1rZXktcGFzc3dvcmQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIge1xuICBjb2xvcjogJGR1c3R5LWdyYXk7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG87XG59XG5cbi5wcml2YXRlLWtleS1wYXNzd29yZC13YXJuaW5nIHtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjRkZGNkY2O1xuICBmb250LXNpemU6IDEycHg7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG4gIGxpbmUtaGVpZ2h0OiAxNXB4O1xuICBjb2xvcjogJGNyaW1zb247XG4gIHdpZHRoOiAyOTJweDtcbiAgcGFkZGluZzogOXB4IDE1cHg7XG4gIG1hcmdpbi10b3A6IDE4cHg7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG87XG59XG5cbi5leHBvcnQtcHJpdmF0ZS1rZXktYnV0dG9ucyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuXG4gIC5idG4tY2xlYXIge1xuICAgIHdpZHRoOiAxNDFweDtcbiAgICBoZWlnaHQ6IDU0cHg7XG4gIH1cblxuICAuYnRuLWNhbmNlbCB7XG4gICAgbWFyZ2luLXJpZ2h0OiAxNXB4O1xuICAgIGJvcmRlci1jb2xvcjogJGR1c3R5LWdyYXk7XG4gICAgY29sb3I6ICRzY29ycGlvbjtcbiAgfVxufVxuXG4ucHJpdmF0ZS1rZXktcGFzc3dvcmQtZGlzcGxheS13cmFwcGVyIHtcbiAgaGVpZ2h0OiA4MHB4O1xuICB3aWR0aDogMjkxcHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICRzaWx2ZXI7XG4gIGJvcmRlci1yYWRpdXM6IDJweDtcbn1cblxuLnByaXZhdGUta2V5LXBhc3N3b3JkLWRpc3BsYXktdGV4dGFyZWEge1xuICBjb2xvcjogJGNyaW1zb247XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG87XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgbGluZS1oZWlnaHQ6IDIxcHg7XG4gIGJvcmRlcjogbm9uZTtcbiAgaGVpZ2h0OiA3NXB4O1xuICB3aWR0aDogMTAwJTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgcmVzaXplOiBub25lO1xuICBwYWRkaW5nOiA5cHggMTNweCA4cHg7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIGZvbnQtd2VpZ2h0OiAzMDA7XG59XG5cblxuLy8gTmV3IEFjY291bnQgTW9kYWxcbi5uZXctYWNjb3VudC1tb2RhbC13cmFwcGVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGJvcmRlcjogMXB4IHNvbGlkICRhbHRvO1xuICBib3gtc2hhZG93OiAwIDAgMnB4IDJweCAkYWx0bztcbiAgZm9udC1mYW1pbHk6IFJvYm90bztcbn1cblxuLm5ldy1hY2NvdW50LW1vZGFsLWhlYWRlciB7XG4gIGJhY2tncm91bmQ6ICR3aWxkLXNhbmQ7XG4gIHdpZHRoOiAxMDAlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgcGFkZGluZzogMzBweDtcbiAgZm9udC1zaXplOiAyMnB4O1xuICBjb2xvcjogJG5pbGUtYmx1ZTtcbiAgaGVpZ2h0OiA3OXB4O1xufVxuXG4ubW9kYWwtY2xvc2UteDo6YWZ0ZXIge1xuICBjb250ZW50OiAnXFwwMEQ3JztcbiAgZm9udC1zaXplOiAyZW07XG4gIGNvbG9yOiAkZHVzdHktZ3JheTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDI1cHg7XG4gIHJpZ2h0OiAxNy41cHg7XG4gIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmO1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5uZXctYWNjb3VudC1tb2RhbC1jb250ZW50IHtcbiAgd2lkdGg6IDEwMCU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBtYXJnaW4tdG9wOiAxNXB4O1xuICBmb250LXNpemU6IDE3cHg7XG4gIGNvbG9yOiAkbmlsZS1ibHVlO1xufVxuXG4ubmV3LWFjY291bnQtbW9kYWwtY29udGVudC5hZnRlci1pbnB1dCB7XG4gIG1hcmdpbi10b3A6IDE1cHg7XG4gIGxpbmUtaGVpZ2h0OiAyNXB4O1xufVxuXG4ubmV3LWFjY291bnQtaW5wdXQtd3JhcHBlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIHdpZHRoOiAxMDAlO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgcGFkZGluZy1ib3R0b206IDJweDtcbiAgbWFyZ2luLXRvcDogMTNweDtcbn1cblxuLm5ldy1hY2NvdW50LWlucHV0IHtcbiAgcGFkZGluZzogMTVweDtcbiAgcGFkZGluZy1ib3R0b206IDIwcHg7XG4gIGJvcmRlci1yYWRpdXM6IDhweDtcbiAgYm9yZGVyOiAxcHggc29saWQgJGFsdG87XG4gIHdpZHRoOiAxMDAlO1xuICBmb250LXNpemU6IDFlbTtcbiAgY29sb3I6ICRkdXN0eS1ncmF5O1xuICBmb250LWZhbWlseTogUm9ib3RvO1xuICBmb250LXNpemU6IDE3cHg7XG4gIG1hcmdpbjogMCA2MHB4O1xufVxuXG4vLyBGb3IgcmVmZXJlbmNlIG9uIGJlbG93IHBsYWNlaG9sZGVyIHNlbGVjdG9yczogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjYxMDQ5Ny9jaGFuZ2UtYW4taHRtbDUtaW5wdXRzLXBsYWNlaG9sZGVyLWNvbG9yLXdpdGgtY3NzXG4ubmV3LWFjY291bnQtaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIge1xuICBjb2xvcjogJGR1c3R5LWdyYXk7XG59XG5cbi5uZXctYWNjb3VudC1pbnB1dDotbW96LXBsYWNlaG9sZGVyIHtcbiAgY29sb3I6ICRkdXN0eS1ncmF5O1xuICBvcGFjaXR5OiAxO1xufVxuXG4ubmV3LWFjY291bnQtaW5wdXQ6Oi1tb3otcGxhY2Vob2xkZXIge1xuICBjb2xvcjogJGR1c3R5LWdyYXk7XG4gIG9wYWNpdHk6IDE7XG59XG5cbi5uZXctYWNjb3VudC1pbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXIge1xuICBjb2xvcjogJGR1c3R5LWdyYXk7XG59XG5cbi5uZXctYWNjb3VudC1pbnB1dDo6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHtcbiAgY29sb3I6ICRkdXN0eS1ncmF5O1xufVxuXG4ubmV3LWFjY291bnQtbW9kYWwtY29udGVudC5idXR0b24ge1xuICBtYXJnaW4tdG9wOiAyMnB4O1xuICBtYXJnaW4tYm90dG9tOiAzMHB4O1xuICB3aWR0aDogMTEzcHg7XG4gIGhlaWdodDogNDRweDtcbn1cblxuLm5ldy1hY2NvdW50LW1vZGFsLXdyYXBwZXIgLmJ0bi1jbGVhciB7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgZm9udC13ZWlnaHQ6IDcwMDtcbiAgYmFja2dyb3VuZDogJHdoaXRlO1xuICBib3JkZXI6IDFweCBzb2xpZDtcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xuICBjb2xvcjogJHR1bmRvcmE7XG4gIGZsZXg6IDE7XG59XG5cbi8vIEhpZGUgdG9rZW4gY29uZmlybWF0aW9uXG5cbi5oaWRlLXRva2VuLWNvbmZpcm1hdGlvbiB7XG4gIG1pbi1oZWlnaHQ6IDI1MC43MnB4O1xuICB3aWR0aDogMzc0LjQ5cHg7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZGRjtcbiAgYm94LXNoYWRvdzogMCAxcHggN3B4IDAgcmdiYSgwLDAsMCwwLjUpO1xuXG4gICZfX2NvbnRhaW5lciB7XG4gICAgcGFkZGluZzogMjRweCAyN3B4IDIxcHg7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIH1cblxuICAmX19pZGVudGljb24ge1xuICAgIG1hcmdpbi1ib3R0b206IDEwcHhcbiAgfVxuXG4gICZfX3N5bWJvbCB7XG4gICAgY29sb3I6ICR0dW5kb3JhO1xuICAgIGZvbnQtZmFtaWx5OiBSb2JvdG87XG4gICAgZm9udC1zaXplOiAxNnB4O1xuICAgIGxpbmUtaGVpZ2h0OiAyNHB4O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBtYXJnaW4tYm90dG9tOiA3LjVweDtcbiAgfVxuXG4gICZfX3RpdGxlIHtcbiAgICBoZWlnaHQ6IDMwcHg7XG4gICAgd2lkdGg6IDI3MS4yOHB4O1xuICAgIGNvbG9yOiAkdHVuZG9yYTtcbiAgICBmb250LWZhbWlseTogUm9ib3RvO1xuICAgIGZvbnQtc2l6ZTogMjJweDtcbiAgICBsaW5lLWhlaWdodDogMzBweDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgbWFyZ2luLWJvdHRvbTogMTAuNXB4O1xuICB9XG5cbiAgJl9fY29weSB7XG4gICAgaGVpZ2h0OiA0MXB4O1xuICAgIHdpZHRoOiAzMThweDtcbiAgICBjb2xvcjogJHNjb3JwaW9uO1xuICAgIGZvbnQtZmFtaWx5OiBSb2JvdG87XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGxpbmUtaGVpZ2h0OiAxOHB4O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgfVxuXG4gICZfX2J1dHRvbnMge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBtYXJnaW4tdG9wOiAxNXB4O1xuICAgIHdpZHRoOiAxMDAlO1xuXG4gICAgYnV0dG9uIHtcbiAgICAgIGhlaWdodDogNDRweDtcbiAgICAgIHdpZHRoOiAxMTNweDtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICRzY29ycGlvbjtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICAgIGNvbG9yOiAkdHVuZG9yYTtcbiAgICAgIGZvbnQtZmFtaWx5OiBSb2JvdG87XG4gICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICBsaW5lLWhlaWdodDogMjBweDtcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICAgIG1hcmdpbi1sZWZ0OiA0cHg7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgICB9XG4gIH1cbn1cbiIsIi8qXG4gIE5ld1VJIENvbnRhaW5lciBFbGVtZW50c1xuICovXG5cbi8vIENvbXBvbmVudCBDb2xvcnNcbiR0eC12aWV3LWJnOiAkd2hpdGU7XG4kd2FsbGV0LXZpZXctYmc6ICR3aWxkLXNhbmQ7XG5cbi8vIE1haW4gY29udGFpbmVyXG4ubWFpbi1jb250YWluZXIge1xuICAvLyBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHotaW5kZXg6ICRtYWluLWNvbnRhaW5lci16LWluZGV4O1xuICBmb250LWZhbWlseTogUm9ib3RvO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IHdyYXA7XG4gIGFsaWduLWl0ZW1zOiBzdHJldGNoO1xufVxuXG4ubWFpbi1jb250YWluZXI6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuLy8gdHggdmlld1xuXG4udHgtdmlldyB7XG4gIGZsZXg6IDYzLjUgMCA2Ni41JTtcbiAgYmFja2dyb3VuZDogJHR4LXZpZXctYmc7XG5cbiAgLy8gTm8gdGl0bGUgb24gbW9iaWxlXG4gIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDU3NXB4KSB7XG4gICAgLmlkZW50aWNvbi13cmFwcGVyIHtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuXG4gICAgLmFjY291bnQtbmFtZSB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cbiAgfVxufVxuXG4vLyB3YWxsZXQgdmlldyBhbmQgc2lkZWJhclxuXG4ud2FsbGV0LXZpZXcge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBmbGV4OiAzMy41IDEgMzMuNSU7XG4gIHdpZHRoOiAwO1xuICBiYWNrZ3JvdW5kOiAkd2FsbGV0LXZpZXctYmc7XG4gIHotaW5kZXg6IDIwMDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gIEBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDU3NnB4KSB7XG4gICAgb3ZlcmZsb3cteTogc2Nyb2xsO1xuICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgfVxuXG4gIC53YWxsZXQtdmlldy1hY2NvdW50LWRldGFpbHMge1xuICAgIGZsZXg6IDAgMCBhdXRvO1xuICB9XG5cbiAgJl9fbmFtZS1jb250YWluZXIge1xuICAgIGZsZXg6IDAgMCBhdXRvO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuXG4gICZfX2tleXJpbmctbGFiZWwge1xuICAgIGhlaWdodDogNDBweDtcbiAgICBjb2xvcjogJGR1c3R5LWdyYXk7XG4gICAgZm9udC1mYW1pbHk6IFJvYm90bztcbiAgICBmb250LXNpemU6IDEwcHg7XG4gICAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgcGFkZGluZzogMCAyMHB4O1xuICB9XG5cbiAgJl9fZGV0YWlscy1idXR0b24ge1xuICAgIGNvbG9yOiAkY3VyaW91cy1ibHVlO1xuICAgIGZvbnQtc2l6ZTogMTBweDtcbiAgICBsaW5lLWhlaWdodDogMTNweDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgYm9yZGVyOiAxcHggc29saWQgJGN1cmlvdXMtYmx1ZTtcbiAgICBib3JkZXItcmFkaXVzOiAxMC41cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7XG4gICAgbWFyZ2luOiAwIGF1dG87XG4gICAgcGFkZGluZzogNHB4IDEycHg7XG4gICAgZmxleDogMCAwIGF1dG87XG4gIH1cblxuICAmX19hZGRyZXNzIHtcbiAgICBib3JkZXItcmFkaXVzOiAzcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGFsdG87XG4gICAgY29sb3I6ICRzY29ycGlvbjtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgbGluZS1oZWlnaHQ6IDEycHg7XG4gICAgcGFkZGluZzogNHB4IDEycHg7XG4gICAgbWFyZ2luOiAyNHB4IGF1dG87XG4gICAgZm9udC13ZWlnaHQ6IDMwMDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgZmxleDogMCAwIGF1dG87XG4gIH1cblxuICAmX19zaWRlYmFyLWNsb3NlIHtcblxuICAgIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDU3NXB4KSB7XG4gICAgICAmOjphZnRlciB7XG4gICAgICAgIGNvbnRlbnQ6ICdcXDAwRDcnO1xuICAgICAgICBmb250LXNpemU6IDQwcHg7XG4gICAgICAgIGNvbG9yOiAkdHVuZG9yYTtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICB0b3A6IDEycHg7XG4gICAgICAgIGxlZnQ6IDEycHg7XG4gICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAmX19hZGQtdG9rZW4tYnV0dG9uIHtcbiAgICBmbGV4OiAwIDAgYXV0bztcbiAgICBjb2xvcjogJGR1c3R5LWdyYXk7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGxpbmUtaGVpZ2h0OiAxOXB4O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgICBtYXJnaW46IDM2cHggYXV0bztcbiAgICBib3JkZXI6IDFweCBzb2xpZCAkZHVzdHktZ3JheTtcbiAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgZm9udC13ZWlnaHQ6IDMwMDtcbiAgICBiYWNrZ3JvdW5kOiBub25lO1xuICAgIHBhZGRpbmc6IDlweCAzMHB4O1xuICB9XG59XG5cbkBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDU3NnB4KSB7XG4gIC53YWxsZXQtdmlldzo6LXdlYmtpdC1zY3JvbGxiYXIge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cbn1cblxuLndhbGxldC12aWV3LXRpdGxlLXdyYXBwZXIge1xuICBmbGV4OiAwIDAgMjVweDtcbn1cblxuLndhbGxldC12aWV3LXRpdGxlIHtcbiAgbWFyZ2luLWxlZnQ6IDE1cHg7XG4gIGZvbnQtc2l6ZTogMTZweDtcblxuICAvLyBObyB0aXRsZSBvbiBtb2JpbGVcbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNTc1cHgpIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG59XG5cbi53YWxsZXQtdmlldy5zaWRlYmFyIHtcbiAgZmxleDogMSAwIDIzMHB4O1xuICBiYWNrZ3JvdW5kOiByZ2IoMjUwLCAyNTAsIDI1MCk7XG4gIHotaW5kZXg6ICRzaWRlYmFyLXotaW5kZXg7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiA1NnB4O1xuICBsZWZ0OiAwO1xuICByaWdodDogMDtcbiAgYm90dG9tOiAwO1xuICBvcGFjaXR5OiAxO1xuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtO1xuICBvdmVyZmxvdy15OiBhdXRvO1xuICBib3gtc2hhZG93OiByZ2JhKDAsIDAsIDAsIC4xNSkgMnB4IDJweCA0cHg7XG4gIHdpZHRoOiA4NSU7XG4gIGhlaWdodDogY2FsYygxMDAlIC0gNTZweCk7XG59XG5cbi5zaWRlYmFyLW92ZXJsYXkge1xuICB6LWluZGV4OiAkc2lkZWJhci1vdmVybGF5LXotaW5kZXg7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgLy8gdG9wOiA0MXB4O1xuICBoZWlnaHQ6IDEwMCU7XG4gIHdpZHRoOiAxMDAlO1xuICBsZWZ0OiAwO1xuICByaWdodDogMDtcbiAgYm90dG9tOiAwO1xuICBvcGFjaXR5OiAxO1xuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIC4zKTtcbn1cblxuLy8gbWFpbi1jb250YWluZXIgbWVkaWEgcXVlcmllc1xuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA1NzZweCkge1xuICAubGFwLXZpc2libGUge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gIH1cblxuICAucGhvbmUtdmlzaWJsZSB7XG4gICAgZGlzcGxheTogbm9uZTtcbiAgfVxuXG4gIC5tYWluLWNvbnRhaW5lciB7XG4gICAgLy8gbWFyZ2luLXRvcDogNi45dmg7XG4gICAgd2lkdGg6IDg1JTtcbiAgICBoZWlnaHQ6IDkwdmg7XG4gICAgYm94LXNoYWRvdzogMCAwIDdweCAwIHJnYmEoMCwgMCwgMCwgLjA4KTtcbiAgfVxufVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA3NjlweCkge1xuICAubWFpbi1jb250YWluZXIge1xuICAgIC8vIG1hcmdpbi10b3A6IDYuOXZoO1xuICAgIHdpZHRoOiA4MCU7XG4gICAgaGVpZ2h0OiA4MnZoO1xuICAgIGJveC1zaGFkb3c6IDAgMCA3cHggMCByZ2JhKDAsIDAsIDAsIC4wOCk7XG4gIH1cbn1cblxuQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMTI4MXB4KSB7XG4gIC5tYWluLWNvbnRhaW5lciB7XG4gICAgLy8gbWFyZ2luLXRvcDogNi45dmg7XG4gICAgd2lkdGg6IDY1JTtcbiAgICBoZWlnaHQ6IDgydmg7XG4gICAgYm94LXNoYWRvdzogMCAwIDdweCAwIHJnYmEoMCwgMCwgMCwgLjA4KTtcbiAgfVxufVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA1NzVweCkge1xuICAubGFwLXZpc2libGUge1xuICAgIGRpc3BsYXk6IG5vbmU7XG4gIH1cblxuICAucGhvbmUtdmlzaWJsZSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgfVxuXG4gIC5tYWluLWNvbnRhaW5lciB7XG4gICAgLy8gbWFyZ2luLXRvcDogNDFweDtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkd2hpdGU7XG4gIH1cblxuICBidXR0b24uYnRuLWNsZWFyIHtcbiAgICB3aWR0aDogOTNweDtcbiAgICBoZWlnaHQ6IDUwcHg7XG4gICAgZm9udC1zaXplOiAuN2VtO1xuICAgIGJhY2tncm91bmQ6ICR3aGl0ZTtcbiAgICBib3JkZXI6IDFweCBzb2xpZDtcbiAgfVxufVxuXG4vLyB3YWxsZXQgdmlld1xuLmFjY291bnQtbmFtZSB7XG4gIGZvbnQtc2l6ZTogMjRweDtcbiAgZm9udC13ZWlnaHQ6IDIwMDtcbiAgbGluZS1oZWlnaHQ6IDIwcHg7XG4gIGNvbG9yOiAkc2NvcnBpb247XG4gIG1hcmdpbi10b3A6IDhweDtcbiAgbWFyZ2luLWJvdHRvbTogMjRweDtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHdpZHRoOiAxMDAlO1xuICBwYWRkaW5nOiAwIDhweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xufVxuXG4vLyBhY2NvdW50IG9wdGlvbnMgZHJvcGRvd25cbi5hY2NvdW50LW9wdGlvbnMtbWVudSB7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbiAgbWFyZ2luOiA1JSA3JSAwJTtcbn1cblxuLmZpYXQtYW1vdW50IHtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbn1cblxuLnRva2VuLWJhbGFuY2VfX2Ftb3VudCB7XG4gIHBhZGRpbmctcmlnaHQ6IDZweDtcbn1cbiIsIi5hY2NvdW50LWRyb3Bkb3duLW5hbWUge1xuICBmb250LWZhbWlseTogUm9ib3RvO1xufVxuXG4uYWNjb3VudC1kcm9wZG93bi1iYWxhbmNlIHtcbiAgY29sb3I6ICRkdXN0eS1ncmF5O1xuICBsaW5lLWhlaWdodDogMTlweDtcbn1cblxuLmFjY291bnQtZHJvcGRvd24tZWRpdC1idXR0b24ge1xuICBjb2xvcjogJGR1c3R5LWdyYXk7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG87XG5cbiAgJjpob3ZlciB7XG4gICAgY29sb3I6ICR3aGl0ZTtcbiAgfVxufVxuXG4uYWNjb3VudC1saXN0LWl0ZW0ge1xuICAmX190b3Atcm93IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gICAgbWFyZ2luLWxlZnQ6IDhweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIH1cblxuICAmX19hY2NvdW50LWJhbGFuY2VzIHtcbiAgICBoZWlnaHQ6IGF1dG87XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICAgIGNvbG9yOiAjOWI5YjliO1xuICAgIG1hcmdpbi1sZWZ0OiAzNHB4O1xuICAgIG1hcmdpbi10b3A6IDRweDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIH1cbiAgXG4gICZfX2FjY291bnQtbmFtZSB7XG4gICAgZm9udC1zaXplOiAxNnB4O1xuICAgIG1hcmdpbi1sZWZ0OiA4cHg7XG4gIH1cblxuICAmX19pY29uIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgcmlnaHQ6IDEycHg7XG4gICAgdG9wOiAxcHg7XG4gIH1cblxuICAmX19hY2NvdW50LXByaW1hcnktYmFsYW5jZSxcbiAgJl9fYWNjb3VudC1zZWNvbmRhcnktYmFsYW5jZSB7XG4gICAgZm9udC1mYW1pbHk6IFJvYm90bztcbiAgICBsaW5lLWhlaWdodDogMTZweDtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgZm9udC13ZWlnaHQ6IDMwMDtcbiAgfVxuXG4gICZfX2FjY291bnQtcHJpbWFyeS1iYWxhbmNlIHtcbiAgICBjb2xvcjogJHNjb3JwaW9uO1xuICAgIGJvcmRlcjogbm9uZTtcbiAgICBvdXRsaW5lOiAwICFpbXBvcnRhbnQ7XG4gIH1cblxuICAmX19hY2NvdW50LXNlY29uZGFyeS1iYWxhbmNlIHtcbiAgICBjb2xvcjogJGR1c3R5LWdyYXk7XG4gIH1cblxuICAmX19hY2NvdW50LWFkZHJlc3Mge1xuICAgIG1hcmdpbi1sZWZ0OiAzNXB4O1xuICAgIHdpZHRoOiA4MCU7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgfVxuXG4gICZfX2Ryb3Bkb3duIHtcbiAgICAmOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoJGFsdG8sIC4yKTtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcblxuICAgICAgaW5wdXQge1xuICAgICAgICBiYWNrZ3JvdW5kOiByZ2JhKCRhbHRvLCAuMSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iLCIuc2VuZC1zY3JlZW4td3JhcHBlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZmxvdzogY29sdW1uIG5vd3JhcDtcbiAgei1pbmRleDogMjU7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG87XG5cbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogJGJyZWFrLXNtYWxsKSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgb3ZlcmZsb3cteTogYXV0bztcbiAgfVxuXG4gIHNlY3Rpb24ge1xuICAgIGZsZXg6IDAgMCBhdXRvO1xuICB9XG59XG5cbi5zZW5kLXNjcmVlbi1jYXJkIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgYm94LXNoYWRvdzogMCAycHggNHB4IDAgcmdiYSgwLCAwLCAwLCAuMDgpO1xuICBwYWRkaW5nOiA0NnB4IDQwLjVweCAyNnB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIC8vIHRvcDogLTI2cHg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZmxvdzogY29sdW1uIG5vd3JhcDtcbiAgd2lkdGg6IDQ5OHB4O1xuICBmbGV4OiAxIDAgYXV0bztcblxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAkYnJlYWstc21hbGwpIHtcbiAgICB0b3A6IDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICBwYWRkaW5nOiAxMnB4O1xuICB9XG59XG5cbi8qIFNlbmQgU2NyZWVuICovXG5cbi5zZW5kLXNjcmVlbiBzZWN0aW9uIHtcbiAgbWFyZ2luOiA0cHggMTZweDtcbn1cblxuLnNlbmQtc2NyZWVuIGlucHV0IHtcbiAgd2lkdGg6IDEwMCU7XG4gIGZvbnQtc2l6ZTogMTJweDtcbn1cblxuLnNlbmQtZXRoLWljb24ge1xuICBib3JkZXItcmFkaXVzOiA1MCU7XG4gIHdpZHRoOiA3MHB4O1xuICBoZWlnaHQ6IDcwcHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICRhbHRvO1xuICBib3gtc2hhZG93OiAwIDAgNHB4IDAgcmdiYSgwLCAwLCAwLCAuMik7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAtMzVweDtcbiAgei1pbmRleDogMjU7XG4gIHBhZGRpbmc6IDRweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHdoaXRlO1xuXG4gIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6ICRicmVhay1zbWFsbCkge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB0b3A6IDA7XG4gIH1cbn1cblxuLnNlbmQtc2NyZWVuLWlucHV0LXdyYXBwZXIge1xuICB3aWR0aDogOTUlO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgLmZhLWJvbHQge1xuICAgIHBhZGRpbmctcmlnaHQ6IDRweDtcbiAgfVxuXG4gIC5sYXJnZS1pbnB1dCB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgJGR1c3R5LWdyYXk7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIG1hcmdpbjogNHB4IDAgMjBweDtcbiAgICBmb250LXNpemU6IDE2cHg7XG4gICAgbGluZS1oZWlnaHQ6IDIyLjRweDtcbiAgICBmb250LWZhbWlseTogUm9ib3RvO1xuICB9XG5cbiAgLnNlbmQtc2NyZWVuLWdhcy1pbnB1dCB7XG4gICAgYm9yZGVyOiAxcHggc29saWQgdHJhbnNwYXJlbnQ7XG4gIH1cblxuICAmX19lcnJvci1tZXNzYWdlIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG5cbiAgJi0tZXJyb3Ige1xuICAgIGlucHV0LFxuICAgIC5zZW5kLXNjcmVlbi1nYXMtaW5wdXQge1xuICAgICAgYm9yZGVyLWNvbG9yOiAkcmVkICFpbXBvcnRhbnQ7XG4gICAgfVxuXG4gICAgLnNlbmQtc2NyZWVuLWlucHV0LXdyYXBwZXJfX2Vycm9yLW1lc3NhZ2Uge1xuICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICBib3R0b206IDRweDtcbiAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxMnB4O1xuICAgICAgbGVmdDogOHB4O1xuICAgICAgY29sb3I6ICRyZWQ7XG4gICAgfVxuICB9XG5cbiAgLnNlbmQtc2NyZWVuLWlucHV0LXdyYXBwZXJfX2Vycm9yLW1lc3NhZ2Uge1xuICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBib3R0b206IDRweDtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgbGluZS1oZWlnaHQ6IDEycHg7XG4gICAgbGVmdDogOHB4O1xuICAgIGNvbG9yOiAkcmVkO1xuICB9XG59XG5cbi5zZW5kLXNjcmVlbi1pbnB1dCB7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4uc2VuZC1zY3JlZW4tZ2FzLWlucHV0IHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogNDFweDtcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjNmM2YzO1xuICBib3JkZXItd2lkdGg6IDA7XG4gIGJvcmRlci1zdHlsZTogbm9uZTtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG4gIHBhZGRpbmctcmlnaHQ6IDEycHg7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgY29sb3I6ICRzY29ycGlvbjtcbn1cblxuLnNlbmQtc2NyZWVuLWFtb3VudC1sYWJlbHMge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG59XG5cbi5zZW5kLXNjcmVlbi1nYXMtbGFiZWxzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xufVxuXG4uY3VycmVuY3ktdG9nZ2xlIHtcbiAgJl9faXRlbSB7XG4gICAgY29sb3I6ICRjdXJpb3VzLWJsdWU7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuXG4gICAgJi0tc2VsZWN0ZWQge1xuICAgICAgY29sb3I6ICRibGFjaztcbiAgICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgICB9XG4gIH1cbn1cblxuLnNlbmQtc2NyZWVuLWdhcy1pbnB1dC1jdXN0b21pemUge1xuICBjb2xvcjogJGN1cmlvdXMtYmx1ZTtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5nYXMtdG9vbHRpcC1jbG9zZS1hcmVhIHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHotaW5kZXg6IDEwMDA7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG59XG5cbi5jdXN0b21pemUtZ2FzLXRvb2x0aXAtY29udGFpbmVyIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBib3R0b206IDUwcHg7XG4gIHdpZHRoOiAyMzdweDtcbiAgaGVpZ2h0OiAzMDdweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHdoaXRlO1xuICBvcGFjaXR5OiAxO1xuICBib3gtc2hhZG93OiAkYWx0byAwIDAgNXB4O1xuICB6LWluZGV4OiAxMDUwO1xuICBwYWRkaW5nOiAxM3B4IDE5cHg7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBmb250LWZhbWlseTogXCJMYXRvXCI7XG4gIGZvbnQtd2VpZ2h0OiA1MDA7XG59XG5cbi5nYXMtdG9vbHRpcC1hcnJvdyB7XG4gIGhlaWdodDogMjVweDtcbiAgd2lkdGg6IDI1cHg7XG4gIHotaW5kZXg6IDEyMDA7XG4gIGJhY2tncm91bmQ6ICR3aGl0ZTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0cmFuc2Zvcm06IHJvdGF0ZSg0NWRlZyk7XG4gIGxlZnQ6IDEwN3B4O1xuICB0b3A6IDI5NHB4O1xuICBib3gtc2hhZG93OiAycHggMnB4IDJweCAkYWx0bztcbn1cblxuLmN1c3RvbWl6ZS1nYXMtdG9vbHRpcC1jb250YWluZXIgaW5wdXRbdHlwZT1cIm51bWJlclwiXTo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuLmN1c3RvbWl6ZS1nYXMtdG9vbHRpcC1jb250YWluZXIgaW5wdXRbdHlwZT1cIm51bWJlclwiXTpob3Zlcjo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuLmN1c3RvbWl6ZS1nYXMtdG9vbHRpcCB7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbn1cblxuLmdhcy10b29sdGlwIHtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG5cbi5nYXMtdG9vbHRpcC1sYWJlbCB7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgY29sb3I6ICR0dW5kb3JhO1xufVxuXG4uZ2FzLXRvb2x0aXAtaGVhZGVyIHtcbiAgcGFkZGluZy1ib3R0b206IDEycHg7XG59XG5cbi5nYXMtdG9vbHRpcC1pbnB1dC1sYWJlbCB7XG4gIG1hcmdpbi1ib3R0b206IDVweDtcbn1cblxuLmdhcy10b29sdGlwLWlucHV0LWxhYmVsIGkge1xuICBjb2xvcjogJHNpbHZlci1jaGFsaWNlO1xuICBtYXJnaW4tbGVmdDogNnB4O1xufVxuXG4uY3VzdG9taXplLWdhcy1pbnB1dCB7XG4gIHdpZHRoOiAxNzhweDtcbiAgaGVpZ2h0OiAyOHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCAkYWx0bztcbiAgZm9udC1zaXplOiAxNnB4O1xuICBjb2xvcjogJG5pbGUtYmx1ZTtcbiAgcGFkZGluZy1sZWZ0OiA4cHg7XG59XG5cbi5jdXN0b21pemUtZ2FzLWlucHV0LXdyYXBwZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5nYXMtdG9vbHRpcC1pbnB1dC1kZXRhaWwge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogNHB4O1xuICByaWdodDogMjZweDtcbiAgZm9udC1zaXplOiAxMnB4O1xuICBjb2xvcjogJHNpbHZlci1jaGFsaWNlO1xufVxuXG4uZ2FzLXRvb2x0aXAtaW5wdXQtYXJyb3dzIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDA7XG4gIHJpZ2h0OiA0cHg7XG4gIHdpZHRoOiAxN3B4O1xuICBoZWlnaHQ6IDI4cHg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkYWRhZGE7XG4gIGJvcmRlci1sZWZ0OiAwO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBjb2xvcjogIzliOWI5YjtcbiAgZm9udC1zaXplOiAuOGVtO1xuICBwYWRkaW5nOiAxcHggNHB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi50b2tlbi1nYXMge1xuICAmX19hbW91bnQge1xuICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICBtYXJnaW4tcmlnaHQ6IDRweDtcbiAgfVxuXG4gICZfX3N5bWJvbCB7XG4gICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICB9XG59XG5cbi5zZW5kLXNjcmVlbiB7XG4gICZfX3RpdGxlIHtcbiAgICBjb2xvcjogJHNjb3JwaW9uO1xuICAgIGZvbnQtc2l6ZTogMThweDtcbiAgICBsaW5lLWhlaWdodDogMjlweDtcbiAgfVxuXG4gICZfX3N1YnRpdGxlIHtcbiAgICBtYXJnaW46IDEwcHggMCAyMHB4O1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICBsaW5lLWhlaWdodDogMjRweDtcbiAgfVxuXG4gICZfX3NlbmQtYnV0dG9uLFxuICAmX19jYW5jZWwtYnV0dG9uIHtcbiAgICB3aWR0aDogMTYzcHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB9XG5cbiAgJl9fc2VuZC1idXR0b25fX2Rpc2FibGVkIHtcbiAgICBvcGFjaXR5OiAuNTtcbiAgICBjdXJzb3I6IGF1dG87XG4gIH1cbn1cblxuLnNlbmQtdG9rZW4ge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWZsb3c6IGNvbHVtbiBub3dyYXA7XG4gIHotaW5kZXg6IDI1O1xuICBmb250LWZhbWlseTogUm9ib3RvO1xuXG4gICZfX2NvbnRlbnQge1xuICAgIHdpZHRoOiA0OThweDtcbiAgICBoZWlnaHQ6IDYwNXB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgYm94LXNoYWRvdzogMCAycHggNHB4IDAgcmdiYSgwLCAwLCAwLCAuMDgpO1xuICAgIHBhZGRpbmc6IDQ2cHggNDAuNXB4IDI2cHg7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIC8vIHRvcDogLTI2cHg7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZmxvdzogY29sdW1uIG5vd3JhcDtcbiAgICBmbGV4OiAxIDAgYXV0bztcblxuICAgIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6ICRicmVhay1zbWFsbCkge1xuICAgICAgdG9wOiAwO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBib3gtc2hhZG93OiBub25lO1xuICAgICAgcGFkZGluZzogMTJweDtcbiAgICB9XG4gIH1cblxuICAuaWRlbnRpY29uIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiAtMzVweDtcbiAgICB6LWluZGV4OiAyNTtcblxuICAgIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6ICRicmVhay1zbWFsbCkge1xuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgdG9wOiAwO1xuICAgICAgZmxleDogMCAwIGF1dG87XG4gICAgfVxuICB9XG5cbiAgJl9fdGl0bGUge1xuICAgIGNvbG9yOiAkc2NvcnBpb247XG4gICAgZm9udC1zaXplOiAxOHB4O1xuICAgIGxpbmUtaGVpZ2h0OiAyOXB4O1xuICB9XG5cbiAgJl9fZGVzY3JpcHRpb24sXG4gICZfX2JhbGFuY2UtdGV4dCxcbiAgJl9fdG9rZW4tc3ltYm9sIHtcbiAgICBtYXJnaW4tdG9wOiAxMHB4O1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICBsaW5lLWhlaWdodDogMjRweDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIH1cblxuICAmX190b2tlbi1iYWxhbmNlIHtcbiAgICBmb250LXNpemU6IDQwcHg7XG4gICAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gICAgbWFyZ2luLXRvcDogMTNweDtcblxuICAgIC50b2tlbi1iYWxhbmNlX19hbW91bnQge1xuICAgICAgcGFkZGluZy1yaWdodDogMTJweDtcbiAgICB9XG4gIH1cblxuICAmX19idXR0b24tZ3JvdXAge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1mbG93OiBjb2x1bW4gbm93cmFwO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZmxleDogMCAwIGF1dG87XG5cbiAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAkYnJlYWstc21hbGwpIHtcbiAgICAgIG1hcmdpbi10b3A6IDI0cHg7XG4gICAgfVxuXG4gICAgYnV0dG9uIHtcbiAgICAgIHdpZHRoOiAxNjNweDtcbiAgICB9XG4gIH1cbn1cblxuLmNvbmZpcm0tc2VuZC10b2tlbiB7XG4gICZfX2hlcm8tYW1vdW50LXdyYXBwZXIge1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG59XG5cbi5zZW5kLXYyIHtcbiAgJl9fY29udGFpbmVyIHtcbiAgICAvLyBoZWlnaHQ6IDcwMXB4O1xuICAgIHdpZHRoOiAzODBweDtcbiAgICBib3JkZXItcmFkaXVzOiA4cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHdoaXRlO1xuICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCAwIHJnYmEoMCwgMCwgMCwgLjA4KTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZmxvdzogY29sdW1uIG5vd3JhcDtcbiAgICB6LWluZGV4OiAyNTtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGZvbnQtZmFtaWx5OiBSb2JvdG87XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gICAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogJGJyZWFrLXNtYWxsKSB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIHRvcDogMDtcbiAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgICBmbGV4OiAxIDEgYXV0bztcbiAgICB9XG4gIH1cblxuICAmX19zZW5kLWhlYWRlci1pY29uLWNvbnRhaW5lciB7XG4gICAgei1pbmRleDogMjU7XG5cbiAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAkYnJlYWstc21hbGwpIHtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIHRvcDogMDtcbiAgICB9XG4gIH1cblxuICAmX19zZW5kLWhlYWRlci1pY29uIHtcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgd2lkdGg6IDQ4cHg7XG4gICAgaGVpZ2h0OiA0OHB4O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICRhbHRvO1xuICAgIHotaW5kZXg6IDI1O1xuICAgIHBhZGRpbmc6IDRweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkd2hpdGU7XG4gIH1cblxuICAmX19zZW5kLWFycm93LWljb24ge1xuICAgIGNvbG9yOiAjZjI4OTMwO1xuICAgIHRyYW5zZm9ybTogcm90YXRlKC00NWRlZyk7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogLTJweDtcbiAgICBsZWZ0OiAwO1xuICAgIGZvbnQtc2l6ZTogMS4xMmVtO1xuICB9XG5cbiAgJl9fYXJyb3ctYmFja2dyb3VuZCB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHdoaXRlO1xuICAgIGhlaWdodDogMTRweDtcbiAgICB3aWR0aDogMTRweDtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgdG9wOiA1MnB4O1xuICAgIGxlZnQ6IDE5OXB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDUwJTtcbiAgICB6LWluZGV4OiAxMDA7XG5cbiAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAkYnJlYWstc21hbGwpIHtcbiAgICAgIHRvcDogMzZweDtcbiAgICB9XG4gIH1cblxuICAmX19oZWFkZXIge1xuICAgIGhlaWdodDogODhweDtcbiAgICB3aWR0aDogMzgwcHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJGF0aGVucy1ncmV5O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cbiAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAkYnJlYWstc21hbGwpIHtcbiAgICAgIGhlaWdodDogNTlweDtcbiAgICAgIHdpZHRoOiAxMDB2dztcbiAgICB9XG4gIH1cblxuICAmX19oZWFkZXItdGlwIHtcbiAgICBoZWlnaHQ6IDI1cHg7XG4gICAgd2lkdGg6IDI1cHg7XG4gICAgYmFja2dyb3VuZDogJGF0aGVucy1ncmV5O1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICB0cmFuc2Zvcm06IHJvdGF0ZSg0NWRlZyk7XG4gICAgbGVmdDogMTc4cHg7XG4gICAgdG9wOiA3NXB4O1xuXG4gICAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogJGJyZWFrLXNtYWxsKSB7XG4gICAgICB0b3A6IDQ2cHg7XG4gICAgICBsZWZ0OiAwO1xuICAgICAgcmlnaHQ6IDA7XG4gICAgICBtYXJnaW46IDAgYXV0bztcbiAgICB9XG4gIH1cblxuICAmX190aXRsZSB7XG4gICAgY29sb3I6ICRzY29ycGlvbjtcbiAgICBmb250LXNpemU6IDIycHg7XG4gICAgbGluZS1oZWlnaHQ6IDI5cHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIG1hcmdpbi10b3A6IDI1cHg7XG4gIH1cblxuICAmX19jb3B5IHtcbiAgICBjb2xvcjogJGdyYXk7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGZvbnQtd2VpZ2h0OiAzMDA7XG4gICAgbGluZS1oZWlnaHQ6IDE5cHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIG1hcmdpbi10b3A6IDEwcHg7XG4gICAgd2lkdGg6IDI4N3B4O1xuICB9XG5cbiAgJl9fZXJyb3Ige1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICBsaW5lLWhlaWdodDogMTJweDtcbiAgICBsZWZ0OiA4cHg7XG4gICAgY29sb3I6ICRyZWQ7XG4gIH1cblxuICAmX19lcnJvci1ib3JkZXIge1xuICAgIGNvbG9yOiAkcmVkO1xuICB9XG5cbiAgJl9fZm9ybSB7XG4gICAgbWFyZ2luOiAxM3B4IDA7XG4gICAgd2lkdGg6IDEwMCU7XG5cbiAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAkYnJlYWstc21hbGwpIHtcbiAgICAgIHBhZGRpbmc6IDEzcHggMDtcbiAgICAgIG1hcmdpbjogMDtcbiAgICAgIGhlaWdodDogMDtcbiAgICAgIG92ZXJmbG93LXk6IGF1dG87XG4gICAgICBmbGV4OiAxIDEgYXV0bztcbiAgICB9XG4gIH1cblxuICAmX19mb3JtLWhlYWRlcixcbiAgJl9fZm9ybS1oZWFkZXItY29weSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWZsb3c6IGNvbHVtbjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB9XG5cbiAgJl9fZm9ybS1yb3cge1xuICAgIG1hcmdpbjogMTQuNXB4IDE4cHggMHB4O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZmxvdzogcm93O1xuICAgIGZsZXg6IDEgMCBhdXRvO1xuICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgfVxuXG4gICZfX2Zvcm0tZmllbGQge1xuICAgIGZsZXg6IDEgMSBhdXRvO1xuICB9XG5cbiAgJl9fZm9ybS1sYWJlbCB7XG4gICAgY29sb3I6ICRzY29ycGlvbjtcbiAgICBmb250LWZhbWlseTogUm9ib3RvO1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICBsaW5lLWhlaWdodDogMjJweDtcbiAgICB3aWR0aDogODhweDtcbiAgfVxuXG4gICZfX2Zyb20tZHJvcGRvd24ge1xuICAgIGhlaWdodDogNzNweDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAkYWx0bztcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHdoaXRlO1xuICAgIGZvbnQtZmFtaWx5OiBSb2JvdG87XG4gICAgbGluZS1oZWlnaHQ6IDE2cHg7XG4gICAgZm9udC1zaXplOiAxMnB4O1xuICAgIGNvbG9yOiAkdHVuZG9yYTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgICAmX19jbG9zZS1hcmVhIHtcbiAgICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICAgIHRvcDogMDtcbiAgICAgIGxlZnQ6IDA7XG4gICAgICB6LWluZGV4OiAxMDAwO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgfVxuICAgIFxuICAgICZfX2xpc3Qge1xuICAgICAgei1pbmRleDogMTA1MDtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIGhlaWdodDogMjIwcHg7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICRnZXlzZXI7XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkd2hpdGU7XG4gICAgICBib3gtc2hhZG93OiAwIDNweCA2cHggMCByZ2JhKDAgLDAgLDAgLC4xMSk7XG4gICAgICBtYXJnaW4tdG9wOiAxMXB4O1xuICAgICAgbWFyZ2luLWxlZnQ6IC0xcHg7XG4gICAgICBvdmVyZmxvdy15OiBzY3JvbGw7XG4gICAgfVxuICB9XG5cbiAgJl9fdG8tYXV0b2NvbXBsZXRlIHtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgICAmX19kb3duLWNhcmV0IHtcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHRvcDogMThweDtcbiAgICAgIHJpZ2h0OiAxMnB4O1xuICAgIH1cbiAgfVxuXG4gICZfX3RvLWF1dG9jb21wbGV0ZSwgJl9fbWVtby10ZXh0LWFyZWEge1xuICAgICZfX2lucHV0IHtcbiAgICAgIGhlaWdodDogNTRweDtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgJGFsdG87XG4gICAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkd2hpdGU7XG4gICAgICBjb2xvcjogJGR1c3R5LWdyYXk7XG4gICAgICBwYWRkaW5nOiAxMHB4O1xuICAgICAgZm9udC1mYW1pbHk6IFJvYm90bztcbiAgICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAyMXB4O1xuICAgICAgZm9udC13ZWlnaHQ6IDMwMDtcbiAgICB9XG4gIH1cblxuICAmX19hbW91bnQtbWF4IHtcbiAgICBjb2xvcjogJGN1cmlvdXMtYmx1ZTtcbiAgICBmb250LWZhbWlseTogUm9ib3RvO1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICBsZWZ0OiA4cHg7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgfVxuXG4gICZfX2dhcy1mZWUtZGlzcGxheSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cblxuICAmX19zbGlkZXJzLWljb24tY29udGFpbmVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgaGVpZ2h0OiAyNHB4O1xuICAgIHdpZHRoOiAyNHB4O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICRjdXJpb3VzLWJsdWU7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICR3aGl0ZTtcbiAgICBwYWRkaW5nOiA1cHg7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHJpZ2h0OiAxNXB4O1xuICAgIHRvcDogMTRweDtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gIH1cblxuICAmX19zbGlkZXJzLWljb24ge1xuICAgIGNvbG9yOiAkY3VyaW91cy1ibHVlO1xuICB9XG5cbiAgJl9fbWVtby10ZXh0LWFyZWEge1xuICAgICZfX2lucHV0IHtcbiAgICAgIHBhZGRpbmc6IDZweCAxMHB4O1xuICAgIH1cbiAgfVxuXG4gICZfX2Zvb3RlciB7XG4gICAgaGVpZ2h0OiA5MnB4O1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1ldmVubHk7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgJGFsdG87XG4gICAgYmFja2dyb3VuZDogJHdoaXRlO1xuICAgIHBhZGRpbmc6IDAgMTJweDtcbiAgfVxuXG4gICZfX25leHQtYnRuLFxuICAmX19jYW5jZWwtYnRuLFxuICAmX19uZXh0LWJ0bl9fZGlzYWJsZWQge1xuICAgIHdpZHRoOiAxNjNweDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgaGVpZ2h0OiA1NXB4O1xuICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkd2hpdGU7XG4gICAgZm9udC1mYW1pbHk6IFJvYm90bztcbiAgICBmb250LXNpemU6IDE2cHg7XG4gICAgZm9udC13ZWlnaHQ6IDMwMDtcbiAgICBsaW5lLWhlaWdodDogMjFweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZDtcbiAgICBtYXJnaW46IDAgNHB4O1xuICB9XG5cbiAgJl9fbmV4dC1idG4sXG4gICZfX25leHQtYnRuX19kaXNhYmxlZCB7XG4gICAgY29sb3I6ICRjdXJpb3VzLWJsdWU7XG4gICAgYm9yZGVyLWNvbG9yOiAkY3VyaW91cy1ibHVlO1xuICB9XG5cbiAgJl9fbmV4dC1idG5fX2Rpc2FibGVkIHtcbiAgICBvcGFjaXR5OiAuNTtcbiAgICBjdXJzb3I6IGF1dG87XG4gIH1cblxuICAmX19jYW5jZWwtYnRuIHtcbiAgICBjb2xvcjogJGR1c3R5LWdyYXk7XG4gICAgYm9yZGVyLWNvbG9yOiAkZHVzdHktZ3JheTtcbiAgfVxuXG4gICZfX2N1c3RvbWl6ZS1nYXMge1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNEOEQ4RDg7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7XG4gICAgYm94LXNoYWRvdzogMCAycHggNHB4IDAgcmdiYSgwLDAsMCwwLjE0KTtcbiAgICBmb250LWZhbWlseTogUm9ib3RvO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1mbG93OiBjb2x1bW47XG5cbiAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAkYnJlYWstc21hbGwpIHtcbiAgICAgIHdpZHRoOiAxMDB2dztcbiAgICAgIGhlaWdodDogMTAwdmg7XG4gICAgfVxuXG4gICAgJl9faGVhZGVyIHtcbiAgICAgIGhlaWdodDogNTJweDtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAkYWx0bztcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgICAgZm9udC1zaXplOiAyMnB4O1xuXG4gICAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAkYnJlYWstc21hbGwpIHtcbiAgICAgICAgZmxleDogMCAwIGF1dG87XG4gICAgICB9XG4gICAgfVxuXG4gICAgJl9fdGl0bGUge1xuICAgICAgbWFyZ2luLWxlZnQ6IDE5LjI1cHg7XG4gICAgfVxuXG4gICAgJl9fY2xvc2U6OmFmdGVyIHtcbiAgICAgIGNvbnRlbnQ6ICdcXDAwRDcnO1xuICAgICAgZm9udC1zaXplOiAxLjhlbTtcbiAgICAgIGNvbG9yOiAkZHVzdHktZ3JheTtcbiAgICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmO1xuICAgICAgY3Vyc29yOiBwb2ludGVyO1xuICAgICAgbWFyZ2luLXJpZ2h0OiAxOS4yNXB4O1xuICAgIH1cblxuICAgICZfX2NvbnRlbnQge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZmxvdzogY29sdW1uIG5vd3JhcDtcbiAgICAgIGhlaWdodDogMTAwJTtcbiAgICB9XG5cbiAgICAmX19ib2R5IHtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICBtYXJnaW4tYm90dG9tOiAyNHB4O1xuXG4gICAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAkYnJlYWstc21hbGwpIHtcbiAgICAgICAgZmxleC1mbG93OiBjb2x1bW47XG4gICAgICAgIGZsZXg6IDEgMSBhdXRvO1xuICAgICAgfVxuICAgIH1cblxuICAgICZfX2Zvb3RlciB7XG4gICAgICBoZWlnaHQ6IDc1cHg7XG4gICAgICBib3JkZXItdG9wOiAxcHggc29saWQgJGFsdG87XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIGZvbnQtc2l6ZTogMjJweDtcbiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAgICAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogJGJyZWFrLXNtYWxsKSB7XG4gICAgICAgIGZsZXg6IDAgMCBhdXRvO1xuICAgICAgfVxuICAgIH1cblxuICAgICZfX2J1dHRvbnMge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgICAgIHdpZHRoOiAxODEuNzVweDtcbiAgICAgIG1hcmdpbi1yaWdodDogMjEuMjVweDtcbiAgICB9XG5cbiAgICAmX19yZXZlcnQsICZfX2NhbmNlbCwgJl9fc2F2ZSwgJl9fc2F2ZV9fZXJyb3Ige1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICB9XG5cbiAgICAmX19yZXZlcnQge1xuICAgICAgY29sb3I6ICRzaWx2ZXItY2hhbGljZTtcbiAgICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICAgIG1hcmdpbi1sZWZ0OiAyMS4yNXB4O1xuICAgIH1cblxuICAgICZfX2NhbmNlbCwgJl9fc2F2ZSwgJl9fc2F2ZV9fZXJyb3Ige1xuICAgICAgaGVpZ2h0OiAzNC42NHB4O1xuICAgICAgd2lkdGg6IDg1Ljc0cHg7XG4gICAgICBib3JkZXI6IDFweCBzb2xpZCAkZHVzdHktZ3JheTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICAgIGZvbnQtZmFtaWx5OiAnRElOIE9UJztcbiAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgIGNvbG9yOiAkZHVzdHktZ3JheTtcbiAgICB9XG5cbiAgICAmX19zYXZlX19lcnJvciB7XG4gICAgICBvcGFjaXR5OiAwLjU7XG4gICAgICBjdXJzb3I6IGF1dG87XG4gICAgfVxuXG4gICAgJl9fZXJyb3ItbWVzc2FnZSB7XG4gICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgIHRvcDogNHB4O1xuICAgICAgcmlnaHQ6IDRweDtcbiAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxMnB4O1xuICAgICAgY29sb3I6ICRyZWQ7XG4gICAgfVxuICB9XG5cbiAgJl9fZ2FzLW1vZGFsLWNhcmQge1xuICAgIHdpZHRoOiAzNjBweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZmxvdzogY29sdW1uO1xuICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0O1xuICAgIHBhZGRpbmctbGVmdDogMjBweDtcblxuICAgICZfX3RpdGxlIHtcbiAgICAgIGhlaWdodDogMjZweDtcbiAgICAgIGNvbG9yOiAkdHVuZG9yYTtcbiAgICAgIGZvbnQtZmFtaWx5OiBSb2JvdG87XG4gICAgICBmb250LXNpemU6IDIwcHg7XG4gICAgICBmb250LXdlaWdodDogMzAwO1xuICAgICAgbGluZS1oZWlnaHQ6IDI2cHg7XG4gICAgICBtYXJnaW4tdG9wOiAxN3B4O1xuICAgIH1cblxuICAgICZfX2NvcHkge1xuICAgICAgaGVpZ2h0OiAzOHB4O1xuICAgICAgd2lkdGg6IDMxNHB4O1xuICAgICAgY29sb3I6ICR0dW5kb3JhO1xuICAgICAgZm9udC1mYW1pbHk6IFJvYm90bztcbiAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxOXB4O1xuICAgICAgbWFyZ2luLXRvcDogMTdweDtcbiAgICB9XG5cbiAgICAuY3VzdG9taXplLWdhcy1pbnB1dC13cmFwcGVyIHtcbiAgICAgIG1hcmdpbi10b3A6IDE3cHg7XG4gICAgfVxuXG4gICAgLmN1c3RvbWl6ZS1nYXMtaW5wdXQge1xuICAgICAgaGVpZ2h0OiA1NHB4O1xuICAgICAgd2lkdGg6IDMxNXB4O1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgJGdleXNlcjtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6ICR3aGl0ZTtcbiAgICAgIHBhZGRpbmctbGVmdDogMTVweDtcbiAgICB9XG5cbiAgICAuZ2FzLXRvb2x0aXAtaW5wdXQtYXJyb3dzIHtcbiAgICAgIHdpZHRoOiAzMnB4O1xuICAgICAgaGVpZ2h0OiA1NHB4O1xuICAgICAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZGFkYWRhO1xuICAgICAgZm9udC1zaXplOiAxOHB4O1xuICAgICAgY29sb3I6ICR0dW5kb3JhO1xuICAgICAgcmlnaHQ6IDBweDtcbiAgICAgIHBhZGRpbmc6IDFweCA0cHg7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIH1cblxuICAgIGlucHV0W3R5cGU9XCJudW1iZXJcIl06Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24ge1xuICAgICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICAgICAgZGlzcGxheTogbm9uZTtcbiAgICB9XG5cbiAgICBpbnB1dFt0eXBlPVwibnVtYmVyXCJdOmhvdmVyOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uIHtcbiAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbiAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgfVxuICB9XG59XG4iLCIuY29uZmlybS1zY3JlZW4tY29udGFpbmVyIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBmb250LWZhbWlseTogUm9ib3RvO1xuICBmbGV4OiAwIDAgYXV0bztcbiAgZmxleC1mbG93OiBjb2x1bW4gbm93cmFwO1xuICBib3gtc2hhZG93OiAwIDJweCA0cHggMCByZ2JhKCRibGFjaywgLjA4KTtcbiAgYm9yZGVyLXJhZGl1czogOHB4O1xuXG4gIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDU3NXB4KSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cblxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiA1NzZweCkge1xuICAgIC8vIHRvcDogLTI2cHg7XG4gIH1cbn1cblxuLm5vdGlmaWNhdGlvbiB7XG4gIC5jb25maXJtLXNjcmVlbi13cmFwcGVyIHtcblxuICAgIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6ICRicmVhay1zbWFsbCkge1xuICAgICAgaGVpZ2h0OiBjYWxjKDEwMHZoIC0gODVweCk7XG4gICAgfVxuICB9XG59XG5cbi5jb25maXJtLXNjcmVlbi13cmFwcGVyIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogMzgwcHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICR3aGl0ZTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1mbG93OiBjb2x1bW4gbm93cmFwO1xuICB6LWluZGV4OiAyNTtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZm9udC1mYW1pbHk6IFJvYm90bztcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBvdmVyZmxvdy15OiBhdXRvO1xuICBvdmVyZmxvdy14OiBoaWRkZW47XG4gIGJvcmRlci10b3AtbGVmdC1yYWRpdXM6IDhweDtcbiAgYm9yZGVyLXRvcC1yaWdodC1yYWRpdXM6IDhweDtcblxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAkYnJlYWstc21hbGwpIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICB0b3A6IDA7XG4gICAgYm94LXNoYWRvdzogbm9uZTtcbiAgICBoZWlnaHQ6IGNhbGMoMTAwdmggLSA1OHB4IC0gODVweCk7XG4gICAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMDtcbiAgICBib3JkZXItdG9wLXJpZ2h0LXJhZGl1czogMDtcbiAgfVxufVxuXG4uY29uZmlybS1zY3JlZW4td3JhcHBlciA+IC5jb25maXJtLXNjcmVlbi10b3RhbC1ib3gge1xuICBtYXJnaW4tbGVmdDogMTBweDtcbiAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xufVxuXG4uY29uZmlybS1zY3JlZW4td3JhcHBlciA+IC5jb25maXJtLW1lbW8td3JhcHBlciB7XG4gIG1hcmdpbjogMDtcbn1cblxuLmNvbmZpcm0tc2NyZWVuLWhlYWRlciB7XG4gIGhlaWdodDogODhweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGF0aGVucy1ncmV5O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBmb250LXNpemU6IDIycHg7XG4gIGxpbmUtaGVpZ2h0OiAyOXB4O1xuICB3aWR0aDogMTAwJTtcbiAgcGFkZGluZzogMjVweCAwO1xuICBmbGV4OiAwIDAgYXV0bztcblxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAkYnJlYWstc21hbGwpIHtcbiAgICBmb250LXNpemU6IDIwcHg7XG4gIH1cbn1cblxuLmNvbmZpcm0tc2NyZWVuLWhlYWRlci10aXAge1xuICBoZWlnaHQ6IDI1cHg7XG4gIHdpZHRoOiAyNXB4O1xuICBiYWNrZ3JvdW5kOiAkYXRoZW5zLWdyZXk7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpO1xuICB0b3A6IDcxcHg7XG4gIGxlZnQ6IDA7XG4gIHJpZ2h0OiAwO1xuICBtYXJnaW46IDAgYXV0bztcbn1cblxuLmNvbmZpcm0tc2NyZWVuLXRpdGxlIHtcbiAgbGluZS1oZWlnaHQ6IDI3cHg7XG5cbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogJGJyZWFrLXNtYWxsKSB7XG4gICAgbWFyZ2luLWxlZnQ6IDIycHg7XG4gICAgbWFyZ2luLXJpZ2h0OiA4cHg7XG4gIH1cbn1cblxuLmNvbmZpcm0tc2NyZWVuLWJhY2stYnV0dG9uIHtcbiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7XG4gIGJvcmRlcjogMXB4IHNvbGlkICRjdXJpb3VzLWJsdWU7XG4gIGxlZnQ6IDI0cHg7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjb2xvcjogJGN1cmlvdXMtYmx1ZTtcbiAgcGFkZGluZzogNnB4IDEzcHggN3B4IDEycHg7XG4gIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgaGVpZ2h0OiAzMHB4O1xuICB3aWR0aDogNTRweDtcblxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAkYnJlYWstc21hbGwpIHtcbiAgICBtYXJnaW4tcmlnaHQ6IDEycHg7XG4gIH1cbn1cblxuLmNvbmZpcm0tc2NyZWVuLWFjY291bnQtd3JhcHBlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi5jb25maXJtLXNjcmVlbi1hY2NvdW50LW5hbWUge1xuICBtYXJnaW4tdG9wOiAxMnB4O1xuICBmb250LXNpemU6IDE0cHg7XG4gIGxpbmUtaGVpZ2h0OiAxOXB4O1xuICBjb2xvcjogJHNjb3JwaW9uO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG59XG5cbi5jb25maXJtLXNjcmVlbi1yb3ctaW5mbyB7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgbGluZS1oZWlnaHQ6IDIxcHg7XG59XG5cbi5jb25maXJtLXNjcmVlbi1hY2NvdW50LW51bWJlciB7XG4gIGZvbnQtc2l6ZTogMTBweDtcbiAgbGluZS1oZWlnaHQ6IDE2cHg7XG4gIGNvbG9yOiAkZHVzdHktZ3JheTtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBoZWlnaHQ6IDE2cHg7XG59XG5cbi5jb25maXJtLXNlbmQtZXRoZXIsXG4uY29uZmlybS1zZW5kLXRva2VuIHtcbiAgaS5mYS1hcnJvdy1yaWdodCB7XG4gICAgYWxpZ24tc2VsZjogc3RhcnQ7XG4gICAgbWFyZ2luOiAyNHB4IDE0cHggMCAhaW1wb3J0YW50O1xuICB9XG59XG5cbi5jb25maXJtLXNjcmVlbi1pZGVudGljb25zIHtcbiAgbWFyZ2luLXRvcDogMjRweDtcbiAgZmxleDogMCAwIGF1dG87XG5cbiAgaS5mYS1hcnJvdy1yaWdodCB7XG4gICAgYWxpZ24tc2VsZjogc3RhcnQ7XG4gICAgbWFyZ2luOiA0MnB4IDE0cHggMDtcbiAgfVxuXG4gIGkuZmEtZmlsZS10ZXh0LW8ge1xuICAgIGZvbnQtc2l6ZTogNjBweDtcbiAgICBtYXJnaW46IDE2cHggOHB4IDAgOHB4O1xuICAgIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgfVxufVxuXG4uY29uZmlybS1zY3JlZW4tc2VuZGluZy10by1tZXNzYWdlIHtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LXNpemU6IDE2cHg7XG4gIG1hcmdpbi10b3A6IDMwcHg7XG4gIGZvbnQtZmFtaWx5OiAnRElOIE5FWFQgTGlnaHQnO1xufVxuXG4uY29uZmlybS1zY3JlZW4tc2VuZC1hbW91bnQge1xuICBjb2xvcjogJHNjb3JwaW9uO1xuICBtYXJnaW4tdG9wOiAxMnB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGZvbnQtc2l6ZTogNDBweDtcbiAgZm9udC13ZWlnaHQ6IDMwMDtcbiAgbGluZS1oZWlnaHQ6IDUzcHg7XG4gIGZsZXg6IDAgMCBhdXRvO1xufVxuXG4uY29uZmlybS1zY3JlZW4tc2VuZC1hbW91bnQtY3VycmVuY3kge1xuICBmb250LXNpemU6IDIwcHg7XG4gIGxpbmUtaGVpZ2h0OiAyMHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGZsZXg6IDAgMCBhdXRvO1xufVxuXG4uY29uZmlybS1tZW1vLXdyYXBwZXIge1xuICBtaW4taGVpZ2h0OiAyNHB4O1xuICB3aWR0aDogMTAwJTtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICRhbHRvO1xuICBmbGV4OiAwIDAgYXV0bztcbn1cblxuLmNvbmZpcm0tc2NyZWVuLXNlbmQtbWVtbyB7XG4gIGNvbG9yOiAkc2NvcnBpb247XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgbGluZS1oZWlnaHQ6IDE5cHg7XG4gIGZvbnQtd2VpZ2h0OiA0MDA7XG59XG5cbi5jb25maXJtLXNjcmVlbi1sYWJlbCB7XG4gIGZvbnQtc2l6ZTogMThweDtcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XG4gIGNvbG9yOiAkc2NvcnBpb247XG4gIHRleHQtYWxpZ246IGxlZnQ7XG59XG5cbnNlY3Rpb24gLmNvbmZpcm0tc2NyZWVuLWFjY291bnQtbmFtZSxcbnNlY3Rpb24gLmNvbmZpcm0tc2NyZWVuLWFjY291bnQtbnVtYmVyLFxuLmNvbmZpcm0tc2NyZWVuLXJvdy1pbmZvLFxuLmNvbmZpcm0tc2NyZWVuLXJvdy1kZXRhaWwge1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuXG4uY29uZmlybS1zY3JlZW4tcm93cyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZmxvdzogY29sdW1uIG5vd3JhcDtcbiAgd2lkdGg6IDEwMCU7XG4gIGZsZXg6IDAgMCBhdXRvO1xufVxuXG4uY29uZmlybS1zY3JlZW4tc2VjdGlvbi1jb2x1bW4ge1xuICBmbGV4OiAuNTtcbn1cblxuLmNvbmZpcm0tc2NyZWVuLXJvdyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZmxvdzogcm93IG5vd3JhcDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICRhbHRvO1xuICB3aWR0aDogMTAwJTtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgcGFkZGluZzogMTJweDtcbiAgcGFkZGluZy1sZWZ0OiAzNXB4O1xuICBmb250LXNpemU6IDE2cHg7XG4gIGxpbmUtaGVpZ2h0OiAyMnB4O1xuICBmb250LXdlaWdodDogMzAwO1xufVxuXG4uY29uZmlybS1zY3JlZW4tcm93LWRldGFpbCB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgbGluZS1oZWlnaHQ6IDE2cHg7XG4gIGNvbG9yOiAkZHVzdHktZ3JheTtcbn1cblxuLmNvbmZpcm0tc2NyZWVuLXRvdGFsLWJveCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICR3aWxkLXNhbmQ7XG4gIHBhZGRpbmc6IDIwcHg7XG4gIHBhZGRpbmctbGVmdDogMzVweDtcbiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICRhbHRvO1xuXG4gIC5jb25maXJtLXNjcmVlbi1sYWJlbCB7XG4gICAgbGluZS1oZWlnaHQ6IDE4cHg7XG4gIH1cblxuICAuY29uZmlybS1zY3JlZW4tcm93LWRldGFpbCB7XG4gICAgY29sb3I6ICRzY29ycGlvbjtcbiAgfVxuXG4gICZfX3N1YnRpdGxlIHtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgbGluZS1oZWlnaHQ6IDIycHg7XG4gIH1cblxuICAuY29uZmlybS1zY3JlZW4tcm93LWluZm8ge1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICBmb250LXdlaWdodDogNTAwO1xuICAgIGxpbmUtaGVpZ2h0OiAyMXB4O1xuICB9XG59XG5cbi5jb25maXJtLXNjcmVlbi1jb25maXJtLWJ1dHRvbiB7XG4gIGhlaWdodDogNjJweDtcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDJjOWIxO1xuICBmb250LXNpemU6IDE2cHg7XG4gIGNvbG9yOiAkd2hpdGU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZm9udC1mYW1pbHk6IFJvYm90bztcbiAgcGFkZGluZy10b3A6IDE1cHg7XG4gIHBhZGRpbmctYm90dG9tOiAxNXB4O1xuICBib3JkZXItd2lkdGg6IDA7XG4gIGJveC1zaGFkb3c6IG5vbmU7XG4gIGZsZXg6IDEgMCBhdXRvO1xuICBmb250LXdlaWdodDogMzAwO1xuICBtYXJnaW46IDAgOHB4O1xufVxuXG4uYnRuLWxpZ2h0LmNvbmZpcm0tc2NyZWVuLWNhbmNlbC1idXR0b24ge1xuICBoZWlnaHQ6IDYycHg7XG4gIGJhY2tncm91bmQ6IG5vbmU7XG4gIGJvcmRlcjogbm9uZTtcbiAgb3BhY2l0eTogMTtcbiAgZm9udC1mYW1pbHk6IFJvYm90bztcbiAgYm9yZGVyLXdpZHRoOiAwO1xuICBwYWRkaW5nLXRvcDogMTVweDtcbiAgcGFkZGluZy1ib3R0b206IDE1cHg7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgbGluZS1oZWlnaHQ6IDMycHg7XG4gIGJveC1zaGFkb3c6IG5vbmU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZmxleDogMSAwIGF1dG87XG4gIGZvbnQtd2VpZ2h0OiAzMDA7XG4gIG1hcmdpbjogMCA4cHg7XG59XG5cbiNwZW5kaW5nLXR4LWZvcm0ge1xuICBmbGV4OiAxIDAgYXV0bztcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWZsb3c6IHJvdyBub3dyYXA7XG4gIGJhY2tncm91bmQtY29sb3I6ICR3aGl0ZTtcbiAgcGFkZGluZzogMTJweCAxOHB4O1xuICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiA4cHg7XG4gIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiA4cHg7XG4gIHdpZHRoOiAxMDAlO1xuXG4gIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6ICRicmVhay1zbWFsbCkge1xuICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAkYWx0bztcbiAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwO1xuICAgIGJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOiAwO1xuICB9XG59XG4iLCIubG9hZGluZy1vdmVybGF5IHtcbiAgbGVmdDogMHB4O1xuICB6LWluZGV4OiA1MDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgd2lkdGg6IDEwMCU7XG4gIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44KTtcblxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiA1NzVweCkge1xuICAgIG1hcmdpbi10b3A6IDU2cHg7XG4gICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSA1NnB4KTtcbiAgfVxuXG4gIEBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDU3NnB4KSB7XG4gICAgbWFyZ2luLXRvcDogNzVweDtcbiAgICBoZWlnaHQ6IGNhbGMoMTAwJSAtIDc1cHgpO1xuICB9XG59XG4iLCIuaGVyby1iYWxhbmNlIHtcblxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAkYnJlYWstc21hbGwpIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgbWFyZ2luOiAuM2VtIC45ZW0gMDtcbiAgICAvLyBoZWlnaHQ6IDgwdmg7XG4gICAgLy8gbWF4LWhlaWdodDogMjI1cHg7XG4gICAgZmxleDogMCAwIGF1dG87XG4gIH1cblxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAkYnJlYWstbGFyZ2UpIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgbWFyZ2luOiAyLjhlbSAyLjM3ZW0gLjhlbTtcbiAgfVxuXG4gIC5iYWxhbmNlLWNvbnRhaW5lciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBtYXJnaW46IDA7XG4gICAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG5cbiAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAkYnJlYWstc21hbGwpIHtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICBmbGV4OiAwIDAgYXV0bztcbiAgICB9XG5cbiAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAkYnJlYWstbGFyZ2UpIHtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICBmbGV4LWdyb3c6IDM7XG4gICAgfVxuICB9XG5cbiAgLmJhbGFuY2UtZGlzcGxheSB7XG5cbiAgICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAkYnJlYWstc21hbGwpIHtcbiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjtcblxuICAgICAgLnRva2VuLWFtb3VudCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTc1JTtcbiAgICAgICAgbWFyZ2luLXRvcDogMTIuNSU7XG4gICAgICB9XG5cbiAgICAgIC5maWF0LWFtb3VudCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTE1JTtcbiAgICAgICAgbWFyZ2luLXRvcDogOC41JTtcbiAgICAgICAgY29sb3I6ICNhMGEwYTA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogJGJyZWFrLWxhcmdlKSB7XG4gICAgICBtYXJnaW4tbGVmdDogMyU7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcblxuICAgICAgLnRva2VuLWFtb3VudCB7XG4gICAgICAgIGZvbnQtc2l6ZTogMTM1JTtcbiAgICAgIH1cblxuICAgICAgLmZpYXQtYW1vdW50IHtcbiAgICAgICAgbWFyZ2luLXRvcDogLjI1JTtcbiAgICAgICAgZm9udC1zaXplOiAxMDUlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5iYWxhbmNlLWljb24ge1xuICAgIGJvcmRlci1yYWRpdXM6IDI1cHg7XG4gICAgd2lkdGg6IDQ1cHg7XG4gICAgaGVpZ2h0OiA0NXB4O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICRhbHRvO1xuICB9XG5cbiAgLmhlcm8tYmFsYW5jZS1idXR0b25zIHtcblxuICAgIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6ICRicmVhay1zbWFsbCkge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAvLyBoZWlnaHQ6IDEwMHB4OyAvLyBuZWVkZWQgYSByb3VuZCBudW1iZXIgdG8gc2V0IHRoZSBoZWlnaHRzIG9mIHRoZSBidXR0b25zIGluc2lkZVxuICAgICAgZmxleDogMCAwIGF1dG87XG4gICAgICBwYWRkaW5nOiAxNnB4IDA7XG4gICAgfVxuXG4gICAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogJGJyZWFrLWxhcmdlKSB7XG4gICAgICBmbGV4LWdyb3c6IDI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgIH1cblxuICAgIGJ1dHRvbi5idG4tY2xlYXIge1xuICAgICAgYmFja2dyb3VuZDogJHdoaXRlO1xuICAgICAgYm9yZGVyOiAxcHggc29saWQ7XG4gICAgICBib3JkZXItcmFkaXVzOiAycHg7XG4gICAgICBmb250LXNpemU6IDEycHg7XG5cbiAgICAgIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6ICRicmVhay1zbWFsbCkge1xuICAgICAgICBib3JkZXItY29sb3I6ICRjdXJpb3VzLWJsdWU7XG4gICAgICAgIGNvbG9yOiAkY3VyaW91cy1ibHVlO1xuICAgICAgICBoZWlnaHQ6IDM2cHg7XG4gICAgICB9XG5cbiAgICAgIEBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6ICRicmVhay1sYXJnZSkge1xuICAgICAgICBib3JkZXItY29sb3I6ICRjdXJpb3VzLWJsdWU7XG4gICAgICAgIGNvbG9yOiAkY3VyaW91cy1ibHVlO1xuICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgICB3aWR0aDogODVweDtcbiAgICAgICAgaGVpZ2h0OiAzNHB4O1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiJHdhbGxldC1iYWxhbmNlLWJnOiAjZTdlN2U3O1xuJHdhbGxldC1iYWxhbmNlLWJyZWFrcG9pbnQ6IDg5MHB4O1xuJHdhbGxldC1iYWxhbmNlLWJyZWFrcG9pbnQtcmFuZ2U6IFwic2NyZWVuIGFuZCAobWluLXdpZHRoOiAjeyRicmVhay1sYXJnZX0pIGFuZCAobWF4LXdpZHRoOiAjeyR3YWxsZXQtYmFsYW5jZS1icmVha3BvaW50fSlcIjtcblxuLndhbGxldC1iYWxhbmNlLXdyYXBwZXIge1xuICBmbGV4OiAwIDAgYXV0bztcbiAgdHJhbnNpdGlvbjogbGluZWFyIDIwMG1zO1xuICBiYWNrZ3JvdW5kOiByZ2JhKCR3YWxsZXQtYmFsYW5jZS1iZywgMCk7XG5cbiAgJi0tYWN0aXZlIHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKCR3YWxsZXQtYmFsYW5jZS1iZywgMSk7XG4gIH1cbn1cblxuLndhbGxldC1iYWxhbmNlIHtcbiAgYmFja2dyb3VuZDogaW5oZXJpdDtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBmbGV4OiAwIDAgYXV0bztcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBib3JkZXItdG9wOiAxcHggc29saWQgJHdhbGxldC1iYWxhbmNlLWJnO1xuXG4gIC5iYWxhbmNlLWNvbnRhaW5lciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBtYXJnaW46IDIwcHggMjRweDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGZsZXgtZ3JvdzogMztcblxuICAgIEBtZWRpYSAjeyR3YWxsZXQtYmFsYW5jZS1icmVha3BvaW50LXJhbmdlfSB7XG4gICAgICBtYXJnaW46IDEwJSA0JTtcbiAgICB9XG4gIH1cblxuICAuYmFsYW5jZS1kaXNwbGF5IHtcbiAgICBtYXJnaW4tbGVmdDogMTVweDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG5cbiAgICAudG9rZW4tYW1vdW50IHtcbiAgICAgIGZvbnQtc2l6ZTogMTM1JTtcbiAgICB9XG5cbiAgICAuZmlhdC1hbW91bnQge1xuICAgICAgbWFyZ2luLXRvcDogLjI1JTtcbiAgICAgIGZvbnQtc2l6ZTogMTA1JTtcbiAgICB9XG5cbiAgICBAbWVkaWEgI3skd2FsbGV0LWJhbGFuY2UtYnJlYWtwb2ludC1yYW5nZX0ge1xuICAgICAgbWFyZ2luLWxlZnQ6IDQlO1xuXG4gICAgICAudG9rZW4tYW1vdW50IHtcbiAgICAgICAgZm9udC1zaXplOiAxMDUlO1xuICAgICAgfVxuXG4gICAgICAuZmlhdC1hbW91bnQge1xuICAgICAgICBmb250LXNpemU6IDk1JTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAuYmFsYW5jZS1pY29uIHtcbiAgICBib3JkZXItcmFkaXVzOiAyNXB4O1xuICAgIHdpZHRoOiA0NXB4O1xuICAgIGhlaWdodDogNDVweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAkYWx0bztcbiAgfVxufVxuIiwiLnR4LWxpc3QtY29udGFpbmVyIHtcbiAgaGVpZ2h0OiA4Ny41JTtcblxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAkYnJlYWstbGFyZ2UpIHtcbiAgICBvdmVyZmxvdy15OiBzY3JvbGw7XG4gIH1cbn1cblxuLnR4LWxpc3QtaGVhZGVyIHtcbiAgdGV4dC10cmFuc2Zvcm06IGNhcGl0YWxpemU7XG59XG5cbkBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6ICRicmVhay1zbWFsbCkge1xuICAudHgtbGlzdC1oZWFkZXItd3JhcHBlciB7XG4gICAgbWFyZ2luLXRvcDogLjJlbTtcbiAgICBtYXJnaW4tYm90dG9tOiAuNmVtO1xuICAgIC8vIFRPRE86IFJlc29sdmUgTGF5b3V0IENvbmZsaWNzdCBpbiBXYWxsZXQgVmlld1xuICAgIC8vICAtIFRoaXMgZml4ZXMgdHhsaXN0IFwidHJhbnNhY3Rpb25zXCIgdGl0bGUgZGlzcGF5XG4gICAgLy8gbWFyZ2luLXRvcDogMC4yZW07XG4gICAgLy8gbWFyZ2luLWJvdHRvbTogMC42ZW07XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgZmxleDogMCAwIGF1dG87XG4gIH1cblxuICAudHgtbGlzdC1oZWFkZXIge1xuICAgIGFsaWduLXNlbGY6IGNlbnRlcjtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgY29sb3I6ICRkdXN0eS1ncmF5O1xuICAgIGZvbnQtZmFtaWx5OiBSb2JvdG87XG4gICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgfVxufVxuXG5AbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAkYnJlYWstbGFyZ2UpIHtcbiAgLnR4LWxpc3QtaGVhZGVyLXdyYXBwZXIge1xuICAgIGZsZXg6IDAgMCA1NXB4O1xuICB9XG5cbiAgLnR4LWxpc3QtaGVhZGVyIHtcbiAgICBmb250LXNpemU6IDE2cHg7XG4gICAgbWFyZ2luOiAxLjVlbSAyLjM3ZW07XG4gIH1cblxuICAudHgtbGlzdC1jb250YWluZXI6Oi13ZWJraXQtc2Nyb2xsYmFyIHtcbiAgICBkaXNwbGF5OiBub25lO1xuICB9XG59XG5cbi50eC1saXN0LWNvbnRlbnQtZGl2aWRlciB7XG4gIGhlaWdodDogMXB4O1xuICBiYWNrZ3JvdW5kOiByZ2IoMjMxLCAyMzEsIDIzMSk7XG4gIGZsZXg6IDAgMCAxcHg7XG5cbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogJGJyZWFrLXNtYWxsKSB7XG4gICAgbWFyZ2luOiAuMWVtIDA7XG4gIH1cblxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWluLXdpZHRoOiAkYnJlYWstbGFyZ2UpIHtcbiAgICBtYXJnaW46IC4xZW0gMi4zN2VtO1xuICB9XG59XG5cbi50eC1saXN0LWl0ZW0td3JhcHBlciB7XG4gIGZsZXg6IDEgMSBhdXRvO1xuICB3aWR0aDogMDtcbiAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG4gIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1mbG93OiBjb2x1bW4gbm93cmFwO1xuXG4gIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6ICRicmVhay1zbWFsbCkge1xuICAgIHBhZGRpbmc6IDAgMS4zZW0gLjhlbTtcbiAgfVxuXG4gIEBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6ICRicmVhay1sYXJnZSkge1xuICAgIHBhZGRpbmctYm90dG9tOiAxMnB4O1xuICB9XG59XG5cbi50eC1saXN0LWNsaWNrYWJsZSB7XG4gIGN1cnNvcjogcG9pbnRlcjtcblxuICAmOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kOiByZ2JhKCRhbHRvLCAuMik7XG4gIH1cbn1cblxuLnR4LWxpc3QtcGVuZGluZy1pdGVtLWNvbnRhaW5lciB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgb3BhY2l0eTogLjU7XG59XG5cbi50eC1saXN0LWRhdGUtd3JhcHBlciB7XG4gIGZsZXg6IDEgMSBhdXRvO1xuXG4gIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6ICRicmVhay1zbWFsbCkge1xuICAgIG1hcmdpbi10b3A6IDZweDtcbiAgfVxuXG4gIEBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6ICRicmVhay1sYXJnZSkge1xuICAgIG1hcmdpbi10b3A6IDEycHg7XG4gIH1cbn1cblxuLnR4LWxpc3QtY29udGVudC13cmFwcGVyIHtcbiAgYWxpZ24taXRlbXM6IHN0cmV0Y2g7XG4gIG1hcmdpbi1ib3R0b206IDRweDtcbiAgbWFyZ2luLXRvcDogMnB4O1xuICBmbGV4OiAxIDAgYXV0bztcbiAgd2lkdGg6IDEwMCU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZmxvdzogcm93IG5vd3JhcDtcblxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAkYnJlYWstc21hbGwpIHtcbiAgICBmb250LXNpemU6IDEycHg7XG5cbiAgICAudHgtbGlzdC1zdGF0dXMge1xuICAgICAgZm9udC1zaXplOiAxNHB4ICFpbXBvcnRhbnQ7XG4gICAgfVxuXG4gICAgLnR4LWxpc3QtYWNjb3VudCB7XG4gICAgICBmb250LXNpemU6IDE0cHggIWltcG9ydGFudDtcbiAgICB9XG5cbiAgICAudHgtbGlzdC12YWx1ZSB7XG4gICAgICBmb250LXNpemU6IDE0cHg7XG4gICAgICBsaW5lLWhlaWdodDogMThweDtcbiAgICB9XG5cbiAgICAudHgtbGlzdC1maWF0LXZhbHVlIHtcbiAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxNnB4O1xuICAgIH1cbiAgfVxufVxuXG4udHgtbGlzdC1kYXRlIHtcbiAgY29sb3I6ICRkdXN0eS1ncmF5O1xuICBmb250LXNpemU6IDEycHg7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG87XG59XG5cbi50eC1saXN0LWlkZW50aWNvbi13cmFwcGVyIHtcbiAgYWxpZ24tc2VsZjogY2VudGVyO1xuICBmbGV4OiAwIDAgYXV0bztcbiAgbWFyZ2luLXJpZ2h0OiAxNnB4O1xufVxuXG4udHgtbGlzdC1hY2NvdW50LWFuZC1zdGF0dXMtd3JhcHBlciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXg6IDEgMSBhdXRvO1xuICBmbGV4LWZsb3c6IHJvdyB3cmFwO1xuICB3aWR0aDogMDtcblxuICBAbWVkaWEgc2NyZWVuIGFuZCAobWF4LXdpZHRoOiAkYnJlYWstc21hbGwpIHtcbiAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbiAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICBhbGlnbi1zZWxmOiBjZW50ZXI7XG5cbiAgICAudHgtbGlzdC1hY2NvdW50LXdyYXBwZXIge1xuICAgICAgaGVpZ2h0OiAxOHB4O1xuXG4gICAgICAudHgtbGlzdC1hY2NvdW50IHtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDE0cHg7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogJGJyZWFrLWxhcmdlKSB7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcblxuICAgIC50eC1saXN0LWFjY291bnQtd3JhcHBlciB7XG4gICAgICBmbGV4OiAxLjMgMiBhdXRvO1xuICAgICAgbWluLXdpZHRoOiAxNTNweDtcbiAgICB9XG5cbiAgICAudHgtbGlzdC1zdGF0dXMtd3JhcHBlciB7XG4gICAgICBmbGV4OiA2IDYgYXV0bztcbiAgICB9XG4gIH1cblxuICAudHgtbGlzdC1hY2NvdW50IHtcbiAgICBmb250LXNpemU6IDE2cHg7XG4gICAgY29sb3I6ICRzY29ycGlvbjtcbiAgfVxuXG4gIC50eC1saXN0LXN0YXR1cyB7XG4gICAgY29sb3I6ICRkdXN0eS1ncmF5O1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICB0ZXh0LXRyYW5zZm9ybTogY2FwaXRhbGl6ZTtcbiAgfVxuXG4gIC50eC1saXN0LXN0YXR1cy0tcmVqZWN0ZWQsXG4gIC50eC1saXN0LXN0YXR1cy0tZmFpbGVkIHtcbiAgICBjb2xvcjogJG1vbnpvO1xuICB9XG59XG5cbi50eC1saXN0LWl0ZW0ge1xuICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiKDIzMSwgMjMxLCAyMzEpO1xuICBmbGV4OiAwIDAgYXV0bztcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1mbG93OiByb3cgbm93cmFwO1xuXG4gIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6ICRicmVhay1zbWFsbCkge1xuICAgIC8vIG1hcmdpbjogMCAxLjNlbSAuOTVlbTsgIWltcG9ydGFudFxuICB9XG5cbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogJGJyZWFrLWxhcmdlKSB7XG4gICAgbWFyZ2luOiAwIDIuMzdlbTtcbiAgfVxuXG4gICY6bGFzdC1vZi10eXBlIHtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmdiKDIzMSwgMjMxLCAyMzEpO1xuICAgIG1hcmdpbi1ib3R0b206IDMycHg7XG4gIH1cblxuICAmX193cmFwcGVyIHtcbiAgICBhbGlnbi1zZWxmOiBjZW50ZXI7XG4gICAgZmxleDogMiAyIGF1dG87XG4gICAgY29sb3I6ICRkdXN0eS1ncmF5O1xuXG4gICAgLnR4LWxpc3QtdmFsdWUge1xuICAgICAgZm9udC1zaXplOiAxNnB4O1xuICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgfVxuXG4gICAgLnR4LWxpc3QtdmFsdWUtLWNvbmZpcm1lZCB7XG4gICAgICBjb2xvcjogJGNhcmliYmVhbi1ncmVlbjtcbiAgICB9XG5cbiAgICAudHgtbGlzdC1maWF0LXZhbHVlIHtcbiAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgIHRleHQtYWxpZ246IHJpZ2h0O1xuICAgIH1cbiAgfVxuXG4gICYtLWVtcHR5IHtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgYm9yZGVyLWJvdHRvbTogbm9uZSAhaW1wb3J0YW50O1xuICAgIHBhZGRpbmc6IDE2cHg7XG4gIH1cbn1cblxuLnR4LWxpc3QtZGV0YWlscy13cmFwcGVyIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgZmxleDogMCAwIDM1JTtcbn1cblxuLnR4LWxpc3QtdmFsdWUge1xuICBmb250LXNpemU6IDE2cHg7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnR4LWxpc3QtZmlhdC12YWx1ZSB7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnR4LWxpc3QtdmFsdWUtLWNvbmZpcm1lZCB7XG4gIGNvbG9yOiAkY2FyaWJiZWFuLWdyZWVuO1xufVxuIiwiLy8gT2xkIHNjc3MsIGRvIG5vdCBsaW50IC0gY2xlYW4gdXAgbGF0ZXJcbi8qIHN0eWxlbGludC1kaXNhYmxlICovXG5cblxuLypcbkFwcCBTZWN0aW9uc1xuICBUT0RPOiBNb3ZlIGludG8gc2VwYXJhdGUgZmlsZXMuXG4qL1xuXG4vKiBpbml0aWFsaXplICovXG50ZXh0YXJlYS50d2VsdmUtd29yZC1waHJhc2Uge1xuICBwYWRkaW5nOiAxMnB4O1xuICB3aWR0aDogMzAwcHg7XG4gIGhlaWdodDogMTQwcHg7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgYmFja2dyb3VuZDogJHdoaXRlO1xuICByZXNpemU6IG5vbmU7XG59XG5cbi5pbml0aWFsaXplLXNjcmVlbiBociB7XG4gIHdpZHRoOiA2MHB4O1xuICBtYXJnaW46IDEycHg7XG4gIGJvcmRlci1jb2xvcjogI2Y3ODYxYztcbiAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbn1cblxuLmluaXRpYWxpemUtc2NyZWVuIGxhYmVsIHtcbiAgbWFyZ2luLXRvcDogMjBweDtcbn1cblxuLmluaXRpYWxpemUtc2NyZWVuIGJ1dHRvbi5jcmVhdGUtdmF1bHQge1xuICBtYXJnaW4tdG9wOiA0MHB4O1xufVxuXG4uaW5pdGlhbGl6ZS1zY3JlZW4gLndhcm5pbmcge1xuICBmb250LXNpemU6IDE0cHg7XG4gIG1hcmdpbjogMCAxNnB4O1xufVxuXG4vKiB1bmxvY2sgKi9cbi5lcnJvciB7XG4gIC8vIGNvbG9yOiAjZTIwMjAyO1xuICBjb2xvcjogI2Y3ODYxYztcbiAgbWFyZ2luLWJvdHRvbTogOXB4O1xufVxuXG4ud2FybmluZyB7XG4gIGNvbG9yOiAjZmZhZTAwO1xufVxuXG4ubG9jayB7XG4gIHdpZHRoOiA1MHB4O1xuICBoZWlnaHQ6IDUwcHg7XG59XG5cbi5sb2NrLmxvY2tlZCB7XG4gIHRyYW5zZm9ybTogc2NhbGUoMS41KTtcbiAgb3BhY2l0eTogMDtcbiAgdHJhbnNpdGlvbjogb3BhY2l0eSA0MDBtcyBlYXNlLWluLCB0cmFuc2Zvcm0gNDAwbXMgZWFzZS1pbjtcbn1cblxuLmxvY2sudW5sb2NrZWQge1xuICB0cmFuc2Zvcm06IHNjYWxlKDEpO1xuICBvcGFjaXR5OiAxO1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDUwMG1zIGVhc2Utb3V0LCB0cmFuc2Zvcm0gNTAwbXMgZWFzZS1vdXQsIGJhY2tncm91bmQgMjAwbXMgZWFzZS1pbjtcbn1cblxuLmxvY2subG9ja2VkIC5sb2NrLXRvcCB7XG4gIHRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoMCk7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAyNTBtcyBlYXNlLWluO1xufVxuXG4ubG9jay51bmxvY2tlZCAubG9jay10b3Age1xuICB0cmFuc2Zvcm06IHNjYWxlWCgtMSkgdHJhbnNsYXRlWCgtMTJweCk7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAyNTBtcyBlYXNlLWluO1xufVxuXG4ubG9jay51bmxvY2tlZDpob3ZlciB7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgYmFja2dyb3VuZDogI2U1ZTVlNTtcbiAgYm9yZGVyOiAxcHggc29saWQgI2IxYjFiMTtcbn1cblxuLmxvY2sudW5sb2NrZWQ6YWN0aXZlIHtcbiAgYmFja2dyb3VuZDogI2MzYzNjMztcbn1cblxuLnNlY3Rpb24tdGl0bGUgLmZhLWFycm93LWxlZnQge1xuICBtYXJnaW46IC0ycHggOHB4IDBweCAtOHB4O1xufVxuXG4udW5sb2NrLXNjcmVlbiAjbWV0YW1hc2stbWFzY290LWNvbnRhaW5lciB7XG4gIG1hcmdpbi10b3A6IDI0cHg7XG59XG5cbi51bmxvY2stc2NyZWVuIGgxIHtcbiAgbWFyZ2luLXRvcDogLTI4cHg7XG4gIG1hcmdpbi1ib3R0b206IDQycHg7XG59XG5cbi51bmxvY2stc2NyZWVuIGlucHV0W3R5cGU9cGFzc3dvcmRdIHtcbiAgd2lkdGg6IDI2MHB4O1xufVxuXG4uc2l6aW5nLWlucHV0IHtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBoZWlnaHQ6IDMwcHg7XG4gIHBhZGRpbmctbGVmdDogNXB4O1xufVxuXG4uZWRpdGFibGUtbGFiZWwge1xuICBkaXNwbGF5OiBmbGV4O1xufVxuXG4vKiBXZWJraXQgKi9cblxuLnVubG9jay1zY3JlZW4gaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGZvbnQtc2l6ZTogMS4yZW07XG59XG5cbi8qIEZpcmVmb3ggMTgtICovXG5cbi51bmxvY2stc2NyZWVuIGlucHV0Oi1tb3otcGxhY2Vob2xkZXIge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGZvbnQtc2l6ZTogMS4yZW07XG59XG5cbi8qIEZpcmVmb3ggMTkrICovXG5cbi51bmxvY2stc2NyZWVuIGlucHV0OjotbW96LXBsYWNlaG9sZGVyIHtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBmb250LXNpemU6IDEuMmVtO1xufVxuXG4vKiBJRSAqL1xuXG4udW5sb2NrLXNjcmVlbiBpbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXIge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGZvbnQtc2l6ZTogMS4yZW07XG59XG5cbi8qIGFjY291bnRzICovXG5cbi5hY2NvdW50cy1zZWN0aW9uIHtcbiAgbWFyZ2luOiAwIDBweDtcbn1cblxuLmFjY291bnRzLXNlY3Rpb24gLmhvcml6b250YWwtbGluZSB7XG4gIG1hcmdpbjogMCAxOHB4O1xufVxuXG4uYWNjb3VudHMtbGlzdC1vcHRpb24ge1xuICBoZWlnaHQ6IDEyMHB4O1xufVxuXG4uYWNjb3VudHMtbGlzdC1vcHRpb24gLmlkZW50aWNvbi13cmFwcGVyIHtcbiAgd2lkdGg6IDEwMHB4O1xufVxuXG4udW5jb25mdHgtbGluayB7XG4gIG1hcmdpbi10b3A6IDI0cHg7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxuLnVuY29uZnR4LWxpbmsgLmZhLWFycm93LXJpZ2h0IHtcbiAgbWFyZ2luOiAwIC04cHggMHB4IDhweDtcbn1cblxuLyogaWRlbnRpdHkgcGFuZWwgKi9cblxuLmlkZW50aXR5LXBhbmVsIHtcbiAgZm9udC13ZWlnaHQ6IDUwMDtcbn1cblxuLmlkZW50aXR5LXBhbmVsIC5pZGVudGljb24td3JhcHBlciB7XG4gIG1hcmdpbjogNHB4O1xuICBtYXJnaW4tdG9wOiA4cHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG59XG5cbi5pZGVudGl0eS1wYW5lbCAuaWRlbnRpY29uLXdyYXBwZXIgc3BhbiB7XG4gIG1hcmdpbjogMCBhdXRvO1xufVxuXG4uaWRlbnRpdHktcGFuZWwgLmlkZW50aXR5LWRhdGEge1xuICBtYXJnaW46IDhweCA4cHggOHB4IDE4cHg7XG59XG5cbi5pZGVudGl0eS1wYW5lbCBpIHtcbiAgbWFyZ2luLXRvcDogMzJweDtcbiAgbWFyZ2luLXJpZ2h0OiA2cHg7XG4gIGNvbG9yOiAjYjliOWI5O1xufVxuXG4uaWRlbnRpdHktcGFuZWwgLmFycm93LXJpZ2h0IHtcbiAgcGFkZGluZy1sZWZ0OiAxOHB4O1xuICB3aWR0aDogNDJweDtcbiAgbWluLXdpZHRoOiAxOHB4O1xuICBoZWlnaHQ6IDEwMCU7XG59XG5cbi5pZGVudGl0eS1jb3B5LmZsZXgtY29sdW1uIHtcbiAgZmxleDogLjI1IDAgYXV0bztcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG5cbi8qIGFjY291bnRzIHNjcmVlbiAqL1xuXG4uaWRlbnRpdHktc2VjdGlvbiB7XG59XG5cbi5pZGVudGl0eS1zZWN0aW9uIC5pZGVudGl0eS1wYW5lbCB7XG4gIGJhY2tncm91bmQ6ICNlOWU5ZTk7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjYjFiMWIxO1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5pZGVudGl0eS1zZWN0aW9uIC5pZGVudGl0eS1wYW5lbC5zZWxlY3RlZCB7XG4gIGJhY2tncm91bmQ6ICR3aGl0ZTtcbiAgY29sb3I6ICNmM2M4M2U7XG59XG5cbi5pZGVudGl0eS1zZWN0aW9uIC5pZGVudGl0eS1wYW5lbC5zZWxlY3RlZCAuaWRlbnRpY29uIHtcbiAgYm9yZGVyLWNvbG9yOiAkb3JhbmdlO1xufVxuXG4uaWRlbnRpdHktc2VjdGlvbiAuYWNjb3VudHMtbGlzdC1vcHRpb246aG92ZXIsXG4uaWRlbnRpdHktc2VjdGlvbiAuYWNjb3VudHMtbGlzdC1vcHRpb24uc2VsZWN0ZWQge1xuICBiYWNrZ3JvdW5kOiAkd2hpdGU7XG59XG5cbi8qIGFjY291bnQgZGV0YWlsIHNjcmVlbiAqL1xuXG4uYWNjb3VudC1kZXRhaWwtc2VjdGlvbiB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtd3JhcDogd3JhcDtcbiAgb3ZlcmZsb3cteTogYXV0bztcbiAgZmxleC1kaXJlY3Rpb246IGluaGVyaXQ7XG59XG5cbi5ncm93LXRlbngge1xuICBmbGV4LWdyb3c6IDEwO1xufVxuXG4ubmFtZS1sYWJlbCB7XG59XG5cbi51bmFwcHJvdmVkLXR4LWljb24ge1xuICBoZWlnaHQ6IDE2cHg7XG4gIHdpZHRoOiAxNnB4O1xuICBiYWNrZ3JvdW5kOiByZ2IoNDcsIDE3NCwgMjQ0KTtcbiAgYm9yZGVyLWNvbG9yOiAkc2lsdmVyLWNoYWxpY2U7XG4gIGJvcmRlci1yYWRpdXM6IDEzcHg7XG59XG5cbi5lZGl0LXRleHQge1xuICBoZWlnaHQ6IDEwMCU7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbn1cblxuLmVkaXRpbmctbGFiZWwge1xuICBkaXNwbGF5OiBmbGV4O1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7XG4gIG1hcmdpbi1sZWZ0OiA1MHB4O1xuICBtYXJnaW4tYm90dG9tOiAycHg7XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgdGV4dC1yZW5kZXJpbmc6IGdlb21ldHJpY1ByZWNpc2lvbjtcbiAgY29sb3I6ICNmNzg2MWM7XG59XG5cbi5uYW1lLWxhYmVsOmhvdmVyIC5lZGl0LXRleHQge1xuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xufVxuLyogdHggY29uZmlybSAqL1xuXG4udW5jb25mdHgtc2VjdGlvbiBpbnB1dFt0eXBlPXBhc3N3b3JkXSB7XG4gIGhlaWdodDogMjJweDtcbiAgcGFkZGluZzogMnB4O1xuICBtYXJnaW46IDEycHg7XG4gIG1hcmdpbi1ib3R0b206IDI0cHg7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgYm9yZGVyOiAycHggc29saWQgI2YzYzgzZTtcbiAgYmFja2dyb3VuZDogI2ZhZjZmMDtcbn1cblxuLyogRXRoZXIgQmFsYW5jZSBXaWRnZXQgKi9cblxuLmV0aGVyLWJhbGFuY2UtYW1vdW50IHtcbiAgY29sb3I6ICNmNzg2MWM7XG59XG5cbi5ldGhlci1iYWxhbmNlLWxhYmVsIHtcbiAgY29sb3I6ICNhYmE5YWE7XG59XG5cbi8qIEluZm8gc2NyZWVuICovXG4uaW5mby1ncmF5IHtcbiAgZm9udC1mYW1pbHk6IFJvYm90bztcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbiAgY29sb3I6ICRzaWx2ZXItY2hhbGljZTtcbn1cblxuLmljb24tc2l6ZSB7XG4gIHdpZHRoOiAyMHB4O1xufVxuXG4uaW5mbyB7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIEFyaWFsO1xuICBwYWRkaW5nLWJvdHRvbTogMTBweDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBwYWRkaW5nLWxlZnQ6IDVweDtcbn1cblxuLyogYnV5IGV0aCB3YXJuaW5nIHNjcmVlbiAqL1xuLmN1c3RvbS1yYWRpb3Mge1xuICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbn1cblxuLmN1c3RvbS1yYWRpby1zZWxlY3RlZCB7XG4gIHdpZHRoOiAxN3B4O1xuICBoZWlnaHQ6IDE3cHg7XG4gIGJvcmRlcjogc29saWQ7XG4gIGJvcmRlci1zdHlsZTogZG91YmxlO1xuICBib3JkZXItcmFkaXVzOiAxNXB4O1xuICBib3JkZXItd2lkdGg6IDVweDtcbiAgYmFja2dyb3VuZDogcmdiYSgyNDcsIDEzNCwgMjgsIDEpO1xuICBib3JkZXItY29sb3I6ICNmN2Y3Zjc7XG59XG5cbi5jdXN0b20tcmFkaW8taW5hY3RpdmUge1xuICB3aWR0aDogMTRweDtcbiAgaGVpZ2h0OiAxNHB4O1xuICBib3JkZXI6IHNvbGlkO1xuICBib3JkZXItd2lkdGg6IDFweDtcbiAgYm9yZGVyLXJhZGl1czogMjRweDtcbiAgYm9yZGVyLWNvbG9yOiAkc2lsdmVyLWNoYWxpY2U7XG59XG5cbi5yYWRpby10aXRsZXMge1xuICBjb2xvcjogcmdiYSgyNDcsIDEzNCwgMjgsIDEpO1xufVxuXG4uZXRoLXdhcm5pbmcge1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDQwMG1zIGVhc2UtaW4sIHRyYW5zZm9ybSA0MDBtcyBlYXNlLWluO1xufVxuXG4uYnV5LXN1YnZpZXcge1xuICB0cmFuc2l0aW9uOiBvcGFjaXR5IDQwMG1zIGVhc2UtaW4sIHRyYW5zZm9ybSA0MDBtcyBlYXNlLWluO1xufVxuXG4uaW5wdXQtY29udGFpbmVyOmhvdmVyIC5lZGl0LXRleHQge1xuICB2aXNpYmlsaXR5OiB2aXNpYmxlO1xufVxuXG4uYnV5LWlucHV0cyB7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG87XG4gIGZvbnQtc2l6ZTogMTNweDtcbiAgaGVpZ2h0OiAyMHB4O1xuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm9yZGVyOiBzb2xpZDtcbiAgYm9yZGVyLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYm9yZGVyLXdpZHRoOiAuNXB4O1xuICBib3JkZXItcmFkaXVzOiAycHg7XG59XG5cbi5pbnB1dC1jb250YWluZXI6aG92ZXIgLmJ1eS1pbnB1dHMge1xuICBib3gtc2l6aW5nOiBpbmhlcml0O1xuICBib3JkZXI6IHNvbGlkO1xuICBib3JkZXItY29sb3I6ICNmNzg2MWM7XG4gIGJvcmRlci13aWR0aDogLjVweDtcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xufVxuXG4uYnV5LWlucHV0czpmb2N1cyB7XG4gIGJvcmRlcjogc29saWQ7XG4gIGJvcmRlci1jb2xvcjogI2Y3ODYxYztcbiAgYm9yZGVyLXdpZHRoOiAuNXB4O1xuICBib3JkZXItcmFkaXVzOiAycHg7XG59XG5cbi5hY3RpdmVGb3JtIHtcbiAgYmFja2dyb3VuZDogI2Y3ZjdmNztcbiAgYm9yZGVyOiBub25lO1xuICBib3JkZXItcmFkaXVzOiA4cHggOHB4IDBweCAwcHg7XG4gIHdpZHRoOiA1MCU7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgcGFkZGluZy1ib3R0b206IDRweDtcbn1cblxuLmluYWN0aXZlRm9ybSB7XG4gIGJvcmRlcjogbm9uZTtcbiAgYm9yZGVyLXJhZGl1czogOHB4IDhweCAwcHggMHB4O1xuICB3aWR0aDogNTAlO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHBhZGRpbmctYm90dG9tOiA0cHg7XG59XG5cbi5leC1jb2lucyB7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG87XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZm9udC1zaXplOiAzM3B4O1xuICB3aWR0aDogMTE4cHg7XG4gIGhlaWdodDogNDJweDtcbiAgcGFkZGluZzogMXB4O1xuICBjb2xvcjogIzRkNGQ0ZDtcbn1cblxuLm1hcmtldGluZm8ge1xuICBmb250LWZhbWlseTogUm9ib3RvO1xuICBjb2xvcjogJHNpbHZlci1jaGFsaWNlO1xuICBmb250LXNpemU6IDE1cHg7XG4gIGxpbmUtaGVpZ2h0OiAxN3B4O1xufVxuXG4jZnJvbUNvaW46Oi13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvciB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbiNjb2luTGlzdCB7XG4gIHdpZHRoOiA0MDBweDtcbiAgaGVpZ2h0OiA1MDBweDtcbiAgb3ZlcmZsb3c6IHNjcm9sbDtcbn1cblxuLmljb24tY29udHJvbCAuZmEtcmVmcmVzaCB7XG4gIHZpc2liaWxpdHk6IGhpZGRlbjtcbn1cblxuLmljb24tY29udHJvbDpob3ZlciAuZmEtcmVmcmVzaCB7XG4gIHZpc2liaWxpdHk6IHZpc2libGU7XG59XG5cbi5pY29uLWNvbnRyb2w6aG92ZXIgLmZhLWNoZXZyb24tcmlnaHQge1xuICB2aXNpYmlsaXR5OiBoaWRkZW47XG59XG5cbi5pbmFjdGl2ZSB7XG4gIGNvbG9yOiAkc2lsdmVyLWNoYWxpY2U7XG59XG5cbi5pbmFjdGl2ZSBidXR0b24ge1xuICBiYWNrZ3JvdW5kOiAkc2lsdmVyLWNoYWxpY2U7XG4gIGNvbG9yOiAkd2hpdGU7XG59XG5cbi5xci1lbGxpcC1hZGRyZXNzLCAuZWxsaXAtYWRkcmVzcyB7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xufVxuXG4ucXItaGVhZGVyIHtcbiAgZm9udC1zaXplOiAyNXB4O1xuICBtYXJnaW4tdG9wOiA0MHB4O1xufVxuXG4ucXItbWVzc2FnZSB7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgY29sb3I6ICNmNzg2MWM7XG59XG5cbmRpdi5tZXNzYWdlLWNvbnRhaW5lciA+IGRpdjpmaXJzdC1jaGlsZCB7XG4gIG1hcmdpbi10b3A6IDE4cHg7XG4gIGZvbnQtc2l6ZTogMTVweDtcbiAgY29sb3I6ICM0ZDRkNGQ7XG59XG5cbi5wb3AtaG92ZXI6aG92ZXIge1xuICB0cmFuc2Zvcm06IHNjYWxlKDEuMSk7XG59XG5cbi8qIHN0eWxlbGludC1lbmFibGUgKi9cbiIsIiR3YWxsZXQtYmFsYW5jZS1icmVha3BvaW50OiA4OTBweDtcbiR3YWxsZXQtYmFsYW5jZS1icmVha3BvaW50LXJhbmdlOiBcInNjcmVlbiBhbmQgKG1pbi13aWR0aDogI3skYnJlYWstbGFyZ2V9KSBhbmQgKG1heC13aWR0aDogI3skd2FsbGV0LWJhbGFuY2UtYnJlYWtwb2ludH0pXCI7XG5cbi50b2tlbi1saXN0LWl0ZW0ge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWZsb3c6IHJvdyBub3dyYXA7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIHBhZGRpbmc6IDIwcHggMjRweDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB0cmFuc2l0aW9uOiBsaW5lYXIgMjAwbXM7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoJHdhbGxldC1iYWxhbmNlLWJnLCAwKTtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gICZfX3Rva2VuLWJhbGFuY2Uge1xuICAgIGZvbnQtc2l6ZTogMTMwJTtcblxuICAgIEBtZWRpYSAjeyR3YWxsZXQtYmFsYW5jZS1icmVha3BvaW50LXJhbmdlfSB7XG4gICAgICBmb250LXNpemU6IDEwNSU7XG4gICAgfVxuICB9XG5cbiAgJl9fZmlhdC1hbW91bnQge1xuICAgIG1hcmdpbi10b3A6IC4yNSU7XG4gICAgZm9udC1zaXplOiAxMDUlO1xuICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG5cbiAgICBAbWVkaWEgI3skd2FsbGV0LWJhbGFuY2UtYnJlYWtwb2ludC1yYW5nZX0ge1xuICAgICAgZm9udC1zaXplOiA5NSU7XG4gICAgfVxuICB9XG5cbiAgQG1lZGlhICN7JHdhbGxldC1iYWxhbmNlLWJyZWFrcG9pbnQtcmFuZ2V9IHtcbiAgICBwYWRkaW5nOiAxMCUgNCU7XG4gIH1cblxuICAmLS1hY3RpdmUge1xuICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoJHdhbGxldC1iYWxhbmNlLWJnLCAxKTtcbiAgfVxuXG4gICZfX2lkZW50aWNvbiB7XG4gICAgbWFyZ2luLXJpZ2h0OiAxNXB4O1xuICAgIGJvcmRlcjogJzFweCBzb2xpZCAjZGVkZWRlJztcblxuICAgIEBtZWRpYSAjeyR3YWxsZXQtYmFsYW5jZS1icmVha3BvaW50LXJhbmdlfSB7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDQlO1xuICAgIH1cbiAgfVxuXG4gICZfX2VsbGlwc2lzIHtcbiAgICAvLyBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgLy8gdG9wOiAyMHB4O1xuICAgIC8vIHJpZ2h0OiAyNHB4O1xuICAgIGxpbmUtaGVpZ2h0OiA0NXB4O1xuICB9XG5cbiAgJl9fYmFsYW5jZS13cmFwcGVyIHtcbiAgICBmbGV4OiAxIDEgYXV0bztcbiAgfVxufVxuXG4udG9rZW4tbWVudS1kcm9wZG93biB7XG4gIGhlaWdodDogNTVweDtcbiAgd2lkdGg6IDE5MXB4O1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwwLDAsMC44Mik7XG4gIGJveC1zaGFkb3c6IDAgMnB4IDRweCAwIHJnYmEoMCwwLDAsMC41KTtcbiAgcG9zaXRpb246IGZpeGVkO1xuICBtYXJnaW4tdG9wOiAyMHB4O1xuICBtYXJnaW4tbGVmdDogMTA1cHg7XG4gIHotaW5kZXg6IDIwMDA7XG5cbiAgJl9fY2xvc2UtYXJlYSB7XG4gICAgcG9zaXRpb246IGZpeGVkO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHotaW5kZXg6IDIxMDA7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIGN1cnNvcjogZGVmYXVsdDtcbiAgfVxuXG4gICZfX2NvbnRhaW5lciB7XG4gICAgcGFkZGluZzogMTZweCAzNHB4IDMycHg7XG4gICAgei1pbmRleDogMjIwMDtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIH1cblxuICAmX19vcHRpb25zIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIH1cblxuICAmX19vcHRpb24ge1xuICAgIGNvbG9yOiAkd2hpdGU7XG4gICAgZm9udC1mYW1pbHk6IFJvYm90bztcbiAgICBmb250LXNpemU6IDE2cHg7XG4gICAgbGluZS1oZWlnaHQ6IDIxcHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB9XG59IiwiLmFkZC10b2tlbiB7XG4gIHdpZHRoOiA0OThweDtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1mbG93OiBjb2x1bW4gbm93cmFwO1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHotaW5kZXg6IDEyO1xuICBmb250LWZhbWlseTogJ0RJTiBOZXh0IExpZ2h0JztcblxuICAmX193cmFwcGVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkd2hpdGU7XG4gICAgYm94LXNoYWRvdzogMCAycHggNHB4IDAgcmdiYSgkYmxhY2ssIC4wOCk7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWZsb3c6IGNvbHVtbiBub3dyYXA7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBmbGV4OiAwIDAgYXV0bztcbiAgfVxuXG4gICZfX3RpdGxlLWNvbnRhaW5lciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWZsb3c6IGNvbHVtbiBub3dyYXA7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBwYWRkaW5nOiAzMHB4IDYwcHggMTJweDtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJGdhbGxlcnk7XG4gICAgZmxleDogMCAwIGF1dG87XG4gIH1cblxuICAmX190aXRsZSB7XG4gICAgY29sb3I6ICRzY29ycGlvbjtcbiAgICBmb250LXNpemU6IDIwcHg7XG4gICAgbGluZS1oZWlnaHQ6IDI2cHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGZvbnQtd2VpZ2h0OiA2MDA7XG4gICAgbWFyZ2luLWJvdHRvbTogMTJweDtcbiAgfVxuXG4gICZfX2Rlc2NyaXB0aW9uIHtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIH1cblxuICAmX19kZXNjcmlwdGlvbiArICZfX2Rlc2NyaXB0aW9uIHtcbiAgICBtYXJnaW4tdG9wOiAyNHB4O1xuICB9XG5cbiAgJl9fY29uZmlybWF0aW9uLWRlc2NyaXB0aW9uIHtcbiAgICBtYXJnaW46IDEycHggMDtcbiAgfVxuXG4gICZfX2NvbnRlbnQtY29udGFpbmVyIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgJGdhbGxlcnk7XG4gIH1cblxuICAmX19pbnB1dC1jb250YWluZXIge1xuICAgIHBhZGRpbmc6IDExcHggMDtcbiAgICB3aWR0aDogMjYzcHg7XG4gICAgbWFyZ2luOiAwIGF1dG87XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB9XG5cbiAgJl9fc2VhcmNoLWlucHV0LWVycm9yLW1lc3NhZ2Uge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBib3R0b206IC0xMHB4O1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcztcbiAgICBvdmVyZmxvdzogaGlkZGVuO1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgY29sb3I6ICRyZWQ7XG4gIH1cblxuICAmX19pbnB1dCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgYm9yZGVyOiAycHggc29saWQgJGdhbGxlcnk7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIHBhZGRpbmc6IDVweCAxNXB4O1xuICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICBsaW5lLWhlaWdodDogMTlweDtcblxuICAgICY6OnBsYWNlaG9sZGVyIHtcbiAgICAgIGNvbG9yOiAkc2lsdmVyO1xuICAgIH1cbiAgfVxuXG4gICZfX2Zvb3RlcnMge1xuICAgIHdpZHRoOiAxMDAlO1xuICB9XG5cbiAgJl9fYWRkLWN1c3RvbSB7XG4gICAgY29sb3I6ICRzY29ycGlvbjtcbiAgICBmb250LXNpemU6IDE4cHg7XG4gICAgbGluZS1oZWlnaHQ6IDI0cHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIHBhZGRpbmc6IDEycHggMDtcbiAgICBmb250LXdlaWdodDogNjAwO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcblxuICAgICY6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgwLCAwLCAwLCAuMDUpO1xuICAgIH1cblxuICAgICY6YWN0aXZlIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgLjEpO1xuICAgIH1cblxuICAgIC5mYSB7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICByaWdodDogMjRweDtcbiAgICAgIGZvbnQtc2l6ZTogMjRweDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4O1xuICAgIH1cbiAgfVxuXG4gICZfX2FkZC1jdXN0b20tZm9ybSB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWZsb3c6IGNvbHVtbiBub3dyYXA7XG4gICAgbWFyZ2luOiA4cHggMCA1MXB4O1xuICB9XG5cbiAgJl9fYWRkLWN1c3RvbS1maWVsZCB7XG4gICAgd2lkdGg6IDI5MHB4O1xuICAgIG1hcmdpbjogMCBhdXRvO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAgICYtLWVycm9yIHtcbiAgICAgIC5hZGQtdG9rZW5fX2FkZC1jdXN0b20taW5wdXQge1xuICAgICAgICBib3JkZXItY29sb3I6ICRyZWQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgJl9fYWRkLWN1c3RvbS1lcnJvci1tZXNzYWdlIHtcbiAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgYm90dG9tOiAtMjFweDtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIGNvbG9yOiAkcmVkO1xuICB9XG5cbiAgJl9fYWRkLWN1c3RvbS1sYWJlbCB7XG4gICAgZm9udC1zaXplOiAxNnB4O1xuICAgIGxpbmUtaGVpZ2h0OiAyMXB4O1xuICAgIG1hcmdpbi1ib3R0b206IDhweDtcbiAgfVxuXG4gICZfX2FkZC1jdXN0b20taW5wdXQge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICRzaWx2ZXI7XG4gICAgcGFkZGluZzogNXB4IDE1cHg7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICAgIGxpbmUtaGVpZ2h0OiAxOXB4O1xuXG4gICAgJjo6cGxhY2Vob2xkZXIge1xuICAgICAgY29sb3I6ICRzaWx2ZXI7XG4gICAgfVxuICB9XG5cbiAgJl9fYWRkLWN1c3RvbS1maWVsZCArICZfX2FkZC1jdXN0b20tZmllbGQge1xuICAgIG1hcmdpbi10b3A6IDIxcHg7XG4gIH1cblxuICAmX19idXR0b25zIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZmxvdzogY29sdW1uIG5vd3JhcDtcbiAgICBtYXJnaW46IDMwcHggMCA1MXB4O1xuICAgIGZsZXg6IDAgMCBhdXRvO1xuICB9XG5cbiAgJl9fdG9rZW4taWNvbnMtY29udGFpbmVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZmxvdzogcm93IHdyYXA7XG4gIH1cblxuICAmX190b2tlbi13cmFwcGVyIHtcbiAgICB0cmFuc2l0aW9uOiAyMDBtcyBlYXNlLWluLW91dDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZmxvdzogcm93IG5vd3JhcDtcbiAgICBmbGV4OiAwIDAgNDIuNSU7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICBwYWRkaW5nOiAxMnB4O1xuICAgIG1hcmdpbjogMi41JTtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7XG4gICAgY3Vyc29yOiBwb2ludGVyO1xuICAgIGJvcmRlcjogMnB4IHNvbGlkIHRyYW5zcGFyZW50O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcblxuICAgICY6aG92ZXIge1xuICAgICAgYm9yZGVyOiAycHggc29saWQgcmdiYSgkbWFsaWJ1LWJsdWUsIC41KTtcbiAgICB9XG5cbiAgICAmLS1zZWxlY3RlZCB7XG4gICAgICBib3JkZXI6IDJweCBzb2xpZCAkbWFsaWJ1LWJsdWUgIWltcG9ydGFudDtcbiAgICB9XG5cbiAgICAmLS1kaXNhYmxlZCB7XG4gICAgICBvcGFjaXR5OiAuNDtcbiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lO1xuICAgIH1cbiAgfVxuXG4gICZfX3Rva2VuLWRhdGEge1xuICAgIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7XG4gIH1cblxuICAmX190b2tlbi1uYW1lIHtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgbGluZS1oZWlnaHQ6IDE5cHg7XG4gIH1cblxuICAmX190b2tlbi1zeW1ib2wge1xuICAgIGZvbnQtc2l6ZTogMjJweDtcbiAgICBsaW5lLWhlaWdodDogMjlweDtcbiAgICBmb250LXdlaWdodDogNjAwO1xuICB9XG5cbiAgJl9fdG9rZW4taWNvbiB7XG4gICAgd2lkdGg6IDYwcHg7XG4gICAgaGVpZ2h0OiA2MHB4O1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgYmFja2dyb3VuZC1zaXplOiBjb250YWluO1xuICAgIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlcjtcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogJHdoaXRlO1xuICAgIGJveC1zaGFkb3c6IDAgMnB4IDRweCAwIHJnYmEoJGJsYWNrLCAuMjQpO1xuICAgIG1hcmdpbi1yaWdodDogMTJweDtcbiAgICBmbGV4OiAwIDAgYXV0bztcbiAgfVxuXG4gICZfX3Rva2VuLW1lc3NhZ2Uge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBjb2xvcjogJGNhcmliYmVhbi1ncmVlbjtcbiAgICBmb250LXNpemU6IDExcHg7XG4gICAgYm90dG9tOiAwO1xuICAgIGxlZnQ6IDg1cHg7XG4gIH1cblxuICAmX19jb25maXJtYXRpb24tdG9rZW4tbGlzdCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWZsb3c6IGNvbHVtbiBub3dyYXA7XG5cbiAgICAudG9rZW4tYmFsYW5jZSB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1mbG93OiByb3cgbm93cmFwO1xuICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7XG5cbiAgICAgICZfX2Ftb3VudCB7XG4gICAgICAgIGNvbG9yOiAkc2NvcnBpb247XG4gICAgICAgIGZvbnQtc2l6ZTogNDNweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IDMwMDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDQzcHg7XG4gICAgICAgIG1hcmdpbi1yaWdodDogOHB4O1xuICAgICAgfVxuXG4gICAgICAmX19zeW1ib2wge1xuICAgICAgICBjb2xvcjogJHNjb3JwaW9uO1xuICAgICAgICBmb250LXNpemU6IDE2cHg7XG4gICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gICZfX2NvbmZpcm1hdGlvbi10aXRsZSB7XG4gICAgcGFkZGluZzogMzBweCAxMjBweCAxMnB4O1xuXG4gICAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogJGJyZWFrLXNtYWxsKSB7XG4gICAgICBwYWRkaW5nOiAyMHB4IDA7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG4gIH1cblxuICAmX19jb25maXJtYXRpb24tY29udGVudCB7XG4gICAgcGFkZGluZy1ib3R0b206IDYwcHg7XG4gIH1cblxuICAmX19jb25maXJtYXRpb24tdG9rZW4tbGlzdC1pdGVtIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZmxvdzogcm93IG5vd3JhcDtcbiAgICBtYXJnaW46IDAgYXV0bztcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB9XG5cbiAgJl9fY29uZmlybWF0aW9uLXRva2VuLWxpc3QtaXRlbSArICZfX2NvbmZpcm1hdGlvbi10b2tlbi1saXN0LWl0ZW0ge1xuICAgIG1hcmdpbi10b3A6IDMwcHg7XG4gIH1cblxuICAmX19jb25maXJtYXRpb24tdG9rZW4taWNvbiB7XG4gICAgbWFyZ2luLXJpZ2h0OiAxOHB4O1xuICB9XG5cbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogJGJyZWFrLXNtYWxsKSB7XG4gICAgdG9wOiAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgaGVpZ2h0OiAxMDAlO1xuXG4gICAgJl9fd3JhcHBlciB7XG4gICAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7XG4gICAgICBmbGV4OiAxIDEgYXV0bztcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICB9XG5cbiAgICAmX19mb290ZXJzIHtcbiAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAkZ2FsbGVyeTtcbiAgICB9XG5cbiAgICAmX190b2tlbi1pY29uIHtcbiAgICAgIHdpZHRoOiA1MHB4O1xuICAgICAgaGVpZ2h0OiA1MHB4O1xuICAgIH1cblxuICAgICZfX3Rva2VuLXN5bWJvbCB7XG4gICAgICBmb250LXNpemU6IDE4cHg7XG4gICAgICBsaW5lLWhlaWdodDogMjRweDtcbiAgICB9XG5cbiAgICAmX190b2tlbi1uYW1lIHtcbiAgICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICAgIGxpbmUtaGVpZ2h0OiAxNnB4O1xuICAgIH1cblxuICAgICZfX2J1dHRvbnMge1xuICAgICAgZmxleC1mbG93OiByb3cgbm93cmFwO1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICBwYWRkaW5nOiAxMnB4IDA7XG4gICAgICBtYXJnaW46IDA7XG4gICAgICBib3JkZXItdG9wOiAxcHggc29saWQgJGdhbGxlcnk7XG5cbiAgICAgIGJ1dHRvbiB7XG4gICAgICAgIGZsZXg6IDEgMCBhdXRvO1xuICAgICAgICBtYXJnaW46IDAgMTJweDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsIi5jdXJyZW5jeS1kaXNwbGF5IHtcbiAgaGVpZ2h0OiA1NHB4O1xuICB3aWR0aDogMTAwJcOfO1xuICBib3JkZXI6IDFweCBzb2xpZCAkYWx0bztcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkd2hpdGU7XG4gIGNvbG9yOiAkZHVzdHktZ3JheTtcbiAgZm9udC1mYW1pbHk6IFJvYm90bztcbiAgZm9udC1zaXplOiAxNnB4O1xuICBmb250LXdlaWdodDogMzAwO1xuICBwYWRkaW5nOiA4cHggMTBweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuXG4gICZfX3ByaW1hcnktcm93IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICB9XG5cbiAgJl9faW5wdXQge1xuICAgIGNvbG9yOiAkc2NvcnBpb247XG4gICAgZm9udC1mYW1pbHk6IFJvYm90bztcbiAgICBmb250LXNpemU6IDE2cHg7XG4gICAgbGluZS1oZWlnaHQ6IDIycHg7XG4gICAgYm9yZGVyOiBub25lO1xuICAgIG91dGxpbmU6IDAgIWltcG9ydGFudDtcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG4gIH1cblxuICAmX19wcmltYXJ5LWN1cnJlbmN5IHtcbiAgICBjb2xvcjogJHNjb3JwaW9uO1xuICAgIGZvbnQtd2VpZ2h0OiA0MDA7XG4gICAgZm9udC1mYW1pbHk6IFJvYm90bztcbiAgICBmb250LXNpemU6IDE2cHg7XG4gICAgbGluZS1oZWlnaHQ6IDIycHg7XG4gIH1cblxuICAmX19jb252ZXJ0ZWQtcm93IHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICB9XG5cbiAgJl9fY29udmVydGVkLXZhbHVlLFxuICAmX19jb252ZXJ0ZWQtY3VycmVuY3kge1xuICAgIGNvbG9yOiAkZHVzdHktZ3JheTtcbiAgICBmb250LWZhbWlseTogUm9ib3RvO1xuICAgIGZvbnQtc2l6ZTogMTJweDtcbiAgICBsaW5lLWhlaWdodDogMTJweDtcbiAgfVxuXG4gICZfX2lucHV0LXdyYXBwZXIge1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICB9XG5cbiAgJl9fY3VycmVuY3ktc3ltYm9sIHtcbiAgICBtYXJnaW4tdG9wOiAxcHg7XG4gIH1cbn0iLCIuYWNjb3VudC1tZW51IHtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB6LWluZGV4OiAxMDA7XG4gIHRvcDogNThweDtcbiAgd2lkdGg6IDMxMHB4O1xuXG4gIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDU3NXB4KSB7XG4gICAgcmlnaHQ6IGNhbGMoKCgxMDB2dyAtIDEwMCUpIC8gMikgKyA4cHgpO1xuICB9XG5cbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNTc2cHgpIHtcbiAgICByaWdodDogY2FsYygoMTAwdncgLSA4NXZ3KSAvIDIpO1xuICB9XG5cbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogNzY5cHgpIHtcbiAgICByaWdodDogY2FsYygoMTAwdncgLSA4MHZ3KSAvIDIpO1xuICB9XG5cbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMTI4MXB4KSB7XG4gICAgcmlnaHQ6IGNhbGMoKDEwMHZ3IC0gNjV2dykgLyAyKTtcbiAgfVxuXG4gICZfX2ljb24ge1xuICAgIG1hcmdpbi1sZWZ0OiAyMHB4O1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgfVxuXG4gICZfX2hlYWRlciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWZsb3c6IHJvdyBub3dyYXA7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIH1cblxuICAmX19sb2dvdXQtYnV0dG9uIHtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAkZHVzdHktZ3JheTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgICBjb2xvcjogJHdoaXRlO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBmb250LXNpemU6IDEycHg7XG4gICAgbGluZS1oZWlnaHQ6IDIzcHg7XG4gICAgcGFkZGluZzogMCAyNHB4O1xuICAgIGZvbnQtd2VpZ2h0OiAyMDA7XG4gIH1cblxuICBpbWcge1xuICAgIHdpZHRoOiAxNnB4O1xuICAgIGhlaWdodDogMTZweDtcbiAgfVxuXG4gICZfX2FjY291bnRzIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZmxvdzogY29sdW1uIG5vd3JhcDtcbiAgICBvdmVyZmxvdy15OiBhdXRvO1xuICAgIG1heC1oZWlnaHQ6IDI0MHB4O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB6LWluZGV4OiAyMDA7XG5cbiAgICAmOjotd2Via2l0LXNjcm9sbGJhciB7XG4gICAgICBkaXNwbGF5OiBub25lO1xuICAgIH1cblxuICAgIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDU3NXB4KSB7XG4gICAgICBtYXgtaGVpZ2h0OiAyMTVweDtcbiAgICB9XG5cbiAgICAua2V5cmluZy1sYWJlbCB7XG4gICAgICBtYXJnaW4tdG9wOiA1cHg7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkYmxhY2s7XG4gICAgICBjb2xvcjogJGR1c3R5LWdyYXk7XG4gICAgfVxuICB9XG5cbiAgJl9fYWNjb3VudCB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWZsb3c6IHJvdyBub3dyYXA7XG4gICAgcGFkZGluZzogMTZweCAxNHB4O1xuICAgIGZsZXg6IDAgMCBhdXRvO1xuXG4gICAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNTc1cHgpIHtcbiAgICAgIHBhZGRpbmc6IDEycHggMTRweDtcbiAgICB9XG4gIH1cblxuICAmX19hY2NvdW50LWluZm8ge1xuICAgIGZsZXg6IDEgMCBhdXRvO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1mbG93OiBjb2x1bW4gbm93cmFwO1xuICAgIHBhZGRpbmctdG9wOiA0cHg7XG4gIH1cblxuICAmX19jaGVjay1tYXJrIHtcbiAgICB3aWR0aDogMTRweDtcbiAgICBtYXJnaW4tcmlnaHQ6IDEycHg7XG4gICAgZmxleDogMCAwIGF1dG87XG4gIH1cblxuICAmX19jaGVjay1tYXJrLWljb24ge1xuICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChcImltYWdlcy9jaGVjay13aGl0ZS5zdmdcIik7XG4gICAgaGVpZ2h0OiAxOHB4O1xuICAgIHdpZHRoOiAxOHB4O1xuICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7XG4gICAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyO1xuICAgIGJhY2tncm91bmQtc2l6ZTogY29udGFpbjtcbiAgICBtYXJnaW46IDNweCAwO1xuICB9XG5cbiAgLmlkZW50aWNvbiB7XG4gICAgbWFyZ2luOiAwIDEycHggMCAwO1xuICAgIGZsZXg6IDAgMCBhdXRvO1xuICB9XG5cbiAgJl9fbmFtZSB7XG4gICAgY29sb3I6ICR3aGl0ZTtcbiAgICBmb250LXNpemU6IDE4cHg7XG4gICAgZm9udC13ZWlnaHQ6IDIwMDtcbiAgICBsaW5lLWhlaWdodDogMTZweDtcbiAgfVxuXG4gICZfX2JhbGFuY2Uge1xuICAgIGNvbG9yOiAkZHVzdHktZ3JheTtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgbGluZS1oZWlnaHQ6IDE5cHg7XG4gIH1cblxuICAmX19hY3Rpb24ge1xuICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICBsaW5lLWhlaWdodDogMThweDtcbiAgICBmb250LXdlaWdodDogMjAwO1xuICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgfVxufVxuIiwiLm1lbnUge1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGJhY2tncm91bmQ6IHJnYmEoJGJsYWNrLCAuOCk7XG4gIGJveC1zaGFkb3c6IHJnYmEoJGJsYWNrLCAuMTUpIDAgMnB4IDJweCAycHg7XG4gIG1pbi13aWR0aDogMTUwcHg7XG4gIGNvbG9yOiAkd2hpdGU7XG5cbiAgJl9faXRlbSB7XG4gICAgcGFkZGluZzogMThweDtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZmxvdzogcm93IG5vd3JhcDtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICB6LWluZGV4OiAyMDA7XG4gICAgZm9udC13ZWlnaHQ6IDIwMDtcblxuICAgIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDU3NXB4KSB7XG4gICAgICBwYWRkaW5nOiAxNHB4O1xuICAgIH1cblxuICAgICYtLWNsaWNrYWJsZSB7XG4gICAgICBjdXJzb3I6IHBvaW50ZXI7XG5cbiAgICAgICY6aG92ZXIge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKCR3aGl0ZSwgLjA1KTtcbiAgICAgIH1cblxuICAgICAgJjphY3RpdmUge1xuICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKCR3aGl0ZSwgLjEpO1xuICAgICAgfVxuICAgIH1cblxuICAgICZfX2ljb24ge1xuICAgICAgaGVpZ2h0OiAxNnB4O1xuICAgICAgd2lkdGg6IDE2cHg7XG4gICAgICBtYXJnaW4tcmlnaHQ6IDE0cHg7XG4gICAgfVxuXG4gICAgJl9fdGV4dCB7XG4gICAgICBmb250LXNpemU6IDE2cHg7XG4gICAgICBsaW5lLWhlaWdodDogMjFweDtcbiAgICB9XG4gIH1cblxuICAmX19kaXZpZGVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkc2NvcnBpb247XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxcHg7XG4gIH1cblxuICAmX19jbG9zZS1hcmVhIHtcbiAgICBwb3NpdGlvbjogZml4ZWQ7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIHRvcDogMDtcbiAgICBsZWZ0OiAwO1xuICAgIHotaW5kZXg6IDEwMDtcbiAgfVxufVxuIiwiLmdhcy1zbGlkZXIge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHdpZHRoOiAzMTNweDtcblxuICAmX19pbnB1dCB7XG4gICAgd2lkdGg6IDMxN3B4O1xuICAgIG1hcmdpbi1sZWZ0OiAtMnB4O1xuICAgIHotaW5kZXg6IDI7XG4gIH1cblxuICBpbnB1dFt0eXBlPXJhbmdlXSB7XG4gICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lICFpbXBvcnRhbnQ7XG4gIH1cblxuICBpbnB1dFt0eXBlPXJhbmdlXTo6LXdlYmtpdC1zbGlkZXItdGh1bWIge1xuICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZSAhaW1wb3J0YW50O1xuICAgIGhlaWdodDogMjZweDtcbiAgICB3aWR0aDogMjZweDtcbiAgICBib3JkZXI6IDJweCBzb2xpZCAjQjhCOEI4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNGRkZGRkY7XG4gICAgYm94LXNoYWRvdzogMCAycHggNHB4IDAgcmdiYSgwLDAsMCwwLjA4KTtcbiAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgIHotaW5kZXg6IDEwO1xuICB9XG5cbiAgJl9fYmFyIHtcbiAgICBoZWlnaHQ6IDZweDtcbiAgICB3aWR0aDogMzEzcHg7XG4gICAgYmFja2dyb3VuZDogJGFsdG87XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIHRvcDogMTFweDtcbiAgICB6LWluZGV4OiAwO1xuICB9XG5cbiAgJl9fbG93LCAmX19oaWdoIHtcbiAgICBoZWlnaHQ6IDZweDtcbiAgICB3aWR0aDogNDlweDtcbiAgICB6LWluZGV4OiAxO1xuICB9XG5cbiAgJl9fbG93IHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkY3JpbXNvbjtcbiAgfVxuXG4gICZfX2hpZ2gge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRjYXJpYmJlYW4tZ3JlZW47XG4gIH1cbn0iLCIuc2V0dGluZ3Mge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIGJhY2tncm91bmQ6ICR3aGl0ZTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1mbG93OiBjb2x1bW4gbm93cmFwO1xuICBoZWlnaHQ6IGF1dG87XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuXG4uc2V0dGluZ3NfX2hlYWRlciB7XG4gIHBhZGRpbmc6IDI1cHg7XG59XG5cbi5zZXR0aW5nc19fY2xvc2UtYnV0dG9uOjphZnRlciB7XG4gIGNvbnRlbnQ6ICdcXDAwRDcnO1xuICBmb250LXNpemU6IDQwcHg7XG4gIGNvbG9yOiAkZHVzdHktZ3JheTtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICB0b3A6IDI1cHg7XG4gIHJpZ2h0OiAzMHB4O1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbi5zZXR0aW5nc19fZXJyb3Ige1xuICBwYWRkaW5nLWJvdHRvbTogMjBweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICBjb2xvcjogJGNyaW1zb247XG59XG5cbi5zZXR0aW5nc19fY29udGVudCB7XG4gIHBhZGRpbmc6IDAgMjVweDtcbn1cblxuLnNldHRpbmdzX19jb250ZW50LXJvdyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIHBhZGRpbmc6IDEwcHggMCAyMHB4O1xuXG4gIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDU3NXB4KSB7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBwYWRkaW5nOiAxMHB4IDA7XG4gIH1cbn1cblxuLnNldHRpbmdzX19jb250ZW50LWl0ZW0ge1xuICBmbGV4OiAxO1xuICBtaW4td2lkdGg6IDA7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gIHBhZGRpbmc6IDAgNXB4O1xuICBoZWlnaHQ6IDcxcHg7XG5cbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNTc1cHgpIHtcbiAgICBoZWlnaHQ6IGluaXRpYWw7XG4gICAgcGFkZGluZzogNXB4IDA7XG4gIH1cblxuICAmLS13aXRob3V0LWhlaWdodCB7XG4gICAgaGVpZ2h0OiBpbml0aWFsO1xuICB9XG59XG5cbi5zZXR0aW5nc19fY29udGVudC1pdGVtLWNvbCB7XG4gIG1heC13aWR0aDogMzAwcHg7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG5cbiAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogNTc1cHgpIHtcbiAgICBtYXgtd2lkdGg6IDEwMCU7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cbn1cblxuLnNldHRpbmdzX19jb250ZW50LWRlc2NyaXB0aW9uIHtcbiAgZm9udC1zaXplOiAxNHB4O1xuICBjb2xvcjogJGR1c3R5LWdyYXk7XG4gIHBhZGRpbmctdG9wOiA1cHg7XG59XG5cbi5zZXR0aW5nc19faW5wdXQge1xuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG4gIGZvbnQtc2l6ZTogMTRweDtcbiAgaGVpZ2h0OiA0MHB4O1xuICBib3JkZXI6IDFweCBzb2xpZCAkYWx0bztcbn1cblxuLnNldHRpbmdzX19pbnB1dDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlciB7XG4gIGZvbnQtd2VpZ2h0OiAxMDA7XG4gIGNvbG9yOiAkZHVzdHktZ3JheTtcbn1cblxuLnNldHRpbmdzX19pbnB1dDo6LW1vei1wbGFjZWhvbGRlciB7XG4gIGZvbnQtd2VpZ2h0OiAxMDA7XG4gIGNvbG9yOiAkZHVzdHktZ3JheTtcbn1cblxuLnNldHRpbmdzX19pbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXIge1xuICBmb250LXdlaWdodDogMTAwO1xuICBjb2xvcjogJGR1c3R5LWdyYXk7XG59XG5cbi5zZXR0aW5nc19faW5wdXQ6LW1vei1wbGFjZWhvbGRlciB7XG4gIGZvbnQtd2VpZ2h0OiAxMDA7XG4gIGNvbG9yOiAkZHVzdHktZ3JheTtcbn1cblxuLnNldHRpbmdzX19wcm92aWRlci13cmFwcGVyIHtcbiAgZm9udC1zaXplOiAxNnB4O1xuICBib3JkZXI6IDFweCBzb2xpZCAkYWx0bztcbiAgYm9yZGVyLXJhZGl1czogMnB4O1xuICBwYWRkaW5nOiAxNXB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkd2hpdGU7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDtcbn1cblxuLnNldHRpbmdzX19wcm92aWRlci1pY29uIHtcbiAgaGVpZ2h0OiAxMHB4O1xuICB3aWR0aDogMTBweDtcbiAgbWFyZ2luLXJpZ2h0OiAxMHB4O1xuICBib3JkZXItcmFkaXVzOiAxMHB4O1xufVxuXG4uc2V0dGluZ3NfX3JwYy1zYXZlLWJ1dHRvbiB7XG4gIGFsaWduLXNlbGY6IGZsZXgtZW5kO1xuICBwYWRkaW5nOiA1cHg7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIGNvbG9yOiAkZHVzdHktZ3JheTtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG4uc2V0dGluZ3NfX2NsZWFyLWJ1dHRvbiB7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgYm9yZGVyOiAxcHggc29saWQgJGN1cmlvdXMtYmx1ZTtcbiAgY29sb3I6ICRjdXJpb3VzLWJsdWU7XG4gIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgcGFkZGluZzogMThweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogJHdoaXRlO1xuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xufVxuXG4uc2V0dGluZ3NfX2NsZWFyLWJ1dHRvbi0tcmVkIHtcbiAgYm9yZGVyOiAxcHggc29saWQgJG1vbnpvO1xuICBjb2xvcjogJG1vbnpvO1xufVxuXG4uc2V0dGluZ3NfX2luZm8tbG9nby13cmFwcGVyIHtcbiAgaGVpZ2h0OiA4MHB4O1xuICBtYXJnaW4tYm90dG9tOiAyMHB4O1xufVxuXG4uc2V0dGluZ3NfX2luZm8tbG9nbyB7XG4gIG1heC1oZWlnaHQ6IDEwMCU7XG4gIG1heC13aWR0aDogMTAwJTtcbn1cblxuLnNldHRpbmdzX19pbmZvLWl0ZW0ge1xuICBwYWRkaW5nOiAxMHB4IDA7XG59XG5cbi5zZXR0aW5nc19faW5mby1saW5rLWhlYWRlciB7XG4gIHBhZGRpbmctYm90dG9tOiAxNXB4O1xuXG4gIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDU3NXB4KSB7XG4gICAgcGFkZGluZy1ib3R0b206IDVweDtcbiAgfVxufVxuXG4uc2V0dGluZ3NfX2luZm8tbGluay1pdGVtIHtcbiAgcGFkZGluZzogMTVweCAwO1xuXG4gIEBtZWRpYSBzY3JlZW4gYW5kIChtYXgtd2lkdGg6IDU3NXB4KSB7XG4gICAgcGFkZGluZzogNXB4IDA7XG4gIH1cbn1cblxuLnNldHRpbmdzX19pbmZvLXZlcnNpb24tbnVtYmVyIHtcbiAgcGFkZGluZy10b3A6IDVweDtcbiAgZm9udC1zaXplOiAxM3B4O1xuICBjb2xvcjogJGR1c3R5LWdyYXk7XG59XG5cbi5zZXR0aW5nc19faW5mby1hYm91dCB7XG4gIGNvbG9yOiAkZHVzdHktZ3JheTtcbiAgbWFyZ2luLWJvdHRvbTogMTVweDtcbn1cblxuLnNldHRpbmdzX19pbmZvLWxpbmsge1xuICBjb2xvcjogJGN1cmlvdXMtYmx1ZTtcbn1cblxuLnNldHRpbmdzX19pbmZvLXNlcGFyYXRvciB7XG4gIG1hcmdpbjogMTVweCAwO1xuICB3aWR0aDogODBweDtcbiAgYm9yZGVyLWNvbG9yOiAkYWx0bztcbiAgYm9yZGVyOiBub25lO1xuICBoZWlnaHQ6IDFweDtcbiAgYmFja2dyb3VuZC1jb2xvcjogJGFsdG87XG4gIGNvbG9yOiAkYWx0bztcbn1cbiIsIi50YWItYmFyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICBhbGlnbi1pdGVtczogZmxleC1lbmQ7XG59XG5cbi50YWItYmFyX190YWIge1xuICBtaW4td2lkdGg6IDA7XG4gIGZsZXg6IDAgMCBhdXRvO1xuICBwYWRkaW5nOiAxNXB4IDI1cHg7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAkYWx0bztcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgZm9udC1zaXplOiAxOHB4O1xufVxuXG4udGFiLWJhcl9fdGFiLS1hY3RpdmUge1xuICBib3JkZXItY29sb3I6ICRibGFjaztcbn1cblxuLnRhYi1iYXJfX2dyb3ctdGFiIHtcbiAgZmxleC1ncm93OiAxO1xufVxuIiwiLnNpbXBsZS1kcm9wZG93biB7XG4gIGhlaWdodDogNTZweDtcbiAgZGlzcGxheTogZmxleDtcbiAganVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBib3JkZXI6IDFweCBzb2xpZCAkYWx0bztcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkd2hpdGU7XG4gIGZvbnQtc2l6ZTogMTZweDtcbiAgY29sb3I6ICM0ZDRkNGQ7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4uc2ltcGxlLWRyb3Bkb3duX19jYXJldCB7XG4gIGNvbG9yOiAkc2lsdmVyO1xuICBwYWRkaW5nOiAwIDEwcHg7XG59XG5cbi5zaW1wbGUtZHJvcGRvd25fX3NlbGVjdGVkIHtcbiAgZmxleC1ncm93OiAxO1xuICBwYWRkaW5nOiAwIDE1cHg7XG59XG5cbi5zaW1wbGUtZHJvcGRvd25fX29wdGlvbnMge1xuICB6LWluZGV4OiAxMDUwO1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGhlaWdodDogMjIwcHg7XG4gIHdpZHRoOiAxMDAlO1xuICBib3JkZXI6IDFweCBzb2xpZCAjZDJkOGRkO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gIC13ZWJraXQtYm94LXNoYWRvdzogMCAzcHggNnB4IDAgcmdiYSgwLCAwLCAwLCAuMTEpO1xuICBib3gtc2hhZG93OiAwIDNweCA2cHggMCByZ2JhKDAsIDAsIDAsIC4xMSk7XG4gIG1hcmdpbi10b3A6IDEwcHg7XG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcbiAgbGVmdDogMDtcbiAgdG9wOiAxMDAlO1xufVxuXG4uc2ltcGxlLWRyb3Bkb3duX19vcHRpb24ge1xuICBwYWRkaW5nOiAxMHB4O1xuXG4gICY6aG92ZXIge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICRnYWxsZXJ5O1xuICB9XG59XG5cbi5zaW1wbGUtZHJvcGRvd25fX29wdGlvbi0tc2VsZWN0ZWQge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAkYWx0bztcblxuICAmOmhvdmVyIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkYWx0bztcbiAgICBjdXJzb3I6IGRlZmF1bHQ7XG4gIH1cbn1cblxuLnNpbXBsZS1kcm9wZG93bl9fY2xvc2UtYXJlYSB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAwO1xuICBsZWZ0OiAwO1xuICB6LWluZGV4OiAxMDAwO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuIiwiLnJlcXVlc3Qtc2lnbmF0dXJlIHtcbiAgJl9fY29udGFpbmVyIHtcbiAgICB3aWR0aDogMzgwcHg7XG4gICAgYm9yZGVyLXJhZGl1czogOHB4O1xuICAgIGJhY2tncm91bmQtY29sb3I6ICR3aGl0ZTtcbiAgICBib3gtc2hhZG93OiAwIDJweCA0cHggMCByZ2JhKDAsMCwwLDAuMDgpO1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1mbG93OiBjb2x1bW4gbm93cmFwO1xuICAgIHotaW5kZXg6IDI1O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgZm9udC1mYW1pbHk6IFJvYm90bztcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgaGVpZ2h0OiAxMDAlO1xuXG4gICAgQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogJGJyZWFrLXNtYWxsKSB7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICAgIHRvcDogMDtcbiAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgfVxuXG4gICAgQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogJGJyZWFrLWxhcmdlKSB7XG4gICAgICBtYXgtaGVpZ2h0OiA2MjBweDtcbiAgICB9XG4gIH1cblxuICAmX19oZWFkZXIge1xuICAgIGhlaWdodDogNjRweDtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWZsb3c6IGNvbHVtbjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgIGZsZXg6IDAgMCBhdXRvO1xuICB9XG5cbiAgJl9faGVhZGVyLWJhY2tncm91bmQge1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkYXRoZW5zLWdyZXk7XG4gICAgei1pbmRleDogMjtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gIH1cblxuICAmX19oZWFkZXJfX3RleHQge1xuICAgIGhlaWdodDogMjlweDtcbiAgICB3aWR0aDogMTc5cHg7XG4gICAgY29sb3I6ICM1QjVENjc7XG4gICAgZm9udC1mYW1pbHk6IFJvYm90bztcbiAgICBmb250LXNpemU6IDIycHg7XG4gICAgZm9udC13ZWlnaHQ6IDMwMDtcbiAgICBsaW5lLWhlaWdodDogMjlweDtcbiAgICB6LWluZGV4OiAzO1xuICB9XG5cbiAgJl9faGVhZGVyX190aXAtY29udGFpbmVyIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICB9XG5cbiAgJl9faGVhZGVyX190aXAge1xuICAgIGhlaWdodDogMjVweDtcbiAgICB3aWR0aDogMjVweDtcbiAgICBiYWNrZ3JvdW5kOiAkYXRoZW5zLWdyZXk7XG4gICAgdHJhbnNmb3JtOiByb3RhdGUoNDVkZWcpO1xuICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICBib3R0b206IC04cHg7XG4gICAgei1pbmRleDogMTtcbiAgfVxuXG4gICZfX2FjY291bnQtaW5mbyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47XG4gICAgbWFyZ2luLXRvcDogMThweDtcbiAgICBtYXJnaW4tYm90dG9tOiAyMHB4O1xuICB9XG5cbiAgJl9fYWNjb3VudCB7XG4gICAgY29sb3I6ICRkdXN0eS1ncmF5O1xuICAgIG1hcmdpbi1sZWZ0OiAxN3B4O1xuICB9XG5cbiAgJl9fYWNjb3VudC10ZXh0IHtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gIH1cblxuICAmX19iYWxhbmNlIHtcbiAgICBjb2xvcjogJGR1c3R5LWdyYXk7XG4gICAgbWFyZ2luLXJpZ2h0OiAxN3B4O1xuICAgIHdpZHRoOiAxMjRweDtcbiAgfVxuXG4gICZfX2JhbGFuY2UtdGV4dCB7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgZm9udC1zaXplOiAxNHB4O1xuICB9XG5cbiAgJl9fYmFsYW5jZS12YWx1ZSB7XG4gICAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gICAgbWFyZ2luLXRvcDogMi41cHg7XG4gIH1cblxuICAmX19yZXF1ZXN0LWljb24ge1xuICAgIG1hcmdpbi10b3A6IDI1cHg7XG4gIH1cblxuICAmX19ib2R5IHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWZsb3c6IGNvbHVtbjtcbiAgICBmbGV4OiAxIDEgYXV0bztcbiAgICBoZWlnaHQ6IDA7XG4gIH1cblxuICAmX19yZXF1ZXN0LWluZm8ge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIH1cblxuICAmX19oZWFkbGluZSB7XG4gICAgaGVpZ2h0OiA0OHB4O1xuICAgIHdpZHRoOiAyNDBweDtcbiAgICBjb2xvcjogJHR1bmRvcmE7XG4gICAgZm9udC1mYW1pbHk6IFJvYm90bztcbiAgICBmb250LXNpemU6IDE4cHg7XG4gICAgZm9udC13ZWlnaHQ6IDMwMDtcbiAgICBsaW5lLWhlaWdodDogMjRweDtcbiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gICAgbWFyZ2luLXRvcDogMjBweDtcbiAgfVxuXG4gICZfX25vdGljZSxcbiAgJl9fd2FybmluZyB7XG4gICAgZm9udC1mYW1pbHk6IFwiQXZlbmlyIE5leHRcIjtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgbGluZS1oZWlnaHQ6IDE5cHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIG1hcmdpbi10b3A6IDQxcHg7XG4gICAgbWFyZ2luLWJvdHRvbTogMTFweDtcbiAgICB3aWR0aDogMTAwJTtcbiAgfVxuXG4gICZfX25vdGljZSB7XG4gICAgY29sb3I6ICRkdXN0eS1ncmF5O1xuICB9XG5cbiAgJl9fd2FybmluZyB7XG4gICAgY29sb3I6ICRjcmltc29uO1xuICB9XG5cbiAgJl9fcm93cyB7XG4gICAgaGVpZ2h0OiAxMDAlO1xuICAgIG92ZXJmbG93LXk6IHNjcm9sbDtcbiAgICBvdmVyZmxvdy14OiBoaWRkZW47XG4gICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICRnZXlzZXI7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWZsb3c6IGNvbHVtbjtcbiAgfVxuXG4gICZfX3JvdyB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWZsb3c6IGNvbHVtbjtcbiAgfVxuXG4gICZfX3Jvdy10aXRsZSB7XG4gICAgd2lkdGg6IDgwcHg7XG4gICAgY29sb3I6ICRkdXN0eS1ncmF5O1xuICAgIGZvbnQtZmFtaWx5OiBSb2JvdG87XG4gICAgZm9udC1zaXplOiAxNnB4O1xuICAgIGxpbmUtaGVpZ2h0OiAyMnB4O1xuICAgIG1hcmdpbi10b3A6IDEycHg7XG4gICAgbWFyZ2luLWxlZnQ6IDE4cHg7XG4gICAgd2lkdGg6IDEwMCU7XG4gIH1cblxuICAmX19yb3ctdmFsdWUge1xuICAgIGNvbG9yOiAkc2NvcnBpb247XG4gICAgZm9udC1mYW1pbHk6IFJvYm90bztcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgbGluZS1oZWlnaHQ6IDE5cHg7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDtcbiAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2QyZDhkZDtcbiAgICBwYWRkaW5nOiA2cHggMThweCAxNXB4O1xuICB9XG5cbiAgJl9fZm9vdGVyIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1ldmVubHk7XG4gICAgZm9udC1zaXplOiAyMnB4O1xuICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICBmbGV4OiAwIDAgYXV0bztcbiAgICBib3JkZXItdG9wOiAxcHggc29saWQgJGdleXNlcjtcblxuICAgICZfX2NhbmNlbC1idXR0b24sXG4gICAgJl9fc2lnbi1idXR0b24ge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICAgIGZsZXg6IDEgMCBhdXRvO1xuICAgICAgZm9udC1mYW1pbHk6IFJvYm90bztcbiAgICAgIGZvbnQtc2l6ZTogMTZweDtcbiAgICAgIGZvbnQtd2VpZ2h0OiAzMDA7XG4gICAgICBoZWlnaHQ6IDU1cHg7XG4gICAgICBsaW5lLWhlaWdodDogMzJweDtcbiAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICAgIGJveC1zaGFkb3c6IG5vbmU7XG4gICAgICBtYXgtd2lkdGg6IDE2MnB4O1xuICAgICAgbWFyZ2luOiAxMnB4O1xuICAgIH1cblxuICAgICZfX2NhbmNlbC1idXR0b24ge1xuICAgICAgYmFja2dyb3VuZDogbm9uZTtcbiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICRkdXN0eS1ncmF5O1xuICAgICAgbWFyZ2luLXJpZ2h0OiA2cHg7XG4gICAgfVxuXG4gICAgJl9fc2lnbi1idXR0b24ge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogJGNhcmliYmVhbi1ncmVlbjtcbiAgICAgIGJvcmRlci13aWR0aDogMDtcbiAgICAgIGNvbG9yOiAkd2hpdGU7XG4gICAgICBtYXJnaW4tbGVmdDogNnB4O1xuICAgIH1cbiAgfVxufSIsIi5hY2NvdW50LWRyb3Bkb3duLW1pbmkge1xuICBoZWlnaHQ6IDIycHg7XG4gIGJhY2tncm91bmQtY29sb3I6ICR3aGl0ZTtcbiAgZm9udC1mYW1pbHk6IFJvYm90bztcbiAgbGluZS1oZWlnaHQ6IDE2cHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgd2lkdGg6IDEyNHB4O1xuXG4gICZfX2Nsb3NlLWFyZWEge1xuICAgIHBvc2l0aW9uOiBmaXhlZDtcbiAgICB0b3A6IDA7XG4gICAgbGVmdDogMDtcbiAgICB6LWluZGV4OiAxMDAwO1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGhlaWdodDogMTAwJTtcbiAgfVxuXG4gICZfX2xpc3Qge1xuICAgIHotaW5kZXg6IDEwNTA7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIGhlaWdodDogMTgwcHg7XG4gICAgd2lkdGg6IDk2cHhweDtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAkZ2V5c2VyO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAkd2hpdGU7XG4gICAgYm94LXNoYWRvdzogMCAzcHggNnB4IDAgcmdiYSgwICwwICwwICwuMTEpO1xuICAgIG92ZXJmbG93LXk6IHNjcm9sbDtcbiAgfVxuXG4gIC5hY2NvdW50LWxpc3QtaXRlbSB7XG4gICAgbWFyZ2luLXRvcDogNnB4O1xuICB9XG5cbiAgLmFjY291bnQtbGlzdC1pdGVtX19hY2NvdW50LW5hbWUge1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgICB3aWR0aDogODBweDtcbiAgfVxuXG4gIC5hY2NvdW50LWxpc3QtaXRlbV9fdG9wLXJvdyB7XG4gICAgbWFyZ2luOiAwO1xuICB9XG5cbiAgLmFjY291bnQtbGlzdC1pdGVtX19pY29uIHtcbiAgICBwb3NpdGlvbjogaW5pdGlhbDtcbiAgfVxufSIsIi5lZGl0YWJsZS1sYWJlbCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG5cbiAgJl9fdmFsdWUge1xuICAgIG1heC13aWR0aDogMjUwcHg7XG4gICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICB9XG5cbiAgJl9faW5wdXQge1xuICAgIHdpZHRoOiAyNTBweDtcbiAgICBmb250LXNpemU6IDE0cHg7XG4gICAgdGV4dC1hbGlnbjogY2VudGVyO1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICRhbHRvO1xuXG4gICAgJi0tZXJyb3Ige1xuICAgICAgYm9yZGVyOiAxcHggc29saWQgJG1vbnpvO1xuICAgIH1cbiAgfVxuXG4gICZfX2ljb24td3JhcHBlciB7XG4gICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICAgIGxlZnQ6IDEwMCU7XG4gIH1cblxuICAmX19pY29uIHtcbiAgICBjdXJzb3I6IHBvaW50ZXI7XG4gICAgY29sb3I6ICRkdXN0eS1ncmF5O1xuICB9XG59XG4iLCIvKlxuICBUcnVtcHNcbiAqL1xuXG4vLyBUcmFuc2l0aW9uc1xuXG4vKiB1bml2ZXJzYWwgKi9cbi5hcHAtcHJpbWFyeSAubWFpbi1lbnRlciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi8qIGNlbnRlciBwb3NpdGlvbiAqL1xuLmFwcC1wcmltYXJ5LmZyb20tcmlnaHQgLm1haW4tZW50ZXItYWN0aXZlLFxuLmFwcC1wcmltYXJ5LmZyb20tbGVmdCAubWFpbi1lbnRlci1hY3RpdmUge1xuICBvdmVyZmxvdy14OiBoaWRkZW47XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgwKTtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDMwMG1zIGVhc2UtaW47XG59XG5cbi8qIGV4aXRlZCBwb3NpdGlvbnMgKi9cbi5hcHAtcHJpbWFyeS5mcm9tLWxlZnQgLm1haW4tbGVhdmUtYWN0aXZlIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDM2MHB4KTtcbiAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDMwMG1zIGVhc2UtaW47XG59XG5cbi5hcHAtcHJpbWFyeS5mcm9tLXJpZ2h0IC5tYWluLWxlYXZlLWFjdGl2ZSB7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtMzYwcHgpO1xuICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMzAwbXMgZWFzZS1pbjtcbn1cblxuLnNpZGViYXIuZnJvbS1sZWZ0IHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0zMjBweCk7XG4gIHRyYW5zaXRpb246IHRyYW5zZm9ybSAzMDBtcyBlYXNlLWluO1xufVxuXG4vKiBsb2FkZXIgdHJhbnNpdGlvbnMgKi9cbi5sb2FkZXItZW50ZXIsXG4ubG9hZGVyLWxlYXZlLWFjdGl2ZSB7XG4gIG9wYWNpdHk6IDA7XG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMTUwIGVhc2UtaW47XG59XG5cbi5sb2FkZXItZW50ZXItYWN0aXZlLFxuLmxvYWRlci1sZWF2ZSB7XG4gIG9wYWNpdHk6IDE7XG4gIHRyYW5zaXRpb246IG9wYWNpdHkgMTUwIGVhc2UtaW47XG59XG5cbi8qIGVudGVyaW5nIHBvc2l0aW9ucyAqL1xuLmFwcC1wcmltYXJ5LmZyb20tcmlnaHQgLm1haW4tZW50ZXI6bm90KC5tYWluLWVudGVyLWFjdGl2ZSkge1xuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoMzYwcHgpO1xufVxuXG4uYXBwLXByaW1hcnkuZnJvbS1sZWZ0IC5tYWluLWVudGVyOm5vdCgubWFpbi1lbnRlci1hY3RpdmUpIHtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC0zNjBweCk7XG59XG5cbmkuZmEuZmEtcXVlc3Rpb24tY2lyY2xlLmZhLWxnLm1lbnUtaWNvbiB7XG4gIGZvbnQtc2l6ZTogMThweDtcbn1cblxuLy8gVGhpcyB0ZXh0IGlzIGNvbnRhaW5lZCBpbnNpZGUgYSBkaXYuXG4vLyBJRCBuZWVkZWQgdG8gb3ZlcnJpZGUgdXNlciBhZ2VudCBzdHlsZXNoZWV0LlxuLy8gU2VlIGNvbXBvbmVudHMvbW9kYWwuc2Nzc1xuXG4vKiBzdHlsZWxpbnQtZGlzYWJsZSAqL1xuI2J1eS1tb2RhbC1jb250ZW50LWZvb3Rlci10ZXh0IHtcbiAgZm9udC1mYW1pbHk6ICdESU4gT1QnO1xuICBmb250LXNpemU6IDE2cHg7XG59XG4vKiBzdHlsZWxpbnQtZW5hYmxlICovXG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7OztHQUtHO0FFTEg7O0dBRUc7QUFTSDs7O0dBR0c7QUErQkg7O0dBRUc7QUFXSDs7Ozs7OztHQU9HO0FBRUg7O0dBRUc7QUNyRUgs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QUc7QUFDSCxBQUFBLElBQUk7QUFDSixBQUFBLE1BQU07QUFDTixBQUFBLE1BQU07QUFDTixBQUFBLE1BQU07QUFDTixBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUU7QUFDRixBQUFBLENBQUM7QUFDRCxBQUFBLFVBQVU7QUFDVixBQUFBLEdBQUc7QUFDSCxBQUFBLENBQUM7QUFDRCxBQUFBLElBQUk7QUFDSixBQUFBLE9BQU87QUFDUCxBQUFBLE9BQU87QUFDUCxBQUFBLEdBQUc7QUFDSCxBQUFBLElBQUk7QUFDSixBQUFBLElBQUk7QUFDSixBQUFBLEdBQUc7QUFDSCxBQUFBLEdBQUc7QUFDSCxBQUFBLEVBQUU7QUFDRixBQUFBLEdBQUc7QUFDSCxBQUFBLEdBQUc7QUFDSCxBQUFBLEdBQUc7QUFDSCxBQUFBLENBQUM7QUFDRCxBQUFBLENBQUM7QUFDRCxBQUFBLElBQUk7QUFDSixBQUFBLEtBQUs7QUFDTCxBQUFBLE1BQU07QUFDTixBQUFBLE1BQU07QUFDTixBQUFBLEdBQUc7QUFDSCxBQUFBLEdBQUc7QUFDSCxBQUFBLEVBQUU7QUFDRixBQUFBLEdBQUc7QUFDSCxBQUFBLENBQUM7QUFDRCxBQUFBLENBQUM7QUFDRCxBQUFBLENBQUM7QUFDRCxBQUFBLE1BQU07QUFDTixBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUU7QUFDRixBQUFBLFFBQVE7QUFDUixBQUFBLElBQUk7QUFDSixBQUFBLEtBQUs7QUFDTCxBQUFBLE1BQU07QUFDTixBQUFBLEtBQUs7QUFDTCxBQUFBLE9BQU87QUFDUCxBQUFBLEtBQUs7QUFDTCxBQUFBLEtBQUs7QUFDTCxBQUFBLEtBQUs7QUFDTCxBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUU7QUFDRixBQUFBLE9BQU87QUFDUCxBQUFBLEtB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 */ diff --git a/old-ui/app/css/reset.css b/old-ui/app/css/reset.css new file mode 100644 index 000000000..9ce89e8bc --- /dev/null +++ b/old-ui/app/css/reset.css @@ -0,0 +1,48 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, +dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, +table, caption, tbody, tfoot, thead, tr, th, td, +article, aside, canvas, details, embed, +figure, figcaption, footer, header, hgroup, +menu, nav, output, ruby, section, summary, +time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, aside, details, figcaption, figure, +footer, header, hgroup, menu, nav, section { + display: block; +} +body { + line-height: 1; +} +ol, ul { + list-style: none; +} +blockquote, q { + quotes: none; +} +blockquote:before, blockquote:after, +q:before, q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +}
\ No newline at end of file diff --git a/old-ui/app/css/transitions.css b/old-ui/app/css/transitions.css new file mode 100644 index 000000000..393a944f9 --- /dev/null +++ b/old-ui/app/css/transitions.css @@ -0,0 +1,42 @@ +/* universal */ +.app-primary .main-enter { + position: absolute; + width: 100%; +} + +/* center position */ +.app-primary.from-right .main-enter-active, +.app-primary.from-left .main-enter-active { + overflow-x: hidden; + transform: translateX(0px); + transition: transform 300ms ease-in; +} + +/* exited positions */ +.app-primary.from-left .main-leave-active { + transform: translateX(360px); + transition: transform 300ms ease-in; +} +.app-primary.from-right .main-leave-active { + transform: translateX(-360px); + transition: transform 300ms ease-in; +} + +/* loader transitions */ +.loader-enter, .loader-leave-active { + opacity: 0.0; + transition: opacity 150 ease-in; +} +.loader-enter-active, .loader-leave { + opacity: 1.0; + transition: opacity 150 ease-in; +} + +/* entering positions */ +.app-primary.from-right .main-enter:not(.main-enter-active) { + transform: translateX(360px); +} +.app-primary.from-left .main-enter:not(.main-enter-active) { + transform: translateX(-360px); +} + diff --git a/old-ui/app/first-time/init-menu.js b/old-ui/app/first-time/init-menu.js new file mode 100644 index 000000000..4f1d5d186 --- /dev/null +++ b/old-ui/app/first-time/init-menu.js @@ -0,0 +1,179 @@ +const inherits = require('util').inherits +const EventEmitter = require('events').EventEmitter +const Component = require('react').Component +const connect = require('react-redux').connect +const h = require('react-hyperscript') +const Mascot = require('../components/mascot') +const actions = require('../../../ui/app/actions') +const Tooltip = require('../components/tooltip') +const getCaretCoordinates = require('textarea-caret') + +module.exports = connect(mapStateToProps)(InitializeMenuScreen) + +inherits(InitializeMenuScreen, Component) +function InitializeMenuScreen () { + Component.call(this) + this.animationEventEmitter = new EventEmitter() +} + +function mapStateToProps (state) { + return { + // state from plugin + currentView: state.appState.currentView, + warning: state.appState.warning, + } +} + +InitializeMenuScreen.prototype.render = function () { + var state = this.props + + switch (state.currentView.name) { + + default: + return this.renderMenu(state) + + } +} + +// InitializeMenuScreen.prototype.componentDidMount = function(){ +// document.getElementById('password-box').focus() +// } + +InitializeMenuScreen.prototype.renderMenu = function (state) { + return ( + + h('.initialize-screen.flex-column.flex-center.flex-grow', [ + + h(Mascot, { + animationEventEmitter: this.animationEventEmitter, + }), + + h('h1', { + style: { + fontSize: '1.3em', + textTransform: 'uppercase', + color: '#7F8082', + marginBottom: 10, + }, + }, 'MetaMask'), + + + h('div', [ + h('h3', { + style: { + fontSize: '0.8em', + color: '#7F8082', + display: 'inline', + }, + }, 'Encrypt your new DEN'), + + h(Tooltip, { + title: 'Your DEN is your password-encrypted storage within MetaMask.', + }, [ + h('i.fa.fa-question-circle.pointer', { + style: { + fontSize: '18px', + position: 'relative', + color: 'rgb(247, 134, 28)', + top: '2px', + marginLeft: '4px', + }, + }), + ]), + ]), + + h('span.in-progress-notification', state.warning), + + // password + h('input.large-input.letter-spacey', { + type: 'password', + id: 'password-box', + placeholder: 'New Password (min 8 chars)', + onInput: this.inputChanged.bind(this), + style: { + width: 260, + marginTop: 12, + }, + }), + + // confirm password + h('input.large-input.letter-spacey', { + type: 'password', + id: 'password-box-confirm', + placeholder: 'Confirm Password', + onKeyPress: this.createVaultOnEnter.bind(this), + onInput: this.inputChanged.bind(this), + style: { + width: 260, + marginTop: 16, + }, + }), + + + h('button.primary', { + onClick: this.createNewVaultAndKeychain.bind(this), + style: { + margin: 12, + }, + }, 'Create'), + + h('.flex-row.flex-center.flex-grow', [ + h('p.pointer', { + onClick: this.showRestoreVault.bind(this), + style: { + fontSize: '0.8em', + color: 'rgb(247, 134, 28)', + textDecoration: 'underline', + }, + }, 'Import Existing DEN'), + ]), + + ]) + ) +} + +InitializeMenuScreen.prototype.createVaultOnEnter = function (event) { + if (event.key === 'Enter') { + event.preventDefault() + this.createNewVaultAndKeychain() + } +} + +InitializeMenuScreen.prototype.componentDidMount = function () { + document.getElementById('password-box').focus() +} + +InitializeMenuScreen.prototype.showRestoreVault = function () { + this.props.dispatch(actions.showRestoreVault()) +} + +InitializeMenuScreen.prototype.createNewVaultAndKeychain = function () { + var passwordBox = document.getElementById('password-box') + var password = passwordBox.value + var passwordConfirmBox = document.getElementById('password-box-confirm') + var passwordConfirm = passwordConfirmBox.value + + if (password.length < 8) { + this.warning = 'password not long enough' + this.props.dispatch(actions.displayWarning(this.warning)) + return + } + if (password !== passwordConfirm) { + this.warning = 'passwords don\'t match' + this.props.dispatch(actions.displayWarning(this.warning)) + return + } + + this.props.dispatch(actions.createNewVaultAndKeychain(password)) +} + +InitializeMenuScreen.prototype.inputChanged = function (event) { + // tell mascot to look at page action + var element = event.target + var boundingRect = element.getBoundingClientRect() + var coordinates = getCaretCoordinates(element, element.selectionEnd) + this.animationEventEmitter.emit('point', { + x: boundingRect.left + coordinates.left - element.scrollLeft, + y: boundingRect.top + coordinates.top - element.scrollTop, + }) +} diff --git a/old-ui/app/img/identicon-tardigrade.png b/old-ui/app/img/identicon-tardigrade.png Binary files differnew file mode 100644 index 000000000..1742a32b8 --- /dev/null +++ b/old-ui/app/img/identicon-tardigrade.png diff --git a/old-ui/app/img/identicon-walrus.png b/old-ui/app/img/identicon-walrus.png Binary files differnew file mode 100644 index 000000000..d58fae912 --- /dev/null +++ b/old-ui/app/img/identicon-walrus.png diff --git a/old-ui/app/info.js b/old-ui/app/info.js new file mode 100644 index 000000000..db9f30f23 --- /dev/null +++ b/old-ui/app/info.js @@ -0,0 +1,155 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const actions = require('../../ui/app/actions') + +module.exports = connect(mapStateToProps)(InfoScreen) + +function mapStateToProps (state) { + return {} +} + +inherits(InfoScreen, Component) +function InfoScreen () { + Component.call(this) +} + +InfoScreen.prototype.render = function () { + const state = this.props + const version = global.platform.getVersion() + + return ( + h('.flex-column.flex-grow', { + style: { + maxWidth: '400px', + }, + }, [ + + // subtitle and nav + h('.section-title.flex-row.flex-center', [ + h('i.fa.fa-arrow-left.fa-lg.cursor-pointer', { + onClick: (event) => { + state.dispatch(actions.goHome()) + }, + }), + h('h2.page-subtitle', 'Info'), + ]), + + // main view + h('.flex-column.flex-justify-center.flex-grow.select-none', [ + h('.flex-space-around', { + style: { + padding: '20px', + }, + }, [ + // current version number + + h('.info.info-gray', [ + h('div', 'Metamask'), + h('div', { + style: { + marginBottom: '10px', + }, + }, `Version: ${version}`), + ]), + + h('div', { + style: { + marginBottom: '5px', + }}, + [ + h('div', [ + h('a', { + href: 'https://metamask.io/privacy.html', + target: '_blank', + onClick (event) { this.navigateTo(event.target.href) }, + }, [ + h('div.info', 'Privacy Policy'), + ]), + ]), + h('div', [ + h('a', { + href: 'https://metamask.io/terms.html', + target: '_blank', + onClick (event) { this.navigateTo(event.target.href) }, + }, [ + h('div.info', 'Terms of Use'), + ]), + ]), + h('div', [ + h('a', { + href: 'https://metamask.io/attributions.html', + target: '_blank', + onClick (event) { this.navigateTo(event.target.href) }, + }, [ + h('div.info', 'Attributions'), + ]), + ]), + ] + ), + + h('hr', { + style: { + margin: '10px 0 ', + width: '7em', + }, + }), + + h('div', { + style: { + paddingLeft: '30px', + }}, + [ + h('div.fa.fa-support', [ + h('a.info', { + href: 'https://support.metamask.io', + target: '_blank', + }, 'Visit our Support Center'), + ]), + + h('div', [ + h('a', { + href: 'https://metamask.io/', + target: '_blank', + }, [ + h('img.icon-size', { + src: 'images/icon-128.png', + style: { + // IE6-9 + filter: 'grayscale(100%)', + // Microsoft Edge and Firefox 35+ + WebkitFilter: 'grayscale(100%)', + }, + }), + h('div.info', 'Visit our web site'), + ]), + ]), + + h('div', [ + h('.fa.fa-twitter', [ + h('a.info', { + href: 'https://twitter.com/metamask_io', + target: '_blank', + }, 'Follow us on Twitter'), + ]), + ]), + + h('div.fa.fa-envelope', [ + h('a.info', { + target: '_blank', + style: { width: '85vw' }, + href: 'mailto:help@metamask.io?subject=Feedback', + }, 'Email us!'), + ]), + ]), + ]), + ]), + ]) + ) +} + +InfoScreen.prototype.navigateTo = function (url) { + global.platform.openWindow({ url }) +} + diff --git a/old-ui/app/infura-conversion.json b/old-ui/app/infura-conversion.json new file mode 100644 index 000000000..9a96fe069 --- /dev/null +++ b/old-ui/app/infura-conversion.json @@ -0,0 +1,653 @@ +{ + "objects": [ + { + "symbol": "ethaud", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "aud", + "name": "Australian Dollar" + } + }, + { + "symbol": "ethhkd", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "hkd", + "name": "Hong Kong Dollar" + } + }, + { + "symbol": "ethsgd", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "sgd", + "name": "Singapore Dollar" + } + }, + { + "symbol": "ethidr", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "idr", + "name": "Indonesian Rupiah" + } + }, + { + "symbol": "ethphp", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "php", + "name": "Philippine Peso" + } + }, + { + "symbol": "eth1st", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "1st", + "name": "FirstBlood" + } + }, + { + "symbol": "ethadt", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "adt", + "name": "adToken" + } + }, + { + "symbol": "ethadx", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "adx", + "name": "AdEx" + } + }, + { + "symbol": "ethant", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "ant", + "name": "Aragon" + } + }, + { + "symbol": "ethbat", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "bat", + "name": "Basic Attention Token" + } + }, + { + "symbol": "ethbnt", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "bnt", + "name": "Bancor" + } + }, + { + "symbol": "ethbtc", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "btc", + "name": "Bitcoin" + } + }, + { + "symbol": "ethcad", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "cad", + "name": "Canadian Dollar" + } + }, + { + "symbol": "ethcfi", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "cfi", + "name": "Cofound.it" + } + }, + { + "symbol": "ethcrb", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "crb", + "name": "CreditBit" + } + }, + { + "symbol": "ethcvc", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "cvc", + "name": "Civic" + } + }, + { + "symbol": "ethdash", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "dash", + "name": "Dash" + } + }, + { + "symbol": "ethdgd", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "dgd", + "name": "DigixDAO" + } + }, + { + "symbol": "ethetc", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "etc", + "name": "Ethereum Classic" + } + }, + { + "symbol": "etheur", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "eur", + "name": "Euro" + } + }, + { + "symbol": "ethfun", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "fun", + "name": "FunFair" + } + }, + { + "symbol": "ethgbp", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "gbp", + "name": "Pound Sterling" + } + }, + { + "symbol": "ethgno", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "gno", + "name": "Gnosis" + } + }, + { + "symbol": "ethgnt", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "gnt", + "name": "Golem" + } + }, + { + "symbol": "ethgup", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "gup", + "name": "Matchpool" + } + }, + { + "symbol": "ethhmq", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "hmq", + "name": "Humaniq" + } + }, + { + "symbol": "ethjpy", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "jpy", + "name": "Japanese Yen" + } + }, + { + "symbol": "ethlgd", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "lgd", + "name": "Legends Room" + } + }, + { + "symbol": "ethlsk", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "lsk", + "name": "Lisk" + } + }, + { + "symbol": "ethltc", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "ltc", + "name": "Litecoin" + } + }, + { + "symbol": "ethlun", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "lun", + "name": "Lunyr" + } + }, + { + "symbol": "ethmco", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "mco", + "name": "Monaco" + } + }, + { + "symbol": "ethmtl", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "mtl", + "name": "Metal" + } + }, + { + "symbol": "ethmyst", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "myst", + "name": "Mysterium" + } + }, + { + "symbol": "ethnmr", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "nmr", + "name": "Numeraire" + } + }, + { + "symbol": "ethomg", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "omg", + "name": "OmiseGO" + } + }, + { + "symbol": "ethpay", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "pay", + "name": "TenX" + } + }, + { + "symbol": "ethptoy", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "ptoy", + "name": "Patientory" + } + }, + { + "symbol": "ethqrl", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "qrl", + "name": "Quantum-Resistant Ledger" + } + }, + { + "symbol": "ethqtum", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "qtum", + "name": "Qtum" + } + }, + { + "symbol": "ethrep", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "rep", + "name": "Augur" + } + }, + { + "symbol": "ethrlc", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "rlc", + "name": "iEx.ec" + } + }, + { + "symbol": "ethrub", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "rub", + "name": "Russian Ruble" + } + }, + { + "symbol": "ethsc", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "sc", + "name": "Siacoin" + } + }, + { + "symbol": "ethsngls", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "sngls", + "name": "SingularDTV" + } + }, + { + "symbol": "ethsnt", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "snt", + "name": "Status" + } + }, + { + "symbol": "ethsteem", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "steem", + "name": "Steem" + } + }, + { + "symbol": "ethstorj", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "storj", + "name": "Storj" + } + }, + { + "symbol": "ethtime", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "time", + "name": "ChronoBank" + } + }, + { + "symbol": "ethtkn", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "tkn", + "name": "TokenCard" + } + }, + { + "symbol": "ethtrst", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "trst", + "name": "WeTrust" + } + }, + { + "symbol": "ethuah", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "uah", + "name": "Ukrainian Hryvnia" + } + }, + { + "symbol": "ethusd", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "usd", + "name": "United States Dollar" + } + }, + { + "symbol": "ethwings", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "wings", + "name": "Wings" + } + }, + { + "symbol": "ethxem", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "xem", + "name": "NEM" + } + }, + { + "symbol": "ethxlm", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "xlm", + "name": "Stellar Lumen" + } + }, + { + "symbol": "ethxmr", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "xmr", + "name": "Monero" + } + }, + { + "symbol": "ethxrp", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "xrp", + "name": "Ripple" + } + }, + { + "symbol": "ethzec", + "base": { + "code": "eth", + "name": "Ethereum" + }, + "quote": { + "code": "zec", + "name": "Zcash" + } + } + ] +} diff --git a/old-ui/app/keychains/hd/create-vault-complete.js b/old-ui/app/keychains/hd/create-vault-complete.js new file mode 100644 index 000000000..736e922b7 --- /dev/null +++ b/old-ui/app/keychains/hd/create-vault-complete.js @@ -0,0 +1,91 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const connect = require('react-redux').connect +const h = require('react-hyperscript') +const actions = require('../../../../ui/app/actions') +const exportAsFile = require('../../util').exportAsFile + +module.exports = connect(mapStateToProps)(CreateVaultCompleteScreen) + +inherits(CreateVaultCompleteScreen, Component) +function CreateVaultCompleteScreen () { + Component.call(this) +} + +function mapStateToProps (state) { + return { + seed: state.appState.currentView.seedWords, + cachedSeed: state.metamask.seedWords, + } +} + +CreateVaultCompleteScreen.prototype.render = function () { + var state = this.props + var seed = state.seed || state.cachedSeed || '' + + return ( + + h('.initialize-screen.flex-column.flex-center.flex-grow', [ + + // // subtitle and nav + // h('.section-title.flex-row.flex-center', [ + // h('h2.page-subtitle', 'Vault Created'), + // ]), + + h('h3.flex-center.text-transform-uppercase', { + style: { + background: '#EBEBEB', + color: '#AEAEAE', + marginTop: 36, + marginBottom: 8, + width: '100%', + fontSize: '20px', + padding: 6, + }, + }, [ + 'Vault Created', + ]), + + h('div', { + style: { + fontSize: '1em', + marginTop: '10px', + textAlign: 'center', + }, + }, [ + h('span.error', 'These 12 words are the only way to restore your MetaMask accounts.\nSave them somewhere safe and secret.'), + ]), + + h('textarea.twelve-word-phrase', { + readOnly: true, + value: seed, + }), + + h('button.primary', { + onClick: () => this.confirmSeedWords() + .then(account => this.showAccountDetail(account)), + style: { + margin: '24px', + fontSize: '0.9em', + marginBottom: '10px', + }, + }, 'I\'ve copied it somewhere safe'), + + h('button.primary', { + onClick: () => exportAsFile(`MetaMask Seed Words`, seed), + style: { + margin: '10px', + fontSize: '0.9em', + }, + }, 'Save Seed Words As File'), + ]) + ) +} + +CreateVaultCompleteScreen.prototype.confirmSeedWords = function () { + return this.props.dispatch(actions.confirmSeedWords()) +} + +CreateVaultCompleteScreen.prototype.showAccountDetail = function (account) { + return this.props.dispatch(actions.showAccountDetail(account)) +} diff --git a/old-ui/app/keychains/hd/recover-seed/confirmation.js b/old-ui/app/keychains/hd/recover-seed/confirmation.js new file mode 100644 index 000000000..eb0298a09 --- /dev/null +++ b/old-ui/app/keychains/hd/recover-seed/confirmation.js @@ -0,0 +1,121 @@ +const inherits = require('util').inherits + +const Component = require('react').Component +const connect = require('react-redux').connect +const h = require('react-hyperscript') +const actions = require('../../../../../ui/app/actions') + +module.exports = connect(mapStateToProps)(RevealSeedConfirmation) + +inherits(RevealSeedConfirmation, Component) +function RevealSeedConfirmation () { + Component.call(this) +} + +function mapStateToProps (state) { + return { + warning: state.appState.warning, + } +} + +RevealSeedConfirmation.prototype.render = function () { + const props = this.props + + return ( + + h('.initialize-screen.flex-column.flex-center.flex-grow', { + style: { maxWidth: '420px' }, + }, [ + + h('h3.flex-center.text-transform-uppercase', { + style: { + background: '#EBEBEB', + color: '#AEAEAE', + marginBottom: 24, + width: '100%', + fontSize: '20px', + padding: 6, + }, + }, [ + 'Reveal Seed Words', + ]), + + h('.div', { + style: { + display: 'flex', + flexDirection: 'column', + padding: '20px', + justifyContent: 'center', + }, + }, [ + + h('h4', 'Do not recover your seed words in a public place! These words can be used to steal all your accounts.'), + + // confirmation + h('input.large-input.letter-spacey', { + type: 'password', + id: 'password-box', + placeholder: 'Enter your password to confirm', + onKeyPress: this.checkConfirmation.bind(this), + style: { + width: 260, + marginTop: '12px', + }, + }), + + h('.flex-row.flex-start', { + style: { + marginTop: 30, + width: '50%', + }, + }, [ + // cancel + h('button.primary', { + onClick: this.goHome.bind(this), + }, 'CANCEL'), + + // submit + h('button.primary', { + style: { marginLeft: '10px' }, + onClick: this.revealSeedWords.bind(this), + }, 'OK'), + + ]), + + (props.warning) && ( + h('span.error', { + style: { + margin: '20px', + }, + }, props.warning.split('-')) + ), + + props.inProgress && ( + h('span.in-progress-notification', 'Generating Seed...') + ), + ]), + ]) + ) +} + +RevealSeedConfirmation.prototype.componentDidMount = function () { + document.getElementById('password-box').focus() +} + +RevealSeedConfirmation.prototype.goHome = function () { + this.props.dispatch(actions.showConfigPage(false)) +} + +// create vault + +RevealSeedConfirmation.prototype.checkConfirmation = function (event) { + if (event.key === 'Enter') { + event.preventDefault() + this.revealSeedWords() + } +} + +RevealSeedConfirmation.prototype.revealSeedWords = function () { + var password = document.getElementById('password-box').value + this.props.dispatch(actions.requestRevealSeed(password)) +} diff --git a/old-ui/app/keychains/hd/restore-vault.js b/old-ui/app/keychains/hd/restore-vault.js new file mode 100644 index 000000000..222172dfd --- /dev/null +++ b/old-ui/app/keychains/hd/restore-vault.js @@ -0,0 +1,152 @@ +const inherits = require('util').inherits +const PersistentForm = require('../../../lib/persistent-form') +const connect = require('react-redux').connect +const h = require('react-hyperscript') +const actions = require('../../../../ui/app/actions') + +module.exports = connect(mapStateToProps)(RestoreVaultScreen) + +inherits(RestoreVaultScreen, PersistentForm) +function RestoreVaultScreen () { + PersistentForm.call(this) +} + +function mapStateToProps (state) { + return { + warning: state.appState.warning, + forgottenPassword: state.appState.forgottenPassword, + } +} + +RestoreVaultScreen.prototype.render = function () { + var state = this.props + this.persistentFormParentId = 'restore-vault-form' + + return ( + + h('.initialize-screen.flex-column.flex-center.flex-grow', [ + + h('h3.flex-center.text-transform-uppercase', { + style: { + background: '#EBEBEB', + color: '#AEAEAE', + marginBottom: 24, + width: '100%', + fontSize: '20px', + padding: 6, + }, + }, [ + 'Restore Vault', + ]), + + // wallet seed entry + h('h3', 'Wallet Seed'), + h('textarea.twelve-word-phrase.letter-spacey', { + dataset: { + persistentFormId: 'wallet-seed', + }, + placeholder: 'Enter your secret twelve word phrase here to restore your vault.', + }), + + // password + h('input.large-input.letter-spacey', { + type: 'password', + id: 'password-box', + placeholder: 'New Password (min 8 chars)', + dataset: { + persistentFormId: 'password', + }, + style: { + width: 260, + marginTop: 12, + }, + }), + + // confirm password + h('input.large-input.letter-spacey', { + type: 'password', + id: 'password-box-confirm', + placeholder: 'Confirm Password', + onKeyPress: this.createOnEnter.bind(this), + dataset: { + persistentFormId: 'password-confirmation', + }, + style: { + width: 260, + marginTop: 16, + }, + }), + + (state.warning) && ( + h('span.error.in-progress-notification', state.warning) + ), + + // submit + + h('.flex-row.flex-space-between', { + style: { + marginTop: 30, + width: '50%', + }, + }, [ + + // cancel + h('button.primary', { + onClick: this.showInitializeMenu.bind(this), + }, 'CANCEL'), + + // submit + h('button.primary', { + onClick: this.createNewVaultAndRestore.bind(this), + }, 'OK'), + + ]), + ]) + + ) +} + +RestoreVaultScreen.prototype.showInitializeMenu = function () { + if (this.props.forgottenPassword) { + this.props.dispatch(actions.backToUnlockView()) + } else { + this.props.dispatch(actions.showInitializeMenu()) + } +} + +RestoreVaultScreen.prototype.createOnEnter = function (event) { + if (event.key === 'Enter') { + this.createNewVaultAndRestore() + } +} + +RestoreVaultScreen.prototype.createNewVaultAndRestore = function () { + // check password + var passwordBox = document.getElementById('password-box') + var password = passwordBox.value + var passwordConfirmBox = document.getElementById('password-box-confirm') + var passwordConfirm = passwordConfirmBox.value + if (password.length < 8) { + this.warning = 'Password not long enough' + + this.props.dispatch(actions.displayWarning(this.warning)) + return + } + if (password !== passwordConfirm) { + this.warning = 'Passwords don\'t match' + this.props.dispatch(actions.displayWarning(this.warning)) + return + } + // check seed + var seedBox = document.querySelector('textarea.twelve-word-phrase') + var seed = seedBox.value.trim() + if (seed.split(' ').length !== 12) { + this.warning = 'seed phrases are 12 words long' + this.props.dispatch(actions.displayWarning(this.warning)) + return + } + // submit + this.warning = null + this.props.dispatch(actions.displayWarning(this.warning)) + this.props.dispatch(actions.createNewVaultAndRestore(password, seed)) +} diff --git a/old-ui/app/new-keychain.js b/old-ui/app/new-keychain.js new file mode 100644 index 000000000..cc9633166 --- /dev/null +++ b/old-ui/app/new-keychain.js @@ -0,0 +1,29 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect + +module.exports = connect(mapStateToProps)(NewKeychain) + +function mapStateToProps (state) { + return {} +} + +inherits(NewKeychain, Component) +function NewKeychain () { + Component.call(this) +} + +NewKeychain.prototype.render = function () { + // const props = this.props + + return ( + h('div', { + style: { + background: 'blue', + }, + }, [ + h('h1', `Here's a list!!!!`), + ]) + ) +} diff --git a/old-ui/app/reducers.js b/old-ui/app/reducers.js new file mode 100644 index 000000000..70b7e71dc --- /dev/null +++ b/old-ui/app/reducers.js @@ -0,0 +1,76 @@ +const extend = require('xtend') +const copyToClipboard = require('copy-to-clipboard') + +// +// Sub-Reducers take in the complete state and return their sub-state +// +const reduceIdentities = require('./reducers/identities') +const reduceMetamask = require('./reducers/metamask') +const reduceApp = require('./reducers/app') + +window.METAMASK_CACHED_LOG_STATE = null + +module.exports = rootReducer + +function rootReducer (state, action) { + // clone + state = extend(state) + + if (action.type === 'GLOBAL_FORCE_UPDATE') { + return action.value + } + + // + // Identities + // + + state.identities = reduceIdentities(state, action) + + // + // MetaMask + // + + state.metamask = reduceMetamask(state, action) + + // + // AppState + // + + state.appState = reduceApp(state, action) + + window.METAMASK_CACHED_LOG_STATE = state + return state +} + +window.logStateString = function (cb) { + const state = window.METAMASK_CACHED_LOG_STATE + const version = global.platform.getVersion() + const browser = window.navigator.userAgent + return global.platform.getPlatformInfo((err, platform) => { + if (err) { + return cb(err) + } + state.version = version + state.platform = platform + state.browser = browser + const stateString = JSON.stringify(state, removeSeedWords, 2) + return cb(null, stateString) + }) +} + +window.logState = function (toClipboard) { + return window.logStateString((err, result) => { + if (err) { + console.error(err.message) + } else if (toClipboard) { + copyToClipboard(result) + console.log('State log copied') + } else { + console.log(result) + } + }) +} + +function removeSeedWords (key, value) { + return key === 'seedWords' ? undefined : value +} diff --git a/old-ui/app/reducers/app.js b/old-ui/app/reducers/app.js new file mode 100644 index 000000000..0d7419f9a --- /dev/null +++ b/old-ui/app/reducers/app.js @@ -0,0 +1,599 @@ +const extend = require('xtend') +const actions = require('../../../ui/app/actions') +const txHelper = require('../../lib/tx-helper') + +module.exports = reduceApp + + +function reduceApp (state, action) { + log.debug('App Reducer got ' + action.type) + // clone and defaults + const selectedAddress = state.metamask.selectedAddress + const hasUnconfActions = checkUnconfActions(state) + let name = 'accounts' + if (selectedAddress) { + name = 'accountDetail' + } + if (hasUnconfActions) { + log.debug('pending txs detected, defaulting to conf-tx view.') + name = 'confTx' + } + + var defaultView = { + name, + detailView: null, + context: selectedAddress, + } + + // confirm seed words + var seedWords = state.metamask.seedWords + var seedConfView = { + name: 'createVaultComplete', + seedWords, + } + + // default state + var appState = extend({ + shouldClose: false, + menuOpen: false, + currentView: seedWords ? seedConfView : defaultView, + accountDetail: { + subview: 'transactions', + }, + // Used to render transition direction + transForward: true, + // Used to display loading indicator + isLoading: false, + // Used to display error text + warning: null, + }, state.appState) + + switch (action.type) { + + // transition methods + + case actions.TRANSITION_FORWARD: + return extend(appState, { + transForward: true, + }) + + case actions.TRANSITION_BACKWARD: + return extend(appState, { + transForward: false, + }) + + // intialize + + case actions.SHOW_CREATE_VAULT: + return extend(appState, { + currentView: { + name: 'createVault', + }, + transForward: true, + warning: null, + }) + + case actions.SHOW_RESTORE_VAULT: + return extend(appState, { + currentView: { + name: 'restoreVault', + }, + transForward: true, + forgottenPassword: true, + }) + + case actions.FORGOT_PASSWORD: + return extend(appState, { + currentView: { + name: 'restoreVault', + }, + transForward: false, + forgottenPassword: true, + }) + + case actions.SHOW_INIT_MENU: + return extend(appState, { + currentView: defaultView, + transForward: false, + }) + + case actions.SHOW_CONFIG_PAGE: + return extend(appState, { + currentView: { + name: 'config', + context: appState.currentView.context, + }, + transForward: action.value, + }) + + case actions.SHOW_ADD_TOKEN_PAGE: + return extend(appState, { + currentView: { + name: 'add-token', + context: appState.currentView.context, + }, + transForward: action.value, + }) + + case actions.SHOW_IMPORT_PAGE: + + return extend(appState, { + currentView: { + name: 'import-menu', + }, + transForward: true, + warning: null, + }) + + case actions.SHOW_INFO_PAGE: + return extend(appState, { + currentView: { + name: 'info', + context: appState.currentView.context, + }, + transForward: true, + }) + + case actions.CREATE_NEW_VAULT_IN_PROGRESS: + return extend(appState, { + currentView: { + name: 'createVault', + inProgress: true, + }, + transForward: true, + isLoading: true, + }) + + case actions.SHOW_NEW_VAULT_SEED: + return extend(appState, { + currentView: { + name: 'createVaultComplete', + seedWords: action.value, + }, + transForward: true, + isLoading: false, + }) + + case actions.NEW_ACCOUNT_SCREEN: + return extend(appState, { + currentView: { + name: 'new-account', + context: appState.currentView.context, + }, + transForward: true, + }) + + case actions.SHOW_SEND_PAGE: + return extend(appState, { + currentView: { + name: 'sendTransaction', + context: appState.currentView.context, + }, + transForward: true, + warning: null, + }) + + case actions.SHOW_NEW_KEYCHAIN: + return extend(appState, { + currentView: { + name: 'newKeychain', + context: appState.currentView.context, + }, + transForward: true, + }) + + // unlock + + case actions.UNLOCK_METAMASK: + return extend(appState, { + forgottenPassword: appState.forgottenPassword ? !appState.forgottenPassword : null, + detailView: {}, + transForward: true, + isLoading: false, + warning: null, + }) + + case actions.LOCK_METAMASK: + return extend(appState, { + currentView: defaultView, + transForward: false, + warning: null, + }) + + case actions.BACK_TO_INIT_MENU: + return extend(appState, { + warning: null, + transForward: false, + forgottenPassword: true, + currentView: { + name: 'InitMenu', + }, + }) + + case actions.BACK_TO_UNLOCK_VIEW: + return extend(appState, { + warning: null, + transForward: true, + forgottenPassword: false, + currentView: { + name: 'UnlockScreen', + }, + }) + // reveal seed words + + case actions.REVEAL_SEED_CONFIRMATION: + return extend(appState, { + currentView: { + name: 'reveal-seed-conf', + }, + transForward: true, + warning: null, + }) + + // accounts + + case actions.SET_SELECTED_ACCOUNT: + return extend(appState, { + activeAddress: action.value, + }) + + case actions.GO_HOME: + return extend(appState, { + currentView: extend(appState.currentView, { + name: 'accountDetail', + }), + accountDetail: { + subview: 'transactions', + accountExport: 'none', + privateKey: '', + }, + transForward: false, + warning: null, + }) + + case actions.SHOW_ACCOUNT_DETAIL: + return extend(appState, { + forgottenPassword: appState.forgottenPassword ? !appState.forgottenPassword : null, + currentView: { + name: 'accountDetail', + context: action.value, + }, + accountDetail: { + subview: 'transactions', + accountExport: 'none', + privateKey: '', + }, + transForward: false, + }) + + case actions.BACK_TO_ACCOUNT_DETAIL: + return extend(appState, { + currentView: { + name: 'accountDetail', + context: action.value, + }, + accountDetail: { + subview: 'transactions', + accountExport: 'none', + privateKey: '', + }, + transForward: false, + }) + + case actions.SHOW_ACCOUNTS_PAGE: + return extend(appState, { + currentView: { + name: seedWords ? 'createVaultComplete' : 'accounts', + seedWords, + }, + transForward: true, + isLoading: false, + warning: null, + scrollToBottom: false, + forgottenPassword: false, + }) + + case actions.SHOW_NOTICE: + return extend(appState, { + transForward: true, + isLoading: false, + }) + + case actions.REVEAL_ACCOUNT: + return extend(appState, { + scrollToBottom: true, + }) + + case actions.SHOW_CONF_TX_PAGE: + return extend(appState, { + currentView: { + name: 'confTx', + context: 0, + }, + transForward: action.transForward, + warning: null, + isLoading: false, + }) + + case actions.SHOW_CONF_MSG_PAGE: + return extend(appState, { + currentView: { + name: hasUnconfActions ? 'confTx' : 'account-detail', + context: 0, + }, + transForward: true, + warning: null, + isLoading: false, + }) + + case actions.COMPLETED_TX: + log.debug('reducing COMPLETED_TX for tx ' + action.value) + const otherUnconfActions = getUnconfActionList(state) + .filter(tx => tx.id !== action.value) + const hasOtherUnconfActions = otherUnconfActions.length > 0 + + if (hasOtherUnconfActions) { + log.debug('reducer detected txs - rendering confTx view') + return extend(appState, { + transForward: false, + currentView: { + name: 'confTx', + context: 0, + }, + warning: null, + }) + } else { + log.debug('attempting to close popup') + return extend(appState, { + // indicate notification should close + shouldClose: true, + transForward: false, + warning: null, + currentView: { + name: 'accountDetail', + context: state.metamask.selectedAddress, + }, + accountDetail: { + subview: 'transactions', + }, + }) + } + + case actions.NEXT_TX: + return extend(appState, { + transForward: true, + currentView: { + name: 'confTx', + context: ++appState.currentView.context, + warning: null, + }, + }) + + case actions.VIEW_PENDING_TX: + const context = indexForPending(state, action.value) + return extend(appState, { + transForward: true, + currentView: { + name: 'confTx', + context, + warning: null, + }, + }) + + case actions.PREVIOUS_TX: + return extend(appState, { + transForward: false, + currentView: { + name: 'confTx', + context: --appState.currentView.context, + warning: null, + }, + }) + + case actions.TRANSACTION_ERROR: + return extend(appState, { + currentView: { + name: 'confTx', + errorMessage: 'There was a problem submitting this transaction.', + }, + }) + + case actions.UNLOCK_FAILED: + return extend(appState, { + warning: action.value || 'Incorrect password. Try again.', + }) + + case actions.SHOW_LOADING: + return extend(appState, { + isLoading: true, + loadingMessage: action.value, + }) + + case actions.HIDE_LOADING: + return extend(appState, { + isLoading: false, + }) + + case actions.SHOW_SUB_LOADING_INDICATION: + return extend(appState, { + isSubLoading: true, + }) + + case actions.HIDE_SUB_LOADING_INDICATION: + return extend(appState, { + isSubLoading: false, + }) + case actions.CLEAR_SEED_WORD_CACHE: + return extend(appState, { + transForward: true, + currentView: {}, + isLoading: false, + accountDetail: { + subview: 'transactions', + accountExport: 'none', + privateKey: '', + }, + }) + + case actions.DISPLAY_WARNING: + return extend(appState, { + warning: action.value, + isLoading: false, + }) + + case actions.HIDE_WARNING: + return extend(appState, { + warning: undefined, + }) + + case actions.REQUEST_ACCOUNT_EXPORT: + return extend(appState, { + transForward: true, + currentView: { + name: 'accountDetail', + context: appState.currentView.context, + }, + accountDetail: { + subview: 'export', + accountExport: 'requested', + }, + }) + + case actions.EXPORT_ACCOUNT: + return extend(appState, { + accountDetail: { + subview: 'export', + accountExport: 'completed', + }, + }) + + case actions.SHOW_PRIVATE_KEY: + return extend(appState, { + accountDetail: { + subview: 'export', + accountExport: 'completed', + privateKey: action.value, + }, + }) + + case actions.BUY_ETH_VIEW: + return extend(appState, { + transForward: true, + currentView: { + name: 'buyEth', + context: appState.currentView.name, + }, + identity: state.metamask.identities[action.value], + buyView: { + subview: 'Coinbase', + amount: '15.00', + buyAddress: action.value, + formView: { + coinbase: true, + shapeshift: false, + }, + }, + }) + + case actions.ONBOARDING_BUY_ETH_VIEW: + return extend(appState, { + transForward: true, + currentView: { + name: 'onboardingBuyEth', + context: appState.currentView.name, + }, + identity: state.metamask.identities[action.value], + }) + + case actions.COINBASE_SUBVIEW: + return extend(appState, { + buyView: { + subview: 'Coinbase', + formView: { + coinbase: true, + shapeshift: false, + }, + buyAddress: appState.buyView.buyAddress, + amount: appState.buyView.amount, + }, + }) + + case actions.SHAPESHIFT_SUBVIEW: + return extend(appState, { + buyView: { + subview: 'ShapeShift', + formView: { + coinbase: false, + shapeshift: true, + marketinfo: action.value.marketinfo, + coinOptions: action.value.coinOptions, + }, + buyAddress: appState.buyView.buyAddress, + amount: appState.buyView.amount, + }, + }) + + case actions.PAIR_UPDATE: + return extend(appState, { + buyView: { + subview: 'ShapeShift', + formView: { + coinbase: false, + shapeshift: true, + marketinfo: action.value.marketinfo, + coinOptions: appState.buyView.formView.coinOptions, + }, + buyAddress: appState.buyView.buyAddress, + amount: appState.buyView.amount, + warning: null, + }, + }) + + case actions.SHOW_QR: + return extend(appState, { + qrRequested: true, + transForward: true, + + Qr: { + message: action.value.message, + data: action.value.data, + }, + }) + + case actions.SHOW_QR_VIEW: + return extend(appState, { + currentView: { + name: 'qr', + context: appState.currentView.context, + }, + transForward: true, + Qr: { + message: action.value.message, + data: action.value.data, + }, + }) + default: + return appState + } +} + +function checkUnconfActions (state) { + const unconfActionList = getUnconfActionList(state) + const hasUnconfActions = unconfActionList.length > 0 + return hasUnconfActions +} + +function getUnconfActionList (state) { + const { unapprovedTxs, unapprovedMsgs, + unapprovedPersonalMsgs, unapprovedTypedMessages, network } = state.metamask + + const unconfActionList = txHelper(unapprovedTxs, unapprovedMsgs, unapprovedPersonalMsgs, unapprovedTypedMessages, network) + return unconfActionList +} + +function indexForPending (state, txId) { + const unconfTxList = getUnconfActionList(state) + const match = unconfTxList.find((tx) => tx.id === txId) + const index = unconfTxList.indexOf(match) + return index +} diff --git a/old-ui/app/reducers/identities.js b/old-ui/app/reducers/identities.js new file mode 100644 index 000000000..341a404e7 --- /dev/null +++ b/old-ui/app/reducers/identities.js @@ -0,0 +1,15 @@ +const extend = require('xtend') + +module.exports = reduceIdentities + +function reduceIdentities (state, action) { + // clone + defaults + var idState = extend({ + + }, state.identities) + + switch (action.type) { + default: + return idState + } +} diff --git a/old-ui/app/reducers/metamask.js b/old-ui/app/reducers/metamask.js new file mode 100644 index 000000000..68ad975a7 --- /dev/null +++ b/old-ui/app/reducers/metamask.js @@ -0,0 +1,166 @@ +const extend = require('xtend') +const actions = require('../../../ui/app/actions') +const MetamascaraPlatform = require('../../../app/scripts/platforms/window') + +module.exports = reduceMetamask + +function reduceMetamask (state, action) { + let newState + + // clone + defaults + var metamaskState = extend({ + isInitialized: false, + isUnlocked: false, + isMascara: window.platform instanceof MetamascaraPlatform, + rpcTarget: 'https://rawtestrpc.metamask.io/', + identities: {}, + unapprovedTxs: {}, + noActiveNotices: true, + lastUnreadNotice: undefined, + frequentRpcList: [], + addressBook: [], + tokenExchangeRates: {}, + coinOptions: {}, + featureFlags: {}, + }, state.metamask) + + switch (action.type) { + + case actions.SHOW_ACCOUNTS_PAGE: + newState = extend(metamaskState) + delete newState.seedWords + return newState + + case actions.SHOW_NOTICE: + return extend(metamaskState, { + noActiveNotices: false, + lastUnreadNotice: action.value, + }) + + case actions.CLEAR_NOTICES: + return extend(metamaskState, { + noActiveNotices: true, + }) + + case actions.UPDATE_METAMASK_STATE: + return extend(metamaskState, action.value) + + case actions.UNLOCK_METAMASK: + return extend(metamaskState, { + isUnlocked: true, + isInitialized: true, + selectedAddress: action.value, + }) + + case actions.LOCK_METAMASK: + return extend(metamaskState, { + isUnlocked: false, + }) + + case actions.SET_RPC_LIST: + return extend(metamaskState, { + frequentRpcList: action.value, + }) + + case actions.SET_RPC_TARGET: + return extend(metamaskState, { + provider: { + type: 'rpc', + rpcTarget: action.value, + }, + }) + + case actions.SET_PROVIDER_TYPE: + return extend(metamaskState, { + provider: { + type: action.value, + }, + }) + + case actions.COMPLETED_TX: + var stringId = String(action.id) + newState = extend(metamaskState, { + unapprovedTxs: {}, + unapprovedMsgs: {}, + }) + for (const id in metamaskState.unapprovedTxs) { + if (id !== stringId) { + newState.unapprovedTxs[id] = metamaskState.unapprovedTxs[id] + } + } + for (const id in metamaskState.unapprovedMsgs) { + if (id !== stringId) { + newState.unapprovedMsgs[id] = metamaskState.unapprovedMsgs[id] + } + } + return newState + + case actions.SHOW_NEW_VAULT_SEED: + return extend(metamaskState, { + isUnlocked: true, + isInitialized: false, + seedWords: action.value, + }) + + case actions.CLEAR_SEED_WORD_CACHE: + newState = extend(metamaskState, { + isUnlocked: true, + isInitialized: true, + selectedAddress: action.value, + }) + delete newState.seedWords + return newState + + case actions.SHOW_ACCOUNT_DETAIL: + newState = extend(metamaskState, { + isUnlocked: true, + isInitialized: true, + selectedAddress: action.value, + }) + delete newState.seedWords + return newState + + case actions.SAVE_ACCOUNT_LABEL: + const account = action.value.account + const name = action.value.label + var id = {} + id[account] = extend(metamaskState.identities[account], { name }) + var identities = extend(metamaskState.identities, id) + return extend(metamaskState, { identities }) + + case actions.SET_CURRENT_FIAT: + return extend(metamaskState, { + currentCurrency: action.value.currentCurrency, + conversionRate: action.value.conversionRate, + conversionDate: action.value.conversionDate, + }) + + case actions.PAIR_UPDATE: + const { value: { marketinfo: pairMarketInfo } } = action + return extend(metamaskState, { + tokenExchangeRates: { + ...metamaskState.tokenExchangeRates, + [pairMarketInfo.pair]: pairMarketInfo, + }, + }) + + case actions.SHAPESHIFT_SUBVIEW: + const { value: { marketinfo, coinOptions } } = action + return extend(metamaskState, { + tokenExchangeRates: { + ...metamaskState.tokenExchangeRates, + [marketinfo.pair]: marketinfo, + }, + coinOptions, + }) + + case actions.UPDATE_FEATURE_FLAGS: + return extend(metamaskState, { + featureFlags: action.value, + }) + + default: + return metamaskState + + } +} diff --git a/old-ui/app/root.js b/old-ui/app/root.js new file mode 100644 index 000000000..9fea85572 --- /dev/null +++ b/old-ui/app/root.js @@ -0,0 +1,23 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const Provider = require('react-redux').Provider +const h = require('react-hyperscript') +const App = require('./app') + +module.exports = Root + +inherits(Root, Component) +function Root () { Component.call(this) } + +Root.prototype.render = function () { + console.log(123454) + return ( + + h(Provider, { + store: this.props.store, + }, [ + h(App), + ]) + + ) +} diff --git a/old-ui/app/send.js b/old-ui/app/send.js new file mode 100644 index 000000000..9ab064aea --- /dev/null +++ b/old-ui/app/send.js @@ -0,0 +1,293 @@ +const inherits = require('util').inherits +const PersistentForm = require('../lib/persistent-form') +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const Identicon = require('./components/identicon') +const actions = require('../../ui/app/actions') +const util = require('./util') +const numericBalance = require('./util').numericBalance +const addressSummary = require('./util').addressSummary +const isHex = require('./util').isHex +const EthBalance = require('./components/eth-balance') +const EnsInput = require('./components/ens-input') +const ethUtil = require('ethereumjs-util') +module.exports = connect(mapStateToProps)(SendTransactionScreen) + +function mapStateToProps (state) { + var result = { + address: state.metamask.selectedAddress, + accounts: state.metamask.accounts, + identities: state.metamask.identities, + warning: state.appState.warning, + network: state.metamask.network, + addressBook: state.metamask.addressBook, + conversionRate: state.metamask.conversionRate, + currentCurrency: state.metamask.currentCurrency, + } + + result.error = result.warning && result.warning.split('.')[0] + + result.account = result.accounts[result.address] + result.identity = result.identities[result.address] + result.balance = result.account ? numericBalance(result.account.balance) : null + + return result +} + +inherits(SendTransactionScreen, PersistentForm) +function SendTransactionScreen () { + PersistentForm.call(this) +} + +SendTransactionScreen.prototype.render = function () { + this.persistentFormParentId = 'send-tx-form' + + const props = this.props + const { + address, + account, + identity, + network, + identities, + addressBook, + conversionRate, + currentCurrency, + } = props + + return ( + + h('.send-screen.flex-column.flex-grow', [ + + // + // Sender Profile + // + + h('.account-data-subsection.flex-row.flex-grow', { + style: { + margin: '0 20px', + }, + }, [ + + // header - identicon + nav + h('.flex-row.flex-space-between', { + style: { + marginTop: '15px', + }, + }, [ + // back button + h('i.fa.fa-arrow-left.fa-lg.cursor-pointer.color-orange', { + onClick: this.back.bind(this), + }), + + // large identicon + h('.identicon-wrapper.flex-column.flex-center.select-none', [ + h(Identicon, { + diameter: 62, + address: address, + }), + ]), + + // invisible place holder + h('i.fa.fa-users.fa-lg.invisible', { + style: { + marginTop: '28px', + }, + }), + + ]), + + // account label + + h('.flex-column', { + style: { + marginTop: '10px', + alignItems: 'flex-start', + }, + }, [ + h('h2.font-medium.color-forest.flex-center', { + style: { + paddingTop: '8px', + marginBottom: '8px', + }, + }, identity && identity.name), + + // address and getter actions + h('.flex-row.flex-center', { + style: { + marginBottom: '8px', + }, + }, [ + + h('div', { + style: { + lineHeight: '16px', + }, + }, addressSummary(address)), + + ]), + + // balance + h('.flex-row.flex-center', [ + + h(EthBalance, { + value: account && account.balance, + conversionRate, + currentCurrency, + }), + + ]), + ]), + ]), + + // + // Required Fields + // + + h('h3.flex-center.text-transform-uppercase', { + style: { + background: '#EBEBEB', + color: '#AEAEAE', + marginTop: '15px', + marginBottom: '16px', + }, + }, [ + 'Send Transaction', + ]), + + // error message + props.error && h('span.error.flex-center', props.error), + + // 'to' field + h('section.flex-row.flex-center', [ + h(EnsInput, { + name: 'address', + placeholder: 'Recipient Address', + onChange: this.recipientDidChange.bind(this), + network, + identities, + addressBook, + }), + ]), + + // 'amount' and send button + h('section.flex-row.flex-center', [ + + h('input.large-input', { + name: 'amount', + placeholder: 'Amount', + type: 'number', + style: { + marginRight: '6px', + }, + dataset: { + persistentFormId: 'tx-amount', + }, + }), + + h('button.primary', { + onClick: this.onSubmit.bind(this), + style: { + textTransform: 'uppercase', + }, + }, 'Next'), + + ]), + + // + // Optional Fields + // + h('h3.flex-center.text-transform-uppercase', { + style: { + background: '#EBEBEB', + color: '#AEAEAE', + marginTop: '16px', + marginBottom: '16px', + }, + }, [ + 'Transaction Data (optional)', + ]), + + // 'data' field + h('section.flex-column.flex-center', [ + h('input.large-input', { + name: 'txData', + placeholder: '0x01234', + style: { + width: '100%', + resize: 'none', + }, + dataset: { + persistentFormId: 'tx-data', + }, + }), + ]), + ]) + ) +} + +SendTransactionScreen.prototype.navigateToAccounts = function (event) { + event.stopPropagation() + this.props.dispatch(actions.showAccountsPage()) +} + +SendTransactionScreen.prototype.back = function () { + var address = this.props.address + this.props.dispatch(actions.backToAccountDetail(address)) +} + +SendTransactionScreen.prototype.recipientDidChange = function (recipient, nickname) { + this.setState({ + recipient: recipient, + nickname: nickname, + }) +} + +SendTransactionScreen.prototype.onSubmit = function () { + const state = this.state || {} + const recipient = state.recipient || document.querySelector('input[name="address"]').value.replace(/^[.\s]+|[.\s]+$/g, '') + const nickname = state.nickname || ' ' + const input = document.querySelector('input[name="amount"]').value + const value = util.normalizeEthStringToWei(input) + const txData = document.querySelector('input[name="txData"]').value + const balance = this.props.balance + let message + + if (value.gt(balance)) { + message = 'Insufficient funds.' + return this.props.dispatch(actions.displayWarning(message)) + } + + if (input < 0) { + message = 'Can not send negative amounts of ETH.' + return this.props.dispatch(actions.displayWarning(message)) + } + + if ((util.isInvalidChecksumAddress(recipient))) { + message = 'Recipient address checksum is invalid.' + return this.props.dispatch(actions.displayWarning(message)) + } + + if ((!util.isValidAddress(recipient) && !txData) || (!recipient && !txData)) { + message = 'Recipient address is invalid.' + return this.props.dispatch(actions.displayWarning(message)) + } + + if (!isHex(ethUtil.stripHexPrefix(txData)) && txData) { + message = 'Transaction data must be hex string.' + return this.props.dispatch(actions.displayWarning(message)) + } + + this.props.dispatch(actions.hideWarning()) + + this.props.dispatch(actions.addToAddressBook(recipient, nickname)) + + var txParams = { + from: this.props.address, + value: '0x' + value.toString(16), + } + + if (recipient) txParams.to = ethUtil.addHexPrefix(recipient) + if (txData) txParams.data = txData + + this.props.dispatch(actions.signTx(txParams)) +} diff --git a/old-ui/app/settings.js b/old-ui/app/settings.js new file mode 100644 index 000000000..8df37c555 --- /dev/null +++ b/old-ui/app/settings.js @@ -0,0 +1,59 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const actions = require('../../ui/app/actions') + +module.exports = connect(mapStateToProps)(AppSettingsPage) + +function mapStateToProps (state) { + return {} +} + +inherits(AppSettingsPage, Component) +function AppSettingsPage () { + Component.call(this) +} + +AppSettingsPage.prototype.render = function () { + return ( + + h('.account-detail-section.flex-column.flex-grow', [ + + // subtitle and nav + h('.flex-row.flex-center', [ + h('i.fa.fa-arrow-left.fa-lg.cursor-pointer', { + onClick: this.navigateToAccounts.bind(this), + }), + h('h2.page-subtitle', 'Settings'), + ]), + + h('label', { + htmlFor: 'settings-rpc-endpoint', + }, 'RPC Endpoint:'), + h('input', { + type: 'url', + id: 'settings-rpc-endpoint', + onKeyPress: this.onKeyPress.bind(this), + }), + + ]) + + ) +} + +AppSettingsPage.prototype.componentDidMount = function () { + document.querySelector('input').focus() +} + +AppSettingsPage.prototype.onKeyPress = function (event) { + // get submit event + if (event.key === 'Enter') { + // this.submitPassword(event) + } +} + +AppSettingsPage.prototype.navigateToAccounts = function (event) { + event.stopPropagation() + this.props.dispatch(actions.showAccountsPage()) +} diff --git a/old-ui/app/store.js b/old-ui/app/store.js new file mode 100644 index 000000000..3bafdee11 --- /dev/null +++ b/old-ui/app/store.js @@ -0,0 +1,21 @@ +const createStore = require('redux').createStore +const applyMiddleware = require('redux').applyMiddleware +const thunkMiddleware = require('redux-thunk').default +const rootReducer = require('./reducers') +const createLogger = require('redux-logger').createLogger + +global.METAMASK_DEBUG = 'GULP_METAMASK_DEBUG' + +module.exports = configureStore + +const loggerMiddleware = createLogger({ + predicate: () => global.METAMASK_DEBUG, +}) + +const middlewares = [thunkMiddleware, loggerMiddleware] + +const createStoreWithMiddleware = applyMiddleware(...middlewares)(createStore) + +function configureStore (initialState) { + return createStoreWithMiddleware(rootReducer, initialState) +} diff --git a/old-ui/app/template.js b/old-ui/app/template.js new file mode 100644 index 000000000..d15b30fd2 --- /dev/null +++ b/old-ui/app/template.js @@ -0,0 +1,30 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect + +module.exports = connect(mapStateToProps)(COMPONENTNAME) + +function mapStateToProps (state) { + return {} +} + +inherits(COMPONENTNAME, Component) +function COMPONENTNAME () { + Component.call(this) +} + +COMPONENTNAME.prototype.render = function () { + const props = this.props + + return ( + h('div', { + style: { + background: 'blue', + }, + }, [ + `Hello, ${props.sender}`, + ]) + ) +} + diff --git a/old-ui/app/unlock.js b/old-ui/app/unlock.js new file mode 100644 index 000000000..a1f791552 --- /dev/null +++ b/old-ui/app/unlock.js @@ -0,0 +1,122 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const h = require('react-hyperscript') +const connect = require('react-redux').connect +const actions = require('../../ui/app/actions') +const getCaretCoordinates = require('textarea-caret') +const EventEmitter = require('events').EventEmitter + +const Mascot = require('./components/mascot') + +module.exports = connect(mapStateToProps)(UnlockScreen) + +inherits(UnlockScreen, Component) +function UnlockScreen () { + Component.call(this) + this.animationEventEmitter = new EventEmitter() +} + +function mapStateToProps (state) { + return { + warning: state.appState.warning, + } +} + +UnlockScreen.prototype.render = function () { + const state = this.props + const warning = state.warning + return ( + h('.flex-column', { + style: { + width: 'inherit', + }, + }, [ + h('.unlock-screen.flex-column.flex-center.flex-grow', [ + + h(Mascot, { + animationEventEmitter: this.animationEventEmitter, + }), + + h('h1', { + style: { + fontSize: '1.4em', + textTransform: 'uppercase', + color: '#7F8082', + }, + }, 'MetaMask'), + + h('input.large-input', { + type: 'password', + id: 'password-box', + placeholder: 'enter password', + style: { + + }, + onKeyPress: this.onKeyPress.bind(this), + onInput: this.inputChanged.bind(this), + }), + + h('.error', { + style: { + display: warning ? 'block' : 'none', + padding: '0 20px', + textAlign: 'center', + }, + }, warning), + + h('button.primary.cursor-pointer', { + onClick: this.onSubmit.bind(this), + style: { + margin: 10, + }, + }, 'Unlock'), + ]), + + h('.flex-row.flex-center.flex-grow', [ + h('p.pointer', { + onClick: () => this.props.dispatch(actions.forgotPassword()), + style: { + fontSize: '0.8em', + color: 'rgb(247, 134, 28)', + textDecoration: 'underline', + }, + }, 'Restore from seed phrase'), + ]), + ]) + ) +} + +UnlockScreen.prototype.componentDidMount = function () { + document.getElementById('password-box').focus() +} + +UnlockScreen.prototype.onSubmit = function (event) { + const input = document.getElementById('password-box') + const password = input.value + this.props.dispatch(actions.tryUnlockMetamask(password)) +} + +UnlockScreen.prototype.onKeyPress = function (event) { + if (event.key === 'Enter') { + this.submitPassword(event) + } +} + +UnlockScreen.prototype.submitPassword = function (event) { + var element = event.target + var password = element.value + // reset input + element.value = '' + this.props.dispatch(actions.tryUnlockMetamask(password)) +} + +UnlockScreen.prototype.inputChanged = function (event) { + // tell mascot to look at page action + var element = event.target + var boundingRect = element.getBoundingClientRect() + var coordinates = getCaretCoordinates(element, element.selectionEnd) + this.animationEventEmitter.emit('point', { + x: boundingRect.left + coordinates.left - element.scrollLeft, + y: boundingRect.top + coordinates.top - element.scrollTop, + }) +} diff --git a/old-ui/app/util.js b/old-ui/app/util.js new file mode 100644 index 000000000..3f8b4dcc3 --- /dev/null +++ b/old-ui/app/util.js @@ -0,0 +1,240 @@ +const ethUtil = require('ethereumjs-util') + +var valueTable = { + wei: '1000000000000000000', + kwei: '1000000000000000', + mwei: '1000000000000', + gwei: '1000000000', + szabo: '1000000', + finney: '1000', + ether: '1', + kether: '0.001', + mether: '0.000001', + gether: '0.000000001', + tether: '0.000000000001', +} +var bnTable = {} +for (var currency in valueTable) { + bnTable[currency] = new ethUtil.BN(valueTable[currency], 10) +} + +module.exports = { + valuesFor: valuesFor, + addressSummary: addressSummary, + miniAddressSummary: miniAddressSummary, + isAllOneCase: isAllOneCase, + isValidAddress: isValidAddress, + numericBalance: numericBalance, + parseBalance: parseBalance, + formatBalance: formatBalance, + generateBalanceObject: generateBalanceObject, + dataSize: dataSize, + readableDate: readableDate, + normalizeToWei: normalizeToWei, + normalizeEthStringToWei: normalizeEthStringToWei, + normalizeNumberToWei: normalizeNumberToWei, + valueTable: valueTable, + bnTable: bnTable, + isHex: isHex, + exportAsFile: exportAsFile, + isInvalidChecksumAddress, +} + +function valuesFor (obj) { + if (!obj) return [] + return Object.keys(obj) + .map(function (key) { return obj[key] }) +} + +function addressSummary (address, firstSegLength = 10, lastSegLength = 4, includeHex = true) { + if (!address) return '' + let checked = ethUtil.toChecksumAddress(address) + if (!includeHex) { + checked = ethUtil.stripHexPrefix(checked) + } + return checked ? checked.slice(0, firstSegLength) + '...' + checked.slice(checked.length - lastSegLength) : '...' +} + +function miniAddressSummary (address) { + if (!address) return '' + var checked = ethUtil.toChecksumAddress(address) + return checked ? checked.slice(0, 4) + '...' + checked.slice(-4) : '...' +} + +function isValidAddress (address) { + var prefixed = ethUtil.addHexPrefix(address) + if (address === '0x0000000000000000000000000000000000000000') return false + return (isAllOneCase(prefixed) && ethUtil.isValidAddress(prefixed)) || ethUtil.isValidChecksumAddress(prefixed) +} + +function isInvalidChecksumAddress (address) { + var prefixed = ethUtil.addHexPrefix(address) + if (address === '0x0000000000000000000000000000000000000000') return false + return !isAllOneCase(prefixed) && !ethUtil.isValidChecksumAddress(prefixed) && ethUtil.isValidAddress(prefixed) +} + +function isAllOneCase (address) { + if (!address) return true + var lower = address.toLowerCase() + var upper = address.toUpperCase() + return address === lower || address === upper +} + +// Takes wei Hex, returns wei BN, even if input is null +function numericBalance (balance) { + if (!balance) return new ethUtil.BN(0, 16) + var stripped = ethUtil.stripHexPrefix(balance) + return new ethUtil.BN(stripped, 16) +} + +// Takes hex, returns [beforeDecimal, afterDecimal] +function parseBalance (balance) { + var beforeDecimal, afterDecimal + const wei = numericBalance(balance) + var weiString = wei.toString() + const trailingZeros = /0+$/ + + beforeDecimal = weiString.length > 18 ? weiString.slice(0, weiString.length - 18) : '0' + afterDecimal = ('000000000000000000' + wei).slice(-18).replace(trailingZeros, '') + if (afterDecimal === '') { afterDecimal = '0' } + return [beforeDecimal, afterDecimal] +} + +// Takes wei hex, returns an object with three properties. +// Its "formatted" property is what we generally use to render values. +function formatBalance (balance, decimalsToKeep, needsParse = true) { + var parsed = needsParse ? parseBalance(balance) : balance.split('.') + var beforeDecimal = parsed[0] + var afterDecimal = parsed[1] + var formatted = 'None' + if (decimalsToKeep === undefined) { + if (beforeDecimal === '0') { + if (afterDecimal !== '0') { + var sigFigs = afterDecimal.match(/^0*(.{2})/) // default: grabs 2 most significant digits + if (sigFigs) { afterDecimal = sigFigs[0] } + formatted = '0.' + afterDecimal + ' ETH' + } + } else { + formatted = beforeDecimal + '.' + afterDecimal.slice(0, 3) + ' ETH' + } + } else { + afterDecimal += Array(decimalsToKeep).join('0') + formatted = beforeDecimal + '.' + afterDecimal.slice(0, decimalsToKeep) + ' ETH' + } + return formatted +} + + +function generateBalanceObject (formattedBalance, decimalsToKeep = 1) { + var balance = formattedBalance.split(' ')[0] + var label = formattedBalance.split(' ')[1] + var beforeDecimal = balance.split('.')[0] + var afterDecimal = balance.split('.')[1] + var shortBalance = shortenBalance(balance, decimalsToKeep) + + if (beforeDecimal === '0' && afterDecimal.substr(0, 5) === '00000') { + // eslint-disable-next-line eqeqeq + if (afterDecimal == 0) { + balance = '0' + } else { + balance = '<1.0e-5' + } + } else if (beforeDecimal !== '0') { + balance = `${beforeDecimal}.${afterDecimal.slice(0, decimalsToKeep)}` + } + + return { balance, label, shortBalance } +} + +function shortenBalance (balance, decimalsToKeep = 1) { + var truncatedValue + var convertedBalance = parseFloat(balance) + if (convertedBalance > 1000000) { + truncatedValue = (balance / 1000000).toFixed(decimalsToKeep) + return `${truncatedValue}m` + } else if (convertedBalance > 1000) { + truncatedValue = (balance / 1000).toFixed(decimalsToKeep) + return `${truncatedValue}k` + } else if (convertedBalance === 0) { + return '0' + } else if (convertedBalance < 0.001) { + return '<0.001' + } else if (convertedBalance < 1) { + var stringBalance = convertedBalance.toString() + if (stringBalance.split('.')[1].length > 3) { + return convertedBalance.toFixed(3) + } else { + return stringBalance + } + } else { + return convertedBalance.toFixed(decimalsToKeep) + } +} + +function dataSize (data) { + var size = data ? ethUtil.stripHexPrefix(data).length : 0 + return size + ' bytes' +} + +// Takes a BN and an ethereum currency name, +// returns a BN in wei +function normalizeToWei (amount, currency) { + try { + return amount.mul(bnTable.wei).div(bnTable[currency]) + } catch (e) {} + return amount +} + +function normalizeEthStringToWei (str) { + const parts = str.split('.') + let eth = new ethUtil.BN(parts[0], 10).mul(bnTable.wei) + if (parts[1]) { + var decimal = parts[1] + while (decimal.length < 18) { + decimal += '0' + } + const decimalBN = new ethUtil.BN(decimal, 10) + eth = eth.add(decimalBN) + } + return eth +} + +var multiple = new ethUtil.BN('10000', 10) +function normalizeNumberToWei (n, currency) { + var enlarged = n * 10000 + var amount = new ethUtil.BN(String(enlarged), 10) + return normalizeToWei(amount, currency).div(multiple) +} + +function readableDate (ms) { + var date = new Date(ms) + var month = date.getMonth() + var day = date.getDate() + var year = date.getFullYear() + var hours = date.getHours() + var minutes = '0' + date.getMinutes() + var seconds = '0' + date.getSeconds() + + var dateStr = `${month}/${day}/${year}` + var time = `${hours}:${minutes.substr(-2)}:${seconds.substr(-2)}` + return `${dateStr} ${time}` +} + +function isHex (str) { + return Boolean(str.match(/^(0x)?[0-9a-fA-F]+$/)) +} + +function exportAsFile (filename, data) { + // source: https://stackoverflow.com/a/33542499 by Ludovic Feltz + const blob = new Blob([data], {type: 'text/csv'}) + if (window.navigator.msSaveOrOpenBlob) { + window.navigator.msSaveBlob(blob, filename) + } else { + const elem = window.document.createElement('a') + elem.href = window.URL.createObjectURL(blob) + elem.download = filename + document.body.appendChild(elem) + elem.click() + document.body.removeChild(elem) + } +} diff --git a/old-ui/css.js b/old-ui/css.js new file mode 100644 index 000000000..21b311c28 --- /dev/null +++ b/old-ui/css.js @@ -0,0 +1,30 @@ +const fs = require('fs') +const path = require('path') + +module.exports = bundleCss + +var cssFiles = { + 'fonts.css': fs.readFileSync(path.join(__dirname, '/app/css/fonts.css'), 'utf8'), + 'reset.css': fs.readFileSync(path.join(__dirname, '/app/css/reset.css'), 'utf8'), + 'lib.css': fs.readFileSync(path.join(__dirname, '/app/css/lib.css'), 'utf8'), + 'index.css': fs.readFileSync(path.join(__dirname, '/app/css/index.css'), 'utf8'), + 'transitions.css': fs.readFileSync(path.join(__dirname, '/app/css/transitions.css'), 'utf8'), + 'first-time.css': fs.readFileSync(path.join(__dirname, '../mascara/src/app/first-time/index.css'), 'utf8'), + 'react-tooltip-component.css': fs.readFileSync(path.join(__dirname, '..', 'node_modules', 'react-tooltip-component', 'dist', 'react-tooltip-component.css'), 'utf8'), + 'react-css': fs.readFileSync(path.join(__dirname, '..', 'node_modules', 'react-select', 'dist', 'react-select.css'), 'utf8'), +} + +function bundleCss () { + var cssBundle = Object.keys(cssFiles).reduce(function (bundle, fileName) { + var fileContent = cssFiles[fileName] + var output = String() + + output += '/*========== ' + fileName + ' ==========*/\n\n' + output += fileContent + output += '\n\n' + + return bundle + output + }, String()) + + return cssBundle +} diff --git a/old-ui/design/00-metamask-SignIn.jpg b/old-ui/design/00-metamask-SignIn.jpg Binary files differnew file mode 100644 index 000000000..2becdb032 --- /dev/null +++ b/old-ui/design/00-metamask-SignIn.jpg diff --git a/old-ui/design/01-metamask-SelectAcc.jpg b/old-ui/design/01-metamask-SelectAcc.jpg Binary files differnew file mode 100644 index 000000000..239091a98 --- /dev/null +++ b/old-ui/design/01-metamask-SelectAcc.jpg diff --git a/old-ui/design/02-metamask-AccDetails.jpg b/old-ui/design/02-metamask-AccDetails.jpg Binary files differnew file mode 100644 index 000000000..d7d408ffc --- /dev/null +++ b/old-ui/design/02-metamask-AccDetails.jpg diff --git a/old-ui/design/02a-metamask-AccDetails-OverToken.jpg b/old-ui/design/02a-metamask-AccDetails-OverToken.jpg Binary files differnew file mode 100644 index 000000000..f26ff31e8 --- /dev/null +++ b/old-ui/design/02a-metamask-AccDetails-OverToken.jpg diff --git a/old-ui/design/02a-metamask-AccDetails-OverTransaction.jpg b/old-ui/design/02a-metamask-AccDetails-OverTransaction.jpg Binary files differnew file mode 100644 index 000000000..8a06be6b9 --- /dev/null +++ b/old-ui/design/02a-metamask-AccDetails-OverTransaction.jpg diff --git a/old-ui/design/02a-metamask-AccDetails.jpg b/old-ui/design/02a-metamask-AccDetails.jpg Binary files differnew file mode 100644 index 000000000..c37e0f539 --- /dev/null +++ b/old-ui/design/02a-metamask-AccDetails.jpg diff --git a/old-ui/design/02b-metamask-AccDetails-Send.jpg b/old-ui/design/02b-metamask-AccDetails-Send.jpg Binary files differnew file mode 100644 index 000000000..10f2d27fd --- /dev/null +++ b/old-ui/design/02b-metamask-AccDetails-Send.jpg diff --git a/old-ui/design/03-metamask-Qr.jpg b/old-ui/design/03-metamask-Qr.jpg Binary files differnew file mode 100644 index 000000000..9c09de42f --- /dev/null +++ b/old-ui/design/03-metamask-Qr.jpg diff --git a/old-ui/design/05-metamask-Menu.jpg b/old-ui/design/05-metamask-Menu.jpg Binary files differnew file mode 100644 index 000000000..0a43d7b2a --- /dev/null +++ b/old-ui/design/05-metamask-Menu.jpg diff --git a/old-ui/design/chromeStorePics/final_screen_dao_accounts.png b/old-ui/design/chromeStorePics/final_screen_dao_accounts.png Binary files differnew file mode 100644 index 000000000..805cc96b6 --- /dev/null +++ b/old-ui/design/chromeStorePics/final_screen_dao_accounts.png diff --git a/old-ui/design/chromeStorePics/final_screen_dao_locked.png b/old-ui/design/chromeStorePics/final_screen_dao_locked.png Binary files differnew file mode 100644 index 000000000..9d9e33930 --- /dev/null +++ b/old-ui/design/chromeStorePics/final_screen_dao_locked.png diff --git a/old-ui/design/chromeStorePics/final_screen_dao_notification.png b/old-ui/design/chromeStorePics/final_screen_dao_notification.png Binary files differnew file mode 100644 index 000000000..d56a5ce62 --- /dev/null +++ b/old-ui/design/chromeStorePics/final_screen_dao_notification.png diff --git a/old-ui/design/chromeStorePics/final_screen_wei_account.png b/old-ui/design/chromeStorePics/final_screen_wei_account.png Binary files differnew file mode 100644 index 000000000..d503ff301 --- /dev/null +++ b/old-ui/design/chromeStorePics/final_screen_wei_account.png diff --git a/old-ui/design/chromeStorePics/final_screen_wei_notification.png b/old-ui/design/chromeStorePics/final_screen_wei_notification.png Binary files differnew file mode 100644 index 000000000..3560c51ff --- /dev/null +++ b/old-ui/design/chromeStorePics/final_screen_wei_notification.png diff --git a/old-ui/design/chromeStorePics/icon-128.png b/old-ui/design/chromeStorePics/icon-128.png Binary files differnew file mode 100644 index 000000000..ae687147d --- /dev/null +++ b/old-ui/design/chromeStorePics/icon-128.png diff --git a/old-ui/design/chromeStorePics/icon-64.png b/old-ui/design/chromeStorePics/icon-64.png Binary files differnew file mode 100644 index 000000000..7062cf4f1 --- /dev/null +++ b/old-ui/design/chromeStorePics/icon-64.png diff --git a/old-ui/design/chromeStorePics/metamask_icon.ai b/old-ui/design/chromeStorePics/metamask_icon.ai new file mode 100644 index 000000000..27400c5a4 --- /dev/null +++ b/old-ui/design/chromeStorePics/metamask_icon.ai @@ -0,0 +1,2383 @@ +%PDF-1.5
%����
+1 0 obj
<</Metadata 2 0 R/OCProperties<</D<</ON[5 0 R]/Order 6 0 R/RBGroups[]>>/OCGs[5 0 R]>>/Pages 3 0 R/Type/Catalog>>
endobj
2 0 obj
<</Length 47428/Subtype/XML/Type/Metadata>>stream
+<?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c111 79.158366, 2015/09/25-01:12:00 "> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:xmp="http://ns.adobe.com/xap/1.0/" + xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/" + xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" + xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" + xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#" + xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/" + xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/" + xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#" + xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/" + xmlns:pdf="http://ns.adobe.com/pdf/1.3/"> + <dc:format>application/pdf</dc:format> + <dc:title> + <rdf:Alt> + <rdf:li xml:lang="x-default">metamask_icon</rdf:li> + </rdf:Alt> + </dc:title> + <xmp:CreatorTool>Adobe Illustrator CC 2015 (Macintosh)</xmp:CreatorTool> + <xmp:CreateDate>2016-06-15T14:23:12-04:00</xmp:CreateDate> + <xmp:ModifyDate>2016-06-15T14:23:12-04:00</xmp:ModifyDate> + <xmp:MetadataDate>2016-06-15T14:23:12-04:00</xmp:MetadataDate> + <xmp:Thumbnails> + <rdf:Alt> + <rdf:li rdf:parseType="Resource"> + <xmpGImg:width>240</xmpGImg:width> + <xmpGImg:height>256</xmpGImg:height> + <xmpGImg:format>JPEG</xmpGImg:format> + <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAADwAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7
FXnP5r/mvB5Tg/RmnAT6/cJyUMKx28bVAkf+ZjT4U+k7UDYuo1HBsObl6bTce5+l5X+Wf5t6jonm
KZtfu5rzTNVcG+lkZpHilACLOAamgUBWC/sgUrxAzEwakxl6uRczUaYSj6eYfS9vcQXEEdxA6ywT
KskUimqsjCqsCOoIObUG3UkUvxQ7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY
q7FXYq7FXYq7FXln5rfnHb+X1l0bQnWfXCCs0+zR2tfEGoaTwXoO/hmJqNTw7Dm5mm0plvL6fvfO
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</xmpGImg:image> + </rdf:li> + </rdf:Alt> + </xmp:Thumbnails> + <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass> + <xmpMM:OriginalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</xmpMM:OriginalDocumentID> + <xmpMM:DocumentID>xmp.did:d4d07395-aa96-47c2-a9e5-d0351947bb0c</xmpMM:DocumentID> + <xmpMM:InstanceID>uuid:c63c1031-e157-9748-9c58-86481308e954</xmpMM:InstanceID> + <xmpMM:DerivedFrom rdf:parseType="Resource"> + <stRef:instanceID>uuid:1abccb90-0c26-4942-b156-fd2eb962e3e1</stRef:instanceID> + <stRef:documentID>xmp.did:58fdc1b8-1448-3a44-9e20-282d8ec1cf95</stRef:documentID> + <stRef:originalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</stRef:originalDocumentID> + <stRef:renditionClass>proof:pdf</stRef:renditionClass> + </xmpMM:DerivedFrom> + <xmpMM:History> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <stEvt:action>saved</stEvt:action> + <stEvt:instanceID>xmp.iid:d4d07395-aa96-47c2-a9e5-d0351947bb0c</stEvt:instanceID> + <stEvt:when>2016-06-15T14:23:10-04:00</stEvt:when> + <stEvt:softwareAgent>Adobe Illustrator CC 2015 (Macintosh)</stEvt:softwareAgent> + <stEvt:changed>/</stEvt:changed> + </rdf:li> + </rdf:Seq> + </xmpMM:History> + <illustrator:StartupProfile>Web</illustrator:StartupProfile> + <illustrator:Type>Document</illustrator:Type> + <xmpTPg:NPages>1</xmpTPg:NPages> + <xmpTPg:HasVisibleTransparency>True</xmpTPg:HasVisibleTransparency> + <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint> + <xmpTPg:MaxPageSize rdf:parseType="Resource"> + <stDim:w>128.000000</stDim:w> + <stDim:h>128.000000</stDim:h> + <stDim:unit>Pixels</stDim:unit> + </xmpTPg:MaxPageSize> + <xmpTPg:PlateNames> + <rdf:Seq> + <rdf:li>Cyan</rdf:li> + <rdf:li>Magenta</rdf:li> + <rdf:li>Yellow</rdf:li> + <rdf:li>Black</rdf:li> + </rdf:Seq> + </xmpTPg:PlateNames> + <xmpTPg:SwatchGroups> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <xmpG:groupName>Default Swatch Group</xmpG:groupName> + <xmpG:groupType>0</xmpG:groupType> + <xmpG:Colorants> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>White</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>255</xmpG:red> + <xmpG:green>255</xmpG:green> + <xmpG:blue>255</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>Black</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>0</xmpG:green> + <xmpG:blue>0</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>RGB Red</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>255</xmpG:red> + <xmpG:green>0</xmpG:green> + <xmpG:blue>0</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>RGB Yellow</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>255</xmpG:red> + <xmpG:green>255</xmpG:green> + <xmpG:blue>0</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>RGB Green</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>255</xmpG:green> + <xmpG:blue>0</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>RGB Cyan</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>255</xmpG:green> + <xmpG:blue>255</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>RGB Blue</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>0</xmpG:green> + <xmpG:blue>255</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>RGB Magenta</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>255</xmpG:red> + <xmpG:green>0</xmpG:green> + <xmpG:blue>255</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=193 G=39 B=45</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>193</xmpG:red> + <xmpG:green>39</xmpG:green> + <xmpG:blue>45</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=237 G=28 B=36</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>237</xmpG:red> + <xmpG:green>28</xmpG:green> + <xmpG:blue>36</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=241 G=90 B=36</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>241</xmpG:red> + <xmpG:green>90</xmpG:green> + <xmpG:blue>36</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=247 G=147 B=30</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>247</xmpG:red> + <xmpG:green>147</xmpG:green> + <xmpG:blue>30</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=251 G=176 B=59</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>251</xmpG:red> + <xmpG:green>176</xmpG:green> + <xmpG:blue>59</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=252 G=238 B=33</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>252</xmpG:red> + <xmpG:green>238</xmpG:green> + <xmpG:blue>33</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=217 G=224 B=33</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>217</xmpG:red> + <xmpG:green>224</xmpG:green> + <xmpG:blue>33</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=140 G=198 B=63</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>140</xmpG:red> + <xmpG:green>198</xmpG:green> + <xmpG:blue>63</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=57 G=181 B=74</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>57</xmpG:red> + <xmpG:green>181</xmpG:green> + <xmpG:blue>74</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=0 G=146 B=69</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>146</xmpG:green> + <xmpG:blue>69</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=0 G=104 B=55</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>104</xmpG:green> + <xmpG:blue>55</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=34 G=181 B=115</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>34</xmpG:red> + <xmpG:green>181</xmpG:green> + <xmpG:blue>115</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=0 G=169 B=157</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>169</xmpG:green> + <xmpG:blue>157</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=41 G=171 B=226</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>41</xmpG:red> + <xmpG:green>171</xmpG:green> + <xmpG:blue>226</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=0 G=113 B=188</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>113</xmpG:green> + <xmpG:blue>188</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=46 G=49 B=146</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>46</xmpG:red> + <xmpG:green>49</xmpG:green> + <xmpG:blue>146</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=27 G=20 B=100</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>27</xmpG:red> + <xmpG:green>20</xmpG:green> + <xmpG:blue>100</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=102 G=45 B=145</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>102</xmpG:red> + <xmpG:green>45</xmpG:green> + <xmpG:blue>145</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=147 G=39 B=143</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>147</xmpG:red> + <xmpG:green>39</xmpG:green> + <xmpG:blue>143</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=158 G=0 B=93</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>158</xmpG:red> + <xmpG:green>0</xmpG:green> + <xmpG:blue>93</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=212 G=20 B=90</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>212</xmpG:red> + <xmpG:green>20</xmpG:green> + <xmpG:blue>90</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=237 G=30 B=121</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>237</xmpG:red> + <xmpG:green>30</xmpG:green> + <xmpG:blue>121</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=199 G=178 B=153</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>199</xmpG:red> + <xmpG:green>178</xmpG:green> + <xmpG:blue>153</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=153 G=134 B=117</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>153</xmpG:red> + <xmpG:green>134</xmpG:green> + <xmpG:blue>117</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=115 G=99 B=87</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>115</xmpG:red> + <xmpG:green>99</xmpG:green> + <xmpG:blue>87</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=83 G=71 B=65</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>83</xmpG:red> + <xmpG:green>71</xmpG:green> + <xmpG:blue>65</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=198 G=156 B=109</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>198</xmpG:red> + <xmpG:green>156</xmpG:green> + <xmpG:blue>109</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=166 G=124 B=82</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>166</xmpG:red> + <xmpG:green>124</xmpG:green> + <xmpG:blue>82</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=140 G=98 B=57</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>140</xmpG:red> + <xmpG:green>98</xmpG:green> + <xmpG:blue>57</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=117 G=76 B=36</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>117</xmpG:red> + <xmpG:green>76</xmpG:green> + <xmpG:blue>36</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=96 G=56 B=19</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>96</xmpG:red> + <xmpG:green>56</xmpG:green> + <xmpG:blue>19</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=66 G=33 B=11</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>66</xmpG:red> + <xmpG:green>33</xmpG:green> + <xmpG:blue>11</xmpG:blue> + </rdf:li> + </rdf:Seq> + </xmpG:Colorants> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:groupName>Grays</xmpG:groupName> + <xmpG:groupType>1</xmpG:groupType> + <xmpG:Colorants> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=0 G=0 B=0</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>0</xmpG:red> + <xmpG:green>0</xmpG:green> + <xmpG:blue>0</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=26 G=26 B=26</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>26</xmpG:red> + <xmpG:green>26</xmpG:green> + <xmpG:blue>26</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=51 G=51 B=51</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>51</xmpG:red> + <xmpG:green>51</xmpG:green> + <xmpG:blue>51</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=77 G=77 B=77</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>77</xmpG:red> + <xmpG:green>77</xmpG:green> + <xmpG:blue>77</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=102 G=102 B=102</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>102</xmpG:red> + <xmpG:green>102</xmpG:green> + <xmpG:blue>102</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=128 G=128 B=128</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>128</xmpG:red> + <xmpG:green>128</xmpG:green> + <xmpG:blue>128</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=153 G=153 B=153</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>153</xmpG:red> + <xmpG:green>153</xmpG:green> + <xmpG:blue>153</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=179 G=179 B=179</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>179</xmpG:red> + <xmpG:green>179</xmpG:green> + <xmpG:blue>179</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=204 G=204 B=204</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>204</xmpG:red> + <xmpG:green>204</xmpG:green> + <xmpG:blue>204</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=230 G=230 B=230</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>230</xmpG:red> + <xmpG:green>230</xmpG:green> + <xmpG:blue>230</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=242 G=242 B=242</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>242</xmpG:red> + <xmpG:green>242</xmpG:green> + <xmpG:blue>242</xmpG:blue> + </rdf:li> + </rdf:Seq> + </xmpG:Colorants> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:groupName>Web Color Group</xmpG:groupName> + <xmpG:groupType>1</xmpG:groupType> + <xmpG:Colorants> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=63 G=169 B=245</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>63</xmpG:red> + <xmpG:green>169</xmpG:green> + <xmpG:blue>245</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=122 G=201 B=67</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>122</xmpG:red> + <xmpG:green>201</xmpG:green> + <xmpG:blue>67</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=255 G=147 B=30</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>255</xmpG:red> + <xmpG:green>147</xmpG:green> + <xmpG:blue>30</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=255 G=29 B=37</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>255</xmpG:red> + <xmpG:green>29</xmpG:green> + <xmpG:blue>37</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=255 G=123 B=172</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>255</xmpG:red> + <xmpG:green>123</xmpG:green> + <xmpG:blue>172</xmpG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xmpG:swatchName>R=189 G=204 B=212</xmpG:swatchName> + <xmpG:mode>RGB</xmpG:mode> + <xmpG:type>PROCESS</xmpG:type> + <xmpG:red>189</xmpG:red> + <xmpG:green>204</xmpG:green> + <xmpG:blue>212</xmpG:blue> + </rdf:li> + </rdf:Seq> + </xmpG:Colorants> + </rdf:li> + </rdf:Seq> + </xmpTPg:SwatchGroups> + <pdf:Producer>Adobe PDF library 15.00</pdf:Producer> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> + + + + + + + + + + + + + + + + + + + + + +<?xpacket end="w"?>
endstream
endobj
3 0 obj
<</Count 1/Kids[7 0 R]/Type/Pages>>
endobj
7 0 obj
<</ArtBox[19.792 16.0 109.0 112.0]/BleedBox[0.0 0.0 128.0 128.0]/Contents 8 0 R/Group 9 0 R/LastModified(D:20160615142312-04'00')/MediaBox[0.0 0.0 128.0 128.0]/Parent 3 0 R/PieceInfo<</Illustrator 10 0 R>>/Resources<</ColorSpace<</CS0 11 0 R>>/ExtGState<</GS0 12 0 R>>/ProcSet[/PDF/ImageC]/Properties<</MC0 5 0 R>>/XObject<</Im0 13 0 R>>>>/Thumb 14 0 R/TrimBox[0.0 0.0 128.0 128.0]/Type/Page>>
endobj
8 0 obj
<</Filter/FlateDecode/Length 106>>stream
+H���wV��u6PprqV�*�2��3�4R04S���32�P�4ճ��T(J� +W�*�w6PH/�H�+ +8;W:dYmnJk$j=`^PKX*GV"-/6MPPhMW4o*<SJ[.r.2B:%l2U+:>jFegTA5n:ROqi. +8M?-(/t#IN>re.=TbIMqYWQK1D%b&pOLGa]H?hKs'8Gqa4A/k;[i&\e-=4:h!/H6BW;~>
endstream
endobj
16 0 obj
[/Indexed/DeviceRGB 255 17 0 R]
endobj
17 0 obj
<</Filter[/ASCII85Decode/FlateDecode]/Length 428>>stream
+8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#s<Xl5FH@[<=!#6V)uDBXnIr.F>oRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0I<jlL.oXisZ;SYU[/7#<&37rclQKqeJe#,UF7Rgb1 +VNWFKf>nDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j<etJICj7e7nPMb=O6S7UOH< +PO7r\I.Hu&e0d&E<.')fERr/l+*W,)q^D*ai5<uuLX.7g/>$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~>
endstream
endobj
13 0 obj
<</BitsPerComponent 8/ColorSpace 11 0 R/DecodeParms<</BitsPerComponent 4/Colors 3/Columns 880>>/Filter/FlateDecode/Height 947/Intent/RelativeColorimetric/Length 90241/Name/X/SMask 18 0 R/Subtype/Image/Type/XObject/Width 880>>stream
+H����oi���@H�����y�&�����8��_�n�������y��A�'��? +I + +W��<�*�
��'���%���Y��%��V���ma�o!���ǩk�v�>��w�u{=�Q��<\ȃ*fƸm�q���Y%ŏ�R�p� + +i�H�F�'��>hd,��I#��_���ы��Tj�~Q�5�c�R�`�n:�s�
e8�����P���� +WW�zٶ�:��l�g���l�7Ƀ�Hi�J&������/�Ӻg�.�}���C�����'���d�D|V�֪'9TL*�4�I]��6�� +���>�#g���V���-�?}=����Tj��OK�<�>�Nh a�uOB�n�Y#qkB�)����fiQ�@
+� +z���tu��t&���k�s����g1�twuO/�J���>_��9E�zb�(Jr2�h�+�ɓ�)���⇻��A�!�����_:۪.�%��ٱ4�E�3w��~�� �sO��q9��F�$����~��E��<G���J���? +7"P�� 16?w�'����PƔ�P���m?U
A�J�������O�C�/%��-n�� :d�}��_H��R0I�����yc5S�j����V}���nǡ�!��1�I�,�C8���LaP)G�cA��1(�E�4F|���Q#0#0P�W�{� V<��^�F��Lz��@���%����k�����0�u�'�I1����q�<��$p5�SyV(%AǓ8�M��Y�ĶQ�E���Y'd7��2k��/Q;�L&���^1*
e����v<�7V2�Sy�+G� F��"wA +����P&�rA\�9g��J�C� +���c����1Bu��U�U!�h�B +�m����?I��X��q�Bf=�O�-�u���S]*pb�L�p��� +�+Qf1XGbu�.�AL�}�����{��;�j��:�1�X�M;`�m����)ݒr�2���?��?��b��<g�2��|��NDq���)}��s*�[��Sw�LGE�R>ӥ^"�T�.4�{��7���V�:7�cO�
���n���]��&I�Iʴ���]�׳����L&ټ��~�e�?61��8qW6�$�уS-���J+j��� &�H�R#Y(�u3C�"���va������VO ����qˤg���/��{N�d*�� �w4~����8`ਡ�O��D����T +����(� ƃ��(r�Vu��6z�0F�|�i�U�6�������_�Up_� |�7//�y
e2��6�ka��E9JT��h�<'|���� e�\x�y�(�7Q�Q1Z)�7�#�5eoӈ���0��g�+ۨ�wC�xc�X��S�g")�-n�k����E��J��N[��*������ FA�K��L��LR7�R.��L�BME#@�* +�~U���݊�tEEVOt�7�U콊�ؾ�x��Ԝ'�is����jf=��O���[Z��O� ���((��A��>��&��]�r�"��т|f0`A|0�/2}�+58{�:��!ELTǝ�uB�1H��z��GQ0�g����[��|Q_[VSo�r^G���y�?l�D$g=?�ȩՕL�N9�� +���K��*RYģp����u0�%K��'���*�-�l�p�D <P�#�Y�G���}Ũ4�I��ϸ.V��;�I�������Q&+=u ����PaqU����S_�q(R o*B&���Bc�@-٫��m��大+R/������rlpך`m{�ͯ-��Vr�te�O&�^��LOF"��e59��h9��Ą˵�J�ho���q�{5�0����ށ�:���5�8Ƀ*ô�x'/>I��D2Mnݾb��L)��O��Y���ׯ��R3OF"�R �j"�iO8��%�����{��Pqs�?H�e�e}-����XJ��N��m\�-��H/}G�<b"�µŭ�|�x�y}}YM�����>ϩ��Z&���L��/�u>7&�I
wQ)� /�+P�.b�P�"�$N��5��5�B]�=�{�2��`�[������Hnk�?������-��s��\��粓�y*d�qP������9�I����,1���k[������`��^��A�/�n��3��Օ��c��V�n��a�-_�s%Y�S�����M{b �FǠ�oZ����nk�E�%�yt�$mA��s%E���v]������JW������^x�A��
�Xk���0v_���KӉ�� i$��Fߪ�/�u(� j�L�I��������O%�k��/S���<z�YW�nZ� <Q�b�誒��&�[q���Dz1��'��Mwc����U�0s)/�Pz�����R����m����u��/X�����?��O�y��d��R�<��ɇ0��m'hˤ�S!m(/6�o�G���F��"H�Cs� c���f��䐧YBh�ߔ���syڡ��y߿�n���,@2����1crXS>r7B>Y��,7�70����ݙ��s)�]ub�Q9O�Έ�L��1�2$j����n*�2�*쾊O&iV��"s��r��+�2L��j��ȞC������xҜ����J�9:J��ʌ �H(���hx�A&�xk
�i&����Iu$6ԕ�j���:.��E� Q\-^*%V�@V;��R�M���]�d�L��W�<}*�w�&Kߊ{���-7@�-&;. +C�6���6 �@9TB�U�f�I�[#v�1��r�`��,���f/5n����T�Lֹ�ޤ��o�sI�w�T&�����\�ߍ�#�UB��XJ&�uo�����6TE���-E��HL����u[���F���Uf +���x�謖���X���z�{FEr6��q��iV�d>ս�l�� +��\�Uv�^dK�CR&��p�����6�kڄo@)������ɛzx���Z�ZfB��v�5n�F�C��
�`�r�{Lŷ�y���7�g�2H&��;x�@��k�A�SYQ��C,��2�9�Wp� +������c�!{)��r���*��R����j�!���&�#�8ˁScM���}��Zi�*H&��M��f��$�\�P� +Ŵ�\����Id e��DҐIЍ��F1�����|C�eH �ld�Ԭ6i.2K8�t��&�t�(�Q��+��Zf�B*R&��~?g����4�|W�~��!�$����1�[�N��Ikq���S��(T�[�'iͧ4*m����~�@���?���>���KT��)��Ε��J��3t +dE�À.�"!�|��g_��F>";,o)%O�Q�������~Z��2F�B +3����%f_,%.u��;��}�����o�Z��_`>��19�)�ۂ��֙Ĥ
b���-��
2z[&��;BE����z1i6����Cӯ!�G9��h�t��j9��'I#�8�ˁ�B��!�=��*��t-T:zT�����G�\2z;��F3�}Zg����L�h����H�Ӎָ�!�fi�V�L:�,N��0E��wH�V��sR I �!�-U�L�1�����#4���z�v�B�`�V��|�u���4�i�$�\"&^�X�j�bޟ��� m�R���� q6����H �JER�����/-N&�w�'�,�͌ƹ�ӿ�8�!�f�I�|��1T��B����S�?�D%�}�35fW�̊�CȊ\�!/�5n�:VC1�@��#�&R&�����2rÚ�!����"H �<��O"�$;�,Ɣ�G�)�!� �P�i���q��6k^��6垾���n��m��G��ţ��������t�,Q�\W +����Ho�[�]H&�lB���<iΌ�'�)�L��t�`��=C�B>��OS&c1�[p��Uyu�������������N�'v�9 +���L���凍\����L2铥�Akq���q�$��C���k�DyQ�c��O���z�q�*�8� +U_��D"QA�PA�@�I��w�涱��DZ��I�PP�i����G~�;�9���]����6ov��p�3U�$lJ�'�o0�bR��v��L���~�c�I��F��eA[Q��IPY1��o�7xGv����Λ�j�i�$�-I��g�2l�c��.Ť�=I !;e0�'Z�JZ��wzT6�b3;��� )g���S��V�G1�,�� ��xt��������$��(!b1������Ѯ��-������~���$�"�3V[�f�K�@MR�+��3ϟ�ePI��a~�F�p��2�
���Þ�qZ�JZ��� +0 ��'����0$:HJ��\��� ;``pPL�=N���M�.�H1Eb�~�ԓ�vsK`TO�=�h�wѓ +�m��crE�?m}��F!��e_JRPF +7���b1��T}<�x���4z�V��,&���읲ye����T��J=���q����#cz>)�R�v:��5�[Q����Г�O�"���5�o)� �c���^�m��X�y���Tع���T=�%o�-�oK�2���U~c���͠�B���>(h1*��h�|: +�ؐ�<p�D�����Ť��G��|��i-j�zR����E�Qˠ'� +c��'��z>�w�TҺ�辣QEx=��D19��-�d��!}?��d!�}3����Z�#)��nmDz����ly�_|1^��N���d`Q0��l�9'0�Nn<X +�(iC�4P+�$��� +c�T6��^b���-��4��je˷O|�z�S~�?_�q��C�j��R�r̖E˓�>�j��E�k��.C-�n#�E��<�I�O{�vE5�ӄ�&E�N��& �݆ +���w&B����g��w���)#��S���]\Q��V��Q��>�$I_jJ��X�,�\^�Y�S�d|'z��D%�{o1�!䅇qx';q������ڈ�><�a�X��/���/�
�:z�556hz��^�`tN��ʦ]a�r�DhKUvX�eg��f�¤~��u�bU4u�+�&g�b�8��5�I��nݣ�T���c�%N����N~(�d�X���'Bh%���=���f�j-NK�2z]��W�"L�y�'t �l�^fZ��&�a,�- E���K�v|deKhߙ��Ds8�^{2yc�"~tt��o�����`���V�x��h���v۠���d���N�����`�}���ʼnCh�Vr��fg�֭iљ�O ��т�|�,I��@�3&����7�r��~x�]5K~�� <�'�ɸN��j�G=��=`jߖ��}��Ƌ��Wǭn��Z��\Lҳ��o�`M�2iC�ɍ|�a�'BN$�ɸN~(���<'x[)��!t��DJ���`����ɨu�O�&��7���R�,��R��6�=<������{.�q�;!t���&O6v�se�8-@ʨ�m�k���$b������f�a%�܌*� +�s��Mz�C�*�d\'\z�1z�A��D�����d�&<��u�;e]� x�^�,�Yo`Γ�Z�A�>�� +���9��$Y"?L�tzK_��14*Y|�!ԯ)7�$�U���� +L�&\��Pby?�ޓ�u��r!m���� ��FZK�G���brΓͲ��c)�eE�+W�q�yt�T?�w�� �]����]�}["�֫�<O?�Z��I�(B��ڸ���R�9�S�!&[J�9,^ٟ,9�&�G��U +=� +� +7]=�!�I +�AQ�ש'=FE�4b2��&al�6>� +��������h�B��")��;���I��s*�Q����Y9c"�1鲒��z2�k�l�vy07>� +�d�֕MW.o����BgDtʿv(u�X�4�Kp}�G�ߓ��-�8,���]����o��^������ѓ�[J�^�����c����(�N�Y��]$eo�
�h9[�ƣ�:1�v��t��᥌e|��� �q�'��K�����p��4 �b +4��4@ߩ��߿N�N �d� ;�tSl}O��J*I�p����r�G
l?� +ע�(�'㵢đ�gi +����&�������!&;��=���@O���K1Ŏ=��5�:�2J.778&�$��k��4�RJGL*�sͽ�֨+���I�N,�I���ij&}`K���闍�sEvD��R�Ͽ���d�}����O�I�b�_9���3��D��a`�(r\���|��@O�@���Mo��ߎ$�g��i�)���R�~c�b]��_����+$��H!n~�F]1�GL*v��Z�F���i +����� &����NA����@O�t\ᏻNo��V�0�� +'?��Z�t���w +٫ + +���w~L��w�ɰd�_���X�����2�oĂ�ϼ�0aL&5��QP�RK0�0�*���?�%�� +G�C�;��0�SO�!䒢�(m���� @b�c���_v��(J�k�E�@m���K�8���h/M Hhb IY�eI�Q}v�����r�7�b���yH~�Լ�0�q�i_��V�����S��!=����#_�m�L�Ĥg�����i��Ұ����=
������X.�o��7��=�<����Z��d��R����'�4�!����s��d�����q�ak5k�����M�MJ(�PtKx������#�I������ +d���!��թXK��tkc�Z*y��ͅ����(
�w¯<�\�*D��b������,�$=O��V���p'1�K.:|/�lӥ��+<���LZ��dg�4b�5��H�<R����+1�88�{���� x�#����2sI����� +|��?$��d�����}�Q3���]���Aʰ''[�0'�&l�R�3 =�br�NG]>i&o练Ɏ[�U��lL=�t�_w���H�Y���{�D'���C�%A�)Cy�t�)�8�tDzP��ˠ|!B!�D��D���Eg��̓~���WF/��Vs��'�A��\�U/! +.a{��0��Ç� +.�ĕ�#_��u�MLzb)Z���O���V�fc+U�����A����)��" +4�D�'���)58=�2�6L"��>^&Ư~���nc�#�{U��ҭ��'��T����Z�;�
�����$U:r�i�� +_�͒K��쳷x#LJ�4K\��4�^�mΔ�X]�[���X�VB�f�@)5:�'7}OV2L��=�P�i��ϲ�gc��0�Y�h-8�i��ҧ��Vk6�\�o��'�Nq���|$�T��(�$)�y���6A�ߓ�gO"�Hb��1��fl��s�a��rE��tku*F��������?�L$|���)�>� R�����
�Ѹ�oB(L�7H>IwU���h����c������}�[3��;�/��)�go�2�q���CJ�=� R��HO��Y���$B�kѧJ�6�)�b
�F��l{�h-8�թ�rb�V�����yZ��gcF�;�H�Ң���t@ʰߓŤA#v齌�3B�IL��ODxRz��I��;e�5R�kw'w9��O����D� +�y�š��|��%0���Ke��X��\�v�I�ِ�)�H��{�fZ;qR��C�{ �/Dn�y]&�O��k�ꉥU�S��=�l�'凯G��w%)�H�3�c�t:B��xO�����3$�0.e#���P�ɶO +|���XZE�_���\(Z�ODh�<R�^ihIy�)҈; +��rk�'e�����G��!%��
����������:�W!�G��{�DN���h���J\9���\�w��ACl +��w��ϱ��R�>"����j������'�3���J�)_�P��K�w�G���&)�
�w��Z�t���ݠ�Vw��gc�)ßH��aO&nr�#��<r:%�����Bh���;�]�����d�"+�VK���ic�Z�_��
�o���=)C��6Ki&RL�Ye` +U�B.���t/M�O0�tx!D����n�}~�yLҿ�V]=�2�f�^�C�Q��_�u�y���p�%(�I��䈬��!�I-�y�B�s9���5�k��I���A�Qn��ԩ{Sѯ�p篧��G�m�2=d�7���R�&Ӻ4M5����4�<�P��'�|�-��>;=NG��c2nc�R��t��`�����AJ���x��w�&ӷ��4�p#��B��Σ)Óe6���y�0��)��%L^_��rhe�{-G^��O9&%�4��j2�Q/ +L��AHi�L�"C�ɇ�v��M��å��)3�0�Pf�ۿ�Ղ��X�a�0)�QqVgsI����V�^U��B�����~l�� Gސ�p��3� ��L��4�RI�9�&M�?���V�!$)n+�Ye6��\�V0����YO'�j�
������Sm�,�u�^�)�d�w>��R� CҠ/eO� 5`2�� j'#��=%�J��X�H�Pe9zT�w�?�p�f�}iT�n�Qn��tw�R�����)OX�"���pO�%t���T&������Ϗ�]3����)�$�7e�Pf[p�r||l5pnd�ғ+�ĽH9�z���K6]mŤz��Ϳ +�'�}���nM�ty!�/0y�(��[v7t�%�OZ��`bsI=��P'L�'ol���3�{%�R�J��}&����|�DQ�5M,��$)K��B�cuq���\��B銞�����SV�'�Ofw�5����7����'H�#RΘs9���'���R/)�Ȗ1�BrT��k��,pY� +�}�+�;B(Ř���
�ɯGE't�s+�mF\��wO�;���Kl�T�Ȓ_�S�O��c�f@�=-M�//��:GnW?q�P�gE9o +����W�!D��dUb�;�<��s���[#�Vۦ-�����Q�|�_��緍����T��hw��r+��P��KR*��B��@�E` �kR��.I�tia�i�^��Arȥ��kP_ڃ�b��DJ�l�2ˣ�fgI�rlX?gw�>X���<���}�"W� +*e��� �Oh�)�5���Ћ��PŅ����������]lx�h���7&���\�B{������ԭx���hv�R�zE��,�Y0�C��>y����F��� �UJA)����_~��D�<�KT�n33��[jǻ�_�\'���?��^���B������kB�<~�U�c�>���7�D����A��A�$��;)��Q&�%��AG�t)K���^��y4ν*��
o����{M��O8p��r\r@x"B�<��Xt���)�P����ǎ�)Q�'eR�>���qبrۑ�]JƾИ�k7l��J){�'��@o<���q��N�4M[-F��l"N����A��2y:q�!߸f�l
W2��Z�;fj#��SWf��d2S����ׄ����iՓ�Μ)~�.�y�V� �h�G�<y��3�ߎ|�R�����������Cϣw��÷�Ҭ.}�'!3ՑL�L�ri�66v6��y +�0�A���%�Aj-\v(�'��9{-�ҥ6��x{"Zw��(%̝�ٟ(j9�1�5Ʈ#M�&��*=6�ʹX% +����&(%�}-( �$�7���&#M��d1���:�Uˑ ��� ���4�_}�Sd2Y+8�� ��k�7.�٩OK����Sn˧�z�Z�.A�<��dPH {�P&�W�ra3/���B��]� +��E�<X[ ��.[�(�g���5\�dK��<l�f������x�R�3�Jyb�e�b��U�h����bP͍F��'*%���2)��:�ȗ.����y��j����H)�s���FȤ��3AQ<�2���1iQR0"|�*$��l�f�_�JP&��Q��Z�Ka��v-���/�~�^��3P)� �$HPH��L&���R��~h���b�*$�<���=g��}����s����|�R8�$��Pʪ����.�7TJٗFa#����}��d��i��ع�gC��r��6C�����2y�R��hBnҁc��tБ/]�2\���ۑR�H)+6����rB&&|�IJ�V�Q������j9�C� ����29�ereR�-��G�w)̣�Ҟ�&Msz�b�j�R�@6<�I�����0��)a�8r���n1kt��?P&c +�d�����4��<@{�d�b}r�J�4�E�7l�;|@�*�w&�$!���ϧ�Uke2��t��-:��] +�����,�!l]}� +�����O�g6�*�be�C� +$��_���X��;�T�����1��H����I�>~@�C"��a(��R� +�t�R���u�f�:����N�R�eؚ3C�Q��JXkl�����
�c�fS,�h�IC�c���=����u�0_Wf�k����>�k�nL���1�ז�^�����O��> �~����Q�'t���z�`��'#���W�
xV +��t`O���=��?���7������F�{�Nvf��o��wvv�*�Q�J��*0� +�D��?�ޙ�a���
����B� �J_$<��z��;��������i�{w�F#�e=�{��\&C[����r!����7��&��'kn¼~Ѻ{�]���2
@ �*n{�Q�^�Qw�+�e��ǔw�T���>~'�,�U)+�DB�Gbe!��z/�E�"���-|tʌWX�b��v�F�<�6N�H��P&?p��dr�A[��_Wm_��� +5?&P�F����������1�J�'�3p��|R]]�9�M����]9LL2�Q +��LrH�P��<ɤv4��Β�V�^Z���Yv?���`�����vF��RB�(���M(
� +�H4J��oէX)Ϣ �G)�<�Ʈ@�C�*p�&̟���\q7H&5��UQ�^Z�^u���-�R)E�7�?�A�|^�u6�0H%���LϐO���R�����Кr��{$�$�A@�$n|�^v�$�z�n₰WSo_Z�[sSrd�Rޛ�>|��|��R� +�% +X�3��J*%�0|�,ϙ"g��,�3�9!�+��\JdR��"N�tg�Q�^�Ҋ��R����lr�?R)�i���'a,P��*Jyc����q?���DVI��1�?��
�IM�<(��.-i��[�-�g�b�\�~���{�� ֟!ɥO�Z��:,Ø�9{��ٵJ�:3�6p��V�ݕI�I-��o����Ѳ��c���ݷ85���k����k,K�(;�9�g��'
�8�r��[���a/�#<�4+�, +:VInI����(o����d�^r����@ԛ����/��{w?p�_��&�4(e���D�Rc���ё��D>�]+X�kd�qj�2��2y{6��p�dRw +V�Nͪ�^�3�2X)�mP �?s�bֺ�Vf�{�D0�/#�o`�7��Β�Vm_Z������_~��B��pS���E��TTz��aL�tZv��2Z)�8��J���q%�S&�I?�IH�d:A�7�.��ɲ��G��=Pkɳ)�?�(�_��;YDl���g���O_��!�;��FJ*��*e��'� )���2��H&� �����zӏ�z,T�=Y]��=+eQ/��0g��"�c��b|�蛲��I�k���F��$!���Yrڪ�KK��4.��»5��J��j����;>i�:'�:nA){;,n��Xepx}P<�4�MX�y��d�@ +ƏA����)(#��n�a��o�$�<2�cI�GG&/Zw��$��Q ���ھ��ފ��}!iD���_~Ͼz��dÈ4�0 +��$�l��WS/`��_w�t��7������U6?�J)p�0g�%z��*u�#�"�#�eDy�� ����ڔ�ן8�Ȉgg��nW������4c�[��4�R~z�Ű��:�,��,�G� �L}��ʳ���A�H�L�Bo�H��xV����ۗ~�,9ʛ;�`:A)1�0��C�|E"�<g��� !�$�,�����)_E�,���%����L>��E�d�xv��ۭ� +����tb�X:�O�����Z�`
�R�Fyx�Qh$�TIcz���7�8'a0y&�'�2Y�d�̟�L/b�]U/`��_w[Q|$��w +�H\A��=xraOjVD��EI`�N��I&�������Ό�8�隧�ϗ7E69t}�y^�&��+�t���z��/%�v�p��\�ԧ��"�>�A���nB����.����W��C�(�y��S���&��r�t+�Y�H�J
W"U|C�~��KJ�Ǭw�RŔ!�3c[�1
F�d�I2qǐ���xC�o)B�i)��L�N��0�&���%6$5�KL���#x������G�;��n�䟴T%m8�<�9�%��S4���o�����6����� I�@Kq=o�w�;G�nۊ�h�х�|�!�`J�d}�<�v,�Y���l6�I<i�����]`�4M(�,�^�H:;`%5bdɑ�| 4�L^r1鞽���^U6\��g�*
���r��C��a��%��BB��]`��Ir���o��I��~V!I�\������>&�o��zI��k�i[і���p뺤�u1�3O�*�QL�#d��I�'�����LH���;�,��o+R�1����;ϝ� �D�D��X|����
�R�&����K�!�R�]�?y;��i'|�W���KCr0��X�,>��{;P�7`H�dt�~���ìs��VB�F��*�`��V�7����'������9�8���QN;���� +\C�D�}��#Ig�J��E>�B�m����'R�ӆ�"ixؐ���c�χ�n'
��=B��3��]L��It���f-"�`*E�'��G�I���)�\R&'vؒNK)¤V��3,L*>�����E�}��o|�| +�Dң�[+�l���v�u,ޒ�fZ˭+�G����_��2���T$fv��S3DJ�U��z�DJF+�7�����$����;
�S��2[+�K}��t�]��aB���z1e� m������л�~>����R"��eΙFc!��έ�|���F�
W"�%�F�I�� O�)�K��H���rڰ�8�:������3Rƿ$ %R$Z㼩��{W"=�q� �����t�)�p�m�yۊ�d��@�}z����Y:3��JJ�[����F��,��qB���&�$H�����a�os\7h�=$����%�L�&����8�ͤ�j�߹4���n1�ȡ����3��)���틤� % +n����^_�G�,��hZ�m|R��0e"���<9���X�iI�$O.���<�z>>�j�<�3��!�R� �i�^L��L�����rД/15�D6���Ė�mE����l6���u���A�]W6<����=H�"H��k!�<?zo�+�I4�mչt�)�v�u�/��ת@�1v,���u1�3�C���4��3շ^!<X����AR� % +H0i9�0��0����3L�z6<9��� � �2o�����r�PLhĆ�"0�98H���h�;�IL��6�VtД�05.3��תR�#RF��p6��/ +Q��$�E�mHf�DS��ɼ�߽4�Z +&H㑒�#RʆB�l���,� m+ +L�`��ڪ�l��Ѡ��6~T���K�'�'W"�y�0i%�# +�D'a���?t1���<���|�)�z��X��Z�g�z�9x;$�"%�v�)�i�)��юec��^��$R����Ӕ/��7h��Jd��]�kU���ҳg}�q�Ob&3�IYJ�D~Fە3�����0�k���1.��z�mE[�_��=.F���Z�A +V������$�*#�%RJsc���i�$���0�R�.����dL@&�@�@����R���+�Q,�8�+δ�q�h�_=�DX���q(%�8wr⧟����L���ڼj��,��z��IQ��6ǃj\�kNA[f�k�$^���rθ%��r��ď?;��s +2 �h"V� �<4�4^WGú��ZU�6�v���=J��IF.� +w�̈́c�=��M��~�_�ghf��]����S�ɷϩ���`6SV���OV���d�-6秋1�}���ᓈ/�U��#��
�?�?I}�G�����>��;9��G'��#�~,��C��ڹ����I�9�=3z���+�{�a����k��?qz8gd�%�$ +g8����& �D��y����̉��^/�Z���,iU�J +�$ +�< +��J��)H
®���A]T�*Cp�&��N��l�L��nf�U�YT�*�V��%����6a���50C00D�?���Փ+os����9��ؿ�At�jJ|�LG�q'��l/�-~zG�7 0����O�hA�W�\�m5��-�2��V����*Z�<��!��Q�=�d��F���-��V�"`R!Z�Z�Ϳ������ |�;?E�*8��0K�2�HGܲ,K�� +w�0�W�քa��+[�<.�劣SU�Zy���Id� ��h��"�fm�!��a�Ss�,Z����:���ŏ��>��ĵ��.d쑭���J �(h5�iI5˾���:b-#�0o#%�E?+�IF���x�����l��'�Qw`�4sm�H*��3Ͽ���9b#�|�9�.Ī:��Id� .2}'�lY��; {o +{�0y�=k=+�7�8\�ɲE*��'���k_�k>��1+��m;Q�O���� +=Sb#�VS2�H�'���?]�/��}�,�6�P�.� +w�0i�O6s��i"=[Դ�-��=�ұ����7�'#�_G�p[rH������sē%�^ l�J���R� +�$E�F�j�-�3>YM�#D?�V��x<P�|9����w�������( +�C#-�%��4�l���0��V�����E>������љ�x�H$�D�#�=���>��D� +�=�$A�Y�H�\��4:�襑S��O�|#�܊���⟞={����G.\?}�|ٿ�S�+Kڸ'����Kz%QOC)��JJ6sµ���,�LT&)��Ъ��?n�8��d��U��%���璤�䓉D���[E���J���b_y +�s����}�����tHO +�8��T����Ssm���֕$+F�".���P�(��. +Źڬ�6�:T�����Q��ߵ�O"��4TJ͕W��r'x�(9���$ I���O= �����XN�=�? +�+3�8��B0����gS[=%��;ˋ/�qU�b�'D}$�C�*��, +�@�S��8�e1����[� �g��Y�4���U��rgI��(9+ʝ�'%I��t�u�KkK���8�Ӥ<h�'Î��HJL%�'3��]j��� Q��c�D�$�����~H؝ ;A�㩕bA�� U"})i�`�.�|'V(*>�Dt��T0�|������v�Ɛ8�{��bR�I6�eG���X�(�Z9�-��A�:���E1��/'��|�Ŵ���ɲ��n�����w4e驒�����/��t��D�y�C=�n����zu ��������^<CO� /�� Q���L�#�8��K�&<�'A˰ß������ɋ���$;)����r���O����t:�D���姻e�3}l�ߛDOb�h{�@Rb��xi�"�/I)��(�*~���]xA�p��=q���S����C��fT��>��|��{1�~05����$�����I��a6��e����?*��/���W5�������;g���l�k����J<z�s{��]�3�a�nk�GO��[a�d��d���x�|��*��J����S��HS���o֭ +�w��jKЮM�|�< +� ���J�Z��$O|v؟�_ +P�� 3>�o��t���C���,
�U͂d7�;�V %g�I�${r�5Tpi`�ԓ��N�ߛDObZjw��W��,[\{S�D�|���~H(��/)�K�$0���"' +sS��0H���b�<)V:���o(��I�c�\���&��z��b2�|�1�$m����$��;āko�`\}�|0O%_߁Rȧ��E�r��|'�P�uq�n9�d�Ԝ;x��@߇�u��Z�H?���Jm�K]�T�{�I.��;��aC�k����(9 +ji�4�.;�N�ꌒ���i2:�dm\�����x���Ld>�v�`�n�+���̿��>�.ҟ���T�Q�y���$K!�>�^U�+qGp�)�gQ����9�ݔw6��'� +-v��Y`��+�I�ѩ"���[p��������i�4��agi�.����uR1N��<N�#ԧ:�A�a�
�0<I����bA�#����ԝ=O��&����F&u��˝��m.;?z���= �p�0ӗ��ƚ|KK��0H��U��f'xO������u�J슝 ����3�1�h;c��"\#�<�^A��ٺ;`�`��� +�ƾ`b�����h[��4Aix���Cx�!)ICK�7ۋ��TeRֽ�JU�M{�fm�M�'��DiE�ec�s���������飫+�����>gH�v���P��J�Q�I���m���Ho�T���'i�WB�?ZF�|2.u/S(�r���c�*'}����J� +^��s��=hg���6t7��;�=X~|�r�>�v�fT"�x�L�_�?����;�H��ɂ�6eEk��nU�[_�N�dQaUJZk���шv����w1��q�R +�5�mY�����l�Q��lDne�6��$@ڡ�O����?��wd��[:��( +���Vk�k���WX�
�2�.���$���<�<��H��Jf�'oD�\�m��X�"V�s�@�6���2�CR?L��<�M���'�d^��s��0����V���Vt����+z�&�����9&�C���+%�ԤW����d����o�*�x�'�y�'�n�I\\{��-*%�q�'i�*���C��5�r��$�Ef�R�,L[��S�H�i�X�q�E��mG�b�"푯# �W0h��m����߳�Y�
B���~RڦdR��8K����,u�N��{��_�d�H�A�Nmr(��ѩ�hP�5�J�7�d�ޞ�I��E��V�n>y
=����VCy�Y_)���*=���)��$����O�wJ�Roz��j�?D�?��@h�|8և7�7�_��!����xK�}rB�v6�!�f�'�up-0�m�A� ��J���~�̀��|%G|���|RWqTm�ή�tk��C%n�'��O�J��ɕ�X���B�"É�M�Rd�|�O�r��
��i/���@���#��5�<֊@/wy�� ��|ra�yxU�6��������E����)��|�/O�d��^m�sN�̸R�v����I�ٙ^����pN}�I-נ�����
n��vTSST�>�r��O�Zq�,��|2J}��W�B)�mV�J��`ٞ)i�a
Kc=�>��r
6q������vHB�gzf���;�&� +�dK�z9A|X�|/�㬶<X"��M�����:�����z��e&~�:���o|� +��.K�w�������f���Z�� +B�/�G��n���e��^;͓S����uf�����u�G����%A���}�C<�*��xK�V��ߜ(��'5fr�o�o��?������b���,���*^uZ�
v�š��\����>��k�'_27��ɼ�<�ņ�$��x�����t{��]�Y)�V�>�ʜ D �8Ҏ�<��'�gy���'G��&�zʃp�}�0�c�7ӳD�o]��B�G���r����� "$\��x��7������533> +��ol�Mze[nw���h�����y�ɞ�I��>�����j�[�I��J)�����J"`�>e��nX +EZ����U�%�RܨCRe]`���&�Q���0,O����o2����L��~r� ?�L�8�v<��zҍ�wCr��� ��9�{����7'<$H}�ҭ�G�]NÌ���}�m�~r������2K��� +�W�W�%�����6��0��q���9�����~���F�p�9Y~C�i@�2:UւO*+�'�^aqp���Ez;��)*l}��rI�6�v��OƇepD}2�Jޭ�n�(��6��l���*w��64��w��r��RY���Za:?+��V��t&u�u�3=�/;�KKĠ.���`���"ҁ��hڋ�т��Ll���Hh���;�8�l#~�+D{��I?�8��Q�+����M�է|Rc���Z�� +>�V�S>���'�����"+=�r�!cT�V�Pv D)/n_)� +��Y�ʙ +V��rB+>��<���} +�,g�GCO��֗�$���Ħ223؍�{U�Q����0!"z^"eT���*�'�TмM9%��Tkժ����$�e:;_�_r'��8j�)Iԫ���.�]k�#8�O +ϓpC`�:Tjϓ�u4���-Z�C��I�O�K�ÅV7~���������fyu�Jo�yR]e�����Js��Dx2O�-v��Gض��^�DDY�?��p�UΞ���*��b6IY��q�����oe Ӳ�|�x�9 ��7}t�p΅ƻ�DJ�Ҵ%�������-4B����D��e��<��7J�Zs�Oټ�ጭҵ�8��q�
�$�D�AiB<�8DϜ�9l��J�.���fO�'A<On�u�m���'�hDw�r�]zy�_�DD�).gFJ�*�x���N�2A�BO9%�^�Ϸd'�VV�b�g.���v�6qҁD�Jxt�'j�n~|Y�B��9�d/]D� +foq]��� <)�[�]i�y�Hnc��d~v��Q�Wi�˓�(g�~��C�<w��&T�B�6�B3N|�����F�[K^��ԉ"%�&�k�.���@O��̜���2�S+��X.hŇ�.�i�D��d{���T��!鶈w��Zp�I������n���?Y��=�������r�< ���Ojjm����CF�Dz=��n��(1E�9�H���)j�M���D������)���C�N3S´���l�v��<��^ +�@��;eNk���MQ�\��,�B��n/���n�ѵr�$y���KԊ������_��{�X�zdރ><TT^ӜJ�������Gi�!����K����S��NΘ�'U5-1�ĥF��@x2��^vg��x:Fx��(ye)� +U�R����$��A!7�sT6���lws,7�fnz�R˾�c�gǥ3z:�j�) �T<�HϓP�K���a�S�>� ���A��1��d��]-�k�|p"hQ�6ɣ��TaQ�YVeUj��No�2&�I��<�]�HIx2��d�Z��$"�]E�9�H ��fN�-O��i����ş�����b���J�|NW�~1�ӷbS.������J_��rB�P�.�D� +�cA +��� 4��"E���(�@cC㝣2���H������!:�ovj�'+j�'���*��'�n�b�`r�Z�b$"�2�4Rrq��p���U��wL�%@��`_������F��J�Y�AZ��G��̺���>-��I���y�*W��a��q;z�G�h9��@�^�� �;[���q��P���A��C�`���5O�jZ�U6EU3]i&<�/���i�����$�P��s�ra�5P�l��ay2w����r�B/��~�z���8 +�Jm.��Z�s/�Sg~�}g��wC��]p��ia������e��Z��K�|�u��vp�j��'��љ�ضs���O�S������EZk�'UV�'�
xr�������=�� +�qLʖ�O�z$"�J��v(CH�<x��~<Ճs�*!I'�4�B�N|�ME�E�aLE�4T������M����CߘV��tJ�2�0I�j� �w��?�����y�<ȴ��=��1I H�m�c�
v ���JK�r�WI�`��\B�V[�h?L�4E�ک���I�6m��[�\���F�\H��=��<�R��{l���rH���<���c��X=i�A��>IW� +�PJ�P����pL>��L�:���_H��IWi͊� +����5����U���� +{��2����-�n�t���
IHR2�{�r��,�҉�B�܀����1`�u�s��% �L^I�JwM.���/?O¦�x6y��p8����"SgQ����w�����%�a���T���B��6�P!���J�.�Ԙs�F�b�<�w��9٦��d�dJ-7������e7���I݃$$��9 I����*���1&� +I�;џOЧ�Vk��T�̬�+����r���wK��X4O�S�nNF��R�g�?���{��7GE�"{����j]x�"?s��Q3n:�JԐ
�ܥ�+5Vy��ē)�B��g�4���mHB�����Ti�U��+p�*���'��5y{�*�QV-=�AJG��5�gC���kqK��yZ�>J����'�\�����:b҅���E&��V����R]�z94�x
��I�(��3<�)1 ���<�������j��]�V^{-�M��B�$$q���\��j� ��P�C07-�e�m� ɟ�./- O=��z��ݦ6���
ZP<�G�`���u{��L�oIh���p,�5h�M7!�6�fD�@�P�`�sNJ�as�(����3�F�ʔ���dˈ'7���+�}��mHB�� �!%$�B����Ϋ�;��E���4��CVt���*�6<�`؉;@-,?ͫڿ��ü�E�����e�6�f�^"���N�R=�^;8���9��i��y\;�w�bWjO��`��3s��ۙ�+䑇;+o�Q�'U:0R��2[[M<����m�B���;��%�H���ݳ�� �lߑ*�� �5m܉F��Fm����[5��KmI�Ǻ�&w҅�HtO�IA�l�f�3��/��wS�<�؋g;�P��� �����z��?^�Rr�ߣ�z��u�]c���6j�MO�3?��Oj˵�HZcO2�͂'s��O�����Y_��UF�$!�TI R�R� �&aJ��
�Я�U7��5��y'��L��}���Y}�zHTR�N���{��~�%o���Ӌ��B�Q�(��7��BŕJ̭)I�Q�x�Xg�W�����K�4R����|�)�Ժ�-<�������O�d��'Sv���1�C-�IS�#!ل�KRF��`+=ތ��2�U �q�� +4�O�ҋ���c���H��J���{2��c��r���2���l'5)Ry<8��ϡ"�dAqx�-,�On!�L����P�P`�� ɦ��TO\RF�r�!��~� +YO!EJ�h�_?����X��|}���$I�^u��� Ra�Q3n�U�ܶ�,xR�Ӂ'�^O<�j����b
u�� +�$ ��IhR�k��F�H��ڰ� �
�$�eA7j�*��ؕyǪ���& �@�5�:&R��c���i<�f�W�]�wM�g�O�A�?�Et�l���y�]?&#%i0��t�#��ix��{ך�s�E�
73�Α�vSFVqy��z�Cf~5�d�.nC=��+���FBB"$�I)T9��q�S�*�X��B��`#��_ɪ-/ +�9"ɵHɿ�*T#6�m��vv'��
�xy�p���J�5 ���sXh��yҊ&]������kK2�e&c�u�]�$_\aB`�ull%lh�(��6�a3�B3����� <ɽy�'��Y1.~�[��yO���8!�BJN�-Ԩ���--R�>kڸ�9�G�(����j�2��fV-��9��iL7j��.��ޓو[�[E �'��-����D
�e���P�v|�&�o�o8���������>�3}�=�y/�<�2��!/��#ړg���me��_ +��./g��MA~5xR�/��Ynn��e@�=�c$�5!?iH�fU���φ8Ucl���3���]\�<�TfVj�%K�*��o��ـ��[�'G�^ +��B~r���i����~�?5����c�2��� ���$H�CDaAř�$""WW$uwj����fvv���ڭڣf�v������-�P r�p�r�k�췻!�N�Bw߫O��P �����<�}�-O����[�|�'����O����#�e#��g��`RJ�13�C_^�����S�l�F�I?�}I�8��n��f`N�$��|�@ �e�,�y�d�M���U�n$9K�1|N=��@~{ 太7�$��Ż�I_��2���FB���"��l3���~n@♨�z��2|R��ا:���D�x|r])�O�03�[��<+$x�a0��.��uN�3���zގ�Z��k��`��QS���}���m�>�@,��5:,��kQ0�P~"��@��#!���^)�����\3�g����%�N��0O���|�?����Z�}�1I� +D�PÁ2�$��B�G��F��ťs>�7g�O�`����伍r_����`�bc� RJX䨙�m^��CWۘ�Z��=��u��[�͂��\� mR�J�ݦֶ�̗��́{�CG��>�0�����������P� K��q�Q���>�UD��.Ґs�t��Ӣ�SV�����6 &�a�!0�Z�t�Є~wQ>��$��b��U��I��`�����5�`SJ`�qm��N��(`ف��X���{�VF�)���y��}U|R�W���T�"�<����������b?<��ɾRꑙ�-�O,��_2"�Ƽ��Z�Y�k�>��sa��8���� o +��r+9g[�9m��j����6F�O&����@�F�Z�����{->��9�_b�u�R� +'�T�Y��X�Sp��mx�5t�1�۪�O�����d%��N?��`�j�b�9n�yƎ���Dw�Oe$o>9lB��ރ��T1��S�G��%įN�L��&�6�'�$;�ۘ�X�M��Y��L+`����"|2;[2�}r�3�y��e� -/1���1JY+v����"X꫟vC0d�-����1���K�$0�(���\�.�U��i��i�ڗtĒ�eB�ߎ(���i�&��©�Y)��U��j�L�6�E�+E�p%�L
\!@}�co1q�쳢��V���L�ѥ�ϸ���������y��-e>��L�a���9;�\�� :f��Y�JYC=i�[I�qK=�&\CkZn%a�|��J�u>~W-�m��(���S��JT�Ӽغd�Ä���Dl���.��탄���<' �ί��������"�.����2r�A���� �Q�uj2&j�B�W���b��̌��}2�d�.p!v���GZb0��#~�6��z�`����^�[�<3�����-;i��P0�G�ne䝒�_D��*���(�ֻ�)2��Rh-܆Of��۳ådWዄ�7<r����7x9Kr����P�����T����Y'�~�a\��ުPY\zllfLt����'v"<�<�L얚�v��@���"Wʑ +�7���u��U�٨9V/�}y�r�
5H�Մ�.�;>:R�n|Br���KbƊ%3˔�[�_D��r*#��B�}�ĩ�R���_!������/ +]bf���i"��p~}��SL<�'��(%Dp���)��"���<��a��ec���2S���`0[F�J9c%wB-^r˥V�Y;����n�MZ�L��\:\{Z�wL�II=����-3��-����D7k�����r!�nB��KC�@^�8}�I +�|;�d�!�I쓻b0�[�K�家т���>�Uʑj�����ۀ͚�K��hw+V�N�-�=��ƨ_����S�g���M�
�23��L�e��0���/!�ѫx�$#��}���k�.��b+9�@B��RJ.�O-��c���v�����{e�����ߛ��I����3㓐����-���>�UJ`�J +�Z\�z�服`/~�κ�MT�Q�����)=p� ����Ho�J b�!�Orw?tT�ŇC���"b3��L��-��E!r�[�F������CWI_g��4��d`}�]����yyj�I�I +t�C�9O�皇WI����=�f~��"�X�u����>:63;;��n�3>�Њ�<�"��*%,�Z��-��.;гv��`�Vr����ʈ__:\���?��HO9���S�[sK������f^�p)�UDx�ɡ +ꑙ&�5Ԩ����]�U�.������D�*��K����&��NW�l3���|����M�7呜O����T�T�O�-Fx�?֢�hGbm�f;�M)a%�5̮$��y-�5{�.@&A)W8ü�ܝ�j=P��+�?��vu��܉���pH�ʷ��)Sd����t �Կ���E{�RV �\ܧ�w(xXE�X5 ~��O�B�H�����O��鑚�/����دۧ��;��Й��1��s��ZiW�*AY+,��i�)���jʃ" +���<� +v��e�����G��T� +�������^txZ�`vIr��@���1�P^������A���]t3sn������Z�9z��O*O>q�*���e��ɍO������B�,0L�f��Z��mq��'��SV��u��ǖ�֡�&R��j=� ��=�aٳәqG��}'O>w�`�&m�I6�d��`n���ā�����R���i����d!`K�����aS^�x��{�x/c瀵���_]=����ٲ����ŨpqÙ�_p��N���:XG��`��z��·�u�I�wEr?0O��ad�m�jV2���D +s_I��ǘ'�JO��⾑��[��q#�%�O�#V���\/��H�R�D�a�)d���f��hjoeN[�C��By9zR�M)�`�w�>/�%�I ����L�w��zÖ�⪟<�d�|�E�vPB�Kr���Y}���S����ز��Hy�L���Qy�$N�'UR.� �q�Q��3�����'!�a�)#��(�KmXX?%ӡ#xZ�6�6¦��̓�5�#�:���+|I ��}��r9��
^B�^�*Ua�{��.:�ȿ{�WW�\__�����SEǫ6a����ׅ'�����3v�}`� �t�4�'%\<cē*�<��:R�����f��_\.DO�)����n)��i��`t�\t��$��KfK��� +�����Gs����e���_5N[��l�*��Qdw홸�H��'5`�3R�}*��Ӷ���'�l�/�{<Y]]���eS0���̓xB�`0<I 7��Ӵov�'��+�g��ɋ.�+��$�y�e| ��Q�G�m���.1����"�5�"�%KJ�r�Y��#��MmR�����'e�*&���x���v��,��f#@� Y�>9��p_�x;�i�eeH�uJ�n�i]t��EJ������Яxő&4'E� ��{Bv�hZW��y��ڌ���WM����.oz����il2��r�w#>��;YpQu�Ϫ+�>�&ܿ�ۗM[�1���g�t,1湐���T�jג"e�l�a����`F-��xJ�I�$��-�d2�'���1O�uH�d�(0LNe���E�n��r��ow"j��S�<��$e:K �? �(1hN��p�x����I��2i�)̥�]��o��U+M�doa�����1�6�>)a?��R�%��]�E�8)��TI�=�XV�d�)�%EJ���VXp +)���A�dH �L��XZw�y��øE��KЛL��'��jj������E�/���&)��6��*���s�ę�|��,$CJ�`��v1R�k��݄������'%�$zR���K=��'1L2�)��+�����wO"J��SV�s��$��'���I��O�҆I6��5�Gd 2c�nx��'u�dV/8�<��4��_&��5R�Z�CDOr�J�8k�cY)t��Fl�E���A��� h�T9m�r��^9��MO��6MM���{��O +�'?��K6H����2$li��0�g�m�N:��Bk"%&� +�X���8rK���fãÒ��2-w�sh9�Ȓ��U<����Y�����S(}����`0�KvH Y�P|GqL�M&�I���X����7
o$e��a�YH]Z�k'diR���wUO�'u��Z��x��}�c0=f��VĂ��7��̃I�rP���Z)#��EQI��&�� ��x2��!;��w��e�6O&Y}[�A��1��v��k����|�A��y��d��[ �ᕘ"��C�%�H���LTR�]dHi~)��g�ܖ�F�8�W����H���j/r1ϰ�3��w�9gC�>�6�!KR��<�<�^B�>a��BI���k >�Ʀ%���W*aK���k����ջ�)�h7'��k��'�G
��x>�2��{f*�v +�oH�\6_?� +AEdR�����
+�-QO����^��g*J= �\���g�y�h�T�� +ո�ͩ.�;'s���R��r��O^��)���s��2�t"�C��w���U�uŲ�^�c�N譛�g^� +�%�Rq�Y(%m��~ ap�i�nk��_)%�I�I��_)�9N2?�'K�l[��*|2�%�i��/�y���tTw) +Ly +�K@)�IcU�R#O|��\����);�i��(�d=�pm�\?��5Sy[ +��۩D�֢vV)��r��m����jhg�%�d�K��J*��ھ��{� � +�%
o�pV ������Rn��Ǚ3T6(�j��a?!%��Q���O�\��m������� +��X�\�H)i���N�/��wp'����*>�'�0+�O�6d݂�5sP� + +(�R���IQ�!y�|r��3�I��I~3��Odo� +�Z�֛ +���l��Æ�H�F�O=�Ac��7RN��k�% +����g/o��:�l�!
�Wv�)�R&/���<��d ��ux}UE�9D�a�Jg��n�h?�t,�h�2��$�����?�* +hT�`HN�9�0/,��9ck��a��َ��qv�Ѕ����E�qH�#��u�ۀ�,X;�: R>R�嬢p��?�|,��cד0��2���T��
?���/��:
���IF�{rg�k�a�zX�,����E����^-)Ja"��Ŝ�H�F��}�)�:���^�W���{�)������zZ\��i��|w�mL +i���f��ɍI�p��q�!,���iT*X6�},�I�[G"�c�5��9���G��6@�BO�vV �E�#��)qe��ȿb;��$�[�����<?�L��*,]����8�s;���}�P��YL-�-RV��_Q�Tw�@J�V��λ���b�Y�L,y���_/u{� +U-!*a^x����I�cn��e�&7'y~���
Xr��DXF%���ME}�FZ�2}Z�)�9!R�e��i���4QADʇ��8��k�飕����P +�vː�����d���l{��g`��ed{{/pK;�W��+�X�$@�4*.�?_t��j������D��)�Lx�9����!�o�l��S5���(F��ZB�.�b��ΰ�q�ʍ
#!���)��'�%��� ������{�Q��YW��|#��?��YO�}��E��t�Sg'M�қeS��R����Ȧ�H +.mk�iw��|XZ��L�*{(`|��R-���]�}�bJFV�Hy�1���e�;�R��R�4�S� h��y��,q`;���8CF�"#�{� :x��s�r%(�,#�"��
Ci��4�-��k��uV���f}9,��F%�uE��Ġ���D +��p~�gK�仳ls������3�cG��ׂ+ݞ�� כ)X,`Y��Z��t�d�<!�PR�D��>/�p�'�g�"�]��8WvJ:�HJ;�5)��z�֧b3��C����"Ͽb[S��� +ӭ����?��������2��g�+X���iT\$$l��R_0�(�LʠR�u_N�t����)�H�ȓw8Q��w0u�L Ӿ�Eu=x�43�ȋ8�D�q���� #� +J�E�F�Y�����xG��ð��Zڼ�p�6���/�/�g�}�C(Y�0�vf��8��'I��L��p�<�B�*Z��QYK���×��{�A���"�HI�L��eO���w8?��^:��'�Ӿ|EuP����G;�'�Iq��;�6'���Qd�v��T�ɝ9~d��mֿ�,���,&.I#:��Y�vRRi�J�Q�@1)�1�ɹY�I��J�GQ�}S�C6��`ȋ8//�� +�� �� X>egQQ�Le�NV�H���� Po$�dz��H��a���#��f�<IQ}22w��FE)$��3�:ʍ�!��1cc����K�I&ʖAy�'q��^�}
|����Nj�+��뾜^�Y3�����g�O4�N�u�J��DQTO��z�;�G�z�_*^X`{s������d���א�TY��vXj��5%@�`9,��;[2��C����e|;o]L)o�709_V�M �3�{V�jѐ�����r�rc�%FvL���7�vh
U�vX.�ʒ�%Z�]m~�w�����Yg����2IK�5����H�DJo�<\g��Q��(J{>#�Yd�EB�-�� ߛCC*�ƈ��i/ �,S;��3Ku�iQ�Fq����o(u/� ���'%���h���ۛ��(�)F�+�e��ȿb;39���tl`��ܚ�o*�KE�RX����v�~KR +F|��O�o�6r����iw����Ȑh��sv{���ɓN-߳e9,�1
Kp�5�������$L�h�@��֤l�
?ehZ��)��_�$����Z�'���������ъ�����3T��`�0醴*,�<�q�
���a�`���e?R�[桵����)߮뱿�g_v��v��;W_�ׯ�t�G���˿�������ÀGB߃���5S�,n���������,1r����Y����=7�)��RXT㲑қ��ݞ���u���n��� %=S2��&|��
���%R���ݚ�O����.?�]�HZ�^(��W��t��8���c�_\��u�]|ď�|t���0�lh�Xn�a���23�D'u�٪���a���,#U�*���ir�mR���4�ݒ-xO����R�#����}����g�����<����?���|t��>6��툢�,���1rj���]d�Q�����n�pW?��R ��g=�r`0E�$+��H�Ğ��0og��
�N���ߵ��A�C��F����ؙc}4�sȏ�;�{l�[��D]�� +7�D�H�;�~��аL�f +�S�f ��6����D�~^#eA� +�}!ORԤ�{��6X��r�KH�~P.��A^ +�㨨%Dx���`��U�@��4�n��r����Eʙ����rh� +�s�r�
K�U+�m��)�7{b�iƬw"���X��,���w��rI 3 ak�')jB=��D�;�`�)���T��(?����e�t��@��T�+�H����he�/
斗5��~,(Y�ΡoO�rk��W8:�<�}g�7�GQ�_ކ�u��C�4��,A�t��I0�RH)��úlgŅ�\D�W�X�����AI��IQ�L��%�A���8�>�2���I�Xb�e�� +�������<�&)j�����#�H9�`za�>�(jrٰ,*Q�jL6����t�4��.�~��X�DʷY�ѓf�(�*R�J6�� +x�o�M��ɤT!��կ� ? K3���(��/1t�9=���2a�rU6,�a��8�kX6:��;8�bH)o��#e7�����Ii� +�W#R������\_>�_?� "t�94���_��s��]��0�R4R�"B�n��qD�%�H=NJ��%;�dʩ�|�@�yU����М��G�r~���#R���23�D_G��\�*ᠨD9"j �3�i�>��i�b8�
��qR�Ͳ&��kaҡ���8m3�����ug=����r�`�v�u�&�r_}X�<��o8
�pΠ�HY[�-�SE�]��[�5��� +���R�v! 6&��uW,3t�9��Fw*ʃ�{��ٰ�u� +�s.�}��93��e(�;�=a��Ç.4�s���@_5��
`��`V +Y�\e�0��I�:��T�'%�yb�H��͌���Hٽ���T���ۄ�<�BHD��{��(jJ�TPR�2�ϓe�F7TKp8�I9��?ɌO����3L�L9Г�9���z�i#�8ο�vwI�xΜː�V�6j�+5UWiz��jWEj�6Uwە�Y !!`��\�������CU�O�"�c�}�Z. !�m�`n�1$�ߙ��, i�g`~�W����3g,�j.�,Xh�#�&��H������E^��,��e����D8��٤�>���f�u�g����y5sR�宺�_���y(iM���F2�ln��L^U�K��a�+�;���*[�.�2cڙ�%�j>T�y�YI ��SK������cJg��)e�xJ���_7HJ+s�Z��G�~��5�8c�L�2a�~ɁeRZ��X�a P��Җ�Մ��_"��!��1���a�RD�g�T�.�c �5���!`����f����#Mt��'$>�0��r`9-E* �9 M;�6Н�H�'�)�ZL +�MȺ������6����v1z�DR>Փ�.1|(a�K�v��X.�(Xf����j���"C>1�L@d"�'�F�փ(��W+�� +�J|��=jR� ?���~�c�����U>�H��[09�D�ڄ�°��fX·8�2ӫ蒋1�vJw[I{�-�NK�np��6D`6KNs�Kv�9g��{,�����Ťu� +�N8W5�@�/3�2�W�P�-�;E��/��j�R�F�-��,RF����Ń/Zm�ҙ�����_�l�ox�`c���G�vȹ!�#M4�.���c�g���)�p31R��'c&�SA��_ ��Z���>���&�)�O�����ü<<�^�HJǓ�/3�+�a^�< +����Mn������-�M��H�x� .��b��[�k`��&]O�z5^B������뿓1̳��<H�!{;���Ҿ��R�����TP +���^��j����R�V�͉ao���6���pj#MN�b��(���ޟ
���,s�T;T\�K=(��'�HJ��!!8���J�������ng��Do�������i�� r�ǘ�_u����*��� >��r;U:;���P���g�^�\�K��ô'��V>ܨ~{��{-L�u�0l��m �����JD��r�!p��Ow +��{DJУ�j1 + 娟�����C��_�+�gO�'��Z%�;0$l� +΅�s��#%a-Ʋ�������J�d�e����J��Y>�UJ�YIɁ�Ii�V���a�ӽK0��;o�U���0�m)U��c6 +��D�|S�P�S"2�]�%�OK�z۔&%\�w�G�&�a�3-��e��+ɠοI�!�{B_}V��'�$4TK�����dza�HงI9���^�[�bD5�SðX���y�T&e6r���`b6�3` +qX +�*�F0`9��ÁJr��qI � +`�鰼!�o����@U����-@ʁ�L��F��V{�[��De%������:�B�gO<><9P>=�a���� +�+�ԗ�֒�o�x�����ػ��*��b��� R��*�Ű�J� +b��F��oU�pv�h���R��J_ß��<�Ǖ���m�N����yjȸ�+M�5*���+�rgC��<� +�+�e���]���iEO��yXf��A��0��K�o����0,}j�ݳnҐ2�9ُ �ace��(Ս�bt�#��h�)�E���Z�|�t�Q-_��zh������|����w��۰��z�s��r��I��j�������Z�|�]Gc��W�(;�G�q(>f��13ƄdΓp��a5I�J$*��/�&ia'��m�I �����a����XG��K�1���h^�b,]��~�ּ��Yx�����8���(����6T.������f��\��m:�X�-�=�FPbZ4>�ѓ��I(���{�n�d����aبIb0���$-���Ű���z�a 4��ԍN�c�̈ۦ�S˗��Kõ? }��Ю�������sQ1��4z�4�]�rO%�p���Z�ĸ�l�Pb��И)7�'���$Vkf=94tb=x�-�/#n����ȟ#���YaN����M��J��4�n#݊�q�\�K���j�� ���7C{����9��'���n�6�����\:K�w���e'�cυ�u1&)�#z��=i�/��ZN)����t?|0�Lin�w�� )��Z^u ��8`ؔ*�FG�8
(�]ֈ�q�u%ڌgi�Z��x�1\�jx��C{�|7�I��D�b�^ϹC��#��J�I���J�|���蘄F����A�\�/%�����L`����cR�IE�Z�8P>;��M�a��.;�n�I g��"&1,mb:4:�.�11����h�L�F�(9���j�u���W�.�Zط*pd}���;]���9_�t|�\<�\:`�9�������]��&��a46���q��=�Ԟ�V{�ɡ���":����HJ��Ib0�\��&��p.e���}��ıs�H4R7�4�m��k�����_���|���_|�9w��~\��Y�.У�բ�l�p�$�i�F���a�����S�����\�%�2m�g;w�ת��k����������8wkQ� +> +���8)W�`��㥨�b@#�QC�&ƴ���i�1b7�:l��\���T�|W)y#|����峿���^����k.��V��u���8�(4�G���nã\D4hh��{U4�ъ#��Q��4�'�ILF= �H��+ם���@Q�Rql���g�V�����!���?^���.DG�y��Bf�y"�U4�Jq&r���p����wC��k�����{���K��^㟦>�!�q��8ч�-nwk�Q?ߑ�F���FLK�����I<$,���/��rV|��Ơ(j�86�gA���'!ٮ�0�W%����ܞ����h��Kŕ��xr�|f�\�A�����O��������*�s]�o +#�*�T4�{U1��^\���F@E�j�ݨ?x�U�<��6|�Ѩ�'g�Џ8+��=J���u�l��Y��+�I��P����]*
��Y4B�a]�l F�bُC��
U�/��}��G����9��RK��}Y���ې���1��bt�rЈ�9��]M�P�D�����T�1�����Ӫ>r�z�iE-�@��R���t�:%Ȑ��S}�l��2GňhdЍU=�ǔ���e[B��,t����5{u��o�}w���.J=WŁ&a������DbD+���@c܍�oI��b�'�Y������I +Orx����_Gȓ��R�,�� %��.4�>"�Jc,mZ��� +E��w�~=|ts�|�|f�|~7��>���ګ��ˢ��[lF��F0У��q�0���w�8�7O���j�E�L<���^*)a2���F���u�Ⰺ_���u�a��(�Ƹ3�-*��r1?%b7L��b�2�&��;ʑ� \��P��r���տ�~��X�k)��/��z��0�$�F��c��!D�D���^6�w���9t$(R�yRK��`�I6Or�}�"OR��+T`������E�`z�Ъ�@�X�\7��XG#���#���u�Eqf(%o O�$|�Q1^��������K��s��Fi���[끐��W�ց���ح~xA4�)"O��03Ƀ�<X<�^�8,�>bU�=�R��86�gy>Lj�暧��_���dR���ܘ�n�ۀhte�On}�s��������O�Y�[��_{��uI�)���� +^���i�Fr��Lj���.��ub�0� +2�F�C1=�t�G����H��ȓ�'�SSg�
�33��G�L0>v��9�R�Z)����9H̳̚�z��h���P��hԔX�����S�[`/gS��k���4�N�:�S��1�����T,uTKݗEO����������D̍{���~�0�!�vƚgE������'�!33�|��3��
��}R��|��?]S��
f�@���>)2���H�Bn��.�Y%"V���"yЍ��X����.}3\�%\�5T�#x��+{���
���B�:��p�0��%��n��8���=�XO�@ą�Hh�^�ȓX�bR}qxVa��S�-9V���DZ���gä�����:�.U��tA�t�1b7#�a��ܤݬ+t�P�{r�.���5{u���-eRG�����'�y��ch�cg\��R��8E%C��'-�+&�Lr{�1�S�b�$E��8����oS�����\��>N)B�BU~��P��J�4�h[WuhҤ���p��~�i����RPB;��q�qb�qǹl�v�9���>vH������y��$& ����<G_t���|=��ڭ�fO�ֆ�-T��K2$�qI�r`�t��Kṇ���Y�ڜ8�t����u/�N�=����{��G.VG�����{>y�������?������z��~>m�e��)+qe����~j�$����RZ���FJѤ�SkL��=x���@�)v��*����b���hbbLC���I@�W��+6��"~�ر��N�6�;�\ +\�8ꁋ��3!OS�k���?��'�険��Q +��D�!���H _E�*��߮h$l�4.��4/Y��*ɥ�p�EK�X�Q���X�%Q�L�Ȏ�'/�~����7���"m���(. +�V�� +�^~���q|�z�h�=Ԋ�tT|�b�zR�'�7RJk�}>z&[`߾]�ѽZ�9�a�E�x���S�*)�&|/�?S�Qi�]�=µI�4�5����O$��E@c�f��g����`{���G��=���7f�Jf.VF�a�i��%��@�B�͔�O�(�1�f�]�7NŮ�ňnİ5��=�0)�}OJ��l�3�� ��MI�a��f��+1){rf��{yn�V����B���1/���<��X��ġ�>��ױ㿛=���ٿP1�X"G#]�B}
���1��<����V�L���dP\�Y�M�VM����̓k��)�h�ߪ6�ʓ���a�#p��n�2L +oi�ГL��&c��hbP\�b�f�»ӈ�����?��b|e�����oϴTDZF����a��P�0h���'��ꑹ$I�ؓ)���bİ�M���_s۶mR�xR"��0�Up0PY�Չ&C�©R���~��w���h\J�Jfa�&YV�,ͣ�14�%�'E��r�X�9qx[�英�����{gl��H�u:�{6���4�|m���N��>*F��>�h��h����Y��a*J�������IكIv�G������R�i�a�C�(7oieR����=~̭�F3��2i�cIn���TI��F��Y��ӉڭT�GvĎ�v��kцw��e��ÑΏC�&a�N�; +=��j�&Z�y� 7*ѓ��.V��ޣ�f��3.�W$�����dɏR~�,�"*���&=?�B�����D?���o��g�ދtԅ]gB��?�σY��E��[��ҟ���dJ�K�hD7b�Jj����F�2L.)�~�bL6e��=pl �Ё'C{T�&Y��n����(Z6�5?Mz.~����wΞ�=���1:��=�B�s��K�����
Ђ��!�(.�\Tbf(F�,zR���$��� I�)ѓ���h�'�1\�����$y�z��Tݎ�'���j��_���"�j"��p���t��!� ~;U(qb�����2�@/�Q��h%Q��=�T������IY�I�=3����F��"�a�>`$�Rf*ɛU�[�F��;sf]�z봽n��*x[�c=�d8��}�0�����'�=��]��Q�a�:S�'� +��!%�Ub�#�$F�OI���P�0����E)yٚ���0O +w��Հ���Ǖ��/}��e_t���8C��7�#�F��V���j��휜�@���O�$�`$ݪ6�Г����EC����^�ݩ5�-Src�<y�U��x���0�iw]�b���!��P�p�F]�O
ð��Ǔz�F[P o�Y�I8^f�4���I�$���R�%C^����h2�L�h��\i#sr��2kaG"�d����Fo�y�5�e��_�v|5�9��[����a��ē�{���KَIIj�I�_$�f�z%zÔΔn�b�Ye�!�J���H��(I6e���&3�~��j]�`.�w4�썃�ơΦ�.뤻���,�i7l��~.\�{����0��O�ZmA����L�-Rf���2��)��,�L�"t��D(EҒL�5R$�-w-[`$����~�ڜ����<do�lr��������Q�m��v�k���kj��2�lJo�4�g
�a�;5x��T~>�RZ7�dSI4`x]����}��Hi�#oV��)#�1I�I�1^mX�X[vRF>��C��8���vX��p�3��A�m���eO;��j�vx�%����0l}�Oj +�u�I�� ��>��h�ߪ6�'1��%��r�b�Q��uw����k��V(��"͑���L�p��ɦ�
09�n�t��:),G:��ݶq��ɾ�+^;�R���Cðuٺ����Q~~���<�p$��[z�)=v1l��bgXe��⾮���7�^4q�r.U�ai5��c0��cq+�����`�� +�uڂ=-���n���q����p��eO�l�{L��a�غ�$�+(��&����<)��cN�a�'�p���5H����f�p)�A"[2�b�dc�Tj+ �K̋�V�X���/�ߦ�3��o�ʼn��ؾβP4 +]�`/ݺn����nSѴvl�TUh�����N���N]h�R����-����ߝWB� MjqL���~�{ι�c��&��&�y��ս'`��=���1�J�������L��� +�J�r0���~~*��r:�!8MݒB�����I��T*��|R�IT}��,��oa +ec�1a{�m"�n�A#�Y�SݿPM��#��M��|�,\��x@�^[���9�@�'V)�%���@��9��&c���ݒB�P>���I�Z�|_��
�1j�[H�!F�^�P6��.��u֬��l��RKֵ��>12�m�{Nt�u���ϱ%�q����r#ݝ�=�T�'�����%�X�-�A�p��|�{�����>"nyIꪢP(��IQ&u:��K`����5�ׄ����y�)�g�o�X#�!�,��n4�O�3F�J�a���F1�*|�L`lq7v
��!G�o��lN/�[�Xƈ[�v�#�c}�-) +eYJ�'��P�2)�v�~������MM��s�c�5s�� +%쓂Ї��5c���*%�R��� �F���F3��I"�Lj��C悈@2��%����%��zZS�-Y�$�����+��㕜a�z�[E�ǔ�6v���'"ީ���-C���BY{J�'5*�P�2I�Y�Ϛ��[j�Rw7��. +�_33�̭f"�&�l�_�H&�M��wBh�J�o�{�^+��HO�Pؕ�>�N�\��Q�薶��c��u��}�?P��P6�'Eut�Q��*U�BY�P�(��"l�ă�|R�1�n41�')���w����ob���C��*� +��)8�[\�ب���+&|l��
�����������M�!�hO'qK�]jH�*�P(����I�:g�:�F������F�T�����j�~mpH�R%z掯��}h����/��̚쓒�;���d�u��|�R;k�g�z��+ei��kw����L�,�p/sd2�p�c�n6�k��l���x��=���J��-��L����c��c��3�M�P@���t2$yR(�{d��=���!5*�B^UUQY�����R�R1�m������ٽ���~��G^<��{�̟|mg��Y�,^�Af�f��Q5*y�S(_��F�E��t���n�%�(&� +����r
��ADP�oK�8I�(φ��Re�d��Э�̤y�R +�����(���:�F�4���BU]
���ƀF*����ޯ���?x�g��ק�������;p�}��� +�8�ǃ@B��=d��9��a�®���3�6��&���w֬�>Iٸd�5K�s�̭f����u�M����m�!X4�>����!�pp�rl��"�&C6l�|�!���:>?�[�tKNu�O��T�6��:�랈x�� +�R���-�iK�la�X�"A]��+Mx�5�"�!�Hw�x�g"❌�/���U)����QԪspż=�:n���IP�o<����~�٧~��C?=q�D�[�>���I�m(��� b�!S[�ω�� +�$�$.V�H+�j��sݴ�$!�^ ,4����c�O��$>���Ӻ)Hۍ�$mzb�+���ϙu�v�$c;�G��q��{�k_w9��{���*�ֹ�s���m6.��e۲�F6{1�N&C��xLjƬ���1R��+�Dp G�D� _��fS���0���%A,�O�ᓐɎ';N�8u���cǎ=z�ȑc�>��j~�������~���z�g���u�/�������5H��H�bih +�,��d"0���0&y�9�`�-�����Ǽ�!��&�Rp{G�Y���N�ԯ��3�|䓟z��)������|�{����?z���o]u�����:�O�ކ.���!샓q1��-����Fu�o|:q>�o��l���3��t �7\��Ds�$���%��+]UX%�*̾���z�s'�8�N�F�W��R=����np��\Z�J +�����Ps�mA��?�!��3�Ҙ~3C�!����۵$�$��ŸG�'���v�r������{��_k��������� (%&{�v9� �H����0�r�?aL1Ƭ��Q"��6�5Om�E�8��!�E��n�?�0��H&�wK��赑F�w�����?��{��F��P���?�G�"��'�3���thq4R��H@�%�<� ���%�mZ�p����<�aUP����QV��ַ}1���'�f������sL���q\Q���q0���sܻ���
���44R�\���ر�4��Y�����u8d�쳩��Р��\�aF��wS��l*�]#�$�ggq4<��?�7 +uw��cݽ�\wқ�x���Z|J�^�:�/���A�0I8� +#a����`)9��b& ޡ��˩�6\���E�^.9"CI, ���b�}1�Nˑ�xpͱ��<��Z7��xd�a�b�p��[�fJ�x�+�U6?�*������'�ۑk$#���H�0����X��O�0��1�|&<���3���un97<�0.gu��-� Ru�ܒ8�5 +[n4���&i�t,�A��y�>T���I[�i�wQ�^?�6@�W����[�ɤ�"U���8�_jhC�oE�$��.�ؓ�=�Ǿʇ��A�ͦBŨW�Ba��RP�Չ�zxp>Z�<��Ơ����"�ki�2Y�KQ��"�|Jٶ|�9\2|��Uτ��W��ᒱ�<��2i��߹`oh>��FR=�Q�īy��9
Y�W� +��pp*��`z<&�9�L��j�-}�d +�P���-������1/�r!Z�o��|�t1!��Ēhr��,gut2Z:��ޭNד���?�Վ�N�A�fV� +ф�1�E�c�x�+p�k��w�t�ݥ�i$��Uo����>Xe�[�����h�<B� +M
��Z�x2��%��d�?3<�]���vK��� ��r>��ak3�X�rf��%ê���G?$��%�r�!�����!/J�V���E����N���\6c+PQ�Hչ�?�H^�@�-y�L%`2�/�i "��Z���D�WJfS�����\�r� 9��6ܑ�3Í��`!����0(��qت2��nR�C�Rc�%?�ﻥ����������n�ʹ�f���ض��T�^g3�i~��#�l��"��RJ����n�S�[�z'��Tpa$�,�c��ۈ�b�.�W��u�x�R��i���5�!~��5/����M��-�� +����(,⠨8
�d�k�����{W�p^U�����k�}���e�i�H�6���H���,�G�:��g�"Ck�g�[�9��n9<�\Ӆ^B,M�$�$��Y}�Э�&l'������DmP��-����XgR�6ǰǪ�0IC#���_�k?rv��w؋;ZG�m��FR�s1��USG]�XΦ���P1��.gu����%�����JCs���h���! +��s�' �wa/�f���8 +��?�|���"tAB������eQF�#��m��<����hD�ٴ�Mm,�ʆ<0��K���kK�x�KJͲ)���\cY���K& +k��m�W_w�a����IBacU�#�l���A�����h(*Z!�ۇ>�4�^�D�8��o��MӋ������8���A #1��a�b�/�3�.�,��rj}>Q6�Y6����qx�
�f��ga�n��`˽2�%w�`���лc}q�<�#�I��[[HښT��q�hN�%��y��-'(v���������s0��)�EX��VP<��o��9�H"�3����`.'�yoS)-�lkT�5+Q��L�;�(�Oڲ�F�X6�j&�X�k,k`K���� IX�������3��Q����'��d���,_���H�����M:ܽ�=���y��|��������M�����÷'˪��hH� +"Щ$K��y�ǒ�P=ԖeS�լ��{��j{��R2��L|}q������R�O��~V� +��X�F6UMNJ�$I�ӭ-�Yθo�=^?����=$^zO�n�H��AO',������yr{�Ԑw�#2��l����E3R2dw���'Y�C��6����Jc��L��VN���L�D[ޠ�bQI.k�L�c$I��qS���n��0B���_����ѓ�K�K��(�Ey�@����v�sL�xf�$���uH�/��k�)�zw|� +�/`����n�3vY��Z�T�u+jgwy�a����6��WS����bF��fHJ� +S�%̻Յd͊3���*�eϖeS��c����lj'��-U�]Vc��Escq���pZx<�<�%]9y1CM�'��$e�z���0O���O�m�m��à��?�L�#����cw����π*!��Z2��.�*a�UұFV�f,y�W�\��n����Vbcin{Eظ��+[PW;�%�����{��ʥ*�2��t��M�49���1b��B��$��v��Ꭾ+5d��!"0�EX��h�(�k�f���C���rZ�D8�#�K��`F&t���%�6�E}�6d:�R�2;�UƴR�}[���U��닳�em'�/��{)�+SI6�aWgI�h�R
�f����qy��7���'�-���]_����$;a�ݴ� �;� +���H1�WI��+��=���7����+"��dG���o�������O���8(��$y�4�`0c��?Y�^�&j�dђFge�T6��jV܅���e��2�l �N�fbkɭ���`��P�%k�g���]�>/��qW��I��ض�h<e/�=^o�8���j:On��ۇ>�6�)��t ��MRR�^'�#�$u�`����`>�l���Gpf1)h2����|r3�*2�#��C�(����[��N^�-�`˽�-���p@���9�b�$�L)KZ^B��s�Wz着�Քؕ�S
���EX����M����<�{�𭳷���xc0���� ��+0"�ꌭSIں�����s��g��t��Њ �Ll,�5�����liA����$��o��Z&��<�Z�IY�x�����I��V@tI�=��A���|���|�"����8�T� !#1�D +&\�e���b�׀��&`ͿX�_Ƙ�o#�b\�C�ގJN'T��
8Rҹj��q����0R����n�E\��.�$���۳�Z���V.�x���%��ג��ߠ+ڶ젫��To.��[~�T���gI+��|k��Kp�BL^(wѮ:�A��%�TϏ{��z��M.L�´Ur4�d���f`B)��1pH�
�0��e�[0����͵�B*�^�DWfk�I��z�t�&]�o�d�^ʬ��Q�o���L0Y����A��h +X%_z7�HJC� ���������}H�{_|raf8��!��f0#~��-5og�j�˰��2X9���˹�R6*�%����%�d�+������z>��ԼTt�R�
�����Q���5��3 �9�Ҝ���AL[J��_���w�ݧ���r ��UvU��Uv鯺g$O�;��`0���gv�.���,=Z����Z��v`Y2�t$�"p���&[�DWf�ϟ��R +��.��-�m�����Sc9sNR�D
n�x[<@Fx��^��@�=��֒.�k��0R�N'�7��?����%�nҋh��zG0fC)m�p�H6�e���u�A��'�-L���Z>�R0[��H9��ğ-$7�z��*vl�s�W�1[�(��Z�w���Z�Pa����/���y�@��O�G��oH8#Oʷ�F# +n<�����b l�;茷�Yϧ��(ɫ��0�y���rELG�Mk��oh����{Rmy:��`dCH�%����'�� #1�;a��g����e���U2Q��e�Bf:���&�f��sS09/ +&���]�A;������v�7��\�y+�3DL\0��DLW�=8��0����R<ާ`��$�ር©���?���+s5)2��`�7��g��+Æn~XQo<1V��o���[*̎-;�o��&����F���n����������O~���M¤��Z`�N�W�+6u�N(��lǴ���� +L꼷�HXR|��2��L|m> �\����r^¾S��x�dVZ��h^ _��}�H�<)�*�$��89�C?�#�#
�'�gw�ϛ�x��.d$��\/⇔۲k�$��$ +#mq<��� �p`���-$[�7�vL0��`07�X�����gAg��a �U��'��HQ��A*�J�G�G�$�R�Ǽ��o@tǁ>y�%F�?�����$� +�r�ޝ��;�H���e�{쳷쫑;��2�pb$EQu�)������mX �%�Y�KE���C4?|��\�9�b��x���.&�� �j����-`�p��nC�&��ӗ����S~�>�K%����U�|���n +�!�Ü.��������Vi�m����t«���~P"S�g��]���C��(���]*y��g? +EQEQu��F��L +H��
pT���/!&���_aB�A+�ʄb�J���ZDh�jh��b�"Sl��SF[��q��vB�P� +�P�)-��7Bd I�&��;=��&�_����{{�|�!;L���s�w�9�W��=������!�ግ�Pڇ�#��=^v��^���f����V$Ax �6G��<=\�
k�˰n +]��J{�X�/���-�0G�OK�K;ֺW�̷�Baפ
�=R�2��X� + 0M5b�cдp�;NY����#�pMg���|�ӌ�4��W�4,�v_�}&����:�2��Z=lX�͚j0���T�<6�g���2n�}Md~=����}�.��5+�۳��)���H�8�tY��yh��J-�k~'3~,Ϩ�&XƂd�
�Xn�p.ù��Fі��P�>7��`&�&X护�M��5*�~��Z$��{��S:Ǝ���VB�LJ�`Y+T�H$\gR|%��1��닶����4�3h��X�z�4�J��w�@��(������_R�
`_���g,��]Ɯ�rl��Y.8.l�g��;j�Ⱦ�X8w�`�oO:ݔp�Z��D��E��-����#*�5D^A�;LI5�6�(�V�X�
2�"sA����VãT��l��1�qVx��`�L2%
��4����M��T���દp�����uwVUn2"��`C�p�������ٯ���+���s�A�GETdT�Q�X�RP#��m5)hՖg}Ԉ $�!)�f,Q��*>Z�E�Bַ�G0u��jEq@��{u�s�Ig0uf��s��_7����Z��Y�����<k����K1{�&�F�[�g�V���G:�e7�
�˷T���[�5�3�����1�ɊD�Ö�D�y��3w�+�q��!��J��A�(ov +s��i��-q�8���Z�,lQ��7���O�i FYk��}�8b'<n8�YR��8�8k��}���oiL��#�k�y�3�=L,�݆��4.���(�t�n���67�U�x�^_�U�5�w��-�6������2�}�[7ܵ��l�����������"�-]ó��o6�U�f�s��煝��0���/����>��_�z_W�9��.�O�r�?�KS�y���/�?�X?��'�[Ư +�q�'+l魌�~��_�$ۘ�\��z��F��ܠ�=F��_.�L���kQ���G����+YI1�ӠMå���;�o�]���s��y�k.Z�5�����F�Ė�� �.?���Ǐ}��Q$^�k�0p�2�E��~��L�4���Z^�b�7k�'7�-X�x]�#]Z��\)������߽�+k"�I���J�����j�~�ނU7���:�>��"������p�3{+P��֬���&��Y������}4�cI�,ҝ~eݣ�V_�y���{&!���D�qK;�]�F>��pq�O����׳U�Q+f�R�n� ���r���[���m�Ee�Zv�7a�p^k͖wp�R����{YP^�:����y-[W�!��=�Av����Zk^w7n����q��u�����Eٍ+��y�*+�E/lͼn��=�XN|��q�ڏ��ۏ}��k�O��*��lX���Z�u^{�Nj7h���k����
k!��9n���>J��TO�2A���: 8�A߆xm8���Wg��q�ys;[Y5�kmx]������~G��7��K�~ t�"�\Z�j������U���\^��<K;��;�!ni�Vu�C�0������s��TYP��W�*�n;2ov��ޯ����B�lB��:�?Lג�kU��TY�(����|W~j__����w�������+_� ]FR��ZkA�Ɉ��>y����[��s�Μ��~�l�m���}�r�~̜~�=oT��*��ZK��c��2�J�� +��에T{ak�u)�\`��f�+�Q�g�>�q,^y��ײj����v}5���}�_��CC���9�?��5py����¸<{{n��9�Z�Fp���6�99�%�D@�����7��˚�qD��uX7���M�A +��0��PGDr�z-�oD���]]��[,S�g�����h�ۃ,o�)��Z����OX�S�K���[j_M������d��,o�)�
=�d�o���ٽ]�w�:�I߭V�� +�0D�3��ܩI��F�)���
���r�v�7�u2Vysr����5�N�Z_kWG,7����.�����W1n*��I'��c�T�/����#���^ "DA7Y��y#H^G�����N(��JPysR�n�@�ͽZ����Wm�$B��d��8b��n�Py��!X��,o�*�%`��b
���͵v�aD�m9��*k�`����U�7�4\�U�䷌�*��G`�����R�� �7{~��o����ỲI���FAJ�YAj'c�*ay#Pvs�����$^e#'$�;#��%��#�7Btu ���/]��PY��(n6�
}�j2����%��5��J��oN��3o�*�(��S����Q��Z�@�{��`%�(n��~̼*���8��_$�7����5v�Q89m�}3��� +Ny��ʼ0� N�z���$��7k'�{�7�u��v�!D�� ��P���´�����v��Ysv.Jy3wh9�#�<�/���X���卐%:�����鍐m%����>���5��P%���(�-�+�y#d^o���ɡ�7B�����"C�d\¼2k'q�IYi����T������!�J}���q#d!��7'�a�/��:$nVަ��4���A�7'����F��ٯ�X��2�����>��c�:$Ok� +��a�"T�Z�K��X�3@�-�DL�~�sC���BؚJR�a#jdSaSB��=�������P�j�����~>�?���7�}��uݼH�:�ӕ�8P�s�%�!k�Q������}լ��'0�@5�s��7�y�1z�����ޚ��: ��ym184�h�����R3�������݃�̷]�0�@5�O���u�
���|���d��
Ts�Z�B����
t��S%�dN�=���y�cՌ�y��h���
:z˨��o���y:�I9���j�������J� +�
��<S�x��!�q +���ष=lC�*��'�-��g��^�IP���`��4�ŽRߊ� ���M;�� �O8C�<��o ��D~�3��=z�d�=�=�uRup�6p9��Dg��V��_@g*��ep��Z�$F�������QAj��1�ѥ�$DZ�a���4�}��_@g�KR���t#�7H�lm�%���% +pN���Uo�1c�p����������M���C�p���?�!�;��24 ��J9o[o� 8�)�ur>� 8ЩʏG7�$8\)A�n^F��<jO��|��2��}����"�+���tqlgG�[�&���.�ߺ-���c��2�Ӹ8hc��������OP"��ËA' �rg�!�-u��F�zԨ�/��NR1���x=,��x���s�7PC~��E�[�I�7P�q~O��ɇ-e�j8>=3����u��|lR���bz=,�p��%��s�[p��}�h{3t�~�7P$翛h{Ki1rM,oMb����q�E��koM�/��� +���#S��-���3��cyw;߁��\Fo�P�/][o�-?$ +5�|�����k����҆��@1�J��N�Plg���ƶ�f�ҟM�To�8����N�����V�>P�'��z����
��y��(��ɘo�s��|l]k�^.dR�g�s����� +�L"5�7�����B��,泪��q�9tի�K +����0����N���-8$�_��]����)�yt��s�\Y���O�l���ӉX4bBo�ޅ�
t�Pp��
�˛��
�\�s���Z��#N���˚5�[6iHom^�������=v��h�\�gS����r�#7Г\`�|t���P��ߗ�Q߄�VMc�=-4�$��aykh�؟����uPڅu4%���ݔ|�����`Yͷě��=����J=>�K�z�w�R1�j5���L҄�<��Y����no�8�O�l7��B_:���o��no�'���Ǜ�墚o� �kޛK�N`���fz���|����%3z�h;�hK.4�$��c��b.m@o.�Do�+)N���To�\:��ޛG�w�r��R\�-��
�WS��j!?ӛ�z�78��{q����lp��w0�ǯk�T��L*1ӛ�Υ�K�����[x~Ω ���Z�����{#���h�������|w�U+�gR� �uoEb�}�������7���Y��L�m���
��Vog���� +>�~�[V��\�r��g�;�p�mU +�tR��͡Ƴj���lor���7|�H�R̦z�������7��#�ۍ�@1�J�"���9�!w��c��,w{{j�6P�jޛGkNc���Q[��S�Ԫ��lo����Ou'�70�j���b.��7}{s�~L�4 +�2���/��j�y�����i�$�!�C�|.���M{{�
,����� }{si� �7����-��"��z����t+�XC��|>�mo.����5:�h.��E<�ձ7�օj�!�'�3��x�9�܃�
���Gr�x�u������8�{r}��Ft#�7�G���닩�t<���u�!%ߑ�����i���,�e�AT���.¥=�_ +�X��2�q�
etӴ"ݓ��� +��H��9�{�I���5��+�H�7�����*Po�|�s���� ��-�=�z�� �+N�욾��!�yۙ7���G���~��2o(1��Ņ�-���ۅ�U]Ϸ_��t� +qOƲ���J�~�/(Ⱦ�UzC��~R����_����9����<�Pv�ۧ��[,��D�y}vjz��,�]�z�_�cN�M*@o��*��s�Ԅ�������%����3v�%W�U�-�V>PvN�ɿ�X�Xμ��B�k���G������r������ +����M�y��9� +䝛��W�� +꿖�9-g�PA��wo���7T���g��["W�*��k3r�-������� +�ˇ6��ͩߟ��B=�$����1��(#��Ѵn�Ҝ�t��O�����*��i=.�71o���'�up�L{�y4]��'�|�β�h�z�Ğ��G�
�.�Y=��:�$�&Ka�����Ln��٭�0�Yp�L��9 ���p���B,�+���k�Up���W]�(��y�"�D�����?-q��e����t@�x<��({��aހ��t��^�er����ӳn�2zށ���{+[3�А� +(x��@��-��S��z����5���0�6��{xg�F�������?PP��9"Q��]�.�����L������p���e��۵��g +��ƣ�.�3����u��g�[,�<��ӧ�� �-V0��8]55���刭4��O�镅Hj+�
h x��]�,�ݥg�0�OX�l\6˔Az��K&Ɉ�8(��l�f\"s8(�Ƭ�s3 .��3p@c^�����w���?
Pp�|��.��<��M8�|D�E�����8�8+�'\"'��=���>}`��E2�4�t�ۧn{����M9}dB�}|���? +Px��q�K�~�
h.]�[�'_�Z`�8��n$2�yzZ`�\u\$�О� +�#�������Q˙AC�?3�� +�"{�QiL-��s�@7�����V&����7�;��W�Ǟq̓;�Np@w�gܚkM'.�1��孢��k\\$���=��K�lT\"�6qP�u���F�Wc�}KnL�{ +$A��Q���#��+�X � +>x4�� ��"2��h;N��A�* +%
�a)Pa�� HA�) ������;g�Y�����{w�?�;�ݻ��;�{��o4H�z%"�A����D�o)E$��8P"HH�� ��$�����9L�o�8�T9�8��I���"�/��!�S���9R{�K[#�� �#�xV�V�X�)����A�����ȏ�|�� ��NUl��@pPo�&v��PfKo|&�� �]�`���M~��.48q +8'%&���� ���{��Pn�����E$"���4�)��m�77�8&�L��wno��e�p��xo%?L,p�n\�㨷�����1��Ln���+5����q�t�A�7X]6���%x�Prɋ
�`�(��9g���w�re';�Zv��Q.Y��t^T�$�m7 +��O!_�k#��5��ݯ4��c����H���$J�I���z� �j�{.���i +�LoW_�0H�>4��`z8��YtЪ2:ʑn���/q�����Hw7�&yU��]T��]5)��l�y=�5HN�\��o��'`��9r��sGn&�=/���l+�洄nYMj�Jc!�Y�C{쒀,��J�(`b_��_�4߀�vMdd���`��U�,{7�aZ��~�ҏ��1�r~En�$7Ħ7ʯ��<൦��!��x�\o�ou~l�Q�Tl�abo�қ|L�a(�L(p��ݳ2�EFӑ-���z�]\��ш�`b�;�$�B^4�y��V}�[������"�l�{�e���+Oã1��*���-{#$@��@�S�zj�.�l� 6�a�䬮��TΔ�a�}�ܫ)�r��Q i�"��e��Ϳ�?Ckĭ�4z\���*ʡ���ۻgo`pSE�o>gz�>����iJ��bӄz���J����| +�sN���/ߗ��s�)K�.�|"��T�=K��z3H�=��7�t��}wj��jC,"[���_�)ZzD�%�E��_/b������L!8Ӂ����)R&�x�-�w��ޏ/���0�rރ��n�
ʜ�T���$��2�f�R���U�WY.{��j� +������G����md�a��Ҳ��rJVʂ>���l�̘�
n�/Jj����{�S�����ư��5��B��҇��d[�$�g�$�;|gp\���-��AW��-<�>���nT=�"���8�
�y�d�t��|C�}�aL��À����k�A��܄3Q�1.r�?���)x��ұ����[V +h�3 �d����t"�=�T�͖���'�[�wFe��K!�)R��6V +49��������{Yx}�-���m�?�����z��Λ���PQ��;���F�vw���(9�7��u��UK6S����7�M^u��J.*��c�G��ׄ�
.$�S���F�\ˌ_k<��l.=��u�������������u^��Q�p`�N-�R-�°���S�Y�9r ��-�&�a�J��`U5{mx�Zg�F��:�
|qk� +�=gG(�%z+� +�%�QSE�@�E�X�ݒ��?���lVC]�AEإ� +*hE�`�/������ymiiݖ��������7�ܙs?s�W����O��.���X}[2t6���Bm�E����`�6�NBn��n �l��@)��'?X>Y�e
^�#S�?�YB��\�ܑ�n��s�k�l_m��^F�PB-���/+?��f��a�P���!E2�
.�du���p}�R�-Ԩg +�
����Y�1T�.k'��Q��l�o܅φ��oK�ll}�aW%����r���ɳ��&�$���Rx��ؾb��1��1ԁ'lO\�)d9��ҭ)�������>�Mp��]���7�Z���G':u��(��q) +u��$dlM� +'�w��k���S�-|��
O;y�]� +1��ԍ��]7�T5ھ�G�Oݸ�$kT�F���`�O�V|P�čM��]�t���Mc�Y
}�����v,�n \���fcj�{.)�ٚU�ŠrLV$��B@�u*B���7F6y����2��|��rr��;+�\[ιr�pt��r�Cx!��r]��(�P� +�g=��c(�1��
f���B8P +�������G]d�����i9++�m�'A�<���j�n�7�9T�M0�Lٙf�S;��qP��2��� j��@��2�O�ي��P'8��}c��PQ��������猪��s���Qb�or������I`�� +2��bd3o�$�y��Uݸ�뜺�U��MA���W�3]�s�W�L#:$`d3�`�R�J>�UdQ��n��3%�ilr�O���8Ӫ�o+�9�����ETO�iSW��h�r���F���d�w3:�{�ϣ���l�W�����
��.�6��l�Y��{e�x!8t�_��xW�>�mΈ����Ȁ�5{�J=WF�sL��hPv�$}_��RMפ����} +˴{Bz��r�5x��.�U�I�&��$������{C��[��#�Eq��x(կ�a9E�P\�%���w�E�OwS8��q�'^�ӘD��٢�#AJ�S��T�Y�+�v�0��Z�G��M0٪���]�lQ����m>P�vy$+��^D�& �H��}�Bp���8o��/��w��o�$��_��u���.7��Zհ�� ����7��D����-z VwԼ�u�Y���a0�N����@Y�e��囍�'�cmt-�Ɨ�Yk�C�#0�1��*SuS�,٩p܅�[C�_���q�b��hj���F Y.���&�L0W7���O.(Uf�?�U�ʍ��l�E0�%ݹ�@��"��qy*�`�@��v�y�Iy�%Yqp +�~&en��c�*wn��jI�cw�5k���Η@,'k;�}�Y.����Z�.�\�\�)+;=�����V�~�M�+�\�`��I��)�^�*�-O0 !
AB��\��u߃7�%˵
�.��}w���[�<�Ċ�s�d�r��#G�o?"Z-�6��K1 +����$d/��:�0����\}]����7>��� +���vT�UC�:�ˉ�Ae����>�Ś��<���Ov����x�_�'M�8�jd�c�3t�S���˷��}�Å��17{ĨA�L--��3"�\&�������Aڒ��C�(D�9=ڭz��&�b�]�� 0 +H���yTSw�oɞ����c
[���5la�QIBH�ADED���2�mtFOE�.�c��}���0��8��8G�Ng�����9�w���߽��� + +�V��)g�B�0�i�W��8#�8wթ��8_�٥ʨQ����Q�j@�&�A)/��g�>'K�� +�x������- +�ꇆ��n���Q�t�}MA�0�al������S�x ��k�&�^���>�0|>_�'��,�G!"F$H:R��!z��F�Qd?r9�\A&�G���rQ��h������E��]�a�4z�Bg�����E#H �*B=��0H�I��p�p�0MxJ$�D1��D, V���ĭ����KĻ�Y�dE�"E��I2���E�B�G��t�4MzN�����r!YK� ���?%_&�#���(��0J:EAi��Q�(�()ӔWT6U@���P+���!�~��m���D�e�Դ�!��h�Ӧh/��']B/����ҏӿ�?a0n�hF!��X���8����܌k�c&5S�����6�l��Ia�2c�K�M�A�!�E�#��ƒ�d�V��(�k��e���l
����}�}�C�q�9 +N'��)�].�u�J�r� +��w�G� xR^���[�oƜch�g�`>b���$���*~� �:����E���b��~���,m,�-��ݖ,�Y��¬�*�6X�[ݱF�=�3�뭷Y��~dó ���t���i�z�f�6�~`{�v���.�Ng����#{�}�}��������j������c1X6���fm���;'_9 �r�:�8�q�:��˜�O:ϸ8������u��Jq���nv=���M����m����R 4 � +n�3ܣ�k�Gݯz=��[=��=�<�=G</z�^�^j��^�� ޡ�Z�Q�B�0FX'�+������t���<�u�-���{���_�_�ߘ�-G�,�}���/���Hh8�m�W�2p[����AiA��N�#8$X�?�A�KHI�{!7�<q��W�y(!46�-���a�a���a�W�� ��@�@�`l���YĎ��H,�$����(�(Y�h�7��ъ���b<b*b��<�����~�L&Y&9��%�u�M�s�s��NpJP%�M�IJlN<�DHJIڐtCj'�KwKg�C��%�N��d��|�ꙪO=��%�mL���u�v�x:H��oL��!Ȩ��C&13#s$�/Y����������=�Osbs�rn��sO�1��v�=ˏ��ϟ\�h٢���#��¼����oZ<]T�Ut}�`IÒsK��V-���Y,+>TB(�/�S�,]6*�-���W:#��7�*���e��^YDY�}U�j��AyT�`�#�D=���"�b{ų���+�ʯ:�!kJ4G�m��t�}uC�%���K7YV��fF���Y�.�=b��?S��ƕƩ�Ⱥ����y���
چ���k�5%4��m�7�lqlio�Z�lG+�Z�z���mzy��]�����?u�u�w|�"űN���wW&���e֥ﺱ*|����j��5k��yݭ���ǯg��^y�kEk�����l�D_p߶������7Dm����o꿻1m��l�{��Mś�
n�L�l�<9��O +�����z���p���g���_���X���Q���K���F���Aǿ�=ȼ�:ɹ�8ʷ�6˶�5̵�5͵�6ζ�7ϸ�9к�<Ѿ�?���D���I���N���U���\���d���l���v��ۀ�܊�ݖ�ޢ�)߯�6��D���S���c���s����
����2��F���[���p������(��@���X���r������4���P���m��������8���W���w����)���K���m�� +%!PS-Adobe-3.0
%%Creator: Adobe Illustrator(R) 17.0
%%AI8_CreatorVersion: 19.2.1
%%For: (Zachary Mitton) ()
%%Title: (metamask_icon)
%%CreationDate: 6/15/16 2:23 PM
%%Canvassize: 16383
%%BoundingBox: 98 -140 188 -44
%%HiResBoundingBox: 98.7919746568114 -140 188 -44
%%DocumentProcessColors: Cyan Magenta Yellow Black
%AI5_FileFormat 13.0
%AI12_BuildNumber: 147
%AI3_ColorUsage: Color
%AI7_ImageSettings: 0
%%RGBProcessColor: 0 0 0 ([Registration])
%AI3_Cropmarks: 79 -156 207 -28
%AI3_TemplateBox: 180.5 -120.5 180.5 -120.5
%AI3_TileBox: -163 -488 449 304
%AI3_DocumentPreview: None
%AI5_ArtSize: 14400 14400
%AI5_RulerUnits: 6
%AI9_ColorModel: 1
%AI5_ArtFlags: 0 0 0 1 0 0 1 0 0
%AI5_TargetResolution: 800
%AI5_NumLayers: 1
%AI17_Begin_Content_if_version_gt:17 1
%AI9_OpenToView: -39.6666666666679 23.666666666667 3 1419 866 18 0 0 -5 38 0 0 0 1 1 0 1 1 0 1
%AI17_Alternate_Content
%AI9_OpenToView: -39.6666666666679 23.666666666667 3 1419 866 18 0 0 -5 38 0 0 0 1 1 0 1 1 0 1
%AI17_End_Versioned_Content
%AI5_OpenViewLayers: 7
%%PageOrigin:-220 -420
%AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142
%AI9_Flatten: 1
%AI12_CMSettings: 00.MS
%%EndComments
endstream
endobj
24 0 obj
<</Length 22700>>stream
+%%BoundingBox: 98 -140 188 -44
%%HiResBoundingBox: 98.7919746568114 -140 188 -44
%AI7_Thumbnail: 120 128 8
%%BeginData: 22554 Hex Bytes
%0000330000660000990000CC0033000033330033660033990033CC0033FF
%0066000066330066660066990066CC0066FF009900009933009966009999
%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66
%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333
%3333663333993333CC3333FF3366003366333366663366993366CC3366FF
%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99
%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033
%6600666600996600CC6600FF6633006633336633666633996633CC6633FF
%6666006666336666666666996666CC6666FF669900669933669966669999
%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33
%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF
%9933009933339933669933999933CC9933FF996600996633996666996699
%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33
%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF
%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399
%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933
%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF
%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC
%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699
%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33
%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100
%000011111111220000002200000022222222440000004400000044444444
%550000005500000055555555770000007700000077777777880000008800
%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB
%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF
%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF
%524C45FD24FFA776FD75FFA04A4AA1FD73FFA04A754A75A8FD71FF7C4475
%4A6F4A6FA8FD6FFFA04A754B754B754A75FD6EFF764A6F4A754A6F4A754A
%76FD6CFF764A754B754A754B754A754AA1FD69FFA8754A6F4A754A6F4A75
%4A6F4A6F4AA1FD44FFA7C9A075A8FD1EFFA8754A754B754B754B754B754B
%754B754ACAFD3FFFCFC9C299C1997476FD1EFFA76F4A754A6F4A754A6F4A
%754A6F4A754A4B4AFD3BFFA7C99FC198BB98C198754AA8FD1DFFA8754A75
%4A754B754A754B754A754B754A754B6F76FD37FFC9C99FC198C199C199C1
%99754A75FD1DFFA74B4A754A6F4A754A6F4A754A6F4A754A6F4A754A4A76
%FD31FFA8C9A0C1999998C1999F99C199C1746F4A4A76FD1CFFA1754A754B
%754B754B754B754B754B754B754B754B754B6F7CFD2CFFCAC9C89FC198C1
%99C199C199C199C1C1C175754B754ACAFD1BFF7D4A4A6F4A754A6F4A754A
%6F4A754A6F4A754A6F4A754A6F4A6FA8FD27FFCAC9A1C2989998C199C199
%C199C199C199C199C16E4B4A754A75A8FD1AFF7C6F4A754B754A754B754A
%754B754A754B754A754B754A754B754A75FD24FFC9C99FC199C199C199C1
%99C199C199C199C199C1C1994A754B754A6F76FD1AFF764A4A6F4A754A6F
%4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A76A8FD1DFFA7C9A0C1
%99BB989998C1999F99C1999F99C1999F99C199C199994A4B4A754A6F4AA8
%FD19FF756F4B754B754B754B754B754B754B754B754B754B754B754B754B
%754B754A76FD1AFFCAC299C198C199C199C199C199C199C199C199C199C1
%99C199C199994B754B754B754A7CFD19FF764A4A754A6F4A754A6F4A754A
%6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A99FD04C199C1C1C199C1
%C1C199C1C1C199C1C1C199C1C1C199C198C199C199C199C199C199C199C1
%99C199C199C199C199C199754A754A6F4A754A4A7DFD18FF7C6E4B754A75
%4B754A754B754A754B754A754B754A754B754A754B754A754B754A754BFD
%05C1BBC1C1C1BBC1C1C1BBC1C1C1BBC1C1C1BBC1C1C199C199C199C199C1
%99C199C199C199C199C199C199C199C199754B754A754B754A754BFD19FF
%754A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A
%754A6F4A4B74C199C199C199C199C199C199C199C199C199C199C199C199
%9F99C1999F99C1999F99C1999F99C1999F99C1999F99C1994B4A754A6F4A
%754A6F4A76FD18FFA14A754B754B754B754B754B754B754B754B754B754B
%754B754B754B754B754B754B754B7599C2FD16C199C199C199C199C199C1
%99C199C199C199C199C199C175754B754B754B754B754B75A1FD18FF4A4B
%4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A75
%4A6F4A754A6F99C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C199C1
%99C199C199C199C199C199C199C199C199C199C16E4B4A6F4A754A6F4A75
%4A6F4AFD18FFA16F4B754A754B754A754B754A754B754A754B754A754B75
%4A754B754A754B754A754B754A754B75FD16C199C199C199C199C199C199
%C199C199C199C1999F6F754A754B754A754B754A754A7CFD18FF764A754A
%6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A
%754A6F4A754A9999C199C199C199C199C199C199C199C199C199C199C199
%9F99C1999F99C1999F99C1999F99C199994A6F4A6F4A754A6F4A754A6F4A
%4A7DFD17FFCA4A754B754B754B754B754B754B754B754B754B754B754B75
%4B754B754B754B754B754B754B754B7575FD17C199C199C199C199C199C1
%99C199C1C1994B754B754B754B754B754B754B754BFD18FF764A4A754A6F
%4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A75
%4A6F4A754A4B74C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C199C1
%99C199C199C199C199C199C199754A6F4A754A6F4A754A6F4A754A6F4A7C
%FD18FF754B754A754B754A754B754A754B754A754B754A754B754A754B75
%4A754B754A754B754A754B754A754B7599FD13C1BBC199C199C199C199C1
%99C199C199754A754B754A754B754A754B754A754B75A8FD17FFA04A754A
%6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A
%754A6F4A754A6F4A754A7599C199C199C199C199C199C199C199C199C199
%C199C1999F99C1999F99C199C174754A6F4A754A6F4A754A6F4A754A6F4A
%6F75FD18FF4A754B754B754B754B754B754B754B754B754B754B754B754B
%754B754B754B754B754B754B754B754B754B754A9FFD14C199C199C199C1
%99C199C175754B754B754B754B754B754B754B754B754AA7FD17FF7D4A4A
%754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A
%6F4A754A6F4A754A6F4A754A4B4AC1C1C199C1BBC199C1BBC199C1BBC199
%C1BBC199C199C199C199C199C16F4B4A754A6F4A754A6F4A754A6F4A754A
%6F4A75A8FD17FF764A754A754B754A754B754A754B754A754B754A754B75
%4A754B754A754B754A754B754A754B754A754B754A754B7575FD13C199C1
%99C199C1BBC16F754B754A754B754A754B754A754B754A754B6F75FD17FF
%A84A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A
%754A6F4A754A6F4A754A6F4A754A6F4A754A4B74C199C199C199C199C199
%C199C199C199C199C199C199C199994A4B4A754A6F4A754A6F4A754A6F4A
%754A6F4A754AA1FD17FF76754B754B754B754B754B754B754B754B754B75
%4B754B754B754B754B754B754B754B754B754B754B754B754B754B754B75
%9FFD11C199C199C199994B754B754B754B754B754B754B754B754B754B75
%4B75A8FD16FFA86F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A75
%4A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A99C1C1
%99C1BBC199C1BBC199C1BBC199C1BBC199C199994A754A6F4A754A6F4A75
%4A6F4A754A6F4A754A6F4A6F75FD17FFA74A754A754B754A754B754A754B
%754A754B754A754B754A754B754A754B754A754B754A754B754A754B754A
%754B754A754B754AFD13C199754B754A754B754A754B754A754B754A754B
%754A754B754ACAFD16FFCA4A6F4A6F4A754A6F4A754A6F4A754A6F4A754A
%6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A
%754A4B4AC1BBC199C199C199C199C199C199C199C1996F4A754A6F4A754A
%6F4A754A6F4A754A6F4A754A6F4A754A75FD17FF7D6F4B754B754B754B75
%4B754B754B754B754B754B754B754B754B754B754B754B754B754B754B75
%4B754B754B754B754B754B754B7599FD10C19F4A754B754B754B754B754B
%754B754B754B754B754B754B6F7CFD17FF764A754A6F4A754A6F4A754A6F
%4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A75
%4A6F4A754A6F4A754A7599C1BBC199C1BBC199C1BBC199C1BBC199C1C199
%4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754AA8FD17FF75754A
%754B754A754B754A754B754A754B754A754B754A754B754A754B754A754B
%754A754B754A754B754A754B754A754B754A7599C199FD12C1994A754B75
%4A754B754A754B754A754B754A754B754A75FD17FFA8754A6F4A754A6F4A
%754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A
%6F4A754A6F4A754A6F4A754A7599C1999999C199C199C199C199C199C199
%C199C199C199994A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A7CFD
%17FF75754B754B754B754B754B754B754B754B754B754B754B754B754B75
%4B754B754B754B754B754B754B754B754B754B754B7599C199C199FD13C1
%99994B754B754B754B754B754B754B754B754B754B754A7CFD15FFA8754A
%6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A
%754A6F4A754A6F4A754A6F4A754A6F4A7599C199C199C199C1BBC199C1BB
%C199C1BBC199C1BBC199C199C199994A6F4A754A6F4A754A6F4A754A6F4A
%754A6F4A754A76A8FD13FFA84A754B754A754B754A754B754A754B754A75
%4B754A754B754A754B754A754B754A754B754A754B754A754B754A754B75
%99C199C199C199C199FD0FC1BBC199C199994B754A754B754A754B754A75
%4B754A754B754A754AFD14FFA14A4A754A6F4A754A6F4A754A6F4A754A6F
%4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A75
%75C199C1999F99C199C199C199C199C199C199C199C199C199C199C199C1
%99754A6F4A754A6F4A754A6F4A754A6F4A754A4B4AA8FD14FF7C4A754B75
%4B754B754B754B754B754B754B754B754B754B754B754B754B754B754B75
%4B754B754B754B754B754B7599C199C199C199C199C199FD11C199C199C1
%C1754A754B754B754B754B754B754B754B7576FD12FFA8A151754A6F4A75
%4A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F
%4A754A6F4A754A6F4A754A4B74C199C199C199C199C199C199C1BBC199C1
%BBC199C1BBC199C1BBC199C199C199C199754A754A6F4A754A6F4A754A6F
%4A754A757DFD11FFA14A4A4A754B754A754B754A754B754A754B754A754B
%754A754B754A754B754A754B754A754B754A754B754A754B754A7575C199
%C199C199C199C199C199C1BBFD0FC199C199C199C199754A754B754A754B
%754A754B754A754A4A75CFFD10FFA8754A4A754A6F4A754A6F4A754A6F4A
%754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A
%4B6EC1999F99C1999F99C1999F99C199C199C199C199C199C199C199C199
%C199C199C1999F99C199754A754A6F4A754A6F4A754A6F4A754A4A4ACAFD
%11FFA8754A754B754B754B754B754B754B754B754B754B754B754B754B75
%4B754B754B754B754B754B754B754B7575C199C199C199C199C199C199C1
%99C199FD11C199C199C199C199754B754B754B754B754B754B754B754ACA
%FD13FFA87C4A4B4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A
%6F4A754A6F4A754A6F4A754A6F4A756EC199C199C199C199C199C199C199
%C199C199C1BBC199C1BBC199C1BBC199C1BBC199C199C199C199C199754A
%6F4A754A6F4A754A6F4A754AA7FD17FF75754A754B754A754B754A754B75
%4A754B754A754B754A754B754A754B754A754B754A754B756FC199C199C1
%99C199C199C199C199C199C199FD11C199C199C199C199C199754B754A75
%4B754A754B754A76FD13FFA8CA7DA176754A6F4A754A6F4A754A6F4A754A
%6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A4B6EC199C1999F99
%C1999F99C1999F99C1999F99C199C199C199C199C199C199C199C199C199
%9F99C1999F99C199C198754A6F4A754A6F4A754A4B4AFD12FFA87C4A4A4A
%754B754B754B754B754B754B754B754B754B754B754B754B754B754B754B
%754B754B754B7575C199C199C199C199C199C199C199C199C199C199FD11
%C199C199C199C199C199C199754B754B754B754B754A75FD14FFA8754A4A
%754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A
%6F4A754A4B4A9F99C199C199C199C199C199C199C199C199C199C199C199
%C1BBC199C1BBC199C1BBC199C1BBC199C199C199C199C199C1994B4A754A
%6F4A754A6F4AFD16FFA8A14B754B754A754B754A754B754A754B754A754B
%754A754B754A754B754A754B754A7575C199C199C199C199C199C199C199
%C199C199C199C199C199FD11C199C199C199C199C199C199754A754B754A
%754B6FA7FD18FF516F4A6F4A754A6F4A754A6F4A754A6F4A754A6F4A754A
%6F4A754A6F4A754A4B4AC1999F99C1999F99C1999F99C1999F99C1999F99
%C1999F99C199C199C199C199C199C199C199C199C1999F99C1999F99C199
%9F99C1754B4A754A6F4A6F4AA8FD17FFA1754B754B754B754B754B754B75
%4B754B754B754B754B754B754B754B754B754BC1C1C199C199C199C199C1
%99C199C199C199C199C199C199C199FD11C199C199C199C199C199C199C1
%75754B754B754AA7FD15FFA8A14B4A4A754A6F4A754A6F4A754A6F4A754A
%6F4A754A6F4A754A6F4A754A6F4A756E9999C199C199C199C199C199C199
%C199C199C199C199C199C199C199C199C1BBC199C1BBC199C1BBC199C199
%C199C199C199C199C199C199C174754A6F4AA1FD17FF4B6F4B754A754B75
%4A754B754A754B754A754B754A754B754A754B754A754B754AC1C1C199C1
%99C199C199C199C199C199C199C199C199C199C199C199FD11C199C199C1
%99C199C199C199C199C175754A76FD18FFCA4B4B4A6F4A754A6F4A754A6F
%4A754A6F4A754A6F4A754A6F4A754A6F4A6F4A9999C1999F99C1999F99C1
%999F99C1999F99C1999F99C1999F99C1999F99C199C199C199C199C199C1
%99C199C199C1999F99C1999F99C1999F99C199C16E4BA8FD1AFF756F4B75
%4B754B754B754B754B754B754B754B754B754B754B754B756F9F99C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199FD0FC1
%99C199C199C199C199C199C199C199C1A1FD1CFF4B4B4A754A6F4A754A6F
%4A754A6F4A754A6F4A754A6F4A754A4B4A9F99C199C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C1BBC199C1BBC1
%99C1BBC199C199C199C199C199C199C199C199C198CAFD1CFFCF4A754A75
%4B754A754B754A754B754A754B754A754B754A754B9999C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199FD0FC199C1
%99C199C199C199C199C199C199C1CAFD1DFFA84A6F4A754A6F4A754A6F4A
%754A754A754A754A754A6F4A99999F99C1999F99C1999F99C1999F99C199
%9F99C1999F99C1999F99C1999F99C1999F99C199C199C199C199C199C199
%C199C199C1999F99C1999F99C1999F99C199FD1FFFC299C1C1C19FFD0FC1
%99C1C1C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199FD11C199C199C199C199C199C199C199C2FD1EFFCABBC1
%99C1C1C199C1C1C199C1C1C199C1C1C199C1C1C199C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C1BBC199C1BBC199C1BBC199C199C199C199C199C199C199C1A0FD1EFF
%FD18C199C199C199C199C199C199C199C199C199C199C199C199C199C199
%C199C199C199C199C199FD0FC199C199C199C199C199C199C198C9FD1DFF
%C9C199C199C199C199C199C199C199C199C199C199C199C199C199C1999F
%99C1999F99C1999F99C1999F99C1999F99C1999F99C1999F99C1999F99C1
%999F99C199C199C199C199C199C199C199C199C1999F99C1999F99C19999
%A1FD1DFFC9BBFD19C199C199C199C199C199C199C199C199C199C199C199
%C199C199C199C199C199C199C199FD0FC199C199C199C199C199C199C198
%C9FD1DFFC1C199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C1BBC199C1BBC199C1BBC199C1BBC199C199C199C199C1
%99C199BBA7FD1CFFC9FD1BC199C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199FD0FC199C199C199C199C1
%99C199CFFD1CFFC298C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C1999F99C1999F99C1999F99C1999F99C1999F99C1999F
%99C1999F99C1999F99C1999F99C199C199C199C199C199C199C1999F99C1
%999F99C1999F98C1A8FD1CFFFD1EC199C199C199C199C199C199C199C199
%C199C199C199C199C199C199C199C199C199C199FD0FC199C199C199C199
%C199C199FD1CFFC9C199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199
%C1BBC199C1BBC199C199C199C199C199C199C199C199C199C199C199C199
%C199C1999999C1999999C1999999C1BBC199C1BBC199C1BBC199C1999999
%C19999989999999899A8FD1BFFC2FD1EC1BBC199C199C199C199C199C199
%C1999999C1999999C1999999C199BB99C1999999C1999999FD0DC1999999
%C1999999C1999998C9FD1AFFC998C199C199C199C199C199C199C199C199
%C199C199C199C199C199C199C199C199C199999899999998999999989999
%99989999999899999998BB999998999999989999C199C199C199C199C199
%C199C199C199999899279998999999A0FD1AFFC2FD23C199C199C199C199
%C199C199C199C199C199C199C1999F515299C199C199C199C199FD0DC199
%9999C1992E4BC199C199C2A8FD18FFCAC199C1BBC199C1BBC199C1BBC199
%C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C199C199C19999989999
%99989999999899999998C175510528057598999999989999C199C1BBC199
%C1BBC199C1BBC199C19999989927286FBB99C198C9FD18FFC9BBFD25C199
%C199C199C1999999C1999999C1BB994B2E0628272E279999C1999999C199
%FD0DC1BBC199BB992E282E99C199C1A0FD18FF9FC199C199C199C199C199
%C199C199C199C199C199C199C199C199C199C199C199C199C199C1999F99
%C1999998999999989999BB98752706052827280528279998FD0499C199C1
%99C199C199C199C199C199C1989998990528054B98C198A0A9FD16FFCAFD
%29C199C199C199C199C1999F7552282E272E272E272E272875C199C199C1
%99FD0FC199C1752E062E51C1BBC199FD17FFC998C1BBC199C1BBC199C1BB
%C199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199
%C199C199C199C199992706052805280528272805280528989999C199C199
%C199C1BBC199C1BBC199C1BBC199999951057699C199C1999FA8FD16FFFD
%2AC199C199C199C199C199A07576272E2728052E2728272E277599C199C1
%99C199FD0DC199C1759FFD04C199C199CAFD15FFA7C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C1999F99C199C1BBC1C1C1999F7575272827280528057598C1
%999F99C199C199C199C199C199C199C199C198BBC1C199C1999F98BBA7FD
%15FFC2FD2EC199C199C199FD0BC17576512E27C19FC199C199FD0FC199FD
%05C199C199CFFD14FFCA98C1BBC199C1BBC199C1BBC199C1BBC199C1BBC1
%99C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1999F99C1
%999F99C1BBC199C1BBC199FD05C1999F99C199C199C199C199C1BBC199C1
%BBC199C1BBC1999999C199C1BBC198C1CAFD14FFC2FD31C199C199FD11C1
%99C199C199C199FD0DC199C199FD05C199FD14FFA8C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C1999F99C199C199C199C199C199C199C199C199C1
%99C199C1999F99C199C199C199C199C199C199C199C1999999C199C199C1
%CAFD13FFCFFD32C199C199FD15C199C199C199FD0FC1BBC1C1C199FD14FF
%A0C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1
%BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C199C199C1BBC1
%99C1BBC199C1BBC199C1BBC199C1BBC199C199C199C1BBC199C1BBC199C1
%BBC199C1999999C199C1CAFD13FFC1BBFD33C199C199FD15C199C199C199
%FD0DC199C1C1C1C2FD13FFC998C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C1999F99C199C199C199C199C199C199C199C198C2FD13FFFD52C199C1
%99FD0DC199C1A1FD12FFA7C1BBC199C1BBC199C1BBC199C1BBC199C1BBC1
%99C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1
%BBC199C1BBC199C199C199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC1
%99C199C199C199C199C1BBC199C1BBC199C1BBC198C9FD12FFC2BBFD35C1
%99C199C199C199FD17C199C199FD0DC1C9FD12FF99C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C199C199999899999998C1999999C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%98C2FD11FFC9FD31C199C199BB99C199BB99C199C199C199C199FD15C199
%C199FD0BC1BAC9FD10FFC2BBC199C1BBC199C1BBC199C1BBC199C1BBC199
%C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C1BBC199C199C1FD0499
%98999999989999C199C199C199C199C199C199C199C1BBC199C1BBC199C1
%BBC199C1BBC199C1999F99C1BBC199C1BBC199C1BBC198C9FD0EFFCFBBFD
%2BC199C1999999C1999999C1999999C199C199C199C199C199C199C199C1
%99FD11C199C199FD0BC1BAC9FD0DFFA0C199C199C199C199C199C199C199
%C199C199C199C199C199C199C199C199C199C199C199C199C19999989999
%99989999999899999998FD0499C1999F99C1999F99C1999F99C1999F99C1
%99C199C199C199C199C199C199C199C1999F99C199C199C199C199C199C1
%98C9FD0CFFC299C19FC199C19FC199C19FC199C199C199C199C199C199C1
%99C199C199C199C199C199C199C1999999C199C199C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C19FFD0FC199FD
%0CC1CFFD0BFFA79999C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C199C199C199C19999989999999899999998999999
%989999C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%BBC199C1BBC199C1BBC199C199C199C1BBC199C1BBC199C199CFFD0BFF99
%C199C199C199C199C199C199C199C199C199C199C199C199C199C199C199
%C199C199C199C199C1999999C1999999C1999999C1999999C199C199C199
%C199C199C199C199C199C199C199C199C199C199C199C19FC1BBFD09C199
%FD0CC1CFFD0AFFC2989F99C1999F99C1999F99C1999F99C1999F99C1999F
%99C1999F99C1999F99C1999F99C199C1FD0499989999999899999998FD04
%99C1999F99C1999F99C1999F99C1999F99C1999F99C1999F99C1999F99C1
%999F99C199C199C199C199C199C199C199C199C199C199C199CFFD09FFCA
%C199C199C199C199C199C199C199C199C199C199C199C199C199C199C199
%C199C199C199C199C199C199C199C199C199C199C199C199C199C199C199
%C199C199C199C199C199C199C199C199C199C199C199C199C199C199C199
%FD07C199FD0CC1FD0AFF99C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199999899999998999999
%989999C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C199C199C199C1C1C199C1BBC199C1BBC199FD04C1
%FD09FFC999C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C199C199C1999999C1999999C1999999C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C1C1C199FD07C19975754B27A8FD07FFA8C1999F99
%C1999F99C1999F99C1999F99C1999F99C1999F99C1999F99C1999F99C199
%9F99C1999F99C199999899999998FD0499C1999F99C1999F99C1999F99C1
%999F99C1999F99C1999F99C1999F99C1999F99C1999F99C1999F99C1999F
%99C199C199C199C14A27F827F805F8F8F852A8FD06FF9FC199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C1BBC175270027F82727272027F82752FD05FFCA98C199C199C199C199
%C199C199C199C199C199C199C199C199C199C199C199C199C199C199C199
%C1999998999999989999C199C199C199C199C199C199C199C199C199C199
%C199C199C199C199C199C199C199C198BB98C198C199C199C199C2A0A0A0
%C9A127F827F827F827F827F827F8F87DFD05FFC299C199C199C199C199C1
%99C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C1999999C199C199C199C199C199C199C199C199C199C199C199C1
%99C199C199C199C199C299C199C2A0C3A0C9A1CAA7CAA7CAA8CAA8CAA8A8
%2727F8272727F8272727F8274BFD06FFA0BB999F99C1999F99C1999F99C1
%999F99C1999F99C1999F99C1999F99C1999F99C1999F99C1999F99C19999
%98FD0499C1999F99C1999F99C1999F98C1999998C198BB98C1999F99C199
%A09FA1A1A7A1A8A1A8A1A8A8A8A7A8A7A8A1A8A7A8A1A8A7A8A127F827F8
%27F827F827F827F8A8FD06FFCF99C199C199C199C199C199C199C199C199
%C199C199C199C199C199C199C199C199C199C199C199C199C199C199C199
%C199C199C199C199C199C199C29FC199C2A0C9A0C9A0C9A7CAA7CAA7CAA8
%CAA8CAA8CAA8CAA8CAA7CAA8CAA7CAA8CAA7CAA8CAA8CA27272027272720
%272727F852FD08FFC299C199C199C199C199C199C199C199C199C199C199
%C199C199C199C199C199C199C199C199C199C199C1989998BB99C199C199
%C2A0A0A0C3A0A7A1A8A7A8A1FD07A8A7A8A7A8A1A8A7A8A1A8A7A8A1A8A7
%A8A1A8A7A8A1A8A7A8A1A8A7A8A127F827F827F827F827F827A8FD08FFA1
%C199C199C199C199C199C199C199C199C199C199C199C199C199C199C199
%C199C199C199C199C199C198C2A1C9A0C9A1CAA7CAA7CAA8CAA8CAA8CAA7
%CAA8CAA7CAA8CAA7CAA8CAA7CAA8CAA7CAA8CAA7CAA8CAA7CAA8CAA7CAA8
%CAA7CAA8CAA7CAA8A8FD0427F8272727F82752FD09FFCF98C1999F99C199
%9F99C1999F99C1999F99C1999F99C1999F99C1999F99C1999F99C1999998
%BB98C1A0C9CAFFAFFFA8A8A1A8A7A8A1A8A7A8A1A8A7A8A1A8A7A8A1A8A7
%A8A1A8A7A8A1A8A7A8A1A8A7A8A1A8A7A8A1A8A7A8A1A8A7A8A1A8A7A8A1
%CAA127F827F827F827F827F8A8FD0AFFC299C199C199C199C199C199C199
%C199C199C199C199C199C199C199C199C199C199C199C2C9CFFD0AFFA8A8
%A7A8A7CAA7CAA8CAA7CAA8CAA7CAA8CAA7CAA8CAA7CAA8CAA7CAA8CAA7CA
%A8CAA7CAA8CAA7CAA8CAA7CAA8CAA7CAA8A8FD0427F827F827F87DFD0BFF
%A8C199C199C199C199C199C199C199C199C199C199C199C199C199C199C1
%989999C9A7CFFD10FFA8A87DA7A1A8A7A8A7CAA7A8A1A8A7A8A1A8A7A8A1
%A8A7A8A1A8A7A8A1A8A7A8A1A8A7A8A1A8A7A8A1A8A7A8A1CAA127F82727
%5252767CA1A8FD0CFF9FC199C199C199C199C199C199C199C199C199C199
%C199C199C199C199C2C9CFFD16FFA8A8A1A8A7A8A7CAA8CAA7CAA8CAA7CA
%A8CAA7CAA8CAA7CAA8CAA7CAA8CAA7CAA8CAA7CAA8CAA7CAA8CAA7A8527D
%7DA8A7CAA7A8A8FD0DFFC998C1999F99C1999F99C1999F99C1999F99C199
%9F98BB989999C9A7FD1CFFCFA7A87DA17DA8A1A8A1A8A7A8A1A8A7A8A1A8
%A7A8A1A8A7A8A1A8A7A8A1A8A7A8A1A8A7A8A1A8A1A77DA8A1A77DA7A1A1
%A7FD0EFFCAC199C199C199C199C199C199C199C199C199C199C2A0C9CAFD
%23FFA8CAA1A8A1A8A7A8A7CAA8CAA7CAA8CAA7CAA8CAA7CAA8CAA7CAA8CA
%A7CAA8CAA7CAA7A8A1A8A1A8A1A8A1A8A8FD10FFA0C199C199C199C199C1
%99C199C199BB98C199C9CAFD29FFA8A77DA7A1A77DA8A1A8A1A8A7A8A7CA
%A7A8A1A8A7A8A1A8A7A8A1CAA7A87DA8A1A77DA8A1A77DA7A1FD11FFCA98
%C199C199C199C199C199C198C2A0C9CAFD2FFFA8A8A1A7A1A8A1A8A1A8A7
%A8A7CAA8CAA7CAA8CAA7CAA8CAA7A8A1A8A1A8A1A8A1A8A1A8A1FD12FFCA
%C198C1999F99C1999998C2A0CAA8FD33FFA8FFA8A87DA77DA77DA77DA77D
%A8A1A8A1A8A7A8A1A8A1A77DA7A1A77DA7A1A77DA7A1FD14FFA0C199C199
%C199C1A0FD3DFFA8A8A1A8A1A8A1A8A1A8A1A8A7A8A7A8A1A8A1A8A1A8A1
%A8A1A8A1A8A1FD15FFCA98BB99C2A0CFFD41FFCFA7A8A1A17DA8A1A77DA8
%A1A77DA8A1A77DA8A1A77DA77DA17DCAFD16FFC9A7FD49FFA8A8A1A8A1A7
%A1A8A1A8A1A8A7A8A1FD04A8FFA8FD66FFA8CAA8A8A8FFA8FFA8FFFFFFA8
%FD12FFFF
%%EndData
endstream
endobj
25 0 obj
<</Length 65536>>stream
+%AI12_CompressedDatax���$��&���?d&�
C�;\;�f���J-���n[[Y����UZ�(�������xd&�,�f� #+3���q98�������O��x�O�q<?������wo��� �~���7_�{ˏ~��/&G4��M~V���ۯ����LG{4����?��o�q����wo^����_����^ޡ��ݻ篞��g�/PW��n���C}�� �4�`e���߱���=������&������7���������Ô�?L�/ޣ��v�u��&3%C�����o^|�����O߾yq����7/��W��?��>�����y~���^�|������0�����;�����qv�~c��7�/���o^���a|���t�/_�/t���qz��W���w�0R<�3�ٯO�a�C)?�����l��/J�o�|���ۿ�i�[Lݘ�ج��{��K̬̂��1���?�?J[�������x?��~��������W�~��Ng�����u��G���|��˻�����F�ѤS�7_ܽD����/��H1�������������o�ɦ�� ���>���Kz3�� 3��y��}v��gӭ���w�2I�M�~����?��Wy�O�t���Һ���2�!Lj���}.�6���(�^��{��_G��<�����Ѽ�b�� ���|ao��Sl�߿�DŽ��kѽ����_���bٚ���O����1�';=��I~R4!o�����;�H]c����ձ����W?�y�=�5�w���7_j�������|�����ӷ������R��}��T���o����?�~���_�^� +�!}H������o�_w�g�߾�������Ͽz����z���_�~˧ߩ�O���n���_|=w�.�̙�����/�|����ܿ8��~��_x�����N���u�T�OX[�˷��Zߥfi�>$_��>k���sP���3��|q�-y��=���?�F������?!]��϶j~���x���x��7/�~�t���S��/�>�������\�?߿�c����ww�I|��+r�������;鳶�|�0�e���>��l������o�q��\�������3�L��/���p�b��a,�H�=;���0�?�)vU\)�� ���߀�%�%�Ӧ\�� �\���܌��x[�f`��*nU��-���LDI�o^�iS��i.繜�5J��z�7�ѵ�]������[�*�F�A��iU��U��*'-������V�m�ӯVuY[�a^^�Zd]���f��U͛��V+��e��b��e���7�����g�]k;l�a]�/W�k�dY�Ԭ�U)۵�Z�)��*և:Y�e�Xt��Me��@CY#�չ�k)7�ܲԓŗY���U�e�L�Iɭ̍����z��ʵ�ؔF�2� ��s�sλ���ɝP��-V�x�>��'�O����[L�
.�C +S� +�p7�v��v)e�s��U<�s������SH1�4�S:��t�}b��>�s�S�ʧ|�o�-��&7� �L�N�y��n�i̕��W�*^�����r������d��N�O�N����t��e�mw��p� +D�5C���pq���n�X�.� �K��ucq���7�g\DW���)��;��2�Un�C��|�Ey��
��x;Rٙ�-�خ��v8Pz����? g��x�'�H��˗�v0ܮH��� �*`Cl���d�!��2r.y9��&*w�"�6`�ټ���.b������/�+>P�<s��r
�4��` +�f��j=��i�v�?����?yZ���q�E�^�\�Z��J���YYa ���(����rrga�oе)L��N��,b�tU;Z��Nd6�˻3�C^/�.҆YN�a�v�I�B�ԩ��gMs���Н5�ڣS�C����1Z�Sߜ��|O3�[�"�䍈��أ%l$�"-
����FF��/�����ӗr6��Y8�*�ߩ)�)���š��s�]q]�;��I��x��L����n�fI�\���Jg�e�Xr������%>�,"eX�a��lX~PdS�}bٛ��2<���d����uX�E3Ϩr��;.E9����J�\d��('}(bs=�U-�l��4W�����=�9�"}ZӬ���YA�������L�6�%�Ts끼VJ����{O�X �2�=�y�e[�3UC�wD翇�d���?���S�ԇ�os<���;�������XԵ���?ʏ��O�BF��7�mLE�߰��s��8҆�+ �H$�"� �(�"�t��Ay��\��( �!�DʢJ�BFǭH��|��! �,DiȪ4$��u��N"e��(�r��E�"�R,R���Qш���Q� �,e$JI OeSB%'�Јj�Fĥk�K�(2Qh�ؔ|����J5��t[듖|97�nI�����?F������յX�4�̲P,~�)u�u�x��I��x�" ?4���
Q��s���
E6< KC�v��D�1<�L\$��9.Ң���j��U˭T�k]��/R����)[�[hJܔ4lTy�Q�� +p*�����2�:�Z��������a}S7zϢ��-n�M^_
/�Y�;l�I����r54 +�rzb�>l4��맕a�ýE|r.V��O��oGEq3��--U�� +ͪ�L�T��TJэEUZ*mX�M]�JY��\9���U��Di�%�%���2�r5�������=Ҵ����ъ
��%�s��(�It8�i�4fCT +a�);��12<L7�@2�0���{���y�D�H���?\~�s��t�-*X��*;�K>�y?�Ӌ+[� �@��c���&�*��PV��5m��\�8���6
V+-��7b�U[�#w)�Z��f{%0��<@j������Xp1�fr�b�=�]����9I�t=�G9 [>�E�����Xy�+3�������K�o�J��O+ï�~Q��Q0:1�L�<�98�Il�j>-�Ѿ��8��Jl+���u!���3)]Hh%��\h�B#ڸ����L��o�{[Z�&qk��"fÊ�mIWC�v8���x�}���i؎u����'^��{����߇q�m��C����IJ���Ϟ=�����c@�0�9B��k۱���i�c�c��wt�6sM�&;�XݸC����I1��T�� ++��t���ǵ�l�⟿Z��+R>���q�V��#���6�C�xji�7~��zQfd����@,�����zv4����.����/�_�b���S;;�c4`&�#
46%�0y��SI�R�����
�m{=��j�P���]�����|���|��s�|<:@>�l��m�������/z���r.��_��S �� +_rUX���Ba3|�!<4�S<�0��< Sy+�De&���W�@�AAr��-^����u�U��jKTˈX�ō�uX������ᒗ���e?��#u����F�nf��VŜ���z�Q2�7�sP����f��'z���3m�����dq<9+��r>�3_<U�k]' +@��rO���"���i ��
嚀y�0s�fE� ���:�g��x�,>;���ug{�Y�ʪHNEa십��]�����ԕd1����U���
w]<��[�
)�8��c�(�����b�b<;��]=)�,��I�ȥId�,v�+�PO���D �QuV�o���ʬ��*rk�$V_ba���_���U�����[�X.}�7I�ʲC#�rOL��,����lE����kY�,��
E����n%ʦ"ƞD��1V]� ֯$XJ���:�vl`{6V��Y�=�+2�ҡ�Y<�W�bc����~Z�-Cq��Ŋ}�س�o�g��u8��r�s��m;n��X�u�}!�Ց?�j6U615r#����I��n +�����w�z·�2�����_�}q��|t0��>\��v���,��н�e| +����(Cq7o]ͷ`['s�ث��j�[�d�˧�1rQ��Nت�����8
�E��Tԑ<��}�>�S������|e��f�k �Hʾ����_ +�M��^A*V��� +o�DT��7
�F�\'�uY��6@��,��[���eh>�O*�r.V��+÷h�#��exZ����:�i0�$��3QN� +ߑ6�V<ϒ���^X��EH��92k�V'j�X\+Kd��P�8S����GY��р3ɡe�N�qV1��e'��������%:����U�9J���1џ��P�:��v��lu�{��L[�5*�F��6Ԯ/�+B��ƪ-;��eф�a�ǓJ��ږ�߶<��'�Oo�_��K��M ]"�\�EkF0�ED��ϤE Ȕ���θϔog����|VUu�^�v)H�!�
{'�x��T:��U���jCIT��Ғ��آ(Z�J(Z�4�K�Y�薮l��Z�Ja���\"6�Bi(��D�9���P�{�i�{��:�:�6�KO�y�íO��0i�5*�a��l�X�!X�%R�K努Q>E���(c4���,�Z�ۙ;��^�o�;r%�( � �/>��1��]�3HJ��W�.=��Cq� �Q;
�J��liJ��B��%���۵�C^ײҫjL[ExD�Z䤵 ��n�I˴�~Ի�z��Mj�,v8�'��2<��9>�Oo�_�êD�� �Oس�&������F� +� +0j�h���MMo�p-�~v*����fP�j��0<м�4�A͗����ƪ]���\ /0�)�zdp���[�_b��ݫ���j�ZL]��km�r��kX��6�ָ՚�.X��Ƭuɨ�1i=d�.���LYO�^I��S��)exZ����2<���N�O�' +�������O�' +��x������m7��?�a>Y����kp�i�>��d��8��$�\�09�f��B�'�zgFx�q���O/e⎭�cT1�;ɸC0�tm�ojj{��(qp�͂C�@���z
���Ni��m���)�x�?��Nv������U��!�q�nܺ/�/���r�vE�i]���ŧ�Mi|��T3��ٷ�O'��ؤ��\��L+�u6�u&٦|t�,�J��tѲ���K�]���j�=?��Q��`%�֜k���,pHy�Ta��k�5u1'�@I�QA��l���P�8��MJ&�7nJi�Q��<�Y��O�d����F0��D��G3yv�hC��x/���e��w9�ˣ/�h�-�UP�h��n��u�&r�S�w��O���f�c[��x��^$����؝lx��qq}���c�����sn<���c&�z��}����������Q�P�M5V�����'5��K��9�fK����rC$ۊ���������-h4�5��^�73� +^.E/�y�j�R��Kߗ��i{�v��?����|�'ȍʾG���K�6���
�ʅ���F|�,x5�奔�v���1���a�b,��T������rT��hv��/�̞��ʽh�j�2~���s�&pr|O���s�O��!y����"�p�Q�-�����*X\�ZY���[z���4��]%��zC�@醒����(M�Di�s�g��'����-tuh"Bm�@�L^u}DmA�n$��$y���`���0&�g���nճC7x'�᥎�(6�Kf��t'�8�=n��W�l��AS��uO���x8S�V��*���;�T��d���>���ٖ�I�İ�X�#�!� +����Ma�\Q��ݙ������>�Y+|�Z��[1�z[gz[����1�Ԙ۴���mJ�Ur�5���Y|�Vn�o�d����w��`�x��NR�K���������i��s���l�\7��P||���T��GY�ug�nK��E��$%V`��t +�6�>+j::�T��\P�h��e�l��銻P�n�C��%�o����S��5�� +�YS�h� +������fW�X1V�������� �*��:�I�2���S�O�BI�4�4�!�eV�k��?�x����ܓ�'cO��L�j�4-���o�K�����Y���uU��h�%
�J���L�fd��-y����t�u�����<��+q��e��Ymˇ_��CU���V��N`7��� +�6��<žr[D����\,-�9n�^$D���8�a�w���2\�0�[�����ԡz*-���-�Z�L�T����F�h7@�K�`�nQ@밆����#�^�M�n���RD_�y��rwQ�v���p���ѹ��ჲ�p�b?�M��c��C��a7�M��t����;H���sM���8�)��4y%q��i��$�!�wb��-� +K���g�Ѣ_�� \߹���D!��˔�]
��b�j�Q"#ΐ��Sm�2�a����+|�;rud�ȼ]��A>���Q�?u��l�R0�Ԝn����`uEss����9
+Q37�f���Q�;NL��t��hp)
n)�n��6W�Z����nE*���:]�y�u};� ��ӕd�q�Y�J��Z����,�=���*�S��Z�� +�`E�;p8O� +�n��2�
;aN(���FXg��`��ᡭ�Xb�mZ�b��w�k7����ax�-��(Å�S[���/|���um*][�W�m�!n;2�.��_�=�1�1i���8��c���T]#�w���-����ՇI�~��ݔ�÷Q��~����^/�CQ�J�Rz�$��-Hi���[Ȥ"k���?hR���{�W5�q�n ���U��V�i+��~� +� +�wh�p�C=�C�����~��ӷ���ݿ��OVr��b��X������ݽ}
����?���9D���a��St��~�;X�4�3��a{��G�Ol� +DžI3�^�+�0pl)=�4/��$��M���'0Y�:D�H�k�uˉ�f$��H��˟��^�f���<�$����j�'��ɲ�'pe��8l���,X�Z�d�.�T>�S�� +��}��[��Ϲ0quf�ۿ���df�7_��������/��ʃ���s���7_��ٛ?��o��jõL������{����آ���!TfE�b��ѝ�(��x�L(2�f㴸˸$��n +���,L"�C"��z��J��Є��� \��7T����[���ʤ�d�+���
�6�vB�oe�W]�!DW1�oHwm%H2k������dRq'C��Վ�XZ��[��i;F�x#�B]y��oe�����N�l�3_�c�D9��D/��*m%��� +dބS�y]�-��
�u��H�J�bc�x�[ ��w?*����rYrB�ʟ:3̑��n�sS.������e���U��dSi�k3G�>fT�9i\�h?��q��s��iC;��+x��#���@E��:��P�����l��XJ�Kun|���ƛ��y��$�����8C��(A�]�Z0O�ׄmx{\��F0TO�E�ȓHfw����aaJ@C�r�`%@|�R%�R�U�#>L�o�;yp�"MfP"0�=��Xp������n� |��9����APr�-�� +�2�3A�(L�O�ř\��'�"�D�ӂ���3��� +|=g��� +g�Z���h+������6,Q�����Y��ޚ�Y�ռ����9�>s���ǹ
%ґ�?l� ��m��m]�㽃)�L������p轑Ch�M� +�� �S�I�8\���Յ<%4��4.�i+�഻�2�>=�ρ��o?�R�ݵ�4����1��������?U58?!Yި�&�2<OYuf�\1?d1����J�Y�^U���wR�1�4Q��@R��'q��A� �S"�ݏV(�d@�DU�w��e�%E�A�[�ԕ +Y
�BƸ4�*��h��UN��v�v4��N ��[�i�^:�N"hw��@SQ�AK'!�S�;�- '?d����ۅld� +��eLQ�-2ux5n� w��S(�1����&y Kٵ�'��؎�������Ԁ�$Fa��q�R�'O�>q�ň�LeL�f�9m#�p\����K�dv�e���~�e��� �K¶����#}0�U�O���e���$��|��xA��* +L�T�U��$</k> ֎�&���&�4yr�(��$bx�(�5�M�0����Ɉ�p�r���w�ݗ#�-F6<_�� +�4֣VԻ������s9)߲zNWQF���m�;�-:�ϱ�?�3�R�O�N��Y�Ϲ4w�J�?�Y���1�F�7lֵ�,� ��F��8��J\�o���Y�}�68j @)���7�TەT�E��ਟ��� +��ic�� c&���N�-pd<ttd�pW�# +����*�NX
�F^��ӎ���^�p����r���f�WY�˕��< +� +`��^��7��1���q9���M���(ID�RΖ72���� z�\-o�7�9� F�4����B��!X�9f6�:3m,o�(a�)H�S
o�S-p���C�}78r!�f.�. ��k"'W
o�g.m�m ������B�#Y%���O�ň�X�H�����pd��1
L +/��
-��"�UMg�h=�l1{�u�������`3�M��d�h���<�1i*�"h_wm�w��`{{*��}'��㜥4+q����-������PO�UMcdm)G�t8��41M�b /�7�1ru�/���T�TØ�\Bb +c�}[�2>���d�?���ѭLc�̍�w���0S�kY�~x;(&68�`d]@��i� U}�q��@3ŭ���Oʨ4|n�ނ,���xʀ���1M����O#�i�ڸ�&H-�nqdq]�$���������v�����0��qTɣR;�{��#OR?W�jJ���'$q� +4��"�Fj�0Z̝��e�H�Ӑ�K����aDc�Jj{�
��e�Y��[�E��l]�����l�B��� +����yi��/�3�Do��:Mp��q�yNj�z��7��*�<7���%'D�fW�ҹr�""���u���:�N�#=����չ��`o6�H���{yvw�#�l��}�����}�2���9��t�4���8½�e�b�)t����sg(]��vFy9Q� +w�x�7c�"��"����Ş/�N7��vCyl�.���D�=y�#ȼ��oJ��W+��3@�x�sv��ޝ�b��t��։t�ym�f�{��<<A��t��K��>���nХb�%u�V7K����$��3�)ގ��I^���c_S��ro�T��#��x�C�A���a�#�4[So+8ո�����{|*&D +�l +�1 fE�h�5���X1�F��HX��P��I�X
�X|���5�^ɓ���Ir=���t]�F3�}��7���Q�0Y���u�oe��%D�>��9t��Ɇ�/�G��e#�*�B�Bu� ��������V�����ѫ���!�-�W�'��0�r���Ǻ~,�����!�^�i������Tv�tI�t�u:+�!��H�{���D�>GY�ƕ�n\��/� ��iǩ�'+z&;�v��������ʈ!�5p�O�����|� ߩw{��$�$��{�b�����[�BP�����O���;�y,�Ͼ�Y��[FK�fa�5�;-����g��L�P�>��]yl����?���w"CuQ�*v�����>���ͫ��БGq��E{'{:� +�豛��ɗWi+v��w���f7��V����'�˒�Q��v�]�j.����gT쒑hL~��^��eY݄6���:oCت(����^@Ú�d�7���^_��y�� +��D�LsL�^�:���~�"��r����|���ws5�mn%n!#\���� +�얍�y���0�9ġ�xJ�xI&0!����S�l�
<ཽ�Az#��(k$2J�S���` �L%��NO;�/�< &��*���0��y�f0� +��XO�V:GK��oe�'��o/^��wD�F������F�W�f��n� +�8ݱ ɉ�)Z\ɹx�f#~������2�`gW�uSq!�nH����"��7��4w`>��`��ő<`�z�*P��o��1�գgu�ΐ!?��穋�H��#�o1)g����5�k7�8�'*���%��Pb��NH�����j�2��pW�������FpJ��O�^6��G��A�0SX�b��;�V��F�� +/ƺ�7��E�N����)�(ꦑ6�~,VE �V��SӢR�fn�~������:}t�0�%�GQ����D��j[1"F���Q��Q�b3Q����]���?��h�+&�@z��LYB��� +,%���M�w��'I�������a�$�Q=���u���Y���sT�B� -ݓU���g&��TQ��L�QL��g�y�iP���6�Ǝ�}]7iR^!FKBᦢ5��J��d��2Ɲ�:�����q��u�#U +� +Gbg�y�����@h
<):o�^�i��&�망�n(�������� +��"de�A53cK^����3C��"�xf�B+�D������uŅ*�M�fH�V�@��cX�=dԥ����
b��kug(]��ꓚVI�`4f !m��� :Ez�8ӿR�@��L�M7��P[�y=��A +� ����D
�T�CVc}j�x�ɠ�j�)�B�Н+e <�*�%2.Aܖnb;_���G韬����蓺V�ɕ��V��v,����]ߠ��wj�ڵm?��c���Dtp�4���Gb@ +(����<j"�y/R;θ��:Q4�rS���%f6�tw"zSv�[��NC*���F��J"�"�9����XvZ4�O�ZYե洣ԏ����8^�/\�NM�e����������4��cݲ� +X
d�p> �.hۈ~��$��t�$k��UeG�ʀ<���K^�ԷxQ$d �B�(�^��먭Ş���Bע}�*M6��94�O� +X���Λ� +u�,�_w��<�Y���l +r�顰�^SÂS����i1�hȤ�3��[�I��E�8}R�3f&� V�N���H��eA�a�*iq9�8�Nq���6�8��.�p�̺�h�3�h����I����i�0�Tfġ�E�"���Z�g��y�/�롵� !�
�:�x�>��-/���ߢ��Z� {�[�;��=��qUZ�*����Qu��/��[�e�t��l��mѾQ�Z7��n�v���`܆���E�U�����v�� +�����d7�GW�c4zv�M$�A=�Ne6�o�|�5%���8��@%&73�7`pT=ҙO�6�+6�p�ү7�h�����h
6M\ɳl�'�k�����_o1��S�]������L�t&:=t�J$+[�TN�5�G�t9�C����PM�-���d<.3%�ԃ�q���փqL;-"m����նo��Xlo#z�9�xK��c���Z�$���i��@5�ύخ�촨fL*J�����9JHm.g��/��SCނ�1Z;ʌE�U�s.G�T��`��rt*e��&9��i��c�]�����c蘄]:�7J�Y�-'�Z��hjC�=��*�[�6$f�|D�(s�WB.�ͪܕaZӣ̑6ţ��U��n�&2 �j��Ȣ�;z�r�;�����;��/\C����B�N���(�Pt�BS������n`ߖ/5�q;��Z4��t�����D=e7"� 2���
�A����tS�
履�Ւ-��<��`+�p��6��H4�]�a�^�]��ț����b�ӊ. +8�<��� +�y�-�3��0m]}R���O��3����;u������N�#�4�f��S�����>�X)�pÉꮅm3�8����mP��
d\�K6��oѼЋa�Nt�43�Ҍ�G�S!xzF�ж�^pݴ��t3���zT9�����BET��"�C�� ":�]���È�@�:���~$����@":��$������:��J����z���^�������.8D��ׁCt +6���~�)���/v:R�)h��M�'��o � +���|\o��a\=y�)t�3!��-m߈7p����@�y7��E�:�BҔ���������={�R?���G�|�?�V�a$T1Oب*�Ed\5!�s�oD� �4��@����.�3b��$n��J{Us�8^}]U���~9�)������-�ר>M�!�:4�iR�#��e6���ݏ�i�Xe�i��ig��#����[%.hb7Ϡ=[/���ab�rQkG�0���^3��Y�'�{���:� Ė:
�vir�wb���+��V��Ucն��$���4�M?��ʼӽP�짠<���-1$��[&���m�I1_�Vb�F�VcF2����i��@Tk����ʸLŰA���[��#��4�S�~^Ʀ�5u<4�O���>N���JE�(پ���v +�s.M��CoEL��I���ə�nܶ��x��`;�(�V�����LG+qv�^B��dI�kQ�d�X佗�a��k4��Y�|��X��;�;�i���Ӎ4h|^3�\ĺ�&qe�ߩiQ��fn�~������:���\��l(ne�GQ�j���~��Zߊ�U��!<�j�����i� _0�Ϥ.آ_�����+T�B�sG�߭�5�r��Mq�ym�v��x��-&�o7���_��k�^�m�Oj߿率�n,�-�G�B"�K�V#��9+�(�k�-6��s +�"�'�st�'��2��r16�T�2�!"��}ؽ�����Hؿ�7��E�U��k���醺��c&�C�]�JS��f��z�������)bM�7�6P
;T�ĠزM�V�r�r�"��d�� �+L�L$~I�Xb4�O���w�:մ� zA0�ö�d����kE3�ڭVZ��0�>�n�<����V���Q�
�ܾ{�M7�P[�Q `5uf4��ф���֘+3�ъ6F_B��D�b��K�-�ɢUdV�]|gR�B�9��AmA�k��8Δʁ�h\�Kעy�j�ݶ���<Pm��s�Z�������Nm�eҶs��S��
Ũ��[!���?�7?Ad${�r$ж,�4�����1�?P܃'�D$-�zT�$�x׃�%�)�A*&h�*���c���@�4Fh�h�_�2��ja����41zY��� b^�Q\�jo1c�q� +� +6�@a�ae4έ����,MG�q=,�(z���C��ݺ&��u��3�FB�w���$�l +E��{,���6�A�2�� �xA�� @ɹkA�v�*��«��;-�
��dC�B�Dn��}'�dхt_"��1�c��h���FZ��@*̓�dZި�\�y�ř�L��b +��--�-��8
�"d/]�T��̴��t�>�P���I���(�������v����u�4O�8oub��)��{4W�`C�hr)�8E ��h��`�h����K����}L���Z*h����E4i�[4����g�������c�j#��;�DKe������uk��#��i�[��Ni�9s��R� �,�i@����`-��~k���9��N.mm�] +,0����+����\�10W��sZp�yt{��˵�� j���D����$}�4E}
������o��~}����w�����w���ᗿy�n��o��v�w����_�^߿����~����ֿ���gx�۷o^_��:�7_�m]iF�����ϻ�/�����ٛ��w
��n���}q�����R�����0Y�߾y�|�Yڛ�gW�q�n^Q�пOw_.���������/�G�EQ��� ɺQ�������<�f� +�ɵ��,����;}�WCg���_���;�����1��>1FF�>g�g|p4�������s�������mY������n���^�۬�Ù��߉|@c5e�D!����'�1ծ�뀑��V+Fky�>�٩�*� ~���y��#og�clJ)+��J&�H4��� +f�`E +�ZT:�УR�S��9��@�3�%O���,�#/h���F�1Cv�U@u�yP�k%d +y���
}�@�Z�7�p1�W$��D��I!G�a���TI���@SVPK�������L����XsI��ш����ҏgPl>UB����n��>GRW��9�E&��?Y#�Њ +�����l����J�F�����IV��E� [��V�� +81����d:(
i��Dd�;YA�'�1�-\��ÐP� ��2mE���y�"��V$Q�ғLd�QW��n��9"�(s�8�0�0Y<'��)HQ5Y�ۑ���LK +Bn +T��ى��V�l�����K���+��<�b�T�㤙����SQ�-B3Ŕ5I�p^l�F*b����^�^��+]�n%B�2�o�-k�5|nh���Q��!s陣�KP2�>nK�v���b@LjHE�#� +�&���4�240=#����%s��M�9�I���
$Q,�*WN�X��YI*�J�
GFO%]�POH�(ߢ�T�s�eѲ��W��T<0����ƬF����&v�� +FB&?�i��Ra}�4�J[1Ez.�� +W�
�a�ҏ�e +� +�/A���xC!�A]U��8�V��w�C��!oO�s�ᓗ�C�j%����\B[.|&Hp�xQ�3�t+�d���`�X�)dV�ǩ� +4+GN��I�eΥ3I� bD��I �`��x�����V4�HE�=�s��Jeg�
�%h��>g�8���H\;��nZn��e�3�ٙ�YL���4��tR9%������\��U��ص�ءI��T|���>T�~���>T*Y�IxYq�;�gn�0+��)�[���"|�=8:W��4n�D�L����_B�QI�>�l�C�$;w����$��t�д���;���#/%�~�ԥb��oG_0�;��hAr^�9��\�o' +QW�T �&?�H��8 �5`��R�oF�9����H����l��Ie�v#�Y���B�\j'�A�D�U�Ò��CTG|z��!�VX���V."=�X�>w
��8��F�i$�RJ�[JW|_���p���oe-����v�8�G��O��|��� ���! +IB��Hd(��z��S0w'�<ziGa��\Ɗ,��A�g&�B3�1eE�)�7��\@5�0jVfX\5^���)t=���nKOBՖ�@ +IEm��l��a˴�Rvg�*��t��-#d��D|n���1w�81g��e�/$R�`i���q�E8�+e^���2e����[5����ע��>�)�~����-����~�(i"^��Yш���*�W#C�J����'���~�L��#��?ϸ���KO�Հh�Ju�3�8�IL/��EQYɭ@E'����R]����3����D�" +�!�#.��ZU���z���Zi)V�y�~TD܄�tY�x��w��� &�:��GX~i+;$2��d�9&�Ee'�i�!�� VA�Y)�VQAE�ṑ�H�TjŭQ�����aW��]������2Ĭ
� �H���� +j/��P����݉2����L��8���z�t?�P��siFOI��q�����K&W��'��5!�4��ĥ�j(YQ(� +XվU�P���d���l�V�@D��w<���%ߜ�bF=�E���Q30��YUJ��Y���9A}7� +��jO�*i�j�I[����9p��>;�2U%�D�c��&�ƴ�0'N�ˎc�yB*¥$ ���@��k��[ _K���@���(w˚�fIP},PǼ�(�gn$:��PIc���㘊O���0�gT@t;)�-",$U �1=ȗ��N/m�3���x�6i���^��d�Mf.,�&b�H�dI�ЊQH��<�h���De�(�h;i!X��z<���T��$��J%���n�R֒|�% ��4�J��� _�$'1�'��;q��� +��$uRƙ�v+���q�&En��P�>�ğ5\j�"Gs�`���c��~�\���|�P��$=�Dz8��N�4jsM$���P��<��s�p��E�� +���2�8z��i���5��Q3CL*-���B1e[��c_�aZF��q"��&+_w<��H2�2U� +z$9��FF +ר�^`q���$��sA�"'P�'d�#z3&�i��pr�ē�w��nTh�H�0I$��jNy�[8�º�8^+Qޓ��m@R}�(`|��ֈOE�
|��id]�RBR����+:Q)2P�L@�(o$T�p�0��� +}�� +�%EEWg�8�չ���Ʃ��A��]�x�n�Y�!g��ŐIYW)�¨{�D*$�q� �F'�w�c2xL=h�+��)��W��XQ/��G�f[4%�X�CJ�損��Pa��^04�yB +�3�ٙĊL�$-8�h�R�dw�rzjs�K���l +`N�_�7y�:x5���u���� +YO��l��OEa)��J2���j�B�� +�PHEw21h��H�#u;��(DM��v,�ٓ���-���� ;I���������dgzW�{8C�@_���a�l=0`��� �eC�������<+���ܟkR<0pg3"�L2�b��gC�h4�9�r0GG�u�'��x���,� +Oͪ�q.��H�(Er�m +��%���NX=��f��_'s36O4�h���<n4 +��um�ɞ��K㾾C�+R�قi��EE �KY��)�D�_�XB@j!O7�j��2�Z�?���x}pq���ז��C���ZxA\M�)��4T�/����\ �������k�W�ڂ�uc�Ϲ��+�M�2NQ����.t���W��Vr�c�b�u��Jz�4=�եH2����S������6���2���F�ti��>��
����0ng�=ܞ��q�)� �l����{��F���n^ +4 +�2A��r�+Pj��#������\�͍i���&YS~IY�6�e m�C�ۨ�j�k�� +�'�-L#�����!��<��؍�I�MM��Ϊ��n0�ǟ�`�� cu +n-��K#��!!�?�F�T��
4IS���i�AK���X���Z^�!�Tzt�AwJ�6��:7��~������:*�G�Cb�!1;���8[]>m��S*���|)겍@
�.(��W� <�:��; :�զ�3 +�h8����q������ML(=\���2�)���@�������x�Y�ȫ3{!n ؿ���? +����mD�=��ߞ+#�Q�Z)�N,�czA-�\7t�6�l�N��B{7qes���P�)|��ï�M�C�c�K-8��>��4
3���4Lh�=���^��Q���H��W,7��)ӣ�3���?P8 +!FR��d�%
Hi�&��v
��* r��*Y�6zELS �"XG}��v �`Ϳ�MA�7�R�-�̫{�f4����-�?B�E�f����/�3~bpG��h�v��c�P�S��|���]rߘ�d�
���2��J9�|J6 +�m!�Dr�<�
��K����9 +U!�|j���l��_��p�$�7G:j'�R�d��q��!U~�~־�
Em�;np� �A��*&<��8�'�cQi���T��r�[Lm���G@��^��J�)�.bf�_y�X�z|��+�Ǟa���V�'%Sf'\�<����]1�)f�v�=�%�LV��e%�w�b��$�T*������돐C�ʉ�� +5\���+T�-�=��V�
&������{6���ϲ��s�?X�(露�>�4��}��<�����Z����M7�Jh����]�5y�曲7�1�R�d�dYl=�y��E�p������w_�L!�;!����N?P G�k6��H�~���)H$�(��Ң���a~=�Ћ�����o���rUO_7�t��~o������}���\v��S�)u��I��M +1�"z��{`�3:�i�+�|���R���S�C$2Z��֨��yFZ��y����
��Ru�NYU@\������da{@b4a��$4��}2*��/I���^�2iN{�8�W
SO��e�Wi��2S�����W��PL&%fZ���p-*�ޝY��Ng�]�JQ4���@����D�+�^]�����'�@*�r����2N�7j��t��Hyq�S��Q�m�V˨�ͥ�{*��ݨIιEVR�J�'��+�֎
��ah�RqC +����#��M����r/���5.�i���w~�hta��C�ƌ�K�SAS�ϔ~�DK��V�{���%@H��"�`7��5K��K-Ǎa3����]�� +�N�����oU3髜 (<s���5$�{�ν�}�����I+Ը_\��k�����@C�G߸����� +nS��Vf���NMԴ��G<qҘ�<�35����\�Ҏ�]��5ۖ�t�0ɰB�;/�1�'�YV�4�%A�N�$Er��rR:�u��`���+��R���_��.5l��uG�&��Bv�.̯�i�Ush_�j�ә�!f?��P�zE2<v���j��ɪ,�uj�-H�R�S +`t\���_�(vk�j�3�W�f̍~���1��ŝ�8~���q�����m��@?]'8910xiJX^Z��8�%�q��:���J9;Źk)�w�Bop��{��iR$.�$D��E��l��c��ydЍ�F���/@A�)��W�g:"�y7ztK��(��*�uo��ef�6�b��V +Ku����cbb��]����Q������h04B-z +TKh<���,�ŕ0�ݶd�1�uz�$����K����1�;�:�MQW��w7w����4������s��_�������������?��?���/��?��C��4�~�QC�i^�rA��忬^2�[5A��+����cK�|�f�58}�9j�%����B��0�^�UY�FHG���Q�`�BY�Qpbfӹ"���v���c���/,!��t��ɰnE\L����"I�1��=��͊Rߋ��G���фP"f���:ϵ���m�C�C�V ��]
1��yl�e�EY9��\�f+����*n����/�fr,i^�/�@��%V��*|:�4��f�~�ǵ��F*>�U�|\W�FU:����w��X��#�=� +���ψ��5vW��=��J��Eא��d�;3]助�Q���2z�tN+�_���`}�{�"}���4�*�T*Q��Г���B~�_d�)봳�4Fړ{�f�)
����$y�����ضi��9ؿ`W@�hMZ�,��[P� ���B��0��@��Z,��a$�|�3�<�C�q�rT
J;��v��Kև�`N����ZuJ�8��S��l)�~�6?�� +�8�O^AV�� +
M{�� +1A-w݄�)I��Xe�Ye�`����(�a�E[ +�^Ŵ�r�!ly�@j��94pɠ>�Y4��s��t�(?�~�N�!�$s� +�ku�{a�R9��'t�v�5��e +�K'��S>!1�=@t����������P�Wfl;Mu�8��Z�]��oT��X�ó.�?@i d�30��P^�6��@(A�G�`Se +?���:2�˴elX,&6�I��G�t�&��s�۠�q���Jr6:Z$Q6�D0�N{+��X���PO�M���#��; + +@0��*�'�7v�
��?��b��ᒏZ�� +^�q�J�� ��P�{�l�nD��X��'���a�-��
�oz�.�� +�y䲕�[$,@ ��豨5��d*�� A�9�.i!3�~�:E�����gu����ק��+�T��B,�U�����A��2;è�q�߽(��g�j��E>�RZ�L�����k&��}9E��o�B1�����ws�44�&䩡4"t}n�U��(a�s��!��Sf6Ce���U3<�� ���3�ޖ,�8��a��E��v~@3�ڑ�*��BDzL%g����Ɵ�S mA���9�2@E���h���1�t���zE-h�� �6�=����� |^�q�D*��b�T�`[��B�D����������ˋ�M9 +��]l�뫜�%[��U�>C���8L���8�d� +�G8x^�+g +
X{�3Y�=�aY���L�R��I����N+v\��)3 +M�H�^�����d��_w +����8b��ʋ�ң9��rK֚�F�����HU��[�O]�A�d���x�ހ��?7�L�|'� +��Jytw�F�W��r��-ԼgT9��ǁ��77����M�VDF�O%����a�=�W�V8��s�{9D�Upf���B)�R|N�9E��.�6�݊'5&�����%���5*G�*عJ����p�m�}j��H�� +�::�S.1Y6�C-.ncE�0�ڌ{�����`�}6\�hpY��e� +���o����}u��n��`\���������YZHi�Qסo���stq��R�j�{6�a�Ο�ȡ1K�
�m����F���v�ʫ���R����B�P%D�-Ά9 x��g +���� &�����\ +�OX@(X�8���b�Zgw�@C!'���AQ{�������`w�+�9qV�r�6%}L���� +u I�)#�E��q&GUӒ��JC��x�z��C�>s4fYH�x�{D��dǒ��Ա��p��\lw��Mgn��0�.�P�Q�V�<S�7��2��=r���j륯��p�T�խ��Qd�����:35k3;������w�P�g�Rl�x�_�l�BG�R���:T���<s�O=4� +\��i����7RN��)m���
=�.�6ڡ��X#��rՄ�2�h����j�*z�.�WƷbαsE�#.��N��HVe_2�E��:���몲��D��)Rʦd�U��C��-�Lҋ���!�Z�����k�q��爵�S/����B�g���/nY����v�#A�*B�IgZ�V���� + �����W�P��<�Cp��s�j +.�Z8z���b�g��m����Nn1-���)�8H���w�h4�=]
��� �S�����@ 6(��� +�f�8Gq*��ܵ1���q������,�*��l���|X�V�� +���7\��%`7Ľ?#�O �MMV>ży�H�|+�D3Sry,���������$G���y��Ѐ��@���@ce�J�%�
�=5t�n�+���C'�P�|o�Ua$4{,g0t �_�}8��PH�G
P����b�Λ�S�����$@Ǣ�*�_A�%$I�)��r�m��D�1�ʶFe�^�;�^F +�AQ��e|��(U�Xj�no*I���!CuԐ�E�V�Ad�\d�����[�����V%$M-���<w������iy/uO����,��(��9 +ŗ�w*8e��⡩5�D:O1�+��������z+�U�4x.�G�OmXHa#����g�s�/�m�����1@ei)������Q���ZǠbQ�4:�>V�;�C��<�36��لd�����i�$s�̳8ȅ�(ߧ�5�����y�-�� �d�n���ѽW��"^�m����1�$�d,_���z�DD�9Ƕ>�����4�#����Xh��D��;����u�ܦ$����K��s����9M�G�����jTo������Rn�_�D�s�����?��������?�O���?�ӿ���������O��O���������������?��O����O����������O��������������ͭ0����'���Ϸ`<១6�`�V1g����� ����ܪ�n1�������7���Z���r�7��ŭa�~�|f�{����������1S=���V!o��sT�����^�!�<�!��#�
��+�I#*�6(g��}�|�щ|BȺb+[��)�>�$;�fq�Z�vBIU��s��B0�W0H�QL���s��l�T�� R�g/�?/�z�KԾ��{��#'A� �=����fy_�ݧo�����(?[�.&ʧ�}!���
틐�����09� +a__$���Z_
)��Y=Lٞ�G}���okzJW�Gz��)�o#z�>�����H����Bd��|垦��2oC�?��W-O˷�<�#���I�ʀ�~6���Ĵ��x��m��]<�4��O.��)s�6�Wl�[���K�G'x���o�ξH���}'�W��ݻ���p��+Av�os�.�~�tq�s����6���=|��
��s��~��w�B��~��Xry��w���6g�j�˓�r�mŎ�"�0ۂ}�
xf;��'BO�u>��=hKPE��:�t����{�o/u�1�#�D��.��;��q��2]N �j�e�nd�����Y�G�!,a�q[�m���
L��1}Q�RP����.C̲�|�>-�tya�h��J�G��8�4�02~�~��'�w�o��y| D�Q�� ++t�/ks�G55��x/�F�Q�����6J7�����l�q�((Π4��~8����/�m����o��ct: .?
�/d`�!_>�+����/B��nz�1��uN��i[�s!˰�!A��f��y����[
���_~��V�۶ܱ[�Y9���nQ�2���L^���ї!��#���W�~��G��/ݮ�5(}O��%��0�"(߲����oyX3�Đ��|�C7!���Dn��4\��m��&���ᔿ N���Ja��
�!�X?Y�EŒ�f�]"j��7Fp���;,�=��/��u[{�7.�OG��<��[�|�0�.�S����y��۶�jpaE�nZ��O�nS +�mҝZ<����'��Y� yF~��FID��p�Fż�vp���<}�)?�m�-�)��e�� ��4�f�Z�jOm�I�m�]Sl��Scⴎ��n�e��$����F�V��厍+��m�
4uΧ6~�g +(�=N�Z�K*#��69�ON/sc�u�/sc�d��i��S�^V��遼�>����H�,�aQ{H�l�p������E��J|��0#�Ƕ1R.���^���8|)�Yn��I��ak�4Og�����A�*&�-��y�Y �v����'��v>T�7�{�Aέ.,̂��r�=��*��f
��*Q�x�����d�w'`V�@�� G����ƿ�棞���K��m�{�V.�d9��+`b|:��g��2�=�����%�Ǜ�/��B�m��VC.L{�w��>�zYQ0w��Ų�lg^\�k�o�������>��"�ۇ���Vx�:?�Q�o� +c�؋1�����.q���Z�{���Ɓ6C&�i���m�\��#�f>o�2�/r/ +���1�m���u��0�~[�2���X���t�ч�-����Tb��W��~���ǖ;meq���3d�-y���ɟ?��R.T�Ib%ݦ�gY�+
D�u}��ڻ�����=����5����S$V���k&zʴ=]�=h�t�oGX,�2�_��O��ω����g�*���QY����<y��o�Y{�K@�����g�� �Ԝ"���=���d�_�l +:�Q��F��-,=-�Ǜ�=��0SY�_F�oo���6 +�g��7�l�Qڷ]�\�]bi��_4�Q�Mai ������ ,���}z���&��G����U�����?{�zǓ�3�ȧ��cs�R3|��֯x-�|:�^ji�m�J��B��w��Ҟ��A�b��r�#r�z�j�x�o֭��9��s�<^�Q�sdĴ�=\��U��V���.�M}��S��puL�!�����\}NV=�e����E=��H]o/W�
uI��\m�ׁ��O3רn;i�k*�6s��r �n3רl��hכ�+w"x�:��rU�� ++�8FN*]��+
J>����J���T=oWW�G�����jCU�w.i�����Wb N��eۻ�f��4>�we��8��&]������8MH�,�W?e�9?e5i����Q�쀄˛�+� Tt��U��~1�������{�`_��y�1h>��q��� žË�m^="�㵔7�Wb������/UCl4���,U��39�\��UiT�9\}���w%Ai:��y�ȵ�tܭy{���k4��Fr���կ�*`r0n�W�,�� +��v|�� p���5��!)�ެ_�(�c��թm����8iƑO�W!)�Z��cێ�"�Ηe+�ۈ����ʲI�nå�i��6V$JyW��Q\���aT��Bv|������W�L�2�'(��k#_{�ۆӒ��N��EM�a����U�!�<`������zZ��Èt�z��}:��ӻ{��2N�?�R�C�&u^;���:��#Ӎz ��~{�֙s������>�3f����X@��t:T�Io���۾��B�:��)"��M<�Lu��г�� y���^[y�,��u��g)�V�=\A���X ��KJ=�ض#�>�ڛ
i3�=oR^á�dl�z�2��}4�=�m:������m)�s�Q�t;���.��(^�^��x��~ۈ��9ú9)��ܛk�ԏ�n�P0I�Z�G�n���'6���E�d��6�Nқ��Rn��f��lV|�->Ufa$.kOe\@ -G��/϶�-۾�/��q��a։�/`<:��N��Bd�,�#'xr��v�+R$�Sw��M��f��[�l��{�l�X��� ;�Ŷ��yM����eU3������2l�����-�>�L2 @��1I)���ļT�n'L�#����-@n'LP`敍y8a��c���N�B&�p��GS�j+�L��o�|`��N���8��� �O���4�� �%�ˉ�d�:�����e9r����%I �W�٥W��{��s1��.
wTbP�4��^�x�ذ���e9 +G�7�8o�KB��t��^� +��=U ����Y�D[�����".s^Z�)��&��� �4r����S�0(�50�x�����&�6T0)o�6��J�lL�('F����0�% ﺝ0m�cu\��
���}Z��RU��n�(�Pb�!� ez��ү
����o��ڑN���+Ey�(��4+���2yxb~E���2�I����3�.�ٺ��f��S���s�.�3��SuV��g�gOOLɟ�!c�q������eC���\R�)�p�a�Ĕ����VM���o� +$Ϯ���g��H�(�� ?�ζ�D��:oL�F�@�Η����ñIb+�d�6�4M����
/M�E�+�P2
�R�AV�49�_\2�P���6Χ��ex��T7Cg�����Dɥ��siѦ +���z�>�&j�k�ҷϥY}�^���A +lWK��l3K)᩼yX�AA
a[Wv��ݎ�]��fTɱ���S� +�����6�S���/R¿cT���� �?�0h��p�j�4 �<L��Ǵ���r�L�����&��>M͂/��/�>3���ı, +9�< +v3���������}hw!\y;�y:R���p�i�w�G��-����FQ$>Ai���O;�f���|����8�������@i�y +�6���Qd���DZ�$]����w�']��Z�� + �ݟ��&��x�v~� q�(����/jE���SS���y��Qr�lx��}7.�?."R��7�Z�}��E�s�D}�i��I�҆�����@�`���?������w��7�ට�������93�t{��G�M���mO?q�J��=<�l����J<ۘ*�9$�:f����0��u�Y�N��2���O�+��H�u\^~�Ʀ��� +=����$� ��m�'<� +�} �כ�=��0�}}��?��)f����ҫ��zs���b���SWOOǿ��/�?�/l(�oc�˿9���$����B^}Y��+^_�:��k[��V�ԕ#x����ȶ��G�?{9~��Z����_�I0��u�d����K���r�\
Q�M����%vљ[������2�S�1� +1xe��V?à�4E�6�S9
pM�g���i·VPz����ո}�*Q����~��{5~��]��>����nj㯚E�7Z���y_(�gY�j۪��f+�}T$J,c���ۏo��ޛ
�<fan[�j����H�����#[מ�(m�=�~绷8J�F�2�P\7��(~!s�tЃi��o�QA�j��a.����/�c��M�c��x��uMzx�AJ�=�������q���օ(�-+<(�j��K�����r�Ȑn�;H�Z�.E�RБz�ہ����L�2�i +TR�͎%^����=����M]��oӷ�j���o U��.�7����e��樟ooTŀYl_���p��ܺ�6o&n��@nﶞB�r[���O�6аs�C�Z�i�������c��Wm6~��U���D���F��6[��=BhZ��=�՚^��vT��X�H�-������g٦�ZG�.-��u����3���
�,�Y����=��T�Dh�t�7��|V%��7�3����s��dK��Y�[�|�7+W�n��qq +�-�j�~0��>f{��ː���Y�e��=O�2��U�5��[�ɲu��͒l˹n'���X�d���U�1���a��2C/�T�e��bʝ�0@N�|l+1�4(�=�dj�z����u���i��%,����`�}�v{����߬�E���E�eU'�����]�:����#ܼBb��4WE��(�� k#���"#M��i�u)�v����BC/�.�F/�����O��e��P(�)#�pc�qAW���X��.��@�)%C!&�.,4@�X���@�֗���-��B�Zs`��x�i���/-�c%��g����e����m�L�l�Y���2��-�i��\�K�l�r/��*��y�^�f�(zx]�l�v�bwU�,��Р8�C+�x��cj∐�����J۪ +�u���h&5��ET�!��KT�,�~_O�\.��m5��1�ށ�Ah����c��m�tiH����/�z;;QKc�ۆN���^}@Q�/x�7
�vX˵)̄����GT��&Md��/��6��-���O'�}l0���n+��j�����mT5(�l����>�=�����m�ԗr��A z���8 Qu�5�8I�uP]�h����I��5_&H���k28�t���F��w[ �ro����H�*���1�;���L��o~Gci�n�#S����FdRK{352)_��2��Ůu�ys.�b�۱h��@�2*�%�џh�E �R ��y������T�ߨ��>����i:��@�n�!����͆d�7�!Tr�+ng!� ��/C!��1~��&�o��k�j>]��I��g���z�����8��
�Yѐ�,�H0�b��ϗ��O���?����Yv?Âm��|���4��R�z�=}��ˋ���G���OK����Z�%6=�{d,��_��~��(K �Ӟ�/��ӕ�Cǻʷ�$H�/����?x�4���r��4��i�nx켎��N[r�_�%�,O��|���,��Lt�o
��wNQN 4��,s���/�x�����ѯ�q((���S�6)���)#���o��ޗ�
��Zo����wn�b@���6�WgDy��X��p�=/�7�����e[S��`�ӭ���8��c�!�LjJ +��7MA��'K�( �ۉ�3���_1���
h�_2���) �:�Y����%,i��C�:O��q7D�/G]_N��b�=�@
$k5s��כ����"D"��ߌ�\E��K�� �/&���4�6��v�'��[��xf���c��䑊c��h�����s�i�2��JL��I:5�e9�9��K)��`�9�ˁ�S���vOj3����y�Ӱ1��Cx\�D��B����(� <��ޗ�����`z��b^���<���ʄ +LH� +����V4C�}H~�s��� +T��b���Od��[3�FՊ�+=D�Rי+�u3�Ϝ[)w�����@�3�x�8�JhL��-����hZ���G���(�uA)���� ����x��%�f� ��}ZQK�����ѹa�7
���Cjb.��u���v����4v���[����XVb��:�R��
X�|�� �8E�u�˅W�S͜��7��Mm�:����B(:�7��Rf�Y�Y�W�����G:�gx�sc�¢Y��@��v���M�}�*0^Fo +��#���܄zMъY���V!:{ +y��\N�z�{qQ�7�*=j7�*]�p?}�Ă�>���K�\j��*��h�@��>��7,��-��k� +.E�[�Afx^��n�����FVQ<��C"ּuH�3����뮟��/�V/'�Aպ��k o��P+�E(����x�x@�Y�jcI��qE�j +sٛۗ�^�$clvN#\̍�x�e�e�^KGf�s�V�P��1�Ğ�N����vj���"&X:�8=&��4T��!대��WBD_V +��� N(��3�\C��@���Sy.�J���6�\Z��\{��
�I=D�+��Vc�#7�`�
6g���\�Ո*+�~#���}E&tD�I�K�R�E(���������k��M�帿�ܔ�q�Ɋ9c<��Z���C��������E���4{���\��������K�=�q�C����_2'�=����w�w����f��撾����y�)^��9�\*z�h5��{v�:�U�'`c{EHG�Ӈm�lN\�b۩��@k��8�=��t�석�S�Ԩn����B�om��B%�e�uZ��S
e�-�����1��<�@�a�K`H�%dD��$՝�ev�`]|3�,``��;���w+�(�*s�{����- �e�������p����V�
��*{�D�`���KL634`��έ�}@���0,�ei�c�Y��mmY�.��":����3�w97�<��ˆL�8�r}2��2��x��9jN5-H���Ngv��o��������V��{�# `�%�@Ǽ^V{ 9I�+�A|u˚BG�NX�/�Q��iM}Lz
�sЀ"9�{b��M�`��� +B&��{ዠ��o"�9z�ɒ��}�!�H1��oq1�O�c�F]�
D_��K��}6\$RgC�C�-a*>I���h�86|Ɵc�y��ϲR��6��i�cTPqtaij�I�����#���z���k�VR���s�a=?��C��ʤ%����8�L\{47T��6��^q�j��}�h������ +BZB��6�3��6tB(�qj�_J���ϑG�/�B��'e����~5~�+�ե��������L�%N���g��l���fHtng���[�̙�6h>��8ה)3��a�'ё0��#z��!'�Lu����ѷ��)��';���f[��4�� �uTʪL +&�E���"�1@��Y�s'8˹�B䮴�jk_]�%W_6J����
I��RZ�,u�B&9�V��5Wp9K�[[�[��Z�F�V +3�
z�O�PB�<�k�2]��݁���Ɍ��\ � 3f�"�����y>�pc'O�j��%�`�E6��!h�2&Q�&�u��fv"��b�;����ח]�*����\�H����h���Ei6�� +%�MGZ��`�v�� +��bF�y~��{p:��И7t�C��#���+���,�<h�2�W!
��5�*,�0K�=�1�qQF�$ ��K����>o^��Lj��Ql�"�
�� Z�+�P��G�;6{ +�^C�1�9�+�lIoy +4F����D�b����e ���=;~[�p�p��5�Wa�Bqr�d����
�(�0�]e/~�1vm�^�젅@�'����U�� G�8f� +bP~��l�hґ �Z#;[�͊�pm/,:%��f'4h�5H�͋G,NC:��l�؇�(5ۙ���F�h�� +�Bj� ���hP��3�N +�d�M#/P�\�p7�D�H�q�F+4�|
��g��Jyk�����52��=��c� +�{�n��=�qXF�$���_����q[V�(�Ʀ��@��e}�CUz �=Pi�tSAfɴ���]Mz��T4��=ۻ�v�MM|)i`�����X�XIc9��!r��;I�ٱ����\���Rf�W�� +�"�+�M�M +H�m�'�)�5�mZ�͇9LېM���ǖ"8t8Ϥ ]V+��NW� F�.�-���e�s���"���� +��=�R�V%
5#uAj|@%Rk.��#:��ǣG��5�r����1RR���6����T�>t��6��qL�5�����?P�`[��S�wҔ�����~PͰ��-]%x��LQ.��-�]�UBҘ��q*SE�I�&��� +q +"p ��Sh��[�9�@l45�/�d�1i7���B��j�x(���X�i^��Q7�J�@=PGw+ԃ���S?{�E�'B����������㡕͉s��c�{G-h�E2;9�ʹL�@į���F����;U�;[ �!'F.@Ls%�Rζ�m&3y�o�x�&��T5-V/�p#��l���y�� +m�� +B�n/�\�qgXS��p�ҁ���܄�[������4{��|?�M0"�q��^��F�� 抌�8��������{�����^� +l�d#���p�'�>�ܶ�C-��S� ��"=ܨ5��y�haJ/ҕ�Ebd�>�A5{�t��C.��r�u�dp뛨�����:�Q����.��� +���3�@��� pa����3�a�.@$���{�.�0N
�{W6�Q�:4{�B�8Gy��d��&.�� +-g{B���HkK�i&-Ez�\%@�O9��G�Ӥ�}�5��> +�{�I��PoXC_��`��Ά����\k�+5-���P��Zg�K + ��\���P�V9(���r��t +��%�X*����Gp�(,�%�Ue?�����H[�����z㛓٫�R߇�f�4zQ�B��K�[�'�b9E��``H���T��1��oA��ĵU+���^�#E�k]1��+V���;+ͤ�����r @4��m�;���a")��+2�M�K����0��p�
% +�������#D��5%)�� Qd���T���dg�D֔��A����W(��-�fF���S~U/A��B!�P+�!b{=��t����2I�C�"�3���Myo�cC!���)_�HMÔY�:�v�bQ�e�ኆ��5e`�'��z���*X��R��]��ѫz�9rs�F��٣�%����F��B���,�5��r�i
-|�0�����J֑�}h���������j�R�A��+Q� +��fsii����1v)\��
�'ÿ�^KSD'g�,��p�D%�CP� A���:"DR�o`g{Q�u��Jzj*�9]05���ԃ�
i����.�2���"�|\ +�x�=�1F�_���C�v��<OL�@�E�o����(�|��0��P��_�Նu �T�/D����#�/""j�z����]��%���cZ�� $e�I/�}�h`�����+�o��hēS� +���1�m� +2�Oz�@b����}K� ��G>�c���Rhd-g�T��'��j�m$�+9�/�SH_�W9���T +2�� �/`�0���@x�TJx��g�T�H/Ϡ�L���C4�}V���0 $$���kX0\�,��ZX�W��k���%I!@���L���wE��HP\η>��L����K�٫uv��5��x|����B�0���5�Nޏ[��4`BDIL�9^��0��t +?dd�4���d�|����n:�DtN߱q�-�G��ZN)H�Tk�)� �W�0�4����J�U*�f�Z���Mֱ8�s�Vu5O�5����-���Dzᣌ���(v�P��9�)����T�6�T�x.'��/-/ +z��Wi+�&����#�# m��Q�2�� �� ����S�8=���b����8�m�3@r�^�ŝ�����]�=��䒣��$�:�Q��@^�0��14�~��]ԃD�i�l]�%�'U`0�I��,#�;�uG<Y����b���1rGV������ЦK�`g����ðmI�|���8��@y�i��^釸F�+�[�Y��j��I��4u��CM
���V�9�%SVIF{�5da U@��=�W��=�4��Rr��]�jg�X�`x�Q�)8��
�o�y���[=$Ezy#�|��X�GO��*��b��:y�&.X,V:���ځ&���54H~����T������2<b��)�wП���0v4.�Μ�CJբ����%hj�Gk<8��,�K+T��F���P��۽&���'��YfL�\������|�P�m��ӠJ�R�sUd�5CЋ� �D=�}�Wn���S+��m +���sG2��F�/�N}�{R[�k=0rƕ,'䏽��f�ʆr�+��5�ʬ����yZ�V�=�dP5���M���V��+ �tȧ��:�hY��&���}W��O`�jh�3ﭜϘfD�A��Q/����5�%�G�u�� +�4`ӝ�q^�r"�pO�)w ع�&�3`�f�u�C�Z�t�7�k���>=�r%���w| +>����
� �ԡ�3˭�l7I�|�m +���JT� )� )F�^d��EI�RU��=b�9_��EJ#�C1#���E�z��ө����q�B�(H��s9ԢMΔ(%7�n�z�F�+�qbr��6b�M�λ0�� �!�܊������@�ɍ�T:�/M +r�a5qQ�9�����!J�)�7ԫH���w���Se{�\���g*gI�ᠺ�K��`������f��(��MH�����~��KT��*�
e~�� ���ı���F�Ӕ@ �!��B�g�^�����&� +�ux�5x� EZ� �x�Y�#��4�����!A�,�#��
�|�"�u����5n��#7JA�U}����r)��^�[xb�U=1�3e�� +��O�J���C�D��A
����B�G�8��Z����;0�J(��N5䝖�9b��-�'n;�Jj���#
�^Fw"�ʾ^%S�s���X)H�W=lTS[D�9Pt2 D2�C�a"јiK&Fg`])qLKV���a�!%��u� ��l�){$�9���.`�1��b�� sߥPx!(��=��ٗ#*`��זej��1�����&0Շ�"PA:ɘO�j�g�T��ϱ%�B��S����Eے���װc#�PΌ����S�dlb���|����?eV�&������N��ƣ�C̽S��#(���F7�Y��y�Q�3�b��e�=��{����(���0JmQ9�+���_\��,U�k��Z���pt�w���2�l�#N��N�XPcՄ�7��2���.N�� +���>�@�1U�X��f�a9a(�@>�p ���w^o���D�&b�p�2�ɋ.��q�c&��ˢ����kZ)�IN���V��#�M��u��U7�(XÅ�#����N��тH~�D�{R�r�2֠�g�hj�կd��(q��<!P��] +8�!7�{
4|�>P�1�@�N1:�m6���U�[2=닿�����c�)s!ș�(r�w�� +4�ye����Mr�j5�@������q�h�cP��/�P�j(��!C.SI��*\��d �4o��e.�Pس��W,�݆�ɘ���%���V�=���e�p���n��W���g"��2+�p9j��\����e�D!�i�5�Ӟ�V��P#z J�T��-��5�vE4L�ft{V����,cn�w��E��*��6��l9#��SS�h9��$�V�X��C�\��b)� �۪��`�Y[��/Yu �9���YA�\��n��b�'�j�I �h/�i�/6D�@iJC@%Z��=��Vĉæ���K?�{��CWC�`�
� +�x��ط��h^w�C��e�
[=�
� +ɏW)�Y��MD�R�yD$Ujs��n�$y�.f߱Y��/f�&`x��q-�d����ӫ�������|s��M��`\ �u
�+�P�{�'<T])&����m���g?�ҭ8r� +�L���"�ќ
�mا�Em�=�NF�I +w�(!�Mj�챙��}�ǜ�c-���~�S�X��@ܯ�r�N�9f�;�ЃP�F/����[v�Hlzmj܉`v��<´B��'�Tdz s�{�b/�K�~'�q����w��sT!�]�O���L���~2����#��eȓ ��v"��K��b�^��LO�F(w��FH-T�ԋ<$�F�ĽĴ������\�Pn�)�e�}�SjX����2�|����(�)�F�'�����`�2�B�{ /�&O��*k\6c��ͻ-�R�p�a��+6���K�*l�IQ�\�"���2�B����SV�^�b��i��(��aϳ%� +M\V�)!d���!��B'h��|���ԍ���(B +,�M�Qִ�*R4��!M,���K ����x
!���rH<$@� H��� �L�i��"S4z�c9�)�;��{ړ���]\�0?�]�)�%{��}ZI�a������9w@����j��잤�"��v�*��
X�l�[�B}�!֦^���uG��T7�7h�ޙ�%ǜ�2�n ���QW7��)�7�Ȏ,�����5��mpa\������~EOx�z���OM1g�fFL�]��b$���d��`��ث�N�[�|�[����3LA�5���P��k�cdh����� ��S�D�ʂ��6L]P��Gp����rZu�"9@��^M
� ���A�!�������Wu�u���1�E���PI���7"� H�������<����I����L�4/kU!Dyк�� +�e�_��i�Z���0�{ +�;k�A��j��e��_��)��� �'�E�\3��P��3�q7�B��zJ�o4K[k)hk������3$':o���I�Q��(��!������r\�!:!����L�[���1��^����x\1@ ��� +�M!��"�(c�T�|�˱�����H����{#��K�=����?�C���z~I�%Y��yf����+K�<l��y�C< ���Z��쁎M+oL�j�FSWU~�!+]��.T��r�Z������a������Շ�J���7�9�+�A-Rry�f4�?!R)���S�:�����c'���"fllx�mB����b�!��ب����É�e4("rR��t�.D1r�G}�$?�_���u�Yg��K�H�:sS��I�p�f�B���V���҄�5�[�e!d�^L1`6�^J�̛,n-��>��.�=�X�=e10&Rg���>b��-�-��`|�;��`>�4�0V�IA(K���H�ݣ+1�iڥ��WW�<!�ٚ�g��Nc��ȋh\ţG�~z¢ +��;�lb���Z���[x^<���r�&;�%?Q�iQ�+
&���4�cCd�Q�s�D���e%����F����xB�"z��g,��2.<���<��,��͌*�l%"�xJM�����@0A�����x�UmU���-F��_u�'����zh��=�ٜ��V�+_�IʵKyUu��;Y�����*�����K�� +�Ȃᓜ��Х]6GHA��'���.��3"�Z�����~��7S\�fKABY��\�D��Z.�W��pc��uxv/�?���J&(�~B�d�xBa�Bv,Qo����K��ДS�y�rj a��ޫR��߱����pY)��kI�̤���Y6����}TF���xb�!�*2�ة-�%/#�%0�"�\ +���No��lI��S����^Ǚ�S�bU)��K��6m��s��������$�Lz���3u4�-�;�e`Y%�� ڴA5�M��b��Ykࢇ���������J�
Q�$ܝgHC� - +Fc���s�)eU�������*U��oU��F�+z9��I?t�z�0dl�&���ti�;H#ּ�9J� �X�����#xRQ�sLA�/�����XݭX]�WFm��2r��EG���p�?^�f,�4�sK@���O��'u��2\�дpT/]���[}���7�,����'���?�����?�����_����������|������������n�����~��W���w�����������o~������O~�y����w��G%�_�5�����c���hH��1v�� +υ��2���)�?(��(�7!���
<���'r��ɴr�+,�P�a.�e�.��;�.>�y +��+I�b˩���;B����}Jh;O�/����i~�e�RBd��r������R8cHA��=�X�$����4�Y\L�>�����(�"�D�������7y+.mT��>,Hނ<$#�j<I��t�VDR��B2!H�s��}Za����)0� +i5�K�W��f���Fq�>��u{��"eɷp`�a��%Ɯ����AO�����D�7=X�&�������n��$�O.qb{����D���
�iR�oR�l6��Cկ��@YU��.`Qd6��`�{�e�""�R�>�A�����i�W�����sX���Am2^D��!9jr���Z�@&�QH���x|`�7�%�_���J��x<X4��GI�q���"=[���tID$�p�h��Ì�-�x���C7�eI +hF��u�x(c��Ż,������ы���qy�h +.��G�Q���SC�� +ѫ��!�d��P�����PfD����2Ӎ��WUЈ�w[�H8K�{h���zH��#0���'V%���s_��D���n����Q���|����?��$D ��*#�U��.��.yr�(��m�Ⱥ�ּ��qmv����U�~W��Mfd)~�u�[�%���g��gK +��T��ct9�����\\�"�$������H���"�=�l�RW�|���9iŃS���]���
l�������B�*.=R�|>�U=h\���<������pᤗL��xt!\��>G�F$� H/��$b5���1�h�3��O�v�~?`��C�o�9K7-,K"�����j5w�]�)�r�# +d��] ���n*T_�:J���e)C�I��[��uŅ�e��Z5����KZ�"���@R]�ZV��w��{N +�v�9�����ٛ+�?M��)��d��D�_u�O��瑒���90{�q���8v_��m���#Dd��Ӥf�"��qdT�P���v\��u�d������4�����|*b��/K����=��O�7��69X7+�����!m)��M0���%�)�$Ԭ����~��xuٮP��O���z�� ���~�c�"�8h�;��� ���Y%l&�����f;G��6lI{~�hb���
��iy��Cu��K�ۖ"`���{u
�c��:6�|���*PK!����tʧ�
!����2��O�&t�U����wa��7C����ߣ�n
&Q����U���a�����*3w$W߯X���l����mA +�i�;��=&���Ga�����ށRµ%�܊�%��ރf��Gjǯ�5�} ��Xa�@v��uS �+ᐰ��1PWy��-�_�C}7t�`�TdҘ�n�6#-��#*2�^Z�=ql�ȿ����i��3�������砺L�!�OfA +���͍�M-8Ő��Kƍ�)��I�;J��Α���}��\��.=]տ��E�~+4�P���KU�Wmpq�KA�J���D����'C�u8�6�
�^J�'Vq}b�H0RVX�GJ���y��� +{L-,�;�B������/;@�=W3�^R�MK���y1M�����צ*�
��ۏgG�o�T�/9�l�F�N�R�����E���]�R����W��W +y�u�^�覙�� .�p�0ir�0�d���UzQ���`�(l������Y; ��1x�#p63Y����4�����]0ʤ��n��Id̃+2�3ҟ���)����*�e~j������6�꯳k��)?�s��3�I��k2�ih{�5~�'�Z����;F���#��Ě:����/���ɭ����2Ї�k�A +~)�>�Ct<8��
j��ΰ���(�H*ֶv����͎�v�P��$���G���.d~UW�K��c� +�|?��� +oHDi��Q`)Y_awx���upKT�ff�����>"��>B5�8�Ԝ.�ݗ�F�c��Q>`EjR; ��B� +)����ͬ`MA5�}8=�� ��
[/4�`��C�*�)��_�K)ч +�E��1�_
�:�P�v�:k;W�/�$M�;���~ZF��"�E
�K嶄��5��;�va���CTn�5W��X�A���]
�m�$���h���v����� �95B�@�\"�p�m��{�l��dEA�{��0-%C6��G�w��ĞՕ؏��:\-�Q�!�P����~`�x��6�<�QRa��D��6A�η���gZ��$x��0Ym]��>p� :��X2X�+y5*U��ռb��9Ic���R
��B�&�'�Qtb�Tj{PQi��0� C�H]I�+��Ps�=�� ˫!VY���b����y˓{�\����7�Ce )!9��P���?����ڟ�����&�����ܾ��v4&i���.&'aY5�*,�o���2��c��B��C�,�ޛ_����ғ<Òk���\����хԀّV +5��W����⒢��}�E�;S�r�,1�e�fY^�P��-��cO +�=��S9S�T��=�"��~�K=������ĢH稙��OH0ו���nվ����Sw�w�*)�A��ݡ7߉T A�ۉj��@)x���\mY�7�z�Pm����#��G8W��!֓Q���b���^]��>�L]�r�~�ʕ�P� �M�܄eSU=���C�k����C�{�oT�\J��%U�(��d!��aIn;W/9�(����W�{�K��<�Cn��I��ծl�1"��S�ڥ��1ΰ/+g銒 AvڼdyU�VR�"�e��wݓy5ґh�@H�AtH*a
rՓ74CױR �:
#�^A�aF�Q Ry�zX�û��b� +��<��R�8�$�z EL��B�F�Rq��ԞrB�|���B牔���X�l�W��,����f1A+V�Ӧu?�[<>��h;�x������!�# �#�\W(C0Kþ#��sY�S�p@�hc��"�/P��۪8�.;���)�&W\��C��E�(l�%�9���� +�*�sEK�V���3�Q�).I/i�� +�� +�̻t}��7���� +����8A`�b0�G`K�/R1�)�w����\��S�y>�K� +�bwd��~k����[����� �P�q�Vy�A���t��1�$D����H�����R}P +X�ͣ�JF���������e���<w�Y< �k�g��T_���G���b{|L�����_�"ֺTFJ�yk��LU���̔痱�#� +�ʉ.1���&�t �'L��ɴ�-�Et�y/$�Y@�`k?�R=���T~�( ,����TmѪ��ʯ��F��{Ԭ�k&��5�T~���+��*$u�pqX+|G�-�C���Y��"G3w�����/�_�d�!����/P��Ʉr���9���m'�2G�� +���B����)�1�aj��^($ ��!@�*�%(O�G�W��FL���[���R���M-;�=�J�T��D2zh,|y� +/P��+Hx!v`�^cAЀ%P�[#Ģ��g
36:�S9Fpa�������7�Xo��' +��l�O͌(�e +R�i�/���}�R��� ��fA噀.�sD��X0��(�&u��ґw��Mh�b�,��F̻��y��F�s���4A�:ɥ�1�GJC�6{��2�ʜ!�Ez +���^�t|v%u����gK*k�8��#s
t�t]� +R�l�䰊��
�_�CV8�Cᤴ�:�h%q�u?��__0CQZ$M�wV�?����љւE��{ї����n@�ޥy�b݈�.rD�Pc3�m�wܢf�T>A��)��dk0�/�G{2�9W��ܷ&��n= +��Z��h�T"ہL���Os�z���q�e_Y�/ *��ɰ-�GPQ�wݾ;9��HĪ7�����X9��Dj�����Ք훹�2̓���¨I\���sl<.Y�,���w"{��ΗS�� +��ؿ\��/�r�]���X�R�Oj��d�:�4���*�pxu��}TQ�Ϣ@א�\�-G��^�b��C��XBô8�L���) �;�(�,�\5вw!�`�������o�^��i���,u(��e�B���+�Z�Ԃ�'��"��Ԙ�d������� n� �g$̂��ȄD�P;�1���7-�RJ +xm�sG"�IC%�������v7-E����d��ဧd$���ʟ�O�|e�H��%(���g��9"�;�A}�$���f���;dogDo�"{��ߐ$� +T
�Lq�?D��G६(�#���%}�î����_�UF=���jo�����?�K#�kELl�L�@>T��@�#� +1�{�Ű{�I��|ҫ�1͆U��ңJ0j�Σ� +)A���&Uv4�;�+�I�2��\a��9����N|��q�������
�I@�de]�y]VnWI��
��'�� �^�쾉����gt��fDZ����)Vċ!L�����wz�ln +[������gѐ����T ���Q�Af�@���I(�E��_����+,9=q��3�K�87�z�U_C1א�%9�i��ʁ�X�����+��/�2뼔�'�c����O�]�����xŘ����M�����,�*�)t�q�V� +�ȝ�YRl�4w�4�%������y�SG%�����uz��+߁҆W'1q>n��\Q���aر�����'E�8◙�����,�G2=x���5���C�"�����`�_��qeD~IK����"��fm)��'������5�}�n�'�5kl#e^�t��ˏ�J0�e�bŧG<�����.F�8��(]�!3���u��<�������y��F
U��g�.�FN +�@�V�빃�.�<y��Gg�D�@�N-h�;pv��"�G�Aucf�6����/���IQ�VqC��$7Zc������YEw$�,c4�]��>+�H({��T�;��f�$[P����i/�����]�&�$U��eU���-#�c���������J'v�@T���2��XPviQ4z��&=�B}�� ʋ�QM-�I���l?�$����A�.�C�{T>�85^� +!��]Ԁ�!K�n1%���>?�^��.�O��������4ChcƙtOaYÁ�ɦ����6e��t����,S.������%B�d剅�a�p�~$�,ݻd�f�"a�GIP���"�w���-< +�V��������k/�MKB��N@"�s:T}�ܕ�L�S��-�faG~�IG�l�8�д��$yi~�~�r +��ݓV�N6c�{�om~��ا�z�X��f����?��d��T&�/R���.��b_������%~5EZ�`FSU��b���p;'q(u��ɲ,�~���TTo��2��MA��-$��D�rX{��,���\Ҝ8-9�}%l��Cf�ڙ�������%}��z�8:OboG$2 +���ET^�W?�������юs]�g����'P~�0q�o��a��Gꦀ�l��RA���3`�IV�|��F�p����,�N�<��J��!Hs�hN�DjͰ�R�������Wj��:cJE�yH��t�$��Ԋ�"?ïMe�~����3��L�b����PM{� +�E��]<5��R���幈Z�S��Q�ՖwJ��Xs����Иe|�[��cI(�X��t���J5�'C��A���fPP�[l,�3�������a,�C� +�]+n�ah�����2�A8t$[�en�2���BK%.kg�(�PI�Ӂ�n�����*���_��x�Eұ����W� �)���?uɶ��CZ�d��J��u|^(8�fQ��wG�O����%bR� 2Q��e'�4��)�Chv�,�ě�/�C�( �C��
mb�p�� �@�"��~J%�EM�Hc��t��K��Tx��hx�N�`d���C� +�Hpٽ� Q�W��`Kع~¥ƾj�!=�f�Z�DK�O��L�Y�88n�����t��qZ��9�m�-k�n��j^%L_��vH)�R��v�$~_ʗ ׀ޖ��T���@������KL_ho�/��<�%�XE�>����f�埭����[�M)b�]LnC�@���7��"�A��dž�bqX�jv|[�����'6����i�1"�q�v��Q��K��+2˦�� +BV� +4� +�+�f]�uײ�c �,�"tP�YM��]�Yʬ�n@y_:p�h��{]�1�J��`cC!�ֽ���+J��5��ʒ��{���6��2�@�+��`F�;��x@ۙ+6"�!U���@��e�Բ��dw� +.;m^��K�:��V�Je�v����|8�{������iA�=�_��̣jx�D�,j�)��[�K�eI��G67L-L�3����n�ޑ�B���r`���&����SRW>`��bnb'�ThZ�q:c���J])(�-��P���tIq�n_�Ot:�D��X��)p�ML�F�83�i����V�����j�(�oj�}�"��qB�L����"�6(+�)V�.aD�W(��h�^�T��I�B����J�ډO�~���b��cn��g�#ܔrhT��~�]��j���|��A��(�����{��ڭ��
#��Nb� +��=�G�}�:�bEWa���"��n#2�+������5x!Kx��f�s?�r�9#:��ň��*�B�ʴ~0�Y�����wl�az�x �d��<f���[�k9YV�!����F� �8�n��q��:��@B���o�g�wT/o�v��sAK���ʣ��*mH�& �T�>���/�F�R�|�0bH�{:W�����ߵ�ry���9��S"s�%��/���:()��u�K��*d����t�g���-�W&��=�W�`�}̭�r� �ܦҥ�|�
� �8J��( ̏�$R +$u,u���^�]yB�}j�B(���b�!�Tn[}
���x����B�z5�zX�.ϸ*� +C�N�őudY~"�A[]�i�Gد�s���:Dwأ&[e�Ͷ@���|=��>���h�<;8^��W���0] +���wG����J?���u�Bq�ʛ~pR� +�2��ʖ?O��+��h\�I���iΩ�|D��4�q���
ĝ�z�� ��E���n.��� F����ˢq�8����X7y_���Q<�s�<����r��K�� +�9x��n]��snO�~�lܘ����+]d��:��ţ 77O4����tg[���Sb:�I�B
*���h쯓��|er>x��^x��b�+U��9�+=�#�-�uij^� +NPO�5Ϗ�w'xyi���bYqiT�U�N�SW���
�[6^�> k|n�c�����w�^�A=;�~�f��<���8�Wk��'�1�{`j���q����ĸ���rN %�K��g�h�1C +��ୌ���6�W˵ +Hٯ�UO���*��P\����A�1&��12�\3�H=��X�8i���+x��)�ΉF���E[��#���*���M&���'8s��Ł3��h����( _���7�`�+�3���L7��6�s���>s\�?�)�z�Xqa��~W]��^�}�b��m6_m�{%q�8��C��Wϛw(���;�_�w��!�T4����k�F�ع�z7��ts�yi� ��U�|����|��^_���1�c�8���|e�������������������7�9��y�L%��zs#�'qS�4�"���2v���(�_ +��ԝ�<�'ڮ�◰�;F8��"��x�H�D#��hl���2c��Ѳo�h�Dc�o�b�fS�������k����z���ij�'��#�P_�~�-� j)�Y{�Uc���_�?.9�5�]��9pz/�aM4fј��>�l'���Y�ZN�Wl n9�Tp�Ƿ
&k�jm���B�����9mnb�cl7��;U��F����9��|���Ph�uA#)ϙ�J����?gs=ƹ�v��D��}��'%����WnV��$�[h9.�7K�73iO�+4��W��+��rN�GN������Hŧ%�z\ֽ�����\�g� �>��}D�J!�oa�Bܾ�e�Eh^� ���y�)�϶��ʟ�K�����cȠdg}�|�%ϔ�Z����(4���휠?D�d<Y��=3/me�5��1Op]��P��};oq��� ���0@�[��|��nأ}�]���<�kp8�G3��9s��𠰗��eVB-'0X9f�hJ'J[+��W�p~q���LjB#:�o d�9m��[�G�s'����H:����殤#��ļ6���!w�'x��bC�qEn�� +� X���W�K(������m4�%'�x6�tQ>���PN^��s���;>�2N���$˒���[���"ª� +p�=�k���}�+����ɸ|\�@z�y��ظ���g��A���)9�a��;�)ۻ���:�2�=�zy�DL�]2���,��v��O�(R��;����A��:Cɷ6��X4^��H_���2��|</�.<�`d��x��p����e�%����,�a��cw�Xi��<�c��E�U�柟/=�L*��3֜=��S�z<�ˆ372��� +"�w�*���i�i��V�k.0������x�^i�y�ȭ<�J�!=)|J6u�ySWɇ"c^7>-?+<�IW � ֿ� �ude��w��]��q[/й�����fc;1o}�v6�%�>�6��9��dN(�<���V��{'n�7��{?�g��s�ԅ�G�E˷�<���$���f�G�g��3���}�Ŵg��@��9끷����w����q�s2���0��%�{�w ެZ�b0��� +E��!jYES�̩2��}��|���F<k��ԩ>v����L��4���=���b��
�:��Hr���n���<��]½��+u������/��Z����S���0YF������Z����DQ�$i��8�MM�jq_�Q��}�QO�3S�������O ߍ����Q��B������30��\R�� �n�(2��3�W9�\�!��ٕ-͑'�'F��z]���}���9^տ��SA�6'��"#������|�2EĉM�� �Oj'g��E*S�/A����K�$� s-�u]�g�A3O\�I��ch�Hz���W�c�@�X,,�u?_�1\jL� ��+���I��뙪{}q%ڕt�u�2�� d}�ؕ�29���ۙ���E=\{բ���m��mf���X=���AC�_�j�G�����^W�~r�'��/F=MO��Ly�b��1�Ȭ�+�s�kM*�C�aO�姜��p9�}��(g��5����W�R͚+�Y6�5�n��q"�Q�Q �x61������Ո|JN�=�*� +}y��·��8A�
�+
P܋�E����Πo=�_ש-�@ +��ٶ��g����˙� ���IS�,9U�����;(O��k�YN�<�kN�L�a>)�2�w,lA9ܘ;���1NPj\��s�'�������fAc�s̼��H��u��h�M:��9o��L)A=.�_�g}�����s�I��m3�K�$�lL���SB�������i<�2=�|��&��~>�|6�T��I_˾9U3��D3��x��w��B��A��8��T!c�8�H����rYgx���'ȒCw�hl9�f��kJn�+?����8T�!�dt��G�'xm�LJ߄�u�n���5+�$I��.!� JN�|s�إ;��'י<"���,d���*�<��V�c����~�P�sS�5���m�����,o�_��[�y,�0�knN�_g�>�?n��w��ו��dW�����䥮��@�IY=SW��*���~��V3�U�*��V� ^�~�2����E.'�*]�#V+N0���F6gV�&�g �Ȱ��d����]\�t���N%#2Κ���J~�I����� +��/�b�H�렽ƻhH�o����
��'�ȓ����H�}�}Mۜą�F`���r��R�dJ4�b�CWT�8���n|��������Yp�vE/���p,� ���GC��u͚[��Y���я�9U�צ�y�]O�Q��Pߣ���,_29I�9=i�N��k���Npb�e�r"���^'����Z/�vئ�� Q���, +\��g����'H(��t�'�y��o +����/�z�_ +A{�L��X�Q'xr����^� +���~��W�f*O�z@f�ߧ�� +O� ��I���H�������_7��p��Z�p�Z���h)���G_�JW7��NЫfd�~:8;�X�;��L4d2�+� +L��K�^���_�V�P�L�;�XU$Fը)������bս�4M�=8�D|��X�K*vfP���<x�6 +�?`2�N2a',\+��PNK#�2Վ>�(��
J&�0cUQdkZD�������b��*�f����PPG���G |�j���QT��i5U�L��#`H�h�BBx*�2�x_��}���ʄ���#U��23��o� �/�w"/f&�%�sՍ�YCxS5�8�F(Xg*�KU6�����(l�õTTW��.� ��n6|�@M��2�vB���TL��Q4zv +�T�W��9a&��b�h(� +3��&S��/��㭎��Û�7��5$Df��Vi FJeB��蘚è�5�jd�-��Jn����Q��FFRM���E]Z +e�x U9�
��J +h�'�����P��UɍL��j,rtu5H�kh F��
5�h5�D�苾T�%-S�3S��5k��`5�ve*m�I�l����R���9I�w�v3hоf�q�/���]��T��`W���y��MՁ�p�L�P_k*b�G�a]8�A��Z6i�z�&����Q���o&�̔ �%U�FPGI�Q�o ʽ�p/!�/S���5�L��T(���' e�*2��T��2�S����~�Ѓ�$Tc\B�i +EhJ�! +�,�[�+�z.�*k[�Ru�ؾ-̭��>��T:a�+��Y���p�H�d� +F}K-��? +�jjbҗo�~�����0R�\��H� +)��@ß;Дǀfqqj�e :�T[̠Q8}@]P[���M��k���MRoi� n��X�P*Ə���N���D�k
� +��܁���N-y��{+�5y��bۯn4�E�ɮ� +<�";U�.����'U���E�6�U�v���ڤ9鏵܄��,Z5xZLф��XP���X��RG��j��*�U,U�o&$�����j���N����D|CaC������D���n���\���P�P�al"f5��RO���}��Q�2SUV��H'�:�����kՇb�u������ ��}�\������cm��]5� +%�!���j�����%��m��i ͌��Lj���P���<�PL,Kg ���u�P�M���j�T�-ƍ�`˄z
&}�c�����4����z�9�꼘܉�!VB0R��F&��S��s7���Ƶ��?74I�x���X�J<l�/�j��26��X��R�"�¥��S"eBm(�'�.e��K��n-��*�����p��jŋG���'䙊�S]�,�����~`M�(�@?Y���������'6T� +n�̌L����-U-r#���%4��@1���RM +�:e_+�/���~��T��*�g,�%U����'��Z4+� +���M'��4�X Ӽ��X![�*�-T��D�1�����l��� N\UR88L��M�����p��p.������So��[�v��%���/u�T&�� u R����)�A�?Bd���X�p����Z��^��F��������͚�o�0!3Ds)N!�����@+���͛�G��m��
��k�W��Z�:�{�W:��y��y�������Q����p�{"�@o����n�������?��/�)D�@_o����9��-613u�^�T�D^�TΨ +�C�c�±�K�@+�[���G���JG��g�+&q��_0aYcؐ�QxLb +'2q_P�Y#)Ǡ��_��7n(�a�M�vZ����%�eA9!Y�$V��,���m��$�c��]A{jY*��nb%��9���r�%��e�zi���hLѿ7YҒ5�7I,m��S��
$�R+��˷��Z3�Zr�~���]�Z�e��FbùkQy�����73���,$���8ڇ�g�sGЁ��(��r�Gˊ�ԲRjo@�mXe!�T�!9��ϡ`ܴll�uH�W�t�Ϲ�
�b��A�#mc +A榳���ir�����Ђ�\t�d>�Q��)�̇�E�<����̇e���=Cn!����/��Nf="�1S��sfl� #>&w\C#١�Cў�9���ĺ|J����po�y��IJ��a��>4k,�=��$W8���� +G_]��U��u�&�u/$���)�$3���S���IL`�p�9����\\�d>�~�;��L����#2��#A� o��O��IΆ"�NŇN�3�,ds.�C��3^1C(��� �\B�4.�n��2�Km�Å��gRG2�ICA6����lJ�t�S���7T��tL�D6(g4�8ԆGs��r�Fπ�9�a��<�����'����S^a�����||�t:(m$�2�
��"��y#�<uXgO]:�a2�8Ēq�Z���ȵk�7>Xǚ�Ֆ3h.u�ckm��H�l�$Vr�~r��6�1�p +Akޡ��B)�f�nZ��:�c� +���|p�.0m�7�����s�;d�Io���w6��c6�5.��=kR����%|���\l
Z�S� �_�{yGf�b�2q�S�$�ҫlj�L�s��<��)��D��}S��~IC)Ϙ����ت)l|�T6�h]8�
J�F� +�E��<��_�l��w̤Ӑ}G����p
��p���M��N�]���N�������9���ӆ�>éȢqZ\r���o�pЩ�;��� �L�m��&� +�,��۾����Y#[n�������V���5�_r}l��ꯋ�)؏����+2���WL��yt@�2�y�X:�c�{�&m�l*��B:�}]9��.�@E���R��_�����D�d�;��ZR��zj�Ƀ��1�_�0�kXk��`R�!'S"��1 +���X_��d�c�0yc�����{V`��>�D4���{_)j{�& +N,b�맂|b�ܨ:p5�!��'��٭ ������Gxv`~�
|L������Ⱦ0Ⱦ�Ƙ�2<]48,�p�CC��g<o��������a�{�]D�d���C��XS�����l�]�7�l�-35������&r���M9������Ä�e��Ϡ��a;g�C:��:�q�{��)h�g����H!{G�9"�W���I�e�~���ڂ� �dž��}J#K�!l�ցSX�c��=$�t@�H��'g6(k��q®�� +�k#�ԟDؔ�ʇ l�3�E�1������g#�^<�Zd��}���=����Ekn]pt)��5�A�=裢sFT�����'V��ǫ��������)7�!�Q!y���#�����5�1�鉮] ~!���k� +qK[���O�#N��A�Q�Hv�"�#y��n�#�c��,Z� ���a��t�C:���;�������a\`�h� +�ߨǃ�[�=)�j��M�b�>��Cx y��H�@�-�:�X�e,�멣���il���l�y����L�k���!�7�G�� .�p����_���%����!Y��� �̧V�`3[璥�eĶ'����+��_� ������Μ�x�[K�EP�E
`��' +4�F��]�����*=)E�j>�K��_0I��0>F6��B:���슱��| �7�U|��)�����w�O�`�s"��������<�O�}Ӈ3���`���UlE��!�?p:&a����tP1�o�H�ˀw�',��2I�'f�rG���mC9h�n1�����c�@�M��Kp(��}u|T�����Ψ��\�lƞy�@/�႓F�cc�'���#8��Lr�4E���O�ľ�[�Q��@�,9-��Α +��TH�H��
�Kt���tR�t̟�w��cK��6=&����0_`'��Ɇ�˩���Tb�4��Ld�$�举���2y�c:u�*8o4�l^�9)�z���;+���o���o�ҋ&�>���s�����K�£K�����i��i$����Z�-/�a$o��x5�3���|��v�&��w�u��TX�8��� +|z`l������|���X/$�H߂�L�8<��%bĄ��mj�5�5�W�t���%�ws ���d���81[2�(=�O�~��=�HI��YG��N��"w�@;�$�q�N����G!�?�9Ħ8$�\p�h>���+|b��y> {4��x%�N����~���p��� +����JAl��)?�O�~9���'�=�Jy���k�@���)�|o9��>��p!�U���B�e����~�s > +f����y�
�\|���蚩\��%L���\`�(�٠�D@� |t�dr� +��w�����D�E}*��2��"���ͧ +�PY�� +]y����r�<dD�x�
�ރ�`y��C2���1e:�S�O7����{z2��B2�vT8Z�=b6�:V�]?+$��A(��z� z�A�|Q/�0'$p���|��%ʔ��1� ��d-��u�V1�8�bvH� +�^&�f2��̏��*�ހK�;���>�@Α2�r��<��9�r:T��a*���(8}��G�|�0�2G�5=�x��G�|+|u���ڷ*Ύ�w�w�_��n�
>{�/j�*�=| +:�j�^G�^1fZ�3��}��U: 0��q<�)�T�!.��D��pn�#B��� +y㍯��������Ķ�D@�H2�t,�yz������`��:|^\R�t��S����1U~�l��� ���Oe +���醻+��5��4v��� UxZ�J�?�(>����4�2O,�c���VT\1��_����-֤l�*Ϡn:y
p��#Kت��٦�ud�E�rG�b������q$vo'a��x����7+`-��g�Pa����a�5�/�8p@�H����*jϛ�M�W���#<h�z��B�K�Ydߑ�缣�(�� �Ny
+�.;��2��Av��9���:���o�1!���i�QB|�%䊁�|�E��/i����b�J��5�-8!��E�y +J ��ל#�]�����Yد~e����&�v2p�EA��mh�;��\d�x6�u����kanmݫ��n8�]�N|,�8�fs�l�k��In���=� +`v�3p�.�2�YL�웏� � +\R��+G<��f�q�>%�+p +|=��[fL�9�Fk���oc���gĊ
w�&j���n +��u�����~4���*���G|K6�>��3Vx�V���W@.�O�P:�q*Uxސ��ekAa��x��
ұ��!7p��E叧c�&A^ +]p�@5e����g����K���&D���n��<Qۤ�/1/�W�}�l�хST���b3w�㲎.�K.c� +8,�x��<��1�0��X/��Oy��JɪKf�����<6��"�L���+���_�%'q�;g�l�����g��8�'dψ�[ߑ�gd8n�:�+q~6��R�QEg�D�U��D�Ec�� UrD�2Q��4�u�f�!��{>ƴ�fC�'��>���/��[��Qi�3�Z���{���Yp� +o�W���L��ZF}I�:=��� +N.��,��X�m@��Oײ�'� +��3��Wq���<��}��/}�E +y�[c��_�b>nP�=V��pW^�n{�J��뗒��߈��tz���Y����*�߮�F";Go{�aBc.j�Tyu����k�:�o��>_��>��e>?Ϣ��|~�E��.���.��p3��I{�OOsy�����[i��/���Ͻ��wy~�����R���\�Yw6y�EO_�Ǐ����N��V*�?,��v��]�����;����G�:���w��=�����b~��b�= ��
�ot��u\Hc����������r���s/��_n��>D�xNj�pÏ�x��<[��W_�d�m]�ih���X��"��sa�>LU��U�|�Q����`��dp��r�'�#mn���͍��S���Y~�g7���(��L�sG��c����<��s��k%������>Y��R��1���FhcO?r�=w;Xy�����'��#[������}�Rq�M�{��^x�Ý}�͝x��~��Aq�͊c�)d�sO��;w������w3�_])q~���ɮ:ח���ޝ�d?����Ieov��?����?�{��۽�\���l��ӽ��=��A몃�W��w5Ty<i/��p����&Y������m�P8��k�N4>_F��`Noo�
l�<��t��O��ŏ�v�.8<=_j�b�ӋS�/~�`:�#�W~��r�w�M��֎��7��JH�Y���3�;������^O��um����X���k�`��}=��ˊ=������v�g)�@����=fA��Ϻ=��W"�����R�u#�d����2ۏ��ϗ +�+�zP�e��F|��qeۮ'���4V�Hn�^)s{���7�{ߓ���\9��C����MD�o��u����O�!�����dg ⅛���V+�/�.�X"?�+�|ґ���t��5�o;��Ǐ��3���Zƿ�ȡ���_�lk���,�^��'�ԝ'A��_]�W�aN_�(g��:�u-���m̶���-�{7Zw����qkU�����;I�9��I��u�=�uίW�?�)�~z��|~����$���������';���}_ls�߮��������w� ���1���W��]�����=��gv#���¶���oxjN������jL����;������D��X��{y�?V�K�-U�_Zl]z}���G�f���S�.�N�(_��e�w��~�Y�UW�r?�>�~n]CGBU���&��t���@��WK6�?̨(~�X��W��S��Nl z߲��Y�9׳�r�d��>�����X ��M2y�u��=�'�/�^w�}���w�X����l>��ӿ�L���Y�߳���gG�W���Ž,��O�7���w��Mq��-.�Zn>ۻ֢���r���ثO����V���l9��Mu��7u���n\K�%���&�p���z���яYnO�W;>;Q���p]Pw�ȮҪ�{�e��K��ގ/�?�����]!�W:"�.މ,��Vp�^X�M���wËn܈*>z3���fBY���*�G͕��(`?tf;�:Q�x�_~6'z����kC��Ն:��e������dI5������J27_�o�S�ϓ����Ϸ�o���e)��(�{{��z�2���?m��+�������������K;�rf4��mw|y��{%����J�W�]^��\RYp/��`Gt���E���Vx �<� ������SQ%Gкk��P��VBy����Ի9����-n�2�E7����]���rG�o��r�.���ݸ�d��J���k%��.?y��U��w���n9w���+���l����)9w����6�?�Rʜ���Os���&�?��N�e��Ġ��F�'{���^A��|�ݻk%�/_)��.���_Uy?���q[��z��A�ۋ5Iݹ������Ǘ��.�ρ��%ߣy:w+��쵸�S�b�܈-���\��lg��q�;Uy�#���ԋ�q?���(��}/ +�F�4$���Y��*�nV�wV�_K�̹�]G�|o�c��uW��+�Oy�2k���Vl��\���W}}ᝌzw�lć�q�/�n���w���7?�۫kSAG���{y;}��mq~y��~t;��}+0�~a+�|�ݍ,�s/�d������Q%W�5=��py}����u��^7�w��e�[o���qv�O��t�T��ͨ���T�z%�,�nY��Æ2����=���7��^�*��t�ϻr��'Y����=���9���C��2��&���Z��*��=S���T��Y���?©���_;�\^�+wxw���Y��U�G���H�����}p>��ލ[�~�m�>1}Kx�h����[�
�n��%��x����+���^b�V��
����vӛ^n��^~�^��}/��c���/��V��
��H��HQ��s��ǽܦ��{�����]뉰�ב���`]̽�Ʋ��u���"�����ws��]��g�샻 ��G���Z��:J�"�V�T~�r\I��j��OW)��.vx}���Ց������YM��u�O�*��J#_��a^w!�y�����J�����=UU��Rd�2�{��W?E/~������J�>�m*���1�
�zWX��͛��n^�����k����X�z3�ī���������d����NȎ��]/bݞ�I��Ww�R|���%G.%�ᅵ���Pz�r\鶫�N/��}w��k֝쪓WcK/\�.jG:�������!y��� +�u��+�����q���o�A./��o[y�;��ģ��#�"��S��n岿��{h��R���o<ݻ|Kt��u��ګ�����$�+�%F_}'16[)14^!�7�V��x�D��B�L�oMԉQk��{���k������,*�v.�|Ϗ�e��ʫ�g�7_L.-��S����OW[��M���;ŮOT!\TSx3���rjն��;n���R8Ϧ�<l?�/�v'���o���? +��,�������;?�,�JG���JNѓ��/�./�"#�}���~!Y��l�ʕ�d��N����7�dΨ)�ɒI�I�a��%#���L�ѓL8G�7f�d�#����$2K_�ʌ;�֟��zsG/#�_A��^G��O�v/���_N��x9����7#�N^�)���XQq3�*�nN]�݂��˩���&�V_M�,��^����Rŋ�C�wo���*;�C>�Gk�F��w��z-���}���ݣ��[Fn�=8~c�U=�?�o8�?2�c�_�W>����M2Ko�d��/%z�g�w'&"*$�>#п&H�J���If�ѓ,5��|gW��<���5����]g�s��������o_e3]���ש��g9n��V�u�V�\N-k��\��RR)ҋe�Sʿ�[�������ː>.=})��Njq���7�J,/��Z�����ʷ��������|�X�埽�/��V%�8�[.���W�$s��I-�'Yc淋!e�x�ֱk�"�gOד������Jt���轴���$Z�렖������i㶡��i��K�
Y��D������wW�J��V��.+��YZq!���jZY����mSʶ_H.;x>��̅�ң�K��!�� ++��*ֿ��dޤyHG��g��J����'�'����Z�m�J�a��F���%������L�H�D�(Y��1���{c��r����x<�U�~>��ⅸ���Ie�Wː�)>{%�(�N^����)��A6�_�-9p5���ZJ��Ӷ2���9�?��b��;���ĕX���ku��S��n��
��a ~��� ��a��"��~�����m��_?�v}��n0�oZ���,�z2n͞�[>���/ޤ*���sx|�������Ϊ�����{�E�m�ޓ�D%"�(Q9CU�b2�DI�3JT$�&0ۆV��YQ��n[��y��}κsL���s�y���y����S����#�5�������9��b��1l��� ���⦳��ȸ�/=q1������W����]�į��J���X�/B��
��1 ��}�9��~E��߯�و�h�� +�4wC��b��^u�G���79!o>��ZP_s��)���F���4A^u%ν���
���_4��n����9����[�s��ڎ�a�6��B�V;��b����ď?��߃����g��M��.�B���(2{�=����\u��3� +�jq|oh�S�����A�w��������=k�iL�~��.���g�6�ѰB����8�`�d�c�Dd�5�Ҝ�5l���l4���\��W��r�(���^��yK��o�6+�� +�p�&����cOa_ٍ����w`�z�zvó�i��p͙�����!£��i�|�h����el���+��?��S����GNEc
�q����d 2�̌!S�y�t�\d�7���>�=3g4eA8rڭ�6 ؊^ ёOT���Q����%��p�{q����Œ�_]+�y{�xǷ� +�������~n��;��s;��r�-,����?���� O��2ײFF����Qx!����n�}�D4F�����Lt쐩�4v��d�s?�<���R[���/�zc���ƿ9��z���/�ڮ](h�u)����m�o�^���z�r~��k���?={-� ��t������<s����\���#t�g���#������x͵&�qx�,M��x3{d1~%��ꎬl���F�,�����;3����";�Z�,繁�a���ӹu�kI�ryS�K�
87kj�^܀��f�=^����n��i|p9�����F|�
~?�Kc6��,tıu��|^�'GϠI>���sP�d#�����B�Y�E�cW��vJ4}I<�l�1�r�YN���i;Q�Ƙ��q����J�����_��'��o�To������m��m�~�p����4|}3���Pv�����dwܿ��
rR�_�͢��ј��Er�Q�g��1�����O�����ԛ�,�g"s�9�7�@fFvx�-E�ˑ��rdj����x�`4�F�&ύC3|ʑ}�a���_9l]�������C����{Z�q�7���r0���Wrz_���~�(���`.�%ʷ�>VL���?���sEd� ��[ c
\!�ye�眩�D������(�0a������ +�����z��r8��8wλ��EĈ���=
�ާ<}�G�����U|������]��1�>���c���Dwdn+F�]֢9T)�M����Z�0f��C�}����ժ3x|��\�K��-�zh�8z��\y%�W5�-�ۣ�"�pe�s疟ƻ������/B��)W�|��W�M+�Ƨ��-Wm�ÿ���o��_���>�[�������ʏ��!�?�V�:q/Zq�y�w +�*:)�4L5����!0ӌGN¹�4�Z�&� +F6�h�G�����^�ќ�h�=���vG��h�b-��Ԗ$��t�U]����qWp�y(��B�ɍ�j�V��ʤ?��.���L���믳}�^���+�� +b�M�� !���'��������9���&�w_U1>�KnJٝ_�p(.���chpÖ⡚f�Ώ�&[/��R�6�{�y���Do +��\��.D<�U����hYl��ҺkF�.3=~$b��:����e��O�d��!��iz�߅5�"���/���'!���u��k!ث��x߸z��m�K����0��qޞ���B ��}~�˽mQ��&?����`G����1Z�����h��[����E�;���XF���0��6��M���<w#r�;����+C�n������B�߯B��/�����|KX��Fp����:�A}�����֡�{5��ga
�۞�Y���`�uK�=B$�����e)~�W����F��S@P����%���A%�c�z�81u���3��W�o5���0�����D����)�?I����7�z��bdi0��X����yαF٢)�xdԩ��� �?��| �"ĉ�"$|/D�>ƾ��@�(�����&� d~#Ċn \�i�K���N\|�J���^:���ݷ���t�K!�o����֒m��?x1��-7�S��gSg3��ʏ]S(o]� +yt��?�M��э�r`�/�e�=eC���R��U-������t�_�1�i��
'�:z�4����@��56��_���&�����$�:+��*9m�ף������>�����v�Nj��O�d��n�$�D�梄՚�u�Ey%�~M�l�� +>��'%ܓ���C�%r��)��Ԟ_�e�5���L-�����7rŹ�qܙ�a��g������?����ٝ��ʕ��;��P����'�u��&M_I��?�8f̞+CK� +5�3���N�� ���$��B�� +1���?�?,�þ�{C��'O�x�|���x䭗�ɵ���w��?m� +{����C�hH�}v~7Ƿ����炓���j����4��z�_|�R�����7��b"
J��
�!J�At�@?�ۊi����s����Tե�����d ��ی�����'�I�$Fk��t���R���qm�B4�A����Ԝ�ތs>-�v}$��������u���"�o�*B>���{����̃w����#�sS�W?�+<)R>��}PP:�|�}���R�JY��%�����)n�6W�Va}в����=��爐�{�d�mc��� ���i\���]����WKT���G�R�/$Ԯoܨ֛����&�&7���6SM�v����l�4a�+�훈�'����0��[����jX��� p~�^|_�?�G��-o�`��*E��`�Q��1��a����+���v~�0ir�b���c�8��
���s�0�^q������Qd���;?�':&G� K�-Y��;��ڃ�zf���U��)��}�^~�i��on��sv��?�З>F0�ަ���=��U�n/���X�z���ջ��cFx��^p��k�Ov����'���m�۟�����-���~\":"����20��h�r'4�zZ`i�d^�(4~�n䆜1��e�O,����̕�ъ��l���H��G��#�dٕ�T��i��'"�G���a�s�V��Fo�+�і��hɢ��H���ע����]x�J���J�n̓T��*���8���<��cf.�<�yN*4
��q�V���!�>t�������;���J��q���o�y�7�Ln�
(�a��R`U�����Q�{Q���Қ33�̞�tJ� ��9���c�d���Wx�z#��+���+�)�!�2U�:S�f)m�4_�zq�t�E{���m�Q;ߺ�G^r��_�d_��IlA����Sy�ޚ������竂n^�S^��^��;�UPY�����z>E��xl:c�2�Tc�2 +�1�F&#q=��P�y"�wi��S���[�����~��<�y�
�+8�s�LW�k�Rb �zj&]�m���&_����N��c� +X�x6�� +����6��ucy�y�b�����ZQ5�l��C�ٍ��������������c����?��}�´�_Nמ�#����r�+F���*��[�����YV�m)m\H���=�^��J��� +�B��B +�g�ޯ�����;m`��(y*V���?��>y����*�9�3'Kn6r[�ĒDz4ʿ��*O��H�h��Yh�̅(��+�4�Sr�#�sMB��Ve�;//�}���G�Ա�$����ݯW��z���f�+쫕���C��r���;z��I����:ͩ�,&�~����2f�?j����sh�d����7����a�-`�ץ~{�m��������^������(��<��� �g���':#��m>eퟐ�������퉖Μ�\��( +����1��˨��+���L^���d!þPy�vl��ӥ��o������[��#S'��+��.�}��k�2�����gK�ҽ���uƲ�/mŗ ���ȋ�O �=�O�'���L=:�#y���a��;!
��I�a��̼|����?>'w�trY��3u�=/���b�禎lm��X�BГ.�y�J�6�^4v�C�}�����40d۟��9GU�J'o2�2635GgB����q +P�iHRG���� +W��D�N��i�=�\�6̢��=<��r����"�Ua!I����=SB��g@o��p�x�q��_����Z~�k���WYN�]�c���;'Y���Tj��4�J_��7'�g�졷�uٰ����M{'S������e�l���Ň~u
��Ӫ���y�����4�(�e� +���(����;��e����&�������Ӂ�/��ZLd�������5��K��T[�b�b���;z�@KO�ZnZ�T����ko�g����<w���"ev����1��\F�.�ے�j���݂��7�d�{W��`��� ��$�=?�Jw}�J���s�[���b-�E�t�/.�� +Cf}�!��}���s�[���ݲ�o�o�yX >#��������=f��|���i��� +���S�k�%a�Z��4M1�F���Ͽ�h�G蔊Ѳ]�8ü ���@3t���DMUJ���担|��3�$뽻����4 T�*�o\���Ln�X��o"�zA<�i�
��]>����}퓝���/�w�`����l:=�����9���X.���'u�?]}h:�]kJ嵎�dw���(�zm�(}���*M݃�W�Udj��u?q��,��X����yU +۪���Pš�Jz���p��s��^+:c� �q` +hR������=��Oq�q����dI�>+iV�YB���/���r�������cӨ���`�T����W*]�A��a>"%��S5����t�#G����f���:����}��]L��2j�gj�3W���Oa�;dzi[L�#zC������������y�$;�^L�{�b�|��Ͼ
�.|E{/��Ճ>�^.��W*�DϟQ�Հ�-z���S�ݾR��1�Üy��w��B����Oi�m>�2��?�G~,�DoЖ�٠�V��HӖ��k:������\�HxlTr�!���' �T�X�'��*Rʌ 3*:C�K���Ru@+��,V|�`}H����ӫ��}��=AאI�2�3}]�'�E�]=U}����Ӄ�̎��Ѓ���4�w`���`�z��g�15g�<a���G'I������ƒ����Ugl�ɭF��^�_��/vEΎ^�_�}���R�iv�F�M10A�G�G+p��UP~�$���s�'O���zgEP��>8AS"����$Z���H.-/����/d����u-ù����펽�����oi��+���$U�����j��eT��e���^d���e6n�D5.b��d>{!��eν +a/���O�fpLt��v[Ic�tDt����<�DH:���#�-���q�EG�1��wī��ꌰ-L`�����[a�?��処S��:TR�>�߃��A�6�1
�>���,���2������/��k���;��>�:����4d�O���O�I�;AԲ����J��� +I�;I�O�����%�d �:L���]��]@7��:8�*�l����<I�G��_VIS[�=B�����d�0e.Z6orssC�~���6��r�'�A^"��#F�
Yz�1h��m�Z�?�S�$��P��|~1��ԍ�}���Tb�S�{ +��i�r��l�-�e�嵎M,~����C%����������;��GO� ���-�k��ZЕ;l�ۮ�3��^�K���SR}�VV=8[���!�督�t�Dqx���_��#W��iR�[%k����w@s'LC�� �U~�oJ0"A^�q�����J�Jd*(b�a��Y@�?��ۧA)���s���J��t��/5�]����͜�ЋgS��IO^N�8���_�Ot+�ΠOϣ�N�aJ&���Hw�ZI�6�9�FLm�ѕ�x��2$�$
�Z]��IŔ�����9�H4���Z�����ꂑlN�%[~Ԗj~��4q^1�I�E�-7���t�ج���m{��� �~n'뺹z+q�R��}�T�J��?\M�6P�rc!�c�l��3�7�ט�_�I~r��t�K��F� +��Kw��$����M��]@L��k"E�:�ii\(�~�@���N�tY�^�ܖya��� +�6�̭�lf�9�I6�łh�l��`�ŋvLds[,��dF�:!S�N(�#z;�ے�)[�����5ρ>|Ш���Ԇ>i���*��૾�C'�R�j� �L��q���0_�߹J����v�q�v}p�u?[�m<0
��A���{� +k�=D�kXS��<�]/��C�e�J���t�{gf��@w↬��B��;j������XW��7��U�g�<[9�~o)?hGJx���iP���ڀ��� +���B*�h��'�� ���#.�b4��o2hSrE}�4���M�Kc�GJ��kJ��5��A�9�4��U�3��/���}���މ�=J��q���]Z(�}��GG���|����cp�����������l�����>�M +�t4h��{��Hw�um3���/h�����u��2C&�˒)�q�,�LV���ٔ�j4��q}��وI�b̬�5����%4����n�*��������J��w��^:��W�5���jp��z��b��./��@c�M).̾����O�Ï�ܾR�@3�N��P�^[������s@{� 4������GOi��e0g@Ì�LR�>W�ny��[���������@l���`���A���H���A�]�&U[�;�.������� +<�ܑ���ңD�˛C^^��^9�*Q��B_>�d
_̑�D�톃�����/�K֔�tu�峖 o\����k����G�LP�&k��°�ClX�6hO���� j��F��b��@+ +�%��Ϧך�kRF@�V~v[z�F���<ХM%���B�� s�G�xǏ�L�!аg�pNY��<6��$P��[���,����xM����m4 +��tX����R�C�i��5�L����A��n��H������?�M���'�{^��'^ѧ��<�G���|��ֱ��d-?�w��'������ ���S�� +�9���{�<;��]�<؆S�.y��{�ϙ�Kخ��P�w��z�����u�3�����Rj��9!�|����?��m����������=jM�N�<^��Lצb�Z�jy�8\�"�i��R����t9C��!�t�VcfӾ)LJ��ă�*���+�k��g<sQ���᳁>���bhq�w]A�����l}Y�-G��s�ms�{9����cLb�!�꾸���� ���UVv�IOO��!�]�1H�1��8�Y�zǁ�I�Pu��&� Y�\b��^�h�cȵ_Z��8��o�|.�5���`l�եl��U����Ԙ�\������r�0(�Z*��&@Yyh6h�m��*vߓл��d֕�Bc5 �t�d���Y�dw��a����X��ԙh1���F��1���<�+�U����/�:�Vp�`�`-
��؝_{�)�7lv�86�ے��5_��=w�_z*���)��1]�WQ�^m��L-C�у��o���Y�����L���b��k7�������(��D���/�'�<G^�6A�W;N�������1�mӁ�d8�aJwL±n�Ӌ/7&&��x��/����-`����Ҟ�$�'a?�q�TX�ar&��7��)u�Tb��:C[Ć�9�pC˗�BpO(��R�;h�1]O�@Ǘ\#\%,�#ⴀQ��zƁ0��W6-��p-}C~lӕ%|^�8Б璋
�zg�6�w��2t���^��w"��[Z��W&s�)h2��kpl�2�F�N:���t�
�N]z.2^+(�q�*��Z��d5 +~<H���ɸ`5�c�� z[��
z�t�Z-�?������2���rಂ�(a���+���n�Ҕv�[�|B)v��ŭ�� L<.��7Yy��W���n��bv�YtJ�h���E��:��lB�����m��g�'�3�Lb7�En����A����֙m��ې5�~|f�%Ѯ�{�*��5/0�`]��Õ�6��x�Zol�3���J`�F�X3LU��+@'�D����\�dž�x�R��ț���
?�tT��uZ0�a�I���|�g�Y��8h�=F�yǝn�������v�u��!ܫ��f�������3ۿw�z^��JN%��e�6D�n��Hu�v��'A��s�}����T�F}�uq
�u�Z
t��
&<~}�# �lw6J��KJ��ʪ��T%;�q�+����Y�l��U��^��+���-�D�+�]�+0��;;�j�yف�b���DS����v�Q�b��q\"h�����*s:'(Ӷ���*�� +�`!������OXx�F|�Ŷ�A�w}䭃N�彶�P��8NYqt0�������C8��})Ӈ���-�3����sCѪ3�@�������Zܽ�ʝ��;��S=W�-n�)����5���zD�.ߐ +Ź� {�4�7�M�,����M���q�ҰT-�{�_"/�$��3�0.��L�\4�H���L��`[R.^�|`��m��UO���fC�+�"��5�0��Հ�2��(�{���Ơq���6p
�zm{�(?9t���1��VgC�j)��F
ΦS��������@st��wD�a�xݞp�;-A;��x���ze>SzdSs�T�lي�3����'#�N�NQ�\-��ѕ�==��|i.����X`��}:��� +���� +����H-
n�̨��c���K
��h甠��1���T�o����|�4�����ĵ����r�#/�71�4��.���?���l��<�x$�z�vgq�&�,� g(�u��d�p��R���%���C���G�\i��UBX�m��k +'��}@�l�v������̍�1��6N]�mX���6Ԍ�|Z^�=����Ed� +�E�3I�.���0�C��4���Yc��E�J�`gEd�TewM�מ�WLS�xFt���nWf�8�P̬0��2�� +���Y��q�G���=��������??�� +4����l�ieF�M}ӂ:}B��
uS��������y*�?u������x!��ME���������4mX����0�[_c1�YT���V�G�h�
����s���q���G�oЖ2�j�a;�$�uţ�=��H��b�L�����tx&���
�D��(�y�e�s.�!?w/�Βr +5�Ov�$X#��( +P� +Z�\J�1�_�f\�]g�Ia
P�����Ճ}#��U�; �[�7�Y�i��IXN8f��;���{��R�`gA����b��gV���Y�K���?�Y���,���c5!��Rj���)�0wA�_���r �� �g���B������;�����������z�~>�ɠ�M�}�k4�_��<�T�g�<��t���LX�Lcv���w}+Y`��<�NX`Z���o�1m���� �D��z ���x$�#���r$�"ՠv��� +GŦ�G +0��F�k�>��k�����z3U^�50*��[���}ȩ@��� 7uLf���!�FB�;����9���6η]T9
�1yz���AY����e��u[��s_.��\L�vr���"��=Ө����Ŷ�t$쬜V`gi��\T$�sy;�@����7�&�,%𓁝U8��R�����;+e�A���T�r^`��m�}o�o@N,0ej�����V ��u���F���ՀK9�����"`j�dX�x����<=�'�^?������Bv൯���2�R�Q������H��~$���-G���#�w���B��
զ����7x]X� +�A���r�kȝ鸶�n=��d-��Z����bh�þGE����%U��7|�((�Ą
��T������x���r��8\��%��Yag�_�o�+�{��> ,��|}:2g�$*M��.�;֗�9@�J��*���) +�X��^�f�m�;K^������l`W�s�a��qX7Q�wZ����9��'ܘ�vk�]�r�qU���tp�"w��b9<?4Z�[���ZO9���`}��s�`~-��
cɵ���[@X���k����_0P�xD�5eK{�٘L)�. +W��I�_��Ϩ6��`Q�$T�
۠��+3��V��e,0O�'s��R�>�':�p�bu�H��\R�!�BJ��!����a��=�KAS�tL 1�5�م5O\���4X/��a�� +��Ø0 ٺp_���r>�r}1������N��b7�=\���\n�xвfȚ�����XϪ��Y� �/�����Y|�����K F��VV$��~�-�3ͧ��Z|�eݓ���I�5_�k����"���µ�{.ɥF�\\ +��,2C[�s|6��Xi��Y�����x"�;��s��8�S-� c]Q��f�u{&�=�Z8�U��s����ֳ�Ɩr�gH�B֬��g�k6\)�{�� �
�Sx��ո�ﹻJ��.M��ڗ�t�=vp�]Qy|�7��7��Or���c'�\�T� +d�n��z��3�"EN�K|��o� +{ݸ�ܑ����H��z�Q�Qg&U�QgpNM�}���b������hu�,�R$���1�c8/���"X����)�T#,O���{m�o���������"`� +�&��5�{���9\R���Æ&i�S���}=�ޗ�����Dl��2��5>:�����k��R�q�t�4�-��H�Zu`�/ �o��xj!��+�ze�߅�ͤ�1�X�Ĥ�}3��C.%O/6"yJv�8eQ�5�'��;�zv�xb.\�C=/�ǩ��0Up\!>����L'� 8o�?���=[�ϖ��9�[B>!��y(�5�7�=cw>�
���n/g�-�� +ɝ��]S��t-�r�������pl�g�y��ߪ|�TEA�%�W�pl>�y}%�p���3a��"n��Dz���T�x}r�&�C^�%�1��Ϛϖ��H�^ZL5_��^T66K��l\��|����{H +vO���W��Ho2V�X�8媶c��$�������M�3��ue���*������d��L���σk|i��J)y4�&P��u�< �r�f��b�����L^�9����Y� +���'A�<-�aϖ����n�������i�fP;���<�p��W�=G��O�l��)���{�>�˨7�3� �~Ŝ6��V@��[X��PnBXM�>�p^a��0ǹ-LJ��O��#�+`��:;�c�T|� +�����"�A\-d꿜�9!���b��>O�~(��a����ʌȽR��M���?��1i8߆�����m�,:�+��t��P'��6��6�E�W��]��B�/���ڂ�R�uL q��a��s�6uM&vZ�ӆ�|r]u|�Vo +�97���~��alE%j'\���J�g_p�_�s����5��3Q���������q`���L(3$���cs�Oǧ�����t|:>��Oǧ�����t|:>��Oǧ�����t|:>��Oǧ�����t|:>��Oǧ�����t|:>������S����B�CX/���ދ��ג�u�IS��:'%�E�%G'ć$�[;·X?�������/$=")h^�}��eֶ�����'��ΰ��uޜ��s%!�ֶ�/j�l-J�����ߔ���F��2�0��-,�����~�jqH2~J��7]"�s�ӷm������pk�]k�m�E3�Y;�� +�D���[�#��t���d
�V���y���r�<�p�}��ݒy��[/��0�:���a�ü9�������~�����k�������×�#:6�q�Sr6�_g�����s�"R��"\�9_k6�@nmG�y��ɟ�â%s�sp�VZ��_/^ +Z��j�}�4��A)��2Q��L�V���S����ח�ʩ��(Ϭ5���2|��=��Ӷ�*��Y*�AA�Ze +z�D+��쇋Mա�S�����k)����K�'�9��;�.>Mz��Ia��8h�6���B�6�@����L�0
���4(��uZ�g�2tP��Et&cru٤}��Te7���a>��P��C4��-��K�Vm��f�2��i������OG�k�k�@CB��m#��z���fɫ�Q�6��q9zlB�.�9���������z3�7[�����Ht�/.�[�C_$�3�=��-ԗ*�X`{ ���؞����w2h3>\|�.�]�(6V�wL�֗��֤�$�)�G�Ǎ��E�jqY]�\\����P�p��>�I<ߔ)�>QC���L֤�C¯Q��Q�/;��Q�k
��T<���Ĕ +�~+�?�e�sF@?W��~�:b*\-��R#�����K�3� +t��$
��s=��|=Й �z��{�A��IlL�H��b=�"QC��~4(AS��@O��e�2��X����Iׁ�VUF����7�em&�g����x|t k���I�4U$�C/#��K�C�)�a,_}b.�NBo7�����uM�{��DY��V����=3Db�4e�������p0���gB�
��s�c��d��>v�ej��~f�U)�>z�H���R#bo�/+S*M�eF�<�s�ZDg�<�������M;�*����\S�l��Y����lH�Yq�DEn�x��Q�!t����ym�w��O��N�C� ����[�j�=a����%�]�n�o|v��|}�(�ߠ~����*<�`����}�'�]�QqZ�;:`W>"��'A� %c�-z���O�d<~>�ItX��L����D�� +�{����%��S�L@�tz@CC�\m:��n��RĪˡ'*_� +^� zDW�^�+�}!�EL�.h.ȓ�F�o�RvM��8*ʺl������'��m�����2G=��-�gPU�s����l��:'*J����� +4���**�ߤظ�|�2u�1hk���Z���-��u#��U��b�|]��^;tE��h#@<�j�>�i��,Ķ}�Ч��ђ#�m���=dԙ�F��%�s�W�Mzx��.��.�G��)�g��N�6+xm�#�Vv-����s��A�����S@�YY�{�2�� +����2��=S|b�!�ѓz��]WbHbzz�9�&_��
���G|*���A�$��[Mt��ב�
た}�p=@O]ʪԀ��F㸰&G�j��dM.4Ct�@c��~�RD�C������N�az +� �� +�ob�>��n˦�A/5�s*"M��/�-+nӡ���öDG.,Y�þ����9yh:���o6�~x 誱�D� +bآ�Hw#��9g��;p�{�{��~��~���b˜s��}��c>����umh���- � -]'��8��0k0�k��&��F�f(��.<�������}� ;�>4�(��h�s�������)�S�^��*]=�Kc��)E��t�[�@n��
�� +��`���N�{)�����/O�y�^�Yc���3��zN(N�z��?�0$��?���|���|����G�`5�l�g`Q���Cp���E�����4�Ȁ< +*�;���2�F`\��b��������ǵ��W� +�����h�3g.O +W�L�A/ p!�m����=�x�q9��� �' +��s-�Y�y���=��C�~��ِ�uB���1 k
@> +{����<�f�QWZ��(֊�����Ҟs� +����Iī��1�FB�aX����9�b���HТ����<h��& en3����p<�P���%�N�����������> +���_%>�� +Z1������Tо���חc��?O�0p,�ŶA +��!�F��Y/{�-����`/��~S����$�b�|�.�#�n��[ը���_d��l�ˍ��(���<s�c�����*�nZ����� ��>f7t�阒TJ�^�� +�]�Is��!���p%#+��&ԩ�jԄ 媠2����K�\�X40�.���{������b���e���j��e@\����:�+�S���~�I��h�"���?����(�����{���9���^� ʟf�#�ӁFh�V�[-&C^�=aЁ��]x�����g���c�c�g}&�9����H���s��W������N���b��C� �O"w�}2`=��r�m��H���/�F���M��\�S��Cg@��-�/߀��^aMx��(O`|�S.�sqOzH>�W�~��D��Q�ˀv�z}V�KAx�u�5�� +�T�����C�E��<�9�7��Z�=���f���N�D��~e�;�G�A���A��
��Z#�r�g +�W����AW����[�Ș?�~u�õ��'�M�
X��럻�N���DUng�2~��(����D<ZO��+�땾��4�:�j��9�iJ0Dq�tB�n*�fY�
뷜��� r +�)���3@�뱁���|��@V�Y�Ҵk�Y8���|��u�&��������u�<�� +���Q�>��@�&����E�F|!Z�q���<�
Q��� +̛��
iZM�=�|�k�o�N/�Y
9��-�Ƅ�Z� +��_>G/71��W��"�Dcކ�h���X���-���I��/:�O�Ά�_�I��s0�_���4����G�c��b�蹘��"�>hlq��+s1����y��B�k˱^����D�aJ��(��Px��d�vj �����=?���9�9"KyJ|V~HKq��`n�9�g +�A��<��(w�Qn�����P�aE��~�)�m[�1ᝤ�O� ?�������.�?�`ln�/���G�
➠� +�����ix���q[<�p�9v.�uc1��`�P�B�� +zX"��(�@��������'k���C�.�匥X��RȌ!���1@s<���):��ť��D�?��t{���١�,�)�GA����G�R�T��p��=(ι���DJ��(�Z���Q��cB =/�c��v�3 +���=�8�_<����+�:*�{���^��]�۰�"�F��;e�(���j_|�݀��� �+�c� 4OX�Kɸ|�1Aǖ���?�~}cB_tZ|��w�P�g�3~x�`� �!� �zLX��1a5�69&O���a�k¨�ӱ����,�g�wc9��9m�Ş��1)���+��T�*��En� �Й�߆9/hi_��a��ޛg=&�}6a3��C��:�_��=4���ђ�ޓ��>A���x��u�2�<�5t��!�!>y�cr�����&��iD���z(�N:�Z�kAzX| +��Ό�|"��F��1J��".
�.N)�d���Qmýw���x��r8�l��\��Mo��!9�!f�zLX���8?Z�=&n��~�y�)�[��D���5%1s$� +p�K����#%s��p�ŐX��\xd,�\���F����o���(�xB��( �����F� ��z�F���J��/xU�\W�,�*� �+��������:m�t��%���~�+� +56�T�N)S���3^��nD���yk)�P�� ++\�\�YJ=[�s����a��]_ +�csX� +>X�a���)J��
�T�Q��g�+U��u�OR�Ta�|��'� +�?|����'/�S�����!-r�� q��5�����rQj�&Z���^�XK��4���#�n�P�O^��<�:���Q��@�e��AK�&�%�|.p2��Ή�@��NmQ�x�FxP{�.�+�P}Gu^|�a��x�ZX���.9������b}eX;��e���E!h3�宒�d,�5!����
�(a}�%���� +��|�yf.����o�=:����/�x]�#q>���ĕl�:��X���q(F�2�w���4��wO@\%��_P'`?^��5t�-P�%�YK +��@\@> +���~X�}��9�G�d�g�{@?b�jh��h��5�O��x� +Ç�| +7�Y�Z�Ě��S(�cx�$�a�����r�}���b1zEh,��@a����)l:��F�M�{m�������[��c�{��Q?�2��@M`||hO�����[�����1y�q,y�f$���� �2� ��HG�m�� +� ��z��K�//lh�&����K��.�Q����,�#�l�k(p�җ�� � ��#�=S�c����R���y��[����i��/ +���iLX�&�h����[�`D�z��T�Ӹ֡蓉j��ӂo���Y�k�Վ��Fe�����?$5�5):�p�2�j��j�>}�� +R��.`V�X�*l +�4�v͞OF�n"�:@����_��.���O��fL�<H�����O:d����u�v_����U����Ṣ1�ѭ�Ƽ�e|9i����8�Kཫ螁�$��˄A�ֳ)�j�ku�iV��`Z9i�Z��)c�c���R�|��WR�ջ�?# +~� �ePIջ�KsN�����LV��֧�$��u8��繴fe<FS���1��/�?^���ڮ��IjV�H�݁8��Z�{�x������+�uc �t-{������Jk�G_m: �j2^m��H2�~�#�o��Ʉʝ'�Tj� +����h3��y�=���@��z� +�[w�Y�5�g�Ƣ���7'�Ϛ�0Z�-t�ߕܭ1f�4 Dw����J�rM��Z�� +}���i�����L�v��g5��j3�2����ڣ%�lU��J�׀��'T�>h�w�Ll��!��̥Lr�>A����� ����fe������V�3�j�!oփ�����Z��P��״|��z����mFdÊ�B
�8DV�]��d
�����Һ���\��K�<���|�3w�a\���������|�)]��\��o�����^����i��HW��a�N�������+j�/z��'"�Y�X�����i�I�{�fҌ�$�J]�Tw�Iiڏr�.W*��j&�UE|����J%Jj��?]\��-a��!x��9����W��a�8�?�/(��A}dn�07��6��i������浙���ST��X�K�ѩ��h����!yo����U���ш�;`��m��{]|�Q�Ht�Y,ɭ9d�W|N��҄Io����&ӻTѡ1DŽ�^q 1F_��f�j�z�0�bS_z���ެ25Tj� +�>6
忤&eX� �>(�W{��������]z�]��G=��G�q��}�@7K��(a_��v�F�x����K���[���N����� r��O>�l��#�77!_| +K[�ĥ��&��]0y���n���֬�d�h�������ຂ���Q"�閰��,����Imj��'�̬���%�����>/���6��Jŷ�E��VJr���5k�2��٫�ڬ��U�����[FGož���[ +ߴ��wg��J�G}��y�[�v���t�~��)�>ü�d�~>F�q�z��X��*�dʔuYJ�J}$��}E�e�������5�E&��!3>�����ه�bqn�){��e�Zuȫj��V飊#�ҧe�;-}�ˈ�ޡ'��F�4� +���R7�j�w?걷�H*��O>ꢨ�>)���0��ے-�8Ǽ�:�T|8�Tv��^���.j��WD�� � ����tA�!���J���e��>\<�$h�,y5�9���S�a˼�=LeҢ�P
��� ��4q.G����xa�kx���&��Hޔ_4�wQ_��?ZͿ�]���MG��3C>��Y�� +bz����%jI3[H�{Uǥo�l�K�\��n�_b'~QsBr�I$�j7�X�J�&�4�96�_ab�+�q5������������O�Ń%��O��_�|���د}��@��x�4�xkV���4�Wy`\x�嘣�d���.⾦�#Ět����Jڛ��ڎ��~Z2��ٗ������i*��FK��2'����W=G���K,~�hm�R$.m��n>)*n=')����T9�T\�o���������7�e_v�ӯ;���Q<V����V�A9��(�k'���^l�Fޝ��rFTQ�Q[����,D�W"�j��5�����v�����K�4!K~5T|9F�h/l�|� +5�z#��DW|8K��27z
Ȱ���W먨ڭ���:��y�����Ҽ2KiN�a��c�*3�U�̣61�䃔|�Ų/[�E
��yu��OZ�����w��x����VsqE�����E�T�c�Uq���ē���v>�;��2F4P�+n����Xӯ�L���g��j���z�-�n%X6��Y�'�]����mL��h͒�0�=��_O������i"�����m�J�6�6�]���
S>ne +����
1kˏ4�-�?��,�PǫhaU���軩�N���|!��H=mc����DN7�s���:^�N��N�jLO?��0Ѹ���{��]k4�������|?髊s��&C�������D[V������2��h��������$�ބ��<�����1�U�u��9*���̲9%Z���pWNԱ�[1���`qs��Η2�a�����RY�5�]��'K�+_�<�9/y�q����~2��Z^D�Z��o����ϼ�y���'�ƽU�7qg����wQ�Ϊ +��Ĺ�%����o�Ϛ���4��G��6�d
��}j�&��Q�aɛ��BT�_~1���zT��:WG���E +�[-��k�� �}�`��M�nV��)'Zo%���\�m�W!�Zr�;Gf�$KL�u���uO�l�L���a;�\�u܍wo +L�����u��Y���J���h�^��G�;�>+v��-q��-��:ޞ%�� lo�VW]����Z��7X�˫�anD_Fq�/�+��v/�u� +�M*�� (�O�;{\�^s|^#w�(�OAe��E^��E2��(_II�>I�ѹQ��zo9=�ל������O6�I
� +��ʶl��aޙ�6�� +��λ׆^�q��e�]��jLj�r��{5�E
�a�
��G���P�v��pnj��q����H~��l��$ر*"6��'&��=�j�G�}eT���䨳�)�Ǜ�"�=o�ͺ�EJzC$%ͭ~�G��n�]G����fM�Qg�2SO7g%�p7�`C=Ϣ��}Ȟ�l��n7ѷ��#�ef}�"��9���#�j�#�c]�#���_6x���g~ۢ��d��M�TǤ���M���Q�����bC�c��d�]�"�~���urƺ=�X�����qB�~���̌�rg�~pV�*O�{�'�勓^'֍jZf��Ӥ��8$.n�5���=�r/ѱ:*%��;�j�[�mcl���2@X���ֵۉ�*]%�
�g2���"m+cn���u����C9�y���<ܬ�0ڼ+'�BsR��_�KMx≶�����tG�������p��ܘ�mYq�ccc��b�����������T�7;^-g�_����ܡ;S'8{�V1����~J�ke�w�LZ�[$�{�7��"�J"N6eD�w܈`�<��[�էè�a;���ߍ��J���%��{���7��;o]������sd�;��Ý����C}����}��)���!,嬒J�����A�Q�r�G������Z-��;gu���J�SLQӥ�'
v�9
vQ�M^ɢ�e���PM�D�����S�w��y�R~��y�=|1�}�6�y�^b�}�ƭ����{�5[U��[
e�q����)�[�Q�iP_ڝ�J�"�_z�n��� +/������� +="C�/#�p�13V���k�U~��n,�E �o�b�ɲn�.����o�������� +�K�ߞ5Z��i���n��h�������:r����X5W�X8\��O(s�i�lt(��W��M����طODh���4�n�;w���)s�9�,�[�� � +�d�����J���K �ik��s7+V([-�}>3��v�UqBA�V�[���gK��w�Yo=b +�:��-v/(�{��1"��-:��+ֻ2 ѭ2$!�W�m<�n�q�.DŽ���>��4�������j�S�t)���b0�C��>7���@��k8ޘ�m�1Y�鞂N�;%��/�r��E�!�S;�n� +��Xi�p�"BIa1���b1�C�E�$��"1�P��A,��D��fD�5 �W��|�j��<�&N��w��+gc��"D���/lt5u{����}�s�*0.��WTZ�G��7�(/F]-��=.v�|��!�J�[�Ǒ��8G�.t/|��Z�&����kn��uY�~i�I���\����p��9��o�-j����۰S�X�T�X�f9�nzFN������l��W"&���(b1�@�%�>�r?�^��z,����'y��x��˄���"b�/���J�W����?*��72��7*����BoYz�gԕ��{�nQ/ +\"s\"�r�����b��E�QoK��}*�ٯ�����䯟\/�DǼjF5��bht�s�.N��qb���(���s��J_��8t��#�����r�j�7�L F
���N$F�MD?� fNYM��r���U��@uc�sB9갸�9���zlV�GTa�s�շ�QY�ܢP� �+r��5�y�Y���S��wΑ�ŞQm�Q�_[������>X�7;G�Ν�/{=w�]Bi�t
����Dg�O@�4E�T�|?�\�����_�{������h.��{�P�k��~�[�?�e;z���Af-�#��d�.���Z��b^�BX�$�a�o�c�+��Bg<n�K�D5;Ew�9D�?���\��c
����{Nc��91�����F��w�;��=S��X�P�X�q���Z5I��;@}*��*I +Nx�'���#�i���I�[̓"�� +\�t�~����7ҵ"4&��7:��[v��r�ț��I�2�W�J��U���tUs[�uk�3�&������99|��q����|
C�8�? +Ͻ�y8��F��PV�@�$��XL�Q�O,�eAl5M�Ө�4�ϝ��ݏ��\#���d'Z�F�lH�.^��W�/�j[}�-;^�~�Q�0{}�u�ֵM�u�5�ˉD�B�z)tԼY3���pt����\������{$�3c��>'��;�Q�r���k���������Gh����9��-�C�V�GG���qx�!5�&�-�}�Kt��"���7n�M�j��_�u�F�){R�*K(��r�
�bƄixn�wy����u�wpMc~��H�9_�$�j���Ăeb��Eb�8q؞��<�Ϝ��[�I/|e��<��^�ž-pM(+pK)-vNz^��[��R��X�[EP��ѕ�n�h�r:��m�__�P6���,�/c:��{cѻ���a3���I��8MC9i���i#���/&&�/"��YM�T8@�Tv!v}=B��[��8!���Ԅ(���h��� +S��'�'��ZGL��� +ߏ�@(�G���J,�x��f�%�?�[n��3o�x��J(`�{/<�P�k}��\�����5���Ǖ�2�J������J���R�D�]�ʹ������ǿ� \�/�JĔ��Ih���)7��Č�ˉi�V�Ƭ!���H̜��X�a?
gb#�<l�0UnW@��/�����S�K����.ǽ�w�-+t�-�P^����9����{�\� +P>}��I���{F��q�+ש���导 9b,��~~?�1?����Qq�Bb6�9�6s6���%�,Q'�-2$f-���sԉ����b�N(�˱e��[n�����AQ���z\����,��#��h�w +~AX��{Ǩ�7�Qo����5F�~���[�i'������<9g�����84�b42��!7��5v91k�:b�̽Ē5b��S����� �sR�̥$1s�1CQ��=� +m_b�{�;�����p��s[�?rG��]��<�#���5��Su�CT[�S<̹�ZǴ�*���z�䷥N�K����r{����_��еx���M��EL�G ͫih�M���^�OLDc8 �F-"f�_��m#�0k+�OU����&ļ��Ă}��}bO����
fO�v��6C���@�_�X���&<��M`�{���е=|�${�j\i�����1���1���!6��s������ܮY�f�����|�|�j��"�8r���(���'��=q�=�����(������������$�h��t�5�XÕX��B�W�!������y�z�����T�p+���®7N犓��#=�I�z�\��3=?�E�!��7֪1>���2{܇}|yY��d֬u�v-��`DT���Z6N ��E����(��G9��4�9]N]�b�EĴqPnD�䕄�t��iJkL ���Ă
'��{������ +G�%Ej�p����[�&�/�q(LDׂ�����/��%-t*Ĭ�j(W( +3Q���
�L4��\�;k71g�^b�� +1w�1oM,�x�X��J�����mt+�!�y����/��~��W�m�������zy���,��L/*t�~��M�/�~��9�m� +�VsP=^���X�aM,�fF,Y�#��C�C�r��5耚���;{;Ă�4�`��X�z�X�H��c��G��o���7[��SV������
z9����Hu�ч:D�l̊M}����'�TӵӞ�(�ڈԲ2ې� +���b��}�A���xm#��L��y2����8���ᯀA _N1a��h>*SG��DL�����@�X����������s�����[xR�1�lw��f�읶=�k����;.=�ǯ|�j.�b-�j�;k��;-�R�e��(�lc|$�9��5w-t�=�QZb���!j��9��S���A���4�������C|2V5��;e-�p��F����!����r���};r���1�<ގ^w���u�y#�x�����<~�o��-��Fo���ӣb¾�ܚ}��n��"��f�ln�f-��S� t�8�n'�r�.V�D +�H����K7�h���x�m�|�m>P�i4q��.�`�O{�� ��o���������턶�:�Q�>F2�Q��Ad�1W|*l��9w����0w�����I��Z���T�1�z�!1g������ؔG8a�Iˉ�[��f�$��Am� ������A���I�_9K�O�a��j9R��#u�sz����`��3��N�q���ad�C���R�7�+�8L����?rּ6�B7�ϭ��9J���-Ե��G�,?�d�b5�����Wc$�}'��ٛ��t��I�����mL��uLnc��2@�]hP�1vQ��u�Eyq��\b��y�ԉ��B,X�C�ӳ!���5|�w��ݷ���Z%��'�/�=<_(8�:V�偢�+N�i*���p#^:X�4��zm�9�(E��G���i��9QW��H���v5z��-���������^��^��-�e�D�A�Lx�v�N��U�I6�͌-j>!~_z�(k`���7u2�C���Q]���A*��A����sY�,ۋy��~LE5c�:�����7i%���}����s�(_�
Qݥ�|s��
��ܠe{m�vMb�
����Fz��9�i�L�n�M>ԛ+�>�TpB����������S1x���vl4���яԳv���g$��y1f������� �'�N�ﻤ̣�v1�K_7^��\����gd7U�l���zg��6�-����~��b�<�k37˶ ��Ҁa*��٪/��j��^��8���{��6w��z?Ӂ�X�c�[<�ھ���o��W�����S��FwIi�3�; &m�tTu��;�����_����?4
�߭�]��Ab�7�Y���>� �z��)n&����/m)[��8����)�1)-=%�i�[ydf�~2�d���B��Q�a�m�� �w�0� +�W��T#V�X�-o���[���ш_��� +���( u�a���i��
����� �RgRb��6I3i���h�s�S��i��<mT�x��Xb*'����nqs�1���� ���G� ���W{m,��]��U��/`\��Q�4%O���V����0.)v��W[���s�}�t����3gh����k�%�zI̘�DL�� +�$�*�j��wp�h���ns���뚹�PV6 4
%���<�B�du�g��s@Bh�h*�7�{�y�O�ih����Z��߀"DR3yӳvM�R�z\[�I����3��6]ӻ�GE�>���>� �(�+��?�"�7����O�\�SE��|���K�g]l�yf���B�-a6�2W�{w�aJ�fû?Ԍ�U6�+]o�1�U����9�qF����}��.�+��e�3���r�)���M��1�� 3C� +Sٺ�ضd9�g�VB�;��hx�
��$}��;�b�ݥ%�_#>��w�i�F>�էE�?\C���am�g��)sh�x�o�g����a����&�75�ɇ�y�����������lQ�a~� ������&�V�I������m������· lg��ag���Sח���s�Uܧ�Ц���_J�l��i��.����ٍ�\nH�Sݩ���:B���dAf�*�}�xhf�n1s�r��B�tqгM´�Tj�� �j/��r +��1���[��\9&cf�����
W���_������:�q������/<7�./5ܜc��\��zᕁ���n\G���eB^�T>�f�Xrr6��k�z{^�����������>�����s3�g���[��p_���R4��g�>�/�:��/w��sE�gb�Tw(�ڝ�an��^I�rz��-_o[_n�n6�HO��^��=��Zl����p�/wb^�g>E��"&ՌᓪF�N��,���]��x���_��/��Ž�g���
�ݟ}��
���Ӟ��=��_������(�; ��y��X`~�������P���?��)����u��٣{�<<+?��W�Y<~�f��t�y�f�~Q�
I�օ�Z{��Xr�I�:c����5[��ܺv#�ظ�r!:�N�d�X!G%ڪ ŎČ +I����,�Dh%�'�y�矩
����)|r�����F���{�k($U��3j��Own|����ܐG��}oߋ�4)��L���:�����ۙ���\�:��� �'��]{�e�iG����*����5����7i6�ݩqٸOs@`�9Kmx���K4�l�4���h�������W>9�3����0�g8rm���p�O���o��V/kDc�%i��W8Jɫ�,��J��x����&�K/��<\���wW��O����p�ز��.�u7�rmO7qO7�}?^u~�P�7�;~o�x���p��Vx�{?��ׁ��?,&n�����m<�0�{͞�O�܇��ckF�����e
�B��4�f�0M�gU.�܊p�7w���<.<ˆ�-!�t�x~���� )�&Yue���&���������<��w����?{�~�aNC��b������_�c�,�|��j���e����%ڞn���G�2l���p���L���\���}�˵=?n�:���t�͎{=�4��-�,q��Y7{�f��]�vi\�{hv�c����nޒ��C����������'�;B{�3��Z�֟���sZ�{�@s�����b�����\t��P>4[<���p���KgI�͓��%��J�\}j���R��?yr���
�c/f����p
��ډ|y�,]ۧ��s?{�7� Н��{��w��+�-���y�w�/uE��{dXy�1�n� +�af�OĬ?t_䲾��#eq`���8^�o���x��?�w��_���-���x1�f�2�'Q~���+X~ew��r���R������l]��[�?y~������+�8zZc���p�\�bɅ��y�� 3��oM=�o�t�����.fvNK������_�WLb+F�1�|D�-�>ڑb��Y��gh���%��/6`���?�Շ�g�Q��O�~��7}�Jd�__���&b~Mx�[����2;����G��z���m��į;��0�ܡ��h��c����T�I����*m�W����Iɖ;6�k6/ޠٵi�K��C�kt���>�Ֆѹ#��4[mp�%����h�'78I�7C������qjp�p��E +07'�s{f�-�6A� �|f�x�th&��l���d�8��
s�Rũ���{��(����/����]�g�������|�<R���x�Ϟ��g�Œ�Ybv����B�ٿ�����U�����OV��Gs�
�\��[���l�~�Z_vq��>QW|y�>�i����f��՚=[�k���K�c�Y���I�p�4:���a�L%�d~S���D�v/�so��X0J�N�����
7��57������n��ۤ���Bj��Txn6X|Z���vl<⤘�4�4uRY=��r����bV�DҒLi�G���Q�v��S��|��P3�N�y<s�Ш�J�Ɯ4������[K����\����G{�"�줬��X/��ݩ;��^n����o��]/�H%��B�:B�7;���!�ɤa͝�~�4���x�^��� ��J�
��"T���s���?����r�;�7W���Vr���W�'�W0���rr���̏C�ڑ:����\j���=�l�?Y��w�+�:h�f������FI%�3�M)��Ng�r�����k������GZ����>�V4�����[+���OҸ���Q��f�B���*]���l=n�]_!6��o��I�{�f8�N��r���p�0��>��ҍo}�G�ӌ�>+7~�q���>��,]}��� +��&���Z8��~���g��]�yb�f�m}D��������r�'�K���'wD.�g��>�ېnd��\�1f�c*F�!�q4��U��x��`��ta�����E���Ο��M7�����p�Ef���ʘb!�s����,�/D�+���qRJ���~t��꣄��BB��_;Z������,��nq@�Hs1�� �\�.\�7ۡ�!�uN#VQ�s�?]��x����!1�`$4\�3�=WՋ_�3_�P#@3��*?=_,�t�����Jhπ
³:�?��+w�/{uݯ6a�@�L&6{���:y���.���,pw�Y-�� �t`&l\d���� +F���e�u0���ӟ�M��l
������|Z>�E�ia�vЊ��br��0q�p�����ä��ˡKM%���U
ߴ������Q(�0�B�)�o-j�x��f��Ģ3�gQW�FZB۟;\b�@.�j�.2���<;1����2Gz�)����V���4�I&��'p��{�%�␉q�2)1o��Z:��x_�B�[.==zu,���4��gB��"ҌJ�t��!�>�=_o_�X��6�]��K�����;B�b�������Xf�R��`��x��S�0��o�Ġ�a�!bf�D>�t��O1�ut�<��
5'����Q<�d
0� +�"V�����&���x+�n�>��f�r3}@��_9ZN���H�H�V~f�x��6�۷A7Q��j��u�Tmi�U_Zf'�}�'���x�V�ϙF҆lxo֨���Ո��/ʟ��jx� +�~̗�Z��,>vNb+G�Wŧ5�C��_�o�}�~͆y�5���h��t�hWV�����ri�C*!������A����/��?�g���������*'���<�@�6�G?[c8�l8�R�+/-&���������}���!y���=|��9w�'Kk������Հ;��z0��i�{]��E┱<@L�e1=�lN>0���īd�M(O���Yʱ�� +F��l-e�L� +)�NBD��> � +�)����1�K/��lM,��.g�p��֗�'��A�W`�����1�zW�N�"�L~�p������h��եc1�-��BR�b�tLU���'=)�9�.�{�Q�x)�����7W�.e��=s�s���b�.����\��mRF�N�N`��۟m����������3���xm�����$j��B;.4��[�4炒��p\�D+WO��<;5���lX�V����ͼ��-��:G�ș�BB�h��CK�8��jF-�}��3��P4�}">����y�<hI]�vB��|Sl�}ǗI����~���)\�7�����0wg��o^�{_��7�] +?�w�^�o���+��UN�N� Lf��9�9U���C˛4���GH�I6�_�i�3(�~�������e�k!(� +�`��O6��m�Y5�r�����]�o���S7Y-�����bh�-mP�k��� +����-�s^�6S�>��Aq�g7�����{_��Sѩ�bH���e˱��e���R�%|��rݽuЊG
��4h���%�)�7bF�$1�k2��U�.��^m����k�z����t��y+X�Jr����=Z����y�9�S)�(��P<��Z��]r�7n��Ǟ���J�#w�'���T�k�fȮ���]Y)v}�Cn�����:��Xn#��`�n��E�:���w<�"��.��� +� +���:b��W8���s\���~������c��#/�8P�3���]9JT�-��4��;���p�g^{��;��'h2z*�,��8�B|�(褋%��7��]z)(��'��cv��1��T�`�A�q3��4z��z����ۂ7���+ҟ,91G9��&�����Bs���~e��T�5Z�����H�s��/Z��0bڰ��{�Q�}����F���.��W^b��E|B�=4�Ÿ|���Y�ʲCn�ރ����g�� 'g��=��A��`챘1 +�||�O.�'�
9����:&�v]�ӝ�·Q��� +g��
�_�֛��r��z+�������5#t~�M���脢'B���,���VC�B�w���wB���Z9^�?l�u���Zse����E|��3�XP:��[>� +G.��#�F���P��_�䝜�䜚A���S�+@����q
a[:)�\>ؿ��x�����Zzu1�_�h���� �`^����Pw��9����z[�k�������]-��:��CB��s�/�J��I��n�1t<q��z��]�<�w��2v����E���`������B��B�]VS]�/�]\��?�n�q/������{���������T��h���N>�9�Ӊ�S���w`w�=�w�{��M�w7�Z�塾foxs��<!(� +q��Y1��JA��!�6Xwj\�H���Ah�B���Y�u?ګ�x���8������1`gʷ��'X�-���-�b�9��
Q��;0NHS�`��D��9#HS���l��`@$���c�W�X!�qt�q�f�$T����r +�:���I����K��.;1�+u�'rd�e �,g�,��CLZ��jy��tf�|��5^w��%Ь�y4��F�ژ��)��0�e� +�jط�l5�x��H�\��{n~m�<�n�y��<�Fw�����;��������k1
M5�m���;]�d���>4u�_�n�w�̓�5Ӄ��j�\��z�rZ�$�?����Tk��k��*f'��a=\0�X쉅��즩��Z�
k��ŅB��]����cy�2��{��5�w�#v�NR�����!&zz5��,��#>S���l!�6J`�09(e8|4X�ħ�j���4M���Rl�w���t��:0~H�>��y��r}���7�)��(�g���e���h�ޠW +-n)��Q`�|3���rR� +'����/�����L�,#��}�-_� Uc�k�]h���+�����,�q�1�f"�;d��a��b��I���Co�_��:^-� �mb�!�h|�����>ŧ*����3�`K����#�� Y�c�ƣ�؉��|k�r����k V"��b�� +�y��<pVR�1;K/H�,f��O��re�}��n�/�&�� O��
ɷ�Q�����H?��b>Y.�
"j�;��V���-�*I
����`T�]_�F��}�T��&>���B��b$��#�m����#�=�Y�uo�1�q�!,��7�a�O:�����덧�(��+/��-�;�����r-;Kl�b#��2��βp�ZT�̥�����&6��!bg�O;+���2�+;+�
;+a��b����TYގ���충��9 X`��b�>&��@�gu�̞�j��f�R!g ��_qe}��������l�]K%"ێ�d!����Vқ&�G?\%�������&�9�`�/��j5�"��~��]��g5y`�0������˩�N�#"��~��E�i.��?�'J���W6�����U�A�-�$2\7Q-��/�,n��'%��ZFN�%��[q}/\���������d�쬤��Y�6Fbg�Y���\������������^�!�~�Zuj�OA�l��<�[S=�vt鱷|��x,�KCZ����a��Z�r���ŖO7˝v�n��[<��p>�j�Ng�/���Jh��ܣZzy1��j�������1���14͖�kS���6#�X-k�K��Y���l���wWN���d����e�'Yq!y�߰��_s��J%]s�ʳK�ܚ��s[���Ӌ��wWJ/,�R����bX��r:�ţ�V���&nLQ�3~�C����rÑ�լ���� +�0��-p���Ď����F{�` ��2��8A��u"�sx.���ri�,�_�]�}�ᚊE��bX��N4���#vR�M��J'�=��[{�L�O�6D;��5��L +8?bݵed�`ˤS,�+�~��)��y��Ԟ'�~�e��Op�<��dN���������=�2l�/%Կ��o�l-�Y���}���`g��g`�C*�)euO���@=����V�Y��>�{�{b��|;K>��������oe1ߐ�<�rM���lA>,��Z�eﻸk�\�=�X�sԆk���'�-�\�F�X} +�]���쎩`nȅ31cB}���D�+��Q��rL��aĀa��T�[��b�G�ڋI��#S�.���=��g&�߈�"�q`Ả%��w| +��4�R����TՐ\>���� ��X�f5�}�� /*�rٵ��<��>����t���/.FOC��j���(v?�!�DZ굲�WĨɮ�D�/pސ�E䏠~¿��Ć;��n�m�"�^[�|\��h�w}P�����bR�8�Ҕ��Y���c�x��U�1l# k��61����Y���=
�@� 8�C�ڋK��똍m��P�B=���;�
W���=�����bkT�d�|��m��G<�;w���F��Þ�Z~m)��L�)�}���Ih�����>2<�z��`��^3|���>��K�ص/陃�nRp�p���\����nTR��錡�˩�a������6�C��z��4:�Q#�C~��%���%X=9L�̈����R�3|+�_"&Qō����׀9��9�Z�(18� +�-\O��eb�E��#F�!�6�!�e�+E����z��j��zۘ%�k�ƞ1�Ä]_[����!���o�ƻ�ܒ���\C��%�{���7�Ǖ�2
�k����K��{9$�F<k�$֍Ź��7�s_+J�מb�M��A���W���o�Z?ߪ��#�9��,磜����/�Pr�OK<zs��b'�����b��f��(&��Y?�\JI.MyJ��I��vg�b��o���;z}�8��uJ�9��Taq�|^Q;ΰ�#n�7�)F�u/V��/����-��Oh%�X*�����3q��>0 +X�Qv�_�����A`m�
�v|�l�G�d�2��j�/A>B�j0��f����;�/'O�g�.�s��C���9|Nj�|ۣM�yJ9�%�UB������~�=ҁ��zb}%�:���q���|��������]�~�E���z���J��Ib���֘�o�2��я�����M9r�4�#��?��I.���'[�
�-PK�[��L81��ř��2�?e��*���6N���ƫ+Ď϶J���>���a�)��q�X,+�s�Z>^��O�5���'c�I���|͙�\ǧ���r�?X�YT1<�|L1"�F)�C|8�!��)���k�&V��6�G��>�C�.�M��k���_��R�S����Jb�9�����)��c5��y�F�K{�k5�:N�<� �]\w�I�o���J�)6d�`L�k��uL�Y92�VE<o��� +xZ�qfK-읅�XWx�/V���C���<����e�t�,��j'ǜ(��|���0Lg� �bf1�U�>�ܢG�Z:�XM��YA�W�LX�5.�\3�#�O��#�X�賳5�$�k����'ȋ`��Z%4���9����Z����>�'~(����O�T<��JYN>���� +n"�8/��E9���W���i�*.,!&8{�ґΙd��������kĤ'�s��p���XO�� +��'\{�ۭ�K�yH'�;
�r�����1���ݻ9���8���#Q���i]_]�_oooooooooooooooooooooooooooooooooooooooo�??�����/��^�g?��u������X{�9>�\b�v��DžDE��&;oė��9�]�����K��Y�b���M��]\ٿ�3ط8/f?�|����˴�~���M�ՙ}��36$8$�}Q��h��M��~ɺ
�V,]�b����W�Z�z�u����KW-_��_��/������������%��/��/9d/�G�{�op���Y�;��ǘ�Ş������d����~p����~ٮ�����$wg��^q^�Lo���?^�:�W-_�v���y��ڕ���oO`?��I�Z:����������̡W�[��y���k�ً���\��4��]���l���AsO�������g��>wY�g�V��h��Cf��,k�9�2��A��ڀ+/5�|���f��}�=�ƃ3�0Ƙ{�������].ޚ}{�4�@�22�������"rm������)V�Z�σ�>���,���ô�I���>��ݼ
�w�4�����Z��l��Q߿ߗ~�[ +1ヒ�!ebH��"cv�4��cԕdz�s�0�L�-��Gc���8z�qLC~�t��`�?c�`<�'�i����˪��1��29"Ö$(�g%4�F��DI�x�I�4 ~#H����A�����X����!I"Dgؑ4B`��#żьS��!Gi! � +#��c�!���$
�n!�V��8
o�ǒ�$���t�KBBU��5���D�ㇱ��b��W�WKO.0dwO�(��b&��[AZ��{���l�߃�P\��#�I�(�}��70C�l�$�9�qU��c��Z'!8{��!���Rt����8>����dM�h�&�>> �L8>O��!����f�K��G�2�CF2̞�Af^Z?3w/U�%F�p�s<�_� +�ݞ�/���荡��t��i0>-���c�v@����9��V�dk9�r�W=Z�(��́h�6�Y���s� i^_3H�u@�H�`)�-��$k54���5B�/�Y����Վ�qs={��5�+I5NjF�dCN�3��N�g$9��R'؏�hÇ$Z��-�����@�"��������jCf�D���lG�L��HI��Ә�I��e:l�'�n�1&���dgH*s�dI2�u�d��w� +�}B,�H+��˲c3G`�Ҙql +�|�<%(Æ$���N�ȕ�T�$�g� +�[C��Fq������b`�$�$f E�12o(=�H���Ԑxt��i'Fe���1�9"��И^r�8s��T�����������6c�Q�4IE1y#tv/�=��q�g���̄���"�mi�$��ѐ�>]�/%�&�Q����F�xA�VRz�d)"��K4߳ݍ��=��֛!�R+G[��0v/�,9���C�x�wф�1FZ�dL`"[��f^�Q�U�>ȵ���0~#D��~�`�-���2{Y���H��6:C��d)0�����A��O(F�L�Ր��HK�����h����O���k�&Ռ5Ė;��vjX�
FQ�)��$�:�Xc�UJ��Q1Hf`T��[Bc��@�<I�Nj\�#FIJ/�a,ݧ�� r��eu�(6FQ�dv]!A�|/�EE�����49�@%)����t��g� ���il��d�31*���Tv�İ��;���Gct�Ə1Z��7�=4�_4���eCB�5�x��m?��E�X��i�4:Jc�G�� +N��ZS�fC��4�78��� +���Y�S �c��E�1Y#��)5�q碞� +F�0��0QN�K��ϴ%lI
�NŨ��Q;^����
YW�UH��Fv/a��a>� y +18� +�n���]���Ը��j ��-��5�5z�=��$�?�Jo2��!ف�a��f�_�a��gwO��[0S���,���oC^6��&Ya�k#R4���^s�H�/�`��P1rC�Ձ�W�Y?�]{5�n�`l&8ǖ<ɠ��K2��G�a)��HPb�G�7BjTM��H�Z�9c���-9��'��4���4�<���ӆ�|Xb
���Ҩ4�ojڱ����c�Z�;��S!)����Q�/,�oRKNχ/2$�8B +K����-��[�!��a4UM-�.-'�ɐA� +�9�N��$� +˅��l;���|�Wl�(\K>��Ƌ�����c,�~���f ��%f�o���Zht�����_���JQgA���#�//�,6��2U�k�W�Gb���V>H�QH�����y@��SH�#����_L�H��'fB^� +��AՂ�YRt�|*d��7h�<~���j +�����M�������z�����f�\�������P@֜�<7�dX��;X;�(�L��l���⭰�HJ��M���X��n��Qd�V���C[&���|b�֣t�>q���G��+�����$!����dk��c`�`���Q@G�:ct�K�j���$�xm���ps���Ps���C}�g���g!&�\�F)�����Rl�H�'e����f�E[�b,).Ʌ$[C�2�ZV��d��-ћ"��x�xK/��J���`�z����'��$��t)$}8$� �V��{�<��� ��g�i}��eVO�:mqӟ��u��n�&���S��c-�%�7����R�+��JG. � +=�R`
�1�#�7�άC���ǧ@FИ�r���jT�-�O5�d� S o�5E���Y�d
9�NYn )��q�����*��ǒ�e1��
`��g���gK5W��$�\0�������~�'�|����"YP�v�.���dd���@מ��y|'�5��-�p����Ŕ8��R�Q�� ��x�2ڧ��4�q �B>?��j�
H�5�p��c���$�ւ�z�Y\p���}��&[�~Vִ~�����^ +2�²m�%�S������Ȑq��D�ql-
�4�p(c8��joV�x�|4��J���������YC:�:��9%��|���R�����-i�1��%|'��,)�Q�/�2} +{��rzJe��'cv�t��ߐ +f��05���[A��i��ɇB��T�9B��P���S���:U�k��<=C5�j�!��$��Q;��咞Y|��-�>J,�~&�?5�PJ� ���{_�����Ax��O�K5wWB�P+�X�
�>X"���O�I���қ& ?B҆Cv\h�b��|+I����1Y�h7�G�-��� �=�.w<�)��w�\�I��ŕ��)�KI����K@���:S~�>��+����Kţ��u��k�ˀ]pכ�ufWXS��`u?Iȇ&G����d���hm2�G��)��Afud�ѷC��d��?�5$� A$��Sn-GW��_F���0d�a��q�c*G}��ͥ�L9��(% s8l��C
��W�f�v�ߙ^7A-=g��@�r���Q��H�$.o$���O�Z?Yǝ���/��_��ca^j�9����F�kE�X��OP~����)��G�ȩ�O����I�E_R�2z}�襰|���!Bo��b*���cLrC,e~�j�������}��C��e�@�1�ɓ�$Q�L�5B>�bj������#��_GA��6e +{����.Bۓ�|Ǔ-R�G�Hn%�Qh�d�L�k�/��B$��6�裆����[�����HR,,�V8e�z]D��8��&�����S.�\7���7ȵ�C�#c�F*�ͦz=�t���E����\|~�Psk�\ze��xl��4�'�{m��f��.�6j��q����&��@2���Y
�����`O�P��{��n�~
� +�/��gQ��[p�0Hq�6e��~GB��7���ݯ\~f����7H)(k���r�Ö����Վ�[��㐥��{S*�C����2�g^�H��'z�^�m$���������:��ߒ���^�G���F�9-S咡9�v^@us&�& �1�c@�_S~f!jz���b�D���ub�{�� +�����Q<��C)�H���g�)8a�O^�L����+#�^�'DW: ��w�D��;��9��3�4Ւ,�C��3��Օ,fC:M��X +߉�����F�ې4?��s�y�Kl� +�T���2�GDd�!�'�BL�(c8[�"��n#$D�Tq���?���0h��T
��s� ��f�<��ߑ���{3�AB�7�Z���Ppz��r)=RV��?8�p,'E&�}�I�����,䏥�k��G뀍2�]wLE����w�|{f�Q�B����Do���A�K�=7 @�g�|�w."�mI>��C��Og%�'B�/F������a}`���.��m����9��|H�0`!p@�֮��<Ѝ�'���( �'@M���5�}Q���,�[lV�o,%� +9p3|�I#�HP�M��w�5ҡ��F�7����䡤�ߴ��iE����p��p���J���QnQ}����f��9������J��ݵ�3!��{ +� ���$7Z=��Q�[���J��WWH_�A�~{(�d��K�f+=�����o=����p�������\��BB�_l $��q����G�D��L �P��.l�� +!!rMH�_��o��ւo����S��=a��{���l�X�I=�����G��L=:^-<7O��v���������JީYrF�da��=��Q��k�K8�>�[0��E�ԍE]��juԿ@x"�CM
Jn�* d�>!/+4|�F���E�AƝ���Ԫ!�{w{j\v�ո���xJ����S�|�
r��/GK�?cM�Dյ�8��[K���{W����?\���F���J'���Y�lȶ�8s���H�ߺ���b��"�w$D�p!!�.���W2�5[O<Ξ�\Ӑ�4ـ�P�����צ��`���X3���q梠o6|���O��� ��Θ�����;��)jQ�LH�n,O����_���-E����6��}���`�t��Z�q�$�ѻ�� �3-;� +��K�]��'��>�z�=`{������ݔ?�v=?�ƹ�`��s���k�߇4z���J��B�G+p`;�'��RQ����x�j$�����{Q�whO�䂵 T�Y*&w���=jM�K�|�r������R�_턽��|�m�~j�Y�W#3쌈#@����7�Vйb%�~ +�!c�g�p��ER�eWr�f`O�/aذG��v/qV>��yjL�H��ʴQ�X}j�Rsc���$� +�}|�j����T��Ǒ��G�[n��.�/}?�S�x��T���&����±��B`i��ov�)t>�&5|�V9ra�R88�����O���U`O{�����Y�J�B�Ӂ/G=�o�b�r|D�-^l�ld�Xx~pЄ��oc���i�$���՜["��1�P84�ߛ�*մ�sŶϷ���(w �_����`�N���߱vO]���9LZc�1[$y��S���?�AD���ӳpF +�/�D�3�Mg>P� ggu���YƊ+K���A�o�>��D+�Sa{C�Qଂ���L�ʁo�Pa�,�J�#D�
�32,��!�r�Ԍ��h��z���Ʃj٩�8�+ሜ����
�S}߷��Bd��1��;�>؈� $�ɷ�&��*>=��������8���4��*���W����u��Sn����R���V���u3s���cq&#b�O��;� �Q;������A�������؝�7B*��Ȅ�,��8pC��t���qvk������]��/�����|
�Y��J�氚a0.$��� +�� ���}TԔ��ӎ����c�
r] p��&c�{~bp*�}�c!<i8�m�윂=Z�>|���� 1��@w�Nb�e�tΠ�\��j�rF���Qy��o��<,2�Ne����D>�{��nE/���<�7*�,"tI.��g�X�E}����� +����[�Yc����cb��B��E�?`&���g�|/�壇��<CJ*M~�$�5�Fk�-'\ +�K����z��)ϭ83{ńgo�t|l�8/�~�b�������y���y��G���]��O6�q��y�:+��"���������ɄfIm��^[sh(���Fh�?�ΉP�̿��'P���u +}?,�N +-�:��c��(��}BMg���,�[��DY�g�Ef�r�)���S"�tMk?X)�r��c��7�1��gs A�����q@;�\�Tsg�����J�g�*n.�:��y�[a�8'��9��R���~��X9ru�M����@b�eW�H
���yXJ�x��sr�Q��0���r:��^��;����%�{v]� +��$@�
7V� +�wE�� bO���vM����3��˭B��5�oU� +Ŏ�A�QK/-��-�(0ӧ�y�m�7 +Gf����H+�w@�������q�X��\G�G�a�>^%$u��'HE�f ���P�^ +y'�s�Wgz�<]�u�v�o�����o�O��O��߂����u���_x��t���J�W��#}�K8�����<���L���A��֯�z��p�ͯ"|.>�7�=�Z�6t<�'v���|�&�W���b���v����o�S^��f�R~s)jE����ꉾ��}�����;�C�&`<�O��(���S<�t�I��J�n}{P��4X��M�r�[��m���&}�ۥ��j��߈"�����<�����՛��t�[A��g���+E��R5\}�{��ʵ��b�{��/ko�T��}O
�(���P��&i���z�@�XKK݁���-PA�R��+u���{�of�<�����w��z�k�4iʚ�{n����3�c�}�PG6GF�ٌ��q�W���i����s��mr�y
��f
M^i��3�ԑ��KkSC�Y`Yk����CDސ>q���3b���h����%K�g���S������у^�m�Ƃ.�~�,?l��v����|��,���XX���=�LPE���{�+;ω+k]�^�:�=-=!)���y��d>:7*�h;�l\����.�P��:���̨�.-������9E$A��5}��I���^t�ߔ.��ou�$���$�����
D9��Z��x���.�]E��v�2��E;P�"��yd�Qv��(�>�ٯ%���!L����v���C�����m�1����Í��p�e���I���9�ї��--��';�u3A<�&��,�i7뭒�z�"i����(&�|������˚/H_��tH�w��T�Y�*r2TvJ|�^��|��v� +��P�1<�~Z�Ck�tN�!��j���v����z)�7��nm +�]�N_\�f&z�xT��NX��苐x:,��u��������ģ!�~�mI��:J}�&�
&+�O�����϶x�����o��W_h���9Y�g/骼,�.�V���?�B"wTK�:�]�t��^A=����S�Z(2���֣E�tr��j#��>�:F�� ��}&��c�N!��jN?�2�o~5� +>S��0��[�=���CR��5U�oOU��!��N�5Β�=��#b�A�b�bP��� �
�{�4�͊l�8G����G�G[�=����[>;��=�7��x�'}" +�P��٨.C�i���(>��*~T����kх=ɻjG��/%ɍ:d����[�u�����>�ؓB����0ap� ��^Q���4�3�[wT���ٴ��ۢ���YQ���E�q��6�(�ۄ�U��:��q��և9�N���¤�]���o���gO��P�hE(��C�K_ ��%��:t���T��̕�lϊ�M����p��V>�x�-�����f��2�@G���-�h�q��iO���^�Zs�kbY#꒗��f�U��G������8��O,.ou2�(W���o��De�g$%�Β�:w���E���$��E���E���W=6ě^��fh�5v����ŵ���35�ҷW|?�a+��?��O�d谨�9@�W!����^���/��[C��.����*�0�*~��|�%>|t�G[%��"m�&�?��5N����A.�~3�z۸����&z�bc���A���^ZXc-)h1�ޯ�4-�3'u��'�س>�z�a#z�rR����I���q�%V��{8�'a��^uڈkj\E��^Ҷ���}%1G?��u^O=�{?�z�U�h�>P�Q �lp"^�Q坧��z/���1V�/�u�J�o�J:ל��Иw�5=�Xgn��HQ9:�'l��8����h�G|&RE�ym��A��1�� ߆b����"^�ǝd������]E2���`�g�V=���6a�ws�}FC��|)��e���) y���%��&K˞�qv]��εfg�v<L5m.Dq��ݎ��ZMD���ޔ;�5I_ל����$�;D��Pݭ>ǻr��%����U�#��k:�6J��]���C�k����� +�ػ����q���h��}���]�$õ������Wqdˈ3�c��~����#���$�~�3{�pV�����!,�|#?�n���7R�Yd��<�H��d���h���G��|٢�4V�[B��� �?� +��>������dM�9a÷#d_���'q��JW��_u�W��rF�p��P�1���ߏ�u\K̬�IH��M +i�����z�=#զ�~��KM��sg��+D��3Ī�a�䣝�q�C���?�����E���v�8?�K>\GE�lC�+��o���{����w`�ך���.*�� _����+~�igZS�#����s~�Ɣm���m���7aOG1Ic���R�=O��T��>4��V�8����7���5����y'4�fJ:�.M]g͇Ke�-���/�G���_���6�G߬�퍽TRRs9�|sB����j`���>I>1�<k9.y�b/yW�(~�bK�m'��&���A�Qƙ��{ɮ=?�t��t���4��[钞� ���1~��$�X�ߏr�3<㗌7�o��ǽ��N���8���qdǀ+Y�{���>�g[�6���Ht�AJ�V�6kyd�u'ɪ�I�Ѯ���ڲ�]Ze����n��1a�1ת�dw�b��"+[�K�.DDU48E��;ET�k��**\�T��\��
�L�o�J0~!i��{"Ú�8%x������w� ȇ�"ѣ:�#����-��%�{����A2�F�vP��$Í��OՑ�Ȁ��;H:\e6X+#;z��`�>`��
ǥm�$�uf��e>
��!͗3϶�\��}', ���p�� �p߭x玘��z���un��F����N���cQ�sdQ�s�:טB8�2k�㲫��ҫ}�jC��ކs+�U�F��h��FD���{}��w���*�|�ZJBͻ�bD�[O sG��+CZ��6��Q���]�����W_,%
��!5�����L��]�y�� �y�0��dPD����kM�8�y+�l��¢x��������¸mq�)�^� ����9������۶� ٷ-4ů981��Kv��-�n1��8��r��,�L|V�WP�!K��=ڝ+��Bw�H��.�o����N��'qu�+����Ю�オ��}�#��"���B��S��/�7����=�SXU`rbI@|v�_�[S,����Ț�iG��#����c��X�����v�w2#�B�C����;o]��-��Z�/��Ug}#��qBǫZ�����1��^1w\cJZ��2[���$��{�[����3���O�f�O���bCj/'$W��^+�u���?՜{�9#�h{�L:�.ܲ��L2�!��*i���b����!��k˶���m9�'�sS(H�|k5�,���}�ՙ��}�;�s;�r�̤�9f�>z��P�r��^�wsL�iS�E�kƐ��m'��"�s�2�=m'�m�I��"|���Xo^bd�obR�O�M�-�ɯ�Y�^��h�3�!�6fH�Q���+s��s��V�O}��Ǿ|�0�`�F�m�x�]��+qY������wS��c3b�/�^��I�К�)�
��[���nQS��d�%�t˕4Ϻ����)7�}����qjN�>�y�t�:ڲ�8ަ�0��=-3�)(ӫ!:�xWN�[�E��ǝ�o���:ڦ�A�]Wn�C{bbB�Ob@Sp +��=����|s�72���cxot�Qd�l�����e���� �/�a�j���|d0��n���*Cb�ڮ���܈!�G�����O�0��Z{<l�����R��*w�)|�w�7�����{OYv�_�u/��C%�(��'>-���-s�ʅ>���9b��1�#<J���k +N���S���|g��w��#���|�Ya�Klx[@��{U��{m����d��_�3���G����? �ݚ`�ރ`�M�u�ؼ� +a^�Y���> 1��'.�
����(������Ǣ����Wп=ku����y��)���r�8����l������,U��Y`>Ps�>_;n.�4w��}�����Ga�~��>�s�o��f�i�s�l��`���`��F�t�v�f������kf�`��1����s�{Ɗ~��ެ�T���/���{��2�跕.QOK�cҪ}��+/Ն���F���H�͎��,��bBt��x���2����Р�kkTBC�����p8���C>-W/���z�7�
��L3��;�0�t�A������a��k�дR�o�/���^�Z�0L�$0L��T��*�+��U�M�L�A�(���'i$�.�icty_��_g�����`�u�W�� ����p+�b]hR���ج�~���|e�/�^+��{\�!{S�}��'�c��w��7Ş����љU>q�5I���L�}�.�_�΄�Ɉ���;�١��F��Yn�^-�j�b�~�j�m~J^�?o���ڶV,Z��)`��"{W��R�w9 ��ϊ�I���o��?)��M����׀�[E`,���*��%>���
�ſ
��/��X|).��?��[�ػE>�/�z����y��;� +����/��[��'E> OJ<��zƿ|���O��"�؈�@�wMdBxe`|X���k5��v�ݬ�I���e��fvjܞ�asA~�Ɲ`��T�dzg�ڜ<�� +�����چ��8�?��{?���6�'B�:�ӕ��y����}��N�,y�fF���n��(4��;&�,(�xǵXT۷dơ�Օ0��
��b�m��e���r��j��778E��u�"S�-� +e0�k���`���߾W��?����P{�|�g�ǰ=3��x���ޟ��R������7k�V�v�1���m%���a?�d�q/�tmv���e�O�d�6���{�7�1l.�Ji{��V��P����W<�ϸ'��q)%q���d��̜��έ��/������?�P���9�c�}����c��v�d��Qw�ĩr�1�?36�-�.������?�����o�S���dT�y�=/�N|P��Q�/s���E�OMX,���Z_�U���J�pݪ��v;~zC���iL��|o|w"�O��
f*, +0Uq9���L�̞�֪y��G�(i�e6Q�o=`�"�� +}e#�נ��*���en����17a���g�������r���V����|%���x���d�P�Tǭ +�}��|����_�.��,��:P�}e��+{��#���-���#�]���Ω +�o��_~��)h�T��銪�pQ��S~�%��L��@e�z�2~�1i+�=�X��~:�`+�.��Δ��?��cI���H|{��Ť�"�Īb���w�)���Ş���y%�-��}��R�8�z\��L���X�I��n�_~�� �g���q����ipU����p��l�gms��Vh��x`�2���T�i��K���U$�` ��wLV�lx��",��[�]�}\�%��Y\B��������/0+/w�m|����#�Qf��s,\~ٶ�0�N��ۅ��8�3(�����sp��L3�g�9V�9�7�y��$`��`�vx�֊���8���q�LUm0w���&~<���8Y���b�-[�^���My[��/���oJ�[��ߔ��>Tx$�Ը%7�$�4��6Tx�����#Y����3t�S�m���Ϙ�����&�w��Yc�yW�9��U��7���o��o������3T�m����_&K7ف5�`��]�=�}���՚e�N�G��ᦼ@��>�X��;��S}�[lW�G2�sݍ�Y]u]ͮ��+=`-���X�N�߶͟m���x�,?(+� + �+8�f(,��-S�N����e`���m[��9;�}j@�䀹[�����`��;X� k�d�O[,����u�Z%��,;�X���.::�]hL9̽�`��{�=�1���=���=���=���-��g������̾9S������|C�E� +�@u�ئ��g��'È=��{������±�� ���`ެ�`�R,�v�<���x�Z^`��3X�},�v��1`���=��S՟0k�����Ǚ��Pߢ��g/��=�Ooz�]T��j����s�ɉŰNh�re�!E_]T�ì�3gӿ��\�0z)�X6q1��ˀ��R��A���ڦ +�ϐ�۷̞��L\}#<���f@��� +���DN��1����������x8Z�\��p{�PXT�nb�Ju��AC0���p3 } +�[n +6�`��g +[#{&�~���fԴ>0��QƆ;�����ߊ�kʉ��cך����Rbڛˉ'��R��b�c2��.D�8G&����
1��S�k�ư����i@��ٜ"��r�/g(-�9�|8U��:�S6�9K�25��z�x rh���"�g�j�O�=fV�O�ۜ��A��}��xUM�s��A��50k52&��ӼO�I�KI��У�ӭ�2Tϡ�嚏Q�Z����=���5���-v��3���# ����Y��|����m��3�#�D����y`��`�:C�A�X�;�U6Q`���
���l
*�����M�(nr��#�j��I;�'�p/�өh�^��ɚ��
���~���2���YZ��*�FFװ�u1"�6��2��bPڕsg�ڨ.��ƚ +l��z�"�$�ێ]W��0e�@�%�Zf�f-���}!M�w��(l���X�=vוxUN9ء���u����V������:P_J|
�Z/�b�Ql�j^D�j��<�������#��?8��iP��0=�nN=�lNJ���m�o;N��8%���8Da�����z�i���\+X����3�v+u���?X�wl<`�m�����`�j�~'
vb!r��>��B�ͬ�/թc���A����æ�f��s�E��oN��?\;J/����}�
o0ۍ+��!�5���e�$���F}���|o��*N��;�hq�3a폣To��o]DjM����x���%K���RUm0����Se�r0o�N�b� تkva~`��OU�]:]��V���1�gD��za�ָ���������?ڜ8�3Gu�3\����;#1��X������3�з�
�b��ڄ�1*fU�'���<���g��X��=w϶f�뾓�����b�8�'��yY�v�K��|�>�N��nS�-T�Vn�<��e�ZiwP����*���z���W���cm�k�1{5��m���������Y~�gLb��̫>,F4����@��y���}�lbt�m�9��9%��U��>�����CF�czL^c�n`��
�>Jt#�ժND��"r�2_|"j:��`���!�`����K��Z"p�Q5� �~+̛������m*�<�XSW��;h��4M~X� +��>��ł�������s>1ֆ-�42�����c^3c)a\Lz���*��`�x��
<�����킚߭��/�GƉ��3��c'/�p1?�q��Y�x4J *�`�/�c�/wwLDJŒ�W��!��^s*m�]��}��|�F��� +��W�r+r�>�l���*���- +0���V����9����/��Z��A�_���W��._�� �1�?j�Ïhr����^�&&KFO�[}%��ԃ1v!m���!������ɕ�yO���K.��?4�&m�r�u��CaB��G�l�?}�8(k%�X��4�����p6�,�h<Av���N>��{K��!����l�$�}������?��XΚ�,\��ڃ�����Ǭ�`X_Akt#e��м������Y�+��=-0� +3��8�2��;c%_q� +y��c����{���ѱf.����Ģ���MG��=� ���l�T����!#���c�� K�1�%K��h�}:d�˭Df���fE������Ʈ�v�z�Ap��^<jM4:p{+�FC�r���� +���*�?���q,����S������~�@����kq<�R������5^B�f^�������Iޏ�&�I���W��[��B=]`q����3��.�E��L�~�&�wيkj��~���b ����0��J�[�2ym%~���^��b����ڂ�W+�ٳ���c�JB��J쾗�>�ٓ�S�EM�؋�W���x7kt''uh��׃Y�bO���R������R
s��"JN#�AU��٠��9�[����g��{6v���,���%&!�x1��s��s�� +�^��\2g� *�s�l������|�D�d=-}��� ��x����\^(5�'|�� ���n��ݎ'<�&Ly��6�E�����4{]���%�w�<oDW���ie��e��ӊ2OIQ�9��Qm��s���u�4��7g���sZ(�߇����q��u���\��Y<M��9d0�����>���7ir���y$�09����0��Z�/c��� �I�)h��
tv�5m@��ؽB,;�'w��S�l�+ +V�6g=T,NyN��������C��ҏ�Ͱ�|,��.?���b�,8q���������O��&L����w#~|��B�*v�u<�3S�ٲ��1b�����jv�ެ�f���=`txw�C��{�n�}��uf��[f��0�1���2�͌�Q)c�y���1�%ch�t��I�1K{�� +��`��E@s�.`�� +�]���d.7��[��I|��=�T^��yA���bA�g-�{�,���Ba�Gu��l��"82Ix�uIQ�Y�`�`��\HQE����7�b>)sq�����e������Z&��$Un�^������Ss��kR�7�I��H������_����S�]��0��$vn�&�/��:FN���r�;��]+V��w#8�p[�qh/b�IU��~� ����k��i����o� +��!},���+y�=�rϘG�&C�<����C��a-�m���]�I��g>��7-A�G5A�M�� +]A�ӕ�)y������"?*��WοM@
�#�C�4aN��7�T13����W�:���=�Fg��ᙕ�¬���=Ā�ޮ�������� ��٤_�"��폧._Y��<��^��h�K>�z-͢��Gtm�C�<_O\~��:�A<�����7?�b��xh�*�-r�8��6�xg7�t�隊����vB�P����xVrB�8e���)j�t� +� �M��־C@k�~`l�e9�\��&9���✺4Md}\ �mE�/�SwKr�{ +}�m�3L��I�X��tH��7�.i�0��-��au���R����Ǡ��tY�:$��Oڨ��M�O��9B��������&��h�|�6����I������K�~7\�g +OLD�b���x"���C[��>X��������+�0��a\ ����xR�^2�]q�ψ� ����:ho�\��ڪ��k���8�)�W�|�|� +~>l:~A6C�| �~���au��a��OJ<��ͨ���a���鰈�WM���1e.�3;���oṟ�%O���V����W�/%���1n��庂�`��r�n�"�8���o{a���1&��1��c�s���� ��w�e�ذ��S{ω|sy+蓎��Y�([���IE��q<b%�y-<�1Q�k�$�ǝB��M{��}��kH��N�E��MZ�'�6�%O�m��E���<K\�E{�(��K Y�."���b�b<��f"���'���}Q�Ǖm2q�U�{_��y�Lp6q��6����wj��z��o%��Y��߾rX6aX>Y��6��ʯL�җ�"�nB{�$�n�k�䯡�N*�4 ��Y!��8�?M�=��}���xP�Q������j� +>�Swp�ՎHG�84�.�QO7b)M����}�A=v���YM\�����A��4!�u +���{�ɷ����>�Ľ�o��q��\����tԹ��8��^����p�칈��x����w����DO������G�ۍh� +�7bH�{��N�M"�2a<����Y��짏+\��U�#2�5�=���\<�_��m�����h��0�m�0��~��:��jYt�7�|X*�2z��~?��>t����T�I��D��U
��&�fb!wVb��Ve���Y�{y7�� �u9�`۪�`Ì�`��M`���СC@߈����c +p���z<��<� t�VF�A�_�m�ZD�?������`��~\���Tf�!<�]1�1{��Dp�r�zGr�F�l��YFy&�EL,�F�P��IBv��[\,�6��E� Ó���>��#���W� RJ��M�]V�[���C_��V��e�2��+���g�ģO���x�1��)���c�l�6-\ ����jF�o + +��b_lƣ�n$�������� +8DA?��E�tw�e���y���"v,p� �m�������z3g%��C�G���8�=}X��o܉�1a^��82?8��w�ؑ�߭e�=���G��{��J�L%j�����e�I�M��`�D�P����_�h
ڛ���o�-��_5�i����ӄ>��9��yÚ(߁��)����X`�ç�КWl%�rZ+��3w�YsM̜5������C���]�G���R^h
kK{�I�����ӊH��e�X9*�N13��'��q]��ѳć�ƙv/���%���K����I��� �1p�U<0w)��r��hP's;�>W*��j�ijZ5D7ĝ6� wP��&�x����h;B��� +r[��K9�HϘ�X�ݵ�[�������ba���h�*p���9�(c����Cjxl�va���G����K��T448`���@�@:�H�K ��0����,�����$�;�E�T�.��$�69ݺXV���oe�2��KX��<�DF<و�����Q[p�W��J�G\��A��^��6p���K�*���g���sփ�a.�{u�0�eI:���O���O�Ndy;A�V��ӱîck}��G�*��1h�4��QA��!�6����L0+9�� {�N�L�<���"���%�5��]���rF����K�W"�;��]Z����Cx�O�5�ףK�t�B�q��x�A �
k��!��w۰;C�حO��ز��{���&t�S�C���l?�r,�~�?�x��)ùfa��]�PAk¬���dv�w��.
� `dH�l�4�R�RĦ�|����E�����Xp�m����"������k�"���䭥"�mEl��d�^Y�{�ei�X!H*�&�j���^"��2��n<�r}��@��(���t�+��D�~��C=�6���]�e����~h��y�K'�A��\�=n6��ۉ�Fh/.~��=o��.�RB��IDF�&�ӫ��b�W�\a`�r�C�2�Eu4�f�)@|�����c�vK� +��j=\��BLy�����P��>(=L�j .aq�0
1���C�k��m�%4�B�XtH��8��S�^��ga}AB_A��fQ��3��Y���§�Ĺ��� �I�)��8��H醰:���S���������ǃ�I_�j��:'�t�C�xH�i3!���71\���F��V��n����(@5bF���!|c5y1}1b=��[{i��N��G���Q]Af�>4gÌB�3�='Q>�Pނ]�?D��Z�twM`-�j2�D^[�l14���9| � ��.<�8Fx�c�mu���U�%�>��Lh�Y:(Ѿ)Gq��^���'l�t
)`L����X��C�銛�VD,��g_[ƲT�㥼�t`� +:��:��tg�r�)r�GW|�������ዳ�w˭��}�Gǚ��F����%]�̻�"�^9�*߮'Ѿ|�� �=�(�5�0�|� k��0��*�Q�qZ<��n�k�tb��)�IFH�XrR�gqVѐk ��% -�� ��U�Ӥ�C,;��DĊB�%��O:E���:�Eq[r�Zjq���x3��!���zQ0�'�~�~�K�,C{"���6��*&bk9��7��8��j�� E����\���ع�i��g�L$���sR�o�9q�𰣒�1��B + N2��� �X��G��`��q�4�P�>S��*�ˈڅtP���� +��`���Ⱥ���nˌr��8���!�j>��X-X���jʻ���8৽' �l0��?uc�JaJ�n�1~Wd'oBB�HXˑ6�cQ!����Sy�v����ʎ��yfbvT��l�d.@1�(
p�SJH��)�hϨ9H�s�Ê۹�G�d<��<��V.c�s�Ӊ�.c�1�SD!V�{�*xu9���7��ҨGdT�S���̻�{�f'��_oZ<s���3'ӛ5R�
�z����7�Q,���[�%'�>=T�#�+af}�Q�1������Щh� +wI��j#����~#�g�n��f�V�{}X�j��`.
sH�-�����!&7�O#~)b��g��ay���6��� +�@�m�c�vHn6Ғ��zo=�.�K^�_�1�w��O�L�0:���+ظ���\gcG�*�� +��)!��!���D6��%���Î:�a���2g���`~�b���cc�c� +b��}�z3���������JGZ]#��q��T�|� +�a���@|��j�'��9cl��jt��x��zR�t+�K�;sω���dz��E9�,�U�rK��=i�S[�`��usB�־�����H���M���O$ ��OĎz�7���l��`�Q_8*�s)X�h�]+w�=vm
�崐�W�����7���'�TYa�@e�[$��̹@�'V�
�Eף����BTF�b1����$aZ�^���bМx�I�%w�E�c�}�87�
a�el�d�xv��0��F�'uu�@O���;�a3����4����wl������G,o�}�ue~<f~N�e�CH%�֤#mBvMUB|02�d�V���_�{�,6�J(ލg��G:��yb��%H@\����=��z>�ӫK��8Ehq\��9HY* +�[�tɜA"oА���m,�)��r�6`y�c���JS�O6��-���]��t�И��4�&"�}�e5O��!�R���|=��F*�C���ҕd�I2�����HQ�:���\�X�����g@|c�+{�s=XKƖ���>���$Y�\��Z��J�!�'¹�Q䓴P�9WU���(ӤS+��m�bs2��W��X������41�dΰ!�7h��-�:)�A��ظ��K�W���#��ĥ��C�2f2;�<�K��i8��S�;!vXi�#�ު�8�l����'nm��4*�Q/w�h�B�YmZ8�Q_��k�ȸ��iϸ��#O���®w�����k����|!��3�%���럵����������!q.d⤓� +V!߀����9�d�;_ꙶX�� +� +�Y���wע>D�%�N�#]>d��zmij��8��z�� +)k9�\�@qi^!����B��φ+#�%��1H�P� +�+��P�d#⨣�P�h[y�������T���t�$�A�4��������l��b˶��ni�;O�<�G��B�_I���5U�j2���j���I������G�7F������M�T��"�9�=靶 +V���f/D�gd{ig������X;�s�O���m!�y�1�j�6��"��E蜨��)kױH_^��p����A��a�����J��oA�ၹ+��a9���먘��Eiuڈ�Keu�"�#�ڪc˝Ǣ�������g��H +�--�_y��5q��[k�uC���wm��̮+��'�^�@k�|�s��uLü�uIV�9�� +圬^1��E��by�؊��X6��Sc�.�W����Ύ�A�96��E�ڍY�,طig#�,���{M{��G�X��{jg���'�al|Hp�J������B���SB�eR +m�(��eV�1vM�l�T���"�gBLo�{�r��F:[0N�����iH���5r��r�j:�h7�X�Ay�����Z=���,��L'�&Ҷ?Yܬ�PR�^�3�4���w؝
�Y��Gc�{�.�����j|H�yNB�Q⓮jgE/ s��� 刴����Ez&�c�N��
酡8$�;?�O���H;�����e�:NꖾP�b��'��3���{���4��Pt ��t,%^���/q������w"kߑ/w���x8���~~�-sbV#�&OB[=q��r�JӴJ�:[7e��w��;���߹�͚�;/}�������44�n)�E^ً��ϏAk£�R�Q�G�Y�B���� �����etT�n���.sQ�C�~�Յ1�L��h'���������t�g��c�O�64�/�]Kd�B�Dh}Q +8�|_l�Q|�X;��v/�u/�>7��q�|4��f��=b抽 �I�t��=�w����i��|�sA�(o�\���bٓ]���D��ֲ�m�I���u:���V�XܔC�2�&�7�R�4PN�� +P͊�Ч�_mCz�H;�����L�v��� +��T�0�h"[Z���j$D�R8��"�]��:��jר��N���3�X���>�j���N�:�$��� +p'�7,��YT���y�-����=\N��e��(�j���ƃ��jS�VS�,%����֣���g�,�?��v�a-���-%�ہy�\8���� +�@�F�Ͼ +k�-�E�\Arrۀ>x�����Pm�|�F������
�t���� ��'��� +hsn�1��e�6簇���1R|�4h�R\I� +-���&a��E�r�Y�{�E��qN~�,8[M��6M�N����4�pǘ�o��l|{+]�!�U����� |2�rl�T�Ĉ� c�b{@_�|�#zb�\�ej�U�{~H��BS}Kc$�kTg5O��a�=�%U������_����<?:J���T,(<�eT>�R⩹"�U����f��pҰ*C�S�/,��p +�$n�
x��� +�X���M�y߲oa4�ub�T>��l.��Rbc��̫�КU���x�
E�|� +���&Q�9����9M9��@rYԢ8{gmhm�~����rI'g����9��+�{AGk�b�ѩT���B��`t�P�F/��vu֬��!j����3����СV���a�
��փ-�<���L89vO��&�q���ڵP�d@���#DGp���m�����ľ��sc��fQ��l����@5{PC��ӧ�qE~��$�TO���м%��b�ģӱ�>@�
,.��Bž������f���1�Ƥ��3�灥D�d}�/ңkBĿ+�-�g�����u����&�+�� +�+��Ea�T���&���2﹤��8��Ix'���P��{ϸ��M� +�$������GA�P��6��|b�Gf�&I�5ko�/Л�|p;��{�a��G��u>�3�|�����M�39���.�;p�[yb���~Զ�1M�V�-��;��K����@O� �lI�{'a����ŢW�.rg�o�H���?��9��W��F�8�W�Sx�L]h:S=a�W̧���tnQ���N���>7�꼢fBp(�8�z��A���8�s�X�����{F��'�E�A�-d3/��8������=�uR=1�Bu�ɽ��ҵR����&V<5B�E�6��F��{` +��^����G O�v�6��)�f����&c�+t�A����_#�{�.��ƥ�㳩&8�f>�d"�Ӹ�I��3�g�s^�#���a�K���OTc��M:���;��|a��a�Wu*�Oe���F�;}���80��Gh�F��M�����_���������z|=�_���������z|=�_���������z|=�_���������z|=�_���������z|=��?���wl[g��Z�ۤ��z�bK���]�:�:��sW{�Z�`���u�����r<�m�o^��\o�ko[�y��,����7m����,���NכE^:oEzs�m�����������������m�K ��K�-�~��yK��}?o�9�,Z���^�pK��9����xz1}�{��7q����Yg���C�Lg��z�#�������c������ֻ����yr�-�����4���.����z�i�%�u��&n����$_��ͣ�8o��Ƒ<�Go�<=#=Q9Oo^o�3��y���D��\?9�%�����^H�n��������;������q���l���[z5_�\�|=n���u��ll��z���H�t6Ξ��O�~.X�`a��(��O^� +̆u持�Ș˶kX��F��.���ο����ڦ�����&�����x�X�a�r�4�9in0��u�͘ML���*�k����6�vӒ����9F�7���64�d�L�2 �����Kf���ʫ���%�l3%yf����9c��k����l���1�4vAҢ�I 2&Up�� @/% v�fnڴ�3a(g���M�h4U��M@
=[�{�h����_��������p��8�%�?%� _EG�~��W�G�(�����h����W���[�#b�҃|�g�0���n(郭Oo4K+Tr�FDK M`��k�Y
Ѽ�Go����yFn���{�E�������ރ��\�w��FP��ZȬ4,������������GIq�+��&���Lr�`m<�AA�=�R_����}�����;��3��*���a=�q����i�y��}p_3�-��nA)H@������D��M�9ߠI�t#>H(��(,����&�M��� ������������ĀL�M�3%�4�"2Fj�$c�k!�h���(l�=%?��s��-gAX�:D��;D��m��)� �YM���Q���ù��C�lܵ�f�F�����I��])C9���2�U�f�]Z���6�鰕H�p [���U��b��zK���.AEϨ!��i�� �_�.6�����s��RGH�c�!�z iP�I�IJ��7��;��p��[�����߱"7s�I�k�Ĵ���Ic����ë�%(�JX% +.�@ ��n}/�ծ@�&�C����
�P�� �@��w{Fcqd�D�DP����i�O�0eH��3z︧/m�AC/7�hh������]�� +��V��1g�|S��e.�i�'2��z���\p�42cC�G�G�C�����!s�F�T�b@$��-�-��X��� ���ʷi���� �\�����y��~J-|7�\-:� +��A��fZ�M��� bwhă-�TL�2�Z_�_<D�Fa.�yKp�b|��Rᝑ�hL�V��\aw�{���M�ԧ_B +��������7ƃ�
�q?@�n��4 �9����Ĺ��^�V�� �ٟ��E�� ���L~�` +d� v��b�_����� @=��7M�r��^��� ��c�O�NL��v6��y�Ki�+����u ���z��1�o��&%M ~��r�V(m{�ɵ .�A��8{Q(�
�
���3t)���"�<�`���qԞAzC~�����ݣ�Y +�Q>9chs#���vCJ@p�w�.%��"�N���m�G���Al
��CYchs9�����)�J���ИL4�|ż�&1o@,#R���oq�� +�7�]4�I�%�zM(�ß
�1gf�t�6���A���&�=��S�ч���s3A��䎆`v8�\P�7x(��@� ��M� y�@FϹG�@��\� LJ +�������� +0��;����$։�[�� +�!��w&�(�3��Me$WQXi��\�sc-��;k���$q�q�h� +:���SF�KWpU�d��ޢ�sH>�l�'s��֣�/i@��U�Xħ�\�{&
�o��F
���{�@�M����Br�q HT�!��������S��|b0 nǜ��ɵ F�
�j+�l �#�T]dAp�qze�����,��Pl +� 3���� ����%s�H��}�$�6#9���%c&�hP�L�<|��خ�_o�b"_��\��� � v>�1eV;{�9F|,��$��E���:D +�ڱ)�fq��#)����p+�1�T�Z���=��& +' +NQk!�#w���%�U6��R>��"�?w4�!�����l��e��֟(Y,����rE=!��.�v_�t�PܴV(�[
"�2FWB��!/��D �D\��K�^=���C�?=�O�8�˺���XƠ��02����Į0�����)9�㞾�"rN�?�ԍ�Mb������H��u��{�[����퍜dU W�=3(����/�&Bz�$���!u��l4y��~�G�q[`_�&�+�C�;#i�$Ԩ��z��h)�hQ �@��v�֣�,��S�∢o����}2P�h,�|���O �3��4Q��8p�%��<'~��s`���њ>jH���z��d}�S�e@"-���Z +�$_�j�JOS�}�G�)�J�$͡b@hxd*����)y�uנ"�+��M��k�l�l"�(Arf�7u�M�=�CQ_��D�9�?1B�4�v��9|K��x!N� gf�%/VqY
�sa�". +~c��s���+!L�G���<L�Hb�'�9��z�b~�j��i����G^}{)%������RGi��@��I��t@�ti�,��"Yi��,�)�?��U�:�|q��&���$�X�;}$�dl���C����9����o^O��;n�1��x�l!��T6��!��aO�.g�������T�y=����H�stA�+� +�Z >��E�LFrx��ք�1{����P���B�����I�F���H�a��x_�.���C�[�S-*E՛� ��S삷��Zb��r:ag�0�-�wF!?�ڔD쐒s�0�3��;��R�Q� +p�B)q�R�A�������]=��r,�%��/�T��y:͛����k
�5�|�5 �g �OςOT��[ʥ^��%�æÇ(H��m��C )#ʿ>��w��+��ȹ��9\܉��[� �4Ԯ�$�=�|@q��$���
Bnl +�+I�)�Lrׂ�����5b�ӵAƀ�H��&q�� �+��.�&%1���7o�'ٔ���Ƽ�sş�:0���S��T4É�y��� ��[!��<1�XO +-�@��I ��<��@p)��B.��,>B���m$W #D�آ�?�|}1�2���E���|��9oB�
8s�'_�| +vb�w��3����$_��[Zw���L�e<�+`��%nB���]T������'���69W�r����2*v�@��6����ݴ��V�+������9@� +�ȁfX�;h¿J��zG�$�5XG�� ˕[�hcm�G�$M��w'��O�
��]��%��HI��Q1Gԍ@�Gl +e ٥b1�z�����ER�� +�>�Wu"���k��?�{��l��M,�4ֳ�yjB�[�����`A�.K�<D)QO�(�SBx9j��� -FD�8P�$��˯_!&\�C��=c� �h_-/x�̢��G�4�.M �6��]�H�n���|֮�M�����'>��V�.i���f�vۤy5�>���������Q@�<ĺ��� ��k�.=�.et�J��:��@yw_����+�_b�JרA�~�ؚ|���к�G�� +~ +B-$֣�Lݽ�ɷ����*��3�?�.J�7�~������viQ�A�/i$�=�.0R�?�]���]�G�*�ݨ�Id�ۗ���M�!%�;RA2�P��7��djw�q��G +/}��-�Zͦ_�O���Q��^��<�=Ct����+Q?�1� +���9��=<ȩ!2/�+����� kE.�خibj�o1eHޯ�<�ȇ��)��/Bu�F�Y�ܐY��&Ⱘ�Z8@�,W�Ĩ�a
�LIs�����z!���j���!H +� 3��7�����Vt��y��̩����f�[j�a���%���\��]��C�o�輸��״>�ݫ/ƛ�k��Ц_�ܴq�Dg ���?@a���!�-2�/~��N��e\\�e_[� H�)|�}~A�j�h��^��uTJ<�qf>_�l +~G|*v�#v!��۟b��Y+-��I�.քI�g�j�s�-� �5��C��Gh��5J�<:�+�\��{m�(��ui1��$!�p,[յBr4��7�%�#*�1���I���#���!N +���d��W�3b\X�q.��`1�o��%j +�\��;5G�O�♝�C�_bѣ�B�ͅt?�� ��e�������so-�2�χ�Ck�`ϑ*"�;et��2��\����4%�i�u��1Ci�= ��㴆��]����w�0��Q[Q�7�sk~���I�����c3�Q{�Q��t:aj +/�@�."z�.��sK hA� +ˑ<��%���%
�����4?)m[�5A�O�����C����z��16g{H��>�� "�5��A��W�J,k�Ȧݞ�� +�},�RGY����t)��qJ����m���C[�[w|�2�S��&����qʤ�3 �˖?_Q��e%�yk�{|�Y5��c��7cjt�k�]��'��_�PD��#���?\ +�<�Kx�s� +�h3��}OWC��0�C���"%�O:8��Z���}�W�P��&a� +HQ +B}&��tE�����i��X���PG�� �fA�\wh�Ӈ}�ػ��sT_���:��yj*�_a0ಘj}�3̇@
�&y����_���:*rJ��~9��{�� �օ�OP�X�{b͏���qc�:{��{[K�a���bD��uY�h��#O�x�ܑ`�*=!�fp�P>��f�0��t֢8l�� +�O�
+QW��L�
��)�~2�,��ɧf��#g��0���UkQ�"�M����a�j=��G˄�k�i]��
��C�Mqn��iX+������7�����"�=f 1��~Y�/`�5
��a�n/b�_o�5-v%
U�8н��)b��]�96M�/KEg|3G�VD�>] +H�}#t��+}�&�M��?��~����w +�;F�ݣ��{QPG�Y:�쩷q�ڒ���j������>�!�>�t<�vs��h)���H^�iA|,p1��Rq=�����B� +�R�ԫ�{�A��Tz��xq��[ +Q\��� +��>Q��I4/��� ɉ��33���S�7b_R���|��%���d���O��L��P&�����oa/|�Յ��Kb��N��)� ��46��������W���&�uGԌ#K'P�D♢��Ol��t��5jDܰ�/����z�~u!�b�y��Pa��������O�XGb`l�ه�SL
!��Nce�&YE�J.��;��CYq� +�I����#�4.*;���כE-+�ݧ����EQ�$f-��:*ɏ��-F����#ŝ�ɧ��Kk��>�b�(�[��VN�"�U9�Ц��4�/�(�^���.�}��V.��B�+k�W4��:8�-{�F�h3��;�7��9�<��Q/ۧ�u@n{xګrh��w��QQ#��`O2|p�i�#.ͣ�#�~x"�xz�<�|.0�O���3}�"�x4z`�\]�P~��&��;c�����������o������g����φ������G_YH��ן�K7Zwp�$���F>������*��Kн��A̒�өB�y|i�Z��� +��:qky�ܺ��\̻�� +/{��P�{��RQ�x�3bʕ�ؗ�(~��F4�$؞�z���~cȕ�[ϕ<_�u< �D�\y�Jb�em?�ski]�O9?�SQٹ��+n_K +WұF��;O�����-i_iy�a���Ƕlů��;� �+�_�C�� +���kZ��g!�z��Oo�|��%���d?�^��0�_T�OM��כQ��ON!��h6�j<��<��D����MOv��]��Lq�7���_��[�����V��n��/���1\��@���;��3�6L�o +���c/|�K�%�J������mTM�ʂ���⧛�Ҷu����qU�^��?[%�k7���T!?� &\��\�*�p�2 e��Ψa���B֎�R!*�b��;�i�~oƟ~��;�R�V��S{��s;�`�BQ�a����Y��U��Ns��s�#c(?��D~�Wc��'3��f��N�=�ʂ?�!�'�%噦mVWkv�g����d�OV���ZM�`s\�y�K�������k��Nئ�j�Bu�^�*�6(��V��������Ě����Jy�5>�c����~e$?�a���'#űO&���*��[�^�+����7��3/��G�5��4����[��{�9j��~5����X~�g����^v�߬�W~��g�Rm�������.�ߡ<ޠ���qUo6������h\!�Hq��R8�Zɗ���_��`�_�|��V-3�^��Z��;ު�un�ז��*�H���~�P�of��v��1_�ڀ�??b]|쉩��f H��E�!�<�f����@,��-{�֢��ղ��������y��W��閛�u;�������I���e���WE�/�ܻO���B�kR��9�v|~8W��4Y|�"A�՜b��z��ʧ
��>J�_� +7_;J5;�k-����X����G.[����>W�.�|��W��^V�l�p��L�v��[�"��2��P3�:��2U�{,�>�`ky�� +�&[��-Ttmd�u�K�۬īO�W[\d���E~�{�J���]��ʑ��VŞ{��;m�[����m�;�����ݹoݸ�?;(n��Vq�7Kٵ_����ܣWn�統��qb�#��k��[�q��������0��],�S�δY�'[x������k�P��Du�������I8���G_�����c�Y�T��p鹵���㟌�#��ӝ�s����T��_m�����G];��\�����.ŕw��ؤ��VT�|!��{'N�쭶m\s���-�����cK����ͼ��N���n��˗���Vq��f6��P����˰�I}9����W��?�m~��� +����;u{��_ݣ,x��K97�����G3�]���_��ZT�e�,����ߖ�%7��:��'Uw��X�����N��͇~ҕ&g��6Q��4�Xe�ۍ��X����7L�D��7^�ߴTv�Sy�o6�۟���������/��?^� �[��_��p�EHjS�U�]�˳���3E�n�:������][���SyV���7I�ζ�I�r?ݸ��kmeU����X����fu�Q��|��p��={ꣂ��J��z[u�$K���v���N����@��[��vO�'n��'n��V�Z�{��V�j3��z孇���w��,�*^-�H8�o�״��ؿ�7��m����^|��z�(U��1U|�+�k��^�&��^�Y<�Wk���b%�������'�cK��sc�ݫ����d���{���;��D�~w�z}�"����O�xN��bgy�n���#7��z[��KթF���ܹ��J~��_�o��JW��.<s�w�ȏ�n$?���#���N����<Q�5�Z������x�˳�E�_�ʷ}w-W��8Nꨏk�����������!V��fn{{5����B���|����O�=ZK�Ug[~���}|!k�����ߌP��v�
�+'(J_�d�0���7�oC쒅\�`Z�i w��v�λ�6�o����N�������z����'���������'�o��md`ɰ���t�;��S����.Ϗ{�����q�Ȳ�&q�?ڮ������}��`��ӛ���;��m�ʣ"������:��\n����� 9�A��'�,?�JW~��j�������d�Ð����>�vk/�Q��}u:����\����}{ײ��>�g��(��(+z�qa +��MV�v)/t9�+�e�<�����9�˿q�g��v]��w^(�|ۘ!t��I/�c�����|٘��t��n��8�7S٥� +��3g�������ܫ�!�m//d��k��N�e�I�ㅦU����J�݆�mst��+��-��Ol�-oJ)��^Zd��T���t��g�����o���>�������فl�w�3,�}�鱿���b"�~F����B�ٙ|꽅��\�kCsOv(�C��[V>�)K����?)r�/Q���Q���Ų�6LY[$\xc-���Yf�\yʝ���s�?ʕOj÷��Th��r���6I|�e��6swkQQ䓤�'IE%��yQO�ʔ51��绬��W�����4��d���T6���3�e��͊���N|��X��՜�����L�͛��{W��k�g�7��{�K-��v�?�n&~j��������2ƥ�@�G������.�GJ�]��ٚ�����R��wyÿ9���65�ڽ����b�}���������&{���\�����a�;��RE�)w���T�J�_�a�r#�����m����*�l+��תz��М����YY�>�$ �����=)�}�o���?l�Nmx�ZK~�k�I��?�Lm`femhVrm\�[Ky����⇦�W����nq��\q��-�c�Ypgߊ���O�\���/Y��o�P۵[��-Yx�ſ|�|�$M�\��~x&���z�0��m���x`q���K/��&gUۃ���T��w�aM)%�ͱe�ګ�m{y9[��^���˹�_Ϸu$ǧ#37�qD��� +�.�ˎjH�U}��bR�-��?�n��{�p�(�y�Uy�t����aM�U˽$�ΚL�n�����ZyŻ�Ru�L:��Vy�u�t���k��(��D&�'�?V�Y?��n>s����EQ�R��_6pފB[k�gkI��#�Vo�_x3��]M��ks�ק�}۲� +����> /r�*Q���w=
u�:^ޖTќ���$D}�1 ��
���8]{䯾Z�w�&(��� u^mD�c�,�SG����z�-�z�"=|�->h���cn�k��]'d����ץ�4���D�&�%�/߄���0o�v�N�S�{Q9{�Ed<�"�U\�V[�H�M��c���n#��F������.���R�$=N>���H����9|K��P�hW���J���2?��[�y��?�^�wzYK`���㹊?^����v0{��.�w���9�������̼Ć�܂��Y��"���rܛK�<�Ks۫ժ7wRl^_R+ߴ�*_�&)۟���ئ8�o���?lm�j�<ڪ�\۫�_����Jֶ7�r�O���7��kL��:�m��ڬ��ɬ��=�ⱟ}�ɼ�����OoF�\�64��m�q
�>��L�G���7����x�2����������a�v�����ҽ��e��7ݒ��n��n��}7g������n��w{�5F�7F��%Ȩ�[ڒ�6��T�F�ݿo�j�}�7�9v�( +|�U�UST�(,Ϸ5�L��!Qhn
�v��OB�o[R<Z*��3�|� +��>w78ӻ9����y��u6�o�ؽ:�����,�i|YHSF���\�ٮ�@�u+�uv���<���ݞ�����4�P���x�����7?�'�6����
O~\�%-o�aʁq�k�W���}��GCrL}BnyM���=��{a���L���L��C���|�_��g[���֮ ������N� Q_{�y�Nh�����oC����ޏȱ}Ib�{���� y��o��W����'�c۞�O�q����� ���} +���mn�{����#��Z�r�y�]h�S�n��Ji�*�$�ސ�xh�����_v^�^e�2x�v7�uV�4�����0����,Y��Y�d53oя��%��yKL���@����������voP��T����ZL��Y���n�e�ߎP��J̉&����*Ox�&��U}�����.*H��+,����AX��r�"��,Z���������!����~�wڱN���-�F>/6�VYk(23��1{�2]f3���<���3�~���F�Y�Fd6K��UaZ�W�̔�㘱��1���.3D�ft/=f\�)���9��q����W2�Mݘ5��#7]�����[���O���m�ݟݬ��F��q�&0�V�_������ua99�Qy1
�Ea
���w�r��1
S�ߏ��x����E���/���P���ܦ6���=)d���.̠��dӁ?�l +<4���b�Q� ]ä�z~�����-68۽� ��U��d����ѓ=���F2:� +Q���y�zh�q27�Մ�O�κ[�ېX���'��'��s螎����$?ۓ�����U�̴1ӈ#�s�C�J�^�f +��=.lz�s�nH����C��Ee~�V�_�dF��s���������\S�/cڛ��K�0�Gb�E�wSe��U{��R�Ə���~m9S|%.���Ȝ�7���� +-|t+���&����м3�C�JoG��2���O�"�]������h�Am��̩�����
��9k�Әj|�]����P���H���`
]2NÉOKb�f��>3��df��$fh�Y�h�M̌�!���7�W��˿�Dp���Ą�����Sm�凫��mj�c�._YJ�|
0�>�[o���ۼ2��ӻ=3���n�
�/��`�dFk
����J��g��<�!^ �4��>3z�B�˙1ÿgF�\��[̌Йnj�3�6`3�����$��]�L^��YjY���@�4��n�֣I.��Ҁ�N\��*$��ٝ���"+:����ͣЊ�
!{�6��7��!�ZSd���������`�Fi�1C{�"?
&���O��X�K&0#{Mc�����7�1p3z�:�i�mf�%��2�_5���Fx}#(�Z|��K���o��=��Ww'���aP����yw�䝸�u���k����|��H���ݫg�]����?�&|D���|��/�#��|?���(��7d��_Č�]Č�3V=3~�)3f�3f�)3j�zf�w��qS9f�a�C`�Ϊ��s�W�2�$gQ�r'6���5�fٹ5j�3s�{�E��bf=��u�^P�F��ߺ�.sJќ�p9��C���~�/����=>�g��hd03Rs43��4f�й���?1������w0ّ�3v�Ȍ��`FO�3�'�0#G�g��f��\�fE���/�7�붵i=�VW�Tx)!������5�� +I�ϻq/P��aP�����M~y�5=*&5�{�r�b����S�6�z�y�{=��!����Ì�ό8�5l���ݡ���[ƌ��5|3b�O���M�b�M���s]��q̢m'������t��55�K�?u��?�z�jD��[���d��d=�
*���|X��1��y���� �Kĥ�}�������k��V����0�1�0-�!�y5�̹Z�s�Ad���>���g�k[��YB�s5�Ic�V��%n�wk}�f:_�LW3�m.j�H��ȕ���ٷ5^{n��F��Ȉ��{ϰ��u�{R��"vQ{/(vA���Xk�U� ґ�A���Rl� ņ]c��Xc�&{�[v�.�9g=�?H���u�����͙k�����˘���?�i���^wȹ���p�i�n\/���F���_4����t�Ӣ��w[=>3,�g�=n�7�{D*{�A� �Q䜆{�'��!۶�ߌ�3�,&H��j:��̰�K���9�iv,3nI3�s53ֽ��4�q��aFx�2T�̌�����q=c��xcX!���p��5���?:������;\*�|�xj�
7����4]!u�ÛytR�ÅJ�#��C�L��c�)͵�#��eJb��#��N� ���Ϗ$9��f��@r~���VNL�Q�7�G�I�@{���|ǩ���(f��8f��"fL`#3ʷ��u�إ�ՒÆ���$��}u�<�n熺�5��+�t���-ɹ}q������_�ɮ���ܖ7Oswܼ����Eic�oߥO�d��YO���ӗ���d���\�'c8�>�MF0��L�c5���ؠ3���Y:f����@f�_f�P7f�(OfЌf�2�j�Y�GM�l|d���0d�-�,�[�Ͽ�E=�^[uu}C�'�[���v����F�>�S���{�m�����A^�w��ڿ�U���M>� +'�y�ָ�������\H�a=�q�ƌr�!����N|�Rf�`�?��I��kÇ,b�
]�8re��V0�f��f��jf��L_q�xV���3�Z.8m���ˮfy�4(����8UQ~��a���M_^.�z�h�K%[�7~
S|l�
:N�+��I_=/ �����a�뚫�ٌ�_ϫ'�Y��^ҒfY��C�~d����#�x��(f�g3�%�;QŌ��q �r��T�@̛�:�� +f��5CÌsKa��0ӄ&�y�G&�꾱���a���R��
��������ˣ����gkķ���m길����ڦ�'��C�����~c�͛9_�ʮk�^�����������9=��2�����9������́� ��|�ؙ�����Ne���c����8������7�\��a�ɥ�
����!6��?o��~�oZ��<�{�/���4L\~���C��/�D�����?ܐ�e�9���5O�v�R���k�7��kx�y�混���}^����$߽��������mZ��a�Ȍ���7�=ُ���L�Q�̔���S�>3���s��e����y�tz�y�97-�j=�����k��f]�Ͳӆ���-=hpr�}:�}�a��}���C�� �b����w�5"g�y�%�s���m +A��,c���x"�'~be��.�3���/�_�Ҙ����A$������d�/Kf�q������cf��7q��g�����<�ۆ9�n���-�~�on������~�����f��o�.�z��m��×�6�"����_
!��ޥK?]-��� {W�����ƫ�c�+�/�K�|�� +���l��I��+Hs��P�쏡�W:��1�O��`�S�UC��������{X�L��=������*f����%���LU�3S�Әi�c���<3~�3a�'3e���媍楞�5?�����y����������ka�W�5?^�T��K��o�~�����M���r���s�
�R�AP�2����&J���K_�]�꣭�//l���U�p�m��s�����J���e�w6�����V�V��w�F;��7��U�=�<#���j3l�\f�� f�W<�1��|fa\����k��~j����A�4�[����b�o�r����U�?�f�~���J�_
+�
*�_
:��
�_^��4�x�|2�/���+������W}����yʢ��էA�7o�c_h���HS����_i
T0bD��Xn�v�C^<�J����ϴV�1�:��uؒq1ȅ7UM��5�K�E�y뾲]�nDlo�����o�������˞��4������Ê������,jl�U���nm��݅�����`p�:ep��i�T<1��^�ٷ��i�[+�����S���Xc���_O}����u>v.�����M��'�t���O>�6���Pzh�:w� ���^Sf)�a6c��Z�ۦ ɳH��g3f��8�/�}��o��t��)5�+�jH +��!����
\�M���!@��ξ5�}k�S�4H����M/�*ˎ:(:�sV��G����b��,�C�����*�N8��ߟ�w��-|�NRo�b&Wwn +�z~�p�^���5���ռЇ�T�g�
���-n��5�NO>C�\��}w�Fq� �\��?�˒��>&Ù��;�Q���Ì���L�f\������zѡ��~۰��'���b��s���;,����h��|������O6�o���_�^1(�6R$�0U�J3W���o9����+�|\.=~���<:�G�aòL���c ��76�֖
�5̓�}��^|/�.]}���FF�K���xp{�q�w��!��:���S��9���U{�F�_B��=�H̘2�e�K�� +��Y~�����A��!���!��k���]��_J�_ޕ������o��3w�L&0)�,��+o��kE���td=i��������������U]r��સh��f����8凿y�}%r�b��݇���_�b��2�>΄r���/nwZ-�����8C�^����B6q�UPV���f�E)̨!�4F���t�?�Ҍ�kB�����x����6r���P�s�)�
K|�fг�}�����T���u�o�7�ޟ��Y�p�u��/��ſkū�����n<-�N��r9m�����Q-2���j��<�_^ʖk�U��l��n�<����S8�Z�n�;�-l,���]�9Nj��(x�A���!7�����O�O|���=Wq{�]�5}1G���h���ָ�fojC����X�;�1ɝ���,J:�k���>�R_����[���� +�B����3���]��B�1�͵_�>N���b����@�2j(�`�0f�2��\�鲳�⃕��o$��Of�������^��=ѱBx�9X��o<����b��YB�Kw��'�x�e���n�ߗs�������_y)<|�����y��t�v�L��k�h�^3��}�<3O��X}���ޟ� +�ޖ`/N����ܫ����*������i���#���%A��-re�;ef
ư�^LXB�eTN����ʡ�:����ً��[����R������<�������v\��q��� +�G����AG~�P��0���̆�����ؘ3�����"�̗���dp�ފ�-��PU���|77������i��g��q$6�����8���m�7��a��%����q������y���2p���A�GUw8(�Qt�wVt�@]{~"��1�O��_�n,�wr��x��0��0*_�TJF�5f���BI�0��+3�M��Ro�ę���lv��9��W�����W2�W��e��z����Kw�����V�y�:���E��w����y����k�W����-�3�s��!K�+L�,�6�L�ޤ u� +ƭ�J_�'���D��J�7+R]2�An��f���Z��۰�g'�e��� + ��` +�z0�s\����,��^!ʎ+����0XV�o��A�o�-ù�s�ړ�uGNjk���t=�
�sG'm��@��0 +y��&��G�Կ�U3��x����9a�瓹���"��Ү0 +hy4E|�]�|���/�����>�R�����&p��L�U�yc'3K&�f��1!�p���B�����a�E}������Ob��|�aw�+��G/�ޗK��Nn�>'��7 +�e����b6����?�U[o��s�q yBn� +D�B���h���:݉a��7�Bˋ�l�W���w��v?Uu����g&�
NV���?���\�m�S}e��J�-��av���c��K̖.U0^J��4Q�o���a��3~�:��Շq���x-^ޣE#'{z2n��1>��Z�3}�IhJ�mHIǘв��
ҕ�G�����?����c_k��?��[�e�F�]?������2��W'V[��~w�]~�*}%�^�����̭=0�+�>�_�>��:�l�<��{����5ߘ���vn`���O�\��At�?tAW�C�?�����]CE[�+w�2�?��jz>[���?��} +��ja�k���T��e���0@*h&��2�[�5�P���;��7!�O�%r�~T�������Ru�O˄S��������q���.cS�� +i�\���և.¹����w*c�=�]���j�y�"�#�G���S +OZ�� +�Ɓ�m}�N��5g�j��U�flH���_i���̿��R�������{�uü ����� +� ?yɟ~)����+�렎+�P��^���`�����S6���G�R1�w$��[!��G�'�з"t������� +-��2k�����#$�2P����#kOL��n.ڟ.|�'�Z�����>�N�>
���"���Tվ7��B-�=���o����?����y!�?�UއM̷���y���z��L���8�ꃱ�k3T��-P�u�:���+0��=~3�~4�2f:�p�,f��匏 �ܛ�6��I�o��x{*o_%�O4a����A�6X�`��|�1�"���4��q[/͕:�,�;�����%[ ����? �����U{�����`b��t�gZ��� +n��ޟ���7ߝ�k(��¯���~�Y8�*H>�"B}��^��ؚS��\�:^/PW���7S��ƾl��2,ӔK�h�Z�g>�3}�8f�e��R�7�4"���?A�v�S���讁C^���3A +��z�E
C��n�8���80B(�4H(mu`۞,���������}4U�i$�x�bF���+hJ��OgR������f�
g� �F�U�Ǩw}��;�}�p�;%��'wn�1'�2T����X�m��VYA�A&�9�� +L=uH�8{�?�+V�v�NL�ޟ���#���>|r�-_d����;R,;��n4�� �}8����|�V���;y;B>�H�?+Q��`�� v��E��
NDo"�ׄK_�����.h�Nm�˖t
W���U��f�b���{Z�b�5
�6rZ�n�V��w�;��d�.[��,�2�Y�Лإ� T�Zn�F��2i�5��k��N1�%e�Dd��Y����3S���U��0P��;8:�B#E뢳,��;G��7��6_�m_�w4��h��~�U���}�R�� � ��4#OT꽯�T\Ɵ~-h�<NМ{�B<�R����U\��I,j����z�C{�O�e��N�{��
���F;������R~�5gvݱ�|a�u���l��nn���4g�s�?Oh}���'�=j}�1e~�歷N!.����.���N�|��u�X,g����r��m|�����3��M���P��v�T�4Lȩ�������[o/�n�8)mB�:9��$�x鮑b�!�%��8�O̵�K�(og݇������^`��5���J�"�}���I�NN��?��'�ZqF��`��%�XI�m�0_��~pWz����n����t����8���)�^�������a�u�%�y }Ɗ����I��o܄
Nwq����l��� +��,�㉯�Xg'�7��4���0 1��p����'�Xa�K�ġ�����1�2J��9U��e�yA,n���x��Hs�ad�
�t�(3*��C�>�·K�/@�`���xa6�.��3:|�jk6$Ƅ���mc��Jv��yb�V{�&�8H$�Q�4��{!��MC���>��x�!������gA!+�)g���19J�Rf��d3��:e�\T?�X���a���,�N��c�I�`�F�i5����^j)�r�$��IU�Ɛ�})������B���Ré��y�ჩ��v�v�=6��Ki��>� +>xKOِ�gc��M���叟��W�%�O5<8�BH(�e+M��wRj�`����65�?n�ȟ�?~�4�QEd��uI&>�vu�V�\�䐚���dC����R����T35ṁ�2��j��������o�>Gw���T�k>�Bمe-#����ɧ��g�*1x�k���q�d�M���f�J�Y��CN�k��b��N�ļ:�-���Gƙ��I�*�}� �Pˌk*�K/�+���T�<z`i6�J��$�Ò�(����tm���rA�J�I4�Nl�l�\sp2��=����ڔ5}��
}
�����;r30C�nv��a�`j�<����Y�9�@䛯���6G�%tS�L��� ++6"�ZRz��a^*�0#ne�9�*kwVUتBH~B�ؿ��h,Ϩ�ֻ��ۉ�͔6
���t�����thu�I��ޖ�jm!��?�0(ns�V�@yRX�l<9]���}O��q�S�tv�R&�3G<�]�'���
��f��@���R)��\�{hʰ���s{�sB��t>��{�\�2��g�'�O"#Ė[q+�-�4 �\T�9�k�a棐H��θ���̟:��p�3�Hg�g�� k��k���*�Ψ����A������'��>�؏�����~�,f�R�ٶ�(��ܫP��_4\ˋ���ے�a�Gj�� ��
�]������'��X��[�@AF�=t���4�����qZF-���Mщy�RR��fF���J-W�Z/.�7~8v-D���&n�:_l���/��v ͵�]�Ƿ�:���aڲ���[t +X�|��ڽwU��o��U��lX�)�9��>Z��{2t�=�|��W~4�w=q�,���cĘ +K1�В#�OE�\i���T���"���Xq�QØa-
l"q��^T��1�u�X�>���O��?s��_x�ڟ����;�\-DMV��T�1,Cp���|c��ˁ��NN7_�+�}�\�|�뼫麭���~"���4%�#tEuC5�'f��חɭ7܉m�М��6BŮQ$�M�<��*[hb�m��{��Iݯ�n�uR𠅊��4�?�f�X����F� k���;.�چ[�m�C��/g-\���P m-w����]��ԵJ����fШ�֟w�hi�vT���s\m�-q�g��-C���R�l�zg�v�w�j�-ɟGP^ߑ� +��+^��Gw!w�=�� +�J�zt���ऋk���o�v"��RT�Yp�����6G}��`|�x��� +�6N���������WI(����fm�?Yܚ�����^��עC�_,��?`3�˕L�NӶ���,�u��S=l���O��}��������=D��v��Tg(�i(��X]�����v��wԇ�����\�G;��jPm��BhSPmxʥ��3l�O�,m����˩�9��Yb[К�k��jȩ�|ZS�>�I�.��"�zA_^�|o�����|4^g�#��~4ë�����Ě}��ƳΚ�;��J�Ͻ�xZ/%1�r����;?����o=u'���_�P���@!��H�
��P�{$�^oG�kNL�\���pUd�)X�2���u�s�B�I����MDm��ZAs=��^�l]$�W=�TsM<���Z{��5��P��rrm���Z�,��%�hWof�.�Ľ?��ĸr+Ƀ��/E�:�Y�a&Rx�Xˢ���J�k���#q����V��bV�B� Loʽ�r~eqCg��i<�+�B�.8�n�vm����< ,�u����}W����<�3%�Y�1=,n�?�|k��B��k|��#S���~4���cѳ�M5>��E�Ў�&�Y�hg58�{�a}Pʀv��Q*�g��:]���0�!m|���Y���Ey�jgE�������;�/�7NK���\mIu�r��R
��u�б�or +kD���@=�"�%��I��[�k��ɲ�D�����{�GC���S6�os���-������.���|��uv�[�$�'~`�v�͆�S5�M��m��#�]w<��k�`qK�vyO�I�wܐ�b
PSd��+�¾��U�9 +�-T����AH[ۇO4�ZN$f���v֎;��λ�XK�S;�V���?�Yέ��^������쿵�Jz������3E|ѧ��#��1w����C��+�6���l���8�����rxv/��E^��a ^����u��|�h0��fr�M����.�Wɫ�3������]�=�=�+���v,����I�������f��q=��)��J�� +#@;��8����!�G�~ץ��M/��eSj�F9"�\�H4�$�� �.�媮1�@��];��Y˭%R����w�d6�u8B�Bn��<�9�S��M� ��o�!�P��J�wo.e�s�.G�$ߺ�L_�i�.��*$�qHp���홠��%��O���LɃ��|ۅjgQ�����O�v������U��,?�Em��T���n�M�v/���A?�Y%=�Y���J�S;+��c��Ԓ�9/�㋶;��
�
�$��eT���8� +�����CV�p|�t��3P�����d����Kz8ǻ�hɵ��YQ}���^����m�o�d������B�r!�&�_Γj5Z'ħ��C�M�}4��'5yd~/<'P�1j}���Sc�uD��ox_�a@w�� �O��!R���Wmn?O���a��bL���C���N��/�+Iܖ�O��Kj9��j�a���?��#=.�B�O���?���,�T;��4M�Ygmje_5j���m�+��6���\�>&8���[�z<w�`�co�����8]ʲ�^�&o,�l$�1��b�E�[B�%|�ŹЀ�ka؟Ck��8/��Y`�cߣ����jw��7}4'8���g�_�kI��Ҷ닐�I���ї����vֽ%��o�4�O�����H*�� +z��3���jga} �T_iM�Xm͡���������Q�x`���cg]��)Ю�$Xc��8�Mt�m���S�z�9>v��1-�x.b�z\5'f����-�8�X�ׇŘB:�R�Y���+���=wh �i�6�Ξj8ǭ�Z��խ�rU��_�]?�pMŊG16�B-F��ƈ�4��?����Sd�TaFbx��.����.w�`h��'K�L�v��dܫX��>_J��E,�t�&Ju��{~H�A.�8�+hAc$�kTgk��n��4�����q6�[�5��xzttٛS}��fĝ��f���ǧkH� +
�o�h +����P��<���3�ߐPMh�\��&��@��h�zC�y����y���q_���E�ΏXj:�Mh���X4Nn�� +��:_z�~���_�۲D�'t��O�2�:�e;Fʫ*���>�DH̷�})������s�����H`w>w�v����D�|H�{GK������T;Z!X�ZO쳲��9_hg��hgɛ?�#6]��A�[I��69�\��}h� ��u���yW����;FQ���=c��g�H[/Σ����Z�O_H�h�UuO��n����=������jOL��t>���]wj�.{�!*�L�=8k�wy�Etm��+���\��Dj,Zk�;>En��D�re�$�*����Rh�9�|�ɫm����Ͳ�e���v|���j���
D.��z(HI�u�ض�c�a�uc��`]��`T�4�RW�4�]���6hn��G�DŽ�3�t;��W�_&X��E��è�%M��ɸ�A5�Vۈ�4�G��8:^�zm�D4坣����-m!\Wԣ�/�l�j��Re�ʮ������3�r=�ۤFC�Oul���;�����z���<�����n#m86kڣ�����b��eRp�)��ܿ�5E
C��tސ�ŗZ������Ϧu���rݩ�����;�Q��Q��,������J�T���I�>2�GJjg�������9���Xז�r�yߎ�ZB��z�x���T�����R�y���5���x�
WA�|r�۠;E�XCj��;K5������������ܵ�OM��&���ȇ�CO]]u�LR��Ϣ��o ]_.#���3|���Ձ�%9r��t��^7)������8Z37]X��n�֯4HNM5�Ww9BwK$�g�c�
&���Q�����1�K����K�z����Q-O�Y�5�Nз��%�IT}f���9����s �,֢��83hm�zjj?�.�|0k���bL��K6��2�k*���(�^/4�ZFBg
k��%���;��<�&���$m���С��p��iӅ�ܒΣ=�t�?� +��c��&�q�4��ڵ�yϗ��iRJ���k!���i2�`_�x�E���C�f�C��tk!���՝>1Cl�|����횽㩦94oI�Gs�����>@S�u4���ggsM����]�o���qeV4&�?8 ~��&���S�7Օ�:�{BĿ�M�p�OO����:�y�&��TS����*Z��e<�
�y����2�Ś�D����e6� �D��C��^���{&�~�
@��ۿ\$n�8s�K\��$�x�{=� +b�%g��6DΊ��>��%�^B� �h�����֫n���th� �^�X���h�=X�N���L� +��D��2�*8'��V�����V�ȫ�]�s��=z�NӬ?0k����Q�RbK5�H�F��嶺��i<7�3� +b��i+�M��`O�_`�ɂ�%y�������h�'�[a�Rn�x4��~���
��u0�lz���/4Ƞ�Wwd*��[
���N�F���w_N�xZ�/�v^C�=Ԫ�n�A�o{���~g!|�f=�%���X���T�㱛v�5tbp��j}�W�ѽ'Xk����� +��B����rǝ�l����Mf�{:�$v�v���7nF�b={��6�ɑ�G`��͝��=c��,3V���t��s@N��H�̦A2�?e췪�;V�z�0z�l�əb��%Ҧ�.�O/��+��F� +��v:r͟������|bE��0Ǥ�.G~�� \۵\ӕ������E��,��)�gYh��K�ᰇd����JC�W[i���V�Z�$��wzh2l��\ָ���)MR�����V�Q�_.�$>�u8]�#5�7��p��/��S1Aj�A���.�;�$�o���J �Զ�1M����m��� y�Z����s��@O� �li˻��w� +���5�[�v��FIu�����=GЂ��`O�=���{%>E�nMg�'����T�[��:�X�ͩ�O����p&�yŚ �C1ǥ��z��O���:WЊ�:;�c�r�J����yl��@��Əgb� +�ϕk�{��zb���0�y�N�Yُ�+%9��4;��N�$�6��V��v�8h�Q�2ܧ�]g�: �u���:�?l8>��^w`��B7��/��Esrm�tE�#h\�>:�j��s���M��j����d���D1���=7�{i�|��؊N2�N����%�_J�_H{�������A�G�n,tzH�H�#�+m������t������x�?���������x�?���������x�?���������x�?���������x�?�������ر �CSCmDo��n>s���U��R#Slm�OwKI]������ +�δ�e��~�,Eg0v�SW�4]&��ÒM5��$.�TX�]Y{l:2�=&��[R���Y�m�I��~HR�J���hEfo9j��>��V�B>?m�h$BR��"Df���M��8M�1HD� +�f�&Dǰ�bJ���.4�DJ���4|L�9�B�1�oI�y�=U͆��0#������-�y���U�&�:F�9Hc$�����@Ͻr�X:lW��AG(�g��~�^T��)�=J*h*�U؊����u���:{!��w�.��V)�К�2��;�)����&�(�:]L�9Ow���@>��5�c���hc�A`VE)U�F~J-ڒ] R%9�k� +�K��_i�o��A紸��_Px��o��,�R0�l
�2�j�H����e֬�hu� }��y��;��!F��{�F�N7tI�BT��ve��.��Z�V�7��67R�[7;�Yr��;k27�k���;�b�˨��������a?R\��a��iJ��0
�[�k7]���;�+���H�v��LtP*II+��4���g��'���R2�t���A+�4�U�mA�BW��<c"�'�Q"dl���R`�NJ}�����SKl5Q��T�y����5�r\���b�9�\���>�`*F&�����$��^���55Ǧ�26�����|K�9:�@"B���jH;�J�a�ڢ���x���yrӍE�`� +z(Br��ZGƂ��:N%������Ѡ(P%��<K�e�]f�+n)�U��Vf��]$�x%�F;��̤�ä�+�i���K|�'��|ӥ���$V�%c�jʑ�J^i(3�~b�z�>���b"3Ȝ7Rrz�U|?�Zň�^��+�A���(�� !ڈ��9�[YJo�/E��P�RL� R��X[l"������iJGblVo��2+V�d��?�h�Y��J��q�.e��6>�J�e�.T}v�@)]���p��6�.1�2�%O�ǒ�b�q�d������*;tR�^z� +����U쟠�pj�n���ZJq�9N��n�"k������%>��Lt���hG*+16�7:�a3���~�Z����*)�9]=�35���7�u���kS+�iR�l���^���1ϭ�]���{�����k��c@������D;��:Fj[����_�ۉ~�Ʌ�rQ�pt��N���t�#��q��S7��A�+���1�2��.59�n�&mu�o]�WA��w��d,a���!>� 2�o�.7!`W�� +��_ŀ�Ċ��y&�_ϰ2y=�I|x���2���ā��^��f6t� o��g?���Bd��Sh�->dy��i�._�-tGю�����q~�e֚���
��څ&��D?��^��3֠c&�ؒI6��PI���#��ٖ�#hRJ��7�2*�̳@7��r�:��`[r,�O2���p�0y�I+E���䰌���O_�{�&���2�'/h���C�Є�k��j��ߤ]s`|�.c�(XbT���"� +����7JX#����04'��:R5�M�ݶ
f��c�pB>C)9���� ���TLF�_�����:�`�kv��YW�w�.�����a.��IN*�9�v�����ܖ���M�0W�r�s,ѥG}*� 6p�Id�VP"0|���t��z�|��FPWcH\XY` ���j*�e���O�"��1F���E1@`m�<h��'��TaM +?)�$���"79�etpӮ��L�j��h�(=4���$����EۆS{��;�~�>7c�@�B��P��u��#��Ɛ�S�I�U7�Ҙ���jӫ�S��
�(S�͠#>s(��}
�TV���d�(mI�#:wi#���� L�c��
%9������ +:!�[���I�m�YHm ��lz��%�w�%6����B8�}�բ�~5�c��.{��Km@���bW�µ���\�~�/H|Հ��i���I�C���tn� +W��D;��J9̓��N�,��9K�5� +�t��&�~����T���tt��kW�s:�A���C(OƓ�2��k�_d>js��_�#��0���K� <���!>���5smi�%G�A����7lt �I��Y\2?(1��BrB�:O)> +�R��R�GI㕶�GR�1y?:Ca3�"��D��ώ||ڵLrH���������Uv��@%���
ǧ��M�U��j�6R_I�������f? +� ���;2*���̑RfK�/����eݣA��? +�Y.oEIU���w��9 + ��5��#~�>������� +$�J1�� 1I�%� 2˜'��Z�OiUu_�F�:�k]ɒZ�1�Z�B|7!u{��J�&u�Jc����C� ��a���BL&������$�/�f�_��u}(���~�Bh�)�d�F$��x����e�-�*R����L�6!$�Z�!i�J���a�z���dz#�Œ:]���
�U��Ը�d���U�5���":��� +6�v�Y$�y�����������`RR?l0�q +sYJ�?���,���[��<����A)�%���kJ�]Ubuz�����w�w"^C���G�_�u��5����^4AN�Voe��:P�4�q@I�>�#y5T
(�5����Pl��ۤ>��-�}�$q��ӏ���!Yf���(�3�͠ +E�9�p�jFRゾ � y���՟o��E
�c�q +��*�B��7aÇS���>�E|�l�Q������:�%�kO�����E�A &�z/m2�@ZA��4��ԇ���-��+�@��*U�'�����A[�}$�X�jsj��{���uCh���Ӊo�r1U=�X�뙔�P�4JS�{���9|�sw~��˨�cӵy���@3�c+�k�n�����"�Ua�5��g)o�`�BLnoDžm_���/�4U�k�
�[{r���&�[n̗�?p����ۿt���VH�Jq�pԥ��Z%��OJ�i~L�u'&K�g������
d�e�.�؞z���U� u?�ǯ��|C����O��ѹI��<XO����ʤn��v�{�0�?�s�QӁ�����@sk9��/�2�� ����]N���s�n,�X�)k�j" +z�6AvD�[UN��@i��.]�̫��:�C�@Or��Ҿ��(�$��%�����Z��p~���dw�v������Xc�˂ƍ<���koWպ����ݍ���Vl��k�Y� +����"ȍK/�� +��&l�Ф!�_���8�5��wg9(� +�Kק@~���>&�s�6^�W��1ǟ`Ҵ��u��'�I�X��㝳����F�Vn�]R~��(���M�<�@$ԫ�r㑼���7�<�c��sܓ����*ԩ���d\�F^����r +��}��!`�(��:P���B��4�����>_�[V�E�д��&v�~,u����4�u��7A������ +����7���� +���ܹ�q�Ʊ+� +��M���M��(�� +�0��>~J���:`����9U���̟��M���V�h��5NY�� +h���yq����G�S��E��y_7�|!��ryg��%_��(�ly&N
"c�(�BS�Qk,��D�i���ط;85�����X���ERrNqh�)��؇�ل� +����C><|(�à�H����e�[�<%��0.�:LӃ\�s�<Ԏ�/$c�w��߬�1ɐ�dpN��� �q���!�5PCgS2!0W��2?������m�@
B|�f�Ni�1�'�Ĥ��!5qt��(�I���!�Җ�߿�=&���+�,BFa����˹r��g.#b�v�}�A��%������Z&s�U��q�� ؆�N�vW�JG���M��u�ːǛN 2N���_�_�^o�� +{���O��ˡF�\�������r-㔡L�vo�Q��W�s�2�#�$�kPǮ��i�����-)t���ݾ�7r�
��1ǾK�};�En��?N��F0��(x�ZN
�Z��?� �@
�wh2?��/���5sQ��&F2A�������&���q~��4�N���
w���c�<������!���}�����w&L5��ǡ17L�}�&f��3��R��#`^.�؆�ʏ���}��=��2~/�s���� +g�M���g�ȩo�� B���\��jRdl,A�MA=�8L��8���T��
j�6�_j�WFM�|�E�vk�c�r��A��5}��⓹ +TȨ��]tP�zP+�߅�njףUDD�6P��t7�U\�p7��P3%u���L��rS�@�܊�����(�A�L��Ncn�M��x&v�O5蕀<p~��� \�>�|Xx����r��&9OP�&�ڎE��K�3���O���Q����� ǀ�?���j��Ę����-�~��S����.�E�4��e;IM{ +rXb����@���ɳ���ab*W+?9��^MY�M��0ch�����gԁ �)>��ۥ���D.���������
�V0�@��z�;s��}����N-�g��P�H��'U�R�J�Ae�9��<������{ q�W5�!5�85l72+́ی������ +��8 +�E<=��q�*J=����.����^S�_$ıe����\?��@a��Z/�j�R*����y�� $��\r +ypȭH��4��{�8;��6��qo��#y)��9eI��=r +LŇ)�\=��0F������l6�3�.JD`n�q��VI����(��nI����ɟ�'�J:��b�a�;��Q>i+ �%q�^��A�
�A�����7-c����9�5�S�i���L|�:�X���&u���b(ڑ����ݼ*�%ujBߏ�����.C_��0=�\M�بMl�� +`v�3�]�e��^j\���r���SA}jC���^�k�2�W�
P��0O��.�M�N�����x���P>8#\vQsA�
r�Rg�|���U��K�z#`f���*=P>���r= +�\�C�!��py�芝�3���oN����\��}�Z����8F���*(J��d�K�К���A��IU{��m���K)���1�D��攚r�p�Av�J05��۠�����dī�DX�F.o�Q��O�<2�0��p
(�K=o��z��z��\���L��/J�3�?\��׀r�kK1g� +.ܤ|���W�w6�� +�x�m�\\O�7�uA��!f.�=��G���>�1u��h���>~�h����A�8l&u��P����1���ҕE��[ +ꍢ�~S�����5c�_E�.N�� +��� +iq�땄�"ԮἋ��[!�;�Se� ��"|�ru � ���9h:�������J.�s�#z����c�����u�(�G�꩷8=rK�ӊ�3&Nُ%[�qP(a��Ӂy���mp@y�z�����7�S��z�����})L@�ơ{:b*������:J^�
Tc9>�}+�5�/�x)�P���X|=g5����K@
K╳� )P�0+�0�`%������p�q����S�O`/L`�fP������}]ʠ��j$�.F�<���P�~�$/�r�P��#��p� �32�l/�r+W�:�1TΠ�/����itP�fPS���#T8徐�
���(짹X�c��t�o��0-(L�R��\�O���4��W���B�PjRT@�F�/Dt�QZ��֭C�6�����������p�R?uT̏�@�[�~c ��9����G�((L�l0&c�wR��q*��:vj�@�%�s�حF�l���zX頷��ˡ�i��Y����Tb�>qJ�!(�s�Fx�8�<C��%U��ױܳ*N�I�@���Г>�/��8��rK�q�����^I��0�u�L�B��.n圹���n&n~ҡn� n~�f�0"_3%�>�r���'}"��~2m@���%�<k:,}]wV����CB�tk3�v�^�[*;i;�\�*�g�����r���
LB���Fi�Q.>�TN�'��őE��2���2���$c�wC~F��r3�e�qջA����3��}:�O��o�u�@���sIͪ��&6�%"J��4��d=�O2�]| +���v&˥r��Y+���G���R*��z*� +��a�Դ�Jk�g4�Di
��H�����x�DL�N��k2�]
zG�=z��f>�D��?����֝D�w-�y������La�I������VZt_�w�Y5�̽&��^��Z qv��&K6���6
���U��NF���4����4����zt�����@ z
谢�������"�^�����9�0����o�'���@��>x7߬j���iV�!*�P�p�^/�q�k1u�\M���5��|�!����"�� +�.�|��_dIu��n]�A�W,��i�>�r���p�YdU����)|�CH��&% +3��Y +��퀠���Z�\u�F�|��*z�2}'����K]$5�������1��_"yYB������jYJ
_]�)��ӡ��c߳��x���kU��6���֑�6-���u��\bI��g���1��5m�(jǹ�R(xB��#}��G��7a��&�E�<o? ~VwX��f)��N��Zdl�.aJ�s����o�i������Ո��ф�0a��)�~��y�"?h�Hsj���,~TiF'�k jw�]��R���l +5"�*�ֳO�9���ѧK��2$�
�w>��>��'�2�y/����y�sD��y@|�1�����$��0�Z$��N>�� +��O?SL����¿�/��D��$��W�^��h���)iV����lH����kc��@,�� +�Gd�G�(�[�$�k1��Yl�ĵi��T4��0�'�j�_h%{Q~F|��T��+��iK3ZI�zJ�Ԭ'N�6bҺ��'�A͊�~9%/V�D��~_��<�x�8�]O��A�J��d|QF���'�����j\��&����˒�Z_Q�u���i�����ѕ���,,�?��@~��v�d��O���[�Q�o�Y&?Җ#��t��QB��z@��}LR\o#{�pN��"�ݫ13�);y�U����Ⳓ�2"���0�u��f�@�Ss���K���; �9cQz��CƲ�j����C���e�7��vMl!�C���d7��sk�IsN +�~7 R��e�¶����c��^����h�`�ێ�y�Q��������3���Gɂ��o�� +_}���鲮3Ҷ�������ʲ+��TV����%���)���y�tP̣v�$�ɜy�����DZ��(��'{\q�[����^M��2�nv��Q�����m����zD�GC�NAf���]$��'��b�u�a�:~��w��+>��+;Α/$tN
��|�+&|�����"*�� ]�rA���a��>X2��'lf��kXK���E��Æ~�{����K�j>x�49_�q)��W���o�]C��!��_�|�{I]�E�?^#��]���M_��3M<���#zU��v��ue�-����c��"k��"��]��Jl%/kNH�6���&VI���F�8�$��bL�"��:_U�M��1Q�͂���(���W2X�+�������S������w��s���k͐�nN +�(�� +.�q��N9�������f��咞_i{�7U�q ��3��AK���!a��}DҀ�4��YA���I�1�����A�~�%��o�2k)���6_�i>).n�YZTi--��7�ʿ*~�|A�����m�I^�9�U�%���$��c�Ii~�YIA�Y��LMR�v +�.�G�l����&�kB���{Ⱥ�d}U��뢾���F������o悒?̈�_,�_�R>^
6xJ?UZv=��|j�*>��^u��[�<"��*��z2�V���Q�'~�`i����,��,��4��T����4�ʜ~�&a�~�ϻ�U��8��$���i�Q�v"�!�h�O��˼j��TT\�V;ɚ*��w���{��f�·Q��^E��=%-��+�u���,�\�d��6�`on��;1g���.��F]�� +;�y�5#�t /��q��r���wC��H~�&vL[@&|P�n�1��z�� v �^,0N��B1k`і'7�-�>��<�`��pQU���軹�CV]��b���HC=SDQ� +b��%�u��N�ݍ�И�|��Q�i}�'�5�n3)��h"�������fuy^��?37���w[��g��F�m��"b�y�x��
�j:�$�T`��H~�N��dF�S�������ag�¥�nue�m�!�����7��|F7X�sX2㻶0�k��t��E��Y�y�ӎ�D�� ����!U�/�Ѳ�*/ˎQGڟF��V�Z\$���t��vV���'��LO~7>�&�w�'��oG�:'ؓ��O��եWL���To6N�a����Q��o���ɖ���r��� +�(���1�5���b-�FH�TI>���>�������~�scB����0�'���G����A��d��8?�-�|�� (�ؕ����b����7[Ӵ:�4�M����K��S!o|Ԗ�j=iZQ�"-�p=�1���OR���/\˗�_O<$����G><�9��"Z�Q�+�P�a:Xr�16ֽ�7έ�76��9ң�7Q�R|��k;o��N���p��zxp�KxZ��<��>�v�C^o�r�0��^�>��.�G��y����Q%������
'���H�/I�7e�7S̭f��F/� k�|��v�93�\sj���q'���K;�������%� +k~%*�~���56�e�xI][�S?��k�x��8�`wn��s�.�<E�������$�ɘ��` ~X#�+?g����h۽���OC��=��Д�l�(���������I+w�߫�ɫ� +,m��_TeTPaTRcPYmP��.��*)��Sj�V��W�y�!)´�u�x��ۢ멜����)�'�C@��&���ŏ;�n|4��jJntR�o���㢴��O����t~p���J>�R=.���^��� ��J9��i'x�x���ל�5��&�� +0�+w������x�9=�`�0io���G���w� �n ��v�_e'/��*h� +|�hX�?��Y��Z>�����]b�sXr�sX|�K�G�O��S�?�����`�EĒ���]���sf%Ůf
E����!ⷍg�DJ��$�I(y�vHZ�xQR�c�/ҚZw� +�D�jy�yk�\��z����� �~���-�i�X���r�1>�D�8��"������C$_�vg��4����:EFԺƞiI����`:꜏vdE�6�Ƹ�{GF�:�oW�ÕUi��ӫ�+��b����aY%��R��c홡�->��&Yu�UQ~�III���}����� +�
y�Ul��a^�^�偑NU��q�n>�ޱTg���V�od���ɯ�3:��#<��-̮.�W\\`���c������oYC��P���,�퓍��|3}��2ϴ�I���g�mD�e�]k�`��zUir��>$��)�~͕���������Y�/���=�Q����g/�?9��?��� +����]��V�z�24�l}|����c�rYO��E�s���1@���W���%z��A����E/~9d�Tz�)=�tsF��Yz_��y.��~���՚��v��;�q7̢�ܤ�=n�<x��Pm{��A�s}�
Ӻ����Q���F�OY�M���M7�o�hR������?�y#2��52��%̲���W��a'kj��J��Y�~+��gi�A���+{��{��V��|�r'�|q0la%�Mˍ����%��6f�U��Z���W�&��_�M+s��i�L�vW������v[q]������\CJ�cUH�Med��װ�oC�꣰�~)�/��.��ʎ����]��T{�-=����*��a/�nľ�<ز;'�d[F����Ȉz�H�:�ѧf/�����-���0*b���0����9O��U�w~?%����Z�wDR���=��"�G�O�ɦ�ˎ[!t��S�cC��t���Lc�����h�j����N�W��B����u������[Gy�;��C�8��C|����|��A�_l��}VI�u�`�%���*¾έ�;B��GG��o�p��NXj�CDQ����
����P�&�x��2_��J��情rA���_�jFv�����Q�ov^a�@����C[v�E*;��M*�hÖ=h��ڠ�C���0�+O�h��m�V�E~iwt(
+I~u-��������<ϰ�7y`�O�U�N7�G�z{<M�*���eEb\X����#2��KX&�
����?n�1/(��)��o����Z�k� +f~4\7����g%���/F��)�E�g�h&����9�RƟ�=�����'F��+ +�2ŝ�)�l�<4�ƿ5MP��&+�A��+�y��!�i�Тy[�ʕ�h����z����.�*V$�����=(z���Y�;y�[������o���Km�����+w /���V��R��#�.��.�wW#��_?��LNt�r���u��Q�t9���?>C�ď>������:�[S��S&:ܟ���NY/����o�{��ԋ�[��?��(�G�f-F�3��5�@�84�Ac�5 ���#e�h�4e�~� �k��v��x����ZM������ڴ�e����[�8�*n���t���p'�j�oT�[�Ф|7��BW9���i�aO��o�����b,Q�(S�\��>8��%,��#����/�u&�K�u�/}?���H6��=���ݪ��f�����;5��e�h��H��������z�i�5��(.]��&��h4�F�����.E�>)���p���x�c�o��_)r�����m�$F�Ho����բ�"Wy��<�w�<�S����jhd�������|���y.�/��9�N!O^;�d�y��I���1�m���>���O��zO�OΗZ�#^7��z)0��1\��5�cz�����T��ᵍ¯J�[��8|�+���
~������o���F
��?ND#&�f�YS֠u[��U3�8n��G��5�o����Z�����54�K(�1��E�An~��=O�����6:�d�s�G��oK����������U��p�c�7����7�6�1@��g�5��^�H� +�� xMӱ�Mş�����j���0nu���a��n,�{3�Y\��R�j��y�]e4�a:z<d�~-/B��d�]�����
�x�cYl�������`�_���*p��
|�|�Іb���2���bo��,
:XƸ�=!��Z�g�vY�)x��_����#������E���:��h�s�$�.V��Tf{�$�?�Wؽ7n����D<-r�z��1<7�9��K��<�Ѐw�r���R�p��kai�w���o�:�ĕ����^�*�w��[�(�_��f)L�lp�*�O�S��"g���?�a�G⟏����9�}����a�:�BSF,As�����#�$�zV���io���7��9į�+�DKZ(��3
�a�ˀWb��?�Ԅ�m˔��3�;��c�^_c4�u�ck�#-���_H�/��?{�����]�_߃�*����u����X|����I���C>H�ϵ�����ɛЪ���cwGh�f� +�Y�C-�U&���^���tCbhM�K����:���EN1M�.�M�cj���_�u +�����9,��#L��nT���qg���۷���߽������#��hn���;��S���˅h��%�Y;lO;��3ky��ε���aws��s߸D��w�)�wI(-v�{Q��S��P�.�/ �˥�/�wyx���`�� +}��jԻ<�Ȳ���B����w����N���9��c��C|?콻\��U_�^�����&����g���9?2���'�}T����4w�4o�4{�^4w�&����^,@��#���h�B]4o9����]�-��%^:���pK���'Nr���"���g�������b��ۇ�:�9��5�
��v�WX�y'�����u���y����C>p�����$4Ca�=v�=e=�;k/Z�V��o?�m���q4w��]D�Y�4k�P�Ds��p?[�G�j'h~`����C����)O�y�Z��-���kLq�K��o���J"*�"�kl#j�bkJb +)M]�}�J4s�Z|�v��Sw#�i���i{���[a��-��E�O��z�h����;����e�+��*F�Ç�nx}��Y��Q�����.���!�\{�}R[�CB[������KxiԲ{����_���Z�Ϧ*�FS1C��j>s���-@�N�״Q�ь�k��6���U�}�c�4Bs6���*g��}�h��7Z�D��d�h�Law��3TKٍTo��K�n���^��!�1���k{��!� �q���am��]���mv�y���竣C4߲�fO��o��_�
�=D��JHi�B��9����O�{����!�1+�?�{7n=��[�ܙ{тEZ��8Z�� +-�rFK5��Uk4_���i�V�C������Ԟ�+y��QW�����y!A�]��z�_��=9/�)8��g������ˮpyH��WW��Kg�^�o��������p��)c߿)
_���l�38ۜ�ߧ+���[�f�[���[�}#�&�B3�c��X)�5G��,�'В=�h�QZ���Z�U��Q;n�]v�F��q�Ii�K���I���}C�t�W�v��k+�s~Vb��:�S�mt�m|Y�]l\�k�ɏ�k�V��=�����_�d���5���xgs�tş�Ҥ��^)���6���`;�i�����>��]����#��ZHi�Z��9_��x��ր� ;o��U+�M��6���l�qݳ�;8:�j���1��6�\e�Yc�[g���J\w�cBG�=��-,o���k���?���x-}�_��RG�u�:����W��������
�L|��Y�7{7�;g/�����-���)�h�Q�B��&��Gr6�����<v����I?��+`7iw�<��f[ӶG�o���s���y��E��O߸� J��`�Lb~Q�� +ܞ�_�����,54s�&RZa���;��h
q����o*n�;_5�O%�u_%���.��)*G���Y�'o���T:q�g�4�����?a7a|���k��1x��R��͊t|J��6�0(ZA���XT�}^�����F�俩3��0?�n�<�l.��ʞT�䷜�~'�"�DM�8]��{���6u�B��7����h�j3�x� �L��廣5:к=G��-$Z�F�X��֨�� +�3l��'�v��ݗ��EZU��^kb�˚_�;X��~wU�훕��[���I�u�^|��[��R֘W�R� +�\�0p�i��c>T;�}n��*L��݇���g���ǘ�V7ת�؊R� +�p������U�
�T +�%� ��� ��k�<"�t+ᗳ���ZN_��\�ܬg�^%e�Kw2W�g�3�ϝ�dR�>*�f7�l�0���4����T�ȚʼMn�]]�0W]��x6H�6{�
��3��?Xk���E�N�v��n6�]�r�d5��-92�0�a
��m#*�D=��χOٯ�����{F��� +��� +=�m_��]��SGfŃ�Z�w�v��d���,2�p����ԛ9�|"�6?�k��j�|�;s1u��}��[ߴ�m��Q����n���H��)����lCfvQ���-~\�V~Л���n�V��>��(���[W1��n��gwj��Fz���A�P��50x���b�M�Y�����?S6<�8��⌢Ɂӊz��hǪh߶mH�g�ȃ�F����M�}�����_�v�s |oIϔ��<ϤeR{o%���x�*|�0�v߲��HU��fSNa���Js�O(y�A����[$�
�J�?\"y�rPZY�}��w�l�{�AB����"�B�T�ϋ�,��b�H��[����3c�/eO�:�1^�!������|�J���)}���)�T3�k�D;TѾ������f��(���LnR�uk,�!x&�O����x�N��5�],��uMT�&U8s��ͥ��� k���_�*x�D��`�0��<����F�4�� +� +1�jgu��x�uﲛ
��X��PU�!mc)2�^V�_���/F{�i })�V�Ejk� �=���hD�������}HW� x$�,���N4sI\b�vc%<$u ��827�̳*����n|�ڇ�$�R&Tʋ7�§ N�����&�k>Og�Rܳ.61J�<3q��"�%f�0O虵�8�n�q�
��_UM�J7�RT�n|�a���l�3���Ԥ�o����w��Sg�æ�|�A���&�����DL���^ +�b,:4LMeڶtڳA�sGu
ϲ�,=�%�i0��~�����?��֊��fJt�Q@e�����RN�s���}�\�J4��ѳ�k���o�k�f��ģ�|��o�_�Q�z(����(������}��^�� ��y���m���������G1Lg��q.�3z�j���1t�Q�gt�Qg�.�M6�f��ϖI�*�-lG�.7&�)��T��o=R�x���5Y�ީ�ƈ133`n1}��p�E����EI:db��0�j/�Ң3 dw����n
�j�2�>�vK^ +i#�.�q>c@MW���f���a�1�KF�蒒�z͘���DN������_̿��>��8C�|���YEx~����+}Vw̴����}�=��+5�����1k��}�D[p�QZ�VOX�?�CZ4��)8f3����p���م�j�4�^�?�����؈���3���� ++D�/��\�:�ӌ:j=��8=\t���� ��`,�� ��:M��y���TAr�N*�K�R�}������:
��w�EϜ�V=6{Yz�J�׆g����(y�6���J�j�2�j�wo%� +�7���Êכ؆N�;��1��],89EC�-��n
��S���,�'<�lY�-;-�0
��<����S�Bq����L�����Ld�S�̕"����B�eLJs�A��d�K�\&��f*��^aB�.������*��>�2�zHAj��Q��yM�2��:"�nW��N���κ߽Ե��Dx�V�N� ��U{K��0��[�O�(w��'\���� +�Z�R�!̹?�4�<0��K�s�HK�Q<�(��ȟ��`[��rŗ_�:xn��1�O{f-'N8�!ι���q<���`�L�Z>�#��Wqe����}ԭ}���ѭ��۾�eD=��s���k���j�pY���^��)�{�!o����OZ�O��Cy�_.LP'R���L���2���R���~R�N�[�U�"�j����7����mK֣]6����#]#�_�6���L�gD!-��3F���V�Sa� �xFf-¬?��P ����8���7*Lb�~2�Yfvg��Q�K�MF�;b�]�3}1�9fb�n� +�9uRQv�����#�?j_��02�z�C�s�l�;u� ���n���Y�A��ߴ���V}K�'�n3I��)�����c�Y=��a�.'�L��2r��mh�O�Ю��������0^r�� +i�;-qD�^�]�9t0��/�!�8=L����?�}y�,��Hq����+Q���qM��ۃ�D�G-2��Z�&J��̋�/�L�ɳ���ᛐ�\A��D��
d�u�G�B���Aj�^"�Lj��6&R�h��/�y|�9EuD�of=�8�9�tD�?�q3�f�#`��$�8�����Ҟ�+��Z�/���q�O�9�I����������Fe��:��P6���ŦIr�X��F�G#idi�4�-c�q�1�w�� !�Jr����J!���ޔ۾�~�����㾵֩3#Yg�ʌ8֜���}�Z{�U�^{�-�:֞�O�: cG�6�rE�ӟ�ty�w+��Jų� ����۶ț�56���t�'�[x���5<�K>����Nó�x~-��n��������M_�3���w����w�U���ج�=���0Xâ�I��Qk�HqZv���T�9t�m��_u����S�fͼ�e}�B_��k�ؐ +�;���}�������19���+1�F`��ɡ���dh��SL���\����^Z���KrŮo�+O��=���l��T�^��Y�E�N�X�X��c�*��'�9i�����i�m����=�6ۄ���2����������������������g7���}�^���1NA��1�� +<�Ű�����#_.��dž��_6��ǰ�T��w�FÓ�������W�k^�c�s����u����� l�y��P��?�����1�?Ǝ��`��t���spm��Пn<�s�ޓn�;hNY��HY8����}�/�ؔ�{_ +�<7�|�d��/u�I�����[;�Ü��>���z0&Pt��k�;��al��I1���c�R,m��=��C�_�qF�����R{?�y��[�~�����3��|���^����;�����M|���O��������w>�"�
�~�<��B���Y�����|���Ϟ(�Q�����ӂ�R:�y_̿��
[�a�g�.:� +s�6�a|�����(c��#wn;�r=���S�*a><�uM��Ţ�+��0.L�e�7��1�/��V�s���f�''c�b,:�YL�]y��Ӄ��_\r����G�
�xhrp�c��ׁ}�����K>;ػ�H���wn,�Ƽ��7���:'��vN�����������#�~�%���A�sv�B��b���bn&�1Z����|��k"o}������˟��F��ѸvB1�xijh�~�z +<�.��g07H +�a�:�#�gBKw�s[,1u�Ц��@9�v����x���c�{<�x��SC��m=;��&W�>�aѲI�l�a�dʱ� �X�ڣc ��r������?#rזs0.#�yP1wd�KWc�:�a�Z��g/�Xw���bF-�>�b���C���P.X̧���<�]�7�H��紆ۓ��oOiy1�2�ʆ�?TB˞�\�x[xc01!Ծ�D�!�ջ�,�rF]s���u0��m��1��l�?x1��Q�E�-wN��E`��Y��|̉���:V���du�%AG��ж�`�����V��/�8Ea�����o��<{%��7a���3��<�Ï��R̻��U�9;1w_��OZ~��������Mr<�ц�?P�G~�EK��L�9=��1�k��8�;�.{�������������'�E���u���ה�W+e�oZPV߶|����y`�V�R�4��$�߮k�O����b��@kf�/�hb��gR�����^�y �m +<�������F��:�]��K/�����_6����o{������;��l�����3�j���0�,���p��V�0w^}�E�Sz@h���kN�ܜ�D�x��I�*a|aL�Z_�,ز��H7����u�\Z��B�G�����^Aq�A��tM�xU�9=��� +�˅9�B�� �.��gjd���b|C-���b������1�F`��3B�~[������k���`F_�,���GwD_�](�� +�a�M�Zb�T��\���`ǦS�z'a����G(�&�1��u� �;�N�\Bx�=�N����w�7���e;��X��G��|3���>QNW�������| #0�V���3��9�r��wql�+S)��s����ȡ�Ğ��.���9�G��Ḍ�?�3Gy|�Jh��*���r����7���tzd2�i�������`� ߾/��}G/��y�BlۼYs`>�ʂK6��c�ɷE;'���N��&ͫ
��S]&_%��R��J���2�.�:.�l����_�2�t�Y'c�R�e[Ύݽs�����kF�0��g��T�_�e� +��c1o����}��A�~��x���������9�z�t�����@����?V7�����ܹ
e��R[�����=8�NQ'������o���|���˛bD�W��Z~�?�;�b�??����{߭�<���8���I,����о�o¸_���K�֓�)����04��yal���0@��_��{�Sc�\8���ͧ7����<盞�<���k1�`���n
��|����PI��6�xe(��В5��a��C`\���w*O}v}d�2Ɗ�<j�g�����B��y.�<~�{��5.$}��x�O���ȁ?�m<������ ��͍�1ڷ}r�ރ�b,C�����8���Ťsl��5��ޗ"��<+r�O�6����ÿ��>��|��s�]��Ƶ;.��|�x�*���j�2�d��7={ȺiO�s��3��BG�1?|�op��I1tp��KI�w����)�>\��%
���X�����m���+N�
�'T�0����7���B�� ��c��~3��%�][W*$:&a����ɔ�w�ٔ��9�"v�Ú��?S"k� +��i]��\Xzo9��e�=s�w(��T��q�!|�3�����7�pY�C4��u���q&���ke��OTC��"+�]H�����a�og�͋9�p]���6��|��O�`����/�BO��F�}Y��$�뇹f��}S��Oo�8��&B����+�{���q����y��ƸMwm�f��g�{\s�=�&<�ae��Gu�G>F��vv`�/U����Fƺox� +�{��[Ӣ��2?r��u�g�k����nozm +�o>zŷ{��ڦ7��}�����?��>F��3�]�����m`b����� 1���9���Hb�w��Ekn�Q�c̭�����4m|��p�gE���]�����On����Ο ���b!�|�x�=���9��z�,��������[�k��j���ȝ�zT ����p���Mķq��K���&�@mZ���e-�� +�[���-��M���D|fa�����21r��ɸ����7��00﴿
����8?��[�`� +��=NC��y
e�o��ˀ�<?�����˗�J���'��[&ҷ�r������?TF����rga��T��>3w�r=wV��M�;�eot���Xf�l;��ƽ�ƕ��{���7��9���[�=���(���Ϡ| �0/
Ų�|��|�y����+Q�������g������w%�Oka�C��~�~��ƒG��ؖo_�yIc�~�0�����e� ���o�c�)`�]~���Q�-���rg)w�'7F����ѣ_܆>�hP.��u��W�X�h�$r�IF�,\_�_�Sb�_������$���� ?�ҵ�G~ 4ny�:�]�Z}����u��u�<�����?(o̦�<�,ʎ(����&�x�k���<|>��(�oI���0�}x���оOo��5�s�\��v +ܿ������H�Ц��В�'�B��
�mQv���1�Wl�<N���� �ֻNh��|:ڷ�+>s� O?�ڵ�C�.�8ȸW��燻7����ߘ>���2�}~@��.�r�q��KHF�\�<��� v���z�����������2�\�]o3���q�c�Q~�5{.F�Ӽi�ضoO����9pp}S�)��l-�P�Sw�#`�7�(' +��]���w���q|�����u���}��<����"�`�x̋�y~B;ߚNcsˬ"YtU�_ߌ�3|�_o���ءO�Ǐ�6��y�j`�����z��K#=���=}�`��Sp_*������K�;��ς
�|y3�� +=��4<������5/�X�AZs��4ʝ��Bp=���N�/�κW˝y�bh�O��� +2�q��I���9[P>�=!���|��ƃ�Q���G��v�#��xW������tV��0�ߖ�S��>�������n<
u=�浘��|`���ַ��+�<?��1)�����F쥏�����?���$��6�[�}]d�/n�<��ԓj��e���LJ��O�5�؝���yPcK�Ni\�urx�������r�ܵ�\�`�V�z��`c�0�uc�G����Q��U�4��}��B�/�v�Řs#���� �3�?zE�+�_�W��s�i��QK�m�^������P�r��Q�nz������k"э�.ǜ�(�C��0���Q�럸sV�9��/h�6ʁ����7(3�
ꡑ� ��FC}��ؠ^��'�'��� +�z�c=v�Wh���ق��z��W�w�Q��cƘ��#�Yh�j��iX���އ� +��ބ����#�>���7ܽ�<�\yr��{Rt��o�_O�?-l|���賿�
��p&���5�;�&����O����}�_M9�1�-�|��n{u�"��{�B́z�{|��?T�w�L��]�o����
��Lz��k�ϣ.��p�)w?vA�{=�'�=��Ǣ����#}0�:��h�D�_A9U@��۴}X���A�7�$#`އ��<5�9�-<��a�O���:ۍ�g�羸s +���?�D�J{���qh��������$����p�S��g���Yˉ����0� +�{c��;�_p�<�i�e��Ǽ��s�|���Fxi���$�����SN,�Ѩ#a�7�:����D7�����6�1-���7�'"Ա��h汄�����('���>}���~y�"�<��A�ksí|�<��iy5�/� �|y;^�@}��Vc����\6 +����s�唋g��30w�!{mU��a���?�x������.�y�P�>�zE��畱�?�a�ܫ�\_K��M�'�ֈ>@[^��z-�7�{�O�w��G74���x����,فc昖�xυ����;���5y�%�G���3ҝ"��\�o����s��� +u� Z�0șG��3��V[�����i���ﰡ}��~�]�郭w�P�c�1Ȳ
�x�{~&c��_s7���{/�9�x�x���}���������E
�V���1C}'G�{f +�C�{��<r�Ў{N��=�M�U�\ڠ���=<��kqL��u�!�|SѮ��z6�]����C���^D�|`3���F�_�v~}�m>��h����tG= �[�0fÝ+N���9��f���.A_�H�Sb(�w�-������D�����W���+l�G�?q.��ȿQ����[�&�#����� �&���|��S�+v��9�)�0�+��C9�c��`�[\��k�9���x�wY��k&���?��Ə0�)�8�s��bq��Xt�n=�3�OP/�16���u���H�����a�P�?��<�N�|�Y�W +:�g�>�x�.��m���t����0�+�}��['�����pn�?<��k�x�KW��+�M���/��t�-�Ƶ{/!���� +� 8���9��-�]x�k�ޚZ�k2�s���<��8�(�֢�I�'���?���?/���?�<����E�N��!��A�M�<= ��|�܃�ͧS�i^g�����~�q?������~�q?������~�q?������~�q?������~�q?�����gʔٝm��xy��)���f����d��˧4O����J�f���xw�g�Bj��fyfx������L��<�3�3�r�4C�u��:x��r�gz}"��L�*��Ϟ���d' +��mW@�Q��۳�.���w�Dj^���Nvf���**4pU��P����O���9��v�y 4E�.L�%�2��� +�4��Qǰ�+�Z�;�1�{��� Л�w�^ޕ�Lt:�-���cY(���ΞL|HZK�Rs
>N���1UV���)�J�[�l!�2�v�"u�dg�����Y�L��[����ӎ�����>���C��C��{����vJ��ǚ��q�ū�-q�і�Cs,���8dGD(jD�;;"l�s�◙��dfqG"�|c��d�����I�.���tE��(�[�Jr�x�,Ht/J %KO%*t���.�v��Gã����QI8U�ө��Db��m���:��?���"_.`V�[���d*�|���L��m�u���-���1"%��u�;ޖ�u����NENww-N�ҋ���1[�/ws~V�ȹ۸�i#���i.OC�u�8�vڤ��X'���9�R[L/U���#���r��p,@��"8F1Z�[�&�"��%�se��$S)Gm��&� +;U2V�I�O��whiq�7.+�>)�E�J�;(Ջ㝝��/�J��Ȗ_pԑ�w��5T$���8����J�[��̂xW��$�c��ɻd�.�v+]97:��G}�vġ*�[�%�������sq\�B�q���&^�o8�D���Z���Tq>�|�8?3[��^���2��w�E�� w���)U�c��;��ܧ����A�:�f��?ڳ������"�|�Y{z�=R��}�q���w�d�����Jg"��pCk<պ ��A�V�xwr2i�Gz�Lw:�Ј���v��gdg�"��[w��{�赵%3ɥ g���B��ۓ�T!>ש1�L�Ɏ���Q)��w�xq�iu�f���s�%��$���ی�c��73��+�WǙ�q�8S��-v��:��|r�����L��gZǍ��8bb���8�����:ΰ��L�j���q� +��E>UƵ��Wj|`���J��� +�\�ڟ#%�t���
�4.�_;_���q��#�&����o%���U����mv7 +b�E��Z�]��Zk{����
K�/8^`[2���?���=���9O[2,���Av��E�� }gG�--��%g�;�Yܑ�8�JI�Eꔒ$�A�S����ǐ��=�8�v�����s�υ�,�%4w���v������&Y�;�3� �Q*{��7K�����9����<�����{���sv��-���s�-�ξ���g�)�ݦ�d{{oO�:� �w��Wn��v�L����º/�Ш#חH��˜b�J.Z���+Z1x�cs��:�� /�y<�E�5_��ąL��_�s�����72o��D�s&����dg[rQz��d:����N��Lw�;�$s�r�r��:w�.�.��).9�tI�ঠ�[��W�Lj�W$;z3�dY�O��1[���$ۿ�1�����+5��^z����������d��t%ZA���#�;�t"�^�J^K������P,^ +E��9"nx�"sa-���z9��ߡ9�e�T2SO����b>�P�"ԍpUl"t�D��]�ѱ��J�R��nd�q٪�nu�Z
�cۆqժr^�oq�-���;��z�}����,s���Pڇ��ms����!��AX���E>W������{�݉���u�q�Z��ke#�sDZ�P,�3:����/�W�F+0S���eɶ����G�w���D!>Y�㣎�ej�!����=ʨV����\=��L�[,}���[ +���Q��Oi/(�e��9"��G Xȥ���w��������.���֙xNO�Y]�;؝i_&�id�n���
�Tg��ʌ��c7��ގ��L|i�ً�����q���xObNw���Dg�s"�Ԩ#�������gh�"h�i��j-l�ҡ*0L�u��O���`�~� +&5^�/��D��q��Lڹ�N�*n4%7�Ҁȹє�{��hJ#������қ��d��80%p�� +v�X��`2n����m��q��±��F�(.���#l�F���X����X
�ë�x!��ӆ-^�h{�S��o���iO��TA(�hI�[���h�tW�5��Q�qO�/�|�Tz���R�Ss��JoJ}�8:��阤ӥ�����]5�HX��!��Fd_k� +��t'�wn6�u{��v��[�u_v�QGn��N_�p�~�p�Bm(�u$M?\�l<��v�� .��8�V"7���J����3���dGo[�������45F�֬$�ښB6�G(Z�,�?��"��t?W{(u�a<��!d���-��f/�Jw& +�E���e��`�+���=����iO��4bʓO�ʥ�=�^֥�SP�j�jK��W8��O�5������r��sζd,�sD�5�#"���d�'툰c�H�+�E/;�����D�3JI��Kg�T2SOf��"��7��]�:G��ņH���!�5�K1Z��q%������T�&�,b�h�YH�t�ȵ������4~S���8��5Ґ6��[�s��tu�R���z����L�Ӯ�+�L�x|�eG�r��8G�Ӭ��\(�3��`��
:j���H,F�1%ո%�u87W�!E*���S�b��%�QƩ�ks��T�q���;f|z��;��} +�
�8&s {3�{�}ȱ^��JP�w��c��6�J[�\<Ԟ螓�.�U�b�g��x�'oI%��jf��>�������9������T����í$���n���Jt�U��� +�Cxػ�;����<�E��!�*pM�b�d(�i)h�� ,��]9�� �ƫL���k��$C����1�mJ +�)��X�yvg��� +A"B��;� + +YT��������vQ������%�*�Z���_��F&R�x*�_h^$�{���r�+�2����H ++����"��p�(H��9)yY���gy� +,�E�dAd
endstream
endobj
29 0 obj
<</Length 65536>>stream
+T��U���喻S�nn��; +'q�JVD����p��)�� ���멀j��*^�xl�I� +���k%h��UYI��)W�<V��/bT��^� +���ͭ� +�A�Q=*�<#JT��q*�A<:���Ud�ó^^Vw�"I +����aM�ZUxA���F2!Y8�Z7��`E�<x��׀>0:YU"��C�0%Yd��h-�v1/Z h���&{U��� +�r��}�L�D�@<g�1�@#M�Al�wPR�^��� � +iêH]�����(�N�"���� +;��<D��fH,M�C`jڌ +[���06���A��ܦ4�7�<7�y(,nJs'��S+;ӝ�����D�CUy�$+C��L"�NS�@ã���0z$EE^h@��U�'^ +dթ�RI-�-XIs��m�}Z�\~0gw�z5�\�N��������6ͬ���[s�j�Ӑ�L�~����L&�ٜ^ +Vb�6�5�@�Y���p��&Ƴ�8 ð({q�)t��y��~��$�((��F�7���q�k� +�F�"�ʳ���w��N��'A���Q^�P��k�jʍת������Z����,��/�w�<0kID!��Õ�FGS��el��ᐻS +#�1e���*r��, + +�G���� +��l&��!��3*�Wh5WkԔW��l�w����Y�oK&`��ӨS+T�`�v ��T-*G�D� +�B��ʲ��x@m��$+�P��u,�q�i�f],�$)�u,�Q��y/���jU䪆9 ǔ��������� +}�e��)�M�jk��S*Un�i���'�1o�#�>lH�4�9�c_Qe9��
�zJ�e��_�Y�x��_�ne$�mx9c���6Ҭ��y���ױ8<XF�?���QŮj��������$�6�y����"_�H0��Q�Ύ�t��N�%3��xw��^,ˮڡ���W��TZx�4�5 +��<���܀��ߒ�Lfe�
E ��˵o��o�"Z5�a՞�f�A��Q���:V�r�$<�A�20/�t��ͪ�0��&Z������V�B��T�m˻����i����$��d���6���F����rzm�嶗�d�� +��>4�&8XMp��)�_E"8���I]T���6E��(F@p���E!��Ʊ��
N�&-�(d�K�<��ʪ������x��U9�������S5��HNeC"�#����`���".��fPqя����m��i��]\�۠�Da�IN�C҂#��y4^��-Ia�����?1[7�65�T����6� +Qn�SIA�DG�nH��9�i_c/)r�ЀօmQt�qe��l� +��s,#^�� +Ί�飡yM�t�M0�C�J��7�j�P?-zt�Ƣk|q�?����V-n�g�dc�־]�o�0�eǻ��U�9���r�e��N#{k����S��x +������J��W����.U��ÄC�0�`[(8�ce�n��x�f�k�x�X���鮶��c:Z[YΘ��Y��� Dt��0QG�Ƅ + +��I"�f{�Cw0l���m�+��0mx�U�_�j.'��\�p"�0��65�m�k��]~2 +��s9���˲�X���r���$�lapV�*���X��0h?�s�~����cg�N%B~�#G^�"k~� +���!�9�TDZM�~�cؽ���ey�[�B]�N��F>���tTc���YԘ�Y�������� �v0@( �J�^���C�bZ +�)���xRAD�gN�e���z'��`#Y��TA�Y@S@�,kkm�EEx0H ����?�b=�Q����z`B��{�Е��5�si�;�h�Y +��8Lqu��XG�y�H@ +����F(��c͋�cp·�hB +��j��j�<cx���W�9/��V�
@
Ъ�a����We�x��6���Bd�.� �b��H���б +���� Ԅ�~h�Y���q���$�*ґ
�*�����^���
lP�%����$Ŏ��e���r;�h�3[���Q���(� �.6Zj�a����^�`�p�(J� +��VR��2c�w� � ��g�f�&����g6�F?����^�`�/�RD?��N?;L�^���� +�������,�q�V�
U�ȴXj�n��` �0BӬܤ��;�1�j�2B�1�6��
`r�\j!
9qt�A�#*�h#k��5�,�_6��u|>��y�������L�e�E�r� +V,��-��gbc�,|����:���J٤��=j����������`��0��p�WT��� +��(�X�� &�z��{�B�+\�������3N�e, + +�E"C'2��:�Y�~o�Ȅ�$�A�em�N_㭶���̢��v����Q�u��(���9����q0l��JX�4bHQ���|A�s�_��е_uXߪ2������X���q�~��g�
���ǡ~��f+z�y�jz� Omw�1 +��m�!n�Pɼ������+w���C�@�v�����h[+P����a{���n�d�o�Ry�,�6K�;���~Ɂ�����`:�M*��
�u�C��m�t(�1�Qo`J��I�
t�M�I��7j(��j�d�fM��v
fy�۰AT߲�j����l���t�����s�C���by[:�@��:�M���Z��
�l��-������d��o��wR��O6���Ⓑ���·���1��m�l��!(��5D��7��X��P6��a��ED��7���ֱdZ��
X���M���l�p![H6��Z�:�F��`kUȦ�l%�C�c6��,`�ɦ�fv(M6�6��C�l���,�eéj9�u�;��(���E�·�,u6��Cؒ�)�YdʶT?�r��f3�!lX��,�e�ʦ�fQv(W6�6�a�z
���)[���M���uH[[6}�N�!moY*����oq��ip��N��7�,��N��7�,
�N��7�,��N��7���3��j�d�[d��j'd��d�Jj'd�[e��j�c��e��\A�ӱ��4K9����4K���
5K+�S��M�|�LɁ������r�����Ӿ%ݑ8Kd��"I�^�j��J�9`�<�R^�H���� <�Ad��A����(�!��WeY;���9���y��4/d���_��Nr�)q����Fc�QmxV� +(=�c�-u�9����Bx���d%'��=����L6T�Ɯ�3'��
���K���X�4m�'?��H�V5��3�%��(��\V< =ͺlM<1Z�ɬQXA��l���F��eT�������3VAm�k����^[s�!�U����~K�\{�|~��~F�>�Ca�U{������<��dU{��-]��Jef˚.�F�q쪆;��1]�'�S�� �Ek��M�W���$���{h����ӯ©�G��OW����k�:f0'h�*��9U/�0_�O{�i��P^U�h#��YU�*�X��D<����/��W��U�:��]�.M#<V�!ď6�h��Y�O�;����[��yYa{��W�2K7��� ��[��^�?]�#��i��,U�b�H��l�v�b�0�ɪC����x]M��hc���vD
U P��TK�~���.)n4n��)5��$`���/u"��I#�R/H�N��m��bS��O(��J�6��tz�U9�g]i�0Wc�ZF#"Շwv��j�!_]�5t)���s��-f��e����Ln�X1�J�`�H�I)��`l��6�V���m,�ʬ_r3J�4jUÍ�`�����4�q�1UY���,�p�Ơ5.m��vƨ3F�1��9�3(������ʒ]�Ҳ�! +�38EA�r�`��0�ױ�Z�hO��kk�4vUÎ�Y���I��e�Z��(�a�9���g&C�e�v���j��� +��`�_a�q��Aw�^r�ũ���e�`[������'��n<kv$z�U8��r��4B8U
;N�0�e٩:G��Q�I��+�~���8O������eY������ +sf�˛�w�J����P����Y� w>�CvU$��O�N�Xx�:0�2Nu��7A.�eDQB����_0by�é^�*dЖ��N���q�H�lAjLn�Ά
��.K�`~"@�*�6��/I��6��粄��QEm�E�dm7��u�hi��R�ێ�ܦ� �<|*�k[;������N��r��^�U;��������`(�;�Q'�-'�hɸ��1�o
D-���5��m#�;l���U]no����Q�E��3��x:���a�CjL'k;�5�Ŵӿ�c��Bݨ����n��ۺc +�"���� +���M, +�'[]F7^�@�xȽ��X�sj��Z=L{p�GPp�MY�� +_�;o�>_>#�en1� +�0Gi�^�=$��).�<%�"y\(�I���*KNA���u �d=���>f%�xQk� ��A;WD�`���c +�t�<�T��H�#�t��S7 �Vs�bYQ�O`S1x�Q1;K��t�ù�k9�U�Q�-��q�u2/�����w���� +dl�O9�gp�T%Rы�/ܤ�AKe��doL��H�@3��7Ve@ +#�'�*���j�@�)��a�)�(�>i�����TA3NE��s�g�t�*:�a^��f�'(ZN� +HҘ*24�ꑼN����c�x�t�1��8�1<GF~E��TC�r�U�~��NdKQg\���M��x�1%�m=��j���@�/�0�����%����p����j;C��x!��N�,��0�6�5�(��H;>8aL +2-�@�
��2�N��Q���/��8�Z�H�
B;�bqK +*�I[ASEܚ�W�Q
x�@����VD�{P0'\�4`�ڀC?>��>� +F�`i$�$4�x�}��{M*i}����f� +�[�ƽ�$���d�n#�ĵh��� +��qk�m��6 +�
�nw�p��@U�d"�Y2.�� 2�,�b\�b�!�R���[��s�XW�i+~�`G_�iy:)�g�B�]�v1m���V!�-��:S{Ԩ�HZU�-LO�s�@*b�U4��Ur���ә��;[c�g����~K�jF�t�5�Bcߦxs��f
�m!:�B8��j�q +ڿ0����[5Z�U���I�F9��6�xՏO��CCHAe���%UB��S0'��YPǪx�T��+ .��a%��E��a��i`��~��jf�7�·X%ڵw���0Ju�ԊwJ^����p8�%F +}�f�J55vCby��;onO����k���s=��0YN�D�:�'A��k]��t�1��v8+�in�ʬ'Tٿ���X�g�#�� jZ�uS��T�w�7�u�/�z% +*��e�2:� ��d���7�]��~���Xt� +(0'��|C��uq��TE�b�4��N��YE�ǻ[���S��lM�����)�"�@<su\w.�M���O�5 ��@\_"�1}�ǫ�toV_
s��iͰ�jo;�b�tT�<���B��y*�5WuìJ%���dL��j<)5c�4bui��%���A�*���chi�t��L�餕M�螶�d�+�PC�nt�h� +�U,��� lU*��6L��N�<-<��"R>}��Dk/��~��yL��؋�?~�6���&�tvY��ޓ�L���^`^*�K�c����c�&�0őN��Y�zj������ ���df({jmo�,A��ĬdOW*ާ�NA�n�
��5�Sk�#fTjsf��װޱ��(ī����J��6`D��N�'�bţr�+Z\��W�h8���+��N�H&y$%S�R�=����Dw�pI��JMIp̾`�,:���-��g�a�o������]I闱(ŭ�g#�D/3��2/q"�uxNd�J,:;�A#]PV5%G��ZL�D�=;���9��SQ�N\�u����% +�FLLu����JJ�(~��qL�����*՛�,L��3��ĸ��Ȋ,'rxJ��2'�<+`MV��g�l�u�H�9��,�|=%1�ϓ��lk,�'2���"f�P;��)�Y�xPv��䘮H �e�ו&!�X�֖�PS�����A�����5�Ɏ'zJ�A��&p*�.EL��dI6܍y;�x��]���l�@�à��|�"1*z�#q�z�C�T<栣�Q��H>���L3\�Z��~�d�P�yOY��Q�00yeEa�)��ωfp��lM_xLj
����w^y�XI� Β���,q��"O�����Gxm��������N^I���|&g�Hd�3�MM�3{�x���n ���g���̵����U]]]���Q��Y +��#�>,�C�B�X$t��bz.%<��\���Z��B&��[� +�{����)�-�ޮ7��io���U�)\�a��oK�p��`�E��D�3K������c�����ܮMo��x�����s���_?��b+�a7�5���a+�t��K�s-��OGu��xD��w��p�b�o3���@�&G��vt�mw�+��j�\d��N������)5��$ϨAgӠ�H�_������-t/!�M�D���#j@����H*H�|l
E������>��'ڡ8(����aH��2�;@��1?����Y��z@���������'�����f�����vx=j�Z)���_l�j38�g`j�/�k�ؿ�Dkc��,N��;��d<�����6���@rS ��
��Y
��>��Y�-F�������1Y_�'J��0����~S\��ڞ��#��o/M`PmG��'8Y��m}4�0!ht7/��8t�~�����7�z�>lG�V����h�$�J���l(?d��s��Bn;���~��MC�A��������1���H)n��H6�~�����@�K#��G����)�A�&}��L�nϔ?��*���)e����+�գ�� +�$�>�q��O{QZ-�G��
$� �9ހ$�Z? ��� :�1���*�\P"�p�'�S�VI�o�bE-rQ* +0�B/�<�V�$E����c!L���(���F�� �`��ѵ�l� +LL���+A�i?�10!E3�U���N +���
�Ez�{/A��a�^X�?ꉢp�G�!��Ax�A��" H�@rAP���y��D������$����� ^�d!xI���q|$���*.UY�����W�P)�^���A�c�?>T���x}~��� +Q�� +�"�Pa]�hJ�'�G��'�`!���n���F p2�x�dG`��s���kL�֥�BD�����|$�^�� +�� ���!Ų>^�䌁KPd�dRay
� +nǷ���/X�i�eNz}X�3'�Ë�5Ff8� +!}.6 +.k_�V��B���X�h%NX1ȋ���5ʢ +k +�bO�/�%&���,�, +'�']>0hO�.X^��A��\{)I�첸��ע~��Jh�}�D=.Hc ��CN;��kЕ�0�`��w/:��H�c���Ф��t�����{�H�"rJHy0TVؚ
PG��* +ݠ��cGO�X�HL��G��HKZ���Cl|�[lܞ,/�&A��`�]c4�w���h�e� ڏ����b� +��p��8 t�X.�^��b� +g�͂, v +�QS�dr/F����_ p���%��������Y�!���G��oS��z{�ۮ����2 V����>�""(�����e�)rC��i�D���^���K��((F��e9���f.\J��q��.#6ș���������� �h�;0�Q�v��ȸ�g�B��&@ha{�e� +�h�9� +�X��D����SeH�d`�Kd�75Z,R�r
��}����_�h(y4�����*ϋQ2o�M2���b4�����ȵ��z�v��s;.� ��A�6��D�~X���@���X|n�;a�_b��{��-yyt�yc�<�"Q�FL�q�4t}�h��,Xv��w��j����ୋ +h~��~��a.���R�[���� NH�v�@��j��������b�ۉ�D^��a���F�;|��S����?���x�B!�O)�v�� +Mg�5Pgt�G7p�5o7�
�x7[�3���o{G��]1���o�N�!�v"�Q ��uKf�M'<!����^�-��$զ<T۞@�h�Sˣ
�����|V��_m;ڍ��nQ6�mf8����O�����ď�c���f�)p +���8v`�c��;'�� +���0D�@s�!����dL5�w!�
�����a���'�s!��r���W���=�7��r愶׀tg�!x%(����M�ޣxf�2vb��N6�٠�7��i��)���~���,��45T�� +�tj/��N]������o�Eso]�a@�U^:�;q�[䷆���4qjr���N�ыX6�6�1����T���� Jo�?%;�Q�=
P�M{����
��b�7�E=�F��H�D��S�&�Oj���6�̑+y�QO�`s�>��*5@ÒM�,|��5��Ih�^�p�Kbw1.1?�!�/��b���0�U����k#���Җ��X��=�|��}|�[��p��6�Ŏ�ҟLT�f����-�����YQ�y�P�mٛ�v�tV�51}M3��hXۮQ +Fi$fbAS�%��(%�!�9��;��ux� ����/X3` +g���Ց]w� �:����1�u�?�LM�����yd_��6�E�����P.*��}D��A�C:���?������b����6QPr��?�Ba� +���L|v��aj�8W��w�.�V��_C.:(h�<��>n��&��L%��)jZytZ��L���L�� +����m�J)a3iR�m�ъ�OD,�5p&����\���[pE�.�!X���w���g�>�=Wn���Bo��r�^,N��z��?F����r�@�v��~a5^ߞ7WU}*��m��������i=zS��t�{�Q\���/�C���*�A�q��{�Z����x�Ҍ�f��s��������CGm8�)M�.U��ex3A�V��iB�6r�X[��z���r{��#ۖͲ�(�2fx���6����S�)@������@D3�F�$c�Z�v8:5��r� +o{(ˏ�h7��x�#JI���`U��� eȬx��g����� ��q9��ֽ�oNI��W�J"�%�@��d���c|0�Q���C�z�.c�É�A}o �6�d�
�)���ĭ�|\�?.,Nq�ʩ8�����1����OyVa�V�
+%)I]�jw<f^�sqsVJ���w����7嗔v�)xd@ e�4�}䋨�l��&�2���Wi�������V�gJ� +[1Rr���`��&�j��Z�1��qK�v�<g�H����r1S� +��?=B���t��!X+&�u�X̛�T��p�g�F��q�P���u�m�Й}�z<T�l���@�s�f�毿���li��n��t֢���3տ�� +$|0n��f�y�,������d|������?�z�����| +E�5��&����Ze7�!�u��&�
|��QߑD��9�O�(�ڼ1�,�>�Q#}=g��{����I�vM�����u�>�H�4�m���G�Օ��}Yч� ��Դ��_�X���_��gS��_�3��f�MB��� ��|g�&=�Z���3e3I;���e���Kzlɛҥ���I���1a�;ݔJ�*m| -���_�q���lB7]�g*�s%=�e�q�����M�㘛<������Ը��Ύw�#�
?a��R~�ώm�!4;�wxR���e0�$w�뽛�%;��D}xgNf<���|u��<�1����+�������Wg��ҹ�*��7��y��X�'�l$[��ti�J͢��#S)���Ȕ����x���g^,�����(�*�
g|��M���|��ӣ��yg������S;|��|aS v�j�O8�R�0���t$]���taX�ܘ���\�M}������vP ��Z��"@.���n�Hf�q.An]�x��O\n}z�z����JL<��\��y�/��F�tu:�0��ӥ�>��mJ��+��zn�l�7��v������v��x^��b�o�!k]���k��l� +ՍAWr�r�����s�t53]�=�3]�P����G]���=����{t +P^�]�a��h���~���
�6F�x+���^77y�2��ҭ���k����T^�+�z�&Yћ���:}z�;Rw�3}�J/�����I����{�U�^�1K/��o;_�Դ��g�%���VX�˯���:������J��o5��yM,�����]�_�q�@�g���Ұy�oj�@�[i���5̾���6�
��7��N��7{����3D>�cC���lH���|����y�P{}���Q��c�Yo���Ы���Ѥ�4|R���aUOM
;sbb�W��F�351:�����>�~���|}�2�J�1�&-Ƽ7�2Vm����E�mw(g|��j�^��bWJS��cw0n�9�I>DoL&��}��8X^M�}oe�� �)ro���ĸa�M��J)j35w����L����4��Ѧ����i3,ͺa�g�̇f�y�1�}���/��,a�1�st�d�<�W��5??���1�'#��y�n����m1��.�k�y��ZonK�!�jI��>K��Zj��;K{f�X��i�2�;˲\x����;��XTgu��OV:H�����ޚɆ������a�����aqS�.�m�'Kz�%9�<)G�Ɣ�1�]w���;[�=ڞ����c�+�f�&@�}-~�)�尻�/;������}s{�k��랽�u��E��>���������6ysP���#����b�w��v�i���w&�g%�v��u��䴾�N*[�wF\�gf��9�����y�y��oƹ���.��9w�L1�� ����W�UZ������xmW\sw}�:L� �#�Rq�����n +�����|c"�{���6lS��#*�㚡�>�Z��|�E��f ��ZTl�YP�T�C=��9 +L^��*,^[����>ۇ7��x�֘d��4ƽ��I��oW��ϳO9|�c�;���n��F�η�w~�ܾ�یޟK�L�GO���&���igh�=yGȏ<�Mzt��x���� +v̌��G3A�0�,�-=1�5g�۵��
�n�TہH>� �RI_�9��J�Ϡ���ԨT&ͭM�!3�?FFX3d�uB��^2�.ꌦ�ЬMߘ���b��r�p:mم��rx�.Z��юV�?O}�"���^m����G�u�IEc��-zߛ��-c)�)��1g���E����}�^��?W`�c���|�r��w����]uS�������v��=՜'�`��x�j�Ň��&������,�v&���=N|ZzӤ%2�L�diCl��dΐ�l�S�}o��T9�j���Ը�k��O�a�����Ū~kO��G���c�L2`�e_u��̾�d-��]6�����c�_��r��-���\�vPro�A%��m�D��ʧk�y�i����Ť�l�b����Yx|� +��ܶh;P�����(6�ӷ�5���])��m�����������S��S�S�aI�����g�F�Z��,��4gT�3��;���>Ag^��~���2+�p5�%����~e�5�j���C�}��?��Ƈ�@v�������A��VO���y?�z+/��
�����y��F�j�4u�WG3м�4k!k�9ُ���A��|)����m3<o��Q�U��*��9�ٶ%�S;1?��&}{;�e�����S�a
?M�A��ad:��~�� +<�z��shZ�{n:C��e�V~!�;�K�;���ث-:н�L�����&��{s�oLo��P���Q~[7L�ף
ݪ�yܝ1��w��c�`%������a��9���=c��ڻ��ڽ�x��;j�p�V뷆�Zk����}��4h�ȗ��T�
i��s�0 ��e��6� ��}N��p}��
����a<ǽ/�-L�
���H���� +Ok�ek��o�3߫-<{x��V�e�>?�ڠ��xu,?7�Bt4/��V:��w���"�y,:r��?-c�x��\v�lqe�-���|]
<Dt�d��u1�m���XdCUæ�x�ج���+���=�V�u��q�[k�ngr;�i��b'w�:�q�1�i\�,�����9Z�F[t9-#}�<�>yy���q6u"��
���-���#W�g_*�|�Ė} �_Bb�ž���4u�}x�}ʷ��na������$NA�AMO%����P�cLD>�s����6��:N�K��d�㦗ih�M�1͔�=�M��ݾ=�Bj.�֜�v���vt���n�����1�����v�&>�V���o�j������ +�X �:���{����iG-�ޓ��5W]��6���&+]1�sZ-�YϽ3ҏ�m�s���.T~�T��À�f�J�D�|�إ?�'a���n{<�����1��e��ب�ON��x�7j�f�� �v[&����c�YS�y��ӟoI߳˙X�˻D���:b��M������Ҿ1��D�/ٙ� �����k��r���ۅ��y�-ڹ����t�Zs�� +��1=~k3hK�)4NN��)�L +��aN��W<rgi�� +�'�"~B>vz#�� lj��p�&;`�S�W��0��w!&�e1P���_��rz�F��0�Τ��1z,W��É
L���h�`��%1�ߘ�4pP�w��}�a`: �ţ:ŝ� �$p�K�%�>%,��өG��+� ��C�-P��iTgV�$~ +�׳�x[�!X�����.����%�G��*]�7��>��\�B(�;���{���]��z��pB[�����$i'����d�?I���ٶB�R�<���^U���7"�5E�mp�]�Y�좃'��Z{*���,%����?qN4�&�R��s��5ᬾ����X�Y��v�g%�po��<��}�TLb3�L�sW��<�H���k���- +��:Q�|�D=j��y�>�@sW�̗�7 ���Y[��O�:䐝�h�~�.��#�Y����T��*#�Zs�� +/���I��m�s<�,0霉l���K
M���1���/�J�Zv�~����G]���B���,�\?� �d��Ͼ�{���<J�.2�@�T��!sG?�R��֝�7�����:Lr��gr]n o{sc� s���Y��h�+I/����MbנK���Lo�c���U����!4/����&X{�D5�)���
���0�X�[W��dr<��
�����'�<ڛE�~n-M���Nb=�ځbBf9�K���y@���X��J1Hp��4L�������a��yC6�x�dS�I=o���D�3OH7I�?�f�����<l@��P{4�6�w�����pQm�u���'�%�[T���˃~�zwN�A�١0�pǧ9�7��ct�vׇ.\��3��O��gW)n��\��{M.A� �oYx���Ǒ�#���!���vig?��،�G���WrY��/��A�k��,�0i9�3�������-8{�x�[����GΔՕ�[Cw���n �
�֜����S65��� �A�X����>g�Oӹ�i&F�fc������m8k-�ȹ|E2�)=�t��pp���.��n���p���g�J&��f������_�G3>
=<*;�3{�e~W� +� +n��f���N�g˫����.�M�X�Өda:��:1�JCʗr]X�z"&�����i�iZ��g�E��O�wb���J�]����:[:��|;�Ƞ�YF�u��q�Y�h�ȣh��䂉�+�md�hs������\���4R~�����b�!r��<�S��L��X�<�#�>H,z#�+a@�5D��.������h)�'���C1gz�
<�6� ��bc�+_/cG9<^����g[H����θ�d�"��8���Rj��2,r�-��t�ݎGY�w_wh ��3��P��s�,AZ�!E���P�=3C(���F����I/���$��v{����Z��V�|\�£�y c����c_KlE"�|7 ��!�o&<����C/�ޚ���X���i���0f��E`o7�����qh����N/��*�>m +�H�X
m_�`���w�4BZ�^��V��o>ҭǷV��K�Sӗ�yX�x���M�J�i�X��cٞ9�=���<8��5 +c.�L��әX��j����k��g�}�wÅj�N���0�Q�3��8iQ$&0�`�� +1��k�=��Qq9�{/�D�"!�����~��5�I��r��!�&vzJ9�uz��y�Q��c�ߘt��<���?u��}��:�!��9+Oi���P�'ڱb�~]����Q;P����wW��y�o +��Vt�6G9��;�h���ދ���� tnw�1@��K�Tp����B��4�,�D�й�ݳ��k�J(�5n��� +%D@���h}�ߢNt��q��.���W�}4o8�a�{��H���uH�i�\��N����p~z!�A���2o���#^�#F����M��n�X��j��z� +�Z!�*�4@���O����D��� ��<�}Zv��(����8|~*�m�����ہ�9yܱOǖ����G��h��I}�b��bc%���ri�|+��m�{t�O_ӡ�b�?L]�(��s_��e��[T����b�y6֕{Pz�e�)_�I�b����(˽m֙�v٧�D�?�}Z����<�:�h�<��L�~s�=u4vw�Ӕ;"^���GΞ8?��|κ�KC�K��?�z����컟=����$�c�ވ<̔�Uv���l�?n�[V�L�S�O�o'�^=y�|[=e��\�<?G`��^�X\ⵁ<ފ�T+��O�z3�GN��Y�o��ln�@�n�7�3X��� +fu<�ǟ������K-���势�eZ҆�n橪��?����I�k���K�úDԩ�4��a� s#.Z�h��y��X�M�YG2���c[ds�ъ����O�E,�{I���ed�Y4q�c��YYs +�y� B������[qR�;�G�1�AZ��%5��?�3/1>�Nv|7����<�_C�>�����I��� +��>k̟�g��X +����gV��-�~$V�ug��J��Y�ʽ~]OyI��q��q�)O%��Ee���K(zl��������Qc��ka�'� eͬ葦]U+ ,��3�d�p�#WҴ�t�b[nU�x���:����bxpV��F�\���&H"�v�F��b�Q�jn37�b4PZ�$%a�w��{�����|�a3rOi�irnȞђ�8�q�o����ӵ#z�'㠎tg��Τ��t����/�]/�u�)�:Е=��Aq.
��t�?/�&�[�d�fJR� �O(�zD_���$/y��pB���>'�Y,���
2N����+�rJ�_�q9%Ü��U�����b�`3��5�UK7�k�7�h���z�Z�ÜPNK��>+^��wEY]Y�s�h1� +]�\ᓳ���$�Sn���ym�T@<���LP,A��
#)>dHA��1]���@(-ђ{ۛ�ղVP8 +Ɋ"$ˢЂ�q��C�04�B�f��0I�%T��7N^���A���� +~�������)��}]��r�O
)m'�ռ ���[����g!oE�]����%X47�oR�YSVy7��:��a�퉳��t�����s/G�|M?�뽓�/љ`��:%*��`��iZ�)���+;)�|zcR_��
�r_��'cD�\N�&R���З@��%�nn��h��xO�D�����0�J�dzD;z��X����%ڍ�$���%�iU�Z�_�h0kR���\/�.bl??�h�����~v��I�i�sc��J��V��[��6��Y�[��sG��t��_Ɩ/y1��2K�:��3��N�Bg-�UB��$+f��� \�-�K<��(0k��&9 �ޏ6�^���~~��{�q�E;���7�5��%vpg��fu!�ρ��6�_]?��yL���w?����Z�Y��6l_e�+�`Qg?��_��t�Z���!�K-����}������p?��T/'�U���PYb ���cm(Ѕ��}b~��t$$$�8])H�:�a���[�)�ҩa����'�jQ�:�����%���s�(���=�$�"��\�5�s���г�Q�\iH��$�8�Guy�S���PK)�G�_�A1Qɧ�lz�|暌��Q�H�aq�w��m���ݜ�=Z�3�1\*�F�(�\gb�� ��|wk�����,��b�-�7���&�4r����42�t��,毬$=np��n�s��u�V7�s%�]T7����cOn�y
_�]VЉ*��]C�\A�e�/����t�ՂW��)W��RC�\A'��~PC�\A'��A
�r�B��U5t�t�Z�j��q��?���X�� +��g��:� +:l���� �*�j����-�/_ $Jvр�d�7���m�V/����N�M��_����H�KZ����:�_Z���m:��v֊�t�UK1��s�R����:S���6>�S���<>Q��r�h'��z�d*U"WJ(I�̡�\U4�I�dD� �ܞ� +��W����c�� ׇ����d�ǫ:.���n4� 3!�
bN�9�iĘ-v�۶zIj�n����OZf�A����U3*��u&L�"/wl�ԗZ�6���^���U)�����)�W���ڷ�ƪCu��%��}��.Cgj��y`# +�����I��ر�ɚ]�U`<KI\�jvi��;���_Q��W�1�V�i�E0ʦ�e�%:5�!�*є�?�x�YÜ0�)9Z��[��%ff���~�Bt{����L��3u��N1a���S-�>ȳD�ń�_*��q ���z�J.m��E����:-��t�R�^NԅLs�P#Kt�AuI��Cqu�58{'�O�ٛ�5;{r�s�х��(0ϧS5���}k�� u�r4i��*qS2�(��QU��w��J5r7*e��<<��p�����"�ߚ�k 9ogD��?ׅw$\%�RR)���:�Q{Im�
{��uş�=�Y�.�#_f'� �6��*���+!�WFd( �)���J�Ŭ����ӊ�rv�zQ�J�;ܢ�/[���"���0K
,a����ǧR�c��?�������#2ЁU!��2��Dd.��Aeh���\E�Z}�愈�d����<G[q*у�������U��X.��e��q-Ʋ���a���5����d2�y =X~'�CYUrz���}3���_P�|t����jA�����f/3Tq]��|=ź:^�B��z��xHo��lK�T���Y��7���X�.���;�p�o��)��]��w�ᤲ�k�߮��A���pJ��W���?\���$N�-��~=� �������玲q�]�zJ���� v�4�Z~�N��m�J��W�#�k9�Е0'RζԒ�ZkʉT[�����f@ +'H����T�}��h�#�텵�p?�P�u�ɠ��.�Pq�|@�2ߙw��LƳ��~��l�R��"���<�~���G���O�!t�x����]����e�`�#z_�/J2�����n���#C?�R��h�b��� ,s��\������� �Ң�m��*>S>�Iա>U����&���,w��*R{�w
E�+R{�����J�߯T��~�NE*��7*RQ���+RQ/�Q����v��%����D��ԫ��l.n�������PT +'-�~���+f��F)���z)���B�)��W��?(��A����%�pQ�A)�t|L��Q2���~�R��T6WUˉ�B{,�Vq��&z����"�Ȩ3�����a.�vs�W��Ѹ��t:/�r)�w��^�,��{�=G���Q �p^���8�<n����4�h��ӆ�!�
��l3V��={H�l���k��ϙm<����T�=H�������9�#�B�2q�bIU�!/��Qz��;<�j|���� +?����M�Z����yR*vzd��fR���T�Uzr@?��\APq-Vȱ�E���n��i�t3��LoU*v#�"�����K� +;�`���r�n/JUgK� +�u�)�\M�r@G���=<��ܿ�d�k\y��r@�vxVa�r�Ɵ8>il�j�F-}�eM=�l5��:˴�!z��b��B�P�b�Rn��cŎE�GT3���G=CU5����KJ�}1�ԒS��<X��7o���vD�L
�%��䮊½�5�H�TC�3!���S�DN1�O;?�\"';>�{��.�:>��4]��Yj?�?N�zɍ�/"�Mw�z�r��;�tߋ�\[M'�����j:������N*&(^/?������n�|5�T,^:��'�t�pkV���U�Iu�rB�7�龩�����ڧ9��_���������SM'UK�1��j:�X���߫���]���j:)㆟;�;�tR�t2��������A�R�n5��qzc��j:���Ȇ�a5��+�;��UM'g[�n5�v����NԕxO����E����k�~��N������: +2U�rH�P�* +4�.'ܘ�J�b��U�.+�$�H!+a�p����DZL�ݑŝ�#����͕#s�۲�.���5w�s�4��߹�N�v���Z%����Uri+�Ӕ ���|���gs��l��2���t͝jD����q6��Ew?�掭}S��N��Ѧ��\y�I�I�^gQ���M�lr����i�O�]tA�j��2:�<+F�5�i�h�Q�0�O��\_P��H"Cԑ
� 9Y�
[ +�J%\s6t��?�9 +:Ӗѭ�،e߯T>�|+�(�p87���t��T/�̮�o�@��E%�d��z-;�LSa������결����SQg�r�1�1�V�0��.YR6�H�z߫R��rKU�]fP+z�r9ԣ��W*SN'_oI\vU>��
��&�E�y�?^uQ����x���ۋRV����)l??������N8�.W�QC!�U;�6��2li(d����
w��J�;%�+�{o�u7�)U>�`����Wn�S�'�vS�O�N7��|*�p'�K�R���{Ew�]Ý�S�Q���k_��f������:S7sn�:��t�+�W>�?B���r��ι��|Cn^�����z� +��S�G�VT�t�v��.��v�"&��(e��L������7�eLZ��,Ѯ��i1-eL�A��N�]��E��)d�T��趟VeȪeUj)b�DWb���~��UELrD��DM{�a������T~�a(qX�S���7j\Sn�SŐ�r�tW]��I)o�u~�h��}����T��0��U�=�ܔ��f�+o}��04T=�J����j\���2#
�h����|��������NF�ƍ)}�h4��
�r5\ݗ}z�)KL�f��b��'A��]�TPwc�Z�?T%��-�z������)�ɢ2<�.W�G�L��&W��*Ƣ�n��c%r��GY��B�=����vz��:��x@��i;c>�#�U9ڬw/)�7&D`�s�2�����O�R�&�6�|��sV\�� +2� +�����(�Zˣ}��RL�>��(V���tvQ.,er������m���0���{�w�s{}�ܴ��03 +TS���z��4 +z}���I&n����KC�����M�j�OG_��*�R��\��g�ζ�_�i��g��P2��~�nÒ�]����qzJ���oڼ״������9����o�kKF���%�qu�f��o��l��Mq�]<�<M���L�����M�N.�~|s��gn%��3�l� }���{�6���L��M��iŃt�����{�'qv�[)�yÓ8�m8]_����c�f��o���Z�m?��iLޏ/
����o���RIb��z��X������:��~c�����3S���+:�~S˜I�،��M��o�U���~s�����/���4�����ߌ���*w�l9�����-]�,eN}�&���]�&�r6Ӿ~S�w�{�ͺ��ԁN�lJ����X��M].��~��[�=c3�y�d]9��~��+YW�YG���7到t +�/�S��f��H{{�������Z��VO�C��>���q��c;.������l;\*/�T^S��d��A��O��r�;鱲���#������6HM-�AيSm����4���H��-��b+�W�mb9��M��:�D:q�����+�/��}ȡm�bI�K�[-�F��d�a�*yK�"�b_�Dk��堲�a��-�}�ŭ�U�_<�hp�xv{����ikڠ���p`Sh��(���fc��}f~i���4�q��Gk�-�6=q���M�{�4V�n�w䀷�+�I�K��~�ʽ-l�TRܚO�[�L\��(`�+�g�crFV7������_2�/��뗲F�����Ŗ"����e�k�fC%�K�`~(.]8�D屳�kK�7�.`;Jw�`�-��n9s����`}��G�-��Ə�,K��l������߫���eR��qb��)���R��w���0�ˋ�R�P�1�G�,�Q.�+����h���e�DihUM�XƷ}��ln{G!���J�B߱�b����i�Վ"�K�Vm���QB��ZJ������f���_�_������]g����-e?-+X���G늌�RR �));�K�\������ݒu�8_w���0�~��|���`O���q�o�IJ��b��c������P�b����ӻnsY��]^6T�ۻ�̼���K�=v8�X�������Y���,M\����z:���ST�/\J�RYűm+�w����wm��ڲ���H�����J���|������|��e��jJ��nl۩o�pA�9���Y����g?`gl� +�<j9��{�[��Q��s�SK6m?v���:�ݕ�HLg��8�������� c��X�/�_��v����+�wGΘ��\���Ol�7۶�V��۴��@`�\ytY���~�ų��~�U�^+�:��c�MsZ�8oO1:s��7��v>�r��ڪ��Zh��U�͕%Eu���m���ɴ����-0}|d����l!���],)>�+*>���_.�}���$��>��ْ�3{+�����9�V(����'�:�5�q����N)�"��h�M�D�I�ZBœؔB%I�>�Au>�}m�y%M��Z���!K��G�����1]M���ݡ-��n:>fV�))Yy��^��R�l��y�ɧ�ѹ�����٣���M��RC�լ�τ\�~���v6��5�ƶ�\J��̥�ɚ�|�XȔ�,����n]ߠ�5�^_��n�g��oeqBV��hՂ%�� +��-�V��6���]�
�,-������T`֏)$Qs�~'��ִq���WVe��\v=�������h� ��7���BZ�]"ķ���V�`Z*�������uY����>�ɰ�gy��ڋ��>lH��e��"�쨴� +�/-�m���ˌ�w���n�)b��*���;K蚦�����F�o�k��j�\V ��R��B��������,_��C'��^ܶ��qM2���D�h�&�wg�8f{�%���mqU��u[6��=�������651��ڲ���ҍ��L3_��g�]_����,5/�rg�ytg�.Ki�Xwķ��s�Iߵ��ۼoy�z���l{,����評�W�����EdJ�i�[F��)���e�����# ��Q�m���]�o�Ş��>H���V�[VQ|�1��SM���c�+��.�[Giء +;�bW���%2S�/-�Vy2��<p���8a�$W�0W�[�:�c\=�V����� �|��I��}����}I'��~�{���?i\��C�t����-�{�z������V:[VZ��)�Sf�2yj}qE�c�K��,�L\�ڳ�6��5� f!�Z�F?�J����b��B6�����u���lY�M��饄����|��-�r��ڸ�:iv,I8��6,ZSRZ�YS���S���܉�m-gN�i�,]���M�������-'Nԝx������'N4�z�y�7���YYq����'<,�j��զf����<b�����2k�抓k��!q��#'K�n�L?\F]�k�.=�x���cE2}���.-���..��r�m�I=�l�/+N�ln�,���3��Ek�)�ɕ{6��Y^|��cšM��+�w�*/n-9oX,��uLx��-�ċO�V��[����eŁ�ԛ_A�E�XS�]ZP^N�����m�Ƿ��`�w٦�ǩ|y�4��8Ҽ�:%���3W 3�4�=����f�kMxZɓ�Z��أ�6?�V�x��3��~�EX�2��,~�CֿMo12e-!�B~���8����R��L�^�q{ybۍ��e{�ݭK3&��ְ���5��F.��m�\/lnh����R.��j��妇��~�1�ͧ��poMB�6��>�/��=o&>m�0� O��d�����5����l�Ukv�]��'�*���{
5�Pj<M��r��]��E}x�=�¢
,���6.t�v��X�GJJ�քȻ�����衲
k�e�Z=B�z���W�M����e\/�P?����g����Z�A`c�C_n��!��Fr,��Z�,��r��U��c���r����r��K롒R��<��;Rj�;�P4�tgX��+&������%]�{��6x�V�R��=���%UJ!�N\�?ɩ��:dE��Y7��A�����O +��g�]4U�$����Y�����=K�>R���㽤�l��}��܃�f����tζijk.'�|��$0��~V'Nݛ�)+�7�)0l�םm2Nq>�es���oM��n����붷��+�c �y���g~��;�P��ݮ�l�
����h�� �u.�}�C7�:f��0X��qKY|�38��u�3�\�xW��ij!,����z&�-q�t�11����S������⩤K�R���>%����5�H�͖�T67�|��0IW}�i�q���?�1V��(��I�ؔ�8T^2�18�?�1V�T0�Ky5�K� �
��;��.���`�d c,�M(5��o����l��Ky�K�����J��j��W��i�����FY_X7��AU�ԧ�=_�:�в��� �������9���;˦ه�
ť�'rhEkQ�c�M=$��p�Ta��D�r/�؇���q������☴zٜFıe��G#�����������F��жr������Օ��LQ&���}]��{lE���Ɔ��#J͖�U,�[V�'O�k�����[#0|���-��-�r�Cnۉ&��pvYYc��R���-�4��-R��q��z_M�%1�*T�0g�0Ü�U7�g�}�^<��q����0��t�\�Zwt\��윙����'-���%�L���4%�L��Fr��B&M I�hMCRH�d)!��4&�L�B}�iK +�4%�KڒB +'K !ǒ���ISB�E1mI!������L +��Օc0��|��o��&�n;���E����l��f�}��Syİ��N/
��A�f�eJBKtGJ��Xw��\��4+.c��,��&�6�������`�zf��� nd��
+�,_d��ذ�F�uN�P����!�3#ؽ?6@�,�?�8_��r�#��c/�!��ڪ�L��U��.�Wt�� =`B�i�v��b�E^�ڰ��E2�V6V6�z*�2�fֶ�V6n>q�LS͑�O�,*���J��u�ZOi�O�ʕ��J�m��E��w=����E%�M�����M-�g���9�t��i�:�UCmM}�³���A#��z��.�4��&?*�>��RO�����џ� +��T>u�|K�����g.�9z�gˮ]�������7��#�kx��9��mQ�~p仧ɇ*��q�Փ��O�g���q��;�� �9wb��$�<r�������E�'�w�؉��fO��E�=%E�%��W��^��du隒U�OM�v횢�kK^�j�5��+<�V����YS�Y�b5���o����E��=���]�N� +��%2رUi=��\钒�5�5���8 += +.&;kE��fa�$ד�(�ʊ�S � + +B +=�2i�������<M6^# + +j�LjyU]�C�t-"vɣQ�����5�A�Tي�e�uQ�����bo��*���� +19rC._K"� +�F�3��)7���� +�>�?. +J��K��fX&m�^9I��͡��� +|�a| +a� +Z�NJ +uv��.��0�]S1���?�|��TE���{� +훓�V� +��>��5� +cJ�\L��~�ea���"��4�2���� +����,��z�G�$p�V��i�]Ҁ��OA����� +-2��$��f+F-�6G��c +�d̀�� ~`�Б�V��H��2rt1Y�X/�+&0W����*:wE��K +Ri��qD��f�$�q\<�0-�y��:4�շb4�&���GvN�����A��Ẍ�09�tQ�r$5�� +�� +�qHJ`栞;3$R���u���
wH#]��DFRU@}٣Qy+���'�Z���<`rH��q__�+[&�dӬ�L
���B�
�$�]Ԍ�s[��㖢� +���2�0Nc���Qì�����H�5/�\��y���癤���|O�<�*���
yտ������������w�F����\ѷ`ݲ�뿲�÷��W�,ď�f��J��]�|�94&�*~�Nh��>�;�=�'+�e����o��$����O�qYz��g춆��[=�
��4`2"�j�?>!>�5�ʕ'�H�k�z0�$G$w&x�����b9���R��j���YzL�{}�|k�!4&_>�Ue}�$'K�`��AOc�$iA�Y(<&�Ɗ?�C����@R��x�2SvK0�iL��]��!/Y�vey�����ri�G�E��EL��j`���J�KG=o_�x@n8�d�1E%8{�r壚��'�wgqQ���W��x��I�A��KU��A�0���U�o����]��E�'ouKГ���Gΰ&�����#�S�f�X�+�� +'#O��`��V/��`�탞gC09��rZ�v嘘T��d�I��'�L!8�:���x�I'A�������L?��
�|F"C��Ip����v�_<�(�� +��4=�ؚ����Z��Q +��.��r��������
����eT�g@3��OI��'�@��4+�t��JA���rf�/6���Z�}����{=w��wP�˛�Г`J4˕�Y|�L��3Y�n�ci� +ϳ&��}V�� \�n�� +%8����Iߕ�4�� �Qn��A+�+ ��`7t1Y��*.ުA�͖��8�y���� ��1�`��3�DL��j���h8�&�ӣ�zvk�8��I���!C��h��'A0A^/����!1�Y����
Rb�W���9����I+Y�E�����=q�X8�}2��q��S��j}��s�WBF�)9�uK���IRO�ol��xn��e�{L!8|M�)>��m� ��$���3^�'�&� �jn����)&��$]�&8$�f{��XL�����Z4X�$�Xƾ�]�� ���8�h����+����dߌ#��twW��(c���� ���s>��so@|�&����&*�V5�-����J���FoDqP��8�z�cH�
rG�"��#yp|� �"���$�B(�G�\����>��V���=)�B-�����8�݀������� 8i9�J���W"�ϡ¹�I��hz�Y��fT�N�������Iɶ�0���YQ��L7Һ�.s�a�(�L&�M�+ܟk�ܿ,���p��EUs�\�!�?��_=��v;3`21�JA�0� +��=v�` +�����na�(�4�-|�U5c +��u�_>�#�3w�L6x�� +��^M���(��ΆV��-�X'w�> �v�Ĝ?�-��P��Q�BOf�5e���!\b���Tf6]O2!��n'�u�B�~�0��dGP���^�(��=�wg:i��꿡�_;��qрI�犬 ?K4�B�r=a����;����Ѱ�"P�<�6a�����&$�3x�_�]/�S�L��)��1o,�*L�=Wd�OSUtg7*9�>��]����&k¸��ܿ,!1�!|�2-v�&p"y�͈&��S�'�y��D���&����փ�n n6X��j�a�E�����(G�����$W�DL~�U�P������!���I�ev����9.�������aPCF���PBOfy��aU��9ߕ�BG攙Oe,rR�d1�2�3M�1@FE7�� �P$������/��z�<�%~�z2��&�뗏{����<f�CL:�NTDqi!�ı{p��saN��^�\'[2�1@Ӈm�Q�u&&G5������v�.LΖD60�&���L���'ú��#��;*]�s���(G��|!�@�}s3*�g�����\9���0����Z�#qd�8�:��a�
�A�I��DQ:����kГ6�I09���r^|f+ʕω\0�JAB=q��d�Ӈ� hy9��j����^o���U�uEzpU�ۋJ;�$���)�����В{��9Z�U +��t0�q�'�Vî^'A�&�Ĝ +�G<���w���]>`U͇�U�$�0������.� &�:qzR�Г����$�M������כٲl?�|���Ұ�ʅU��DL��I�#{X�$�o�1e�nz��`��l�^Ü&t������z���_G$R�6GcГ(&٩&�_���#`2�S/CTD���
:
Q=�"�
�&��+ݟ:�y�2
����=���=~���7Tʯ���ո:��J'{�M�� +�m�G}�z�*,�@�*I#`�gO˟��!J�i'�� =A��q:x�Q������B���p�t��i$��$Q�|�$;�DL~����i���X���W� +�q��� ��"����B_�����Qf9��9��(�r�h�>{�ۥ `2#���mJ�'9�L��]U\1'A0��s>��=�#���$���)9<`rD��&�q�&3��Qaﱈ�n������n���\$��_:�}�e�ݺ�5oƜ�'��k�7���ې}�q�e�aY=�D�vH�9 = ��Gބ�OyQ�2�y��~]g����R=��I_w����M��"z$�2�N��תV��Q��L�N-Lk�Ț0�락|c���I0�ʯtH�;���I�o(p{�s�wʘ;Z�^Ü���&�\fGP��3�����;;��e��5ۮ�HI2�j>��s�����H�z4V�bҙЍ���[
�����Π�����N��g�띕$Wm�1!��0G��w���w `2s
�zMZ5N���L�뮅�B0N�`���>�ˬ%$e�N��=�˕�P寞����I�op2��`��/����8N��yyZ�'m� . +��v�~�ׅ��&�D��zs��8
z�nŭ���[A� ��(��!��Q�7$e6��'���vK��R�LL�F�<%}��V�D�d&S32q�Z/0N:�EZ �U� +g7:�<���#���;�H� +�D$��Q�� +�1{�%Vv2 +=�<�E�tY!���":���/�������*�1 �LJ09�ɿh�>u���l!�ġm���-�T6���U������a ��-$�j����^o$�d����BJ3`�{�� 4���L�\�Ǫh��8ʘ;d$�עL:���G��}�����*�����<`rX���Izf���ʳ�TL*�K��q�IG����j���8 ��'�����9Y�W�;����&b���_>鋱r��qg5VƼ3L#'���L��
/�G�Et<y�� +�� +rt=Y���n�'AL�� ��(3�������v19�y���(W��de̅(�āq�iH�0�x�?�qS$O�y�Na(F�zCRf&�_�� +%/WN���O�p� +F�? A�.F���'}�>�Ĝ�#���{l������'}�0-W�4`�Q3�Pg7��N_A<]�d +Y����Is2��B̽�9Ͼ���wQ�p��^i�xm�i����ݼ!� p�d��[��` �i9�J�G�[��;H����p36'=�˕�h�7Ή�t6���՞8�N:z��J/�� �7y��WXF*f�VS ���W5'�pX��u�}�
#`�zR/; 1�0p=
.���>A�yv)���y�����Up��/�NO�ɟ�˟9�!��&�0���!���#'{ȊRq�8 ����(?�_�7 �e&����P��QM����?�ͲoP�4����"쓎�^v��#r�b�Y)��Ḿ������$��L�P�o���N[r�>�@��%�_F�E�A���� �@��!"��6�5M���v>�"���'y�����7��=U4`���f5v_�71�'��vx
�턥�a7�H��]��\��a"�]V9�o]�!�w�R*A�&_�?�� `�st�Ǣ�`���� �@"H�a�����m?�`V��M�<`���?)}��������ZOg�;Nc +���e'�B%ك�n3���}e��JMm�3���?�:��0 ��h�e�T-�"�N�, ��A7j�� �i���n~���
|�DN�w[��*f�D�$����j��8zv; yF�n��}�!����ۤѨ��e����ȋɿ�/���B;Ep���]%DC�Uc +�co�8A�T����D�$�H$ͽ���ʁ|�i4*�Ƌ�*I�ك�K�R�M�T4D�N�&��ij�^-��F�I3�A��^�W%���X=�M��{$�Ʌ���M�<�(�J��K��5x�+�6`&�L���*2����=�������A'������*&�_u���Jf$*����'����C�1��?Z���� '�:(P�1�$p[t���
= ���$��(�_]�n��db��z����?�%�O��E���=TR�!�p�=���8h��rG������AǒwT��Q&ӊI.cnu�/�H��Gcc.5k>�S��t8��Mq�ZΔ$�����q���� �C.&_���ɓ҈6����I���wz�E h�����:�x�8�|
*+;G�E'�Z,�mA��d����!jdT�Uh����D�E[x@��J�8EuII.((N��_��Y�F�/�0=Y�;O��h����ɁZ��.J7�)Y&�z�(m�[cC(���\��^��V�!)HV%f�V�{q�I���ɖ�����(> ���I�=��$��PLr�2�����mou��ju|�s�.)mc�B��F��2��t;z���k�;��4� ����Du�Ac&'�-O�Dy�Ǐ,��~1���v�.)�%���{��6�������y缧��M_[ ���ے�X����\%JdbDZ-ﲭ}I +m�������#8�Sx���7W�U~&�I +� +;���EK��f�[�Қ��Wr��QʿyȎn��G�6/�s�����f��X�� + +�g�'��+��]��a>۠|��V_��v�+eJ�o�}2�vV�� +��$_~�4m�]h25
�^�"W�$Qc��s��R>#��[�����'��Fe��s9�����d���-n��%���} +[�??ye��. +Qf��"v�[��D)�7*�= +ƀ +z��cB&3s �rQUFQ��xF����ɾؽÕ�L�P�܁�+�h��n���'3��ZLjy�n.��7 +�ɀ���m�A�d�.�W�b��`&Xՠ��ɾX�r8����F����� +�x��s_.�|����%o�!ƞ�U���e�aR)E��Ll�n�K��^QTT�Fml��]�n)�9 +-D�-!EiѪA�3�i�wUy���[�X�6��ind2�"nSeS�-�֖>Z +��d�I"!�[�xi�� �� +N��p�<>��R?$���vM���%,U�`�5����*�� ?QʘL���4�d���Š�&S�A��e�^4����w}��3���SJtc� �C-Ehy����+�z
"{Q�*���7j������wȇ�B +y���p���O +[%�r>�W�����ֺ��G�5Pz+� +�zk�2�0���BWJ�0l��52����� �CEE3��'�.��4�yj,��Rnm��Hׯ�i��@/��u����k�g�*�L�+t�[E�E��jZ�싥��R6��F�9ϒ��֊hI�J���:�x=�U�r���B�+�<v���;�l�"��6j�6���� +Le�&��ODP�Rh��D�̢z��M��I�|V��M2��m�C r6@&MG�y�MB�E#�`U�L�!�� + _���C�cJa^�r�P +��M���������TF�ΐK�2 �8��X_by~��݃ty2iz�{�8�얮�I�/q�J����!{�5�f%(����(A)*�J龕m������h� @��e���GBf�d��/c8�c�����Jy�A�����BRJ.*ͬ�L%���v�%�����h[��&7I +e�>ɖ���->�RjU�����F+�7�*�3��AȤI!p�Y�w���.z�^�%��X�J٨|�>[�,|O���X�J!&�視7�:�E�J�}�e�M��)i2 �4%�%Ny�TK��pP��G�W�؎����9���8�D �\ V�\�#��VVp��R����]> +�{QAas#�6�~��=�X�����*���n��WN[��aG�s>�n�W�z?*���:�;��&� +���½��2ǀ���iG��n�����m�SY����g�����F�o��wK9�� V�H.���2YH��@<t�[�
a��P/N?��'����*e�\J����9�����o
x��~��JT`N ���{/"Ei�� +:�ϕrPU�����ڦ���X ʠ7�HQ�u����|�[�2���� +���Zj �z�!��` +�%���o?�PX-��L��A,y��Ƌ�/��Ɣ���R�PGhC�'�o�F�fm]Q�C�_iU��1p(% +�"<W[���¸јR��5fRJ^����.���|�\QwZ'BKVҽ
|��K�~ +Q��xa7^�e��Gӱ���
y���_8���?Y�'�����e�ˬ�2��� +@&p�쨲�t���$/D9�- w0�A����9Wʷ���aEYy�����5�z�Z�Jf��`/%�k�er(D�Lb"I�ދq�M~qs�^���<��#�ѓ7�o���E-�d�'Z=�b9���ݢ���[Ƞ%��I���H~*g�-y㬷��u�h�8Ӑ#��yd�U�R�&)�3�����J7"��� ����n�����T�L�TXɓy2 ҂�^�4^�mȱQGYo=#��ן�
G�7��$V�<hv:6T�'B�-#-u�͓ ?!�<������`���H�G����+-h�8�c�ʛ�����ߊn�d=qh@&9�s��[C>��)+o�27�C4���6ǀ +��CGNl��C'=�t�29��c{)���J=���V�;4��s���7�4 �2I^��Ӹ2 2f��)^���X�<�l��PH��㎆K@�su*M��^['8�{�K�/a_��"Z.�|�݀�8���Q +0�q�Y�O�>�r?��ͭ�FOqN)e�[7]�Ɓ�[�C�3�6���Q �L���w��L��z/ +031�-]i�����+\)�ŔR�c6K:�ˬ*k���B�� E|wE�̦z�C�W��"0 Vj�<uy�S�^���^���m�/��@r�O�R�H��h������r��+�{�i.�o� +�G%�&Mq�nި-R=V�k�9I����HI��v�Q�dq��Ae����:1މ-�)�C����a�-���loWk��.4�&9�#~u��d�=k�Ra�CSB��_��N^��\�Y +z/�0/�>U�7�6g/K9�m���t�=�j��{�J�����p���� +B)� �L~�>��z� +Q�@'m�x�M�z�����p���~;1�7j!����+e��?�ǻX]J(%�2�LB&A��%o���i ~�? _ +;���
x+x�hA�}�� +`2Ȑ�:�{Q��Kޗ���md�^mv���I�$B�f)+��X�V �B��=�]U���O�c���8{�E�������2��u����g_���Q�a@D���b���������]2��Đ�=�>�u�ǁ1���6W_�A�I���e)���&�?�L���^.c�`0�'���m�^�D��w�X(Z:f�h]J(%ȘD�� �`h!���O�����-�I� �JAD){������O"���RzD)y!�f�.���27�B��/y���.\o�>�熞��.�"���O�'�_�n*�T��YJ�"�4��~��gC��&P8\k�������IFo�C�XPͻ�>�B�� +��ɣ�hi ���S^�2 +�^�T
�Z|2�� .��<��#��ҩ���K ��י1��TP��T����.\m�� +@v!��ua�CF�E=�ˣ��{�������@d'��x+��RB)���`{&���c ����p!>9Ʃ ����ʍ���p7����Q�P�R"K ���d����[��)U�� +�����yA��(E?S�ã��ZP�0�H�K�|�E�;.��T9�N4PN2��'n����<v���>�;�S����_p�x���sJ�����Gl�y�����о$|O���/�Y_���8Ĩ��ۻ�!U��K +�O"r&�O�x�VW#�%�!���8����Τ�T�dՙ;�g�x�L .ϳ�a�4܄g; +��&HQ�(D�c�2 +� +N���B�X�N�Ӎv��A��f^◯4����X�n�$"�u:'��ȋ�9 ��`n��e�!Fՠt��IZ�>�ȍ�6�H�]2���v�[����ǯ7aA'�N�t�EF�۔ ҕ�ᐳ?Z|2�D��X�����"�% +�] |2c"� +���C�9�>y�aAQQ�'�擣��I�%&��`:z�\k�p(2
�U��`��W�h1�wvQ���I����ث�]� Yc�� ++f>����++�=�R��)b!�:&
��=��$/�(; �jQ0~*g/��3�Ƌ?B���F'�I���W��Â��I<��p������b�����9Ή��'���'KN����vDP)�(� +/D)���/�A���x�Phs�|�ȂE�jkkc)J,y#����tq�D; +�(H +�.�(���7v��]���'�Kag������%Om�J�,E �D���D���HN�] +/D �LZ5(,���_�D|�a��M%�{��֮-^�)J���ҍnǺA� +�=�K<,y#�
*��_�tKHN�|���$H���7�2Ӌ��J<��ƹs��9H�]�=�BM����C�x,�ul���am��L�N�x�RH����q��D�ؑ�Z��O[&#�j��L��U�'�X�q��NqWi���)o��[�� �'Xr�/�ǻ���O�� +Q.^UA|�_�F�1m���|^gw�� �� .5�����1���U�Y�o��p1 +��Do}���v:z�K��;%�l<��3{�?�a܂;�q0q�d�1v�������'o+���n��j^�\�H|rŲ'���)������{'�� �Jߊ:�$s.y�R�D��L~�
�o{f:I ������薆CRv���Ń�����䒵��sٽU�غ�g��)J2T�/bre�y���ؖu�U5|���E�]�k���K��'q*1m|Э��$0�{)���=���C�*�����Ҡ;'������s�婭6�)�2�B�I>4X�k�҉�l�<��1tH���S�\SM _�K=?yF�YJ�z�ʓ=
�4>�-���ˏ�֎��F9�VEݵ2z*'��>���vN���rD^�O33U)�\%-.�w�ՠp1 ++�+%y�4�*��Ƿ���.�|����{�l�&ڶq-�˳��9��4~gVI��@���.����3pɛ�(������>�W�o_[��Gnϼ� +�{��|ɛɹy�[(-xO9�MN�3�d���+�<Wyz��h�(@��V���/������>U��j���d�R>Q}� �L�#ח6�>��OrU�̖���O��'$f���R��tQ\1�ٳ����C^g����ʋJ%�|�[(O78_�z'�qV�����Һ.�%o���' ���J/���<Lp��2U�@����zִ1�7�8Ϊ��;���!���j|-!9�d�\G�����C���ˡ������aeK�����ءF�7�!o=w�ms��h��d��Q
�o����C��qKe��S+�Oa�>y�ʺ�/be!+;9������ +��dMN��r��O�M�Rr��i��D{�L�mnN�����i��-��^_�ɞ9�i�rǦ5���KI1��d�� +�s�]��F�W[�뺅����O��wg|�;��GW��Jv՛�w��^���'ɗ��+�O�^�[��v]\zw
_��'�(� +��;�� ���=��7]�T�[;������sD;6�!�yj�[tr����46Oj�0�%����v����6�<9߽�,�!�8v;���α}��>4�{G:�l���+�x�n�\�n���$�v�N�I�(���^m�ƻ��w% +Gd~��8!���-[���dR.��amߴ�����G7O֧?H.79�Y�hu�k=�M���H�O�#�7|�@�F�=�vN�>��R�A��0{�U��.G�~��ۜm����+�O��8�}���� ݸ_��^G���/h�v�����C�ګϒ��t�w���x'L�'�ݱd��?}�V8OH��q�'�M�ך]g]ee��O��u���UuZ~2��"|����NN�m�����{( +���yk� t�w�,� +����s�nt��$z,`��20Y]��,��s��$��u����{�n(��z9UR2��9D��s�`F��n�� +�3�$=��dR\o���w��֭D,�}v�����3�5�M�����?}�i�o�*������>��L)�4��e�m�Wm���e��O�<������?�1 +wet�3���4f�}�W�ֻ�7�[�J���2T���km҄��'/�9�H��7�����γ�#U��y&�Z�'�*�}_|jeO����sFغ�h'ͦ��6���+ͮ��/q�7-]W�b�f� �����'MEѓ8�R�$'Cne)o�J����ۧvK���ms��V��Op�u-��w��~����[���/EI;��v�{gR)��H�����=Lsg,/>�㧝�|%�ҺG���/��(�w�4/�������&��m�j��϶P�_�����Kܛ�{�<? �4s����.2�>D�I +v���n����y�$ +K����+�����}�r��!��y�1�~jv�T<�\�R3N�r�ʇ7���(e�\a���b�\���]<�+���y���=~�E59��N��'#�$Ǣ�HiΎؕ�-[�K�~y�uLF��͢~r�E?bzr!_Гq�x����g���+���68��2���udshc�R������_<Ծ��F@���<~{W���)M�a?X�2� +�՜}�`zr߽g����o[��y'�R��S%r��HAy������g3=y�_O +� SOZ-��&�er��"3q +:q +ԓk"�I/��>Y��_��& +)��w�:+v�[m�Xj�v +�>ݲ-W���tk[�����y��
�'��x[��F���� ����t��UM7���տ��-���UH�=�3�z���\��;����/�榠���d�z���7_����j�Y+��Kv��j[��G�����-Tj�ʓ����G=��>LQO�x4v0�r�f]~�
�
�^\O����>-� �HR2i����4/�iK�H��
CuAk����s�}`~�=���Ϋn�麋F���i�.B���k^�J#D)�'-l� ��M�j,�8�>ޛ����URX�Ralϕ��d���`�GB_~J]�z��E���'�b�8N\|�m�Ǝ�oyp2^/� +��!mYH�yϸ:�(�g_i���䤾����~�`�O����.����+̳�y=���97��۳�Vʟ/qU��-Ov�r�xHy��R�9��>A,�a���d�l���a's���DfJ��T���'���.�|���/V� 8 @�b��)o��Ե��-R����귛T*w/�� +�/�9;�^P����[|�m7]�pQ���x��n��_K�er�Z��f�@I�_�Xц��f]9>�p�Qs���3�Q�v�=8Ɉ���t�:-��I��bΓ\��]���J�?S +o,?; +��(`j�>�G�SHU�^�6�m��
M&)�W���b
a�x�2;�:�ՆIN\O��X�-\�zҩ�'O�j�`��� +CR�VT�?ג�PUt�R&,�r�6�M��2�]i��� +�A����4��$¯���&�jޖM��]~�b���v���/��|�0 +{3q�'�x��dAj?�D4 +ER�!�]y����%|!�ԓ-YLOj�
zҁ����`= +��(�����|�%lɌd�2��1��>�Ȧ��Za�����=��Xⶓ�r� +���-�O�`� +����E +�f��� )ÅI��,y,S�/���]����F� �x��vyR��,�N�I�/�<U��c& +a%�oH���G��]?�����d�06�_��c�=��.*�w�|��d_�r�D> �6 +Im�2�C���8�-Fʹ��[��h���Vp.�/ГvZ<8�ei2���d7 +�?�L +�(�с��>~:w��4�ۭ4����V������Hv +��/v
>�N +'���X2�=�t�cHʘ�U)/���t�5Г�,��G�3��Q' +208����Zv�c���q;P{�ܖhH�NH�|�Q�.P{�$�5ۡ'�X|��,���w +N�����ka��ޜ
wt�ӑG{*"�JH� �ڨ���=��7]!�~�Q�|� +w��|�����@��D)�ྔ��EXa/n��_���w�w+ +]�Œ�, +�c"P@m��H:���!'��|��d�o���<a~+o2�j�Х2��*�Yr�*�9jFZ-��H���00�K�Ν� +g'��U:�Rn�۔���x;0�����.&��0��D6��5gS��=��}�Q�O|����'{�<�I����P�5�_��o��[�� +�6XH +7����>�psߐ�����Z_��[���w�7�po��t�F���.�+�������$��%���3a)Z�س?��Ii��&a�Ϧ�z&�����JGN +R� +oɦ�b=��2��eGȹo!;�=ֿf�|D��܂s��ڱ8�$%G�|��[��'���ћc
Uk0]DCXf(M�jK�ڑ��&j�� +q�$�AE)ic�l.��KR�[��93��v:�(�09�=N�(a��a�5�=A�1:��!)}|�7�]z�`�E)u��M��Г +#�[��=����J����I�痔�E�s��˧+m�<ٍ�7 +B� +N��/�k�<8���V;�H��;-b��o��x;c�M�9\R�,�{��Cs*)�rȈ�g +�RZ�:�@���ʗ�2i3'R��ܢ��l��'� +���� J��&>�(��ٝ��<���7 +���d�jx0yM,��^C� +�Z51z���l���x�MYjO����2I�0�
n<�����stQB�jp#�
��L�G�ǗI�i00 ��nu�e�G�������D��`���i�_���I�b�6���]�Y���z��C��%�3_��r�l�r�ʗG侇IJ'�lFJ|�(~��I)^'�n��P�7|9 +o2�ѣ3̱����%��R�
�~4���+���,>Bқ-}�J~���wKi7'�}i���%��I�uz��3��<�4�̙$#�������'�q�C��LU�Y9�kR`D �=H��%Sp2��
+[@��*�m�,!��!)�k�2�)ɮ�ty`=�V�^9��z�==��$ +��:�����XYy����<���(a�TΚ�YUT�C�>]a����a�m�������oL +����x�;З���<^g��� +3�-%'+�b���I��Ocz�7/z +��eC��e�ܙO�CBR�X�7��'�(47+A��A�R���R��4��)D��� +�� �
�����9{�����JOk��Qt�p��[{�o�t�S�9�Q�Kѥ�%W�m��n������c|a�1�}������~I�?.�R�(h|ӈ1���q�M��T⨢q��zr*zR�m�Q����dg>�It� +I ��ѵnrKII����t$�A2�}�f��.���1�~ϐ����}��?�����V?��jk�J�y�b���U-���7Js�:��#Ì�*�'''&]I�b$&
�J}.;k�rSPE �е굱.��^�6��H�w��wk~��i�H)i&)%}C�T�����<@Y��z��y���8�?�o>W��K���*1g�RF뵜��GOF��|�%R�)S5���n +uy�����Z]Z�M��//_!!8 �ĈӢc��J'��u��֞�E�F�/L.\L~����r)�?�[���+��T��ݤ���b�}��B�/��:F�3�;��n�
�'C�II�̙V�I���!S9��Ҩ�Hy��&�Q�w��m�D!�ne�hiӾ{��1f�C����ڇo��O�����Q�6w�ŕ{-��凶3h��� +F�}7�����1�2`��r�'Gד<8i��ԍ�w���(� +&t��禇ڥgP�ˆ�^>��b�e������R��/��]R�{��^)�f�ϗ����k�ݣ8x#%��@O�ɘ{N��x��}�$#J1���� +=�I[��g���i�)R� +N��p���6fǴL��
g��O�d41�
܌��uȏ�b���ƚ'�:����̗ݛ+���Њd߽��@�Q2}�T"Ӎ��Λ�?���"��t#D#H4�' ��I�xWN�����WK+ +Zr +�fk=�]��Q|�fd� +N +2S����9�<�?�����l���K�~{�D=���}e,��`�o + +:C���H_s�T%[�dz��wogb���_���W>�O���=�>ܷ���/~��.����� +>��β��9K>]>]tͷn��٨�tv�5��5m���ww���]L[ncb����?:����^�`��û�?�{���}������q +t���a�s۶m��z��J*��x�o���^�O�����$/?9�"�����mv�fƙ�,�� +]r�˽�߰ +ٴ.�_�5dB\B\#톶m=���B+ +�ʏ�$ҏ�-,��%����17���r��!�o� +�ƣ�F6e�TK�#2I����'��Β;yF;Q� SYk��4��Ŷ�����^�#��������xeI9j�%Ӗ];����|�]�PO��c2S�LC�(�8c�ӧ�v�w��_�O?=y�,M�榦���̿�����-�c��mOn��ܓ;�������/�M��T܊� .��n#�ݜ�����ͫ3�ty���`<��D{Q�2#=�+x����˄�����7H�XX�(��=���_��:z`��s�VO�ik��fR��3�8��N��������LR�}V�ο�ҋo���_�莕��6/m哥��<�ػ��{}�%���;�8��o���kݢ{e�ƹ�>ۖ�%�;�Wq�M]��Q�A2� +#��@'EbFFt� ��p���A�Vn��j�Azx�Ɬb�������0Q�y�@O����O�"m}��駟~�}����/�*�s�5�_rǍ�����W��7���X����M��>��A��|��˟����^d� �����~E:�{�k/=c�5ײ�Գ{ks&���8������,/o��wk�,�{g�N6w�� }���g+]���_EU3Q�k��mg��4�<���Q�\0��VD\O]f�LҌ��<��~�L��șӧ�N�.����t�o~��u�W�^�xQֳ��|��7^|�)���$����Tί9GFg맯���ޭ#�x �xW�O�����AO�"�����A�Q��H�[��P}n�)�\r�/�8С!c��;����IU�������6�G����ӧ�[���C&�y��N + +�W?Y��ҟ���^��̻;�cH���.��P���z�0'�J7���g�?�������:����k~c����{g��.�r�#n?�y[6F���>]i��}��C�θ�_��5� �=��sGv=oW��{���{Ã�l����R��ݢ��8ό�� +%@B�c�܀�GI�@������dl5wcl�q�{�l��|3�w�S��I73��=�!������}�m#:e�N��}�129!��1��w�Y�\t��W]��=��>��k/L�z�f��x�{K�G���l�!�\G��L7s�ǥ��k��b�ny~��D˨��OoD�r�7�D�-��V�+�_�~�gR���D
0�-��$n��X�s��H��= �,zY����,7��.6)'^3'ŬƊy�n��n,�����XX[5�I���Y��.�+�G�:��՛���u���s���G?�᧿��O?r��L���s�y�\�����W!_̇\V�U���z��9顱�&%DBV��aU���OQ�𧼇Uxѕ�%� +�cT���F���Jb��S�i
}�E3�s�����F+��?(\4�T���2�i�!�n�x�K��XXm���$�E|r����Mƭxt<0������μ��v�������ʼnO��g����̷x���*�Z0�}����1��#5v�+�1g2�hNf�eх;�<5��s��%����;��z�Q���'qkJ�.�i՞� +#U�րt�uy���9�{�gQΛ�r�L�����o���]�Q���틼����i��d������4�_�`^{tB¸λ庫�ͯS{��R�����ud?Y4�]�.2ﱞZǚ�cx�������N��&����S1�K�2�g�����&W0��������>9,�)F�v��^�?=��ܿ�rVΛY�7�p�}ˀ�������nqw���yḎ�o����%t���y�o���k~u��O=���O������:�&s�0��.��x��Н��t��ֱ�M������J�9oP'i`pPaƚ[�;XQ�����x�L������x y���ʋ$kz�Y�FjN��K.��L�a�\>>ǒ�?�Ǧ�n�A���⹛��0D+,����i�9n?��&X^�Ͷ�l1�q����~��f�u$��Z�{���0EcOw]�%?uN���� �6]!��//�<�o�ndJ��j>�^��QH��Ks�S�k�]�`���.�a3%�fn:?CQwC��-����6,�7#p�U��:Q��^��Ŝ��ܬH} ʊ8+g�����S��Ob��J��!]�]��I�ޤ�< �AB�J��zk�8v���L7���pF˛w�v/Ʈ��^ȇ��C��̴Df��b{�U�g��`�ʒ�{��|�l[���*'G|=�C�����{��@���XZ�`�7�m^N���27r[J� �_{�>��0s~@-D��Z�eq���2f������s��ֳ)�9q����Z9o��Es�IDu
Q�����T�϶`�Ğ��=�P�<!2��^̜I�{�p����'ѕ��2x��Ԥ�b���X7%n�䑟?�3�q��� +�V��')��'��s�j� +a��z��y�� �S�Xa_��{�����ɉ܍��� �ww=3��'�K��@2�E�u�EiAb)�*k
Hok��^���-.���n.�u,�������l/��'��ֱ-�����RqVs�]9XQ�x+MЇs���ȸ�ޡ�LJ粃��P�����^.Uw2jH�� +Q�eUGO�[+����4��'Y*���2JgN��A�림���w2\�(^���]���}�����Ըm�����>9,����,��@u�X�M
�O�fGf�Ood�%8 �-+-��-�%���%��K.?��3�Y�X�]��^�M
�rҍN˝��&���Nn�&B�;�/�L�G��&|�?J�}�"E�_�M�=��s�O��_7hF��̠�=๙U҃>^D}ˠgg�e��CԱZi},�n��a�}����g�_�校�����ۼ�^n�W��AX
/w�Ojմ����kDCV�o���Q��� �5@s��Ζ8+<t@z�!�e��K�zxZ���/8�U�X-\�����5�f�Ծ]s�2�ds��G��G#����SC�!��r@��+!wOL�79�m�r��~N��\k#�.jwt����#���^9o&� +��h��������������g�=�2� �Z�{��l�e�M�3��nKr�G��F+ݸ��ً�� +F�{?��"���� NH8�\\�����m +1 }ypܐ��=�۷�Q��C�W���.1D]�垙�fќe�Y�Z�J�X���*��(���$FM������#�&WD�_ªkm~��NMb>�6Ѹ]!j_w����U��,�g�Ç�թYc���^i^��oY���ܳ�fD|�P���U��^�������D/�]�1��7��\���f3a��j}"R:��?{�K������$wOJ<�\s&>s#yad���}ț�� 2-~����䧕�*W͟��(g�;�Nz#^R���T�d��=[|Sq�!�X�/����Vf�U���n�җ�U(��������~��Y�K�x�'#���[����&�H~̺7�#�sR|��5��$�H +/�`FzcV
�ryA6s�?,�˜��E����+xf��3K���&t�}\�t �����Cx#t[�[��A�r#_�{R�h$?J;i�7n����!�B��H ++�>���y��X�g,\�?j2�&�wt��I �R��Mq���WQ�B�k������`[j�v/F|z�;x{+ +� +�̙'�{?q�Dqx
s2yF;�����q +�b���s�݊J�n�^0��yG��-�J�u��'8�2$�y0��9ϫо]���iy�/qI�N��6A|�!ݒ����y +#�y`J�aq�� �ćFN���g�^<��&Bw +�kW�$PDž� +�s��M�g�]4G��Y�����A��%�yKjw���o�qqsk���K6�x��D>L��Dm}vs��LJ�5���[�Cn�iy6Y��I��ȝ���x�8 +o�,g�}Z>"ҟ�v#+�J��o|���uk# +# +�ObԤ����Cd�āܖZu⮉|���)I�0��b��;4t��s�YWÍ +GYb�e����wi^V�S�Exn[SZ���{j�ߓ�9��_�VEJ��T^�%%�˿&�xa�7�0 +�� +��o)�Xf�����Kϙ�����{ۄ��J�Τ�4x�ѣp/wz�zj�;���M� +��}O��i:��t���(��+�u#E���I�{'��Ή "P��}"��u艇�@s
&� +#���� +(}�/L.^�_7 +p���H=���e"���.e�{)��v�n,�9��ŀM^�����W��v��R�.���f_�ծod�88�]�y�nj�,?�ԗY��V�7��pFQ���rrZrQ��bU k5��S�� +���M_�{oUNNa�&�?�_T��Q� +nA�L +b& +�ڏ@p��ý�(z>�[�ɞ�GJ����k�Q�Z������#8>�u_��J������� �����>���ܨ�@f����.m16]����a�w�� +?a��Q�P2�=`��ܸ��+ +N�a�S��ǩ_OG��b�<���r�¡t�ᢞ�~��q�Ϯ�t�f[t��(�0�3�%��`S�Vx�Q߯ M��<�����l�a<+J�I0�M��7�{υ������n���^�5DZ� (��ϢEn���Hn\p�1�< + ��H�����|P< +LjU�^�n��.I��:5\ub���⺂ �'���c����������S�x!*�I��ՊJ��K�EŅ���##/���O�G���d�}��(�{����
����RF��ڐ+}{��aq�6�.�����K>m� +�n��_�(�0=�Gj�yOf����e���Q}Z�Ʈ�5�[�U'6�d,�1�[8���߽�~��S��Z�Gbߏ��{����r�f��@pz�/�7�y��� �U6�@U�S�M=�, ��f�W ��1�{^)?��j�1��#O�nܜ��M\��R�a���]��K����l�V
�~�����!���_�\6=�s8]���H��;_/���j����C��������9��L�=���0c�P��I��c�����6b�V��w�.�N�m��:�����r٤�Y����+��ubӯ���yȀ9��\VG�/���k���������M���*����}3I�mY�U�Ev�d͝v]qC����x탯�ʹ�j��M|(��Ο�&SԶ5\ub���Bo��߯�NC�{a�֣�F6y�V�AX�W_�&�I���w�p +a��=����`���.�o:����{k-�;S[�LփE?N��� ؘ�q�Ms*��g��1r���H��V����vD0P��� +�I�د%���Oŝ�j�n1���EW�Ʈۍhex.T�ql�/�#S�د��WM���1~�*[��>��ycr�S"�����h���m��2����w�7��B��c�-�v��w����pՉM�� +����ɗ�9{�{��j�n1���������,w-,�u,'�!�$�3>v�S}��-š���i�<$�u���W6 +�~"��DC}�M�����=��>:ȓ���m-��}go�M2���L��~~����W����h�V��YC�����J����!v���������q�[+�݈����4�{7�<$����?r�f�^:��5c�=o,�!.{k�Ģ34+Wg�w�q)�n5��$����?����WW�� ��ת�P�>�n9�[��Y��XtqoX�V�0�~cn�[�!2���b��Fje�L��*r��poy �0l����_���{�#��C��*Hf��o+#7Qؕ����4�C�H�]�^�U\�Lf7�C+���2I����P�~{�N7 ���k�|�ߗ~�|�&��6ݠS��CF���P�n?W�
t�0c�U�1��g��s� H�_��^H=d�b)��5�� +���`.����N����Z:!�Up�s�6��0�Y���Mt��&�5U�٧��+��ɰ�BmZ��.j��{6^���hC�!B^��o3w[4d����c��� �P���r�.���0�q�:���;��C�:�vcv�qh�.{u&�������M^��}h�đ.q�<1g�(K�x�Hc�����pd�G���T��3>���F�e���}2���E�п�0G�=Ƽ2��{XMg�Ţ{¥l�`cv�+����D�п�Xt�(-��^��J�}�����^��B���O�� N���0kA,���-6����D�� )����8�����P�6Ʀ�ޠ��!]_U]n�n�[�����=0m��Z�W8�l�������]��ƽ�/0�:��Z�+�?A��Zuث�?
<4C���P:T#<�c�{��e���:���_��������U(ׇc��X��H8�����8��w?�# +G�ۯ�����A{H|��%�u���D
<��D�Ͼ�?��C�+5��6}T��kx�ūeY���]�T���>HK����~��rWk�bA��p�ѳOv�{��m�X7�M���ҘIUc�ٿ}�d�"���ݵhf'��{�?٪rQI�tC4v��2b��[�-
�!���m���ycN�G�L�b��(�r�/�7�$���k 'R�^іa�ONS����~�w�Y7*>_&Jߘ&l��w�����;�hf��T��J{�&1���On"H���q��2n������7��~�:��v�?E=ĘBu��(�T�[�C�I�/^^�x�j'�¢�)�!�!�^�Tn�D��5�����x�:���J����uܯU���WvZbH�L=j��Ħ��Sp��잣���耸���4��H]�yHWMJ&�Ʊ�4�b&���3o����S[w��Ǧk:({C=$n��r��$�ݏ��k�o�<G��d2��������$ :�pՉM+oS����O���~"N;l��#�C�=]�
�IƬVq�dӰ��sT�C���������Ő�د��������4L� +]��Xt�H�'r�ܰu��'fl��+�?(�Ħ��y/���юh�ܜ�<ͨ&�����x�6�oH���cӯ�TRo|���ߡ>�v�����g��gXZ�����d��=|������|m�M������%������� +��G��<���2^ +{rR���$#6��(�C')�
���&���4��Z��b�7�*�M1�v3��@Ul�9A�d�A:f¼U��/+-9�;D'��8���Z��r�RI���eކ�Bt��E���yc
�*6��c���� +��*-U*Z�!�Z0o@Qؓ�t�%�♃9 +@Ul�?^%w2�\�
�P��Tj
`��_ؽUa�� +ɍ��N�@2 +SI�ԉ��d�J�7�.�QǼ�z亁�0w2^�fO.�ơ3�q'
r�Q��@]���Q!��7aހ�8��A�l���#q����yu�I��G? +#j�Tq'=d�w�N�����T����ro@a�f�ie̛I������du��t��Ms�I��ǧp'��8���*rc���6�P�nW&�f��"$��8��2\����0��U��-�r���ʁ���C���TƢ�U�&����P�Gb"-���!#�Bp��E�vVž�n亁���qUj�Lҩr*c�/�P%Zb��,�
�s'��&�,'��8���*��$�C2 +�$?Fy ��:�Ppr�Q�߀~�M����ߣ�����s)c�$�K���(��wz"�����Np쵼�t7���p��? tŦ�Ñ�X(&V�t +r�G�q�MY�xnk�Vm\l1�Y���=�����Jթ��J��?��}߳Ak ��d�+��+o�n3L��]�o[س�h��*i����rg�.��� �
D33V�OI*��;C&B�$�J��{��vE^��Ξc��h�a���o~�B����v����� Ozyt�9�< ��ٽ�Ɓ�?�_OM�l�2W܅Y�b�2�F���"�wۨ�c��í+a�@�b�}��?�k�s��6�gj�Qo :�,z���ӛ�.��a�`D%��m�7�8��r�� +��J!��4|�d\�ǿDn +h{�S#-�:��W�>�� +m��@p@IZy�j֍��tw�p���$�P��y#\p(�E7&��y�����џ*j�8P ��?)0��~LbBp@���+ ��2�!�@Z6DaoR`��3!8� +:����y�Ǒ +�
2I�!$��ش������#&ewp��O�-�cӣō<�w�N��T5pi�C���
�+��C��չS��E�&��(��Ǣ���#��յs�e
�Aބ܀�t���QC����GQg���P����nOL6�o��]b=�v x��H�pl���<lp�ݺtfzS���G�P����8r耞ݺvn����!�}�d +� +fj� 8 t�q�қI�~�tš����O�g�-��Н2鍹��p'���tc�D�\9�%@_l��@��f��p'��شh�<z3Hϕ��Ţ���w{�m�aހ�X�uC��������הForƗ�� +���֛I�a� +lzl\���!��@T`ӣ�GXo��n�t���Đ_�D6��5�z3H�4�*������Gv|��|�����$���F�D̲��DУ4I��75� +���A�Fm �"���w)�1w2r��/�#%8�G�2�.l�<���<���2,z���A:���D�#1�^pr�Q�7uT��G`g��P[��n>��������0��Bb�Vo&�����qe�IzBo :ql�p@� +�C��1x Za���І�3y�����g��mXJi�[�N��ٚ�]e�A�; �fm�h+�1w2�
D56�m��.���Re�X���6���
wD7�][x���� �辋� +C~�N +ML��o + + +����Wp^cL���`� +}Mb�F�F���|�7�v�n%P����<���ܨ�]�98�sp��0߆�Ș܍��1y2ǧ�$�ಾE�S\�_�7�ް����zw7$��#龻7@;�c�7���=�����w�@ +�%?��}sYȖ`�J�O#�6%LI��7��\@wդ��]K�O��u|p��B9�B ��
c�׀�� p�\<���h<�<ޘo]����𬨣�N�{K�Xi�c4�p�m�t�d�mz��6�|�}Gǜ!&p���h�g�lB�1������4�\H����m�>��U
��F���p��_��{��%̏���y���ȏ����l���ⴓC.(Y��P�Q,|9�w���`b�����@m��16�t=��9�J����|��ppΐ_ +�c���t,���+� +_l}�8rr�'�_�j-�A�U��oi�f~��t�n=��R�����]��,� +GUV!prׂ��u��/�cp0?r�讵�`2��z�+y,*����|W�m%` ��H���N��~a�!dl4L)\9�,��[�ȃ��x78��g�1!���O�t��9��z�K�?�f���� +����oH��5 �X��b=-�%�=������}�h�6-�e��P�s�X��>{ 0��1r�lB�7�Vڟ����B�C:d�X +?��gO��B���P涋�mL=C�) +����~К��VQ�GK�f
�yt���E��T�mTd�E8��Y�?��^��������M��Փ$���8�qJ��\�02&�VQG_��<�26O��G��ݴ�������o�X &��9&Lz�<���9p�(dl^K������/�r3�"]�0^�2����܋�|�%������?~�Л���N�-��"ŖΟ�c�#��Ǣ� +G&ǀ��x47��L:0{�[i�x�gy��rl�K�s4?yx9�r4.��|�� +ل3�9�x�S��p"��'T�n�덷���j�8f)��ްl�(����D +o�H���}+�����OnS�u��R?��] +�u_p��]�kW ��0,k&��3%���n}�)�R��
�R��<�P��`�^����W];��Ƣ��)�Bk�ܥ���K�(�o�SMv�&?�Վ�4:dC� �)�_n��.��+�8y����]gB�����pz���C�m��C���������] +��Q�*���(�-������Z_�۲rh2���r��> +�W���E�>!pr�@͍��˿<��s��u���,�o=zI;�a���������f��E57�7�t�1f����6ŃGѫl� +�5Ĵ0����9)���0���ɯ���C���7vl�v]gOYVvbt����Ox�T$A��Yw\w��w)��L)���Fmlx�G'O��?��>r��1�H^��ҋ/�P6�d��d2�T\���6�#ܥ����*�#F�ƏI]ç����/���?�����/��0i�ml���3R +��Mڐ��r#��rM7A�Աc��}��m߸᧫�V�2����(�&C��@�S +_Zv����Xnt�8<]���>x��G~~݆���9���_u��!�ԍd~Z�@�.]Z��az�1�M�8���/�xs�3����ݵ
�1qK]17|��s��|��@ +����G#�����_���o/���-m5YQ��g�M������ңK��f���}]��\�{Ւ��>X"�
L�ƈ��0��y��0��psDB�9z|(1/�� �b����JS_������JCqZ3��V��6 /�+�Ն�������g�F��/-�)6*t���5��fMsRs�"Kc(N�4S_�>�U$P�&)�+m�E<���LQ>����G�����c��eQ��k��\~'�]�6Tg�m��m6��Լ��^Wc5g*c��b�E ��Ćx��:)�>n�%ӶZפmЬ7g袲�Y����zG���sW�`�.�#�-��ɘ���7+��F��kmj}|���֛�#W�?��k����¦�FCAQ]�rCF˺���ڼ�x}A��`��lN6��}[�M�b�[fLQe��5E����&;Ő�ܬ.]ї��9ی���M�ٵm%re|v�`-���Ԣj-�2���R�樾� +C�2��l27k�ʲ�B]_�zuEk�F�V\L�6ڠQ����w����>�j0�#�ݽ˴5EZ��r%}n���\bj������{R��u�D�9���3rx ����G^�r0&Ϥꯏ��fΡ�@ݗѮ�h����r�fENMݘS��T4��� +�mI���T:��V�Q��� +}Vow��ö^5ݍ��{c��s�"�fj���Z��L}w�Qc��0�2c;����ӝ�>�R�l��[�)qW�6������z]���P��"��~���`���s�+��[EbZBDQn��SM�C���(�ΑX�ߝ��:؝[���d�2��c���sb�m��֖� ߥ,��m��j0Q�o��Ӓ�X3@�ggT��*�+�����
�kk����ʛu9����jg�����8^n�g�2R'� ���)�UUҟ�ѕnHo���o��.�p����4�$G�M�Π�F�h2�s\^m���1��e���^����#<���tN��Z�`�Ti���mYP�G>�t~�TP:��-J��ԓ����+�\e�6Z���U��*���SS��uԷv����)���6Z,EI����}v^��ұ�/М�ߝ�C4���0�w�#�d��*��]�Ѣn�+ڢWe�O1��6U�e�F��V��k�]U�ݥ+Փ�f�!r�&ܙs͚�5��GP�F[�SRB�Y�.�Ĥk�Y�-I�m�e)�U����&��92ͨn.�6��W-3�[Z�cu���Z��m�k��IF[\e��'�y��P'�+��RB������兆���h���&+ٸ�^��Z�ҥ�5e)��v}JS��T��ȭ�����v��9Q��Nhl�N�X�Ʃ�]ָ��3R�a6%�S��J�][i[�M9�ef���BJw���ŕJ� +�����"��'9�h�,��d����R�L�QZJ�ӔjcIAǪ|�٘֘��ڣ�c��Ii�)-��2�IUV:�<���Q��A�}Ue�!}��&�k
���#5`������\S<�G�ԍ�i�v�U��)_�e�e��L��d��0S舰F��TsVS��s͊��e�i��φ5mQ��V��nP�Nc5�l +p*��E���wm���l�عU�{� +x�T���s4>� +��L�L<m�*���9�|yd.T�����,�����u<Ʋ +x�_T���s4��Ur����>���*��\����q�3����<Wn��wv�K�-����=� +p(�����m�C�鱙T�k��e_�m�o*�b��C"������Om�Z�U �r�7;ʖ +��cި +p'�H��c<W��R6zlf�X.����x�V�����9U r��}<�s��`�ǦS� +�\���r����n��v�����l +k__��괭�>Q��������5����J���,��(�I
endstream
endobj
15 0 obj
[/ICCBased 19 0 R]
endobj
6 0 obj
[5 0 R]
endobj
32 0 obj
<</CreationDate(D:20160615142312-04'00')/Creator(Adobe Illustrator CC 2015 \(Macintosh\))/ModDate(D:20160615142312-04'00')/Producer(Adobe PDF library 15.00)/Title(metamask_icon)>>
endobj
xref
0 33
0000000000 65535 f
+0000000016 00000 n
+0000000144 00000 n
+0000047649 00000 n
+0000000000 00000 f
+0000163121 00000 n
+0000593503 00000 n
+0000047700 00000 n
+0000048109 00000 n
+0000048283 00000 n
+0000163420 00000 n
+0000139682 00000 n
+0000163307 00000 n
+0000049181 00000 n
+0000048344 00000 n
+0000593468 00000 n
+0000048620 00000 n
+0000048668 00000 n
+0000139717 00000 n
+0000160473 00000 n
+0000163191 00000 n
+0000163222 00000 n
+0000163494 00000 n
+0000163800 00000 n
+0000165099 00000 n
+0000187851 00000 n
+0000253439 00000 n
+0000319027 00000 n
+0000384615 00000 n
+0000450203 00000 n
+0000515791 00000 n
+0000581379 00000 n
+0000593526 00000 n
+trailer
<</Size 33/Root 1 0 R/Info 32 0 R/ID[<858D18969ABF4CF88593CFB9A20C1759><B33F39DA517C42B9A50D10EC91C85574>]>>
startxref
593722
%%EOF
\ No newline at end of file diff --git a/old-ui/design/chromeStorePics/promo1400560.png b/old-ui/design/chromeStorePics/promo1400560.png Binary files differnew file mode 100644 index 000000000..d3637ecc8 --- /dev/null +++ b/old-ui/design/chromeStorePics/promo1400560.png diff --git a/old-ui/design/chromeStorePics/promo440280.png b/old-ui/design/chromeStorePics/promo440280.png Binary files differnew file mode 100644 index 000000000..c1f92b1c0 --- /dev/null +++ b/old-ui/design/chromeStorePics/promo440280.png diff --git a/old-ui/design/chromeStorePics/promo920680.png b/old-ui/design/chromeStorePics/promo920680.png Binary files differnew file mode 100644 index 000000000..726bd810a --- /dev/null +++ b/old-ui/design/chromeStorePics/promo920680.png diff --git a/old-ui/design/chromeStorePics/screen_dao_accounts.png b/old-ui/design/chromeStorePics/screen_dao_accounts.png Binary files differnew file mode 100644 index 000000000..1a2e8052c --- /dev/null +++ b/old-ui/design/chromeStorePics/screen_dao_accounts.png diff --git a/old-ui/design/chromeStorePics/screen_dao_locked.png b/old-ui/design/chromeStorePics/screen_dao_locked.png Binary files differnew file mode 100644 index 000000000..6592c17e4 --- /dev/null +++ b/old-ui/design/chromeStorePics/screen_dao_locked.png diff --git a/old-ui/design/chromeStorePics/screen_dao_notification.png b/old-ui/design/chromeStorePics/screen_dao_notification.png Binary files differnew file mode 100644 index 000000000..baeb2ec39 --- /dev/null +++ b/old-ui/design/chromeStorePics/screen_dao_notification.png diff --git a/old-ui/design/chromeStorePics/screen_wei_account.png b/old-ui/design/chromeStorePics/screen_wei_account.png Binary files differnew file mode 100644 index 000000000..23301e4bf --- /dev/null +++ b/old-ui/design/chromeStorePics/screen_wei_account.png diff --git a/old-ui/design/chromeStorePics/screen_wei_notification.png b/old-ui/design/chromeStorePics/screen_wei_notification.png Binary files differnew file mode 100644 index 000000000..7a763e5df --- /dev/null +++ b/old-ui/design/chromeStorePics/screen_wei_notification.png diff --git a/old-ui/design/metamask-logo-eyes.png b/old-ui/design/metamask-logo-eyes.png Binary files differnew file mode 100644 index 000000000..c29331b28 --- /dev/null +++ b/old-ui/design/metamask-logo-eyes.png diff --git a/old-ui/design/wireframes/1st_time_use.png b/old-ui/design/wireframes/1st_time_use.png Binary files differnew file mode 100644 index 000000000..c18ced5e2 --- /dev/null +++ b/old-ui/design/wireframes/1st_time_use.png diff --git a/old-ui/design/wireframes/metamask_wfs_jan_13.pdf b/old-ui/design/wireframes/metamask_wfs_jan_13.pdf Binary files differnew file mode 100644 index 000000000..c77c9274a --- /dev/null +++ b/old-ui/design/wireframes/metamask_wfs_jan_13.pdf diff --git a/old-ui/design/wireframes/metamask_wfs_jan_13.png b/old-ui/design/wireframes/metamask_wfs_jan_13.png Binary files differnew file mode 100644 index 000000000..d71d7bdb4 --- /dev/null +++ b/old-ui/design/wireframes/metamask_wfs_jan_13.png diff --git a/old-ui/design/wireframes/metamask_wfs_jan_18.pdf b/old-ui/design/wireframes/metamask_wfs_jan_18.pdf Binary files differnew file mode 100644 index 000000000..592ba8532 --- /dev/null +++ b/old-ui/design/wireframes/metamask_wfs_jan_18.pdf diff --git a/old-ui/example.js b/old-ui/example.js new file mode 100644 index 000000000..4627c0e9c --- /dev/null +++ b/old-ui/example.js @@ -0,0 +1,123 @@ +const injectCss = require('inject-css') +const MetaMaskUi = require('./index.js') +const MetaMaskUiCss = require('./css.js') +const EventEmitter = require('events').EventEmitter + +// account management + +var identities = { + '0x1113462427bcc9133bb46e88bcbe39cd7ef0e111': { + name: 'Walrus', + img: 'QmW6hcwYzXrNkuHrpvo58YeZvbZxUddv69ATSHY3BHpPdd', + address: '0x1113462427bcc9133bb46e88bcbe39cd7ef0e111', + balance: 220, + txCount: 4, + }, + '0x222462427bcc9133bb46e88bcbe39cd7ef0e7222': { + name: 'Tardus', + img: 'QmQYaRdrf2EhRhJWaHnts8Meu1mZiXrNib5W1P6cYmXWRL', + address: '0x222462427bcc9133bb46e88bcbe39cd7ef0e7222', + balance: 10.005, + txCount: 16, + }, + '0x333462427bcc9133bb46e88bcbe39cd7ef0e7333': { + name: 'Gambler', + img: 'QmW6hcwYzXrNkuHrpvo58YeZvbZxUddv69ATSHY3BHpPdd', + address: '0x333462427bcc9133bb46e88bcbe39cd7ef0e7333', + balance: 0.000001, + txCount: 1, + }, +} + +var unapprovedTxs = {} +addUnconfTx({ + from: '0x222462427bcc9133bb46e88bcbe39cd7ef0e7222', + to: '0x1113462427bcc9133bb46e88bcbe39cd7ef0e111', + value: '0x123', +}) +addUnconfTx({ + from: '0x1113462427bcc9133bb46e88bcbe39cd7ef0e111', + to: '0x333462427bcc9133bb46e88bcbe39cd7ef0e7333', + value: '0x0000', + data: '0x000462427bcc9133bb46e88bcbe39cd7ef0e7000', +}) + +function addUnconfTx (txParams) { + var time = (new Date()).getTime() + var id = createRandomId() + unapprovedTxs[id] = { + id: id, + txParams: txParams, + time: time, + } +} + +var isUnlocked = false +var selectedAccount = null + +function getState () { + return { + isUnlocked: isUnlocked, + identities: isUnlocked ? identities : {}, + unapprovedTxs: isUnlocked ? unapprovedTxs : {}, + selectedAccount: selectedAccount, + } +} + +var accountManager = new EventEmitter() + +accountManager.getState = function (cb) { + cb(null, getState()) +} + +accountManager.setLocked = function () { + isUnlocked = false + this._didUpdate() +} + +accountManager.submitPassword = function (password, cb) { + if (password === 'test') { + isUnlocked = true + cb(null, getState()) + this._didUpdate() + } else { + cb(new Error('Bad password -- try "test"')) + } +} + +accountManager.setSelectedAccount = function (address, cb) { + selectedAccount = address + cb(null, getState()) + this._didUpdate() +} + +accountManager.signTransaction = function (txParams, cb) { + alert('signing tx....') +} + +accountManager._didUpdate = function () { + this.emit('update', getState()) +} + +// start app + +var container = document.getElementById('app-content') + +var css = MetaMaskUiCss() +injectCss(css) + +MetaMaskUi({ + container: container, + accountManager: accountManager, +}) + +// util + +function createRandomId () { + // 13 time digits + var datePart = new Date().getTime() * Math.pow(10, 3) + // 3 random digits + var extraPart = Math.floor(Math.random() * Math.pow(10, 3)) + // 16 digits + return datePart + extraPart +} diff --git a/old-ui/index.html b/old-ui/index.html new file mode 100644 index 000000000..9dfaefbb3 --- /dev/null +++ b/old-ui/index.html @@ -0,0 +1,20 @@ +<!doctype html> +<html> + <head> + <meta charset="utf-8"> + <title>MetaMask</title> + </head> + <body> + + <!-- app content --> + <div id="app-content"></div> + <script src="./bundle.js" type="text/javascript" charset="utf-8"></script> + + <!-- design reference --> + <link rel="stylesheet" type="text/css" href="./app/css/debug.css"> + <div id="design-container"> + <img id="design-img" src="./design/metamask_wfs_jan_13.png"> + </div> + + </body> +</html> diff --git a/old-ui/index.js b/old-ui/index.js new file mode 100644 index 000000000..ae05cbe67 --- /dev/null +++ b/old-ui/index.js @@ -0,0 +1,58 @@ +const render = require('react-dom').render +const h = require('react-hyperscript') +const Root = require('./app/root') +const actions = require('./app/actions') +const configureStore = require('./app/store') +const txHelper = require('./lib/tx-helper') +global.log = require('loglevel') + +module.exports = launchMetamaskUi + + +log.setLevel(global.METAMASK_DEBUG ? 'debug' : 'warn') + +function launchMetamaskUi (opts, cb) { + var accountManager = opts.accountManager + actions._setBackgroundConnection(accountManager) + // check if we are unlocked first + accountManager.getState(function (err, metamaskState) { + if (err) return cb(err) + const store = startApp(metamaskState, accountManager, opts) + cb(null, store) + }) +} + +function startApp (metamaskState, accountManager, opts) { + // parse opts + const store = configureStore({ + + // metamaskState represents the cross-tab state + metamask: metamaskState, + + // appState represents the current tab's popup state + appState: {}, + + // Which blockchain we are using: + networkVersion: opts.networkVersion, + }) + + // if unconfirmed txs, start on txConf page + const unapprovedTxsAll = txHelper(metamaskState.unapprovedTxs, metamaskState.unapprovedMsgs, metamaskState.unapprovedPersonalMsgs, metamaskState.unapprovedTypedMessages, metamaskState.network) + if (unapprovedTxsAll.length > 0) { + store.dispatch(actions.showConfTxPage()) + } + + accountManager.on('update', function (metamaskState) { + store.dispatch(actions.updateMetamaskState(metamaskState)) + }) + + // start app + render( + h(Root, { + // inject initial state + store: store, + } + ), opts.container) + + return store +} diff --git a/old-ui/lib/contract-namer.js b/old-ui/lib/contract-namer.js new file mode 100644 index 000000000..f05e770cc --- /dev/null +++ b/old-ui/lib/contract-namer.js @@ -0,0 +1,33 @@ +/* CONTRACT NAMER + * + * Takes an address, + * Returns a nicname if we have one stored, + * otherwise returns null. + */ + +const contractMap = require('eth-contract-metadata') +const ethUtil = require('ethereumjs-util') + +module.exports = function (addr, identities = {}) { + const checksummed = ethUtil.toChecksumAddress(addr) + if (contractMap[checksummed] && contractMap[checksummed].name) { + return contractMap[checksummed].name + } + + const address = addr.toLowerCase() + const ids = hashFromIdentities(identities) + return addrFromHash(address, ids) +} + +function hashFromIdentities (identities) { + const result = {} + for (const key in identities) { + result[key] = identities[key].name + } + return result +} + +function addrFromHash (addr, hash) { + const address = addr.toLowerCase() + return hash[address] || null +} diff --git a/old-ui/lib/etherscan-prefix-for-network.js b/old-ui/lib/etherscan-prefix-for-network.js new file mode 100644 index 000000000..2c1904f1c --- /dev/null +++ b/old-ui/lib/etherscan-prefix-for-network.js @@ -0,0 +1,21 @@ +module.exports = function (network) { + const net = parseInt(network) + let prefix + switch (net) { + case 1: // main net + prefix = '' + break + case 3: // ropsten test net + prefix = 'ropsten.' + break + case 4: // rinkeby test net + prefix = 'rinkeby.' + break + case 42: // kovan test net + prefix = 'kovan.' + break + default: + prefix = '' + } + return prefix +} diff --git a/old-ui/lib/icon-factory.js b/old-ui/lib/icon-factory.js new file mode 100644 index 000000000..27a74de66 --- /dev/null +++ b/old-ui/lib/icon-factory.js @@ -0,0 +1,65 @@ +var iconFactory +const isValidAddress = require('ethereumjs-util').isValidAddress +const toChecksumAddress = require('ethereumjs-util').toChecksumAddress +const contractMap = require('eth-contract-metadata') + +module.exports = function (jazzicon) { + if (!iconFactory) { + iconFactory = new IconFactory(jazzicon) + } + return iconFactory +} + +function IconFactory (jazzicon) { + this.jazzicon = jazzicon + this.cache = {} +} + +IconFactory.prototype.iconForAddress = function (address, diameter) { + const addr = toChecksumAddress(address) + if (iconExistsFor(addr)) { + return imageElFor(addr) + } + + return this.generateIdenticonSvg(address, diameter) +} + +// returns svg dom element +IconFactory.prototype.generateIdenticonSvg = function (address, diameter) { + var cacheId = `${address}:${diameter}` + // check cache, lazily generate and populate cache + var identicon = this.cache[cacheId] || (this.cache[cacheId] = this.generateNewIdenticon(address, diameter)) + // create a clean copy so you can modify it + var cleanCopy = identicon.cloneNode(true) + return cleanCopy +} + +// creates a new identicon +IconFactory.prototype.generateNewIdenticon = function (address, diameter) { + var numericRepresentation = jsNumberForAddress(address) + var identicon = this.jazzicon(diameter, numericRepresentation) + return identicon +} + +// util + +function iconExistsFor (address) { + return contractMap[address] && isValidAddress(address) && contractMap[address].logo +} + +function imageElFor (address) { + const contract = contractMap[address] + const fileName = contract.logo + const path = `images/contract/${fileName}` + const img = document.createElement('img') + img.src = path + img.style.width = '75%' + return img +} + +function jsNumberForAddress (address) { + var addr = address.slice(2, 10) + var seed = parseInt(addr, 16) + return seed +} + diff --git a/old-ui/lib/lost-accounts-notice.js b/old-ui/lib/lost-accounts-notice.js new file mode 100644 index 000000000..948b13db6 --- /dev/null +++ b/old-ui/lib/lost-accounts-notice.js @@ -0,0 +1,23 @@ +const summary = require('../app/util').addressSummary + +module.exports = function (lostAccounts) { + return { + date: new Date().toDateString(), + title: 'Account Problem Caught', + body: `MetaMask has fixed a bug where some accounts were previously mis-generated. This was a rare issue, but you were affected! + +We have successfully imported the accounts that were mis-generated, but they will no longer be recovered with your normal seed phrase. + +We have marked the affected accounts as "Loose", and recommend you transfer ether and tokens away from those accounts, or export & back them up elsewhere. + +Your affected accounts are: +${lostAccounts.map(acct => ` - ${summary(acct)}`).join('\n')} + +These accounts have been marked as "Loose" so they will be easy to recognize in the account list. + +For more information, please read [our blog post.][1] + +[1]: https://medium.com/metamask/metamask-3-migration-guide-914b79533cdd#.7d8ktj4h3 + `, + } +} diff --git a/old-ui/lib/persistent-form.js b/old-ui/lib/persistent-form.js new file mode 100644 index 000000000..d4dc20b03 --- /dev/null +++ b/old-ui/lib/persistent-form.js @@ -0,0 +1,61 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const defaultKey = 'persistent-form-default' +const eventName = 'keyup' + +module.exports = PersistentForm + +function PersistentForm () { + Component.call(this) +} + +inherits(PersistentForm, Component) + +PersistentForm.prototype.componentDidMount = function () { + const fields = document.querySelectorAll('[data-persistent-formid]') + const store = this.getPersistentStore() + + for (var i = 0; i < fields.length; i++) { + const field = fields[i] + const key = field.getAttribute('data-persistent-formid') + const cached = store[key] + if (cached !== undefined) { + field.value = cached + } + + field.addEventListener(eventName, this.persistentFieldDidUpdate.bind(this)) + } +} + +PersistentForm.prototype.getPersistentStore = function () { + let store = window.localStorage[this.persistentFormParentId || defaultKey] + if (store && store !== 'null') { + store = JSON.parse(store) + } else { + store = {} + } + return store +} + +PersistentForm.prototype.setPersistentStore = function (newStore) { + window.localStorage[this.persistentFormParentId || defaultKey] = JSON.stringify(newStore) +} + +PersistentForm.prototype.persistentFieldDidUpdate = function (event) { + const field = event.target + const store = this.getPersistentStore() + const key = field.getAttribute('data-persistent-formid') + const val = field.value + store[key] = val + this.setPersistentStore(store) +} + +PersistentForm.prototype.componentWillUnmount = function () { + const fields = document.querySelectorAll('[data-persistent-formid]') + for (var i = 0; i < fields.length; i++) { + const field = fields[i] + field.removeEventListener(eventName, this.persistentFieldDidUpdate.bind(this)) + } + this.setPersistentStore({}) +} + diff --git a/old-ui/lib/tx-helper.js b/old-ui/lib/tx-helper.js new file mode 100644 index 000000000..de3f00d2d --- /dev/null +++ b/old-ui/lib/tx-helper.js @@ -0,0 +1,27 @@ +const valuesFor = require('../app/util').valuesFor + +module.exports = function (unapprovedTxs, unapprovedMsgs, personalMsgs, typedMessages, network) { + log.debug('tx-helper called with params:') + log.debug({ unapprovedTxs, unapprovedMsgs, personalMsgs, typedMessages, network }) + + const txValues = network ? valuesFor(unapprovedTxs).filter(txMeta => txMeta.metamaskNetworkId === network) : valuesFor(unapprovedTxs) + log.debug(`tx helper found ${txValues.length} unapproved txs`) + + const msgValues = valuesFor(unapprovedMsgs) + log.debug(`tx helper found ${msgValues.length} unsigned messages`) + let allValues = txValues.concat(msgValues) + + const personalValues = valuesFor(personalMsgs) + log.debug(`tx helper found ${personalValues.length} unsigned personal messages`) + allValues = allValues.concat(personalValues) + + const typedValues = valuesFor(typedMessages) + log.debug(`tx helper found ${typedValues.length} unsigned typed messages`) + allValues = allValues.concat(typedValues) + + allValues = allValues.sort((a, b) => { + return a.time > b.time + }) + + return allValues +} diff --git a/package.json b/package.json index 39d5df75c..72b4951db 100644 --- a/package.json +++ b/package.json @@ -118,6 +118,7 @@ "lodash.debounce": "^4.0.8", "lodash.memoize": "^4.1.2", "lodash.shuffle": "^4.2.0", + "lodash.uniqby": "^4.7.0", "loglevel": "^1.4.1", "metamascara": "^1.3.1", "metamask-logo": "^2.1.2", @@ -126,7 +127,7 @@ "multiplex": "^6.7.0", "number-to-bn": "^1.7.0", "obj-multiplex": "^1.0.0", - "obs-store": "^2.3.1", + "obs-store": "^3.0.0", "once": "^1.3.3", "ping-pong-stream": "^1.0.0", "pojo-migrator": "^2.1.0", @@ -142,7 +143,7 @@ "react-addons-css-transition-group": "^15.6.0", "react-dom": "^15.6.2", "react-hyperscript": "^3.0.0", - "react-markdown": "^2.3.0", + "react-markdown": "^3.0.0", "react-redux": "^5.0.5", "react-select": "^1.0.0", "react-simple-file-input": "^2.0.0", @@ -160,6 +161,7 @@ "sandwich-expando": "^1.1.3", "semaphore": "^1.0.5", "shallow-copy": "0.0.1", + "semver": "^5.4.1", "sw-stream": "^2.0.0", "textarea-caret": "^3.0.1", "through2": "^2.0.3", diff --git a/test/integration/lib/mascara-first-time.js b/test/integration/lib/mascara-first-time.js index 398ecea0e..515c7f383 100644 --- a/test/integration/lib/mascara-first-time.js +++ b/test/integration/lib/mascara-first-time.js @@ -6,23 +6,7 @@ async function runFirstTimeUsageTest (assert, done) { const app = $('#app-content') - // recurse notices - while (true) { - const button = app.find('button') - if (button.html() === 'Accept') { - // still notices to accept - const termsPage = app.find('.markdown')[0] - termsPage.scrollTop = termsPage.scrollHeight - await timeout() - console.log('Clearing notice') - button.click() - await timeout() - } else { - // exit loop - console.log('No more notices...') - break - } - } + await skipNotices(app) await timeout() @@ -51,28 +35,13 @@ async function runFirstTimeUsageTest (assert, done) { assert.equal(created.textContent, 'Your unique account image', 'unique image screen') // Agree button - const button = app.find('button')[0] + let button = app.find('button')[0] assert.ok(button, 'button present') button.click() await timeout(1000) - // Privacy Screen - const detail = app.find('.tou__title')[0] - assert.equal(detail.textContent, 'Privacy Notice', 'privacy notice screen') - app.find('button').click() - - await timeout(1000) - - - // terms of service screen - const tou = app.find('.tou__title')[0] - assert.equal(tou.textContent, 'Terms of Use', 'terms of use screen') - app.find('.tou__body').scrollTop(100000) - await timeout(1000) - - app.find('.first-time-flow__button').click() - await timeout(1000) + await skipNotices(app) // secret backup phrase const seedTitle = app.find('.backup-phrase__title')[0] @@ -156,4 +125,24 @@ function timeout (time) { return new Promise((resolve, reject) => { setTimeout(resolve, time || 1500) }) -}
\ No newline at end of file +} + +async function skipNotices (app) { + while (true) { + const button = app.find('button') + if (button && button.html() === 'Accept') { + // still notices to accept + const termsPage = app.find('.markdown')[0] + if (!termsPage) { + break + } + termsPage.scrollTop = termsPage.scrollHeight + await timeout() + button.click() + await timeout() + } else { + console.log('No more notices...') + break + } + } +} diff --git a/test/unit/metamask-controller-test.js b/test/unit/metamask-controller-test.js index ef6cae758..fd420a70f 100644 --- a/test/unit/metamask-controller-test.js +++ b/test/unit/metamask-controller-test.js @@ -11,6 +11,15 @@ describe('MetaMaskController', function () { unlockAccountMessage: noop, showUnapprovedTx: noop, platform: {}, + encryptor: { + encrypt: function(password, object) { + this.object = object + return Promise.resolve() + }, + decrypt: function () { + return Promise.resolve(this.object) + } + }, // initial state initState: clone(firstTimeState), }) @@ -27,6 +36,30 @@ describe('MetaMaskController', function () { describe('Metamask Controller', function () { assert(metamaskController) + + beforeEach(function () { + sinon.spy(metamaskController.keyringController, 'createNewVaultAndKeychain') + }) + + afterEach(function () { + metamaskController.keyringController.createNewVaultAndKeychain.restore() + }) + + describe('#createNewVaultAndKeychain', function () { + it('can only create new vault on keyringController once', async function () { + + const selectStub = sinon.stub(metamaskController, 'selectFirstIdentity') + + const password = 'a-fake-password' + + const first = await metamaskController.createNewVaultAndKeychain(password) + const second = await metamaskController.createNewVaultAndKeychain(password) + + assert(metamaskController.keyringController.createNewVaultAndKeychain.calledOnce) + + selectStub.reset() + }) + }) }) }) diff --git a/test/unit/pending-tx-test.js b/test/unit/pending-tx-test.js index 32117a194..961fa6baf 100644 --- a/test/unit/pending-tx-test.js +++ b/test/unit/pending-tx-test.js @@ -207,6 +207,7 @@ describe('PendingTransactionTracker', function () { }) describe('#resubmitPendingTxs', function () { + const blockStub = { number: '0x0' }; beforeEach(function () { const txMeta2 = txMeta3 = txMeta txList = [txMeta, txMeta2, txMeta3].map((tx) => { @@ -224,7 +225,7 @@ describe('PendingTransactionTracker', function () { Promise.all(txList.map((tx) => tx.processed)) .then((txCompletedList) => done()) .catch(done) - pendingTxTracker.resubmitPendingTxs() + pendingTxTracker.resubmitPendingTxs(blockStub) }) it('should not emit \'tx:failed\' if the txMeta throws a known txError', function (done) { knownErrors =[ @@ -251,7 +252,7 @@ describe('PendingTransactionTracker', function () { .then((txCompletedList) => done()) .catch(done) - pendingTxTracker.resubmitPendingTxs() + pendingTxTracker.resubmitPendingTxs(blockStub) }) it('should emit \'tx:warning\' if it encountered a real error', function (done) { pendingTxTracker.once('tx:warning', (txMeta, err) => { @@ -269,28 +270,74 @@ describe('PendingTransactionTracker', function () { .then((txCompletedList) => done()) .catch(done) - pendingTxTracker.resubmitPendingTxs() + pendingTxTracker.resubmitPendingTxs(blockStub) }) }) describe('#_resubmitTx', function () { - it('should publishing the transaction', function (done) { - const enoughBalance = '0x100000' - pendingTxTracker.getBalance = (address) => { - assert.equal(address, txMeta.txParams.from, 'Should pass the address') - return enoughBalance - } - pendingTxTracker.publishTransaction = async (rawTx) => { - assert.equal(rawTx, txMeta.rawTx, 'Should pass the rawTx') - } + const mockFirstRetryBlockNumber = '0x1' + let txMetaToTestExponentialBackoff - // Stubbing out current account state: - // Adding the fake tx: - pendingTxTracker._resubmitTx(txMeta) - .then(() => done()) - .catch((err) => { - assert.ifError(err, 'should not throw an error') - done(err) + beforeEach(() => { + pendingTxTracker.getBalance = (address) => { + assert.equal(address, txMeta.txParams.from, 'Should pass the address') + return enoughBalance + } + pendingTxTracker.publishTransaction = async (rawTx) => { + assert.equal(rawTx, txMeta.rawTx, 'Should pass the rawTx') + } + sinon.spy(pendingTxTracker, 'publishTransaction') + + txMetaToTestExponentialBackoff = Object.assign({}, txMeta, { + retryCount: 4, + firstRetryBlockNumber: mockFirstRetryBlockNumber, + }) + }) + + afterEach(() => { + pendingTxTracker.publishTransaction.reset() + }) + + it('should publish the transaction', function (done) { + const enoughBalance = '0x100000' + + // Stubbing out current account state: + // Adding the fake tx: + pendingTxTracker._resubmitTx(txMeta) + .then(() => done()) + .catch((err) => { + assert.ifError(err, 'should not throw an error') + done(err) + }) + + assert.equal(pendingTxTracker.publishTransaction.callCount, 1, 'Should call publish transaction') + }) + + it('should not publish the transaction if the limit of retries has been exceeded', function (done) { + const enoughBalance = '0x100000' + const mockLatestBlockNumber = '0x5' + + pendingTxTracker._resubmitTx(txMetaToTestExponentialBackoff, mockLatestBlockNumber) + .then(() => done()) + .catch((err) => { + assert.ifError(err, 'should not throw an error') + done(err) + }) + + assert.equal(pendingTxTracker.publishTransaction.callCount, 0, 'Should NOT call publish transaction') + }) + + it('should publish the transaction if the number of blocks since last retry exceeds the last set limit', function (done) { + const enoughBalance = '0x100000' + const mockLatestBlockNumber = '0x11' + + pendingTxTracker._resubmitTx(txMetaToTestExponentialBackoff, mockLatestBlockNumber) + .then(() => done()) + .catch((err) => { + assert.ifError(err, 'should not throw an error') + done(err) + }) + + assert.equal(pendingTxTracker.publishTransaction.callCount, 1, 'Should call publish transaction') }) - }) }) }) diff --git a/ui/app/actions.js b/ui/app/actions.js index e79f4373e..ed0518184 100644 --- a/ui/app/actions.js +++ b/ui/app/actions.js @@ -149,6 +149,7 @@ var actions = { UPDATE_SEND_AMOUNT: 'UPDATE_SEND_AMOUNT', UPDATE_SEND_MEMO: 'UPDATE_SEND_MEMO', UPDATE_SEND_ERRORS: 'UPDATE_SEND_ERRORS', + UPDATE_MAX_MODE: 'UPDATE_MAX_MODE', UPDATE_SEND: 'UPDATE_SEND', CLEAR_SEND: 'CLEAR_SEND', updateGasLimit, @@ -160,6 +161,7 @@ var actions = { updateSendAmount, updateSendMemo, updateSendErrors, + setMaxModeTo, updateSend, clearSend, setSelectedAddress, @@ -237,6 +239,11 @@ var actions = { SET_USE_BLOCKIE: 'SET_USE_BLOCKIE', setUseBlockie, + + // Feature Flags + setFeatureFlag, + updateFeatureFlags, + UPDATE_FEATURE_FLAGS: 'UPDATE_FEATURE_FLAGS', } module.exports = actions @@ -637,6 +644,13 @@ function updateSendErrors (error) { } } +function setMaxModeTo (bool) { + return { + type: actions.UPDATE_MAX_MODE, + value: bool, + } +} + function updateSend (newSend) { return { type: actions.UPDATE_SEND, @@ -988,9 +1002,10 @@ function showConfigPage (transitionForward = true) { } } -function showAddTokenPage () { +function showAddTokenPage (transitionForward = true) { return { type: actions.SHOW_ADD_TOKEN_PAGE, + value: transitionForward, } } @@ -1272,7 +1287,8 @@ function exportAccount (password, address) { return reject(err) } - dispatch(self.exportAccountComplete()) + // dispatch(self.exportAccountComplete()) + dispatch(self.showPrivateKey(result)) return resolve(result) }) @@ -1439,7 +1455,7 @@ function reshowQrCode (data, coin) { dispatch(actions.showLoadingIndication()) shapeShiftRequest('marketinfo', {pair: `${coin.toLowerCase()}_eth`}, (mktResponse) => { if (mktResponse.error) return dispatch(actions.displayWarning(mktResponse.error)) - + var message = [ `Deposit your ${coin} to the address bellow:`, `Deposit Limit: ${mktResponse.limit}`, @@ -1447,10 +1463,11 @@ function reshowQrCode (data, coin) { ] dispatch(actions.hideLoadingIndication()) - return dispatch(actions.showModal({ - name: 'SHAPESHIFT_DEPOSIT_TX', - Qr: { data, message }, - })) + return dispatch(actions.showQrView(data, message)) + // return dispatch(actions.showModal({ + // name: 'SHAPESHIFT_DEPOSIT_TX', + // Qr: { data, message }, + // })) }) } } @@ -1506,6 +1523,34 @@ function updateTokenExchangeRate (token = '') { } } +function setFeatureFlag (feature, activated) { + const notificationType = activated + ? 'BETA_UI_NOTIFICATION_MODAL' + : 'OLD_UI_NOTIFICATION_MODAL' + return (dispatch) => { + dispatch(actions.showLoadingIndication()) + return new Promise((resolve, reject) => { + background.setFeatureFlag(feature, activated, (err, updatedFeatureFlags) => { + dispatch(actions.hideLoadingIndication()) + if (err) { + dispatch(actions.displayWarning(err.message)) + reject(err) + } + dispatch(actions.updateFeatureFlags(updatedFeatureFlags)) + dispatch(actions.showModal({ name: notificationType })) + resolve(updatedFeatureFlags) + }) + }) + } +} + +function updateFeatureFlags (updatedFeatureFlags) { + return { + type: actions.UPDATE_FEATURE_FLAGS, + value: updatedFeatureFlags, + } +} + // Call Background Then Update // // A function generator for a common pattern wherein: diff --git a/ui/app/app.js b/ui/app/app.js index e90c3e98e..88a5c8458 100644 --- a/ui/app/app.js +++ b/ui/app/app.js @@ -116,40 +116,41 @@ App.prototype.render = function () { log.debug('Main ui render function') return ( + h('.new-ui', [ + h('.flex-column.full-height', { + style: { + overflowX: 'hidden', + position: 'relative', + alignItems: 'center', + }, + }, [ - h('.flex-column.full-height', { - style: { - overflowX: 'hidden', - position: 'relative', - alignItems: 'center', - }, - }, [ - - // global modal - h(Modal, {}, []), + // global modal + h(Modal, {}, []), - // app bar - this.renderAppBar(), + // app bar + this.renderAppBar(), - // sidebar - this.renderSidebar(), + // sidebar + this.renderSidebar(), - // network dropdown - h(NetworkDropdown, { - provider: this.props.provider, - frequentRpcList: this.props.frequentRpcList, - }, []), + // network dropdown + h(NetworkDropdown, { + provider: this.props.provider, + frequentRpcList: this.props.frequentRpcList, + }, []), - h(AccountMenu), + h(AccountMenu), - (isLoading || isLoadingNetwork) && h(Loading, { - loadingMessage: loadMessage, - }), + (isLoading || isLoadingNetwork) && h(Loading, { + loadingMessage: loadMessage, + }), - // this.renderLoadingIndicator({ isLoading, isLoadingNetwork, loadMessage }), + // this.renderLoadingIndicator({ isLoading, isLoadingNetwork, loadMessage }), - // content - this.renderPrimary(), + // content + this.renderPrimary(), + ]), ]) ) } diff --git a/ui/app/components/customize-gas-modal/index.js b/ui/app/components/customize-gas-modal/index.js index 485dacf90..826d2cd4b 100644 --- a/ui/app/components/customize-gas-modal/index.js +++ b/ui/app/components/customize-gas-modal/index.js @@ -5,6 +5,8 @@ const connect = require('react-redux').connect const actions = require('../../actions') const GasModalCard = require('./gas-modal-card') +const ethUtil = require('ethereumjs-util') + const { MIN_GAS_PRICE_DEC, MIN_GAS_LIMIT_DEC, @@ -19,6 +21,7 @@ const { conversionUtil, multiplyCurrencies, conversionGreaterThan, + subtractCurrencies, } = require('../../conversion-util') const { @@ -30,6 +33,7 @@ const { getSendFrom, getCurrentAccountWithSendEtherInfo, getSelectedTokenToFiatRate, + getSendMaxModeState, } = require('../../selectors') function mapStateToProps (state) { @@ -42,6 +46,7 @@ function mapStateToProps (state) { gasLimit: getGasLimit(state), conversionRate, amount: getSendAmount(state), + maxModeOn: getSendMaxModeState(state), balance: currentAccount.balance, primaryCurrency: selectedToken && selectedToken.symbol, selectedToken, @@ -55,6 +60,7 @@ function mapDispatchToProps (dispatch) { updateGasPrice: newGasPrice => dispatch(actions.updateGasPrice(newGasPrice)), updateGasLimit: newGasLimit => dispatch(actions.updateGasLimit(newGasLimit)), updateGasTotal: newGasTotal => dispatch(actions.updateGasTotal(newGasTotal)), + updateSendAmount: newAmount => dispatch(actions.updateSendAmount(newAmount)), } } @@ -93,8 +99,21 @@ CustomizeGasModal.prototype.save = function (gasPrice, gasLimit, gasTotal) { updateGasLimit, hideModal, updateGasTotal, + maxModeOn, + selectedToken, + balance, + updateSendAmount, } = this.props + if (maxModeOn && !selectedToken) { + const maxAmount = subtractCurrencies( + ethUtil.addHexPrefix(balance), + ethUtil.addHexPrefix(gasTotal), + { toNumericBase: 'hex' } + ) + updateSendAmount(maxAmount) + } + updateGasPrice(gasPrice) updateGasLimit(gasLimit) updateGasTotal(gasTotal) @@ -112,12 +131,13 @@ CustomizeGasModal.prototype.validate = function ({ gasTotal, gasLimit }) { selectedToken, amountConversionRate, conversionRate, + maxModeOn, } = this.props let error = null const balanceIsSufficient = isBalanceSufficient({ - amount: selectedToken ? '0' : amount, + amount: selectedToken || maxModeOn ? '0' : amount, gasTotal, balance, selectedToken, diff --git a/ui/app/components/modals/modal.js b/ui/app/components/modals/modal.js index f2909f3c3..2ff6accaa 100644 --- a/ui/app/components/modals/modal.js +++ b/ui/app/components/modals/modal.js @@ -16,6 +16,7 @@ const NewAccountModal = require('./new-account-modal') const ShapeshiftDepositTxModal = require('./shapeshift-deposit-tx-modal.js') const HideTokenConfirmationModal = require('./hide-token-confirmation-modal') const CustomizeGasModal = require('../customize-gas-modal') +const NotifcationModal = require('./notification-modal') const accountModalStyle = { mobileModalStyle: { @@ -133,6 +134,42 @@ const MODALS = { }, }, + BETA_UI_NOTIFICATION_MODAL: { + contents: [ + h(NotifcationModal, { + header: 'Welcome to the New UI (Beta)', + message: `You are now using the new Metamask UI. Take a look around, try out new features like sending tokens, + and let us know if you have any issues.`, + }), + ], + mobileModalStyle: { + width: '95%', + top: isPopupOrNotification() === 'popup' ? '52vh' : '36.5vh', + }, + laptopModalStyle: { + width: '449px', + top: 'calc(33% + 45px)', + }, + }, + + OLD_UI_NOTIFICATION_MODAL: { + contents: [ + h(NotifcationModal, { + header: 'Old UI', + message: `You have returned to the old UI. You can switch back to the New UI through the option in the top + right dropdown menu.`, + }), + ], + mobileModalStyle: { + width: '95%', + top: isPopupOrNotification() === 'popup' ? '52vh' : '36.5vh', + }, + laptopModalStyle: { + width: '449px', + top: 'calc(33% + 45px)', + }, + }, + NEW_ACCOUNT: { contents: [ h(NewAccountModal, {}, []), diff --git a/ui/app/components/modals/notification-modal.js b/ui/app/components/modals/notification-modal.js new file mode 100644 index 000000000..239144b0c --- /dev/null +++ b/ui/app/components/modals/notification-modal.js @@ -0,0 +1,51 @@ +const { Component } = require('react') +const PropTypes = require('prop-types') +const h = require('react-hyperscript') +const { connect } = require('react-redux') +const actions = require('../../actions') + +class NotificationModal extends Component { + render () { + const { + header, + message, + } = this.props + + return h('div', [ + h('div.notification-modal-wrapper', { + }, [ + + h('div.notification-modal-header', {}, [ + header, + ]), + + h('div.notification-modal-message-wrapper', {}, [ + h('div.notification-modal-message', {}, [ + message, + ]), + ]), + + h('div.modal-close-x', { + onClick: this.props.hideModal, + }), + + ]), + ]) + } +} + +NotificationModal.propTypes = { + hideModal: PropTypes.func, + header: PropTypes.string, + message: PropTypes.string, +} + +const mapDispatchToProps = dispatch => { + return { + hideModal: () => { + dispatch(actions.hideModal()) + }, + } +} + +module.exports = connect(null, mapDispatchToProps)(NotificationModal) diff --git a/ui/app/components/send/send-v2-container.js b/ui/app/components/send/send-v2-container.js index 4451a6113..655de8897 100644 --- a/ui/app/components/send/send-v2-container.js +++ b/ui/app/components/send/send-v2-container.js @@ -78,5 +78,6 @@ function mapDispatchToProps (dispatch) { goHome: () => dispatch(actions.goHome()), clearSend: () => dispatch(actions.clearSend()), backToConfirmScreen: editingTransactionId => dispatch(actions.showConfTxPage({ id: editingTransactionId })), + setMaxModeTo: bool => dispatch(actions.setMaxModeTo(bool)), } } diff --git a/ui/app/css/index.scss b/ui/app/css/index.scss index 01899ccad..445c819ff 100644 --- a/ui/app/css/index.scss +++ b/ui/app/css/index.scss @@ -4,6 +4,7 @@ http://www.creativebloq.com/web-design/manage-large-css-projects-itcss-101517528 https://www.xfive.co/blog/itcss-scalable-maintainable-css-architecture/ */ + @import './itcss/settings/index.scss'; @import './itcss/tools/index.scss'; @import './itcss/generic/index.scss'; diff --git a/ui/app/css/itcss/components/menu.scss b/ui/app/css/itcss/components/menu.scss index 7953834ee..eb92a1b70 100644 --- a/ui/app/css/itcss/components/menu.scss +++ b/ui/app/css/itcss/components/menu.scss @@ -11,8 +11,8 @@ flex-flow: row nowrap; align-items: center; position: relative; - z-index: 200; font-weight: 300; + z-index: 201; @media screen and (max-width: 575px) { padding: 14px; diff --git a/ui/app/css/itcss/components/modal.scss b/ui/app/css/itcss/components/modal.scss index b69bd5c7e..9b64564d6 100644 --- a/ui/app/css/itcss/components/modal.scss +++ b/ui/app/css/itcss/components/modal.scss @@ -563,3 +563,39 @@ } } } + +//Notification Modal + +.notification-modal-wrapper { + display: flex; + flex-direction: column; + justify-content: flex-start; + align-items: center; + position: relative; + border: 1px solid $alto; + box-shadow: 0 0 2px 2px $alto; + font-family: Roboto; +} + +.notification-modal-header { + background: $wild-sand; + width: 100%; + display: flex; + justify-content: center; + padding: 30px; + font-size: 22px; + color: $nile-blue; + height: 79px; +} + +.notification-modal-message { + padding: 20px; +} + +.notification-modal-message { + width: 100%; + display: flex; + justify-content: center; + font-size: 17px; + color: $nile-blue; +}
\ No newline at end of file diff --git a/ui/app/css/itcss/components/settings.scss b/ui/app/css/itcss/components/settings.scss index 2f29d8017..d60ebd934 100644 --- a/ui/app/css/itcss/components/settings.scss +++ b/ui/app/css/itcss/components/settings.scss @@ -145,6 +145,11 @@ color: $monzo; } +.settings__clear-button--orange { + border: 1px solid rgba(247, 134, 28, 1); + color: rgba(247, 134, 28, 1); +} + .settings__info-logo-wrapper { height: 80px; margin-bottom: 20px; diff --git a/ui/app/first-time/init-menu.js b/ui/app/first-time/init-menu.js index cc7c51bd3..b4587f1ee 100644 --- a/ui/app/first-time/init-menu.js +++ b/ui/app/first-time/init-menu.js @@ -8,6 +8,8 @@ const actions = require('../actions') const Tooltip = require('../components/tooltip') const getCaretCoordinates = require('textarea-caret') +let isSubmitting = false + module.exports = connect(mapStateToProps)(InitializeMenuScreen) inherits(InitializeMenuScreen, Component) @@ -164,7 +166,10 @@ InitializeMenuScreen.prototype.createNewVaultAndKeychain = function () { return } - this.props.dispatch(actions.createNewVaultAndKeychain(password)) + if (!isSubmitting) { + isSubmitting = true + this.props.dispatch(actions.createNewVaultAndKeychain(password)) + } } InitializeMenuScreen.prototype.inputChanged = function (event) { diff --git a/ui/app/reducers/metamask.js b/ui/app/reducers/metamask.js index fb53bbaef..95b41e5f3 100644 --- a/ui/app/reducers/metamask.js +++ b/ui/app/reducers/metamask.js @@ -33,10 +33,12 @@ function reduceMetamask (state, action) { amount: '0x0', memo: '', errors: {}, + maxModeOn: false, editingTransactionId: null, }, coinOptions: {}, useBlockie: false, + featureFlags: {}, }, state.metamask) switch (action.type) { @@ -258,6 +260,14 @@ function reduceMetamask (state, action) { }, }) + case actions.UPDATE_MAX_MODE: + return extend(metamaskState, { + send: { + ...metamaskState.send, + maxModeOn: action.value, + }, + }) + case actions.UPDATE_SEND: return extend(metamaskState, { send: { @@ -310,7 +320,7 @@ function reduceMetamask (state, action) { return extend(metamaskState, { tokenExchangeRates: { ...metamaskState.tokenExchangeRates, - [marketinfo.pair]: ssMarketInfo, + [ssMarketInfo.pair]: ssMarketInfo, }, coinOptions, }) @@ -320,6 +330,11 @@ function reduceMetamask (state, action) { useBlockie: action.value, }) + case actions.UPDATE_FEATURE_FLAGS: + return extend(metamaskState, { + featureFlags: action.value, + }) + default: return metamaskState diff --git a/ui/app/root.js b/ui/app/root.js index 9e7314b20..21d6d1829 100644 --- a/ui/app/root.js +++ b/ui/app/root.js @@ -2,7 +2,7 @@ const inherits = require('util').inherits const Component = require('react').Component const Provider = require('react-redux').Provider const h = require('react-hyperscript') -const App = require('./app') +const SelectedApp = require('./select-app') module.exports = Root @@ -15,7 +15,7 @@ Root.prototype.render = function () { h(Provider, { store: this.props.store, }, [ - h(App), + h(SelectedApp), ]) ) diff --git a/ui/app/select-app.js b/ui/app/select-app.js new file mode 100644 index 000000000..ffa31b767 --- /dev/null +++ b/ui/app/select-app.js @@ -0,0 +1,47 @@ +const inherits = require('util').inherits +const Component = require('react').Component +const connect = require('react-redux').connect +const h = require('react-hyperscript') +const App = require('./app') +const OldApp = require('../../old-ui/app/app') +const { autoAddToBetaUI } = require('./selectors') +const { setFeatureFlag } = require('./actions') + +function mapStateToProps (state) { + return { + betaUI: state.metamask.featureFlags.betaUI, + autoAdd: autoAddToBetaUI(state), + isUnlocked: state.metamask.isUnlocked, + } +} + +function mapDispatchToProps (dispatch) { + return { + setFeatureFlagToBeta: () => dispatch(setFeatureFlag('betaUI', true)), + } +} +module.exports = connect(mapStateToProps, mapDispatchToProps)(SelectedApp) + +inherits(SelectedApp, Component) +function SelectedApp () { + this.state = { + autoAdd: false, + } + Component.call(this) +} + +SelectedApp.prototype.componentWillReceiveProps = function (nextProps) { + const { isUnlocked, setFeatureFlagToBeta } = this.props + + if (!isUnlocked && nextProps.isUnlocked && nextProps.autoAdd) { + this.setState({ autoAdd: nextProps.autoAdd }) + setFeatureFlagToBeta() + } +} + +SelectedApp.prototype.render = function () { + const { betaUI } = this.props + const { autoAdd } = this.state + const Selected = betaUI ? App : OldApp + return h(Selected) +} diff --git a/ui/app/selectors.js b/ui/app/selectors.js index a5f9a75d8..22ef439c4 100644 --- a/ui/app/selectors.js +++ b/ui/app/selectors.js @@ -24,6 +24,8 @@ const selectors = { getSendAmount, getSelectedTokenToFiatRate, getSelectedTokenContract, + autoAddToBetaUI, + getSendMaxModeState, } module.exports = selectors @@ -135,6 +137,10 @@ function getSendAmount (state) { return state.metamask.send.amount } +function getSendMaxModeState (state) { + return state.metamask.send.maxModeOn +} + function getCurrentCurrency (state) { return state.metamask.currentCurrency } @@ -158,3 +164,20 @@ function getSelectedTokenContract (state) { ? global.eth.contract(abi).at(selectedToken.address) : null } + +function autoAddToBetaUI (state) { + const autoAddTransactionThreshold = 12 + const autoAddAccountsThreshold = 2 + const autoAddTokensThreshold = 1 + + const numberOfTransactions = state.metamask.selectedAddressTxList.length + const numberOfAccounts = Object.keys(state.metamask.accounts).length + const numberOfTokensAdded = state.metamask.tokens.length + + const userPassesThreshold = (numberOfTransactions > autoAddTransactionThreshold) && + (numberOfAccounts > autoAddAccountsThreshold) && + (numberOfTokensAdded > autoAddTokensThreshold) + const userIsNotInBeta = !state.metamask.featureFlags.betaUI + + return userIsNotInBeta && userPassesThreshold +}
\ No newline at end of file diff --git a/ui/app/send-v2.js b/ui/app/send-v2.js index 788ae87b4..e1b88f0db 100644 --- a/ui/app/send-v2.js +++ b/ui/app/send-v2.js @@ -13,8 +13,6 @@ const GasFeeDisplay = require('./components/send/gas-fee-display-v2') const { MIN_GAS_TOTAL, - MIN_GAS_PRICE_HEX, - MIN_GAS_LIMIT_HEX, } = require('./components/send/send-constants') const { @@ -313,8 +311,9 @@ SendTransactionScreen.prototype.renderToRow = function () { SendTransactionScreen.prototype.handleAmountChange = function (value) { const amount = value - const { updateSendAmount } = this.props + const { updateSendAmount, setMaxModeTo } = this.props + setMaxModeTo(false) this.validateAmount(amount) updateSendAmount(amount) } @@ -324,11 +323,9 @@ SendTransactionScreen.prototype.setAmountToMax = function () { from: { balance }, updateSendAmount, updateSendErrors, - updateGasPrice, - updateGasLimit, - updateGasTotal, tokenBalance, selectedToken, + gasTotal, } = this.props const { decimals } = selectedToken || {} const multiplier = Math.pow(10, Number(decimals || 0)) @@ -337,16 +334,12 @@ SendTransactionScreen.prototype.setAmountToMax = function () { ? multiplyCurrencies(tokenBalance, multiplier, {toNumericBase: 'hex'}) : subtractCurrencies( ethUtil.addHexPrefix(balance), - ethUtil.addHexPrefix(MIN_GAS_TOTAL), + ethUtil.addHexPrefix(gasTotal), { toNumericBase: 'hex' } ) updateSendErrors({ amount: null }) - if (!selectedToken) { - updateGasPrice(MIN_GAS_PRICE_HEX) - updateGasLimit(MIN_GAS_LIMIT_HEX) - updateGasTotal(MIN_GAS_TOTAL) - } + updateSendAmount(maxAmount) } @@ -407,19 +400,22 @@ SendTransactionScreen.prototype.renderAmountRow = function () { amountConversionRate, errors, amount, + setMaxModeTo, + maxModeOn, } = this.props return h('div.send-v2__form-row', [ - h('div.send-v2__form-label', [ + h('div.send-v2__form-label', [ 'Amount:', this.renderErrorMessage('amount'), !errors.amount && h('div.send-v2__amount-max', { onClick: (event) => { event.preventDefault() + setMaxModeTo(true) this.setAmountToMax() }, - }, [ 'Max' ]), + }, [ !maxModeOn ? 'Max' : '' ]), ]), h('div.send-v2__form-field', [ diff --git a/ui/app/settings.js b/ui/app/settings.js index caa36d2b8..ca7535d26 100644 --- a/ui/app/settings.js +++ b/ui/app/settings.js @@ -228,6 +228,26 @@ class Settings extends Component { ]) ) } + + renderOldUI () { + const { setFeatureFlagToBeta } = this.props + + return ( + h('div.settings__content-row', [ + h('div.settings__content-item', 'Use old UI'), + h('div.settings__content-item', [ + h('div.settings__content-item-col', [ + h('button.settings__clear-button.settings__clear-button--orange', { + onClick (event) { + event.preventDefault() + setFeatureFlagToBeta() + }, + }, 'Use old UI'), + ]), + ]), + ]) + ) + } renderSettingsContent () { const { warning } = this.props @@ -241,10 +261,11 @@ class Settings extends Component { this.renderNewRpcUrl(), this.renderStateLogs(), this.renderSeedWords(), + this.renderOldUI(), ]) ) } - + renderLogo () { return ( h('div.settings__info-logo-wrapper', [ @@ -362,6 +383,7 @@ Settings.propTypes = { setRpcTarget: PropTypes.func, displayWarning: PropTypes.func, revealSeedConfirmation: PropTypes.func, + setFeatureFlagToBeta: PropTypes.func, warning: PropTypes.string, goHome: PropTypes.func, } @@ -381,6 +403,7 @@ const mapDispatchToProps = dispatch => { displayWarning: warning => dispatch(actions.displayWarning(warning)), revealSeedConfirmation: () => dispatch(actions.revealSeedConfirmation()), setUseBlockie: value => dispatch(actions.setUseBlockie(value)), + setFeatureFlagToBeta: () => dispatch(actions.setFeatureFlag('betaUI', false)), } } |