From 3c73781787f7aab6cdba0b738e4844a26aab5d8e Mon Sep 17 00:00:00 2001 From: Whymarrh Whitby Date: Thu, 14 Feb 2019 17:33:21 -0330 Subject: Delete old-ui folder --- old-ui/app/account-detail.js | 297 - old-ui/app/account-qr.js | 86 - old-ui/app/accounts/import/index.js | 119 - old-ui/app/accounts/import/json.js | 124 - old-ui/app/accounts/import/private-key.js | 69 - old-ui/app/accounts/import/seed.js | 30 - old-ui/app/add-suggested-token.js | 202 - old-ui/app/add-token.js | 241 - old-ui/app/app.js | 315 -- old-ui/app/components/account-dropdowns.js | 321 -- old-ui/app/components/account-export.js | 132 - old-ui/app/components/account-panel.js | 86 - old-ui/app/components/app-bar.js | 436 -- old-ui/app/components/balance.js | 96 - old-ui/app/components/binary-renderer.js | 46 - old-ui/app/components/bn-as-decimal-input.js | 181 - old-ui/app/components/buy-button-subview.js | 261 - old-ui/app/components/coinbase-form.js | 63 - old-ui/app/components/copyButton.js | 59 - old-ui/app/components/copyable.js | 46 - old-ui/app/components/custom-radio-list.js | 60 - old-ui/app/components/dropdown.js | 98 - old-ui/app/components/editable-label.js | 57 - old-ui/app/components/ens-input.js | 176 - old-ui/app/components/eth-balance.js | 95 - old-ui/app/components/fiat-value.js | 64 - old-ui/app/components/hex-as-decimal-input.js | 154 - old-ui/app/components/identicon.js | 74 - old-ui/app/components/loading.js | 55 - old-ui/app/components/mascot.js | 59 - old-ui/app/components/menu-droppo.js | 132 - old-ui/app/components/mini-account-panel.js | 74 - old-ui/app/components/network.js | 131 - old-ui/app/components/notice.js | 145 - old-ui/app/components/pending-msg-details.js | 50 - old-ui/app/components/pending-msg.js | 70 - .../app/components/pending-personal-msg-details.js | 60 - old-ui/app/components/pending-personal-msg.js | 47 - old-ui/app/components/pending-tx.js | 519 -- old-ui/app/components/pending-typed-msg-details.js | 60 - old-ui/app/components/pending-typed-msg.js | 46 - old-ui/app/components/range-slider.js | 58 - old-ui/app/components/shapeshift-form.js | 306 -- old-ui/app/components/shift-list-item.js | 204 - old-ui/app/components/tab-bar.js | 37 - old-ui/app/components/template.js | 18 - old-ui/app/components/token-cell.js | 72 - old-ui/app/components/token-list.js | 205 - old-ui/app/components/tooltip.js | 22 - .../app/components/transaction-list-item-icon.js | 68 - old-ui/app/components/transaction-list-item.js | 258 - old-ui/app/components/transaction-list.js | 87 - old-ui/app/components/typed-message-renderer.js | 69 - old-ui/app/conf-tx.js | 247 - old-ui/app/config.js | 383 -- old-ui/app/css/debug.css | 21 - old-ui/app/css/fonts.css | 372 -- old-ui/app/css/index.css | 939 ---- old-ui/app/css/lib.css | 306 -- old-ui/app/css/output/index.css | 5722 -------------------- old-ui/app/css/reset.css | 48 - old-ui/app/css/transitions.css | 42 - old-ui/app/first-time/init-menu.js | 179 - old-ui/app/img/identicon-tardigrade.png | Bin 141119 -> 0 bytes old-ui/app/img/identicon-walrus.png | Bin 388973 -> 0 bytes old-ui/app/info.js | 154 - old-ui/app/infura-conversion.json | 653 --- old-ui/app/keychains/hd/create-vault-complete.js | 91 - .../app/keychains/hd/recover-seed/confirmation.js | 121 - old-ui/app/keychains/hd/restore-vault.js | 162 - old-ui/app/new-keychain.js | 29 - old-ui/app/new-ui-annoucement.js | 85 - old-ui/app/provider-approval.js | 65 - old-ui/app/send.js | 309 -- old-ui/app/settings.js | 59 - old-ui/app/template.js | 30 - old-ui/app/unlock.js | 122 - old-ui/app/util.js | 241 - 78 files changed, 17220 deletions(-) delete mode 100644 old-ui/app/account-detail.js delete mode 100644 old-ui/app/account-qr.js delete mode 100644 old-ui/app/accounts/import/index.js delete mode 100644 old-ui/app/accounts/import/json.js delete mode 100644 old-ui/app/accounts/import/private-key.js delete mode 100644 old-ui/app/accounts/import/seed.js delete mode 100644 old-ui/app/add-suggested-token.js delete mode 100644 old-ui/app/add-token.js delete mode 100644 old-ui/app/app.js delete mode 100644 old-ui/app/components/account-dropdowns.js delete mode 100644 old-ui/app/components/account-export.js delete mode 100644 old-ui/app/components/account-panel.js delete mode 100644 old-ui/app/components/app-bar.js delete mode 100644 old-ui/app/components/balance.js delete mode 100644 old-ui/app/components/binary-renderer.js delete mode 100644 old-ui/app/components/bn-as-decimal-input.js delete mode 100644 old-ui/app/components/buy-button-subview.js delete mode 100644 old-ui/app/components/coinbase-form.js delete mode 100644 old-ui/app/components/copyButton.js delete mode 100644 old-ui/app/components/copyable.js delete mode 100644 old-ui/app/components/custom-radio-list.js delete mode 100644 old-ui/app/components/dropdown.js delete mode 100644 old-ui/app/components/editable-label.js delete mode 100644 old-ui/app/components/ens-input.js delete mode 100644 old-ui/app/components/eth-balance.js delete mode 100644 old-ui/app/components/fiat-value.js delete mode 100644 old-ui/app/components/hex-as-decimal-input.js delete mode 100644 old-ui/app/components/identicon.js delete mode 100644 old-ui/app/components/loading.js delete mode 100644 old-ui/app/components/mascot.js delete mode 100644 old-ui/app/components/menu-droppo.js delete mode 100644 old-ui/app/components/mini-account-panel.js delete mode 100644 old-ui/app/components/network.js delete mode 100644 old-ui/app/components/notice.js delete mode 100644 old-ui/app/components/pending-msg-details.js delete mode 100644 old-ui/app/components/pending-msg.js delete mode 100644 old-ui/app/components/pending-personal-msg-details.js delete mode 100644 old-ui/app/components/pending-personal-msg.js delete mode 100644 old-ui/app/components/pending-tx.js delete mode 100644 old-ui/app/components/pending-typed-msg-details.js delete mode 100644 old-ui/app/components/pending-typed-msg.js delete mode 100644 old-ui/app/components/range-slider.js delete mode 100644 old-ui/app/components/shapeshift-form.js delete mode 100644 old-ui/app/components/shift-list-item.js delete mode 100644 old-ui/app/components/tab-bar.js delete mode 100644 old-ui/app/components/template.js delete mode 100644 old-ui/app/components/token-cell.js delete mode 100644 old-ui/app/components/token-list.js delete mode 100644 old-ui/app/components/tooltip.js delete mode 100644 old-ui/app/components/transaction-list-item-icon.js delete mode 100644 old-ui/app/components/transaction-list-item.js delete mode 100644 old-ui/app/components/transaction-list.js delete mode 100644 old-ui/app/components/typed-message-renderer.js delete mode 100644 old-ui/app/conf-tx.js delete mode 100644 old-ui/app/config.js delete mode 100644 old-ui/app/css/debug.css delete mode 100644 old-ui/app/css/fonts.css delete mode 100644 old-ui/app/css/index.css delete mode 100644 old-ui/app/css/lib.css delete mode 100644 old-ui/app/css/output/index.css delete mode 100644 old-ui/app/css/reset.css delete mode 100644 old-ui/app/css/transitions.css delete mode 100644 old-ui/app/first-time/init-menu.js delete mode 100644 old-ui/app/img/identicon-tardigrade.png delete mode 100644 old-ui/app/img/identicon-walrus.png delete mode 100644 old-ui/app/info.js delete mode 100644 old-ui/app/infura-conversion.json delete mode 100644 old-ui/app/keychains/hd/create-vault-complete.js delete mode 100644 old-ui/app/keychains/hd/recover-seed/confirmation.js delete mode 100644 old-ui/app/keychains/hd/restore-vault.js delete mode 100644 old-ui/app/new-keychain.js delete mode 100644 old-ui/app/new-ui-annoucement.js delete mode 100644 old-ui/app/provider-approval.js delete mode 100644 old-ui/app/send.js delete mode 100644 old-ui/app/settings.js delete mode 100644 old-ui/app/template.js delete mode 100644 old-ui/app/unlock.js delete mode 100644 old-ui/app/util.js (limited to 'old-ui/app') diff --git a/old-ui/app/account-detail.js b/old-ui/app/account-detail.js deleted file mode 100644 index d240fc38e..000000000 --- a/old-ui/app/account-detail.js +++ /dev/null @@ -1,297 +0,0 @@ -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, - suggestedTokens: state.metamask.suggestedTokens, - 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 - - if (Object.keys(props.suggestedTokens).length > 0) { - this.props.dispatch(actions.showAddSuggestedTokenPage()) - } - - 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.setAccountLabel(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', - height: '15px', - 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/account-qr.js b/old-ui/app/account-qr.js deleted file mode 100644 index b41cc5112..000000000 --- a/old-ui/app/account-qr.js +++ /dev/null @@ -1,86 +0,0 @@ -const PropTypes = require('prop-types') -const {PureComponent} = require('react') -const h = require('react-hyperscript') -const {qrcode: qrCode} = require('qrcode-npm') -const {connect} = require('react-redux') -const {isHexPrefixed} = require('ethereumjs-util') -const actions = require('../../ui/app/actions') -const CopyButton = require('./components/copyButton') - -class AccountQrScreen extends PureComponent { - static defaultProps = { - warning: null, - } - - static propTypes = { - dispatch: PropTypes.func.isRequired, - buyView: PropTypes.any.isRequired, - Qr: PropTypes.object.isRequired, - selectedAddress: PropTypes.string.isRequired, - warning: PropTypes.node, - } - - render () { - const {dispatch, Qr, selectedAddress, warning} = this.props - const address = `${isHexPrefixed(Qr.data) ? 'ethereum:' : ''}${Qr.data}` - const qrImage = qrCode(4, 'M') - - qrImage.addData(address) - qrImage.make() - - return h('div.flex-column.full-width', { - style: { - alignItems: 'center', - boxSizing: 'border-box', - padding: '50px', - }, - }, [ - h('div.flex-row.full-width', { - style: { - alignItems: 'flex-start', - }, - }, [ - h('i.fa.fa-arrow-left.fa-lg.cursor-pointer.color-orange', { - onClick () { - dispatch(actions.backToAccountDetail(selectedAddress)) - }, - }), - ]), - h('div.qr-header', Qr.message), - warning && h('span.error.flex-center', { - style: { - textAlign: 'center', - width: '229px', - height: '82px', - }, - }, [ - this.props.warning, - ]), - h('div#qr-container.flex-column', { - style: { - marginTop: '25px', - marginBottom: '15px', - }, - dangerouslySetInnerHTML: { - __html: qrImage.createTableTag(4), - }, - }), - h('div.flex-row.full-width', [ - h('h3.ellip-address.grow-tenx', Qr.data), - h(CopyButton, { - value: Qr.data, - }), - ]), - ]) - } -} - -function mapStateToProps (state) { - return { - Qr: state.appState.Qr, - buyView: state.appState.buyView, - warning: state.appState.warning, - } -} - -module.exports = connect(mapStateToProps)(AccountQrScreen) diff --git a/old-ui/app/accounts/import/index.js b/old-ui/app/accounts/import/index.js deleted file mode 100644 index b2c3a4a18..000000000 --- a/old-ui/app/accounts/import/index.js +++ /dev/null @@ -1,119 +0,0 @@ -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', [ - 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('.error', { - style: { - display: 'inline-block', - alignItems: 'center', - padding: '5px 15px 0px 15px', - }, - }, [ - h('span', 'Imported accounts will not be associated with your originally created MetaMask account seedphrase. Learn more about imported accounts '), - h('span', { - style: { - color: 'rgba(247, 134, 28, 1)', - cursor: 'pointer', - textDecoration: 'underline', - }, - onClick: () => { - global.platform.openWindow({ - url: 'https://metamask.zendesk.com/hc/en-us/articles/360015289592-What-Are-Loose-Accounts-', - }) - }, - }, 'here.'), - ]), - 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 deleted file mode 100644 index 8388f17a7..000000000 --- a/old-ui/app/accounts/import/json.js +++ /dev/null @@ -1,124 +0,0 @@ -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 PropTypes = require('prop-types') - -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' - -class JsonImportSubview extends Component { - constructor (props) { - super(props) - - this.state = { - file: null, - fileContents: '', - } - } - - render () { - 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, - ]) - ) - } - - onLoad (event, file) { - this.setState({file: file, fileContents: event.target.result}) - } - - createKeyringOnEnter (event) { - if (event.key === 'Enter') { - event.preventDefault() - this.createNewKeychain() - } - } - - createNewKeychain () { - const { fileContents } = this.state - - if (!fileContents) { - const message = 'You must select a file to import.' - return this.props.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.displayWarning(message) - } - - this.props.importNewAccount([ fileContents, password ]) - // JS runtime requires caught rejections but failures are handled by Redux - .catch() - } -} - -JsonImportSubview.propTypes = { - error: PropTypes.string, - displayWarning: PropTypes.func, - importNewAccount: PropTypes.func, -} - -const mapStateToProps = state => { - return { - error: state.appState.warning, - } -} - -const mapDispatchToProps = dispatch => { - return { - goHome: () => dispatch(actions.goHome()), - displayWarning: warning => dispatch(actions.displayWarning(warning)), - importNewAccount: options => dispatch(actions.importNewAccount('JSON File', options)), - } -} - -module.exports = connect(mapStateToProps, mapDispatchToProps)(JsonImportSubview) diff --git a/old-ui/app/accounts/import/private-key.js b/old-ui/app/accounts/import/private-key.js deleted file mode 100644 index 92e42549d..000000000 --- a/old-ui/app/accounts/import/private-key.js +++ /dev/null @@ -1,69 +0,0 @@ -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 ])) - // JS runtime requires caught rejections but failures are handled by Redux - .catch() -} diff --git a/old-ui/app/accounts/import/seed.js b/old-ui/app/accounts/import/seed.js deleted file mode 100644 index b4a7c0afa..000000000 --- a/old-ui/app/accounts/import/seed.js +++ /dev/null @@ -1,30 +0,0 @@ -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/add-suggested-token.js b/old-ui/app/add-suggested-token.js deleted file mode 100644 index ea534b7da..000000000 --- a/old-ui/app/add-suggested-token.js +++ /dev/null @@ -1,202 +0,0 @@ -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 Copyable = require('./components/copyable') -const addressSummary = require('./util').addressSummary - - -module.exports = connect(mapStateToProps)(AddSuggestedTokenScreen) - -function mapStateToProps (state) { - return { - identities: state.metamask.identities, - suggestedTokens: state.metamask.suggestedTokens, - } -} - -inherits(AddSuggestedTokenScreen, Component) -function AddSuggestedTokenScreen () { - this.state = { - warning: null, - } - Component.call(this) -} - -AddSuggestedTokenScreen.prototype.render = function () { - const state = this.state - const props = this.props - const { warning } = state - const key = Object.keys(props.suggestedTokens)[0] - const { address, symbol, decimals } = props.suggestedTokens[key] - - return ( - h('.flex-column.flex-grow', [ - - // subtitle and nav - h('.section-title.flex-row.flex-center', [ - h('h2.page-subtitle', 'Add Suggested 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('div', { - style: { display: 'flex' }, - }, [ - h(Copyable, { - value: ethUtil.toChecksumAddress(address), - }, [ - h('span#token-address', { - style: { - width: 'inherit', - flex: '1 0 auto', - height: '30px', - margin: '8px', - display: 'flex', - }, - }, addressSummary(address, 24, 4, false)), - ]), - ]), - - h('div', [ - h('span', { - style: { fontWeight: 'bold', paddingRight: '10px'}, - }, 'Token Symbol'), - ]), - - h('div', { style: {display: 'flex'} }, [ - h('p#token_symbol', { - style: { - width: 'inherit', - flex: '1 0 auto', - height: '30px', - margin: '8px', - }, - }, symbol), - ]), - - h('div', [ - h('span', { - style: { fontWeight: 'bold', paddingRight: '10px'}, - }, 'Decimals of Precision'), - ]), - - h('div', { style: {display: 'flex'} }, [ - h('p#token_decimals', { - type: 'number', - style: { - width: 'inherit', - flex: '1 0 auto', - height: '30px', - margin: '8px', - }, - }, decimals), - ]), - - h('button', { - style: { - alignSelf: 'center', - margin: '8px', - }, - onClick: (event) => { - this.props.dispatch(actions.removeSuggestedTokens()) - }, - }, 'Cancel'), - - h('button', { - style: { - alignSelf: 'center', - margin: '8px', - }, - onClick: (event) => { - const valid = this.validateInputs({ address, symbol, decimals }) - if (!valid) return - - this.props.dispatch(actions.addToken(address.trim(), symbol.trim(), decimals)) - .then(() => { - this.props.dispatch(actions.removeSuggestedTokens()) - }) - }, - }, 'Add'), - ]), - ]), - ]) - ) -} - -AddSuggestedTokenScreen.prototype.componentWillMount = function () { - if (typeof global.ethereumProvider === 'undefined') return -} - -AddSuggestedTokenScreen.prototype.validateInputs = function (opts) { - let msg = '' - const identitiesList = Object.keys(this.props.identities) - const { address, symbol, decimals } = opts - 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 -} diff --git a/old-ui/app/add-token.js b/old-ui/app/add-token.js deleted file mode 100644 index 6cf211636..000000000 --- a/old-ui/app/add-token.js +++ /dev/null @@ -1,241 +0,0 @@ -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: '', - 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)) - .then(() => { - this.props.dispatch(actions.goHome()) - }) - }, - }, '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 deleted file mode 100644 index e81899538..000000000 --- a/old-ui/app/app.js +++ /dev/null @@ -1,315 +0,0 @@ -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 log = require('loglevel') -// mascara -const FirstTime = require('../../ui/app/components/pages/first-time-flow').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 AccountQrScreen = require('./account-qr') -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 AddSuggestedTokenScreen = require('./add-suggested-token') -const Import = require('./accounts/import') -const InfoScreen = require('./info') -const NewUiAnnouncement = require('./new-ui-annoucement') -const AppBar = require('./components/app-bar') -const Loading = require('./components/loading') -const BuyView = require('./components/buy-button-subview') -const HDCreateVaultComplete = require('./keychains/hd/create-vault-complete') -const HDRestoreVaultScreen = require('./keychains/hd/restore-vault') -const RevealSeedConfirmation = require('./keychains/hd/recover-seed/confirmation') -const ProviderApproval = require('./provider-approval') - -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, - providerRequests, - } = 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, - selectedAddress: state.metamask.selectedAddress, - 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, - nextUnreadNotice: state.metamask.nextUnreadNotice, - lostAccounts: state.metamask.lostAccounts, - frequentRpcListDetail: state.metamask.frequentRpcListDetail || [], - featureFlags, - providerRequests, - suggestedTokens: state.metamask.suggestedTokens, - - // state needed to get account dropdown temporarily rendering from app bar - identities, - selected, - keyrings, - } -} - -App.prototype.render = function () { - const { - currentView, - dispatch, - isLoading, - loadingMessage, - transForward, - network, - featureFlags, - } = this.props - const isLoadingNetwork = network === 'loading' && currentView.name !== 'config' - const loadMessage = loadingMessage || isLoadingNetwork - ? `Connecting to ${this.getNetworkName()}` - : null - log.debug('Main ui render function') - - if (!featureFlags.skipAnnounceBetaUI) { - return ( - h(NewUiAnnouncement, { - dispatch, - }) - ) - } - - return ( - h('.flex-column.full-height', { - style: { - // Windows was showing a vertical scroll bar: - overflow: 'hidden', - position: 'relative', - alignItems: 'center', - }, - }, [ - h(AppBar, { - ...this.props, - }), - this.renderLoadingIndicator({ isLoading, isLoadingNetwork, loadMessage }), - - // panel content - h('.app-primary' + (transForward ? '.from-right' : '.from-left'), { - style: { - width: '100%', - }, - }, [ - this.renderPrimary(), - ]), - ]) - ) -} -App.prototype.renderLoadingIndicator = function ({ isLoading, isLoadingNetwork, loadMessage }) { - const { isMascara } = this.props - - return isMascara - ? null - : h(Loading, { - isLoading: isLoading || isLoadingNetwork, - loadingMessage: loadMessage, - }) -} - -App.prototype.renderPrimary = function () { - log.debug('rendering primary') - var props = this.props - const {isMascara, isOnboarding, providerRequests} = props - - if (isMascara && isOnboarding) { - return h(FirstTime) - } - - // notices - if (!props.noActiveNotices) { - log.debug('rendering notice screen for unread notices.') - return h('div', { - style: { width: '100%' }, - }, [ - - h(NoticeScreen, { - notice: props.nextUnreadNotice, - key: 'NoticeScreen', - onConfirm: () => props.dispatch(actions.markNoticeRead(props.nextUnreadNotice)), - }), - ]) - } 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()), - }) - } - - // 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 seed words screen - if (props.seedWords) { - log.debug('rendering seed words') - return h(HDCreateVaultComplete, {key: 'HDCreateVaultComplete'}) - } - - if (providerRequests && providerRequests.length > 0) { - log.debug('rendering provider API approval screen') - return h(ProviderApproval, { origin: providerRequests[0].origin, tabID: providerRequests[0].tabID }) - } - - // 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 'add-suggested-token': - log.debug('rendering add-suggested-token screen from unlock screen.') - return h(AddSuggestedTokenScreen, {key: 'add-suggested-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 'qr': - log.debug('rendering show qr screen') - return h(AccountQrScreen, { - key: 'account-qr', - selectedAddress: props.selectedAddress, - }) - - 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.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 -} diff --git a/old-ui/app/components/account-dropdowns.js b/old-ui/app/components/account-dropdowns.js deleted file mode 100644 index 262de6601..000000000 --- a/old-ui/app/components/account-dropdowns.js +++ /dev/null @@ -1,321 +0,0 @@ -const Component = require('react').Component -const PropTypes = require('prop-types') -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 - const accountOrder = keyrings.reduce((list, keyring) => list.concat(keyring.accounts), []) - - return accountOrder.map((address, index) => { - const identity = identities[address] - 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', 'IMPORTED') : 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: (event) => { - 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: { - margin: '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 deleted file mode 100644 index 51b85b786..000000000 --- a/old-ui/app/components/account-export.js +++ /dev/null @@ -1,132 +0,0 @@ -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 deleted file mode 100644 index abaaf8163..000000000 --- a/old-ui/app/components/account-panel.js +++ /dev/null @@ -1,86 +0,0 @@ -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/app-bar.js b/old-ui/app/components/app-bar.js deleted file mode 100644 index c0da36615..000000000 --- a/old-ui/app/components/app-bar.js +++ /dev/null @@ -1,436 +0,0 @@ -const PropTypes = require('prop-types') -const {Component} = require('react') -const h = require('react-hyperscript') -const actions = require('../../../ui/app/actions') -const SandwichExpando = require('sandwich-expando') -const {Dropdown} = require('./dropdown') -const {DropdownMenuItem} = require('./dropdown') -const NetworkIndicator = require('./network') -const {AccountDropdowns} = require('./account-dropdowns') - -const LOCALHOST_RPC_URL = 'http://localhost:8545' - -module.exports = class AppBar extends Component { - static defaultProps = { - selectedAddress: undefined, - } - - static propTypes = { - dispatch: PropTypes.func.isRequired, - frequentRpcListDetail: PropTypes.array.isRequired, - isMascara: PropTypes.bool.isRequired, - isOnboarding: PropTypes.bool.isRequired, - identities: PropTypes.any.isRequired, - selectedAddress: PropTypes.string, - isUnlocked: PropTypes.bool.isRequired, - network: PropTypes.any.isRequired, - keyrings: PropTypes.any.isRequired, - provider: PropTypes.any.isRequired, - } - - static renderSpace () { - return ( - h('span', { - dangerouslySetInnerHTML: { - __html: ' ', - }, - }) - ) - } - - state = { - isNetworkMenuOpen: false, - } - - renderAppBar () { - if (window.METAMASK_UI_TYPE === 'notification') { - return null - } - - const props = this.props - 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('div.app-bar', [ - this.renderAppBarNewUiNotice(), - this.renderAppBarAppHeader(), - ]) - ) - } - - renderAppBarNewUiNotice () { - const {dispatch} = this.props - - return ( - h('div.app-bar__new-ui-banner', { - style: { - height: '28px', - zIndex: 12, - }, - }, [ - 'Try the New MetaMask', - AppBar.renderSpace(), - h('span.banner__link', { - async onClick () { - await dispatch(actions.setFeatureFlag('betaUI', true)) - global.platform.openExtensionInBrowser() - }, - }, [ - 'Now', - ]), - AppBar.renderSpace(), - 'or', - AppBar.renderSpace(), - h('span.banner__link', { - onClick () { - global.platform.openWindow({ - url: 'https://medium.com/metamask/74dba32cc7f7', - }) - }, - }, [ - 'Learn More', - ]), - ]) - ) - } - - renderAppBarAppHeader () { - const { - identities, - selectedAddress, - isUnlocked, - network, - keyrings, - provider, - } = this.props - const { - isNetworkMenuOpen, - isMainMenuOpen, - } = this.state - - return ( - h('.full-width', { - style: { - display: 'flex', - flexDirection: 'column', - height: '38px', - }, - }, [ - h('.app-header.flex-row.flex-space-between', { - style: { - alignItems: 'center', - visibility: isUnlocked ? 'visible' : 'none', - background: 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: network, - provider: provider, - onClick: (event) => { - event.preventDefault() - event.stopPropagation() - this.setState({ isNetworkMenuOpen: !isNetworkMenuOpen }) - }, - }), - ]), - isUnlocked && h('div', { - style: { - display: 'flex', - flexDirection: 'row', - alignItems: 'center', - }, - }, [ - h(AccountDropdowns, { - style: {}, - enableAccountsSelector: true, - identities: identities, - selected: selectedAddress, - network, - keyrings, - }, []), - h(SandwichExpando, { - className: 'sandwich-expando', - width: 16, - barHeight: 2, - padding: 0, - isOpen: isMainMenuOpen, - color: 'rgb(247,146,30)', - onClick: () => { - this.setState({ - isMainMenuOpen: !isMainMenuOpen, - }) - }, - }), - ]), - ]), - ]) - ) - } - - renderNetworkDropdown () { - const { - dispatch, - frequentRpcListDetail: rpcList, - provider, - } = this.props - const { - type: providerType, - rpcTarget: activeNetwork, - } = provider - const isOpen = this.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: '64px', - }, - innerStyle: { - padding: '2px 16px 2px 0px', - }, - }, [ - h(DropdownMenuItem, { - key: 'main', - closeMenu: () => this.setState({ isNetworkMenuOpen: !isOpen }), - onClick: () => 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: () => 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: () => 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: () => 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: () => dispatch(actions.setProviderType('localhost')), - style: { - fontSize: '18px', - }, - }, [ - h('i.fa.fa-question-circle.fa-lg.menu-icon'), - 'Localhost 8545', - activeNetwork === LOCALHOST_RPC_URL - ? h('.check', '✓') - : null, - ]), - - this.renderCustomOption(provider), - this.renderCommonRpc(rpcList, provider), - - h(DropdownMenuItem, { - closeMenu: () => this.setState({ isNetworkMenuOpen: !isOpen }), - onClick: () => dispatch(actions.showConfigPage()), - style: { - fontSize: '18px', - }, - }, [ - h('i.fa.fa-question-circle.fa-lg.menu-icon'), - 'Custom RPC', - activeNetwork === 'custom' - ? h('.check', '✓') - : null, - ]), - ]) - } - - renderCustomOption ({ rpcTarget, type, ticker }) { - const {dispatch, network} = 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 LOCALHOST_RPC_URL: - return null - default: - return h(DropdownMenuItem, { - key: rpcTarget, - onClick: () => dispatch(actions.setRpcTarget(rpcTarget, network, ticker)), - closeMenu: () => this.setState({ isNetworkMenuOpen: false }), - }, [ - h('i.fa.fa-question-circle.fa-lg.menu-icon'), - label, - h('.check', '✓'), - ]) - } - } - - renderCommonRpc (rpcList, provider) { - const {dispatch} = this.props - const reversedRpcList = rpcList.slice().reverse() - - return reversedRpcList.map((entry) => { - const rpc = entry.rpcUrl - const currentRpcTarget = provider.type === 'rpc' && rpc === provider.rpcTarget - - if ((rpc === LOCALHOST_RPC_URL) || currentRpcTarget) { - return null - } else { - return h(DropdownMenuItem, { - key: `common${rpc}`, - closeMenu: () => this.setState({ isNetworkMenuOpen: false }), - onClick: () => dispatch(actions.setRpcTarget(rpc, entry.chainId, entry.ticker)), - }, [ - h('i.fa.fa-question-circle.fa-lg.menu-icon'), - rpc, - currentRpcTarget - ? h('.check', '✓') - : null, - ]) - } - }) - } - - renderDropdown () { - const {dispatch} = this.props - const isOpen = this.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: '66px', - }, - innerStyle: {}, - }, [ - h(DropdownMenuItem, { - closeMenu: () => this.setState({ isMainMenuOpen: !isOpen }), - onClick: () => { dispatch(actions.showConfigPage()) }, - }, 'Settings'), - - h(DropdownMenuItem, { - closeMenu: () => this.setState({ isMainMenuOpen: !isOpen }), - onClick: () => { dispatch(actions.lockMetamask()) }, - }, 'Log Out'), - - h(DropdownMenuItem, { - closeMenu: () => this.setState({ isMainMenuOpen: !isOpen }), - onClick: () => { dispatch(actions.showInfoPage()) }, - }, 'Info/Help'), - - h(DropdownMenuItem, { - closeMenu: () => this.setState({ isMainMenuOpen: !isOpen }), - onClick: () => { - dispatch(actions.setFeatureFlag('betaUI', true, 'BETA_UI_NOTIFICATION_MODAL')) - }, - }, 'Try New UI!'), - ]) - } - - render () { - return h('div.full-width', [ - this.renderAppBar(), - this.renderNetworkDropdown(), - this.renderDropdown(), - ]) - } -} diff --git a/old-ui/app/components/balance.js b/old-ui/app/components/balance.js deleted file mode 100644 index 8995f961f..000000000 --- a/old-ui/app/components/balance.js +++ /dev/null @@ -1,96 +0,0 @@ -const Component = require('react').Component -const h = require('react-hyperscript') -const connect = require('react-redux').connect -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 = connect(mapStateToProps)(EthBalanceComponent) -function mapStateToProps (state) { - return { - ticker: state.metamask.ticker, - } -} - -inherits(EthBalanceComponent, Component) -function EthBalanceComponent () { - Component.call(this) -} - -EthBalanceComponent.prototype.render = function () { - var props = this.props - let { value } = props - const { ticker } = props - var style = props.style - var needsParse = this.props.needsParse !== undefined ? this.props.needsParse : true - value = value ? formatBalance(value, 6, needsParse, ticker) : '...' - 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 deleted file mode 100644 index 0b6a1f5c2..000000000 --- a/old-ui/app/components/binary-renderer.js +++ /dev/null @@ -1,46 +0,0 @@ -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 deleted file mode 100644 index 22e37602e..000000000 --- a/old-ui/app/components/bn-as-decimal-input.js +++ /dev/null @@ -1,181 +0,0 @@ -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 deleted file mode 100644 index 8bb73ae3e..000000000 --- a/old-ui/app/components/buy-button-subview.js +++ /dev/null @@ -1,261 +0,0 @@ -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 { getNetworkDisplayName } = require('../../../app/scripts/controllers/network/util') - -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 = getNetworkDisplayName(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 { - 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 deleted file mode 100644 index 1a1b77b50..000000000 --- a/old-ui/app/components/coinbase-form.js +++ /dev/null @@ -1,63 +0,0 @@ -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.goHome()), - }, '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 deleted file mode 100644 index a25d0719c..000000000 --- a/old-ui/app/components/copyButton.js +++ /dev/null @@ -1,59 +0,0 @@ -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 deleted file mode 100644 index a4f6f4bc6..000000000 --- a/old-ui/app/components/copyable.js +++ /dev/null @@ -1,46 +0,0 @@ -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 deleted file mode 100644 index a4c525396..000000000 --- a/old-ui/app/components/custom-radio-list.js +++ /dev/null @@ -1,60 +0,0 @@ -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 deleted file mode 100644 index fb606d2c5..000000000 --- a/old-ui/app/components/dropdown.js +++ /dev/null @@ -1,98 +0,0 @@ -const Component = require('react').Component -const PropTypes = require('prop-types') -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 deleted file mode 100644 index 8a5c8954f..000000000 --- a/old-ui/app/components/editable-label.js +++ /dev/null @@ -1,57 +0,0 @@ -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 deleted file mode 100644 index 9c46f77d7..000000000 --- a/old-ui/app/components/ens-input.js +++ /dev/null @@ -1,176 +0,0 @@ -const Component = require('react').Component -const h = require('react-hyperscript') -const inherits = require('util').inherits -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' -const log = require('loglevel') - - -module.exports = EnsInput - -inherits(EnsInput, Component) -function EnsInput () { - Component.call(this) -} - -EnsInput.prototype.render = function () { - const props = this.props - - function onInputChange () { - 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', { - name: props.name, - placeholder: props.placeholder, - list: 'addresses', - onChange: onInputChange.bind(this), - }), - // 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 deleted file mode 100644 index 4458e6a9a..000000000 --- a/old-ui/app/components/eth-balance.js +++ /dev/null @@ -1,95 +0,0 @@ -const Component = require('react').Component -const h = require('react-hyperscript') -const connect = require('react-redux').connect -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 = connect(mapStateToProps)(EthBalanceComponent) -function mapStateToProps (state) { - return { - ticker: state.metamask.ticker, - } -} - -inherits(EthBalanceComponent, Component) -function EthBalanceComponent () { - Component.call(this) -} - -EthBalanceComponent.prototype.render = function () { - var props = this.props - let { value } = props - const { ticker, style, width } = props - var needsParse = this.props.needsParse !== undefined ? this.props.needsParse : true - value = value ? formatBalance(value, 6, needsParse, ticker) : '...' - - 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 deleted file mode 100644 index d69f41d11..000000000 --- a/old-ui/app/components/fiat-value.js +++ /dev/null @@ -1,64 +0,0 @@ -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 deleted file mode 100644 index 4a71e9585..000000000 --- a/old-ui/app/components/hex-as-decimal-input.js +++ /dev/null @@ -1,154 +0,0 @@ -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 deleted file mode 100644 index bb476ca7b..000000000 --- a/old-ui/app/components/identicon.js +++ /dev/null @@ -1,74 +0,0 @@ -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 deleted file mode 100644 index 2a29361f9..000000000 --- a/old-ui/app/components/loading.js +++ /dev/null @@ -1,55 +0,0 @@ -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, canBypass, bypass } = 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)', - }, - }, [ - canBypass ? h('i.fa.fa-close.cursor-pointer.close-loading', { - style: { - position: 'absolute', - top: '1px', - right: '15px', - color: '#AEAEAE', - }, - onClick: bypass, - }) : null, - - 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 deleted file mode 100644 index 973ec2cad..000000000 --- a/old-ui/app/components/mascot.js +++ /dev/null @@ -1,59 +0,0 @@ -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 deleted file mode 100644 index e6276f3b1..000000000 --- a/old-ui/app/components/menu-droppo.js +++ /dev/null @@ -1,132 +0,0 @@ -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 deleted file mode 100644 index c09cf5b7a..000000000 --- a/old-ui/app/components/mini-account-panel.js +++ /dev/null @@ -1,74 +0,0 @@ -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 deleted file mode 100644 index 59596dabd..000000000 --- a/old-ui/app/components/network.js +++ /dev/null @@ -1,131 +0,0 @@ -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', { - className: props.onClick && 'pointer', - style: { - display: 'flex', - alignItems: 'center', - flexDirection: 'row', - }, - onClick: (event) => props.onClick && props.onClick(event), - }, [ - props.onClick && 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', { - className: props.onClick && 'pointer', - title: hoverText, - onClick: (event) => props.onClick && 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'), - props.onClick && 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'), - props.onClick && 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'), - props.onClick && 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'), - props.onClick && 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'), - props.onClick && h('i.fa.fa-caret-down.fa-lg'), - ]) - } - })(), - ]) - ) -} diff --git a/old-ui/app/components/notice.js b/old-ui/app/components/notice.js deleted file mode 100644 index 1ec254555..000000000 --- a/old-ui/app/components/notice.js +++ /dev/null @@ -1,145 +0,0 @@ -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.setInitialDisclaimerState = function () { - if (document.getElementsByClassName('notice-box')[0].clientHeight < 310) { - this.setState({disclaimerDisabled: false}) - } -} - -Notice.prototype.componentDidMount = function () { - // eslint-disable-next-line react/no-find-dom-node - var node = findDOMNode(this) - linker.setupListener(node) - this.setInitialDisclaimerState() -} - -Notice.prototype.componentDidUpdate = function (prevProps) { - const { notice: { id } = {} } = this.props - const { notice: { id: prevNoticeId } = {} } = prevProps - - if (id !== prevNoticeId) { - this.setInitialDisclaimerState() - } -} - -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 deleted file mode 100644 index 718a22de0..000000000 --- a/old-ui/app/components/pending-msg-details.js +++ /dev/null @@ -1,50 +0,0 @@ -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 deleted file mode 100644 index 834719c53..000000000 --- a/old-ui/app/components/pending-msg.js +++ /dev/null @@ -1,70 +0,0 @@ -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 deleted file mode 100644 index 1050513f2..000000000 --- a/old-ui/app/components/pending-personal-msg-details.js +++ /dev/null @@ -1,60 +0,0 @@ -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 deleted file mode 100644 index 4542adb28..000000000 --- a/old-ui/app/components/pending-personal-msg.js +++ /dev/null @@ -1,47 +0,0 @@ -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 deleted file mode 100644 index 35e81210e..000000000 --- a/old-ui/app/components/pending-tx.js +++ /dev/null @@ -1,519 +0,0 @@ -const Component = require('react').Component -const connect = require('react-redux').connect -const h = require('react-hyperscript') -const inherits = require('util').inherits -const actions = require('../../../ui/app/actions') -const clone = require('clone') -const log = require('loglevel') - -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') - -const MIN_GAS_PRICE_BN = new BN('0') -const MIN_GAS_LIMIT_BN = new BN('21000') - -module.exports = connect()(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 || {} - - // Allow retry txs - const { lastGasPrice } = txMeta - let forceGasMin - if (lastGasPrice) { - const stripped = ethUtil.stripHexPrefix(lastGasPrice) - const lastGas = new BN(stripped, 16) - const priceBump = lastGas.divn('10') - forceGasMin = lastGas.add(priceBump) - } - - // 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) - // default to 8MM gas limit - const gasLimit = new BN(parseInt(blockGasLimit) || '8000000') - const safeGasLimitBN = this.bnMultiplyByFraction(gasLimit, 99, 100) - const saferGasLimitBN = this.bnMultiplyByFraction(gasLimit, 98, 100) - 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: forceGasMin || 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 liable 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 }) - const validGasParams = this.verifyGasParams() - if (valid && validGasParams) { - 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 (value) { - // allow undefined values - if (value === undefined) return true - // Geth will return '0x', and ganache-core v2.2.1 will return '0x0' - const valueIsEmpty = !value || value === '0x' || value === '0x0' - return !valueIsEmpty -} - -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 deleted file mode 100644 index f95bf43a7..000000000 --- a/old-ui/app/components/pending-typed-msg-details.js +++ /dev/null @@ -1,60 +0,0 @@ -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, version } = 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, - version, - style: { - height: '215px', - }, - }), - ]), - - ]) - ) -} diff --git a/old-ui/app/components/pending-typed-msg.js b/old-ui/app/components/pending-typed-msg.js deleted file mode 100644 index f8926d0a3..000000000 --- a/old-ui/app/components/pending-typed-msg.js +++ /dev/null @@ -1,46 +0,0 @@ -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/range-slider.js b/old-ui/app/components/range-slider.js deleted file mode 100644 index bae740a74..000000000 --- a/old-ui/app/components/range-slider.js +++ /dev/null @@ -1,58 +0,0 @@ -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) : 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), - }) : 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 deleted file mode 100644 index 14de309ab..000000000 --- a/old-ui/app/components/shapeshift-form.js +++ /dev/null @@ -1,306 +0,0 @@ -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 isValidAddress = require('../util').isValidAddress -module.exports = connect(mapStateToProps)(ShapeshiftForm) - -function mapStateToProps (state) { - return { - warning: state.appState.warning, - isSubLoading: state.appState.isSubLoading, - } -} - -inherits(ShapeshiftForm, PersistentForm) - -function ShapeshiftForm () { - PersistentForm.call(this) - this.persistentFormParentId = 'shapeshift-buy-form' -} - -ShapeshiftForm.prototype.render = function () { - return 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 deleted file mode 100644 index 01b8d548f..000000000 --- a/old-ui/app/components/shift-list-item.js +++ /dev/null @@ -1,204 +0,0 @@ -const inherits = require('util').inherits -const Component = require('react').Component -const h = require('react-hyperscript') -const connect = require('react-redux').connect -const { DateTime } = require('luxon') -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 DateTime.fromMillis(date).toFormat('MMMM d y T') -} - -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 deleted file mode 100644 index bef444a48..000000000 --- a/old-ui/app/components/tab-bar.js +++ /dev/null @@ -1,37 +0,0 @@ -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 deleted file mode 100644 index b6ed8eaa0..000000000 --- a/old-ui/app/components/template.js +++ /dev/null @@ -1,18 +0,0 @@ -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 deleted file mode 100644 index 19d7139bb..000000000 --- a/old-ui/app/components/token-cell.js +++ /dev/null @@ -1,72 +0,0 @@ -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 deleted file mode 100644 index e20594b61..000000000 --- a/old-ui/app/components/token-list.js +++ /dev/null @@ -1,205 +0,0 @@ -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') -const log = require('loglevel') - -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) { - this.setState({ tokens, 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 deleted file mode 100644 index efab2c497..000000000 --- a/old-ui/app/components/tooltip.js +++ /dev/null @@ -1,22 +0,0 @@ -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 deleted file mode 100644 index f442b05af..000000000 --- a/old-ui/app/components/transaction-list-item-icon.js +++ /dev/null @@ -1,68 +0,0 @@ -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 deleted file mode 100644 index 8d0e77f53..000000000 --- a/old-ui/app/components/transaction-list-item.js +++ /dev/null @@ -1,258 +0,0 @@ -const Component = require('react').Component -const h = require('react-hyperscript') -const inherits = require('util').inherits -const connect = require('react-redux').connect - -const EthBalance = require('./eth-balance') -const addressSummary = require('../util').addressSummary -const explorerLink = require('etherscan-link').createExplorerLink -const CopyButton = require('./copyButton') -const { DateTime } = require('luxon') -const Tooltip = require('./tooltip') -const numberToBN = require('number-to-bn') -const actions = require('../../../ui/app/actions') - -const TransactionIcon = require('./transaction-list-item-icon') -const ShiftListItem = require('./shift-list-item') - -const mapDispatchToProps = dispatch => { - return { - retryTransaction: transactionId => dispatch(actions.retryTransaction(transactionId)), - } -} - -module.exports = connect(null, mapDispatchToProps)(TransactionListItem) - -inherits(TransactionListItem, Component) -function TransactionListItem () { - Component.call(this) -} - -TransactionListItem.prototype.showRetryButton = function () { - const { transaction = {}, transactions } = this.props - const { submittedTime, txParams } = transaction - - if (!txParams) { - return false - } - - let currentTxSharesEarliestNonce = false - const currentNonce = txParams.nonce - const currentNonceTxs = transactions.filter(tx => tx.txParams.nonce === currentNonce) - const currentNonceSubmittedTxs = currentNonceTxs.filter(tx => tx.status === 'submitted') - const currentSubmittedTxs = transactions.filter(tx => tx.status === 'submitted') - const lastSubmittedTxWithCurrentNonce = currentNonceSubmittedTxs[0] - const currentTxIsLatestWithNonce = lastSubmittedTxWithCurrentNonce && - lastSubmittedTxWithCurrentNonce.id === transaction.id - if (currentSubmittedTxs.length > 0) { - const earliestSubmitted = currentSubmittedTxs.reduce((tx1, tx2) => { - if (tx1.submittedTime < tx2.submittedTime) return tx1 - return tx2 - }) - currentTxSharesEarliestNonce = currentNonce === earliestSubmitted.txParams.nonce - } - - return currentTxSharesEarliestNonce && currentTxIsLatestWithNonce && Date.now() - submittedTime > 30000 -} - -TransactionListItem.prototype.render = function () { - const { transaction, network, conversionRate, currentCurrency } = this.props - const { status } = transaction - 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 = 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-column', { - 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', - alignItems: 'center', - }, - }, [ - h(`.flex-row.flex-space-between${isClickable ? '.pointer' : ''}`, { - style: { - width: '100%', - }, - }, [ - 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'), - ]), - - this.showRetryButton() && h('.transition-list-item__retry.grow-on-hover', { - onClick: event => { - event.stopPropagation() - this.resubmit() - }, - style: { - height: '22px', - borderRadius: '22px', - color: '#F9881B', - padding: '0 20px', - backgroundColor: '#FFE3C9', - display: 'flex', - justifyContent: 'center', - alignItems: 'center', - fontSize: '8px', - cursor: 'pointer', - }, - }, [ - h('div', { - style: { - paddingRight: '2px', - }, - }, 'Taking too long?'), - h('div', { - style: { - textDecoration: 'underline', - }, - }, 'Retry with a higher gas price here'), - ]), - ]) - ) -} - -TransactionListItem.prototype.resubmit = function () { - const { transaction } = this.props - this.props.retryTransaction(transaction.id) -} - -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 Deployment' - } - - return h('div', { - style: { - fontSize: 'x-small', - color: '#ABA9AA', - }, - }, [ - message, - renderErrorOrWarning(transaction), - ]) -} - -function formatDate (date) { - return DateTime.fromMillis(date).toFormat('MMMM d y T') -} - -function renderErrorOrWarning (transaction) { - const { status, err, warning } = transaction - - // show dropped - if (status === 'dropped') { - return h('span.dropped', ' (Dropped)') - } - - // 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 deleted file mode 100644 index c77852921..000000000 --- a/old-ui/app/components/transaction-list.js +++ /dev/null @@ -1,87 +0,0 @@ -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 25px 0 15px', - 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, transactions, - 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 deleted file mode 100644 index 0dc673b8a..000000000 --- a/old-ui/app/components/typed-message-renderer.js +++ /dev/null @@ -1,69 +0,0 @@ -const Component = require('react').Component -const h = require('react-hyperscript') -const inherits = require('util').inherits -const extend = require('xtend') -const { ObjectInspector } = require('react-inspector') - -module.exports = TypedMessageRenderer - -inherits(TypedMessageRenderer, Component) -function TypedMessageRenderer () { - Component.call(this) -} - -TypedMessageRenderer.prototype.render = function () { - const props = this.props - const { value, version, style } = props - let text - switch (version) { - case 'V1': - text = renderTypedData(value) - break - case 'V3': - text = renderTypedDataV3(value) - break - } - - 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) { - let v = value.value - if (typeof v === 'boolean') { - v = v.toString() - } - return h('div', {}, [ - h('strong', {style: {display: 'block', fontWeight: 'bold'}}, String(value.name) + ':'), - h('div', {}, v), - ]) - }) -} - -function renderTypedDataV3 (values) { - const { domain, message } = JSON.parse(values) - return [ - domain ? h('div', [ - h('h1', 'Domain'), - h(ObjectInspector, { data: domain, expandLevel: 1, name: 'domain' }), - ]) : '', - message ? h('div', [ - h('h1', 'Message'), - h(ObjectInspector, { data: message, expandLevel: 1, name: 'message' }), - ]) : '', - ] -} diff --git a/old-ui/app/conf-tx.js b/old-ui/app/conf-tx.js deleted file mode 100644 index dc1dc0538..000000000 --- a/old-ui/app/conf-tx.js +++ /dev/null @@ -1,247 +0,0 @@ -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 LoadingIndicator = require('./components/loading') -const txHelper = require('../lib/tx-helper') -const log = require('loglevel') -const { ENVIRONMENT_TYPE_NOTIFICATION } = require('../../app/scripts/lib/enums') -const { getEnvironmentType } = require('../../app/scripts/lib/util') - -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 = getEnvironmentType(window.location.href) === ENVIRONMENT_TYPE_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', [ - - h(LoadingIndicator, { - isLoading: this.state ? !this.state.bypassLoadingScreen : txData.loadingDefaults, - loadingMessage: 'Estimating transaction cost…', - canBypass: true, - bypass: () => { - this.setState({bypassLoadingScreen: true}) - }, - }), - - // 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 deleted file mode 100644 index da71809c4..000000000 --- a/old-ui/app/config.js +++ /dev/null @@ -1,383 +0,0 @@ -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', { - style: { - maxHeight: '585px', - overflowY: 'auto', - }, - }, [ - - h(Modal, {}, []), - - // subtitle and nav - h('.section-title.flex-row.flex-center', [ - h('i.fa.fa-arrow-left.fa-lg.cursor-pointer', { - onClick: () => { - 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', - overflow: 'auto', - }, - }, [ - - currentProviderDisplay(metamaskState), - - h('div', { style: {display: 'block'} }, [ - 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 - var chainid = document.querySelector('input#chainid') - var ticker = document.querySelector('input#ticker') - var nickname = document.querySelector('input#nickname') - rpcValidation(newRpc, chainid.value, ticker.value, nickname.value, state) - } - }, - }), - h('br'), - h('input#chainid', { - placeholder: 'ChainId (optional)', - style: { - width: 'inherit', - flex: '1 0 auto', - height: '30px', - margin: '8px', - }, - onKeyPress (event) { - if (event.key === 'Enter') { - var element = document.querySelector('input#new_rpc') - var newRpc = element.value - var chainid = document.querySelector('input#chainid') - var ticker = document.querySelector('input#ticker') - var nickname = document.querySelector('input#nickname') - rpcValidation(newRpc, chainid.value, ticker.value, nickname.value, state) - } - }, - }), - h('br'), - h('input#ticker', { - placeholder: 'Symbol (optional)', - style: { - width: 'inherit', - flex: '1 0 auto', - height: '30px', - margin: '8px', - }, - onKeyPress (event) { - if (event.key === 'Enter') { - var element = document.querySelector('input#new_rpc') - var newRpc = element.value - var chainid = document.querySelector('input#chainid') - var ticker = document.querySelector('input#ticker') - var nickname = document.querySelector('input#nickname') - rpcValidation(newRpc, chainid.value, ticker.value, nickname.value, state) - } - }, - }), - h('br'), - h('input#nickname', { - placeholder: 'Nickname (optional)', - style: { - width: 'inherit', - flex: '1 0 auto', - height: '30px', - margin: '8px', - }, - onKeyPress (event) { - if (event.key === 'Enter') { - var element = document.querySelector('input#new_rpc') - var newRpc = element.value - var chainid = document.querySelector('input#chainid') - var ticker = document.querySelector('input#ticker') - var nickname = document.querySelector('input#nickname') - rpcValidation(newRpc, chainid.value, ticker.value, nickname.value, state) - } - }, - }), - h('button', { - style: { - alignSelf: 'center', - }, - onClick (event) { - event.preventDefault() - var element = document.querySelector('input#new_rpc') - var newRpc = element.value - var chainid = document.querySelector('input#chainid') - var ticker = document.querySelector('input#ticker') - var nickname = document.querySelector('input#nickname') - rpcValidation(newRpc, chainid.value, ticker.value, nickname.value, 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.json', result) - } - }) - }, - }, 'Download State Logs'), - ]), - - h('hr.horizontal-line'), - - h('div', { - style: { - marginTop: '20px', - }, - }, [ - h('p', { - style: { - fontFamily: 'Montserrat Light', - fontSize: '13px', - }, - }, 'Clear privacy data so all websites must request access to view account information again.'), - h('br'), - h('button', { - style: { - alignSelf: 'center', - }, - onClick (event) { - event.preventDefault() - state.dispatch(actions.clearApprovedOrigins()) - }, - }, 'Clear privacy data'), - ]), - - h('hr.horizontal-line'), - - h('div', { - style: { - marginTop: '20px', - }, - }, [ - h('p', { - style: { - fontFamily: 'Montserrat Light', - fontSize: '13px', - }, - }, metamaskState.featureFlags.privacyMode ? - 'Websites will be able to view your account information.' : - 'Websites must request access to view your account information.' - ), - h('br'), - h('button', { - style: { - alignSelf: 'center', - }, - onClick (event) { - event.preventDefault() - state.dispatch(actions.setFeatureFlag('privacyMode', !metamaskState.featureFlags.privacyMode)) - }, - }, metamaskState.featureFlags.privacyMode ? - 'Disable privacy mode' : - 'Enable privacy mode' - ), - ]), - - 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'), - ]), - - h('hr.horizontal-line'), - - h('div', { - style: { - marginTop: '20px', - }, - }, [ - - h('p', { - style: { - fontFamily: 'Montserrat Light', - fontSize: '13px', - }, - }, [ - 'Resetting is for developer use only. ', - h('a', { - href: 'https://metamask.zendesk.com/hc/en-us/articles/360015489231-Resetting-an-Account-Old-UI-', - target: '_blank', - }, 'Read more.'), - ]), - h('br'), - - h('button', { - style: { - alignSelf: 'center', - }, - onClick (event) { - event.preventDefault() - state.dispatch(actions.resetAccount()) - }, - }, 'Reset Account'), - ]), - - ]), - ]), - ]) - ) -} - -function rpcValidation (newRpc, chainid, ticker = 'ETH', nickname = '', state) { - if (validUrl.isWebUri(newRpc)) { - state.dispatch(actions.setRpcTarget(newRpc, chainid, ticker, nickname)) - } 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 deleted file mode 100644 index 3e125bcd4..000000000 --- a/old-ui/app/css/debug.css +++ /dev/null @@ -1,21 +0,0 @@ -/* -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 deleted file mode 100644 index b1d701ee5..000000000 --- a/old-ui/app/css/fonts.css +++ /dev/null @@ -1,372 +0,0 @@ -/* cyrillic-ext */ -@import url('/fonts/Font_Awesome/font-awesome.min.css'); - -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('fonts/Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('fonts/Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('fonts/Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('fonts/Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('fonts/Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('fonts/Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('fonts/Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('fonts/Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('fonts/Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('fonts/Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('fonts/Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('fonts/Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('fonts/Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('fonts/Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('fonts/Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('fonts/Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('fonts/Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('fonts/Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('fonts/Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('fonts/Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('fonts/Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('fonts/Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('fonts/Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('fonts/Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('fonts/Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('fonts/Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('fonts/Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('fonts/Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('fonts/Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('fonts/Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('fonts/Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('fonts/Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('fonts/Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('fonts/Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('fonts/Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} -/* cyrillic-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('fonts/Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; -} -/* cyrillic */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('fonts/Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; -} -/* greek-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('fonts/Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+1F00-1FFF; -} -/* greek */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('fonts/Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+0370-03FF; -} -/* vietnamese */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('fonts/Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; -} -/* latin-ext */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('fonts/Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; -} -/* latin */ -@font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('fonts/Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; -} - -@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 deleted file mode 100644 index d209b4754..000000000 --- a/old-ui/app/css/index.css +++ /dev/null @@ -1,939 +0,0 @@ -/* -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; - height: 100%; -} - -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; - 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); -} - -.grow-on-hover:hover { - transform: scale(1.05); -} - -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; -} - -.dropped { - color: #6195ED; -} - -.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: 80px; -} - -.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-x: hidden; - overflow-y: auto; - max-height: 585px; - flex-direction: inherit; -} - -.account-detail-section .name-label { - margin-left: 15px; -} - -.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); -} - -.new-ui-announcement { - display: flex; - flex-direction: column; - height: 100%; - background: white; - color: #4D4D4D; - font-family: Roboto, Arial, sans-serif; - padding: 1.5rem; -} - -.new-ui-announcement__announcement-header { - display: flex; - flex-direction: row; - justify-content: space-between; - padding-bottom: 1rem; -} - -.new-ui-announcement__announcement-header a.close { - cursor: pointer; - font-size: 32px; - line-height: 17px; -} - -.new-ui-announcement__announcement-header a.close:hover { - color: inherit; -} - -.new-ui-announcement__announcement-header h1 { - color: #33A4E7; - text-transform: uppercase; - font-size: 18px; - font-weight: 400; -} - -.new-ui-announcement__body { - display: flex; - flex: 1; - flex-direction: column; - font-size: 10.5pt; - font-weight: 300; -} - -.new-ui-announcement__body h1 { - font-size: 22px; - font-weight: 600; - padding-bottom: 1rem; -} - -.new-ui-announcement__body a { - color: #33A4E7; -} - -.new-ui-announcement__body .updates-list { - padding: .5rem 1rem; -} - -.new-ui-announcement__body .updates-list h2 { - font-weight: 600; -} - -.new-ui-announcement__body .updates-list ul { - list-style: disc inside; -} - -.new-ui-announcement__footer { - display: flex; - flex-direction: column; - align-items: center; -} - -.new-ui-announcement__footer h1 { - font-family: inherit; - font-weight: 600; -} - -.new-ui-announcement__footer button:hover { - transform: none; -} - -.new-ui-announcement__footer button.positive { - padding: 1rem; - margin: 1rem; - background: #33A4E7; - color: white; - text-transform: uppercase; - box-shadow: none; - border-radius: 5px; - font-family: inherit; - font-size: 13px; - font-weight: 400; - width: 90%; -} - -.new-ui-announcement__footer button.negative { - margin: 0; - padding: 0; - background: white; - color: #33A4E7; - font-family: inherit; - font-size: 13px; - font-weight: 400; - box-shadow: none; -} - -.app-bar { - width: 100%; - display: flex; - flex-direction: column; -} - -.app-bar__new-ui-banner { - background: #33A4E7; - color: white; - font-size: 12px; - line-height: 12px; - padding: 8px; - font-family: Roboto, Arial, sans-serif; - font-weight: 400; - width: 100%; -} - -.banner__link { - cursor: pointer; - text-decoration: underline; -} - -.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; -} - -.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; - width: 100%; - display: flex; - justify-content: center; - font-size: 17px; - color: #1b344d; -} - -.notification-modal__buttons { - display: flex; - justify-content: space-evenly; - width: 100%; - margin-bottom: 24px; - padding: 0px 42px; -} - -.notification-modal__buttons__btn { - cursor: pointer; -} - -.notification-modal__link { - color: #2f9ae0; -} diff --git a/old-ui/app/css/lib.css b/old-ui/app/css/lib.css deleted file mode 100644 index fd63b2b2e..000000000 --- a/old-ui/app/css/lib.css +++ /dev/null @@ -1,306 +0,0 @@ -/* 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: -18px; - 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 deleted file mode 100644 index bed689ecb..000000000 --- a/old-ui/app/css/output/index.css +++ /dev/null @@ -1,5722 +0,0 @@ -@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('/fonts/Font_Awesome/font-awesome.min.css'); - - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('fonts/Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; - } - /* cyrillic */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('fonts/Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; - } - /* greek-ext */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('fonts/Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+1F00-1FFF; - } - /* greek */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('fonts/Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+0370-03FF; - } - /* vietnamese */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('fonts/Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; - } - /* latin-ext */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('fonts/Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; - } - /* latin */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 100; - src: local('Roboto Thin'), local('Roboto-Thin'), url('fonts/Roboto/Roboto-Thin.ttf') format('truetype'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; - } - /* cyrillic-ext */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('fonts/Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; - } - /* cyrillic */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('fonts/Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; - } - /* greek-ext */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('fonts/Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+1F00-1FFF; - } - /* greek */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('fonts/Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+0370-03FF; - } - /* vietnamese */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('fonts/Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; - } - /* latin-ext */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('fonts/Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; - } - /* latin */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 300; - src: local('Roboto Light'), local('Roboto-Light'), url('fonts/Roboto/Roboto-Light.ttf') format('truetype'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; - } - /* cyrillic-ext */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('fonts/Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; - } - /* cyrillic */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('fonts/Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; - } - /* greek-ext */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('fonts/Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+1F00-1FFF; - } - /* greek */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('fonts/Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+0370-03FF; - } - /* vietnamese */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('fonts/Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; - } - /* latin-ext */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('fonts/Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; - } - /* latin */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 400; - src: local('Roboto'), local('Roboto-Regular'), url('fonts/Roboto/Roboto-Regular.ttf') format('truetype'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; - } - /* cyrillic-ext */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('fonts/Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; - } - /* cyrillic */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('fonts/Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; - } - /* greek-ext */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('fonts/Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+1F00-1FFF; - } - /* greek */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('fonts/Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+0370-03FF; - } - /* vietnamese */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('fonts/Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; - } - /* latin-ext */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('fonts/Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; - } - /* latin */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 500; - src: local('Roboto Medium'), local('Roboto-Medium'), url('fonts/Roboto/Roboto-Medium.ttf') format('truetype'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; - } - /* cyrillic-ext */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('fonts/Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; - } - /* cyrillic */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('fonts/Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; - } - /* greek-ext */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('fonts/Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+1F00-1FFF; - } - /* greek */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('fonts/Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+0370-03FF; - } - /* vietnamese */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('fonts/Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; - } - /* latin-ext */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('fonts/Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; - } - /* latin */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 700; - src: local('Roboto Bold'), local('Roboto-Bold'), url('fonts/Roboto/Roboto-Bold.ttf') format('truetype'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; - } - /* cyrillic-ext */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('fonts/Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; - } - /* cyrillic */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('fonts/Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116; - } - /* greek-ext */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('fonts/Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+1F00-1FFF; - } - /* greek */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('fonts/Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+0370-03FF; - } - /* vietnamese */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('fonts/Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+0102-0103, U+0110-0111, U+1EA0-1EF9, U+20AB; - } - /* latin-ext */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('fonts/Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; - } - /* latin */ - @font-face { - font-family: 'Roboto'; - font-style: normal; - font-weight: 900; - src: local('Roboto Black'), local('Roboto-Black'), url('fonts/Roboto/Roboto-Black.ttf') format('truetype'); - unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; - } - -@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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QUc7QUFDSCxBQUFBLElBQUk7QUFDSixBQUFBLE1BQU07QUFDTixBQUFBLE1BQU07QUFDTixBQUFBLE1BQU07QUFDTixBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUU7QUFDRixBQUFBLENBQUM7QUFDRCxBQUFBLFVBQVU7QUFDVixBQUFBLEdBQUc7QUFDSCxBQUFBLENBQUM7QUFDRCxBQUFBLElBQUk7QUFDSixBQUFBLE9BQU87QUFDUCxBQUFBLE9BQU87QUFDUCxBQUFBLEdBQUc7QUFDSCxBQUFBLElBQUk7QUFDSixBQUFBLElBQUk7QUFDSixBQUFBLEdBQUc7QUFDSCxBQUFBLEdBQUc7QUFDSCxBQUFBLEVBQUU7QUFDRixBQUFBLEdBQUc7QUFDSCxBQUFBLEdBQUc7QUFDSCxBQUFBLEdBQUc7QUFDSCxBQUFBLENBQUM7QUFDRCxBQUFBLENBQUM7QUFDRCxBQUFBLElBQUk7QUFDSixBQUFBLEtBQUs7QUFDTCxBQUFBLE1BQU07QUFDTixBQUFBLE1BQU07QUFDTixBQUFBLEdBQUc7QUFDSCxBQUFBLEdBQUc7QUFDSCxBQUFBLEVBQUU7QUFDRixBQUFBLEdBQUc7QUFDSCxBQUFBLENBQUM7QUFDRCxBQUFBLENBQUM7QUFDRCxBQUFBLENBQUM7QUFDRCxBQUFBLE1BQU07QUFDTixBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUU7QUFDRixBQUFBLFFBQVE7QUFDUixBQUFBLElBQUk7QUFDSixBQUFBLEtBQUs7QUFDTCxBQUFBLE1BQU07QUFDTixBQUFBLEtBQUs7QUFDTCxBQUFBLE9BQU87QUFDUCxBQUFBLEtBQUs7QUFDTCxBQUFBLEtBQUs7QUFDTCxBQUFBLEtBQUs7QUFDTCxBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUU7QUFDRixBQUFBLE9BQU87QUFDUCxBQUFBLEtBQUs7QUFDTCxBQUFBLE1BQU07QUFDTixBQUFBLE9BQU87QUFDUCxBQUFBLEtBQUs7QUFDTCxBQUFBLE1BQU07QUFDTixBQUFBLFVBQVU7QUFDVixBQUFBLE1BQU07QUFDTixBQUFBLE1BQU07QUFDTixBQUFBLE1BQU07QUFDTixBQUFBLElBQUk7QUFDSixBQUFBLEdBQUc7QUFDSCxBQUFBLE1BQU07QUFDTixBQUFBLElBQUk7QUFDSixBQUFBLE9BQU87QUFDUCxBQUFBLE9BQU87QUFDUCxBQUFBLElBQUk7QUFDSixBQUFBLElBQUk7QUFDSixBQUFBLEtBQUs7QUFDTCxBQUFBLEtBQUssQ0FBQztFQUNKLE1BQU0sRUFBRSxDQUFDO0VBQ1QsT0FBTyxFQUFFLENBQUM7RUFDVixNQUFNLEVBQUUsQ0FBQztFQUNULFNBQVMsRUFBRSxJQUFJO0VBQ2YsdUJBQXVCO0VBQ3ZCLElBQUksRUFBRSxPQUFPO0VBQ2Isc0JBQXNCO0VBQ3RCLGNBQWMsRUFBRSxRQUFRLEdBQ3pCOztBQUVELGlEQUFpRDtBQUVqRCx1QkFBdUI7QUFFdkIsQUFBQSxPQUFPO0FBQ1AsQUFBQSxLQUFLO0FBQ0wsQUFBQSxPQUFPO0FBQ1AsQUFBQSxVQUFVO0FBQ1YsQUFBQSxNQUFNO0FBQ04sQUFBQSxNQUFNO0FBQ04sQUFBQSxNQUFNO0FBQ04sQUFBQSxNQUFNO0FBQ04sQUFBQSxJQUFJO0FBQ0osQUFBQSxHQUFHO0FBQ0gsQUFBQSxPQUFPLENBQUM7RUFDTixPQUFPLEVBQUUsS0FBSyxHQUNmOztBQUVELEFBQUEsSUFBSSxDQUFDO0VBQ0gsV0FBVyxFQUFFLENBQUMsR0FDZjs7QUFFRCxBQUFBLEVBQUU7QUFDRixBQUFBLEVBQUUsQ0FBQztFQUNELFVBQVUsRUFBRSxJQUFJLEdBQ2pCOztBQUVELEFBQUEsVUFBVTtBQUNWLEFBQUEsQ0FBQyxDQUFDO0VBQ0EsTUFBTSxFQUFFLElBQUksR0FDYjs7QUFFRCxBQUFBLFVBQVUsQUFBQSxPQUFPO0FBQ2pCLEFBQUEsVUFBVSxBQUFBLE1BQU07QUFDaEIsQUFBQSxDQUFDLEFBQUEsT0FBTztBQUNSLEFBQUEsQ0FBQyxBQUFBLE1BQU0sQ0FBQztFQUNOLE9BQU8sRUFBRSxFQUFFO0VBQ1gsT0FBTyxFQUFFLElBQUksR0FDZDs7QUFFRCxBQUFBLEtBQUssQ0FBQztFQUNKLGVBQWUsRUFBRSxRQUFRO0VBQ3pCLGNBQWMsRUFBRSxDQUFDLEdBQ2xCOztBQUVELEFBQUEsTUFBTSxDQUFDO0VBQ0wsWUFBWSxFQUFFLElBQUk7RUFDbEIsTUFBTSxFQUFFLE9BQU8sR0FDaEI7O0FBRUQsc0JBQXNCO0FENUl0QixBQUFBLENBQUMsQ0FBQztFQUNBLFVBQVUsRUFBRSxVQUFVLEdBQ3ZCOztBQUVELEFBQUEsSUFBSTtBQUNKLEFBQUEsSUFBSSxDQUFDO0VBQ0gsV0FBVyxFQUFFLGFBQWE7RUFDMUIsS0FBSyxFQUFFLE9BQU87RUFDZCxXQUFXLEVBQUUsR0FBRztFQUNoQixXQUFXLEVBQUUsS0FBSztFQUNsQixVQUFVLEVBQUUsT0FBTztFQUNuQixLQUFLLEVBQUUsSUFBSTtFQUNYLE1BQU0sRUFBRSxJQUFJO0VBQ1osTUFBTSxFQUFFLENBQUM7RUFDVCxPQUFPLEVBQUUsQ0FBQyxHQUNYOztBQUVELEFBQUEsSUFBSSxDQUFDO0VBQ0gsVUFBVSxFQUFFLEtBQUssR0FDbEI7O0FBRUQsQUFBQSxTQUFTLENBQUM7RUFDUixRQUFRLEVBQUUsTUFBTTtFQUNoQixRQUFRLEVBQUUsUUFBUSxHQUNuQjs7QUFFRCxBQUFBLFlBQVksQ0FBQztFQUNYLE9BQU8sRUFBRSxJQUFJLEdBQ2Q7O0FBRUQsQUFBQSxLQUFLLEFBQUEsTUFBTTtBQUNYLEFBQUEsUUFBUSxBQUFBLE1BQU0sQ0FBQztFQUNiLE9BQU8sRUFBRSxJQUFJLEdBQ2Q7O0FBRUQsdUJBQXVCO0FBQ3ZCLEFBQUEsWUFBWSxDQUFDO0VBQ1gsVUFBVSxFQUFFLE1BQU07RUFDbEIsTUFBTSxFQUFFLElBQUk7RUFDWixPQUFPLEVBQUUsSUFBSTtFQUNiLGNBQWMsRUFBRSxNQUFNLEdBS3ZCO0VBSEMsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztJQU5yQyxBQUFBLFlBQVksQ0FBQztNQU9ULGdCQUFnQixFSjFCWixJQUFJLEdJNEJYOztBQUNELHNCQUFzQjtBQUV0QixBQUFBLENBQUMsQ0FBQztFQUNBLGVBQWUsRUFBRSxJQUFJO0VBQ3JCLEtBQUssRUFBRSxPQUFPLEdBQ2Y7O0FBRUQsQUFBQSxDQUFDLEFBQUEsTUFBTSxDQUFDO0VBQ04sS0FBSyxFQUFFLE9BQU8sR0FDZjs7QUFFRCxBQUFBLEtBQUssQUFBQSxZQUFZO0FBQ2pCLEFBQUEsUUFBUSxBQUFBLFlBQVksQ0FBQztFQUNuQixPQUFPLEVBQUUsR0FBRyxHQUNiOztBQUVELEFBQUEsS0FBSyxBQUFBLFlBQVksQ0FBQztFQUNoQixNQUFNLEVBQUUsSUFBSSxHQUNiOztBS3RFRDs7R0FFRztBQUVILEFBQUEsVUFBVSxDQUFDO0VBQ1QsZ0JBQWdCLEVBQUUsT0FBTyxHQUMxQjs7QUFFRCxBQUFBLE1BQU0sQUFBQSxVQUFVLENBQUM7RUFDZixVQUFVLEVUY0osSUFBSTtFU2JWLE1BQU0sRUFBRSxTQUFTLEdBQ2xCOztBQWtCRCxBQUFBLE1BQU0sQ0FBQSxBQUFBLFFBQUMsQUFBQTtBQUNQLEFBQUEsS0FBSyxDQUFBLEFBQUEsSUFBQyxDQUFLLFFBQVEsQUFBYixFQUFjLEFBQUEsUUFBQyxBQUFBLEVBQVU7RUFDN0IsTUFBTSxFQUFFLFdBQVc7RUFDbkIsT0FBTyxFQUFFLEVBQUUsR0FHWjs7QUFhRCxBQUFBLE1BQU0sQUFBQSxRQUFRLENBQUM7RUFDYixPQUFPLEVBQUUsUUFBUTtFQUNqQixVQUFVLEVBQUUsT0FBTztFQUNuQixVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsd0JBQXVCO0VBQzdDLEtBQUssRVQ3QkMsSUFBSTtFUzhCVixTQUFTLEVBQUUsS0FBSztFQUNoQixXQUFXLEVBQUUsTUFBTTtFQUNuQixjQUFjLEVBQUUsU0FBUyxHQUMxQjs7QUFFRCxBQUFBLFVBQVUsQ0FBQztFQUNULE9BQU8sRUFBRSxRQUFRO0VBRWpCLFVBQVUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyx3QkFBdUI7RUFDN0MsS0FBSyxFQUFFLE9BQU87RUFDZCxTQUFTLEVBQUUsS0FBSztFQUNoQixXQUFXLEVBQUUsTUFBTTtFQUNuQixjQUFjLEVBQUUsU0FBUztFQUN6QixVQUFVLEVBQUUsTUFBTTtFQUNsQixXQUFXLEVBQUUsSUFBSTtFQUNqQixhQUFhLEVBQUUsR0FBRztFQUNsQixNQUFNLEVBQUUsaUJBQWlCO0VBQ3pCLE9BQU8sRUFBRSxFQUFFLEdBQ1o7O0FBR0QsQUFBQSxNQUFNLEFBQUEsU0FBUyxDQUFDO0VBQ2QsTUFBTSxFQUFFLFNBQVM7RUFDakIsWUFBWSxFQUFFLE9BQU87RUFDckIsS0FBSyxFQUFFLE9BQU87RUFDZCxVQUFVLEVBQUUsT0FBaUI7RUFDN0IsYUFBYSxFQUFFLEdBQUc7RUFDbEIsU0FBUyxFQUFFLEtBQUs7RUFDaEIsTUFBTSxFQUFFLE1BQU07RUFDZCxPQUFPLEVBQUUsR0FBRztFQUNaLFNBQVMsRUFBRSxJQUFJLEdBQ2hCOztBQUVELEFBQUEsY0FBYyxDQUFDO0VBQ2IsTUFBTSxFQUFFLGlCQUFpQjtFQUN6QixhQUFhLEVBQUUsR0FBRztFQUNsQixnQkFBZ0IsRVRsRVYsSUFBSTtFU21FVixTQUFTLEVBQUUsSUFBSTtFQUNmLFdBQVcsRUFBRSxJQUFJO0VBQ2pCLE9BQU8sRUFBRSxTQUFTLEdBTW5CO0VBWkQsQUFRRSxjQVJZLENBUVosQUFBQSxRQUFFLEFBQUEsRUFBVTtJQUNWLGdCQUFnQixFVHhFWixJQUFJLENTd0VpQixVQUFVO0lBQ25DLE9BQU8sRUFBRSxFQUFFLEdBQ1o7O0FBR0gsQUFBQSxhQUFhLENBQUM7RUFDWixNQUFNLEVBQUUscUJBQXFCO0VBQzdCLGFBQWEsRUFBRSxHQUFHO0VBQ2xCLGdCQUFnQixFQUFFLFdBQVc7RUFDN0IsU0FBUyxFQUFFLElBQUk7RUFDZixXQUFXLEVBQUUsSUFBSTtFQUNqQixPQUFPLEVBQUUsU0FBUyxHQUNuQjs7QUMzR0QsQUFBQSxXQUFXLENBQUM7RUFDVixXQUFXLEVBQUUsTUFBTTtFQUNuQixVQUFVLEVBQUUsT0FBTztFQUNuQixVQUFVLEVWZ0JGLE9BQU87RVVmZixRQUFRLEVBQUUsUUFBUTtFQUNsQixPQUFPLEVWOENRLEVBQUU7RVU3Q2pCLE9BQU8sRUFBRSxJQUFJO0VBQ2IsU0FBUyxFQUFFLGFBQWEsR0EwQnpCO0VBeEJDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7SUFUckMsQUFBQSxXQUFXLENBQUM7TUFVUixPQUFPLEVBQUUsSUFBSTtNQUNiLEtBQUssRUFBRSxJQUFJO01BQ1gsVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxtQkFBa0I7TUFDeEMsT0FBTyxFVnVDYSxFQUFFLEdVbkJ6QjtFQWpCQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0lBaEJyQyxBQUFBLFdBQVcsQ0FBQztNQWlCUixNQUFNLEVBQUUsSUFBSTtNQUNaLGVBQWUsRUFBRSxNQUFNLEdBZTFCO01BakNELEFBb0JJLFdBcEJPLEFBb0JQLE9BQVEsQ0FBQztRQUNQLE9BQU8sRUFBRSxFQUFFO1FBQ1gsUUFBUSxFQUFFLFFBQVE7UUFDbEIsS0FBSyxFQUFFLElBQUk7UUFDWCxNQUFNLEVBQUUsSUFBSTtRQUNaLFVBQVUsRVZOTixPQUFPO1FVT1gsTUFBTSxFQUFFLEtBQUssR0FDZDtFQTNCTCxBQThCRSxXQTlCUyxDQThCVCxhQUFhLENBQUM7SUFDWixNQUFNLEVBQUUsT0FBTyxHQUNoQjs7QUFHSCxBQUFBLG9CQUFvQixDQUFDO0VBQ25CLE9BQU8sRUFBRSxJQUFJO0VBQ2IsZUFBZSxFQUFFLGFBQWE7RUFDOUIsU0FBUyxFQUFFLFVBQVU7RUFDckIsS0FBSyxFQUFFLElBQUk7RUFDWCxNQUFNLEVBQUUsS0FBSyxHQWlCZDtFQWZDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7SUFQckMsQUFBQSxvQkFBb0IsQ0FBQztNQVFqQixNQUFNLEVBQUUsSUFBSSxHQWNmO0VBWEMsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztJQVhyQyxBQUFBLG9CQUFvQixDQUFDO01BWWpCLEtBQUssRUFBRSxJQUFJLEdBVWQ7RUFQQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0lBZnJDLEFBQUEsb0JBQW9CLENBQUM7TUFnQmpCLEtBQUssRUFBRSxJQUFJLEdBTWQ7RUFIQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxNQUFNO0lBbkJ0QyxBQUFBLG9CQUFvQixDQUFDO01Bb0JqQixLQUFLLEVBQUUsSUFBSSxHQUVkOztBQUVELEFBQVksV0FBRCxDQUFDLEVBQUUsQ0FBQztFQUNiLFdBQVcsRUFBRSxNQUFNO0VBQ25CLGNBQWMsRUFBRSxTQUFTO0VBQ3pCLFdBQVcsRUFBRSxHQUFHO0VBQ2hCLEtBQUssRUFBRSxPQUFPO0VBQ2QsV0FBVyxFQUFFLElBQUksR0FLbEI7RUFIQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0lBUHJDLEFBQVksV0FBRCxDQUFDLEVBQUUsQ0FBQztNQVFYLE9BQU8sRUFBRSxJQUFJLEdBRWhCOztBQUVELEFBQUEsRUFBRSxBQUFBLGNBQWMsQ0FBQztFQUNmLGNBQWMsRUFBRSxTQUFTO0VBQ3pCLEtBQUssRUFBRSxPQUFPO0VBQ2QsU0FBUyxFQUFFLEdBQUc7RUFDZCxNQUFNLEVBQUUsSUFBSSxHQUNiOztBQUVELEFBQUEsMEJBQTBCLENBQUM7RUFDekIsT0FBTyxFQUFFLElBQUk7RUFDYixjQUFjLEVBQUUsR0FBRztFQUNuQixXQUFXLEVBQUUsTUFBTSxHQUNwQjs7QUFFRCxBQUFBLGtCQUFrQixDQUFDO0VBQ2pCLE9BQU8sRUFBRSxJQUFJO0VBQ2IsY0FBYyxFQUFFLEdBQUc7RUFDbkIsV0FBVyxFQUFFLE1BQU07RUFDbkIsTUFBTSxFQUFFLE9BQU8sR0FDaEI7O0FBRUQsQUFBQSxzQkFBc0IsQ0FBQztFQUNyQixPQUFPLEVBQUUsSUFBSTtFQUNiLFNBQVMsRUFBRSxVQUFVO0VBQ3JCLFdBQVcsRUFBRSxNQUFNLEdBS3BCO0VBUkQsQUFLRSxzQkFMb0IsQ0FLcEIsVUFBVSxDQUFDO0lBQ1QsTUFBTSxFQUFFLE9BQU8sR0FDaEI7O0FDbEdILEFBQUEsV0FBVyxDQUFDO0VBQ1YsY0FBYyxFQUFFLElBQUk7RUFDcEIsV0FBVyxFQUFFLE1BQU0sR0FDcEI7O0FDSEQsQUFBQSw0QkFBNEIsQ0FBQztFQUUzQixNQUFNLEVBQUUsT0FBTyxHQUtoQjtFQVBELEFBSUUsNEJBSjBCLENBSTFCLGNBQWMsQ0FBQztJQUNiLE9BQU8sRUFBRSxDQUFDLEdBQ1g7O0FBR0gsQUFBQSxrQkFBa0IsQUFBQSxRQUFRLENBQUM7RUFDekIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENaV1gsT0FBTztFWVZiLGFBQWEsRUFBRSxJQUFJO0VBQ25CLE9BQU8sRUFBRSxHQUFHO0VBQ1osSUFBSSxFQUFFLFFBQVEsR0FpQ2Y7RUFyQ0QsQUFNRSxrQkFOZ0IsQUFBQSxRQUFRLEFBTXhCLGlCQUFrQixDQUFDO0lBQ2pCLFlBQVksRUFBRSxPQUFnQixHQUsvQjtJQVpILEFBU3NCLGtCQVRKLEFBQUEsUUFBUSxBQU14QixpQkFBa0IsQ0FHaEIsaUJBQWlCLENBQUMsR0FBRyxDQUFDO01BQ3BCLGdCQUFnQixFQUFFLHNCQUFxQixDQUFDLFVBQVUsR0FDbkQ7RUFYTCxBQWNFLGtCQWRnQixBQUFBLFFBQVEsQUFjeEIscUJBQXNCLENBQUM7SUFDckIsWUFBWSxFQUFFLE9BQWdCLEdBSy9CO0lBcEJILEFBaUJzQixrQkFqQkosQUFBQSxRQUFRLEFBY3hCLHFCQUFzQixDQUdwQixpQkFBaUIsQ0FBQyxHQUFHLENBQUM7TUFDcEIsZ0JBQWdCLEVBQUUsc0JBQXFCLENBQUMsVUFBVSxHQUNuRDtFQW5CTCxBQXNCRSxrQkF0QmdCLEFBQUEsUUFBUSxBQXNCeEIsbUJBQW9CLENBQUM7SUFDbkIsWUFBWSxFQUFFLE9BQWdCLEdBSy9CO0lBNUJILEFBeUJzQixrQkF6QkosQUFBQSxRQUFRLEFBc0J4QixtQkFBb0IsQ0FHbEIsaUJBQWlCLENBQUMsR0FBRyxDQUFDO01BQ3BCLGdCQUFnQixFQUFFLHNCQUFxQixDQUFDLFVBQVUsR0FDbkQ7RUEzQkwsQUE4QkUsa0JBOUJnQixBQUFBLFFBQVEsQUE4QnhCLHFCQUFzQixDQUFDO0lBQ3JCLFlBQVksRUFBRSxPQUFpQixHQUtoQztJQXBDSCxBQWlDc0Isa0JBakNKLEFBQUEsUUFBUSxBQThCeEIscUJBQXNCLENBR3BCLGlCQUFpQixDQUFDLEdBQUcsQ0FBQztNQUNwQixnQkFBZ0IsRUFBRSx1QkFBc0IsQ0FBQyxVQUFVLEdBQ3BEOztBQUlMLEFBQ0UsbUJBRGlCLENBQ2pCLGlCQUFpQjtBQURuQixBQUVFLG1CQUZpQixDQUVqQix5QkFBeUIsQ0FBQztFQUN4QixNQUFNLEVBQUUsTUFBTSxHQUNmOztBQUdILEFBQUEsa0JBQWtCLENBQUM7RUFDakIsT0FBTyxFQUFFLElBQUk7RUFDYixXQUFXLEVBQUUsTUFBTTtFQUNuQixTQUFTLEVBQUUsSUFBSSxHQU9oQjtFQVZELEFBS0Usa0JBTGdCLENBS2hCLGNBQWMsQ0FBQztJQUNiLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLFNBQVMsRUFBRSxJQUFJO0lBQ2YsT0FBTyxFQUFFLEtBQUssR0FDZjs7QUFHSCxBQUFBLGFBQWEsQ0FBQztFQUNaLFdBQVcsRUFBRSxJQUFJO0VBQ2pCLE9BQU8sRUFBRSxLQUFLO0VBQ2QsV0FBVyxFQUFFLE1BQU07RUFDbkIsU0FBUyxFQUFFLElBQUk7RUFDZixJQUFJLEVBQUUsUUFBUSxHQUNmOztBQUVELEFBQUEsZUFBZSxDQUFDO0VBQ2QsS0FBSyxFQUFFLEdBQUcsR0FhWDtFQVhDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7SUFIckMsQUFBQSxlQUFlLENBQUM7TUFJWixLQUFLLEVBQUUsK0JBQStCLEdBVXpDO0VBUEMsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztJQVByQyxBQUFBLGVBQWUsQ0FBQztNQVFaLEtBQUssRUFBRSwrQkFBK0IsR0FNekM7RUFIQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxNQUFNO0lBWHRDLEFBQUEsZUFBZSxDQUFDO01BWVosS0FBSyxFQUFFLCtCQUErQixHQUV6Qzs7QUFFRCxBQUFBLGtCQUFrQixDQUFDO0VBQ2pCLFdBQVcsRUFBRSxHQUFHO0VBQ2hCLElBQUksRUFBRSxRQUFRO0VBQ2QsS0FBSyxFWnRFTSxPQUFPLEdZdUVuQjs7QUFFRCxBQUFBLGNBQWM7QUFDZCxBQUFBLDJCQUEyQixDQUFDO0VBQzFCLEtBQUssRVo1RUMsSUFBSTtFWTZFVixXQUFXLEVBQUUsR0FBRyxHQUNqQjs7QUFFRCxBQUFBLDJCQUEyQixDQUFDO0VBQzFCLE9BQU8sRUFBRSxDQUFDO0VBQ1YsS0FBSyxFQUFFLElBQUk7RUFDWCxNQUFNLEVBQUUsQ0FBQyxHQUNWOztBQUVELEFBQUEsaUJBQWlCO0FBQ2pCLEFBQUEseUJBQXlCLENBQUM7RUFDeEIsVUFBVSxFQUFFLElBQUk7RUFDaEIsYUFBYSxFQUFFLElBQUk7RUFDbkIsT0FBTyxFQUFFLElBQUk7RUFDYixlQUFlLEVBQUUsTUFBTTtFQUN2QixXQUFXLEVBQUUsTUFBTTtFQUNuQixNQUFNLEVBQUUscUJBQXFCO0VBQzdCLE1BQU0sRUFBRSxLQUFLLEdBQ2Q7O0FBRUQsQUFBQSx5QkFBeUIsQ0FBQztFQUN4QixNQUFNLEVBQUUsR0FBRyxDQUFDLEtBQUssQ1psR1gsSUFBSTtFWW1HVixVQUFVLEVBQUUsd0JBQXVCLEdBQ3BDOztBQUVELEFBQWtCLGlCQUFELENBQUMsR0FBRztBQUNyQixBQUEwQix5QkFBRCxDQUFDLEdBQUcsQ0FBQztFQUM1QixNQUFNLEVBQUUsSUFBSTtFQUNaLEtBQUssRUFBRSxJQUFJO0VBQ1gsYUFBYSxFQUFFLElBQUksR0FDcEI7O0FBRUQsQUFBMEIseUJBQUQsQ0FBQyxHQUFHLENBQUM7RUFDNUIsT0FBTyxFQUFFLENBQUMsR0FDWDs7QUFFRCxBQUFBLHdCQUF3QixDQUFDO0VBQ3ZCLE9BQU8sRUFBRSxJQUFJO0VBQ2IsY0FBYyxFQUFFLE1BQU07RUFDdEIsV0FBVyxFQUFFLE1BQU07RUFDbkIsS0FBSyxFQUFFLElBQUksR0FDWjs7QUFFRCxBQUFBLHlCQUF5QixDQUFDO0VBQ3hCLEtBQUssRUFBRSxJQUFJO0VBQ1gsTUFBTSxFQUFFLEdBQUc7RUFDWCxNQUFNLEVBQUUsTUFBTTtFQUNkLGdCQUFnQixFWm5IUCxPQUFPLEdZb0hqQjs7QUFFRCxBQUFBLHVCQUF1QixDQUFDO0VBQ3RCLE1BQU0sRUFBRSxJQUFJO0VBQ1osS0FBSyxFQUFFLElBQUk7RUFDWCxLQUFLLEVabElDLElBQUk7RVltSVYsV0FBVyxFQUFFLE1BQU07RUFDbkIsU0FBUyxFQUFFLElBQUk7RUFDZixXQUFXLEVBQUUsSUFBSTtFQUNqQixVQUFVLEVBQUUsTUFBTSxHQUNuQjs7QUFFRCxBQUFBLHlCQUF5QixDQUFDO0VBQ3hCLE1BQU0sRUFBRSxJQUFJO0VBQ1osS0FBSyxFQUFFLEtBQUs7RUFDWixLQUFLLEVaM0lNLE9BQU87RVk0SWxCLFdBQVcsRUFBRSxNQUFNO0VBQ25CLFNBQVMsRUFBRSxJQUFJO0VBQ2YsV0FBVyxFQUFFLElBQUksR0FDbEI7O0FDdktELEFBQVMsTUFBSCxHQUFHLEdBQUcsQUFBQSxNQUFNLENBQUM7RUFDakIsT0FBTyxFQUFFLGVBQWUsR0FDekI7O0FBR0QsQUFBQSxrQkFBa0IsQ0FBQztFQUNqQixjQUFjLEVBQUUsTUFBTTtFQUN0QixXQUFXLEVBQUUsTUFBTTtFQUNuQixlQUFlLEVBQUUsTUFBTTtFQUN2QixVQUFVLEVBQUUsTUFBTTtFQUNsQixXQUFXLEVBQUUsTUFBTTtFQUNuQixPQUFPLEVBQUUsTUFBTSxHQUNoQjs7QUFFRCxBQUFBLHlCQUF5QixDQUFDO0VBQ3hCLE1BQU0sRUFBRSxPQUFPO0VBQ2YsS0FBSyxFQUFFLE9BQU8sR0FDZjs7QUFFRCxBQUFBLGlCQUFpQixFQUFFLEFBQUEsY0FBYyxDQUFDO0VBQ2hDLEtBQUssRUFBRSxLQUFLO0VBQ1osTUFBTSxFQUFFLElBQUk7RUFDWixXQUFXLEVBQUUsTUFBTTtFQUNuQixTQUFTLEVBQUUsSUFBSSxHQUNoQjs7QUFFRCxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0VBQ2pDLEFBQUEsZ0NBQWdDLENBQUM7SUFDL0IsZUFBZSxFQUFFLFlBQVk7SUFDN0IsS0FBSyxFQUFFLElBQUk7SUFDWCxNQUFNLEVBQUUsS0FBSyxHQUNkO0VBRUQsQUFBQSx3QkFBd0IsQ0FBQztJQUN2QixTQUFTLEVBQUUsSUFBSTtJQUNmLFVBQVUsRUFBRSxJQUFJLEdBQ2pCO0VBRUQsQUFBQSwwQkFBMEIsQ0FBQztJQUN6QixjQUFjLEVBQUUsTUFBTTtJQUN0QixPQUFPLEVBQUUsTUFBTSxHQUNoQjtFQUVELEFBQUEseUJBQXlCLENBQUM7SUFDeEIsY0FBYyxFQUFFLFNBQVM7SUFDekIsS0FBSyxFQUFFLElBQUk7SUFDWCxNQUFNLEVBQUUsSUFBSSxHQUNiO0VBRUQsQUFBQSxHQUFHLEFBQUEseUJBQXlCLENBQUM7SUFDM0IsT0FBTyxFQUFFLElBQUk7SUFDYixjQUFjLEVBQUUsTUFBTTtJQUN0QixLQUFLLEVBQUUsSUFBSTtJQUNYLE1BQU0sRUFBRSxJQUFJO0lBQ1osTUFBTSxFQUFFLElBQUk7SUFDWixVQUFVLEVBQUUsTUFBTTtJQUNsQixhQUFhLEVBQUUsR0FBRztJQUNsQixNQUFNLEVBQUUsR0FBRyxDQUFDLEtBQUssQ2JuRGIsSUFBSTtJYW9EUixPQUFPLEVBQUUsS0FBSztJQUNkLGVBQWUsRUFBRSxNQUFNLEdBU3hCO0lBbkJELEFBWUUsR0FaQyxBQUFBLHlCQUF5QixDQVkxQixHQUFHLEFBQUEsK0JBQStCLENBQUM7TUFDakMsU0FBUyxFQUFFLElBQUksR0FDaEI7SUFkSCxBQWdCRSxHQWhCQyxBQUFBLHlCQUF5QixDQWdCMUIsR0FBRyxBQUFBLGtDQUFrQyxDQUFDO01BQ3BDLFNBQVMsRUFBRSxJQUFJLEdBQ2hCOztBQUlMLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7RUFDakMsQUFBQSxnQ0FBZ0MsQ0FBQztJQUMvQixlQUFlLEVBQUUsWUFBWTtJQUM3QixLQUFLLEVBQUUsSUFBSTtJQUNYLE1BQU0sRUFBRSxLQUFLLEdBQ2Q7RUFFRCxBQUFBLHdCQUF3QixDQUFDO0lBQ3ZCLFNBQVMsRUFBRSxJQUFJO0lBQ2YsVUFBVSxFQUFFLElBQUksR0FDakI7RUFFRCxBQUFBLHlCQUF5QixDQUFDO0lBQ3hCLGNBQWMsRUFBRSxTQUFTO0lBQ3pCLEtBQUssRUFBRSxJQUFJO0lBQ1gsTUFBTSxFQUFFLElBQUksR0FDYjtFQUVELEFBQUEsMEJBQTBCLENBQUM7SUFDekIsY0FBYyxFQUFFLEdBQUc7SUFDbkIsTUFBTSxFQUFFLFdBQVcsR0FDcEI7RUFFRCxBQUFBLEdBQUcsQUFBQSx5QkFBeUIsQ0FBQztJQUMzQixPQUFPLEVBQUUsSUFBSTtJQUNiLGNBQWMsRUFBRSxNQUFNO0lBQ3RCLEtBQUssRUFBRSxJQUFJO0lBQ1gsTUFBTSxFQUFFLEtBQUs7SUFDYixVQUFVLEVBQUUsTUFBTTtJQUNsQixhQUFhLEVBQUUsR0FBRztJQUNsQixNQUFNLEVBQUUsR0FBRyxDQUFDLEtBQUssQ2IvRmIsSUFBSTtJYWdHUixNQUFNLEVBQUUsS0FBSztJQUNiLE9BQU8sRUFBRSxNQUFNLEdBMENoQjtJQW5ERCxBQVdFLEdBWEMsQUFBQSx5QkFBeUIsQ0FXMUIsR0FBRyxBQUFBLCtCQUErQixDQUFDO01BQ2pDLFNBQVMsRUFBRSxJQUFJO01BQ2YsYUFBYSxFQUFFLElBQUksR0FTcEI7SUFQQyxNQUFNLENBQUMsTUFBNkIsTUF0Q3ZCLFNBQVMsRUFBRSxLQUFLLE9Bc0NWLFNBQVMsRUFBRSxLQUFLO01BZnZDLEFBV0UsR0FYQyxBQUFBLHlCQUF5QixDQVcxQixHQUFHLEFBQUEsK0JBQStCLENBQUM7UUFLL0IsU0FBUyxFQUFFLElBQUksR0FNbEI7SUFIQyxNQUFNLENBQUMsTUFBOEIsTUExQ3hCLFNBQVMsRUFBRSxLQUFLLE9BMENWLFNBQVMsRUFBRSxNQUFNO01BbkJ4QyxBQVdFLEdBWEMsQUFBQSx5QkFBeUIsQ0FXMUIsR0FBRyxBQUFBLCtCQUErQixDQUFDO1FBUy9CLFNBQVMsRUFBRSxJQUFJLEdBRWxCOztBQTdDTCxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0lBdUJqQyxBQXdCRSxHQXhCQyxBQUFBLHlCQUF5QixDQXdCMUIsR0FBRyxBQUFBLGtDQUFrQyxDQUFDO01BQ3BDLFNBQVMsRUFBRSxJQUFJO01BQ2YsT0FBTyxFQUFFLE1BQU07TUFDZixNQUFNLEVBQUUsR0FBRyxHQW1CWjtJQWpCQyxNQUFNLENBQUMsTUFBNkIsTUFwRHZCLFNBQVMsRUFBRSxLQUFLLE9Bb0RWLFNBQVMsRUFBRSxLQUFLO01BN0J2QyxBQXdCRSxHQXhCQyxBQUFBLHlCQUF5QixDQXdCMUIsR0FBRyxBQUFBLGtDQUFrQyxDQUFDO1FBTWxDLFNBQVMsRUFBRSxJQUFJO1FBQ2YsT0FBTyxFQUFFLE1BQU07UUFDZixhQUFhLEVBQUUsR0FBRztRQUNsQixXQUFXLEVBQUUsSUFBSSxHQWFwQjtJQVZDLE1BQU0sQ0FBQyxNQUE2QixNQTNEdkIsU0FBUyxFQUFFLEtBQUssT0EyRFYsU0FBUyxFQUFFLEtBQUs7TUFwQ3ZDLEFBd0JFLEdBeEJDLEFBQUEseUJBQXlCLENBd0IxQixHQUFHLEFBQUEsa0NBQWtDLENBQUM7UUFhbEMsU0FBUyxFQUFFLElBQUk7UUFDZixPQUFPLEVBQUUsS0FBSztRQUNkLGFBQWEsRUFBRSxHQUFHLEdBT3JCO0lBSkMsTUFBTSxDQUFDLE1BQThCLE1BakV4QixTQUFTLEVBQUUsS0FBSyxPQWlFVixTQUFTLEVBQUUsTUFBTTtNQTFDeEMsQUF3QkUsR0F4QkMsQUFBQSx5QkFBeUIsQ0F3QjFCLEdBQUcsQUFBQSxrQ0FBa0MsQ0FBQztRQW1CbEMsU0FBUyxFQUFFLElBQUk7UUFDZixPQUFPLEVBQUUsQ0FBQyxHQUViOztBQXJFTCxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0lBdUJqQyxBQWdERSxHQWhEQyxBQUFBLHlCQUF5QixDQWdEMUIsR0FBRyxBQUFBLHlCQUF5QixDQUFDO01BQzNCLFVBQVUsRUFBRSxHQUFHLEdBQ2hCOztBQUtMLEFBQUEsZ0NBQWdDLENBQUM7RUFDL0IsT0FBTyxFQUFFLElBQUk7RUFDYixjQUFjLEVBQUUsTUFBTTtFQUN0QixlQUFlLEVBQUUsVUFBVTtFQUMzQixXQUFXLEVBQUUsTUFBTTtFQUNuQixRQUFRLEVBQUUsUUFBUSxHQUNuQjs7QUFFRCxBQUFBLCtCQUErQixDQUFDO0VBQzlCLFFBQVEsRUFBRSxRQUFRO0VBQ2xCLEdBQUcsRUFBRSxJQUFJO0VBQ1QsS0FBSyxFQUFFLElBQUk7RUFDWCxTQUFTLEVBQUUsSUFBSSxHQUNoQjs7QUFFRCxBQUFBLDhCQUE4QixDQUFDO0VBQzdCLE1BQU0sRUFBRSxJQUFJLEdBQ2I7O0FBRUQsQUFBQSxvQ0FBb0MsQ0FBQztFQUNuQyxLQUFLLEVBQUUsR0FBRztFQUNWLE1BQU0sRUFBRSxJQUFJO0VBQ1osTUFBTSxFQUFFLElBQUk7RUFDWixXQUFXLEVBQUUsR0FBRztFQUNoQixVQUFVLEVBQUUsSUFBSSxHQUNqQjs7QUFFRCxBQUFBLDhCQUE4QixDQUFDO0VBQzdCLEtBQUssRUFBRSxHQUFHO0VBQ1YsTUFBTSxFQUFFLElBQUk7RUFDWixVQUFVLEVBQUUsSUFBSTtFQUNoQixNQUFNLEVBQUUsSUFBSTtFQUNaLE9BQU8sRUFBRSxJQUFJO0VBQ2IsU0FBUyxFQUFFLElBQUksR0FDaEI7O0FBR0QsQUFBQSx3QkFBd0IsQ0FBQztFQUN2QixPQUFPLEVBQUUsSUFBSTtFQUNiLGNBQWMsRUFBRSxNQUFNO0VBQ3RCLGVBQWUsRUFBRSxVQUFVO0VBQzNCLFdBQVcsRUFBRSxNQUFNO0VBQ25CLFFBQVEsRUFBRSxRQUFRO0VBQ2xCLE9BQU8sRUFBRSxZQUFZO0VBQ3JCLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDYmhLVixPQUFPO0VhaUtkLGFBQWEsRUFBRSxHQUFHO0VBQ2xCLFdBQVcsRUFBRSxNQUFNLEdBS3BCO0VBZEQsQUFXRSx3QkFYc0IsQ0FXdEIsTUFBTSxDQUFDO0lBQ0wsTUFBTSxFQUFFLE9BQU8sR0FDaEI7O0FBR0gsQUFBQSxtQkFBbUIsQ0FBQztFQUNsQixLQUFLLEVibkxNLE9BQU87RWFvTGxCLFFBQVEsRUFBRSxRQUFRO0VBQ2xCLEdBQUcsRUFBRSxJQUFJO0VBQ1QsSUFBSSxFQUFFLElBQUk7RUFDVixNQUFNLEVBQUUsT0FBTyxHQVFoQjtFQU5DLEFBQUEseUJBQU8sQ0FBQztJQUNOLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLE1BQU07SUFDbkIsU0FBUyxFQUFFLElBQUk7SUFDZixXQUFXLEVBQUUsSUFBSSxHQUNsQjs7QUFHSCxBQUFBLG9CQUFvQixBQUFBLE9BQU8sQ0FBQztFQUMxQixPQUFPLEVBQUUsT0FBTztFQUNoQixTQUFTLEVBQUUsSUFBSTtFQUNmLEtBQUssRWJwTU0sT0FBTztFYXFNbEIsUUFBUSxFQUFFLFFBQVE7RUFDbEIsR0FBRyxFQUFFLElBQUk7RUFDVCxLQUFLLEVBQUUsSUFBSTtFQUNYLE1BQU0sRUFBRSxPQUFPLEdBQ2hCOztBQUVELEFBQXlCLHdCQUFELENBQUMsVUFBVSxDQUFDO0VBQ2xDLFFBQVEsRUFBRSxRQUFRO0VBQ2xCLElBQUksRUFBRSxDQUFDO0VBQ1AsS0FBSyxFQUFFLENBQUM7RUFDUixNQUFNLEVBQUUsTUFBTTtFQUNkLEdBQUcsRUFBRSxLQUFLO0VBQ1YsYUFBYSxFQUFFLEtBQUssR0FDckI7O0FBS0QsQUFFRSx3QkFGc0IsQ0FFdEIsVUFBVSxDQUFDO0VBQ1QsVUFBVSxFQUFFLEdBQUc7RUFDZixTQUFTLEVBQUUsSUFBSSxHQUNoQjs7QUFMSCxBQU9FLHdCQVBzQixDQU90QixXQUFXLENBQUM7RUFDVixVQUFVLEVBQUUsR0FBRyxHQUNoQjs7QUFUSCxBQVdFLHdCQVhzQixDQVd0QixzQkFBc0IsQ0FBQztFQUNyQixPQUFPLEVBQUUsSUFBSTtFQUNiLGVBQWUsRUFBRSxNQUFNO0VBQ3ZCLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDYnBPZCxPQUFPO0VhcU9WLE9BQU8sRUFBRSxRQUFRO0VBQ2pCLFdBQVcsRUFBRSxNQUFNO0VBQ25CLFVBQVUsRUFBRSxHQUFHO0VBQ2YsS0FBSyxFQUFFLEtBQUssR0FDYjs7QUFuQkgsQUFxQkUsd0JBckJzQixDQXFCdEIsVUFBVSxDQUFDO0VBQ1QsVUFBVSxFQUFFLElBQUk7RUFDaEIsU0FBUyxFQUFFLElBQUk7RUFDZixZQUFZLEViM09ELE9BQU87RWE0T2xCLEtBQUssRWI1T00sT0FBTztFYTZPbEIsYUFBYSxFQUFFLEdBQUc7RUFDbEIsVUFBVSxFQUFFLElBQUk7RUFDaEIsS0FBSyxFQUFFLEdBQUc7RUFDVixVQUFVLEVBQUUsSUFBSTtFQUNoQixPQUFPLEVBQUUsU0FBUztFQUNsQixNQUFNLEVBQUUsSUFBSTtFQUNaLEtBQUssRUFBRSxLQUFLO0VBQ1osV0FBVyxFQUFFLE1BQU0sR0FDcEI7O0FBR0gsQUFBQSxzQkFBc0IsQ0FBQztFQUNyQixLQUFLLEVBQUUsSUFBSTtFQUNYLE1BQU0sRUFBRSxHQUFHO0VBQ1gsTUFBTSxFQUFFLFlBQVk7RUFDcEIsZ0JBQWdCLEViL1BYLE9BQU8sR2FnUWI7O0FBSUQsQUFBeUIsd0JBQUQsQ0FBQyxhQUFhLENBQUM7RUFDckMsVUFBVSxFQUFFLEdBQUc7RUFDZixTQUFTLEVBQUUsSUFBSSxHQUNoQjs7QUFFRCxBQUF5Qix3QkFBRCxDQUFDLGlCQUFpQixDQUFDO0VBQ3pDLFVBQVUsRUFBRSxJQUFJO0VBQ2hCLGFBQWEsRUFBRSxJQUFJO0VBQ25CLFNBQVMsRUFBRSxJQUFJLEdBQ2hCOztBQUVELEFBQUEsb0JBQW9CLENBQUM7RUFDbkIsVUFBVSxFQUFFLEdBQUc7RUFDZixTQUFTLEVBQUUsSUFBSSxHQUNoQjs7QUFFRCxBQUFBLHFCQUFxQixDQUFDO0VBQ3BCLE9BQU8sRUFBRSxJQUFJO0VBQ2IsY0FBYyxFQUFFLE1BQU0sR0FDdkI7O0FBRUQsQUFBQSwyQkFBMkIsRUFBRSxBQUFBLDJCQUEyQixDQUFDO0VBQ3ZELEtBQUssRWJuUkksT0FBTztFYW9SaEIsU0FBUyxFQUFFLElBQUk7RUFDZixXQUFXLEVBQUUsSUFBSTtFQUNqQixhQUFhLEVBQUUsSUFBSSxHQUNwQjs7QUFFRCxBQUFBLDJCQUEyQixDQUFDO0VBQzFCLEtBQUssRWJ0UkcsT0FBTztFYXVSZixhQUFhLEVBQUUsQ0FBQyxHQUNqQjs7QUFFRCxBQUFBLDJCQUEyQixDQUFDO0VBQzFCLE9BQU8sRUFBRSxnQkFBZ0I7RUFDekIsU0FBUyxFQUFFLElBQUk7RUFDZixXQUFXLEVBQUUsSUFBSTtFQUNqQixLQUFLLEVBQUUsS0FBSztFQUNaLE1BQU0sRUFBRSxJQUFJLEdBQ2I7O0FBRUQsQUFBQSxxQkFBcUIsQUFBQSwyQkFBMkIsQ0FBQztFQUMvQyxLQUFLLEViL1NNLE9BQU87RWFnVGxCLFdBQVcsRUFBRSxNQUFNLEdBQ3BCOztBQUVELEFBQUEsNkJBQTZCLENBQUM7RUFDNUIsYUFBYSxFQUFFLEdBQUc7RUFDbEIsZ0JBQWdCLEVBQUUsT0FBTztFQUN6QixTQUFTLEVBQUUsSUFBSTtFQUNmLFdBQVcsRUFBRSxHQUFHO0VBQ2hCLFdBQVcsRUFBRSxJQUFJO0VBQ2pCLEtBQUssRWI3U0csT0FBTztFYThTZixLQUFLLEVBQUUsS0FBSztFQUNaLE9BQU8sRUFBRSxRQUFRO0VBQ2pCLFVBQVUsRUFBRSxJQUFJO0VBQ2hCLFdBQVcsRUFBRSxNQUFNLEdBQ3BCOztBQUVELEFBQUEsMkJBQTJCLENBQUM7RUFDMUIsT0FBTyxFQUFFLElBQUk7RUFDYixjQUFjLEVBQUUsR0FBRztFQUNuQixlQUFlLEVBQUUsTUFBTSxHQVl4QjtFQWZELEFBS0UsMkJBTHlCLENBS3pCLFVBQVUsQ0FBQztJQUNULEtBQUssRUFBRSxLQUFLO0lBQ1osTUFBTSxFQUFFLElBQUksR0FDYjtFQVJILEFBVUUsMkJBVnlCLENBVXpCLFdBQVcsQ0FBQztJQUNWLFlBQVksRUFBRSxJQUFJO0lBQ2xCLFlBQVksRWI1VUgsT0FBTztJYTZVaEIsS0FBSyxFYnJVRSxPQUFPLEdhc1VmOztBQUdILEFBQUEscUNBQXFDLENBQUM7RUFDcEMsTUFBTSxFQUFFLElBQUk7RUFDWixLQUFLLEVBQUUsS0FBSztFQUNaLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDYjNVVixPQUFPO0VhNFVkLGFBQWEsRUFBRSxHQUFHLEdBQ25COztBQUVELEFBQUEsc0NBQXNDLENBQUM7RUFDckMsS0FBSyxFYjdVRyxPQUFPO0VhOFVmLFdBQVcsRUFBRSxNQUFNO0VBQ25CLFNBQVMsRUFBRSxJQUFJO0VBQ2YsV0FBVyxFQUFFLElBQUk7RUFDakIsTUFBTSxFQUFFLElBQUk7RUFDWixNQUFNLEVBQUUsSUFBSTtFQUNaLEtBQUssRUFBRSxJQUFJO0VBQ1gsUUFBUSxFQUFFLE1BQU07RUFDaEIsTUFBTSxFQUFFLElBQUk7RUFDWixPQUFPLEVBQUUsWUFBWTtFQUNyQixjQUFjLEVBQUUsU0FBUztFQUN6QixXQUFXLEVBQUUsR0FBRyxHQUNqQjs7QUFJRCxBQUFBLDBCQUEwQixDQUFDO0VBQ3pCLE9BQU8sRUFBRSxJQUFJO0VBQ2IsY0FBYyxFQUFFLE1BQU07RUFDdEIsZUFBZSxFQUFFLFVBQVU7RUFDM0IsV0FBVyxFQUFFLE1BQU07RUFDbkIsUUFBUSxFQUFFLFFBQVE7RUFDbEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENiOVdaLE9BQU87RWErV1osVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ2IvV2xCLE9BQU87RWFnWFosV0FBVyxFQUFFLE1BQU0sR0FDcEI7O0FBRUQsQUFBQSx5QkFBeUIsQ0FBQztFQUN4QixVQUFVLEVidlhBLE9BQU87RWF3WGpCLEtBQUssRUFBRSxJQUFJO0VBQ1gsT0FBTyxFQUFFLElBQUk7RUFDYixlQUFlLEVBQUUsTUFBTTtFQUN2QixPQUFPLEVBQUUsSUFBSTtFQUNiLFNBQVMsRUFBRSxJQUFJO0VBQ2YsS0FBSyxFYnBYSyxPQUFPO0VhcVhqQixNQUFNLEVBQUUsSUFBSSxHQUNiOztBQUVELEFBQUEsY0FBYyxBQUFBLE9BQU8sQ0FBQztFQUNwQixPQUFPLEVBQUUsT0FBTztFQUNoQixTQUFTLEVBQUUsR0FBRztFQUNkLEtBQUssRWJsWU0sT0FBTztFYW1ZbEIsUUFBUSxFQUFFLFFBQVE7RUFDbEIsR0FBRyxFQUFFLElBQUk7RUFDVCxLQUFLLEVBQUUsTUFBTTtFQUNiLFdBQVcsRUFBRSxVQUFVO0VBQ3ZCLE1BQU0sRUFBRSxPQUFPLEdBQ2hCOztBQUVELEFBQUEsMEJBQTBCLENBQUM7RUFDekIsS0FBSyxFQUFFLElBQUk7RUFDWCxPQUFPLEVBQUUsSUFBSTtFQUNiLGVBQWUsRUFBRSxNQUFNO0VBQ3ZCLFVBQVUsRUFBRSxJQUFJO0VBQ2hCLFNBQVMsRUFBRSxJQUFJO0VBQ2YsS0FBSyxFYnpZSyxPQUFPLEdhMFlsQjs7QUFFRCxBQUFBLDBCQUEwQixBQUFBLFlBQVksQ0FBQztFQUNyQyxVQUFVLEVBQUUsSUFBSTtFQUNoQixXQUFXLEVBQUUsSUFBSSxHQUNsQjs7QUFFRCxBQUFBLDBCQUEwQixDQUFDO0VBQ3pCLE9BQU8sRUFBRSxJQUFJO0VBQ2IsS0FBSyxFQUFFLElBQUk7RUFDWCxlQUFlLEVBQUUsTUFBTTtFQUN2QixjQUFjLEVBQUUsR0FBRztFQUNuQixVQUFVLEVBQUUsSUFBSSxHQUNqQjs7QUFFRCxBQUFBLGtCQUFrQixDQUFDO0VBQ2pCLE9BQU8sRUFBRSxJQUFJO0VBQ2IsY0FBYyxFQUFFLElBQUk7RUFDcEIsYUFBYSxFQUFFLEdBQUc7RUFDbEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENibmFaLE9BQU87RWFvYVosS0FBSyxFQUFFLElBQUk7RUFDWCxTQUFTLEVBQUUsR0FBRztFQUNkLEtBQUssRWJ2YU0sT0FBTztFYXdhbEIsV0FBVyxFQUFFLE1BQU07RUFDbkIsU0FBUyxFQUFFLElBQUk7RUFDZixNQUFNLEVBQUUsTUFBTSxHQUNmOztBQUdELEFBQUEsa0JBQWtCLEFBQUEsMkJBQTJCLENBQUM7RUFDNUMsS0FBSyxFYi9hTSxPQUFPLEdhZ2JuQjs7QUFFRCxBQUFBLGtCQUFrQixBQUFBLGlCQUFpQixDQUFDO0VBQ2xDLEtBQUssRWJuYk0sT0FBTztFYW9ibEIsT0FBTyxFQUFFLENBQUMsR0FDWDs7QUFFRCxBQUFBLGtCQUFrQixBQUFBLGtCQUFrQixDQUFDO0VBQ25DLEtBQUssRWJ4Yk0sT0FBTztFYXlibEIsT0FBTyxFQUFFLENBQUMsR0FDWDs7QUFFRCxBQUFBLGtCQUFrQixBQUFBLHNCQUFzQixDQUFDO0VBQ3ZDLEtBQUssRWI3Yk0sT0FBTyxHYThibkI7O0FBRUQsQUFBQSxrQkFBa0IsQUFBQSx1QkFBdUIsQ0FBQztFQUN4QyxLQUFLLEViamNNLE9BQU8sR2FrY25COztBQUVELEFBQUEsMEJBQTBCLEFBQUEsT0FBTyxDQUFDO0VBQ2hDLFVBQVUsRUFBRSxJQUFJO0VBQ2hCLGFBQWEsRUFBRSxJQUFJO0VBQ25CLEtBQUssRUFBRSxLQUFLO0VBQ1osTUFBTSxFQUFFLElBQUksR0FDYjs7QUFFRCxBQUEyQiwwQkFBRCxDQUFDLFVBQVUsQ0FBQztFQUNwQyxTQUFTLEVBQUUsSUFBSTtFQUNmLFdBQVcsRUFBRSxHQUFHO0VBQ2hCLFVBQVUsRWIvY0osSUFBSTtFYWdkVixNQUFNLEVBQUUsU0FBUztFQUNqQixhQUFhLEVBQUUsR0FBRztFQUNsQixLQUFLLEViM2NHLE9BQU87RWE0Y2YsSUFBSSxFQUFFLENBQUMsR0FDUjs7QUFJRCxBQUFBLHdCQUF3QixDQUFDO0VBQ3ZCLFVBQVUsRUFBRSxRQUFRO0VBQ3BCLEtBQUssRUFBRSxRQUFRO0VBQ2YsYUFBYSxFQUFFLEdBQUc7RUFDbEIsZ0JBQWdCLEVBQUUsT0FBTztFQUN6QixVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGtCQUFlLEdBZ0V4QztFQTlEQyxBQUFBLG1DQUFZLENBQUM7SUFDWCxPQUFPLEVBQUUsY0FBYztJQUN2QixPQUFPLEVBQUUsSUFBSTtJQUNiLGNBQWMsRUFBRSxNQUFNO0lBQ3RCLFdBQVcsRUFBRSxNQUFNLEdBQ3BCO0VBRUQsQUFBQSxtQ0FBWSxDQUFDO0lBQ1gsYUFBYSxFQUFFLElBQ2pCLEdBQUU7RUFFRixBQUFBLGdDQUFTLENBQUM7SUFDUixLQUFLLEVicGVDLE9BQU87SWFxZWIsV0FBVyxFQUFFLE1BQU07SUFDbkIsU0FBUyxFQUFFLElBQUk7SUFDZixXQUFXLEVBQUUsSUFBSTtJQUNqQixVQUFVLEVBQUUsTUFBTTtJQUNsQixhQUFhLEVBQUUsS0FBSyxHQUNyQjtFQUVELEFBQUEsK0JBQVEsQ0FBQztJQUNQLE1BQU0sRUFBRSxJQUFJO0lBQ1osS0FBSyxFQUFFLFFBQVE7SUFDZixLQUFLLEViL2VDLE9BQU87SWFnZmIsV0FBVyxFQUFFLE1BQU07SUFDbkIsU0FBUyxFQUFFLElBQUk7SUFDZixXQUFXLEVBQUUsSUFBSTtJQUNqQixVQUFVLEVBQUUsTUFBTTtJQUNsQixhQUFhLEVBQUUsTUFBTSxHQUN0QjtFQUVELEFBQUEsOEJBQU8sQ0FBQztJQUNOLE1BQU0sRUFBRSxJQUFJO0lBQ1osS0FBSyxFQUFFLEtBQUs7SUFDWixLQUFLLEVieGZFLE9BQU87SWF5ZmQsV0FBVyxFQUFFLE1BQU07SUFDbkIsU0FBUyxFQUFFLElBQUk7SUFDZixXQUFXLEVBQUUsSUFBSTtJQUNqQixVQUFVLEVBQUUsTUFBTSxHQUNuQjtFQUVELEFBQUEsaUNBQVUsQ0FBQztJQUNULE9BQU8sRUFBRSxJQUFJO0lBQ2IsY0FBYyxFQUFFLEdBQUc7SUFDbkIsZUFBZSxFQUFFLE1BQU07SUFDdkIsVUFBVSxFQUFFLElBQUk7SUFDaEIsS0FBSyxFQUFFLElBQUksR0FlWjtJQXBCRCxBQU9FLGlDQVBRLENBT1IsTUFBTSxDQUFDO01BQ0wsTUFBTSxFQUFFLElBQUk7TUFDWixLQUFLLEVBQUUsS0FBSztNQUNaLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDYnpnQlosT0FBTztNYTBnQlosYUFBYSxFQUFFLEdBQUc7TUFDbEIsS0FBSyxFYjdnQkQsT0FBTztNYThnQlgsV0FBVyxFQUFFLE1BQU07TUFDbkIsU0FBUyxFQUFFLElBQUk7TUFDZixXQUFXLEVBQUUsSUFBSTtNQUNqQixVQUFVLEVBQUUsTUFBTTtNQUNsQixXQUFXLEVBQUUsR0FBRztNQUNoQixZQUFZLEVBQUUsR0FBRyxHQUNsQjs7QUNsakJMOztHQUVHO0FBT0gsQUFBQSxlQUFlLENBQUM7RUFFZCxPQUFPLEVkMENnQixFQUFFO0VjekN6QixXQUFXLEVBQUUsTUFBTTtFQUNuQixPQUFPLEVBQUUsSUFBSTtFQUNiLFNBQVMsRUFBRSxJQUFJO0VBQ2YsV0FBVyxFQUFFLE9BQU8sR0FDckI7O0FBRUQsQUFBQSxlQUFlLEFBQUEsbUJBQW1CLENBQUM7RUFDakMsT0FBTyxFQUFFLElBQUksR0FDZDs7QUFJRCxBQUFBLFFBQVEsQ0FBQztFQUNQLElBQUksRUFBRSxZQUFZO0VBQ2xCLFVBQVUsRWRISixJQUFJLEdjZVg7RUFUQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0lBTHJDLEFBTUksUUFOSSxDQU1KLGtCQUFrQixDQUFDO01BQ2pCLE9BQU8sRUFBRSxJQUFJLEdBQ2Q7SUFSTCxBQVVJLFFBVkksQ0FVSixhQUFhLENBQUM7TUFDWixPQUFPLEVBQUUsSUFBSSxHQUNkOztBQU1MLEFBQUEsWUFBWSxDQUFDO0VBQ1gsT0FBTyxFQUFFLElBQUk7RUFDYixjQUFjLEVBQUUsTUFBTTtFQUN0QixJQUFJLEVBQUUsWUFBWTtFQUNsQixLQUFLLEVBQUUsQ0FBQztFQUNSLFVBQVUsRWR6QkEsT0FBTztFYzBCakIsT0FBTyxFQUFFLEdBQUc7RUFDWixRQUFRLEVBQUUsUUFBUSxHQWlGbkI7RUEvRUMsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztJQVRyQyxBQUFBLFlBQVksQ0FBQztNQVVULFVBQVUsRUFBRSxNQUFNO01BQ2xCLFVBQVUsRUFBRSxNQUFNLEdBNkVyQjtFQXhGRCxBQWNFLFlBZFUsQ0FjViw0QkFBNEIsQ0FBQztJQUMzQixJQUFJLEVBQUUsUUFBUSxHQUNmO0VBRUQsQUFBQSw0QkFBaUIsQ0FBQztJQUNoQixJQUFJLEVBQUUsUUFBUTtJQUNkLE1BQU0sRUFBRSxPQUFPO0lBQ2YsS0FBSyxFQUFFLElBQUksR0FDWjtFQUVELEFBQUEsMkJBQWdCLENBQUM7SUFDZixNQUFNLEVBQUUsSUFBSTtJQUNaLEtBQUssRWQ1Q0ksT0FBTztJYzZDaEIsV0FBVyxFQUFFLE1BQU07SUFDbkIsU0FBUyxFQUFFLElBQUk7SUFDZixXQUFXLEVBQUUsSUFBSTtJQUNqQixVQUFVLEVBQUUsS0FBSztJQUNqQixPQUFPLEVBQUUsTUFBTSxHQUNoQjtFQUVELEFBQUEsNEJBQWlCLENBQUM7SUFDaEIsS0FBSyxFZGpETSxPQUFPO0lja0RsQixTQUFTLEVBQUUsSUFBSTtJQUNmLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDZHJETixPQUFPO0ljc0RsQixhQUFhLEVBQUUsTUFBTTtJQUNyQixnQkFBZ0IsRUFBRSxXQUFXO0lBQzdCLE1BQU0sRUFBRSxNQUFNO0lBQ2QsT0FBTyxFQUFFLFFBQVE7SUFDakIsSUFBSSxFQUFFLFFBQVEsR0FDZjtFQUVELEFBQUEscUJBQVUsQ0FBQztJQUNULGFBQWEsRUFBRSxHQUFHO0lBQ2xCLGdCQUFnQixFZGxFYixPQUFPO0ljbUVWLEtBQUssRWQ1REUsT0FBTztJYzZEZCxTQUFTLEVBQUUsSUFBSTtJQUNmLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLE9BQU8sRUFBRSxRQUFRO0lBQ2pCLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLFdBQVcsRUFBRSxHQUFHO0lBQ2hCLE1BQU0sRUFBRSxPQUFPO0lBQ2YsSUFBSSxFQUFFLFFBQVEsR0FDZjtFQUlDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7SUFGckMsQUFHSSwyQkFIWSxBQUdaLE9BQVEsQ0FBQztNQUNQLE9BQU8sRUFBRSxPQUFPO01BQ2hCLFNBQVMsRUFBRSxJQUFJO01BQ2YsS0FBSyxFZDlFSCxPQUFPO01jK0VULFFBQVEsRUFBRSxRQUFRO01BQ2xCLEdBQUcsRUFBRSxJQUFJO01BQ1QsSUFBSSxFQUFFLElBQUk7TUFDVixNQUFNLEVBQUUsT0FBTyxHQUNoQjtFQUlMLEFBQUEsOEJBQW1CLENBQUM7SUFDbEIsSUFBSSxFQUFFLFFBQVE7SUFDZCxLQUFLLEVkL0ZJLE9BQU87SWNnR2hCLFNBQVMsRUFBRSxJQUFJO0lBQ2YsV0FBVyxFQUFFLElBQUk7SUFDakIsVUFBVSxFQUFFLE1BQU07SUFDbEIsTUFBTSxFQUFFLFNBQVM7SUFDakIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENkcEdSLE9BQU87SWNxR2hCLGFBQWEsRUFBRSxHQUFHO0lBQ2xCLFdBQVcsRUFBRSxHQUFHO0lBQ2hCLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLE9BQU8sRUFBRSxRQUFRLEdBQ2xCOztBQUdILE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7RUFDakMsQUFBQSxZQUFZLEFBQUEsbUJBQW1CLENBQUM7SUFDOUIsT0FBTyxFQUFFLElBQUksR0FDZDs7QUFHSCxBQUFBLDBCQUEwQixDQUFDO0VBQ3pCLElBQUksRUFBRSxRQUFRLEdBQ2Y7O0FBRUQsQUFBQSxrQkFBa0IsQ0FBQztFQUNqQixXQUFXLEVBQUUsSUFBSTtFQUNqQixTQUFTLEVBQUUsSUFBSSxHQU1oQjtFQUhDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7SUFMckMsQUFBQSxrQkFBa0IsQ0FBQztNQU1mLE9BQU8sRUFBRSxJQUFJLEdBRWhCOztBQUVELEFBQUEsWUFBWSxBQUFBLFFBQVEsQ0FBQztFQUNuQixJQUFJLEVBQUUsU0FBUztFQUNmLFVBQVUsRUFBRSxPQUFrQjtFQUM5QixPQUFPLEVkcEdTLEVBQUU7RWNxR2xCLFFBQVEsRUFBRSxLQUFLO0VBQ2YsR0FBRyxFQUFFLElBQUk7RUFDVCxJQUFJLEVBQUUsQ0FBQztFQUNQLEtBQUssRUFBRSxDQUFDO0VBQ1IsTUFBTSxFQUFFLENBQUM7RUFDVCxPQUFPLEVBQUUsQ0FBQztFQUNWLFVBQVUsRUFBRSxPQUFPO0VBQ25CLFdBQVcsRUFBRSxTQUFTO0VBQ3RCLFVBQVUsRUFBRSxJQUFJO0VBQ2hCLFVBQVUsRUFBRSxtQkFBa0IsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUc7RUFDMUMsS0FBSyxFQUFFLEdBQUc7RUFDVixNQUFNLEVBQUUsaUJBQWlCLEdBQzFCOztBQUVELEFBQUEsZ0JBQWdCLENBQUM7RUFDZixPQUFPLEVkbkhpQixFQUFFO0Vjb0gxQixRQUFRLEVBQUUsS0FBSztFQUVmLE1BQU0sRUFBRSxJQUFJO0VBQ1osS0FBSyxFQUFFLElBQUk7RUFDWCxJQUFJLEVBQUUsQ0FBQztFQUNQLEtBQUssRUFBRSxDQUFDO0VBQ1IsTUFBTSxFQUFFLENBQUM7RUFDVCxPQUFPLEVBQUUsQ0FBQztFQUNWLFVBQVUsRUFBRSxPQUFPO0VBQ25CLGdCQUFnQixFQUFFLGtCQUFpQixHQUNwQzs7QUFJRCxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0VBQ2pDLEFBQUEsWUFBWSxDQUFDO0lBQ1gsT0FBTyxFQUFFLElBQUksR0FDZDtFQUVELEFBQUEsY0FBYyxDQUFDO0lBQ2IsT0FBTyxFQUFFLElBQUksR0FDZDtFQUVELEFBQUEsZUFBZSxDQUFDO0lBRWQsS0FBSyxFQUFFLEdBQUc7SUFDVixNQUFNLEVBQUUsSUFBSTtJQUNaLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsbUJBQWtCLEdBQ3pDOztBQUdILE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7RUFDakMsQUFBQSxlQUFlLENBQUM7SUFFZCxLQUFLLEVBQUUsR0FBRztJQUNWLE1BQU0sRUFBRSxJQUFJO0lBQ1osVUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxtQkFBa0IsR0FDekM7O0FBR0gsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsTUFBTTtFQUNsQyxBQUFBLGVBQWUsQ0FBQztJQUVkLEtBQUssRUFBRSxHQUFHO0lBQ1YsTUFBTSxFQUFFLElBQUk7SUFDWixVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLG1CQUFrQixHQUN6Qzs7QUFHSCxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0VBQ2pDLEFBQUEsWUFBWSxDQUFDO0lBQ1gsT0FBTyxFQUFFLElBQUksR0FDZDtFQUVELEFBQUEsY0FBYyxDQUFDO0lBQ2IsT0FBTyxFQUFFLElBQUksR0FDZDtFQUVELEFBQUEsZUFBZSxDQUFDO0lBRWQsTUFBTSxFQUFFLElBQUk7SUFDWixLQUFLLEVBQUUsSUFBSTtJQUNYLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLGdCQUFnQixFZHBOWixJQUFJLEdjcU5UO0VBRUQsQUFBQSxNQUFNLEFBQUEsVUFBVSxDQUFDO0lBQ2YsS0FBSyxFQUFFLElBQUk7SUFDWCxNQUFNLEVBQUUsSUFBSTtJQUNaLFNBQVMsRUFBRSxJQUFJO0lBQ2YsVUFBVSxFZDNOTixJQUFJO0ljNE5SLE1BQU0sRUFBRSxTQUFTLEdBQ2xCOztBQUlILEFBQUEsYUFBYSxDQUFDO0VBQ1osU0FBUyxFQUFFLElBQUk7RUFDZixXQUFXLEVBQUUsR0FBRztFQUNoQixXQUFXLEVBQUUsSUFBSTtFQUNqQixLQUFLLEVkNU5JLE9BQU87RWM2TmhCLFVBQVUsRUFBRSxHQUFHO0VBQ2YsYUFBYSxFQUFFLElBQUk7RUFDbkIsV0FBVyxFQUFFLE1BQU07RUFDbkIsYUFBYSxFQUFFLFFBQVE7RUFDdkIsUUFBUSxFQUFFLE1BQU07RUFDaEIsS0FBSyxFQUFFLElBQUk7RUFDWCxPQUFPLEVBQUUsS0FBSztFQUNkLFVBQVUsRUFBRSxNQUFNLEdBQ25COztBQUdELEFBQUEscUJBQXFCLENBQUM7RUFDcEIsV0FBVyxFQUFFLE1BQU07RUFDbkIsZUFBZSxFQUFFLFVBQVU7RUFDM0IsTUFBTSxFQUFFLFFBQVEsR0FDakI7O0FBRUQsQUFBQSxZQUFZLENBQUM7RUFDWCxjQUFjLEVBQUUsU0FBUyxHQUMxQjs7QUFFRCxBQUFBLHNCQUFzQixDQUFDO0VBQ3JCLGFBQWEsRUFBRSxHQUFHLEdBQ25COztBQ3BSRCxBQUFBLHNCQUFzQixDQUFDO0VBQ3JCLFdBQVcsRUFBRSxNQUFNLEdBQ3BCOztBQUVELEFBQUEseUJBQXlCLENBQUM7RUFDeEIsS0FBSyxFZm1CTSxPQUFPO0VlbEJsQixXQUFXLEVBQUUsSUFBSSxHQUNsQjs7QUFFRCxBQUFBLDZCQUE2QixDQUFDO0VBQzVCLEtBQUssRWZjTSxPQUFPO0VlYmxCLFdBQVcsRUFBRSxNQUFNLEdBS3BCO0VBUEQsQUFJRSw2QkFKMkIsQUFJM0IsTUFBTyxDQUFDO0lBQ04sS0FBSyxFZlNELElBQUksR2VSVDs7QUFJRCxBQUFBLDJCQUFVLENBQUM7RUFDVCxPQUFPLEVBQUUsSUFBSTtFQUNiLFVBQVUsRUFBRSxJQUFJO0VBQ2hCLFdBQVcsRUFBRSxHQUFHO0VBQ2hCLFFBQVEsRUFBRSxRQUFRLEdBQ25COztBQUVELEFBQUEsb0NBQW1CLENBQUM7RUFDbEIsTUFBTSxFQUFFLElBQUk7RUFDWixNQUFNLEVBQUUsSUFBSTtFQUNaLGdCQUFnQixFQUFFLFdBQVc7RUFDN0IsS0FBSyxFQUFFLE9BQU87RUFDZCxXQUFXLEVBQUUsSUFBSTtFQUNqQixVQUFVLEVBQUUsR0FBRztFQUNmLFFBQVEsRUFBRSxRQUFRLEdBQ25COztBQUVELEFBQUEsZ0NBQWUsQ0FBQztFQUNkLFNBQVMsRUFBRSxJQUFJO0VBQ2YsV0FBVyxFQUFFLEdBQUcsR0FDakI7O0FBRUQsQUFBQSx3QkFBTyxDQUFDO0VBQ04sUUFBUSxFQUFFLFFBQVE7RUFDbEIsS0FBSyxFQUFFLElBQUk7RUFDWCxHQUFHLEVBQUUsR0FBRyxHQUNUOztBQUVELEFBQUEsMkNBQTBCLEVBQzFCLEFBQUEsNkNBQTRCLENBQUM7RUFDM0IsV0FBVyxFQUFFLE1BQU07RUFDbkIsV0FBVyxFQUFFLElBQUk7RUFDakIsU0FBUyxFQUFFLElBQUk7RUFDZixXQUFXLEVBQUUsR0FBRyxHQUNqQjs7QUFFRCxBQUFBLDJDQUEwQixDQUFDO0VBQ3pCLEtBQUssRWZ4QkUsT0FBTztFZXlCZCxNQUFNLEVBQUUsSUFBSTtFQUNaLE9BQU8sRUFBRSxZQUFZLEdBQ3RCOztBQUVELEFBQUEsNkNBQTRCLENBQUM7RUFDM0IsS0FBSyxFZnRDSSxPQUFPLEdldUNqQjs7QUFFRCxBQUFBLG1DQUFrQixDQUFDO0VBQ2pCLFdBQVcsRUFBRSxJQUFJO0VBQ2pCLEtBQUssRUFBRSxHQUFHO0VBQ1YsUUFBUSxFQUFFLE1BQU07RUFDaEIsYUFBYSxFQUFFLFFBQVEsR0FDeEI7O0FBRUQsQUFDRSw0QkFEUyxBQUNULE1BQU8sQ0FBQztFQUNOLFVBQVUsRWZqRFQsd0JBQU87RWVrRFIsTUFBTSxFQUFFLE9BQU8sR0FLaEI7RUFSSCxBQUtJLDRCQUxPLEFBQ1QsTUFBTyxDQUlMLEtBQUssQ0FBQztJQUNKLFVBQVUsRWZyRFgsd0JBQU8sR2VzRFA7O0FDL0VQLEFBQUEsb0JBQW9CLENBQUM7RUFDbkIsT0FBTyxFQUFFLElBQUk7RUFDYixTQUFTLEVBQUUsYUFBYTtFQUN4QixPQUFPLEVBQUUsRUFBRTtFQUNYLFdBQVcsRUFBRSxNQUFNLEdBVXBCO0VBUkMsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztJQU5yQyxBQUFBLG9CQUFvQixDQUFDO01BT2pCLEtBQUssRUFBRSxJQUFJO01BQ1gsVUFBVSxFQUFFLElBQUksR0FNbkI7RUFkRCxBQVdFLG9CQVhrQixDQVdsQixPQUFPLENBQUM7SUFDTixJQUFJLEVBQUUsUUFBUSxHQUNmOztBQUdILEFBQUEsaUJBQWlCLENBQUM7RUFDaEIsZ0JBQWdCLEVBQUUsSUFBSTtFQUN0QixVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLG1CQUFrQjtFQUMxQyxPQUFPLEVBQUUsZ0JBQWdCO0VBQ3pCLFFBQVEsRUFBRSxRQUFRO0VBRWxCLFdBQVcsRUFBRSxNQUFNO0VBQ25CLE9BQU8sRUFBRSxJQUFJO0VBQ2IsU0FBUyxFQUFFLGFBQWE7RUFDeEIsS0FBSyxFQUFFLEtBQUs7RUFDWixJQUFJLEVBQUUsUUFBUSxHQVFmO0VBTkMsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztJQVpyQyxBQUFBLGlCQUFpQixDQUFDO01BYWQsR0FBRyxFQUFFLENBQUM7TUFDTixLQUFLLEVBQUUsSUFBSTtNQUNYLFVBQVUsRUFBRSxJQUFJO01BQ2hCLE9BQU8sRUFBRSxJQUFJLEdBRWhCOztBQUVELGlCQUFpQjtBQUVqQixBQUFhLFlBQUQsQ0FBQyxPQUFPLENBQUM7RUFDbkIsTUFBTSxFQUFFLFFBQVEsR0FDakI7O0FBRUQsQUFBYSxZQUFELENBQUMsS0FBSyxDQUFDO0VBQ2pCLEtBQUssRUFBRSxJQUFJO0VBQ1gsU0FBUyxFQUFFLElBQUksR0FDaEI7O0FBRUQsQUFBQSxjQUFjLENBQUM7RUFDYixhQUFhLEVBQUUsR0FBRztFQUNsQixLQUFLLEVBQUUsSUFBSTtFQUNYLE1BQU0sRUFBRSxJQUFJO0VBQ1osTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENoQjFCWixPQUFPO0VnQjJCWixVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGtCQUFpQjtFQUN2QyxRQUFRLEVBQUUsUUFBUTtFQUNsQixHQUFHLEVBQUUsS0FBSztFQUNWLE9BQU8sRUFBRSxFQUFFO0VBQ1gsT0FBTyxFQUFFLEdBQUc7RUFDWixnQkFBZ0IsRWhCbENWLElBQUksR2dCd0NYO0VBSkMsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztJQVpyQyxBQUFBLGNBQWMsQ0FBQztNQWFYLFFBQVEsRUFBRSxRQUFRO01BQ2xCLEdBQUcsRUFBRSxDQUFDLEdBRVQ7O0FBRUQsQUFBQSwwQkFBMEIsQ0FBQztFQUN6QixLQUFLLEVBQUUsR0FBRztFQUNWLFFBQVEsRUFBRSxRQUFRLEdBaURuQjtFQW5ERCxBQUlFLDBCQUp3QixDQUl4QixRQUFRLENBQUM7SUFDUCxhQUFhLEVBQUUsR0FBRyxHQUNuQjtFQU5ILEFBUUUsMEJBUndCLENBUXhCLFlBQVksQ0FBQztJQUNYLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDaEJsRFIsT0FBTztJZ0JtRGhCLGFBQWEsRUFBRSxHQUFHO0lBQ2xCLE1BQU0sRUFBRSxVQUFVO0lBQ2xCLFNBQVMsRUFBRSxJQUFJO0lBQ2YsV0FBVyxFQUFFLE1BQU07SUFDbkIsV0FBVyxFQUFFLE1BQU0sR0FDcEI7RUFmSCxBQWlCRSwwQkFqQndCLENBaUJ4QixzQkFBc0IsQ0FBQztJQUNyQixNQUFNLEVBQUUscUJBQXFCLEdBQzlCO0VBRUQsQUFBQSx5Q0FBZ0IsQ0FBQztJQUNmLE9BQU8sRUFBRSxJQUFJLEdBQ2Q7RUFFRCxBQUNFLGlDQURNLENBQ04sS0FBSztFQURQLEFBRUUsaUNBRk0sQ0FFTixzQkFBc0IsQ0FBQztJQUNyQixZQUFZLEVoQnJGWixJQUFJLENnQnFGZSxVQUFVLEdBQzlCO0VBSkgsQUFNRSxpQ0FOTSxDQU1OLHlDQUF5QyxDQUFDO0lBQ3hDLE9BQU8sRUFBRSxLQUFLO0lBQ2QsUUFBUSxFQUFFLFFBQVE7SUFDbEIsTUFBTSxFQUFFLEdBQUc7SUFDWCxTQUFTLEVBQUUsSUFBSTtJQUNmLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLElBQUksRUFBRSxHQUFHO0lBQ1QsS0FBSyxFaEIvRkwsSUFBSSxHZ0JnR0w7RUF2Q0wsQUEwQ0UsMEJBMUN3QixDQTBDeEIseUNBQXlDLENBQUM7SUFDeEMsT0FBTyxFQUFFLEtBQUs7SUFDZCxRQUFRLEVBQUUsUUFBUTtJQUNsQixNQUFNLEVBQUUsR0FBRztJQUNYLFNBQVMsRUFBRSxJQUFJO0lBQ2YsV0FBVyxFQUFFLElBQUk7SUFDakIsSUFBSSxFQUFFLEdBQUc7SUFDVCxLQUFLLEVoQjFHSCxJQUFJLEdnQjJHUDs7QUFHSCxBQUFBLGtCQUFrQixDQUFDO0VBQ2pCLEtBQUssRUFBRSxJQUFJLEdBQ1o7O0FBRUQsQUFBQSxzQkFBc0IsQ0FBQztFQUNyQixLQUFLLEVBQUUsSUFBSTtFQUNYLE1BQU0sRUFBRSxJQUFJO0VBQ1osYUFBYSxFQUFFLEdBQUc7RUFDbEIsZ0JBQWdCLEVBQUUsT0FBTztFQUN6QixZQUFZLEVBQUUsQ0FBQztFQUNmLFlBQVksRUFBRSxJQUFJO0VBQ2xCLE9BQU8sRUFBRSxJQUFJO0VBQ2IsZUFBZSxFQUFFLGFBQWE7RUFDOUIsV0FBVyxFQUFFLE1BQU07RUFDbkIsWUFBWSxFQUFFLElBQUk7RUFDbEIsYUFBYSxFQUFFLElBQUk7RUFDbkIsU0FBUyxFQUFFLElBQUk7RUFDZixLQUFLLEVoQnZHSSxPQUFPLEdnQndHakI7O0FBRUQsQUFBQSwwQkFBMEIsQ0FBQztFQUN6QixPQUFPLEVBQUUsSUFBSTtFQUNiLGNBQWMsRUFBRSxHQUFHO0VBQ25CLGVBQWUsRUFBRSxhQUFhLEdBQy9COztBQUVELEFBQUEsdUJBQXVCLENBQUM7RUFDdEIsT0FBTyxFQUFFLElBQUk7RUFDYixjQUFjLEVBQUUsR0FBRztFQUNuQixlQUFlLEVBQUUsYUFBYSxHQUMvQjs7QUFHQyxBQUFBLHNCQUFPLENBQUM7RUFDTixLQUFLLEVoQjVITSxPQUFPO0VnQjZIbEIsTUFBTSxFQUFFLE9BQU8sR0FNaEI7RUFKQyxBQUFBLGdDQUFXLENBQUM7SUFDVixLQUFLLEVoQnRKSCxJQUFJO0lnQnVKTixNQUFNLEVBQUUsT0FBTyxHQUNoQjs7QUFJTCxBQUFBLGdDQUFnQyxDQUFDO0VBQy9CLEtBQUssRWhCdklRLE9BQU87RWdCd0lwQixTQUFTLEVBQUUsSUFBSTtFQUNmLE1BQU0sRUFBRSxPQUFPLEdBQ2hCOztBQUVELEFBQUEsdUJBQXVCLENBQUM7RUFDdEIsUUFBUSxFQUFFLEtBQUs7RUFDZixHQUFHLEVBQUUsQ0FBQztFQUNOLElBQUksRUFBRSxDQUFDO0VBQ1AsT0FBTyxFQUFFLElBQUk7RUFDYixLQUFLLEVBQUUsSUFBSTtFQUNYLE1BQU0sRUFBRSxJQUFJLEdBQ2I7O0FBRUQsQUFBQSxnQ0FBZ0MsQ0FBQztFQUMvQixRQUFRLEVBQUUsUUFBUTtFQUNsQixNQUFNLEVBQUUsSUFBSTtFQUNaLEtBQUssRUFBRSxLQUFLO0VBQ1osTUFBTSxFQUFFLEtBQUs7RUFDYixnQkFBZ0IsRWhCL0pWLElBQUk7RWdCZ0tWLE9BQU8sRUFBRSxDQUFDO0VBQ1YsVUFBVSxFaEIvSkwsT0FBTyxDZ0IrSk0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHO0VBQ3pCLE9BQU8sRUFBRSxJQUFJO0VBQ2IsT0FBTyxFQUFFLFNBQVM7RUFDbEIsU0FBUyxFQUFFLElBQUk7RUFDZixhQUFhLEVBQUUsR0FBRztFQUNsQixXQUFXLEVBQUUsTUFBTTtFQUNuQixXQUFXLEVBQUUsR0FBRyxHQUNqQjs7QUFFRCxBQUFBLGtCQUFrQixDQUFDO0VBQ2pCLE1BQU0sRUFBRSxJQUFJO0VBQ1osS0FBSyxFQUFFLElBQUk7RUFDWCxPQUFPLEVBQUUsSUFBSTtFQUNiLFVBQVUsRWhCOUtKLElBQUk7RWdCK0tWLFFBQVEsRUFBRSxRQUFRO0VBQ2xCLFNBQVMsRUFBRSxhQUFhO0VBQ3hCLElBQUksRUFBRSxLQUFLO0VBQ1gsR0FBRyxFQUFFLEtBQUs7RUFDVixVQUFVLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENoQmpMbEIsT0FBTyxHZ0JrTGI7O0FBRUQsQUFBaUMsZ0NBQUQsQ0FBQyxLQUFLLENBQUEsQUFBQSxJQUFDLENBQUssUUFBUSxBQUFiLENBQWMsMkJBQTJCLENBQUM7RUFDL0Usa0JBQWtCLEVBQUUsSUFBSTtFQUN4QixPQUFPLEVBQUUsSUFBSSxHQUNkOztBQUVELEFBQWlDLGdDQUFELENBQUMsS0FBSyxDQUFBLEFBQUEsSUFBQyxDQUFLLFFBQVEsQUFBYixDQUFjLE1BQU0sQUFBQSwyQkFBMkIsQ0FBQztFQUNyRixrQkFBa0IsRUFBRSxJQUFJO0VBQ3hCLE9BQU8sRUFBRSxJQUFJLEdBQ2Q7O0FBRUQsQUFBQSxzQkFBc0IsQ0FBQztFQUNyQixRQUFRLEVBQUUsUUFBUSxHQUNuQjs7QUFFRCxBQUFBLFlBQVksQ0FBQztFQUNYLE9BQU8sRUFBRSxJQUFJO0VBQ2IsZUFBZSxFQUFFLE1BQU0sR0FDeEI7O0FBRUQsQUFBQSxrQkFBa0IsQ0FBQztFQUNqQixTQUFTLEVBQUUsSUFBSTtFQUNmLEtBQUssRWhCcE1HLE9BQU8sR2dCcU1oQjs7QUFFRCxBQUFBLG1CQUFtQixDQUFDO0VBQ2xCLGNBQWMsRUFBRSxJQUFJLEdBQ3JCOztBQUVELEFBQUEsd0JBQXdCLENBQUM7RUFDdkIsYUFBYSxFQUFFLEdBQUcsR0FDbkI7O0FBRUQsQUFBeUIsd0JBQUQsQ0FBQyxDQUFDLENBQUM7RUFDekIsS0FBSyxFaEJuTlUsT0FBTztFZ0JvTnRCLFdBQVcsRUFBRSxHQUFHLEdBQ2pCOztBQUVELEFBQUEsb0JBQW9CLENBQUM7RUFDbkIsS0FBSyxFQUFFLEtBQUs7RUFDWixNQUFNLEVBQUUsSUFBSTtFQUNaLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDaEI1TlosT0FBTztFZ0I2TlosU0FBUyxFQUFFLElBQUk7RUFDZixLQUFLLEVoQnhOSyxPQUFPO0VnQnlOakIsWUFBWSxFQUFFLEdBQUcsR0FDbEI7O0FBRUQsQUFBQSw0QkFBNEIsQ0FBQztFQUMzQixRQUFRLEVBQUUsUUFBUSxHQUNuQjs7QUFFRCxBQUFBLHlCQUF5QixDQUFDO0VBQ3hCLFFBQVEsRUFBRSxRQUFRO0VBQ2xCLEdBQUcsRUFBRSxHQUFHO0VBQ1IsS0FBSyxFQUFFLElBQUk7RUFDWCxTQUFTLEVBQUUsSUFBSTtFQUNmLEtBQUssRWhCek9VLE9BQU8sR2dCME92Qjs7QUFFRCxBQUFBLHlCQUF5QixDQUFDO0VBQ3hCLFFBQVEsRUFBRSxRQUFRO0VBQ2xCLEdBQUcsRUFBRSxDQUFDO0VBQ04sS0FBSyxFQUFFLEdBQUc7RUFDVixLQUFLLEVBQUUsSUFBSTtFQUNYLE1BQU0sRUFBRSxJQUFJO0VBQ1osTUFBTSxFQUFFLGlCQUFpQjtFQUN6QixXQUFXLEVBQUUsQ0FBQztFQUNkLE9BQU8sRUFBRSxJQUFJO0VBQ2IsY0FBYyxFQUFFLE1BQU07RUFDdEIsS0FBSyxFQUFFLE9BQU87RUFDZCxTQUFTLEVBQUUsSUFBSTtFQUNmLE9BQU8sRUFBRSxPQUFPO0VBQ2hCLE1BQU0sRUFBRSxPQUFPLEdBQ2hCOztBQUdDLEFBQUEsa0JBQVMsQ0FBQztFQUNSLE9BQU8sRUFBRSxZQUFZO0VBQ3JCLFlBQVksRUFBRSxHQUFHLEdBQ2xCOztBQUVELEFBQUEsa0JBQVMsQ0FBQztFQUNSLE9BQU8sRUFBRSxZQUFZLEdBQ3RCOztBQUlELEFBQUEsbUJBQVEsQ0FBQztFQUNQLEtBQUssRWhCcFFFLE9BQU87RWdCcVFkLFNBQVMsRUFBRSxJQUFJO0VBQ2YsV0FBVyxFQUFFLElBQUksR0FDbEI7O0FBRUQsQUFBQSxzQkFBVyxDQUFDO0VBQ1YsTUFBTSxFQUFFLFdBQVc7RUFDbkIsU0FBUyxFQUFFLElBQUk7RUFDZixXQUFXLEVBQUUsSUFBSSxHQUNsQjs7QUFFRCxBQUFBLHlCQUFjLEVBQ2QsQUFBQSwyQkFBZ0IsQ0FBQztFQUNmLEtBQUssRUFBRSxLQUFLO0VBQ1osVUFBVSxFQUFFLE1BQU0sR0FDbkI7O0FBRUQsQUFBQSxtQ0FBd0IsQ0FBQztFQUN2QixPQUFPLEVBQUUsRUFBRTtFQUNYLE1BQU0sRUFBRSxJQUFJLEdBQ2I7O0FBR0gsQUFBQSxXQUFXLENBQUM7RUFDVixPQUFPLEVBQUUsSUFBSTtFQUNiLFNBQVMsRUFBRSxhQUFhO0VBQ3hCLE9BQU8sRUFBRSxFQUFFO0VBQ1gsV0FBVyxFQUFFLE1BQU0sR0EwRXBCO0VBeEVDLEFBQUEsb0JBQVUsQ0FBQztJQUNULEtBQUssRUFBRSxLQUFLO0lBQ1osTUFBTSxFQUFFLEtBQUs7SUFDYixnQkFBZ0IsRUFBRSxJQUFJO0lBQ3RCLFVBQVUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsbUJBQWtCO0lBQzFDLE9BQU8sRUFBRSxnQkFBZ0I7SUFDekIsUUFBUSxFQUFFLFFBQVE7SUFFbEIsV0FBVyxFQUFFLE1BQU07SUFDbkIsT0FBTyxFQUFFLElBQUk7SUFDYixTQUFTLEVBQUUsYUFBYTtJQUN4QixJQUFJLEVBQUUsUUFBUSxHQVFmO0lBTkMsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztNQWJyQyxBQUFBLG9CQUFVLENBQUM7UUFjUCxHQUFHLEVBQUUsQ0FBQztRQUNOLEtBQUssRUFBRSxJQUFJO1FBQ1gsVUFBVSxFQUFFLElBQUk7UUFDaEIsT0FBTyxFQUFFLElBQUksR0FFaEI7RUF6QkgsQUEyQkUsV0EzQlMsQ0EyQlQsVUFBVSxDQUFDO0lBQ1QsUUFBUSxFQUFFLFFBQVE7SUFDbEIsR0FBRyxFQUFFLEtBQUs7SUFDVixPQUFPLEVBQUUsRUFBRSxHQU9aO0lBTEMsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztNQWhDdkMsQUEyQkUsV0EzQlMsQ0EyQlQsVUFBVSxDQUFDO1FBTVAsUUFBUSxFQUFFLFFBQVE7UUFDbEIsR0FBRyxFQUFFLENBQUM7UUFDTixJQUFJLEVBQUUsUUFBUSxHQUVqQjtFQUVELEFBQUEsa0JBQVEsQ0FBQztJQUNQLEtBQUssRWhCblVFLE9BQU87SWdCb1VkLFNBQVMsRUFBRSxJQUFJO0lBQ2YsV0FBVyxFQUFFLElBQUksR0FDbEI7RUFFRCxBQUFBLHdCQUFjLEVBQ2QsQUFBQSx5QkFBZSxFQUNmLEFBQUEseUJBQWUsQ0FBQztJQUNkLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFNBQVMsRUFBRSxJQUFJO0lBQ2YsV0FBVyxFQUFFLElBQUk7SUFDakIsVUFBVSxFQUFFLE1BQU0sR0FDbkI7RUFFRCxBQUFBLDBCQUFnQixDQUFDO0lBQ2YsU0FBUyxFQUFFLElBQUk7SUFDZixXQUFXLEVBQUUsSUFBSTtJQUNqQixVQUFVLEVBQUUsSUFBSSxHQUtqQjtJQVJELEFBS0UsMEJBTGMsQ0FLZCxzQkFBc0IsQ0FBQztNQUNyQixhQUFhLEVBQUUsSUFBSSxHQUNwQjtFQUdILEFBQUEseUJBQWUsQ0FBQztJQUNkLE9BQU8sRUFBRSxJQUFJO0lBQ2IsU0FBUyxFQUFFLGFBQWE7SUFDeEIsV0FBVyxFQUFFLE1BQU07SUFDbkIsSUFBSSxFQUFFLFFBQVEsR0FTZjtJQVBDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7TUFOckMsQUFBQSx5QkFBZSxDQUFDO1FBT1osVUFBVSxFQUFFLElBQUksR0FNbkI7SUFiRCxBQVVFLHlCQVZhLENBVWIsTUFBTSxDQUFDO01BQ0wsS0FBSyxFQUFFLEtBQUssR0FDYjs7QUFLSCxBQUFBLHdDQUFzQixDQUFDO0VBQ3JCLEtBQUssRUFBRSxJQUFJLEdBQ1o7O0FBSUQsQUFBQSxtQkFBWSxDQUFDO0VBRVgsS0FBSyxFQUFFLEtBQUs7RUFDWixhQUFhLEVBQUUsR0FBRztFQUNsQixnQkFBZ0IsRWhCL1haLElBQUk7RWdCZ1lSLFVBQVUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsbUJBQWtCO0VBQzFDLE9BQU8sRUFBRSxJQUFJO0VBQ2IsU0FBUyxFQUFFLGFBQWE7RUFDeEIsT0FBTyxFQUFFLEVBQUU7RUFDWCxXQUFXLEVBQUUsTUFBTTtFQUNuQixXQUFXLEVBQUUsTUFBTTtFQUNuQixRQUFRLEVBQUUsUUFBUSxHQVFuQjtFQU5DLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7SUFickMsQUFBQSxtQkFBWSxDQUFDO01BY1QsS0FBSyxFQUFFLElBQUk7TUFDWCxHQUFHLEVBQUUsQ0FBQztNQUNOLFVBQVUsRUFBRSxJQUFJO01BQ2hCLElBQUksRUFBRSxRQUFRLEdBRWpCOztBQUVELEFBQUEsb0NBQTZCLENBQUM7RUFDNUIsT0FBTyxFQUFFLEVBQUUsR0FNWjtFQUpDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7SUFIckMsQUFBQSxvQ0FBNkIsQ0FBQztNQUkxQixRQUFRLEVBQUUsUUFBUTtNQUNsQixHQUFHLEVBQUUsQ0FBQyxHQUVUOztBQUVELEFBQUEsMEJBQW1CLENBQUM7RUFDbEIsYUFBYSxFQUFFLEdBQUc7RUFDbEIsS0FBSyxFQUFFLElBQUk7RUFDWCxNQUFNLEVBQUUsSUFBSTtFQUNaLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDaEIzWmQsT0FBTztFZ0I0WlYsT0FBTyxFQUFFLEVBQUU7RUFDWCxPQUFPLEVBQUUsR0FBRztFQUNaLGdCQUFnQixFaEJoYVosSUFBSSxHZ0JpYVQ7O0FBRUQsQUFBQSx5QkFBa0IsQ0FBQztFQUNqQixLQUFLLEVBQUUsT0FBTztFQUNkLFNBQVMsRUFBRSxjQUFjO0VBQ3pCLFFBQVEsRUFBRSxRQUFRO0VBQ2xCLEdBQUcsRUFBRSxJQUFJO0VBQ1QsSUFBSSxFQUFFLENBQUM7RUFDUCxTQUFTLEVBQUUsTUFBTSxHQUNsQjs7QUFFRCxBQUFBLDBCQUFtQixDQUFDO0VBQ2xCLGdCQUFnQixFaEI3YVosSUFBSTtFZ0I4YVIsTUFBTSxFQUFFLElBQUk7RUFDWixLQUFLLEVBQUUsSUFBSTtFQUNYLFFBQVEsRUFBRSxRQUFRO0VBQ2xCLEdBQUcsRUFBRSxJQUFJO0VBQ1QsSUFBSSxFQUFFLEtBQUs7RUFDWCxhQUFhLEVBQUUsR0FBRztFQUNsQixPQUFPLEVBQUUsR0FBRyxHQUtiO0VBSEMsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztJQVZyQyxBQUFBLDBCQUFtQixDQUFDO01BV2hCLEdBQUcsRUFBRSxJQUFJLEdBRVo7O0FBRUQsQUFBQSxnQkFBUyxDQUFDO0VBQ1IsTUFBTSxFQUFFLElBQUk7RUFDWixLQUFLLEVBQUUsS0FBSztFQUNaLGdCQUFnQixFaEI1YU4sT0FBTztFZ0I2YWpCLFFBQVEsRUFBRSxRQUFRO0VBQ2xCLE9BQU8sRUFBRSxJQUFJO0VBQ2IsZUFBZSxFQUFFLE1BQU07RUFDdkIsV0FBVyxFQUFFLE1BQU0sR0FNcEI7RUFKQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0lBVHJDLEFBQUEsZ0JBQVMsQ0FBQztNQVVOLE1BQU0sRUFBRSxJQUFJO01BQ1osS0FBSyxFQUFFLEtBQUssR0FFZjs7QUFFRCxBQUFBLG9CQUFhLENBQUM7RUFDWixNQUFNLEVBQUUsSUFBSTtFQUNaLEtBQUssRUFBRSxJQUFJO0VBQ1gsVUFBVSxFaEIzYkEsT0FBTztFZ0I0YmpCLFFBQVEsRUFBRSxRQUFRO0VBQ2xCLFNBQVMsRUFBRSxhQUFhO0VBQ3hCLElBQUksRUFBRSxLQUFLO0VBQ1gsR0FBRyxFQUFFLElBQUksR0FRVjtFQU5DLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7SUFUckMsQUFBQSxvQkFBYSxDQUFDO01BVVYsR0FBRyxFQUFFLElBQUk7TUFDVCxJQUFJLEVBQUUsQ0FBQztNQUNQLEtBQUssRUFBRSxDQUFDO01BQ1IsTUFBTSxFQUFFLE1BQU0sR0FFakI7O0FBRUQsQUFBQSxlQUFRLENBQUM7RUFDUCxLQUFLLEVoQm5kRSxPQUFPO0VnQm9kZCxTQUFTLEVBQUUsSUFBSTtFQUNmLFdBQVcsRUFBRSxJQUFJO0VBQ2pCLFVBQVUsRUFBRSxNQUFNO0VBQ2xCLFVBQVUsRUFBRSxJQUFJLEdBQ2pCOztBQUVELEFBQUEsY0FBTyxDQUFDO0VBQ04sS0FBSyxFaEJsZkYsT0FBTztFZ0JtZlYsU0FBUyxFQUFFLElBQUk7RUFDZixXQUFXLEVBQUUsR0FBRztFQUNoQixXQUFXLEVBQUUsSUFBSTtFQUNqQixVQUFVLEVBQUUsTUFBTTtFQUNsQixVQUFVLEVBQUUsSUFBSTtFQUNoQixLQUFLLEVBQUUsS0FBSyxHQUNiOztBQUVELEFBQUEsZUFBUSxDQUFDO0VBQ1AsU0FBUyxFQUFFLElBQUk7RUFDZixXQUFXLEVBQUUsSUFBSTtFQUNqQixJQUFJLEVBQUUsR0FBRztFQUNULEtBQUssRWhCaGdCSCxJQUFJLEdnQmlnQlA7O0FBRUQsQUFBQSxzQkFBZSxDQUFDO0VBQ2QsS0FBSyxFaEJwZ0JILElBQUksR2dCcWdCUDs7QUFFRCxBQUFBLGNBQU8sQ0FBQztFQUNOLE1BQU0sRUFBRSxNQUFNO0VBQ2QsS0FBSyxFQUFFLElBQUksR0FTWjtFQVBDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7SUFKckMsQUFBQSxjQUFPLENBQUM7TUFLSixPQUFPLEVBQUUsTUFBTTtNQUNmLE1BQU0sRUFBRSxDQUFDO01BQ1QsTUFBTSxFQUFFLENBQUM7TUFDVCxVQUFVLEVBQUUsSUFBSTtNQUNoQixJQUFJLEVBQUUsUUFBUSxHQUVqQjs7QUFFRCxBQUFBLHFCQUFjLEVBQ2QsQUFBQSwwQkFBbUIsQ0FBQztFQUNsQixLQUFLLEVBQUUsSUFBSTtFQUNYLE9BQU8sRUFBRSxJQUFJO0VBQ2IsU0FBUyxFQUFFLE1BQU07RUFDakIsV0FBVyxFQUFFLE1BQU0sR0FDcEI7O0FBRUQsQUFBQSxrQkFBVyxDQUFDO0VBQ1YsTUFBTSxFQUFFLGVBQWU7RUFDdkIsUUFBUSxFQUFFLFFBQVE7RUFDbEIsT0FBTyxFQUFFLElBQUk7RUFDYixTQUFTLEVBQUUsR0FBRztFQUNkLElBQUksRUFBRSxRQUFRO0VBQ2QsZUFBZSxFQUFFLGFBQWEsR0FDL0I7O0FBRUQsQUFBQSxvQkFBYSxDQUFDO0VBQ1osSUFBSSxFQUFFLFFBQVEsR0FDZjs7QUFFRCxBQUFBLG9CQUFhLENBQUM7RUFDWixLQUFLLEVoQmxoQkUsT0FBTztFZ0JtaEJkLFdBQVcsRUFBRSxNQUFNO0VBQ25CLFNBQVMsRUFBRSxJQUFJO0VBQ2YsV0FBVyxFQUFFLElBQUk7RUFDakIsS0FBSyxFQUFFLElBQUksR0FDWjs7QUFFRCxBQUFBLHVCQUFnQixDQUFDO0VBQ2YsTUFBTSxFQUFFLElBQUk7RUFDWixLQUFLLEVBQUUsSUFBSTtFQUNYLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDaEJuaUJkLE9BQU87RWdCb2lCVixhQUFhLEVBQUUsR0FBRztFQUNsQixnQkFBZ0IsRWhCdmlCWixJQUFJO0VnQndpQlIsV0FBVyxFQUFFLE1BQU07RUFDbkIsV0FBVyxFQUFFLElBQUk7RUFDakIsU0FBUyxFQUFFLElBQUk7RUFDZixLQUFLLEVoQnBpQkMsT0FBTztFZ0JxaUJiLFFBQVEsRUFBRSxRQUFRLEdBd0JuQjtFQXRCQyxBQUFBLG1DQUFhLENBQUM7SUFDWixRQUFRLEVBQUUsS0FBSztJQUNmLEdBQUcsRUFBRSxDQUFDO0lBQ04sSUFBSSxFQUFFLENBQUM7SUFDUCxPQUFPLEVBQUUsSUFBSTtJQUNiLEtBQUssRUFBRSxJQUFJO0lBQ1gsTUFBTSxFQUFFLElBQUksR0FDYjtFQUVELEFBQUEsNkJBQU8sQ0FBQztJQUNOLE9BQU8sRUFBRSxJQUFJO0lBQ2IsUUFBUSxFQUFFLFFBQVE7SUFDbEIsTUFBTSxFQUFFLEtBQUs7SUFDYixLQUFLLEVBQUUsSUFBSTtJQUNYLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDaEJ4aUJkLE9BQU87SWdCeWlCVixhQUFhLEVBQUUsR0FBRztJQUNsQixnQkFBZ0IsRWhCOWpCZCxJQUFJO0lnQitqQk4sVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxtQkFBa0I7SUFDMUMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLElBQUk7SUFDakIsVUFBVSxFQUFFLE1BQU0sR0FDbkI7O0FBR0gsQUFBQSx5QkFBa0IsQ0FBQztFQUNqQixRQUFRLEVBQUUsUUFBUSxHQU9uQjtFQUxDLEFBQUEscUNBQWEsQ0FBQztJQUNaLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLEdBQUcsRUFBRSxJQUFJO0lBQ1QsS0FBSyxFQUFFLElBQUksR0FDWjs7QUFJRCxBQUFBLGdDQUFRLEVBQVQsQUFBQywrQkFBUSxDQUFDO0VBQ1AsTUFBTSxFQUFFLElBQUk7RUFDWixLQUFLLEVBQUUsSUFBSTtFQUNYLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDaEJsbEJoQixPQUFPO0VnQm1sQlIsYUFBYSxFQUFFLEdBQUc7RUFDbEIsZ0JBQWdCLEVoQnRsQmQsSUFBSTtFZ0J1bEJOLEtBQUssRWhCdGxCRSxPQUFPO0VnQnVsQmQsT0FBTyxFQUFFLElBQUk7RUFDYixXQUFXLEVBQUUsTUFBTTtFQUNuQixTQUFTLEVBQUUsSUFBSTtFQUNmLFdBQVcsRUFBRSxJQUFJO0VBQ2pCLFdBQVcsRUFBRSxHQUFHLEdBQ2pCOztBQUdILEFBQUEsb0JBQWEsQ0FBQztFQUNaLEtBQUssRWhCNWxCTSxPQUFPO0VnQjZsQmxCLFdBQVcsRUFBRSxNQUFNO0VBQ25CLFNBQVMsRUFBRSxJQUFJO0VBQ2YsSUFBSSxFQUFFLEdBQUc7RUFDVCxNQUFNLEVBQUUsSUFBSTtFQUNaLE1BQU0sRUFBRSxPQUFPLEdBQ2hCOztBQUVELEFBQUEseUJBQWtCLENBQUM7RUFDakIsS0FBSyxFQUFFLElBQUksR0FDWjs7QUFFRCxBQUFBLGdDQUF5QixDQUFDO0VBQ3hCLE9BQU8sRUFBRSxJQUFJO0VBQ2IsV0FBVyxFQUFFLE1BQU07RUFDbkIsZUFBZSxFQUFFLE1BQU07RUFDdkIsTUFBTSxFQUFFLElBQUk7RUFDWixLQUFLLEVBQUUsSUFBSTtFQUNYLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDaEI5bUJOLE9BQU87RWdCK21CbEIsYUFBYSxFQUFFLEdBQUc7RUFDbEIsZ0JBQWdCLEVoQnJuQlosSUFBSTtFZ0JzbkJSLE9BQU8sRUFBRSxHQUFHO0VBQ1osUUFBUSxFQUFFLFFBQVE7RUFDbEIsS0FBSyxFQUFFLElBQUk7RUFDWCxHQUFHLEVBQUUsSUFBSTtFQUNULE1BQU0sRUFBRSxPQUFPLEdBQ2hCOztBQUVELEFBQUEsc0JBQWUsQ0FBQztFQUNkLEtBQUssRWhCem5CTSxPQUFPLEdnQjBuQm5COztBQUdDLEFBQUEsK0JBQVEsQ0FBQztFQUNQLE9BQU8sRUFBRSxRQUFRLEdBQ2xCOztBQUdILEFBQUEsZ0JBQVMsQ0FBQztFQUNSLE1BQU0sRUFBRSxJQUFJO0VBQ1osS0FBSyxFQUFFLElBQUk7RUFDWCxPQUFPLEVBQUUsSUFBSTtFQUNiLGVBQWUsRUFBRSxZQUFZO0VBQzdCLFdBQVcsRUFBRSxNQUFNO0VBQ25CLFVBQVUsRUFBRSxHQUFHLENBQUMsS0FBSyxDaEIzb0JsQixPQUFPO0VnQjRvQlYsVUFBVSxFaEI5b0JOLElBQUk7RWdCK29CUixPQUFPLEVBQUUsTUFBTSxHQUNoQjs7QUFFRCxBQUFBLGtCQUFXLEVBQ1gsQUFBQSxvQkFBYSxFQUNiLEFBQUEsNEJBQXFCLENBQUM7RUFDcEIsS0FBSyxFQUFFLEtBQUs7RUFDWixVQUFVLEVBQUUsTUFBTTtFQUNsQixNQUFNLEVBQUUsSUFBSTtFQUNaLGFBQWEsRUFBRSxHQUFHO0VBQ2xCLGdCQUFnQixFaEJ6cEJaLElBQUk7RWdCMHBCUixXQUFXLEVBQUUsTUFBTTtFQUNuQixTQUFTLEVBQUUsSUFBSTtFQUNmLFdBQVcsRUFBRSxHQUFHO0VBQ2hCLFdBQVcsRUFBRSxJQUFJO0VBQ2pCLE1BQU0sRUFBRSxTQUFTO0VBQ2pCLE1BQU0sRUFBRSxLQUFLLEdBQ2Q7O0FBRUQsQUFBQSxrQkFBVyxFQUNYLEFBQUEsNEJBQXFCLENBQUM7RUFDcEIsS0FBSyxFaEIvcEJNLE9BQU87RWdCZ3FCbEIsWUFBWSxFaEJocUJELE9BQU8sR2dCaXFCbkI7O0FBRUQsQUFBQSw0QkFBcUIsQ0FBQztFQUNwQixPQUFPLEVBQUUsRUFBRTtFQUNYLE1BQU0sRUFBRSxJQUFJLEdBQ2I7O0FBRUQsQUFBQSxvQkFBYSxDQUFDO0VBQ1osS0FBSyxFaEI3cUJJLE9BQU87RWdCOHFCaEIsWUFBWSxFaEI5cUJILE9BQU8sR2dCK3FCakI7O0FBRUQsQUFBQSx1QkFBZ0IsQ0FBQztFQUNmLE1BQU0sRUFBRSxpQkFBaUI7RUFDekIsYUFBYSxFQUFFLEdBQUc7RUFDbEIsZ0JBQWdCLEVBQUUsT0FBTztFQUN6QixVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLG1CQUFnQjtFQUN4QyxXQUFXLEVBQUUsTUFBTTtFQUNuQixPQUFPLEVBQUUsSUFBSTtFQUNiLFNBQVMsRUFBRSxNQUFNLEdBMkdsQjtFQXpHQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0lBVHJDLEFBQUEsdUJBQWdCLENBQUM7TUFVYixLQUFLLEVBQUUsS0FBSztNQUNaLE1BQU0sRUFBRSxLQUFLLEdBdUdoQjtFQXBHQyxBQUFBLCtCQUFTLENBQUM7SUFDUixNQUFNLEVBQUUsSUFBSTtJQUNaLGFBQWEsRUFBRSxHQUFHLENBQUMsS0FBSyxDaEJoc0J2QixPQUFPO0lnQmlzQlIsT0FBTyxFQUFFLElBQUk7SUFDYixXQUFXLEVBQUUsTUFBTTtJQUNuQixlQUFlLEVBQUUsYUFBYTtJQUM5QixTQUFTLEVBQUUsSUFBSSxHQUtoQjtJQUhDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7TUFSckMsQUFBQSwrQkFBUyxDQUFDO1FBU04sSUFBSSxFQUFFLFFBQVEsR0FFakI7RUFFRCxBQUFBLDhCQUFRLENBQUM7SUFDUCxXQUFXLEVBQUUsT0FBTyxHQUNyQjtFQUVELEFBQUEsOEJBQVEsQUFBQSxPQUFPLENBQUM7SUFDZCxPQUFPLEVBQUUsT0FBTztJQUNoQixTQUFTLEVBQUUsS0FBSztJQUNoQixLQUFLLEVoQm50QkUsT0FBTztJZ0JvdEJkLFdBQVcsRUFBRSxVQUFVO0lBQ3ZCLE1BQU0sRUFBRSxPQUFPO0lBQ2YsWUFBWSxFQUFFLE9BQU8sR0FDdEI7RUFFRCxBQUFBLGdDQUFVLENBQUM7SUFDVCxPQUFPLEVBQUUsSUFBSTtJQUNiLFNBQVMsRUFBRSxhQUFhO0lBQ3hCLE1BQU0sRUFBRSxJQUFJLEdBQ2I7RUFFRCxBQUFBLDZCQUFPLENBQUM7SUFDTixPQUFPLEVBQUUsSUFBSTtJQUNiLGFBQWEsRUFBRSxJQUFJLEdBTXBCO0lBSkMsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztNQUpyQyxBQUFBLDZCQUFPLENBQUM7UUFLSixTQUFTLEVBQUUsTUFBTTtRQUNqQixJQUFJLEVBQUUsUUFBUSxHQUVqQjtFQUVELEFBQUEsK0JBQVMsQ0FBQztJQUNSLE1BQU0sRUFBRSxJQUFJO0lBQ1osVUFBVSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENoQjF1QnBCLE9BQU87SWdCMnVCUixPQUFPLEVBQUUsSUFBSTtJQUNiLFdBQVcsRUFBRSxNQUFNO0lBQ25CLGVBQWUsRUFBRSxhQUFhO0lBQzlCLFNBQVMsRUFBRSxJQUFJO0lBQ2YsUUFBUSxFQUFFLFFBQVEsR0FLbkI7SUFIQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO01BVHJDLEFBQUEsK0JBQVMsQ0FBQztRQVVOLElBQUksRUFBRSxRQUFRLEdBRWpCO0VBRUQsQUFBQSxnQ0FBVSxDQUFDO0lBQ1QsT0FBTyxFQUFFLElBQUk7SUFDYixlQUFlLEVBQUUsYUFBYTtJQUM5QixLQUFLLEVBQUUsUUFBUTtJQUNmLFlBQVksRUFBRSxPQUFPLEdBQ3RCO0VBRUQsQUFBQSwrQkFBUyxFQUFFLEFBQUEsK0JBQVMsRUFBRSxBQUFBLDZCQUFPLEVBQUUsQUFBQSxvQ0FBYyxDQUFDO0lBQzVDLE9BQU8sRUFBRSxJQUFJO0lBQ2IsZUFBZSxFQUFFLE1BQU07SUFDdkIsV0FBVyxFQUFFLE1BQU07SUFDbkIsTUFBTSxFQUFFLE9BQU8sR0FDaEI7RUFFRCxBQUFBLCtCQUFTLENBQUM7SUFDUixLQUFLLEVoQm53Qk0sT0FBTztJZ0Jvd0JsQixTQUFTLEVBQUUsSUFBSTtJQUNmLFdBQVcsRUFBRSxPQUFPLEdBQ3JCO0VBRUQsQUFBQSwrQkFBUyxFQUFFLEFBQUEsNkJBQU8sRUFBRSxBQUFBLG9DQUFjLENBQUM7SUFDakMsTUFBTSxFQUFFLE9BQU87SUFDZixLQUFLLEVBQUUsT0FBTztJQUNkLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDaEI5d0JWLE9BQU87SWdCK3dCZCxhQUFhLEVBQUUsR0FBRztJQUNsQixXQUFXLEVBQUUsUUFBUTtJQUNyQixTQUFTLEVBQUUsSUFBSTtJQUNmLEtBQUssRWhCbHhCRSxPQUFPLEdnQm14QmY7RUFFRCxBQUFBLG9DQUFjLENBQUM7SUFDYixPQUFPLEVBQUUsR0FBRztJQUNaLE1BQU0sRUFBRSxJQUFJLEdBQ2I7RUFFRCxBQUFBLHNDQUFnQixDQUFDO0lBQ2YsT0FBTyxFQUFFLEtBQUs7SUFDZCxRQUFRLEVBQUUsUUFBUTtJQUNsQixHQUFHLEVBQUUsR0FBRztJQUNSLEtBQUssRUFBRSxHQUFHO0lBQ1YsU0FBUyxFQUFFLElBQUk7SUFDZixXQUFXLEVBQUUsSUFBSTtJQUNqQixLQUFLLEVoQmp6QkwsSUFBSSxHZ0JrekJMOztBQUdILEFBQUEsd0JBQWlCLENBQUM7RUFDaEIsS0FBSyxFQUFFLEtBQUs7RUFDWixPQUFPLEVBQUUsSUFBSTtFQUNiLFNBQVMsRUFBRSxNQUFNO0VBQ2pCLFdBQVcsRUFBRSxVQUFVO0VBQ3ZCLFlBQVksRUFBRSxJQUFJLEdBd0RuQjtFQXREQyxBQUFBLCtCQUFRLENBQUM7SUFDUCxNQUFNLEVBQUUsSUFBSTtJQUNaLEtBQUssRWhCeHlCRCxPQUFPO0lnQnl5QlgsV0FBVyxFQUFFLE1BQU07SUFDbkIsU0FBUyxFQUFFLElBQUk7SUFDZixXQUFXLEVBQUUsR0FBRztJQUNoQixXQUFXLEVBQUUsSUFBSTtJQUNqQixVQUFVLEVBQUUsSUFBSSxHQUNqQjtFQUVELEFBQUEsOEJBQU8sQ0FBQztJQUNOLE1BQU0sRUFBRSxJQUFJO0lBQ1osS0FBSyxFQUFFLEtBQUs7SUFDWixLQUFLLEVoQm56QkQsT0FBTztJZ0JvekJYLFdBQVcsRUFBRSxNQUFNO0lBQ25CLFNBQVMsRUFBRSxJQUFJO0lBQ2YsV0FBVyxFQUFFLElBQUk7SUFDakIsVUFBVSxFQUFFLElBQUksR0FDakI7RUF6QkgsQUEyQkUsd0JBM0JlLENBMkJmLDRCQUE0QixDQUFDO0lBQzNCLFVBQVUsRUFBRSxJQUFJLEdBQ2pCO0VBN0JILEFBK0JFLHdCQS9CZSxDQStCZixvQkFBb0IsQ0FBQztJQUNuQixNQUFNLEVBQUUsSUFBSTtJQUNaLEtBQUssRUFBRSxLQUFLO0lBQ1osTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENoQnB6QmQsT0FBTztJZ0JxekJWLGdCQUFnQixFaEJ6MEJkLElBQUk7SWdCMDBCTixZQUFZLEVBQUUsSUFBSSxHQUNuQjtFQXJDSCxBQXVDRSx3QkF2Q2UsQ0F1Q2YseUJBQXlCLENBQUM7SUFDeEIsS0FBSyxFQUFFLElBQUk7SUFDWCxNQUFNLEVBQUUsSUFBSTtJQUNaLFdBQVcsRUFBRSxpQkFBaUI7SUFDOUIsU0FBUyxFQUFFLElBQUk7SUFDZixLQUFLLEVoQjMwQkQsT0FBTztJZ0I0MEJYLEtBQUssRUFBRSxHQUFHO0lBQ1YsT0FBTyxFQUFFLE9BQU87SUFDaEIsT0FBTyxFQUFFLElBQUk7SUFDYixlQUFlLEVBQUUsWUFBWTtJQUM3QixXQUFXLEVBQUUsTUFBTSxHQUNwQjtFQWxESCxBQW9ERSx3QkFwRGUsQ0FvRGYsS0FBSyxDQUFBLEFBQUEsSUFBQyxDQUFLLFFBQVEsQUFBYixDQUFjLDJCQUEyQixDQUFDO0lBQzlDLGtCQUFrQixFQUFFLElBQUk7SUFDeEIsT0FBTyxFQUFFLElBQUksR0FDZDtFQXZESCxBQXlERSx3QkF6RGUsQ0F5RGYsS0FBSyxDQUFBLEFBQUEsSUFBQyxDQUFLLFFBQVEsQUFBYixDQUFjLE1BQU0sQUFBQSwyQkFBMkIsQ0FBQztJQUNwRCxrQkFBa0IsRUFBRSxJQUFJO0lBQ3hCLE9BQU8sRUFBRSxJQUFJLEdBQ2Q7O0FDejNCTCxBQUFBLHlCQUF5QixDQUFDO0VBQ3hCLFFBQVEsRUFBRSxRQUFRO0VBQ2xCLFdBQVcsRUFBRSxNQUFNO0VBQ25CLFdBQVcsRUFBRSxNQUFNO0VBQ25CLElBQUksRUFBRSxRQUFRO0VBQ2QsU0FBUyxFQUFFLGFBQWE7RUFDeEIsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ2pCQWpCLG1CQUFJO0VpQkNWLGFBQWEsRUFBRSxHQUFHLEdBU25CO0VBUEMsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztJQVRyQyxBQUFBLHlCQUF5QixDQUFDO01BVXRCLEtBQUssRUFBRSxJQUFJLEdBTWQ7O0FBS0csTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztFQUh2QyxBQUNFLGFBRFcsQ0FDWCx1QkFBdUIsQ0FBQztJQUdwQixNQUFNLEVBQUUsa0JBQWtCLEdBRTdCOztBQUdILEFBQUEsdUJBQXVCLENBQUM7RUFDdEIsTUFBTSxFQUFFLElBQUk7RUFDWixLQUFLLEVBQUUsS0FBSztFQUNaLGdCQUFnQixFakJQVixJQUFJO0VpQlFWLE9BQU8sRUFBRSxJQUFJO0VBQ2IsU0FBUyxFQUFFLGFBQWE7RUFDeEIsT0FBTyxFQUFFLEVBQUU7RUFDWCxXQUFXLEVBQUUsTUFBTTtFQUNuQixXQUFXLEVBQUUsTUFBTTtFQUNuQixRQUFRLEVBQUUsUUFBUTtFQUNsQixVQUFVLEVBQUUsSUFBSTtFQUNoQixVQUFVLEVBQUUsTUFBTTtFQUNsQixzQkFBc0IsRUFBRSxHQUFHO0VBQzNCLHVCQUF1QixFQUFFLEdBQUcsR0FZN0I7RUFWQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0lBZnJDLEFBQUEsdUJBQXVCLENBQUM7TUFnQnBCLEtBQUssRUFBRSxJQUFJO01BQ1gsVUFBVSxFQUFFLE1BQU07TUFDbEIsVUFBVSxFQUFFLElBQUk7TUFDaEIsR0FBRyxFQUFFLENBQUM7TUFDTixVQUFVLEVBQUUsSUFBSTtNQUNoQixNQUFNLEVBQUUseUJBQXlCO01BQ2pDLHNCQUFzQixFQUFFLENBQUM7TUFDekIsdUJBQXVCLEVBQUUsQ0FBQyxHQUU3Qjs7QUFFRCxBQUEwQix1QkFBSCxHQUFHLHlCQUF5QixDQUFDO0VBQ2xELFdBQVcsRUFBRSxJQUFJO0VBQ2pCLFlBQVksRUFBRSxJQUFJLEdBQ25COztBQUVELEFBQTBCLHVCQUFILEdBQUcscUJBQXFCLENBQUM7RUFDOUMsTUFBTSxFQUFFLENBQUMsR0FDVjs7QUFFRCxBQUFBLHNCQUFzQixDQUFDO0VBQ3JCLE1BQU0sRUFBRSxJQUFJO0VBQ1osZ0JBQWdCLEVqQnhCSixPQUFPO0VpQnlCbkIsUUFBUSxFQUFFLFFBQVE7RUFDbEIsT0FBTyxFQUFFLElBQUk7RUFDYixlQUFlLEVBQUUsTUFBTTtFQUN2QixXQUFXLEVBQUUsTUFBTTtFQUNuQixTQUFTLEVBQUUsSUFBSTtFQUNmLFdBQVcsRUFBRSxJQUFJO0VBQ2pCLEtBQUssRUFBRSxJQUFJO0VBQ1gsT0FBTyxFQUFFLE1BQU07RUFDZixJQUFJLEVBQUUsUUFBUSxHQUtmO0VBSEMsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztJQWJyQyxBQUFBLHNCQUFzQixDQUFDO01BY25CLFNBQVMsRUFBRSxJQUFJLEdBRWxCOztBQUVELEFBQUEsMEJBQTBCLENBQUM7RUFDekIsTUFBTSxFQUFFLElBQUk7RUFDWixLQUFLLEVBQUUsSUFBSTtFQUNYLFVBQVUsRWpCM0NFLE9BQU87RWlCNENuQixRQUFRLEVBQUUsUUFBUTtFQUNsQixTQUFTLEVBQUUsYUFBYTtFQUN4QixHQUFHLEVBQUUsSUFBSTtFQUNULElBQUksRUFBRSxDQUFDO0VBQ1AsS0FBSyxFQUFFLENBQUM7RUFDUixNQUFNLEVBQUUsTUFBTSxHQUNmOztBQUVELEFBQUEscUJBQXFCLENBQUM7RUFDcEIsV0FBVyxFQUFFLElBQUksR0FNbEI7RUFKQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0lBSHJDLEFBQUEscUJBQXFCLENBQUM7TUFJbEIsV0FBVyxFQUFFLElBQUk7TUFDakIsWUFBWSxFQUFFLEdBQUcsR0FFcEI7O0FBRUQsQUFBQSwyQkFBMkIsQ0FBQztFQUMxQixVQUFVLEVBQUUsV0FBVztFQUN2QixNQUFNLEVBQUUsR0FBRyxDQUFDLEtBQUssQ2pCNUVKLE9BQU87RWlCNkVwQixJQUFJLEVBQUUsSUFBSTtFQUNWLFFBQVEsRUFBRSxRQUFRO0VBQ2xCLFVBQVUsRUFBRSxNQUFNO0VBQ2xCLEtBQUssRWpCaEZRLE9BQU87RWlCaUZwQixPQUFPLEVBQUUsaUJBQWlCO0VBQzFCLGFBQWEsRUFBRSxHQUFHO0VBQ2xCLE1BQU0sRUFBRSxJQUFJO0VBQ1osS0FBSyxFQUFFLElBQUksR0FLWjtFQUhDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7SUFackMsQUFBQSwyQkFBMkIsQ0FBQztNQWF4QixZQUFZLEVBQUUsSUFBSSxHQUVyQjs7QUFFRCxBQUFBLCtCQUErQixDQUFDO0VBQzlCLE9BQU8sRUFBRSxJQUFJO0VBQ2IsY0FBYyxFQUFFLE1BQU07RUFDdEIsV0FBVyxFQUFFLE1BQU0sR0FDcEI7O0FBRUQsQUFBQSw0QkFBNEIsQ0FBQztFQUMzQixVQUFVLEVBQUUsSUFBSTtFQUNoQixTQUFTLEVBQUUsSUFBSTtFQUNmLFdBQVcsRUFBRSxJQUFJO0VBQ2pCLEtBQUssRWpCakdJLE9BQU87RWlCa0doQixVQUFVLEVBQUUsTUFBTSxHQUNuQjs7QUFFRCxBQUFBLHdCQUF3QixDQUFDO0VBQ3ZCLFNBQVMsRUFBRSxJQUFJO0VBQ2YsV0FBVyxFQUFFLElBQUksR0FDbEI7O0FBRUQsQUFBQSw4QkFBOEIsQ0FBQztFQUM3QixTQUFTLEVBQUUsSUFBSTtFQUNmLFdBQVcsRUFBRSxJQUFJO0VBQ2pCLEtBQUssRWpCckhNLE9BQU87RWlCc0hsQixVQUFVLEVBQUUsTUFBTTtFQUNsQixNQUFNLEVBQUUsSUFBSSxHQUNiOztBQUVELEFBRUUsbUJBRmlCLENBRWpCLENBQUMsQUFBQSxlQUFlO0FBRGxCLEFBQ0UsbUJBRGlCLENBQ2pCLENBQUMsQUFBQSxlQUFlLENBQUM7RUFDZixVQUFVLEVBQUUsS0FBSztFQUNqQixNQUFNLEVBQUUsc0JBQXNCLEdBQy9COztBQUdILEFBQUEsMEJBQTBCLENBQUM7RUFDekIsVUFBVSxFQUFFLElBQUk7RUFDaEIsSUFBSSxFQUFFLFFBQVEsR0FZZjtFQWRELEFBSUUsMEJBSndCLENBSXhCLENBQUMsQUFBQSxlQUFlLENBQUM7SUFDZixVQUFVLEVBQUUsS0FBSztJQUNqQixNQUFNLEVBQUUsV0FBVyxHQUNwQjtFQVBILEFBU0UsMEJBVHdCLENBU3hCLENBQUMsQUFBQSxlQUFlLENBQUM7SUFDZixTQUFTLEVBQUUsSUFBSTtJQUNmLE1BQU0sRUFBRSxjQUFjO0lBQ3RCLFVBQVUsRUFBRSxNQUFNLEdBQ25COztBQUdILEFBQUEsa0NBQWtDLENBQUM7RUFDakMsVUFBVSxFQUFFLE1BQU07RUFDbEIsU0FBUyxFQUFFLElBQUk7RUFDZixVQUFVLEVBQUUsSUFBSTtFQUNoQixXQUFXLEVBQUUsZ0JBQWdCLEdBQzlCOztBQUVELEFBQUEsMkJBQTJCLENBQUM7RUFDMUIsS0FBSyxFakJsSkksT0FBTztFaUJtSmhCLFVBQVUsRUFBRSxJQUFJO0VBQ2hCLFVBQVUsRUFBRSxNQUFNO0VBQ2xCLFNBQVMsRUFBRSxJQUFJO0VBQ2YsV0FBVyxFQUFFLEdBQUc7RUFDaEIsV0FBVyxFQUFFLElBQUk7RUFDakIsSUFBSSxFQUFFLFFBQVEsR0FDZjs7QUFFRCxBQUFBLG9DQUFvQyxDQUFDO0VBQ25DLFNBQVMsRUFBRSxJQUFJO0VBQ2YsV0FBVyxFQUFFLElBQUk7RUFDakIsVUFBVSxFQUFFLE1BQU07RUFDbEIsSUFBSSxFQUFFLFFBQVEsR0FDZjs7QUFFRCxBQUFBLHFCQUFxQixDQUFDO0VBQ3BCLFVBQVUsRUFBRSxJQUFJO0VBQ2hCLEtBQUssRUFBRSxJQUFJO0VBQ1gsYUFBYSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENqQjVLbkIsT0FBTztFaUI2S1osSUFBSSxFQUFFLFFBQVEsR0FDZjs7QUFFRCxBQUFBLHlCQUF5QixDQUFDO0VBQ3hCLEtBQUssRWpCMUtJLE9BQU87RWlCMktoQixTQUFTLEVBQUUsSUFBSTtFQUNmLFdBQVcsRUFBRSxJQUFJO0VBQ2pCLFdBQVcsRUFBRSxHQUFHLEdBQ2pCOztBQUVELEFBQUEscUJBQXFCLENBQUM7RUFDcEIsU0FBUyxFQUFFLElBQUk7RUFDZixXQUFXLEVBQUUsSUFBSTtFQUNqQixLQUFLLEVqQm5MSSxPQUFPO0VpQm9MaEIsVUFBVSxFQUFFLElBQUksR0FDakI7O0FBRUQsQUFBUSxPQUFELENBQUMsNEJBQTRCO0FBQ3BDLEFBQVEsT0FBRCxDQUFDLDhCQUE4QjtBQUN0QyxBQUFBLHdCQUF3QjtBQUN4QixBQUFBLDBCQUEwQixDQUFDO0VBQ3pCLFVBQVUsRUFBRSxJQUFJLEdBQ2pCOztBQUVELEFBQUEsb0JBQW9CLENBQUM7RUFDbkIsT0FBTyxFQUFFLElBQUk7RUFDYixTQUFTLEVBQUUsYUFBYTtFQUN4QixLQUFLLEVBQUUsSUFBSTtFQUNYLElBQUksRUFBRSxRQUFRLEdBQ2Y7O0FBRUQsQUFBQSw4QkFBOEIsQ0FBQztFQUM3QixJQUFJLEVBQUUsRUFBRSxHQUNUOztBQUVELEFBQUEsbUJBQW1CLENBQUM7RUFDbEIsT0FBTyxFQUFFLElBQUk7RUFDYixTQUFTLEVBQUUsVUFBVTtFQUNyQixhQUFhLEVBQUUsR0FBRyxDQUFDLEtBQUssQ2pCbk5uQixPQUFPO0VpQm9OWixLQUFLLEVBQUUsSUFBSTtFQUNYLFdBQVcsRUFBRSxNQUFNO0VBQ25CLE9BQU8sRUFBRSxJQUFJO0VBQ2IsWUFBWSxFQUFFLElBQUk7RUFDbEIsU0FBUyxFQUFFLElBQUk7RUFDZixXQUFXLEVBQUUsSUFBSTtFQUNqQixXQUFXLEVBQUUsR0FBRyxHQUNqQjs7QUFFRCxBQUFBLDBCQUEwQixDQUFDO0VBQ3pCLFNBQVMsRUFBRSxJQUFJO0VBQ2YsV0FBVyxFQUFFLElBQUk7RUFDakIsS0FBSyxFakJqT00sT0FBTyxHaUJrT25COztBQUVELEFBQUEseUJBQXlCLENBQUM7RUFDeEIsZ0JBQWdCLEVqQnZPTixPQUFPO0VpQndPakIsT0FBTyxFQUFFLElBQUk7RUFDYixZQUFZLEVBQUUsSUFBSTtFQUNsQixhQUFhLEVBQUUsR0FBRyxDQUFDLEtBQUssQ2pCdk9uQixPQUFPLEdpQjJQYjtFQXhCRCxBQU1FLHlCQU51QixDQU12QixxQkFBcUIsQ0FBQztJQUNwQixXQUFXLEVBQUUsSUFBSSxHQUNsQjtFQVJILEFBVUUseUJBVnVCLENBVXZCLDBCQUEwQixDQUFDO0lBQ3pCLEtBQUssRWpCdk9FLE9BQU8sR2lCd09mO0VBRUQsQUFBQSxtQ0FBVyxDQUFDO0lBQ1YsU0FBUyxFQUFFLElBQUk7SUFDZixXQUFXLEVBQUUsSUFBSSxHQUNsQjtFQWpCSCxBQW1CRSx5QkFuQnVCLENBbUJ2Qix3QkFBd0IsQ0FBQztJQUN2QixTQUFTLEVBQUUsSUFBSTtJQUNmLFdBQVcsRUFBRSxHQUFHO0lBQ2hCLFdBQVcsRUFBRSxJQUFJLEdBQ2xCOztBQUdILEFBQUEsOEJBQThCLENBQUM7RUFDN0IsTUFBTSxFQUFFLElBQUk7RUFDWixhQUFhLEVBQUUsR0FBRztFQUNsQixnQkFBZ0IsRUFBRSxPQUFPO0VBQ3pCLFNBQVMsRUFBRSxJQUFJO0VBQ2YsS0FBSyxFakJwUUMsSUFBSTtFaUJxUVYsVUFBVSxFQUFFLE1BQU07RUFDbEIsV0FBVyxFQUFFLE1BQU07RUFDbkIsV0FBVyxFQUFFLElBQUk7RUFDakIsY0FBYyxFQUFFLElBQUk7RUFDcEIsWUFBWSxFQUFFLENBQUM7RUFDZixVQUFVLEVBQUUsSUFBSTtFQUNoQixJQUFJLEVBQUUsUUFBUTtFQUNkLFdBQVcsRUFBRSxHQUFHO0VBQ2hCLE1BQU0sRUFBRSxLQUFLLEdBQ2Q7O0FBRUQsQUFBQSxVQUFVLEFBQUEsNkJBQTZCLENBQUM7RUFDdEMsTUFBTSxFQUFFLElBQUk7RUFDWixVQUFVLEVBQUUsSUFBSTtFQUNoQixNQUFNLEVBQUUsSUFBSTtFQUNaLE9BQU8sRUFBRSxDQUFDO0VBQ1YsV0FBVyxFQUFFLE1BQU07RUFDbkIsWUFBWSxFQUFFLENBQUM7RUFDZixXQUFXLEVBQUUsSUFBSTtFQUNqQixjQUFjLEVBQUUsSUFBSTtFQUNwQixTQUFTLEVBQUUsSUFBSTtFQUNmLFdBQVcsRUFBRSxJQUFJO0VBQ2pCLFVBQVUsRUFBRSxJQUFJO0VBQ2hCLE1BQU0sRUFBRSxPQUFPO0VBQ2YsSUFBSSxFQUFFLFFBQVE7RUFDZCxXQUFXLEVBQUUsR0FBRztFQUNoQixNQUFNLEVBQUUsS0FBSyxHQUNkOztBQUVELEFBQUEsZ0JBQWdCLENBQUM7RUFDZixJQUFJLEVBQUUsUUFBUTtFQUNkLFFBQVEsRUFBRSxRQUFRO0VBQ2xCLE9BQU8sRUFBRSxJQUFJO0VBQ2IsU0FBUyxFQUFFLFVBQVU7RUFDckIsZ0JBQWdCLEVqQnZTVixJQUFJO0VpQndTVixPQUFPLEVBQUUsU0FBUztFQUNsQix5QkFBeUIsRUFBRSxHQUFHO0VBQzlCLDBCQUEwQixFQUFFLEdBQUc7RUFDL0IsS0FBSyxFQUFFLElBQUksR0FPWjtFQUxDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7SUFYckMsQUFBQSxnQkFBZ0IsQ0FBQztNQVliLFVBQVUsRUFBRSxHQUFHLENBQUMsS0FBSyxDakI1U2xCLE9BQU87TWlCNlNWLHlCQUF5QixFQUFFLENBQUM7TUFDNUIsMEJBQTBCLEVBQUUsQ0FBQyxHQUVoQzs7QUN6VUQsQUFBQSxnQkFBZ0IsQ0FBQztFQUNmLElBQUksRUFBRSxHQUFHO0VBQ1QsT0FBTyxFQUFFLEVBQUU7RUFDWCxRQUFRLEVBQUUsUUFBUTtFQUNsQixjQUFjLEVBQUUsTUFBTTtFQUN0QixPQUFPLEVBQUUsSUFBSTtFQUNiLGVBQWUsRUFBRSxNQUFNO0VBQ3ZCLFdBQVcsRUFBRSxNQUFNO0VBQ25CLEtBQUssRUFBRSxJQUFJO0VBQ1gsVUFBVSxFQUFFLHdCQUF3QixHQVdyQztFQVRDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7SUFYckMsQUFBQSxnQkFBZ0IsQ0FBQztNQVliLFVBQVUsRUFBRSxJQUFJO01BQ2hCLE1BQU0sRUFBRSxpQkFBaUIsR0FPNUI7RUFKQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0lBaEJyQyxBQUFBLGdCQUFnQixDQUFDO01BaUJiLFVBQVUsRUFBRSxJQUFJO01BQ2hCLE1BQU0sRUFBRSxpQkFBaUIsR0FFNUI7O0FDbEJDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7RUFGckMsQUFBQSxhQUFhLENBQUM7SUFHVixPQUFPLEVBQUUsSUFBSTtJQUNiLGNBQWMsRUFBRSxNQUFNO0lBQ3RCLGVBQWUsRUFBRSxVQUFVO0lBQzNCLFdBQVcsRUFBRSxNQUFNO0lBQ25CLE1BQU0sRUFBRSxXQUFXO0lBR25CLElBQUksRUFBRSxRQUFRLEdBdUdqQjs7QUFwR0MsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztFQWJyQyxBQUFBLGFBQWEsQ0FBQztJQWNWLE9BQU8sRUFBRSxJQUFJO0lBQ2IsY0FBYyxFQUFFLEdBQUc7SUFDbkIsZUFBZSxFQUFFLFVBQVU7SUFDM0IsV0FBVyxFQUFFLE1BQU07SUFDbkIsTUFBTSxFQUFFLGlCQUFpQixHQStGNUI7O0FBakhELEFBcUJFLGFBckJXLENBcUJYLGtCQUFrQixDQUFDO0VBQ2pCLE9BQU8sRUFBRSxJQUFJO0VBQ2IsTUFBTSxFQUFFLENBQUM7RUFDVCxlQUFlLEVBQUUsVUFBVTtFQUMzQixXQUFXLEVBQUUsTUFBTSxHQVdwQjtFQVRDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7SUEzQnZDLEFBcUJFLGFBckJXLENBcUJYLGtCQUFrQixDQUFDO01BT2YsY0FBYyxFQUFFLE1BQU07TUFDdEIsSUFBSSxFQUFFLFFBQVEsR0FPakI7RUFKQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0lBaEN2QyxBQXFCRSxhQXJCVyxDQXFCWCxrQkFBa0IsQ0FBQztNQVlmLGNBQWMsRUFBRSxHQUFHO01BQ25CLFNBQVMsRUFBRSxDQUFDLEdBRWY7O0FBSUMsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztFQXhDdkMsQUFzQ0UsYUF0Q1csQ0FzQ1gsZ0JBQWdCLENBQUM7SUFHYixVQUFVLEVBQUUsTUFBTSxHQTRCckI7SUFyRUgsQUEyQ00sYUEzQ08sQ0FzQ1gsZ0JBQWdCLENBS1osYUFBYSxDQUFDO01BQ1osU0FBUyxFQUFFLElBQUk7TUFDZixVQUFVLEVBQUUsS0FBSyxHQUNsQjtJQTlDUCxBQWdETSxhQWhETyxDQXNDWCxnQkFBZ0IsQ0FVWixZQUFZLENBQUM7TUFDWCxTQUFTLEVBQUUsSUFBSTtNQUNmLFVBQVUsRUFBRSxJQUFJO01BQ2hCLEtBQUssRUFBRSxPQUFPLEdBQ2Y7O0FBR0gsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztFQXZEdkMsQUFzQ0UsYUF0Q1csQ0FzQ1gsZ0JBQWdCLENBQUM7SUFrQmIsV0FBVyxFQUFFLEVBQUU7SUFDZixlQUFlLEVBQUUsVUFBVTtJQUMzQixXQUFXLEVBQUUsVUFBVSxHQVcxQjtJQXJFSCxBQTRETSxhQTVETyxDQXNDWCxnQkFBZ0IsQ0FzQlosYUFBYSxDQUFDO01BQ1osU0FBUyxFQUFFLElBQUksR0FDaEI7SUE5RFAsQUFnRU0sYUFoRU8sQ0FzQ1gsZ0JBQWdCLENBMEJaLFlBQVksQ0FBQztNQUNYLFVBQVUsRUFBRSxJQUFJO01BQ2hCLFNBQVMsRUFBRSxJQUFJLEdBQ2hCOztBQW5FUCxBQXVFRSxhQXZFVyxDQXVFWCxhQUFhLENBQUM7RUFDWixhQUFhLEVBQUUsSUFBSTtFQUNuQixLQUFLLEVBQUUsSUFBSTtFQUNYLE1BQU0sRUFBRSxJQUFJO0VBQ1osTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENuQmxEZCxPQUFPLEdtQm1EWDs7QUFJQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0VBaEZ2QyxBQThFRSxhQTlFVyxDQThFWCxxQkFBcUIsQ0FBQztJQUdsQixLQUFLLEVBQUUsSUFBSTtJQUVYLElBQUksRUFBRSxRQUFRO0lBQ2QsT0FBTyxFQUFFLE1BQU0sR0E0QmxCOztBQXpCQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0VBdkZ2QyxBQThFRSxhQTlFVyxDQThFWCxxQkFBcUIsQ0FBQztJQVVsQixTQUFTLEVBQUUsQ0FBQztJQUNaLGVBQWUsRUFBRSxRQUFRLEdBdUI1Qjs7QUFoSEgsQUE0RkksYUE1RlMsQ0E4RVgscUJBQXFCLENBY25CLE1BQU0sQUFBQSxVQUFVLENBQUM7RUFDZixVQUFVLEVuQnRFUixJQUFJO0VtQnVFTixNQUFNLEVBQUUsU0FBUztFQUNqQixhQUFhLEVBQUUsR0FBRztFQUNsQixTQUFTLEVBQUUsSUFBSSxHQWVoQjtFQWJDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7SUFsR3pDLEFBNEZJLGFBNUZTLENBOEVYLHFCQUFxQixDQWNuQixNQUFNLEFBQUEsVUFBVSxDQUFDO01BT2IsWUFBWSxFbkJ2RUwsT0FBTztNbUJ3RWQsS0FBSyxFbkJ4RUUsT0FBTztNbUJ5RWQsTUFBTSxFQUFFLElBQUksR0FVZjtFQVBDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7SUF4R3pDLEFBNEZJLGFBNUZTLENBOEVYLHFCQUFxQixDQWNuQixNQUFNLEFBQUEsVUFBVSxDQUFDO01BYWIsWUFBWSxFbkI3RUwsT0FBTztNbUI4RWQsS0FBSyxFbkI5RUUsT0FBTztNbUIrRWQsT0FBTyxFQUFFLENBQUM7TUFDVixLQUFLLEVBQUUsSUFBSTtNQUNYLE1BQU0sRUFBRSxJQUFJLEdBRWY7O0FDM0dMLEFBQUEsdUJBQXVCLENBQUM7RUFDdEIsSUFBSSxFQUFFLFFBQVE7RUFDZCxVQUFVLEVBQUUsWUFBWTtFQUN4QixVQUFVLEVBUFEsc0JBQU8sR0FZMUI7RUFIQyxBQUFBLCtCQUFTLENBQUM7SUFDUixVQUFVLEVBVk0sT0FBTyxHQVd4Qjs7QUFHSCxBQUFBLGVBQWUsQ0FBQztFQUNkLFVBQVUsRUFBRSxPQUFPO0VBQ25CLE9BQU8sRUFBRSxJQUFJO0VBQ2IsY0FBYyxFQUFFLEdBQUc7RUFDbkIsZUFBZSxFQUFFLFVBQVU7RUFDM0IsV0FBVyxFQUFFLE1BQU07RUFDbkIsSUFBSSxFQUFFLFFBQVE7RUFDZCxNQUFNLEVBQUUsT0FBTztFQUNmLFVBQVUsRUFBRSxHQUFHLENBQUMsS0FBSyxDQXRCSCxPQUFPLEdBc0UxQjtFQXhERCxBQVVFLGVBVmEsQ0FVYixrQkFBa0IsQ0FBQztJQUNqQixPQUFPLEVBQUUsSUFBSTtJQUNiLGVBQWUsRUFBRSxVQUFVO0lBQzNCLFdBQVcsRUFBRSxNQUFNO0lBQ25CLE1BQU0sRUFBRSxTQUFTO0lBQ2pCLGNBQWMsRUFBRSxHQUFHO0lBQ25CLFNBQVMsRUFBRSxDQUFDLEdBS2I7SUFIQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLLE9BQU8sU0FBUyxFQUFFLEtBQUs7TUFsQjlELEFBVUUsZUFWYSxDQVViLGtCQUFrQixDQUFDO1FBU2YsTUFBTSxFQUFFLE1BQU0sR0FFakI7RUFyQkgsQUF1QkUsZUF2QmEsQ0F1QmIsZ0JBQWdCLENBQUM7SUFDZixXQUFXLEVBQUUsSUFBSTtJQUNqQixlQUFlLEVBQUUsVUFBVTtJQUMzQixXQUFXLEVBQUUsVUFBVSxHQXNCeEI7SUFoREgsQUE0QkksZUE1QlcsQ0F1QmIsZ0JBQWdCLENBS2QsYUFBYSxDQUFDO01BQ1osU0FBUyxFQUFFLElBQUksR0FDaEI7SUE5QkwsQUFnQ0ksZUFoQ1csQ0F1QmIsZ0JBQWdCLENBU2QsWUFBWSxDQUFDO01BQ1gsVUFBVSxFQUFFLElBQUk7TUFDaEIsU0FBUyxFQUFFLElBQUksR0FDaEI7SUFFRCxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLLE9BQU8sU0FBUyxFQUFFLEtBQUs7TUFyQzlELEFBdUJFLGVBdkJhLENBdUJiLGdCQUFnQixDQUFDO1FBZWIsV0FBVyxFQUFFLEVBQUUsR0FVbEI7UUFoREgsQUF3Q00sZUF4Q1MsQ0F1QmIsZ0JBQWdCLENBaUJaLGFBQWEsQ0FBQztVQUNaLFNBQVMsRUFBRSxJQUFJLEdBQ2hCO1FBMUNQLEFBNENNLGVBNUNTLENBdUJiLGdCQUFnQixDQXFCWixZQUFZLENBQUM7VUFDWCxTQUFTLEVBQUUsR0FBRyxHQUNmO0VBOUNQLEFBa0RFLGVBbERhLENBa0RiLGFBQWEsQ0FBQztJQUNaLGFBQWEsRUFBRSxJQUFJO0lBQ25CLEtBQUssRUFBRSxJQUFJO0lBQ1gsTUFBTSxFQUFFLElBQUk7SUFDWixNQUFNLEVBQUUsR0FBRyxDQUFDLEtBQUssQ3BCM0NkLE9BQU8sR29CNENYOztBQ3JFSCxBQUFBLGtCQUFrQixDQUFDO0VBQ2pCLE1BQU0sRUFBRSxLQUFLLEdBS2Q7RUFIQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0lBSHJDLEFBQUEsa0JBQWtCLENBQUM7TUFJZixVQUFVLEVBQUUsTUFBTSxHQUVyQjs7QUFFRCxBQUFBLGVBQWUsQ0FBQztFQUNkLGNBQWMsRUFBRSxVQUFVLEdBQzNCOztBQUVELE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7RUFDakMsQUFBQSx1QkFBdUIsQ0FBQztJQUN0QixVQUFVLEVBQUUsSUFBSTtJQUNoQixhQUFhLEVBQUUsSUFBSTtJQUtuQixlQUFlLEVBQUUsTUFBTTtJQUN2QixJQUFJLEVBQUUsUUFBUSxHQUNmO0VBRUQsQUFBQSxlQUFlLENBQUM7SUFDZCxVQUFVLEVBQUUsTUFBTTtJQUNsQixTQUFTLEVBQUUsSUFBSTtJQUNmLEtBQUssRXJCSEksT0FBTztJcUJJaEIsV0FBVyxFQUFFLE1BQU07SUFDbkIsY0FBYyxFQUFFLFNBQVMsR0FDMUI7O0FBR0gsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztFQUNqQyxBQUFBLHVCQUF1QixDQUFDO0lBQ3RCLElBQUksRUFBRSxRQUFRLEdBQ2Y7RUFFRCxBQUFBLGVBQWUsQ0FBQztJQUNkLFNBQVMsRUFBRSxJQUFJO0lBQ2YsTUFBTSxFQUFFLFlBQVksR0FDckI7RUFFRCxBQUFBLGtCQUFrQixBQUFBLG1CQUFtQixDQUFDO0lBQ3BDLE9BQU8sRUFBRSxJQUFJLEdBQ2Q7O0FBR0gsQUFBQSx3QkFBd0IsQ0FBQztFQUN2QixNQUFNLEVBQUUsR0FBRztFQUNYLFVBQVUsRUFBRSxPQUFrQjtFQUM5QixJQUFJLEVBQUUsT0FBTyxHQVNkO0VBUEMsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztJQUxyQyxBQUFBLHdCQUF3QixDQUFDO01BTXJCLE1BQU0sRUFBRSxNQUFNLEdBTWpCO0VBSEMsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztJQVRyQyxBQUFBLHdCQUF3QixDQUFDO01BVXJCLE1BQU0sRUFBRSxXQUFXLEdBRXRCOztBQUVELEFBQUEscUJBQXFCLENBQUM7RUFDcEIsSUFBSSxFQUFFLFFBQVE7RUFDZCxLQUFLLEVBQUUsQ0FBQztFQUNSLFdBQVcsRUFBRSxPQUFPO0VBQ3BCLGVBQWUsRUFBRSxVQUFVO0VBQzNCLE9BQU8sRUFBRSxJQUFJO0VBQ2IsU0FBUyxFQUFFLGFBQWEsR0FTekI7RUFQQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0lBUnJDLEFBQUEscUJBQXFCLENBQUM7TUFTbEIsT0FBTyxFQUFFLFlBQVksR0FNeEI7RUFIQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0lBWnJDLEFBQUEscUJBQXFCLENBQUM7TUFhbEIsY0FBYyxFQUFFLElBQUksR0FFdkI7O0FBRUQsQUFBQSxrQkFBa0IsQ0FBQztFQUNqQixNQUFNLEVBQUUsT0FBTyxHQUtoQjtFQU5ELEFBR0Usa0JBSGdCLEFBR2hCLE1BQU8sQ0FBQztJQUNOLFVBQVUsRXJCMURQLHdCQUFPLEdxQjJEWDs7QUFHSCxBQUFBLCtCQUErQixDQUFDO0VBQzlCLE1BQU0sRUFBRSxPQUFPO0VBQ2YsT0FBTyxFQUFFLEVBQUUsR0FDWjs7QUFFRCxBQUFBLHFCQUFxQixDQUFDO0VBQ3BCLElBQUksRUFBRSxRQUFRLEdBU2Y7RUFQQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0lBSHJDLEFBQUEscUJBQXFCLENBQUM7TUFJbEIsVUFBVSxFQUFFLEdBQUcsR0FNbEI7RUFIQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0lBUHJDLEFBQUEscUJBQXFCLENBQUM7TUFRbEIsVUFBVSxFQUFFLElBQUksR0FFbkI7O0FBRUQsQUFBQSx3QkFBd0IsQ0FBQztFQUN2QixXQUFXLEVBQUUsT0FBTztFQUNwQixhQUFhLEVBQUUsR0FBRztFQUNsQixVQUFVLEVBQUUsR0FBRztFQUNmLElBQUksRUFBRSxRQUFRO0VBQ2QsS0FBSyxFQUFFLElBQUk7RUFDWCxPQUFPLEVBQUUsSUFBSTtFQUNiLFNBQVMsRUFBRSxVQUFVLEdBdUJ0QjtFQXJCQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0lBVHJDLEFBQUEsd0JBQXdCLENBQUM7TUFVckIsU0FBUyxFQUFFLElBQUksR0FvQmxCO01BOUJELEFBWUksd0JBWm9CLENBWXBCLGVBQWUsQ0FBQztRQUNkLFNBQVMsRUFBRSxlQUFlLEdBQzNCO01BZEwsQUFnQkksd0JBaEJvQixDQWdCcEIsZ0JBQWdCLENBQUM7UUFDZixTQUFTLEVBQUUsZUFBZSxHQUMzQjtNQWxCTCxBQW9CSSx3QkFwQm9CLENBb0JwQixjQUFjLENBQUM7UUFDYixTQUFTLEVBQUUsSUFBSTtRQUNmLFdBQVcsRUFBRSxJQUFJLEdBQ2xCO01BdkJMLEFBeUJJLHdCQXpCb0IsQ0F5QnBCLG1CQUFtQixDQUFDO1FBQ2xCLFNBQVMsRUFBRSxJQUFJO1FBQ2YsV0FBVyxFQUFFLElBQUksR0FDbEI7O0FBSUwsQUFBQSxhQUFhLENBQUM7RUFDWixLQUFLLEVyQmpITSxPQUFPO0VxQmtIbEIsU0FBUyxFQUFFLElBQUk7RUFDZixXQUFXLEVBQUUsTUFBTSxHQUNwQjs7QUFFRCxBQUFBLDBCQUEwQixDQUFDO0VBQ3pCLFVBQVUsRUFBRSxNQUFNO0VBQ2xCLElBQUksRUFBRSxRQUFRO0VBQ2QsWUFBWSxFQUFFLElBQUksR0FDbkI7O0FBRUQsQUFBQSxtQ0FBbUMsQ0FBQztFQUNsQyxPQUFPLEVBQUUsSUFBSTtFQUNiLElBQUksRUFBRSxRQUFRO0VBQ2QsU0FBUyxFQUFFLFFBQVE7RUFDbkIsS0FBSyxFQUFFLENBQUMsR0ErQ1Q7RUE3Q0MsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztJQU5yQyxBQUFBLG1DQUFtQyxDQUFDO01BT2hDLGNBQWMsRUFBRSxNQUFNO01BQ3RCLGVBQWUsRUFBRSxVQUFVO01BQzNCLFdBQVcsRUFBRSxVQUFVO01BQ3ZCLFVBQVUsRUFBRSxNQUFNLEdBeUNyQjtNQW5ERCxBQVlJLG1DQVorQixDQVkvQix3QkFBd0IsQ0FBQztRQUN2QixNQUFNLEVBQUUsSUFBSSxHQUtiO1FBbEJMLEFBZU0sbUNBZjZCLENBWS9CLHdCQUF3QixDQUd0QixnQkFBZ0IsQ0FBQztVQUNmLFdBQVcsRUFBRSxJQUFJLEdBQ2xCO0VBSUwsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztJQXJCckMsQUFBQSxtQ0FBbUMsQ0FBQztNQXNCaEMsY0FBYyxFQUFFLEdBQUc7TUFDbkIsZUFBZSxFQUFFLFVBQVU7TUFDM0IsV0FBVyxFQUFFLE1BQU0sR0EyQnRCO01BbkRELEFBMEJJLG1DQTFCK0IsQ0EwQi9CLHdCQUF3QixDQUFDO1FBQ3ZCLElBQUksRUFBRSxVQUFVO1FBQ2hCLFNBQVMsRUFBRSxLQUFLLEdBQ2pCO01BN0JMLEFBK0JJLG1DQS9CK0IsQ0ErQi9CLHVCQUF1QixDQUFDO1FBQ3RCLElBQUksRUFBRSxRQUFRLEdBQ2Y7RUFqQ0wsQUFvQ0UsbUNBcENpQyxDQW9DakMsZ0JBQWdCLENBQUM7SUFDZixTQUFTLEVBQUUsSUFBSTtJQUNmLEtBQUssRXJCMUpFLE9BQU8sR3FCMkpmO0VBdkNILEFBeUNFLG1DQXpDaUMsQ0F5Q2pDLGVBQWUsQ0FBQztJQUNkLEtBQUssRXJCdEtJLE9BQU87SXFCdUtoQixTQUFTLEVBQUUsSUFBSTtJQUNmLGNBQWMsRUFBRSxVQUFVLEdBQzNCO0VBN0NILEFBK0NFLG1DQS9DaUMsQ0ErQ2pDLHlCQUF5QjtFQS9DM0IsQUFnREUsbUNBaERpQyxDQWdEakMsdUJBQXVCLENBQUM7SUFDdEIsS0FBSyxFckJsS0QsT0FBTyxHcUJtS1o7O0FBR0gsQUFBQSxhQUFhLENBQUM7RUFDWixVQUFVLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFrQjtFQUN4QyxJQUFJLEVBQUUsUUFBUTtFQUNkLE9BQU8sRUFBRSxJQUFJO0VBQ2IsU0FBUyxFQUFFLFVBQVUsR0F3Q3RCO0VBbENDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7SUFWckMsQUFBQSxhQUFhLENBQUM7TUFXVixNQUFNLEVBQUUsUUFBUSxHQWlDbkI7RUE1Q0QsQUFjRSxhQWRXLEFBY1gsYUFBYyxDQUFDO0lBQ2IsYUFBYSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBa0I7SUFDM0MsYUFBYSxFQUFFLElBQUksR0FDcEI7RUFFRCxBQUFBLHNCQUFVLENBQUM7SUFDVCxVQUFVLEVBQUUsTUFBTTtJQUNsQixJQUFJLEVBQUUsUUFBUTtJQUNkLEtBQUssRXJCdk1JLE9BQU8sR3FCc05qQjtJQWxCRCxBQUtFLHNCQUxRLENBS1IsY0FBYyxDQUFDO01BQ2IsU0FBUyxFQUFFLElBQUk7TUFDZixVQUFVLEVBQUUsS0FBSyxHQUNsQjtJQVJILEFBVUUsc0JBVlEsQ0FVUix5QkFBeUIsQ0FBQztNQUN4QixLQUFLLEVyQnJNTyxPQUFPLEdxQnNNcEI7SUFaSCxBQWNFLHNCQWRRLENBY1IsbUJBQW1CLENBQUM7TUFDbEIsU0FBUyxFQUFFLElBQUk7TUFDZixVQUFVLEVBQUUsS0FBSyxHQUNsQjtFQUdILEFBQUEsb0JBQVEsQ0FBQztJQUNQLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLGFBQWEsRUFBRSxlQUFlO0lBQzlCLE9BQU8sRUFBRSxJQUFJLEdBQ2Q7O0FBR0gsQUFBQSx3QkFBd0IsQ0FBQztFQUN2QixRQUFRLEVBQUUsTUFBTTtFQUNoQixJQUFJLEVBQUUsT0FBTyxHQUNkOztBQUVELEFBQUEsY0FBYyxDQUFDO0VBQ2IsU0FBUyxFQUFFLElBQUk7RUFDZixVQUFVLEVBQUUsS0FBSztFQUNqQixhQUFhLEVBQUUsUUFBUTtFQUN2QixXQUFXLEVBQUUsTUFBTTtFQUNuQixRQUFRLEVBQUUsTUFBTSxHQUNqQjs7QUFFRCxBQUFBLG1CQUFtQixDQUFDO0VBQ2xCLFVBQVUsRUFBRSxLQUFLO0VBQ2pCLGFBQWEsRUFBRSxRQUFRO0VBQ3ZCLFdBQVcsRUFBRSxNQUFNO0VBQ25CLFFBQVEsRUFBRSxNQUFNLEdBQ2pCOztBQUVELEFBQUEseUJBQXlCLENBQUM7RUFDeEIsS0FBSyxFckIxT1csT0FBTyxHcUIyT3hCOztBQzVRRCx1QkFBdUI7QUFHdkI7OztFQUdFO0FBRUYsZ0JBQWdCO0FBQ2hCLEFBQUEsUUFBUSxBQUFBLG1CQUFtQixDQUFDO0VBQzFCLE9BQU8sRUFBRSxJQUFJO0VBQ2IsS0FBSyxFQUFFLEtBQUs7RUFDWixNQUFNLEVBQUUsS0FBSztFQUNiLFNBQVMsRUFBRSxJQUFJO0VBQ2YsVUFBVSxFdEJRSixJQUFJO0VzQlBWLE1BQU0sRUFBRSxJQUFJLEdBQ2I7O0FBRUQsQUFBbUIsa0JBQUQsQ0FBQyxFQUFFLENBQUM7RUFDcEIsS0FBSyxFQUFFLElBQUk7RUFDWCxNQUFNLEVBQUUsSUFBSTtFQUNaLFlBQVksRUFBRSxPQUFPO0VBQ3JCLFlBQVksRUFBRSxLQUFLLEdBQ3BCOztBQUVELEFBQW1CLGtCQUFELENBQUMsS0FBSyxDQUFDO0VBQ3ZCLFVBQVUsRUFBRSxJQUFJLEdBQ2pCOztBQUVELEFBQW1CLGtCQUFELENBQUMsTUFBTSxBQUFBLGFBQWEsQ0FBQztFQUNyQyxVQUFVLEVBQUUsSUFBSSxHQUNqQjs7QUFFRCxBQUFtQixrQkFBRCxDQUFDLFFBQVEsQ0FBQztFQUMxQixTQUFTLEVBQUUsSUFBSTtFQUNmLE1BQU0sRUFBRSxNQUFNLEdBQ2Y7O0FBRUQsWUFBWTtBQUNaLEFBQUEsTUFBTSxDQUFDO0VBRUwsS0FBSyxFQUFFLE9BQU87RUFDZCxhQUFhLEVBQUUsR0FBRyxHQUNuQjs7QUFFRCxBQUFBLFFBQVEsQ0FBQztFQUNQLEtBQUssRUFBRSxPQUFPLEdBQ2Y7O0FBRUQsQUFBQSxLQUFLLENBQUM7RUFDSixLQUFLLEVBQUUsSUFBSTtFQUNYLE1BQU0sRUFBRSxJQUFJLEdBQ2I7O0FBRUQsQUFBQSxLQUFLLEFBQUEsT0FBTyxDQUFDO0VBQ1gsU0FBUyxFQUFFLFVBQVU7RUFDckIsT0FBTyxFQUFFLENBQUM7RUFDVixVQUFVLEVBQUUsOENBQThDLEdBQzNEOztBQUVELEFBQUEsS0FBSyxBQUFBLFNBQVMsQ0FBQztFQUNiLFNBQVMsRUFBRSxRQUFRO0VBQ25CLE9BQU8sRUFBRSxDQUFDO0VBQ1YsVUFBVSxFQUFFLDBFQUEwRSxHQUN2Rjs7QUFFRCxBQUFhLEtBQVIsQUFBQSxPQUFPLENBQUMsU0FBUyxDQUFDO0VBQ3JCLFNBQVMsRUFBRSxTQUFTLENBQUMsYUFBYTtFQUNsQyxVQUFVLEVBQUUsdUJBQXVCLEdBQ3BDOztBQUVELEFBQWUsS0FBVixBQUFBLFNBQVMsQ0FBQyxTQUFTLENBQUM7RUFDdkIsU0FBUyxFQUFFLFVBQVUsQ0FBQyxpQkFBaUI7RUFDdkMsVUFBVSxFQUFFLHVCQUF1QixHQUNwQzs7QUFFRCxBQUFBLEtBQUssQUFBQSxTQUFTLEFBQUEsTUFBTSxDQUFDO0VBQ25CLGFBQWEsRUFBRSxHQUFHO0VBQ2xCLFVBQVUsRUFBRSxPQUFPO0VBQ25CLE1BQU0sRUFBRSxpQkFBaUIsR0FDMUI7O0FBRUQsQUFBQSxLQUFLLEFBQUEsU0FBUyxBQUFBLE9BQU8sQ0FBQztFQUNwQixVQUFVLEVBQUUsT0FBTyxHQUNwQjs7QUFFRCxBQUFlLGNBQUQsQ0FBQyxjQUFjLENBQUM7RUFDNUIsTUFBTSxFQUFFLGlCQUFpQixHQUMxQjs7QUFFRCxBQUFlLGNBQUQsQ0FBQywwQkFBMEIsQ0FBQztFQUN4QyxVQUFVLEVBQUUsSUFBSSxHQUNqQjs7QUFFRCxBQUFlLGNBQUQsQ0FBQyxFQUFFLENBQUM7RUFDaEIsVUFBVSxFQUFFLEtBQUs7RUFDakIsYUFBYSxFQUFFLElBQUksR0FDcEI7O0FBRUQsQUFBZSxjQUFELENBQUMsS0FBSyxDQUFBLEFBQUEsSUFBQyxDQUFELFFBQUMsQUFBQSxFQUFlO0VBQ2xDLEtBQUssRUFBRSxLQUFLLEdBQ2I7O0FBRUQsQUFBQSxhQUFhLENBQUM7RUFDWixTQUFTLEVBQUUsSUFBSTtFQUNmLE1BQU0sRUFBRSxJQUFJO0VBQ1osWUFBWSxFQUFFLEdBQUcsR0FDbEI7O0FBRUQsQUFBQSxlQUFlLENBQUM7RUFDZCxPQUFPLEVBQUUsSUFBSSxHQUNkOztBQUVELFlBQVk7QUFFWixBQUFlLGNBQUQsQ0FBQyxLQUFLLEFBQUEsMkJBQTJCLENBQUM7RUFDOUMsVUFBVSxFQUFFLE1BQU07RUFDbEIsU0FBUyxFQUFFLEtBQUssR0FDakI7O0FBRUQsaUJBQWlCO0FBRWpCLEFBQWUsY0FBRCxDQUFDLEtBQUssQUFBQSxpQkFBaUIsQ0FBQztFQUNwQyxVQUFVLEVBQUUsTUFBTTtFQUNsQixTQUFTLEVBQUUsS0FBSyxHQUNqQjs7QUFFRCxpQkFBaUI7QUFFakIsQUFBZSxjQUFELENBQUMsS0FBSyxBQUFBLGtCQUFrQixDQUFDO0VBQ3JDLFVBQVUsRUFBRSxNQUFNO0VBQ2xCLFNBQVMsRUFBRSxLQUFLLEdBQ2pCOztBQUVELFFBQVE7QUFFUixBQUFlLGNBQUQsQ0FBQyxLQUFLLEFBQUEsc0JBQXNCLENBQUM7RUFDekMsVUFBVSxFQUFFLE1BQU07RUFDbEIsU0FBUyxFQUFFLEtBQUssR0FDakI7O0FBRUQsY0FBYztBQUVkLEFBQUEsaUJBQWlCLENBQUM7RUFDaEIsTUFBTSxFQUFFLEtBQUssR0FDZDs7QUFFRCxBQUFrQixpQkFBRCxDQUFDLGdCQUFnQixDQUFDO0VBQ2pDLE1BQU0sRUFBRSxNQUFNLEdBQ2Y7O0FBRUQsQUFBQSxxQkFBcUIsQ0FBQztFQUNwQixNQUFNLEVBQUUsS0FBSyxHQUNkOztBQUVELEFBQXNCLHFCQUFELENBQUMsa0JBQWtCLENBQUM7RUFDdkMsS0FBSyxFQUFFLEtBQUssR0FDYjs7QUFFRCxBQUFBLGNBQWMsQ0FBQztFQUNiLFVBQVUsRUFBRSxJQUFJO0VBQ2hCLE1BQU0sRUFBRSxPQUFPLEdBQ2hCOztBQUVELEFBQWUsY0FBRCxDQUFDLGVBQWUsQ0FBQztFQUM3QixNQUFNLEVBQUUsY0FBYyxHQUN2Qjs7QUFFRCxvQkFBb0I7QUFFcEIsQUFBQSxlQUFlLENBQUM7RUFDZCxXQUFXLEVBQUUsR0FBRyxHQUNqQjs7QUFFRCxBQUFnQixlQUFELENBQUMsa0JBQWtCLENBQUM7RUFDakMsTUFBTSxFQUFFLEdBQUc7RUFDWCxVQUFVLEVBQUUsR0FBRztFQUNmLE9BQU8sRUFBRSxJQUFJO0VBQ2IsV0FBVyxFQUFFLE1BQU0sR0FDcEI7O0FBRUQsQUFBbUMsZUFBcEIsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUM7RUFDdEMsTUFBTSxFQUFFLE1BQU0sR0FDZjs7QUFFRCxBQUFnQixlQUFELENBQUMsY0FBYyxDQUFDO0VBQzdCLE1BQU0sRUFBRSxnQkFBZ0IsR0FDekI7O0FBRUQsQUFBZ0IsZUFBRCxDQUFDLENBQUMsQ0FBQztFQUNoQixVQUFVLEVBQUUsSUFBSTtFQUNoQixZQUFZLEVBQUUsR0FBRztFQUNqQixLQUFLLEVBQUUsT0FBTyxHQUNmOztBQUVELEFBQWdCLGVBQUQsQ0FBQyxZQUFZLENBQUM7RUFDM0IsWUFBWSxFQUFFLElBQUk7RUFDbEIsS0FBSyxFQUFFLElBQUk7RUFDWCxTQUFTLEVBQUUsSUFBSTtFQUNmLE1BQU0sRUFBRSxJQUFJLEdBQ2I7O0FBRUQsQUFBQSxjQUFjLEFBQUEsWUFBWSxDQUFDO0VBQ3pCLElBQUksRUFBRSxVQUFVO0VBQ2hCLGVBQWUsRUFBRSxNQUFNLEdBQ3hCOztBQUVELHFCQUFxQjtBQUtyQixBQUFrQixpQkFBRCxDQUFDLGVBQWUsQ0FBQztFQUNoQyxVQUFVLEVBQUUsT0FBTztFQUNuQixhQUFhLEVBQUUsaUJBQWlCO0VBQ2hDLE1BQU0sRUFBRSxPQUFPLEdBQ2hCOztBQUVELEFBQWtCLGlCQUFELENBQUMsZUFBZSxBQUFBLFNBQVMsQ0FBQztFQUN6QyxVQUFVLEV0QnJNSixJQUFJO0VzQnNNVixLQUFLLEVBQUUsT0FBTyxHQUNmOztBQUVELEFBQTJDLGlCQUExQixDQUFDLGVBQWUsQUFBQSxTQUFTLENBQUMsVUFBVSxDQUFDO0VBQ3BELFlBQVksRXRCMU5MLE9BQU8sR3NCMk5mOztBQUVELEFBQWtCLGlCQUFELENBQUMscUJBQXFCLEFBQUEsTUFBTTtBQUM3QyxBQUFrQixpQkFBRCxDQUFDLHFCQUFxQixBQUFBLFNBQVMsQ0FBQztFQUMvQyxVQUFVLEV0Qi9NSixJQUFJLEdzQmdOWDs7QUFFRCwyQkFBMkI7QUFFM0IsQUFBQSx1QkFBdUIsQ0FBQztFQUN0QixPQUFPLEVBQUUsSUFBSTtFQUNiLFNBQVMsRUFBRSxJQUFJO0VBQ2YsVUFBVSxFQUFFLElBQUk7RUFDaEIsY0FBYyxFQUFFLE9BQU8sR0FDeEI7O0FBRUQsQUFBQSxVQUFVLENBQUM7RUFDVCxTQUFTLEVBQUUsRUFBRSxHQUNkOztBQUtELEFBQUEsbUJBQW1CLENBQUM7RUFDbEIsTUFBTSxFQUFFLElBQUk7RUFDWixLQUFLLEVBQUUsSUFBSTtFQUNYLFVBQVUsRUFBRSxPQUFpQjtFQUM3QixZQUFZLEV0QmxPRyxPQUFPO0VzQm1PdEIsYUFBYSxFQUFFLElBQUksR0FDcEI7O0FBRUQsQUFBQSxVQUFVLENBQUM7RUFDVCxNQUFNLEVBQUUsSUFBSTtFQUNaLFVBQVUsRUFBRSxNQUFNLEdBQ25COztBQUVELEFBQUEsY0FBYyxDQUFDO0VBQ2IsT0FBTyxFQUFFLElBQUk7RUFDYixlQUFlLEVBQUUsVUFBVTtFQUMzQixXQUFXLEVBQUUsSUFBSTtFQUNqQixhQUFhLEVBQUUsR0FBRztFQUNsQixTQUFTLEVBQUUsSUFBSTtFQUNmLGNBQWMsRUFBRSxrQkFBa0I7RUFDbEMsS0FBSyxFQUFFLE9BQU8sR0FDZjs7QUFFRCxBQUFrQixXQUFQLEFBQUEsTUFBTSxDQUFDLFVBQVUsQ0FBQztFQUMzQixVQUFVLEVBQUUsT0FBTyxHQUNwQjs7QUFDRCxnQkFBZ0I7QUFFaEIsQUFBa0IsaUJBQUQsQ0FBQyxLQUFLLENBQUEsQUFBQSxJQUFDLENBQUQsUUFBQyxBQUFBLEVBQWU7RUFDckMsTUFBTSxFQUFFLElBQUk7RUFDWixPQUFPLEVBQUUsR0FBRztFQUNaLE1BQU0sRUFBRSxJQUFJO0VBQ1osYUFBYSxFQUFFLElBQUk7RUFDbkIsYUFBYSxFQUFFLEdBQUc7RUFDbEIsTUFBTSxFQUFFLGlCQUFpQjtFQUN6QixVQUFVLEVBQUUsT0FBTyxHQUNwQjs7QUFFRCwwQkFBMEI7QUFFMUIsQUFBQSxxQkFBcUIsQ0FBQztFQUNwQixLQUFLLEVBQUUsT0FBTyxHQUNmOztBQUVELEFBQUEsb0JBQW9CLENBQUM7RUFDbkIsS0FBSyxFQUFFLE9BQU8sR0FDZjs7QUFFRCxpQkFBaUI7QUFDakIsQUFBQSxVQUFVLENBQUM7RUFDVCxXQUFXLEVBQUUsTUFBTTtFQUNuQixjQUFjLEVBQUUsU0FBUztFQUN6QixLQUFLLEV0QmxSVSxPQUFPLEdzQm1SdkI7O0FBRUQsQUFBQSxVQUFVLENBQUM7RUFDVCxLQUFLLEVBQUUsSUFBSSxHQUNaOztBQUVELEFBQUEsS0FBSyxDQUFDO0VBQ0osV0FBVyxFQUFFLGFBQWE7RUFDMUIsY0FBYyxFQUFFLElBQUk7RUFDcEIsT0FBTyxFQUFFLFlBQVk7RUFDckIsWUFBWSxFQUFFLEdBQUcsR0FDbEI7O0FBRUQsNEJBQTRCO0FBQzVCLEFBQUEsY0FBYyxDQUFDO0VBQ2IsZUFBZSxFQUFFLFlBQVk7RUFDN0IsV0FBVyxFQUFFLE1BQU0sR0FDcEI7O0FBRUQsQUFBQSxzQkFBc0IsQ0FBQztFQUNyQixLQUFLLEVBQUUsSUFBSTtFQUNYLE1BQU0sRUFBRSxJQUFJO0VBQ1osTUFBTSxFQUFFLEtBQUs7RUFDYixZQUFZLEVBQUUsTUFBTTtFQUNwQixhQUFhLEVBQUUsSUFBSTtFQUNuQixZQUFZLEVBQUUsR0FBRztFQUNqQixVQUFVLEVBQUUsT0FBcUI7RUFDakMsWUFBWSxFQUFFLE9BQU8sR0FDdEI7O0FBRUQsQUFBQSxzQkFBc0IsQ0FBQztFQUNyQixLQUFLLEVBQUUsSUFBSTtFQUNYLE1BQU0sRUFBRSxJQUFJO0VBQ1osTUFBTSxFQUFFLEtBQUs7RUFDYixZQUFZLEVBQUUsR0FBRztFQUNqQixhQUFhLEVBQUUsSUFBSTtFQUNuQixZQUFZLEV0QnZURyxPQUFPLEdzQndUdkI7O0FBRUQsQUFBQSxhQUFhLENBQUM7RUFDWixLQUFLLEVBQUUsT0FBcUIsR0FDN0I7O0FBRUQsQUFBQSxZQUFZLENBQUM7RUFDWCxVQUFVLEVBQUUsOENBQThDLEdBQzNEOztBQUVELEFBQUEsWUFBWSxDQUFDO0VBQ1gsVUFBVSxFQUFFLDhDQUE4QyxHQUMzRDs7QUFFRCxBQUF1QixnQkFBUCxBQUFBLE1BQU0sQ0FBQyxVQUFVLENBQUM7RUFDaEMsVUFBVSxFQUFFLE9BQU8sR0FDcEI7O0FBRUQsQUFBQSxXQUFXLENBQUM7RUFDVixXQUFXLEVBQUUsTUFBTTtFQUNuQixTQUFTLEVBQUUsSUFBSTtFQUNmLE1BQU0sRUFBRSxJQUFJO0VBQ1osVUFBVSxFQUFFLFdBQVc7RUFDdkIsVUFBVSxFQUFFLFVBQVU7RUFDdEIsTUFBTSxFQUFFLEtBQUs7RUFDYixZQUFZLEVBQUUsV0FBVztFQUN6QixZQUFZLEVBQUUsSUFBSTtFQUNsQixhQUFhLEVBQUUsR0FBRyxHQUNuQjs7QUFFRCxBQUF1QixnQkFBUCxBQUFBLE1BQU0sQ0FBQyxXQUFXLENBQUM7RUFDakMsVUFBVSxFQUFFLE9BQU87RUFDbkIsTUFBTSxFQUFFLEtBQUs7RUFDYixZQUFZLEVBQUUsT0FBTztFQUNyQixZQUFZLEVBQUUsSUFBSTtFQUNsQixhQUFhLEVBQUUsR0FBRyxHQUNuQjs7QUFFRCxBQUFBLFdBQVcsQUFBQSxNQUFNLENBQUM7RUFDaEIsTUFBTSxFQUFFLEtBQUs7RUFDYixZQUFZLEVBQUUsT0FBTztFQUNyQixZQUFZLEVBQUUsSUFBSTtFQUNsQixhQUFhLEVBQUUsR0FBRyxHQUNuQjs7QUFFRCxBQUFBLFdBQVcsQ0FBQztFQUNWLFVBQVUsRUFBRSxPQUFPO0VBQ25CLE1BQU0sRUFBRSxJQUFJO0VBQ1osYUFBYSxFQUFFLGVBQWU7RUFDOUIsS0FBSyxFQUFFLEdBQUc7RUFDVixVQUFVLEVBQUUsTUFBTTtFQUNsQixjQUFjLEVBQUUsR0FBRyxHQUNwQjs7QUFFRCxBQUFBLGFBQWEsQ0FBQztFQUNaLE1BQU0sRUFBRSxJQUFJO0VBQ1osYUFBYSxFQUFFLGVBQWU7RUFDOUIsS0FBSyxFQUFFLEdBQUc7RUFDVixVQUFVLEVBQUUsTUFBTTtFQUNsQixjQUFjLEVBQUUsR0FBRyxHQUNwQjs7QUFFRCxBQUFBLFNBQVMsQ0FBQztFQUNSLFdBQVcsRUFBRSxNQUFNO0VBQ25CLGNBQWMsRUFBRSxTQUFTO0VBQ3pCLFVBQVUsRUFBRSxNQUFNO0VBQ2xCLFNBQVMsRUFBRSxJQUFJO0VBQ2YsS0FBSyxFQUFFLEtBQUs7RUFDWixNQUFNLEVBQUUsSUFBSTtFQUNaLE9BQU8sRUFBRSxHQUFHO0VBQ1osS0FBSyxFQUFFLE9BQU8sR0FDZjs7QUFFRCxBQUFBLFdBQVcsQ0FBQztFQUNWLFdBQVcsRUFBRSxNQUFNO0VBQ25CLEtBQUssRXRCbllVLE9BQU87RXNCb1l0QixTQUFTLEVBQUUsSUFBSTtFQUNmLFdBQVcsRUFBRSxJQUFJLEdBQ2xCOztBQUVELEFBQUEsU0FBUyxBQUFBLG1DQUFtQyxDQUFDO0VBQzNDLE9BQU8sRUFBRSxJQUFJLEdBQ2Q7O0FBRUQsQUFBQSxTQUFTLENBQUM7RUFDUixLQUFLLEVBQUUsS0FBSztFQUNaLE1BQU0sRUFBRSxLQUFLO0VBQ2IsUUFBUSxFQUFFLE1BQU0sR0FDakI7O0FBRUQsQUFBYyxhQUFELENBQUMsV0FBVyxDQUFDO0VBQ3hCLFVBQVUsRUFBRSxNQUFNLEdBQ25COztBQUVELEFBQW9CLGFBQVAsQUFBQSxNQUFNLENBQUMsV0FBVyxDQUFDO0VBQzlCLFVBQVUsRUFBRSxPQUFPLEdBQ3BCOztBQUVELEFBQW9CLGFBQVAsQUFBQSxNQUFNLENBQUMsaUJBQWlCLENBQUM7RUFDcEMsVUFBVSxFQUFFLE1BQU0sR0FDbkI7O0FBRUQsQUFBQSxTQUFTLENBQUM7RUFDUixLQUFLLEV0Qi9aVSxPQUFPLEdzQmdhdkI7O0FBRUQsQUFBVSxTQUFELENBQUMsTUFBTSxDQUFDO0VBQ2YsVUFBVSxFdEJuYUssT0FBTztFc0JvYXRCLEtBQUssRXRCeGFDLElBQUksR3NCeWFYOztBQUVELEFBQUEsaUJBQWlCLEVBQUUsQUFBQSxjQUFjLENBQUM7RUFDaEMsUUFBUSxFQUFFLE1BQU07RUFDaEIsYUFBYSxFQUFFLFFBQVEsR0FDeEI7O0FBRUQsQUFBQSxVQUFVLENBQUM7RUFDVCxTQUFTLEVBQUUsSUFBSTtFQUNmLFVBQVUsRUFBRSxJQUFJLEdBQ2pCOztBQUVELEFBQUEsV0FBVyxDQUFDO0VBQ1YsU0FBUyxFQUFFLElBQUk7RUFDZixLQUFLLEVBQUUsT0FBTyxHQUNmOztBQUVELEFBQXdCLEdBQXJCLEFBQUEsa0JBQWtCLEdBQUcsR0FBRyxBQUFBLFlBQVksQ0FBQztFQUN0QyxVQUFVLEVBQUUsSUFBSTtFQUNoQixTQUFTLEVBQUUsSUFBSTtFQUNmLEtBQUssRUFBRSxPQUFPLEdBQ2Y7O0FBRUQsQUFBQSxVQUFVLEFBQUEsTUFBTSxDQUFDO0VBQ2YsU0FBUyxFQUFFLFVBQVUsR0FDdEI7O0FBRUQsc0JBQXNCO0FDeGR0QixBQUFBLGdCQUFnQixDQUFDO0VBQ2YsT0FBTyxFQUFFLElBQUk7RUFDYixTQUFTLEVBQUUsVUFBVTtFQUNyQixXQUFXLEVBQUUsTUFBTTtFQUNuQixPQUFPLEVBQUUsU0FBUztFQUNsQixNQUFNLEVBQUUsT0FBTztFQUNmLFVBQVUsRUFBRSxZQUFZO0VBQ3hCLGdCQUFnQixFSFZFLHNCQUFPO0VHV3pCLFFBQVEsRUFBRSxRQUFRLEdBK0NuQjtFQTdDQyxBQUFBLCtCQUFnQixDQUFDO0lBQ2YsU0FBUyxFQUFFLElBQUksR0FLaEI7SUFIQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLLE9BQU8sU0FBUyxFQUFFLEtBQUs7TUFINUQsQUFBQSwrQkFBZ0IsQ0FBQztRQUliLFNBQVMsRUFBRSxJQUFJLEdBRWxCO0VBRUQsQUFBQSw2QkFBYyxDQUFDO0lBQ2IsVUFBVSxFQUFFLElBQUk7SUFDaEIsU0FBUyxFQUFFLElBQUk7SUFDZixjQUFjLEVBQUUsU0FBUyxHQUsxQjtJQUhDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUssT0FBTyxTQUFTLEVBQUUsS0FBSztNQUw1RCxBQUFBLDZCQUFjLENBQUM7UUFNWCxTQUFTLEVBQUUsR0FBRyxHQUVqQjtFQUVELE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUssT0FBTyxTQUFTLEVBQUUsS0FBSztJQTVCNUQsQUFBQSxnQkFBZ0IsQ0FBQztNQTZCYixPQUFPLEVBQUUsTUFBTSxHQTBCbEI7RUF2QkMsQUFBQSx3QkFBUyxDQUFDO0lBQ1IsZ0JBQWdCLEVIcENBLE9BQU8sR0dxQ3hCO0VBRUQsQUFBQSwyQkFBWSxDQUFDO0lBQ1gsWUFBWSxFQUFFLElBQUk7SUFDbEIsTUFBTSxFQUFFLG1CQUFtQixHQUs1QjtJQUhDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUssT0FBTyxTQUFTLEVBQUUsS0FBSztNQUo1RCxBQUFBLDJCQUFZLENBQUM7UUFLVCxZQUFZLEVBQUUsRUFBRSxHQUVuQjtFQUVELEFBQUEsMEJBQVcsQ0FBQztJQUlWLFdBQVcsRUFBRSxJQUFJLEdBQ2xCO0VBRUQsQUFBQSxpQ0FBa0IsQ0FBQztJQUNqQixJQUFJLEVBQUUsUUFBUSxHQUNmOztBQUdILEFBQUEsb0JBQW9CLENBQUM7RUFDbkIsTUFBTSxFQUFFLElBQUk7RUFDWixLQUFLLEVBQUUsS0FBSztFQUNaLGFBQWEsRUFBRSxHQUFHO0VBQ2xCLGdCQUFnQixFQUFFLG1CQUFnQjtFQUNsQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLGtCQUFlO0VBQ3ZDLFFBQVEsRUFBRSxLQUFLO0VBQ2YsVUFBVSxFQUFFLElBQUk7RUFDaEIsV0FBVyxFQUFFLEtBQUs7RUFDbEIsT0FBTyxFQUFFLElBQUksR0ErQmQ7RUE3QkMsQUFBQSxnQ0FBYSxDQUFDO0lBQ1osUUFBUSxFQUFFLEtBQUs7SUFDZixHQUFHLEVBQUUsQ0FBQztJQUNOLElBQUksRUFBRSxDQUFDO0lBQ1AsT0FBTyxFQUFFLElBQUk7SUFDYixLQUFLLEVBQUUsSUFBSTtJQUNYLE1BQU0sRUFBRSxJQUFJO0lBQ1osTUFBTSxFQUFFLE9BQU8sR0FDaEI7RUFFRCxBQUFBLCtCQUFZLENBQUM7SUFDWCxPQUFPLEVBQUUsY0FBYztJQUN2QixPQUFPLEVBQUUsSUFBSTtJQUNiLFFBQVEsRUFBRSxRQUFRLEdBQ25CO0VBRUQsQUFBQSw2QkFBVSxDQUFDO0lBQ1QsT0FBTyxFQUFFLElBQUk7SUFDYixjQUFjLEVBQUUsTUFBTTtJQUN0QixlQUFlLEVBQUUsTUFBTSxHQUN4QjtFQUVELEFBQUEsNEJBQVMsQ0FBQztJQUNSLEtBQUssRXZCdkVELElBQUk7SXVCd0VSLFdBQVcsRUFBRSxNQUFNO0lBQ25CLFNBQVMsRUFBRSxJQUFJO0lBQ2YsV0FBVyxFQUFFLElBQUk7SUFDakIsVUFBVSxFQUFFLE1BQU0sR0FDbkI7O0FDbkdILEFBQUEsVUFBVSxDQUFDO0VBQ1QsS0FBSyxFQUFFLEtBQUs7RUFDWixPQUFPLEVBQUUsSUFBSTtFQUNiLFNBQVMsRUFBRSxhQUFhO0VBQ3hCLFdBQVcsRUFBRSxNQUFNO0VBQ25CLFFBQVEsRUFBRSxRQUFRO0VBQ2xCLE9BQU8sRUFBRSxFQUFFO0VBQ1gsV0FBVyxFQUFFLGdCQUFnQixHQTZVOUI7RUEzVUMsQUFBQSxtQkFBVSxDQUFDO0lBQ1QsZ0JBQWdCLEV4QmFaLElBQUk7SXdCWlIsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ3hCTG5CLG1CQUFJO0l3Qk1SLE9BQU8sRUFBRSxJQUFJO0lBQ2IsU0FBUyxFQUFFLGFBQWE7SUFDeEIsV0FBVyxFQUFFLE1BQU07SUFDbkIsSUFBSSxFQUFFLFFBQVEsR0FDZjtFQUVELEFBQUEsMkJBQWtCLENBQUM7SUFDakIsT0FBTyxFQUFFLElBQUk7SUFDYixTQUFTLEVBQUUsYUFBYTtJQUN4QixXQUFXLEVBQUUsTUFBTTtJQUNuQixPQUFPLEVBQUUsY0FBYztJQUN2QixhQUFhLEVBQUUsR0FBRyxDQUFDLEtBQUssQ3hCSmxCLE9BQU87SXdCS2IsSUFBSSxFQUFFLFFBQVEsR0FDZjtFQUVELEFBQUEsaUJBQVEsQ0FBQztJQUNQLEtBQUssRXhCSUUsT0FBTztJd0JIZCxTQUFTLEVBQUUsSUFBSTtJQUNmLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFdBQVcsRUFBRSxHQUFHO0lBQ2hCLGFBQWEsRUFBRSxJQUFJLEdBQ3BCO0VBRUQsQUFBQSx1QkFBYyxDQUFDO0lBQ2IsVUFBVSxFQUFFLE1BQU0sR0FDbkI7RUFFRCxBQUFpQix1QkFBSCxHQUFHLHVCQUFjLENBQUM7SUFDOUIsVUFBVSxFQUFFLElBQUksR0FDakI7RUFFRCxBQUFBLG9DQUEyQixDQUFDO0lBQzFCLE1BQU0sRUFBRSxNQUFNLEdBQ2Y7RUFFRCxBQUFBLDZCQUFvQixDQUFDO0lBQ25CLEtBQUssRUFBRSxJQUFJO0lBQ1gsYUFBYSxFQUFFLEdBQUcsQ0FBQyxLQUFLLEN4Qi9CbEIsT0FBTyxHd0JnQ2Q7RUFFRCxBQUFBLDJCQUFrQixDQUFDO0lBQ2pCLE9BQU8sRUFBRSxNQUFNO0lBQ2YsS0FBSyxFQUFFLEtBQUs7SUFDWixNQUFNLEVBQUUsTUFBTTtJQUNkLFFBQVEsRUFBRSxRQUFRLEdBQ25CO0VBRUQsQUFBQSxzQ0FBNkIsQ0FBQztJQUM1QixRQUFRLEVBQUUsUUFBUTtJQUNsQixNQUFNLEVBQUUsS0FBSztJQUNiLFNBQVMsRUFBRSxJQUFJO0lBQ2YsS0FBSyxFQUFFLElBQUk7SUFDWCxhQUFhLEVBQUUsUUFBUTtJQUN2QixRQUFRLEVBQUUsTUFBTTtJQUNoQixXQUFXLEVBQUUsTUFBTTtJQUNuQixLQUFLLEV4QjVESCxJQUFJLEd3QjZEUDtFQUVELEFBQUEsaUJBQVEsQ0FBQztJQUNQLEtBQUssRUFBRSxJQUFJO0lBQ1gsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLEN4QnREWCxPQUFPO0l3QnVEYixhQUFhLEVBQUUsR0FBRztJQUNsQixPQUFPLEVBQUUsUUFBUTtJQUNqQixTQUFTLEVBQUUsSUFBSTtJQUNmLFdBQVcsRUFBRSxJQUFJLEdBS2xCO0lBWEQsQUFRRSxpQkFSTSxBQVFOLGFBQWMsQ0FBQztNQUNiLEtBQUssRXhCL0NGLE9BQU8sR3dCZ0RYO0VBR0gsQUFBQSxtQkFBVSxDQUFDO0lBQ1QsS0FBSyxFQUFFLElBQUksR0FDWjtFQUVELEFBQUEsc0JBQWEsQ0FBQztJQUNaLEtBQUssRXhCekRFLE9BQU87SXdCMERkLFNBQVMsRUFBRSxJQUFJO0lBQ2YsV0FBVyxFQUFFLElBQUk7SUFDakIsVUFBVSxFQUFFLE1BQU07SUFDbEIsT0FBTyxFQUFFLE1BQU07SUFDZixXQUFXLEVBQUUsR0FBRztJQUNoQixNQUFNLEVBQUUsT0FBTyxHQWdCaEI7SUF2QkQsQUFTRSxzQkFUVyxBQVNYLE1BQU8sQ0FBQztNQUNOLGdCQUFnQixFQUFFLG1CQUFrQixHQUNyQztJQVhILEFBYUUsc0JBYlcsQUFhWCxPQUFRLENBQUM7TUFDUCxnQkFBZ0IsRUFBRSxrQkFBaUIsR0FDcEM7SUFmSCxBQWlCRSxzQkFqQlcsQ0FpQlgsR0FBRyxDQUFDO01BQ0YsUUFBUSxFQUFFLFFBQVE7TUFDbEIsS0FBSyxFQUFFLElBQUk7TUFDWCxTQUFTLEVBQUUsSUFBSTtNQUNmLFdBQVcsRUFBRSxJQUFJLEdBQ2xCO0VBR0gsQUFBQSwyQkFBa0IsQ0FBQztJQUNqQixPQUFPLEVBQUUsSUFBSTtJQUNiLFNBQVMsRUFBRSxhQUFhO0lBQ3hCLE1BQU0sRUFBRSxVQUFVLEdBQ25CO0VBRUQsQUFBQSw0QkFBbUIsQ0FBQztJQUNsQixLQUFLLEVBQUUsS0FBSztJQUNaLE1BQU0sRUFBRSxNQUFNO0lBQ2QsUUFBUSxFQUFFLFFBQVEsR0FPbkI7SUFMQyxBQUNFLG1DQURNLENBQ04sNEJBQTRCLENBQUM7TUFDM0IsWUFBWSxFeEJ0SGQsSUFBSSxHd0J1SEg7RUFJTCxBQUFBLG9DQUEyQixDQUFDO0lBQzFCLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLE1BQU0sRUFBRSxLQUFLO0lBQ2IsU0FBUyxFQUFFLElBQUk7SUFDZixLQUFLLEVBQUUsSUFBSTtJQUNYLGFBQWEsRUFBRSxRQUFRO0lBQ3ZCLFFBQVEsRUFBRSxNQUFNO0lBQ2hCLFdBQVcsRUFBRSxNQUFNO0lBQ25CLEtBQUssRXhCbklILElBQUksR3dCb0lQO0VBRUQsQUFBQSw0QkFBbUIsQ0FBQztJQUNsQixTQUFTLEVBQUUsSUFBSTtJQUNmLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLGFBQWEsRUFBRSxHQUFHLEdBQ25CO0VBRUQsQUFBQSw0QkFBbUIsQ0FBQztJQUNsQixLQUFLLEVBQUUsSUFBSTtJQUNYLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDeEJySFosT0FBTztJd0JzSFosT0FBTyxFQUFFLFFBQVE7SUFDakIsU0FBUyxFQUFFLElBQUk7SUFDZixXQUFXLEVBQUUsSUFBSSxHQUtsQjtJQVZELEFBT0UsNEJBUGlCLEFBT2pCLGFBQWMsQ0FBQztNQUNiLEtBQUssRXhCM0hGLE9BQU8sR3dCNEhYO0VBR0gsQUFBc0IsNEJBQUgsR0FBRyw0QkFBbUIsQ0FBQztJQUN4QyxVQUFVLEVBQUUsSUFBSSxHQUNqQjtFQUVELEFBQUEsbUJBQVUsQ0FBQztJQUNULE9BQU8sRUFBRSxJQUFJO0lBQ2IsU0FBUyxFQUFFLGFBQWE7SUFDeEIsTUFBTSxFQUFFLFdBQVc7SUFDbkIsSUFBSSxFQUFFLFFBQVEsR0FDZjtFQUVELEFBQUEsaUNBQXdCLENBQUM7SUFDdkIsT0FBTyxFQUFFLElBQUk7SUFDYixTQUFTLEVBQUUsUUFBUSxHQUNwQjtFQUVELEFBQUEseUJBQWdCLENBQUM7SUFDZixVQUFVLEVBQUUsaUJBQWlCO0lBQzdCLE9BQU8sRUFBRSxJQUFJO0lBQ2IsU0FBUyxFQUFFLFVBQVU7SUFDckIsSUFBSSxFQUFFLFNBQVM7SUFDZixXQUFXLEVBQUUsTUFBTTtJQUNuQixPQUFPLEVBQUUsSUFBSTtJQUNiLE1BQU0sRUFBRSxJQUFJO0lBQ1osVUFBVSxFQUFFLFVBQVU7SUFDdEIsYUFBYSxFQUFFLElBQUk7SUFDbkIsTUFBTSxFQUFFLE9BQU87SUFDZixNQUFNLEVBQUUscUJBQXFCO0lBQzdCLFFBQVEsRUFBRSxRQUFRLEdBY25CO0lBMUJELEFBY0UseUJBZGMsQUFjZCxNQUFPLENBQUM7TUFDTixNQUFNLEVBQUUsR0FBRyxDQUFDLEtBQUssQ3hCdkpULHdCQUFPLEd3QndKaEI7SUFFRCxBQUFBLG1DQUFXLENBQUM7TUFDVixNQUFNLEVBQUUsR0FBRyxDQUFDLEtBQUssQ3hCM0pULE9BQU8sQ3dCMkpnQixVQUFVLEdBQzFDO0lBRUQsQUFBQSxtQ0FBVyxDQUFDO01BQ1YsT0FBTyxFQUFFLEVBQUU7TUFDWCxjQUFjLEVBQUUsSUFBSSxHQUNyQjtFQUdILEFBQUEsc0JBQWEsQ0FBQztJQUNaLFVBQVUsRUFBRSxVQUFVLEdBQ3ZCO0VBRUQsQUFBQSxzQkFBYSxDQUFDO0lBQ1osU0FBUyxFQUFFLElBQUk7SUFDZixXQUFXLEVBQUUsSUFBSSxHQUNsQjtFQUVELEFBQUEsd0JBQWUsQ0FBQztJQUNkLFNBQVMsRUFBRSxJQUFJO0lBQ2YsV0FBVyxFQUFFLElBQUk7SUFDakIsV0FBVyxFQUFFLEdBQUcsR0FDakI7RUFFRCxBQUFBLHNCQUFhLENBQUM7SUFDWixLQUFLLEVBQUUsSUFBSTtJQUNYLE1BQU0sRUFBRSxJQUFJO0lBQ1osaUJBQWlCLEVBQUUsU0FBUztJQUM1QixlQUFlLEVBQUUsT0FBTztJQUN4QixtQkFBbUIsRUFBRSxNQUFNO0lBQzNCLGFBQWEsRUFBRSxHQUFHO0lBQ2xCLGdCQUFnQixFeEIzTVosSUFBSTtJd0I0TVIsVUFBVSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ3hCN05uQixtQkFBSTtJd0I4TlIsWUFBWSxFQUFFLElBQUk7SUFDbEIsSUFBSSxFQUFFLFFBQVEsR0FDZjtFQUVELEFBQUEseUJBQWdCLENBQUM7SUFDZixRQUFRLEVBQUUsUUFBUTtJQUNsQixLQUFLLEV4QnhNUyxPQUFPO0l3QnlNckIsU0FBUyxFQUFFLElBQUk7SUFDZixNQUFNLEVBQUUsQ0FBQztJQUNULElBQUksRUFBRSxJQUFJLEdBQ1g7RUFFRCxBQUFBLG1DQUEwQixDQUFDO0lBQ3pCLE9BQU8sRUFBRSxJQUFJO0lBQ2IsU0FBUyxFQUFFLGFBQWEsR0FxQnpCO0lBdkJELEFBSUUsbUNBSndCLENBSXhCLGNBQWMsQ0FBQztNQUNiLE9BQU8sRUFBRSxJQUFJO01BQ2IsU0FBUyxFQUFFLFVBQVU7TUFDckIsV0FBVyxFQUFFLFVBQVUsR0FleEI7TUF0QkgsQUFJRSxtQ0FKd0IsQ0FTdEIsc0JBQVMsQ0FBQztRQUNSLEtBQUssRXhCMU5GLE9BQU87UXdCMk5WLFNBQVMsRUFBRSxJQUFJO1FBQ2YsV0FBVyxFQUFFLEdBQUc7UUFDaEIsV0FBVyxFQUFFLElBQUk7UUFDakIsWUFBWSxFQUFFLEdBQUcsR0FDbEI7TUFmTCxBQUlFLG1DQUp3QixDQWlCdEIsc0JBQVMsQ0FBQztRQUNSLEtBQUssRXhCbE9GLE9BQU87UXdCbU9WLFNBQVMsRUFBRSxJQUFJO1FBQ2YsV0FBVyxFQUFFLElBQUksR0FDbEI7RUFJTCxBQUFBLDhCQUFxQixDQUFDO0lBQ3BCLE9BQU8sRUFBRSxlQUFlLEdBTXpCO0lBSkMsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztNQUhyQyxBQUFBLDhCQUFxQixDQUFDO1FBSWxCLE9BQU8sRUFBRSxNQUFNO1FBQ2YsS0FBSyxFQUFFLElBQUksR0FFZDtFQUVELEFBQUEsZ0NBQXVCLENBQUM7SUFDdEIsY0FBYyxFQUFFLElBQUksR0FDckI7RUFFRCxBQUFBLHdDQUErQixDQUFDO0lBQzlCLE9BQU8sRUFBRSxJQUFJO0lBQ2IsU0FBUyxFQUFFLFVBQVU7SUFDckIsTUFBTSxFQUFFLE1BQU07SUFDZCxXQUFXLEVBQUUsTUFBTSxHQUNwQjtFQUVELEFBQWtDLHdDQUFILEdBQUcsd0NBQStCLENBQUM7SUFDaEUsVUFBVSxFQUFFLElBQUksR0FDakI7RUFFRCxBQUFBLG1DQUEwQixDQUFDO0lBQ3pCLFlBQVksRUFBRSxJQUFJLEdBQ25CO0VBRUQsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztJQXJTckMsQUFBQSxVQUFVLENBQUM7TUFzU1AsR0FBRyxFQUFFLENBQUM7TUFDTixLQUFLLEVBQUUsSUFBSTtNQUNYLFFBQVEsRUFBRSxNQUFNO01BQ2hCLE1BQU0sRUFBRSxJQUFJLEdBMkNmO01BekNHLEFBQUEsbUJBQVUsQ0FBQztRQUNULFVBQVUsRUFBRSxlQUFlO1FBQzNCLElBQUksRUFBRSxRQUFRO1FBQ2QsS0FBSyxFQUFFLElBQUk7UUFDWCxVQUFVLEVBQUUsSUFBSSxHQUNqQjtNQUVELEFBQUEsbUJBQVUsQ0FBQztRQUNULGFBQWEsRUFBRSxHQUFHLENBQUMsS0FBSyxDeEJoU3BCLE9BQU8sR3dCaVNaO01BRUQsQUFBQSxzQkFBYSxDQUFDO1FBQ1osS0FBSyxFQUFFLElBQUk7UUFDWCxNQUFNLEVBQUUsSUFBSSxHQUNiO01BRUQsQUFBQSx3QkFBZSxDQUFDO1FBQ2QsU0FBUyxFQUFFLElBQUk7UUFDZixXQUFXLEVBQUUsSUFBSSxHQUNsQjtNQUVELEFBQUEsc0JBQWEsQ0FBQztRQUNaLFNBQVMsRUFBRSxJQUFJO1FBQ2YsV0FBVyxFQUFFLElBQUksR0FDbEI7TUFFRCxBQUFBLG1CQUFVLENBQUM7UUFDVCxTQUFTLEVBQUUsVUFBVTtRQUNyQixLQUFLLEVBQUUsSUFBSTtRQUNYLFdBQVcsRUFBRSxNQUFNO1FBQ25CLGVBQWUsRUFBRSxNQUFNO1FBQ3ZCLE9BQU8sRUFBRSxNQUFNO1FBQ2YsTUFBTSxFQUFFLENBQUM7UUFDVCxVQUFVLEVBQUUsR0FBRyxDQUFDLEtBQUssQ3hCelRqQixPQUFPLEd3QitUWjtRQWJELEFBU0UsbUJBVFEsQ0FTUixNQUFNLENBQUM7VUFDTCxJQUFJLEVBQUUsUUFBUTtVQUNkLE1BQU0sRUFBRSxNQUFNLEdBQ2Y7O0FDalZQLEFBQUEsaUJBQWlCLENBQUM7RUFDaEIsTUFBTSxFQUFFLElBQUk7RUFDWixLQUFLLEVBQUUsTUFBTTtFQUNiLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDekJzQlosT0FBTztFeUJyQlosYUFBYSxFQUFFLEdBQUc7RUFDbEIsZ0JBQWdCLEV6QmtCVixJQUFJO0V5QmpCVixLQUFLLEV6QmtCTSxPQUFPO0V5QmpCbEIsV0FBVyxFQUFFLE1BQU07RUFDbkIsU0FBUyxFQUFFLElBQUk7RUFDZixXQUFXLEVBQUUsR0FBRztFQUNoQixPQUFPLEVBQUUsUUFBUTtFQUNqQixRQUFRLEVBQUUsUUFBUSxHQTRDbkI7RUExQ0MsQUFBQSw4QkFBYyxDQUFDO0lBQ2IsT0FBTyxFQUFFLElBQUksR0FDZDtFQUVELEFBQUEsd0JBQVEsQ0FBQztJQUNQLEtBQUssRXpCY0UsT0FBTztJeUJiZCxXQUFXLEVBQUUsTUFBTTtJQUNuQixTQUFTLEVBQUUsSUFBSTtJQUNmLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLE1BQU0sRUFBRSxJQUFJO0lBQ1osT0FBTyxFQUFFLFlBQVk7SUFDckIsU0FBUyxFQUFFLElBQUksR0FDaEI7RUFFRCxBQUFBLG1DQUFtQixDQUFDO0lBQ2xCLEtBQUssRXpCSUUsT0FBTztJeUJIZCxXQUFXLEVBQUUsR0FBRztJQUNoQixXQUFXLEVBQUUsTUFBTTtJQUNuQixTQUFTLEVBQUUsSUFBSTtJQUNmLFdBQVcsRUFBRSxJQUFJLEdBQ2xCO0VBRUQsQUFBQSxnQ0FBZ0IsQ0FBQztJQUNmLE9BQU8sRUFBRSxJQUFJLEdBQ2Q7RUFFRCxBQUFBLGtDQUFrQixFQUNsQixBQUFBLHFDQUFxQixDQUFDO0lBQ3BCLEtBQUssRXpCakJJLE9BQU87SXlCa0JoQixXQUFXLEVBQUUsTUFBTTtJQUNuQixTQUFTLEVBQUUsSUFBSTtJQUNmLFdBQVcsRUFBRSxJQUFJLEdBQ2xCO0VBRUQsQUFBQSxnQ0FBZ0IsQ0FBQztJQUNmLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLE9BQU8sRUFBRSxJQUFJLEdBQ2Q7RUFFRCxBQUFBLGtDQUFrQixDQUFDO0lBQ2pCLFVBQVUsRUFBRSxHQUFHLEdBQ2hCOztBQ3RESCxBQUFBLGFBQWEsQ0FBQztFQUNaLFFBQVEsRUFBRSxLQUFLO0VBQ2YsT0FBTyxFQUFFLEdBQUc7RUFDWixHQUFHLEVBQUUsSUFBSTtFQUNULEtBQUssRUFBRSxLQUFLLEdBK0hiO0VBN0hDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7SUFOckMsQUFBQSxhQUFhLENBQUM7TUFPVixLQUFLLEVBQUUsZ0NBQWdDLEdBNEgxQztFQXpIQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0lBVnJDLEFBQUEsYUFBYSxDQUFDO01BV1YsS0FBSyxFQUFFLHdCQUF3QixHQXdIbEM7RUFySEMsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztJQWRyQyxBQUFBLGFBQWEsQ0FBQztNQWVWLEtBQUssRUFBRSx3QkFBd0IsR0FvSGxDO0VBakhDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLE1BQU07SUFsQnRDLEFBQUEsYUFBYSxDQUFDO01BbUJWLEtBQUssRUFBRSx3QkFBd0IsR0FnSGxDO0VBN0dDLEFBQUEsbUJBQU8sQ0FBQztJQUNOLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLE1BQU0sRUFBRSxPQUFPLEdBQ2hCO0VBRUQsQUFBQSxxQkFBUyxDQUFDO0lBQ1IsT0FBTyxFQUFFLElBQUk7SUFDYixTQUFTLEVBQUUsVUFBVTtJQUNyQixlQUFlLEVBQUUsYUFBYTtJQUM5QixXQUFXLEVBQUUsTUFBTSxHQUNwQjtFQUVELEFBQUEsNEJBQWdCLENBQUM7SUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLEtBQUssQzFCWFIsT0FBTztJMEJZaEIsZ0JBQWdCLEVBQUUsV0FBVztJQUM3QixLQUFLLEUxQmRELElBQUk7STBCZVIsYUFBYSxFQUFFLEdBQUc7SUFDbEIsU0FBUyxFQUFFLElBQUk7SUFDZixXQUFXLEVBQUUsSUFBSTtJQUNqQixPQUFPLEVBQUUsTUFBTTtJQUNmLFdBQVcsRUFBRSxHQUFHLEdBQ2pCO0VBM0NILEFBNkNFLGFBN0NXLENBNkNYLEdBQUcsQ0FBQztJQUNGLEtBQUssRUFBRSxJQUFJO0lBQ1gsTUFBTSxFQUFFLElBQUksR0FDYjtFQUVELEFBQUEsdUJBQVcsQ0FBQztJQUNWLE9BQU8sRUFBRSxJQUFJO0lBQ2IsU0FBUyxFQUFFLGFBQWE7SUFDeEIsVUFBVSxFQUFFLElBQUk7SUFDaEIsVUFBVSxFQUFFLEtBQUs7SUFDakIsUUFBUSxFQUFFLFFBQVE7SUFDbEIsT0FBTyxFQUFFLEdBQUcsR0FlYjtJQXJCRCxBQVFFLHVCQVJTLEFBUVQsbUJBQW9CLENBQUM7TUFDbkIsT0FBTyxFQUFFLElBQUksR0FDZDtJQUVELE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7TUFackMsQUFBQSx1QkFBVyxDQUFDO1FBYVIsVUFBVSxFQUFFLEtBQUssR0FRcEI7SUFyQkQsQUFnQkUsdUJBaEJTLENBZ0JULGNBQWMsQ0FBQztNQUNiLFVBQVUsRUFBRSxHQUFHO01BQ2YsZ0JBQWdCLEUxQjlEZCxJQUFJO00wQitETixLQUFLLEUxQjdDRSxPQUFPLEcwQjhDZjtFQUdILEFBQUEsc0JBQVUsQ0FBQztJQUNULE9BQU8sRUFBRSxJQUFJO0lBQ2IsU0FBUyxFQUFFLFVBQVU7SUFDckIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsSUFBSSxFQUFFLFFBQVEsR0FLZjtJQUhDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7TUFOckMsQUFBQSxzQkFBVSxDQUFDO1FBT1AsT0FBTyxFQUFFLFNBQVMsR0FFckI7RUFFRCxBQUFBLDJCQUFlLENBQUM7SUFDZCxJQUFJLEVBQUUsUUFBUTtJQUNkLE9BQU8sRUFBRSxJQUFJO0lBQ2IsU0FBUyxFQUFFLGFBQWE7SUFDeEIsV0FBVyxFQUFFLEdBQUcsR0FDakI7RUFFRCxBQUFBLHlCQUFhLENBQUM7SUFDWixLQUFLLEVBQUUsSUFBSTtJQUNYLFlBQVksRUFBRSxJQUFJO0lBQ2xCLElBQUksRUFBRSxRQUFRLEdBQ2Y7RUFFRCxBQUFBLDhCQUFrQixDQUFDO0lBQ2pCLGdCQUFnQixFQUFFLDZCQUE2QjtJQUMvQyxNQUFNLEVBQUUsSUFBSTtJQUNaLEtBQUssRUFBRSxJQUFJO0lBQ1gsaUJBQWlCLEVBQUUsU0FBUztJQUM1QixtQkFBbUIsRUFBRSxNQUFNO0lBQzNCLGVBQWUsRUFBRSxPQUFPO0lBQ3hCLE1BQU0sRUFBRSxLQUFLLEdBQ2Q7RUF6R0gsQUEyR0UsYUEzR1csQ0EyR1gsVUFBVSxDQUFDO0lBQ1QsTUFBTSxFQUFFLFVBQVU7SUFDbEIsSUFBSSxFQUFFLFFBQVEsR0FDZjtFQUVELEFBQUEsbUJBQU8sQ0FBQztJQUNOLEtBQUssRTFCMUZELElBQUk7STBCMkZSLFNBQVMsRUFBRSxJQUFJO0lBQ2YsV0FBVyxFQUFFLEdBQUc7SUFDaEIsV0FBVyxFQUFFLElBQUksR0FDbEI7RUFFRCxBQUFBLHNCQUFVLENBQUM7SUFDVCxLQUFLLEUxQmhHSSxPQUFPO0kwQmlHaEIsU0FBUyxFQUFFLElBQUk7SUFDZixXQUFXLEVBQUUsSUFBSSxHQUNsQjtFQUVELEFBQUEscUJBQVMsQ0FBQztJQUNSLFNBQVMsRUFBRSxJQUFJO0lBQ2YsV0FBVyxFQUFFLElBQUk7SUFDakIsV0FBVyxFQUFFLEdBQUc7SUFDaEIsTUFBTSxFQUFFLE9BQU8sR0FDaEI7O0FDbElILEFBQUEsS0FBSyxDQUFDO0VBQ0osYUFBYSxFQUFFLEdBQUc7RUFDbEIsVUFBVSxFM0JJSixrQkFBSTtFMkJIVixVQUFVLEUzQkdKLG1CQUFJLEMyQkhvQixDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHO0VBQzNDLFNBQVMsRUFBRSxLQUFLO0VBQ2hCLEtBQUssRTNCa0JDLElBQUksRzJCbUNYO0VBbkRDLEFBQUEsV0FBTyxDQUFDO0lBQ04sT0FBTyxFQUFFLElBQUk7SUFDYixPQUFPLEVBQUUsSUFBSTtJQUNiLFNBQVMsRUFBRSxVQUFVO0lBQ3JCLFdBQVcsRUFBRSxNQUFNO0lBQ25CLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLE9BQU8sRUFBRSxHQUFHO0lBQ1osV0FBVyxFQUFFLEdBQUcsR0E0QmpCO0lBMUJDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7TUFUckMsQUFBQSxXQUFPLENBQUM7UUFVSixPQUFPLEVBQUUsSUFBSSxHQXlCaEI7SUF0QkMsQUFBQSxzQkFBWSxDQUFDO01BQ1gsTUFBTSxFQUFFLE9BQU8sR0FTaEI7TUFWRCxBQUdFLHNCQUhVLEFBR1YsTUFBTyxDQUFDO1FBQ04sZ0JBQWdCLEUzQkRoQix5QkFBSSxHMkJFTDtNQUxILEFBT0Usc0JBUFUsQUFPVixPQUFRLENBQUM7UUFDUCxnQkFBZ0IsRTNCTGhCLHdCQUFJLEcyQk1MO0lBR0gsQUFBQSxpQkFBTyxDQUFDO01BQ04sTUFBTSxFQUFFLElBQUk7TUFDWixLQUFLLEVBQUUsSUFBSTtNQUNYLFlBQVksRUFBRSxJQUFJLEdBQ25CO0lBRUQsQUFBQSxpQkFBTyxDQUFDO01BQ04sU0FBUyxFQUFFLElBQUk7TUFDZixXQUFXLEVBQUUsSUFBSSxHQUNsQjtFQUdILEFBQUEsY0FBVSxDQUFDO0lBQ1QsZ0JBQWdCLEUzQmJULE9BQU87STJCY2QsS0FBSyxFQUFFLElBQUk7SUFDWCxNQUFNLEVBQUUsR0FBRyxHQUNaO0VBRUQsQUFBQSxpQkFBYSxDQUFDO0lBQ1osUUFBUSxFQUFFLEtBQUs7SUFDZixLQUFLLEVBQUUsSUFBSTtJQUNYLE1BQU0sRUFBRSxJQUFJO0lBQ1osR0FBRyxFQUFFLENBQUM7SUFDTixJQUFJLEVBQUUsQ0FBQztJQUNQLE9BQU8sRUFBRSxHQUFHLEdBQ2I7O0FDekRILEFBQUEsV0FBVyxDQUFDO0VBQ1YsUUFBUSxFQUFFLFFBQVE7RUFDbEIsS0FBSyxFQUFFLEtBQUssR0FnRGI7RUE5Q0MsQUFBQSxrQkFBUSxDQUFDO0lBQ1AsS0FBSyxFQUFFLEtBQUs7SUFDWixXQUFXLEVBQUUsSUFBSTtJQUNqQixPQUFPLEVBQUUsQ0FBQyxHQUNYO0VBUkgsQUFVRSxXQVZTLENBVVQsS0FBSyxDQUFBLEFBQUEsSUFBQyxDQUFELEtBQUMsQUFBQSxFQUFZO0lBQ2hCLGtCQUFrQixFQUFFLGVBQWUsR0FDcEM7RUFaSCxBQWNFLFdBZFMsQ0FjVCxLQUFLLENBQUEsQUFBQSxJQUFDLENBQUQsS0FBQyxBQUFBLENBQVcsc0JBQXNCLENBQUM7SUFDdEMsa0JBQWtCLEVBQUUsZUFBZTtJQUNuQyxNQUFNLEVBQUUsSUFBSTtJQUNaLEtBQUssRUFBRSxJQUFJO0lBQ1gsTUFBTSxFQUFFLGlCQUFpQjtJQUN6QixnQkFBZ0IsRUFBRSxPQUFPO0lBQ3pCLFVBQVUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsbUJBQWdCO0lBQ3hDLGFBQWEsRUFBRSxHQUFHO0lBQ2xCLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLE9BQU8sRUFBRSxFQUFFLEdBQ1o7RUFFRCxBQUFBLGdCQUFNLENBQUM7SUFDTCxNQUFNLEVBQUUsR0FBRztJQUNYLEtBQUssRUFBRSxLQUFLO0lBQ1osVUFBVSxFNUJKUCxPQUFPO0k0QktWLE9BQU8sRUFBRSxJQUFJO0lBQ2IsZUFBZSxFQUFFLGFBQWE7SUFDOUIsUUFBUSxFQUFFLFFBQVE7SUFDbEIsR0FBRyxFQUFFLElBQUk7SUFDVCxPQUFPLEVBQUUsQ0FBQyxHQUNYO0VBRUQsQUFBQSxnQkFBTSxFQUFFLEFBQUEsaUJBQU8sQ0FBQztJQUNkLE1BQU0sRUFBRSxHQUFHO0lBQ1gsS0FBSyxFQUFFLElBQUk7SUFDWCxPQUFPLEVBQUUsQ0FBQyxHQUNYO0VBRUQsQUFBQSxnQkFBTSxDQUFDO0lBQ0wsZ0JBQWdCLEU1QlJWLE9BQU8sRzRCU2Q7RUFFRCxBQUFBLGlCQUFPLENBQUM7SUFDTixnQkFBZ0IsRTVCZEYsT0FBTyxHNEJldEI7O0FDakRILEFBQUEsU0FBUyxDQUFDO0VBQ1IsUUFBUSxFQUFFLFFBQVE7RUFDbEIsVUFBVSxFN0JxQkosSUFBSTtFNkJwQlYsT0FBTyxFQUFFLElBQUk7RUFDYixTQUFTLEVBQUUsYUFBYTtFQUN4QixNQUFNLEVBQUUsSUFBSTtFQUNaLFFBQVEsRUFBRSxJQUFJLEdBQ2Y7O0FBRUQsQUFBQSxpQkFBaUIsQ0FBQztFQUNoQixPQUFPLEVBQUUsSUFBSSxHQUNkOztBQUVELEFBQUEsdUJBQXVCLEFBQUEsT0FBTyxDQUFDO0VBQzdCLE9BQU8sRUFBRSxPQUFPO0VBQ2hCLFNBQVMsRUFBRSxJQUFJO0VBQ2YsS0FBSyxFN0JRTSxPQUFPO0U2QlBsQixRQUFRLEVBQUUsUUFBUTtFQUNsQixHQUFHLEVBQUUsSUFBSTtFQUNULEtBQUssRUFBRSxJQUFJO0VBQ1gsTUFBTSxFQUFFLE9BQU8sR0FDaEI7O0FBRUQsQUFBQSxnQkFBZ0IsQ0FBQztFQUNmLGNBQWMsRUFBRSxJQUFJO0VBQ3BCLFVBQVUsRUFBRSxNQUFNO0VBQ2xCLEtBQUssRTdCVUcsT0FBTyxHNkJUaEI7O0FBRUQsQUFBQSxrQkFBa0IsQ0FBQztFQUNqQixPQUFPLEVBQUUsTUFBTSxHQUNoQjs7QUFFRCxBQUFBLHNCQUFzQixDQUFDO0VBQ3JCLE9BQU8sRUFBRSxJQUFJO0VBQ2IsY0FBYyxFQUFFLEdBQUc7RUFDbkIsT0FBTyxFQUFFLFdBQVcsR0FNckI7RUFKQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0lBTHJDLEFBQUEsc0JBQXNCLENBQUM7TUFNbkIsY0FBYyxFQUFFLE1BQU07TUFDdEIsT0FBTyxFQUFFLE1BQU0sR0FFbEI7O0FBRUQsQUFBQSx1QkFBdUIsQ0FBQztFQUN0QixJQUFJLEVBQUUsQ0FBQztFQUNQLFNBQVMsRUFBRSxDQUFDO0VBQ1osT0FBTyxFQUFFLElBQUk7RUFDYixjQUFjLEVBQUUsTUFBTTtFQUN0QixPQUFPLEVBQUUsS0FBSztFQUNkLE1BQU0sRUFBRSxJQUFJLEdBVWI7RUFSQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0lBUnJDLEFBQUEsdUJBQXVCLENBQUM7TUFTcEIsTUFBTSxFQUFFLE9BQU87TUFDZixPQUFPLEVBQUUsS0FBSyxHQU1qQjtFQUhDLEFBQUEsdUNBQWlCLENBQUM7SUFDaEIsTUFBTSxFQUFFLE9BQU8sR0FDaEI7O0FBR0gsQUFBQSwyQkFBMkIsQ0FBQztFQUMxQixTQUFTLEVBQUUsS0FBSztFQUNoQixPQUFPLEVBQUUsSUFBSTtFQUNiLGNBQWMsRUFBRSxNQUFNLEdBTXZCO0VBSkMsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztJQUxyQyxBQUFBLDJCQUEyQixDQUFDO01BTXhCLFNBQVMsRUFBRSxJQUFJO01BQ2YsS0FBSyxFQUFFLElBQUksR0FFZDs7QUFFRCxBQUFBLDhCQUE4QixDQUFDO0VBQzdCLFNBQVMsRUFBRSxJQUFJO0VBQ2YsS0FBSyxFN0JuRE0sT0FBTztFNkJvRGxCLFdBQVcsRUFBRSxHQUFHLEdBQ2pCOztBQUVELEFBQUEsZ0JBQWdCLENBQUM7RUFDZixZQUFZLEVBQUUsSUFBSTtFQUNsQixTQUFTLEVBQUUsSUFBSTtFQUNmLE1BQU0sRUFBRSxJQUFJO0VBQ1osTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLEM3QjFEWixPQUFPLEc2QjJEYjs7QUFFRCxBQUFBLGdCQUFnQixBQUFBLDJCQUEyQixDQUFDO0VBQzFDLFdBQVcsRUFBRSxHQUFHO0VBQ2hCLEtBQUssRTdCaEVNLE9BQU8sRzZCaUVuQjs7QUFFRCxBQUFBLGdCQUFnQixBQUFBLGtCQUFrQixDQUFDO0VBQ2pDLFdBQVcsRUFBRSxHQUFHO0VBQ2hCLEtBQUssRTdCckVNLE9BQU8sRzZCc0VuQjs7QUFFRCxBQUFBLGdCQUFnQixBQUFBLHNCQUFzQixDQUFDO0VBQ3JDLFdBQVcsRUFBRSxHQUFHO0VBQ2hCLEtBQUssRTdCMUVNLE9BQU8sRzZCMkVuQjs7QUFFRCxBQUFBLGdCQUFnQixBQUFBLGlCQUFpQixDQUFDO0VBQ2hDLFdBQVcsRUFBRSxHQUFHO0VBQ2hCLEtBQUssRTdCL0VNLE9BQU8sRzZCZ0ZuQjs7QUFFRCxBQUFBLDJCQUEyQixDQUFDO0VBQzFCLFNBQVMsRUFBRSxJQUFJO0VBQ2YsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLEM3Qm5GWixPQUFPO0U2Qm9GWixhQUFhLEVBQUUsR0FBRztFQUNsQixPQUFPLEVBQUUsSUFBSTtFQUNiLGdCQUFnQixFN0J4RlYsSUFBSTtFNkJ5RlYsT0FBTyxFQUFFLElBQUk7RUFDYixXQUFXLEVBQUUsTUFBTTtFQUNuQixlQUFlLEVBQUUsVUFBVSxHQUM1Qjs7QUFFRCxBQUFBLHdCQUF3QixDQUFDO0VBQ3ZCLE1BQU0sRUFBRSxJQUFJO0VBQ1osS0FBSyxFQUFFLElBQUk7RUFDWCxZQUFZLEVBQUUsSUFBSTtFQUNsQixhQUFhLEVBQUUsSUFBSSxHQUNwQjs7QUFFRCxBQUFBLDBCQUEwQixDQUFDO0VBQ3pCLFVBQVUsRUFBRSxRQUFRO0VBQ3BCLE9BQU8sRUFBRSxHQUFHO0VBQ1osY0FBYyxFQUFFLFNBQVM7RUFDekIsS0FBSyxFN0J4R00sT0FBTztFNkJ5R2xCLE1BQU0sRUFBRSxPQUFPLEdBQ2hCOztBQUVELEFBQUEsdUJBQXVCLENBQUM7RUFDdEIsU0FBUyxFQUFFLElBQUk7RUFDZixNQUFNLEVBQUUsR0FBRyxDQUFDLEtBQUssQzdCMUdKLE9BQU87RTZCMkdwQixLQUFLLEU3QjNHUSxPQUFPO0U2QjRHcEIsYUFBYSxFQUFFLEdBQUc7RUFDbEIsT0FBTyxFQUFFLElBQUk7RUFDYixnQkFBZ0IsRTdCbkhWLElBQUk7RTZCb0hWLGNBQWMsRUFBRSxTQUFTLEdBQzFCOztBQUVELEFBQUEsNEJBQTRCLENBQUM7RUFDM0IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLEM3QjVHWCxPQUFPO0U2QjZHYixLQUFLLEU3QjdHQyxPQUFPLEc2QjhHZDs7QUFFRCxBQUFBLDRCQUE0QixDQUFDO0VBQzNCLE1BQU0sRUFBRSxJQUFJO0VBQ1osYUFBYSxFQUFFLElBQUksR0FDcEI7O0FBRUQsQUFBQSxvQkFBb0IsQ0FBQztFQUNuQixVQUFVLEVBQUUsSUFBSTtFQUNoQixTQUFTLEVBQUUsSUFBSSxHQUNoQjs7QUFFRCxBQUFBLG9CQUFvQixDQUFDO0VBQ25CLE9BQU8sRUFBRSxNQUFNLEdBQ2hCOztBQUVELEFBQUEsMkJBQTJCLENBQUM7RUFDMUIsY0FBYyxFQUFFLElBQUksR0FLckI7RUFIQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0lBSHJDLEFBQUEsMkJBQTJCLENBQUM7TUFJeEIsY0FBYyxFQUFFLEdBQUcsR0FFdEI7O0FBRUQsQUFBQSx5QkFBeUIsQ0FBQztFQUN4QixPQUFPLEVBQUUsTUFBTSxHQUtoQjtFQUhDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sU0FBUyxFQUFFLEtBQUs7SUFIckMsQUFBQSx5QkFBeUIsQ0FBQztNQUl0QixPQUFPLEVBQUUsS0FBSyxHQUVqQjs7QUFFRCxBQUFBLDhCQUE4QixDQUFDO0VBQzdCLFdBQVcsRUFBRSxHQUFHO0VBQ2hCLFNBQVMsRUFBRSxJQUFJO0VBQ2YsS0FBSyxFN0I1Sk0sT0FBTyxHNkI2Sm5COztBQUVELEFBQUEscUJBQXFCLENBQUM7RUFDcEIsS0FBSyxFN0JoS00sT0FBTztFNkJpS2xCLGFBQWEsRUFBRSxJQUFJLEdBQ3BCOztBQUVELEFBQUEsb0JBQW9CLENBQUM7RUFDbkIsS0FBSyxFN0JqS1EsT0FBTyxHNkJrS3JCOztBQUVELEFBQUEseUJBQXlCLENBQUM7RUFDeEIsTUFBTSxFQUFFLE1BQU07RUFDZCxLQUFLLEVBQUUsSUFBSTtFQUNYLFlBQVksRTdCMUtQLE9BQU87RTZCMktaLE1BQU0sRUFBRSxJQUFJO0VBQ1osTUFBTSxFQUFFLEdBQUc7RUFDWCxnQkFBZ0IsRTdCN0tYLE9BQU87RTZCOEtaLEtBQUssRTdCOUtBLE9BQU8sRzZCK0tiOztBQ3hNRCxBQUFBLFFBQVEsQ0FBQztFQUNQLE9BQU8sRUFBRSxJQUFJO0VBQ2IsY0FBYyxFQUFFLEdBQUc7RUFDbkIsZUFBZSxFQUFFLFVBQVU7RUFDM0IsV0FBVyxFQUFFLFFBQVEsR0FDdEI7O0FBRUQsQUFBQSxhQUFhLENBQUM7RUFDWixTQUFTLEVBQUUsQ0FBQztFQUNaLElBQUksRUFBRSxRQUFRO0VBQ2QsT0FBTyxFQUFFLFNBQVM7RUFDbEIsYUFBYSxFQUFFLEdBQUcsQ0FBQyxLQUFLLEM5QmNuQixPQUFPO0U4QmJaLFVBQVUsRUFBRSxVQUFVO0VBQ3RCLFNBQVMsRUFBRSxJQUFJLEdBQ2hCOztBQUVELEFBQUEscUJBQXFCLENBQUM7RUFDcEIsWUFBWSxFOUJYTixJQUFJLEc4QllYOztBQUVELEFBQUEsa0JBQWtCLENBQUM7RUFDakIsU0FBUyxFQUFFLENBQUMsR0FDYjs7QUN0QkQsQUFBQSxnQkFBZ0IsQ0FBQztFQUNmLE1BQU0sRUFBRSxJQUFJO0VBQ1osT0FBTyxFQUFFLElBQUk7RUFDYixlQUFlLEVBQUUsVUFBVTtFQUMzQixXQUFXLEVBQUUsTUFBTTtFQUNuQixNQUFNLEVBQUUsR0FBRyxDQUFDLEtBQUssQy9Cb0JaLE9BQU87RStCbkJaLGFBQWEsRUFBRSxHQUFHO0VBQ2xCLGdCQUFnQixFL0JnQlYsSUFBSTtFK0JmVixTQUFTLEVBQUUsSUFBSTtFQUNmLEtBQUssRUFBRSxPQUFPO0VBQ2QsTUFBTSxFQUFFLE9BQU87RUFDZixRQUFRLEVBQUUsUUFBUSxHQUNuQjs7QUFFRCxBQUFBLHVCQUF1QixDQUFDO0VBQ3RCLEtBQUssRS9Ca0JFLE9BQU87RStCakJkLE9BQU8sRUFBRSxNQUFNLEdBQ2hCOztBQUVELEFBQUEsMEJBQTBCLENBQUM7RUFDekIsU0FBUyxFQUFFLENBQUM7RUFDWixPQUFPLEVBQUUsTUFBTSxHQUNoQjs7QUFFRCxBQUFBLHlCQUF5QixDQUFDO0VBQ3hCLE9BQU8sRUFBRSxJQUFJO0VBQ2IsUUFBUSxFQUFFLFFBQVE7RUFDbEIsTUFBTSxFQUFFLEtBQUs7RUFDYixLQUFLLEVBQUUsSUFBSTtFQUNYLE1BQU0sRUFBRSxpQkFBaUI7RUFDekIsYUFBYSxFQUFFLEdBQUc7RUFDbEIsZ0JBQWdCLEVBQUUsSUFBSTtFQUN0QixrQkFBa0IsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsbUJBQWtCO0VBQ2xELFVBQVUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsbUJBQWtCO0VBQzFDLFVBQVUsRUFBRSxJQUFJO0VBQ2hCLFVBQVUsRUFBRSxNQUFNO0VBQ2xCLElBQUksRUFBRSxDQUFDO0VBQ1AsR0FBRyxFQUFFLElBQUksR0FDVjs7QUFFRCxBQUFBLHdCQUF3QixDQUFDO0VBQ3ZCLE9BQU8sRUFBRSxJQUFJLEdBS2Q7RUFORCxBQUdFLHdCQUhzQixBQUd0QixNQUFPLENBQUM7SUFDTixnQkFBZ0IsRS9CekJWLE9BQU8sRytCMEJkOztBQUdILEFBQUEsa0NBQWtDLENBQUM7RUFDakMsZ0JBQWdCLEUvQnhCWCxPQUFPLEcrQjhCYjtFQVBELEFBR0Usa0NBSGdDLEFBR2hDLE1BQU8sQ0FBQztJQUNOLGdCQUFnQixFL0IzQmIsT0FBTztJK0I0QlYsTUFBTSxFQUFFLE9BQU8sR0FDaEI7O0FBR0gsQUFBQSw0QkFBNEIsQ0FBQztFQUMzQixRQUFRLEVBQUUsS0FBSztFQUNmLEdBQUcsRUFBRSxDQUFDO0VBQ04sSUFBSSxFQUFFLENBQUM7RUFDUCxPQUFPLEVBQUUsSUFBSTtFQUNiLEtBQUssRUFBRSxJQUFJO0VBQ1gsTUFBTSxFQUFFLElBQUksR0FDYjs7QUMvREMsQUFBQSw2QkFBWSxDQUFDO0VBQ1gsS0FBSyxFQUFFLEtBQUs7RUFDWixhQUFhLEVBQUUsR0FBRztFQUNsQixnQkFBZ0IsRWhDbUJaLElBQUk7RWdDbEJSLFVBQVUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsbUJBQWdCO0VBQ3hDLE9BQU8sRUFBRSxJQUFJO0VBQ2IsU0FBUyxFQUFFLGFBQWE7RUFDeEIsT0FBTyxFQUFFLEVBQUU7RUFDWCxXQUFXLEVBQUUsTUFBTTtFQUNuQixXQUFXLEVBQUUsTUFBTTtFQUNuQixRQUFRLEVBQUUsUUFBUTtFQUNsQixNQUFNLEVBQUUsSUFBSSxHQVdiO0VBVEMsTUFBTSxDQUFDLE1BQU0sTUFBTSxTQUFTLEVBQUUsS0FBSztJQWJyQyxBQUFBLDZCQUFZLENBQUM7TUFjVCxLQUFLLEVBQUUsSUFBSTtNQUNYLEdBQUcsRUFBRSxDQUFDO01BQ04sVUFBVSxFQUFFLElBQUksR0FNbkI7RUFIQyxNQUFNLENBQUMsTUFBTSxNQUFNLFNBQVMsRUFBRSxLQUFLO0lBbkJyQyxBQUFBLDZCQUFZLENBQUM7TUFvQlQsVUFBVSxFQUFFLEtBQUssR0FFcEI7O0FBRUQsQUFBQSwwQkFBUyxDQUFDO0VBQ1IsTUFBTSxFQUFFLElBQUk7RUFDWixLQUFLLEVBQUUsSUFBSTtFQUNYLFFBQVEsRUFBRSxRQUFRO0VBQ2xCLE9BQU8sRUFBRSxJQUFJO0VBQ2IsU0FBUyxFQUFFLE1BQU07RUFDakIsZUFBZSxFQUFFLE1BQU07RUFDdkIsV0FBVyxFQUFFLE1BQU07RUFDbkIsSUFBSSxFQUFFLFFBQVEsR0FDZjs7QUFFRCxBQUFBLHFDQUFvQixDQUFDO0VBQ25CLFFBQVEsRUFBRSxRQUFRO0VBQ2xCLGdCQUFnQixFaENHTixPQUFPO0VnQ0ZqQixPQUFPLEVBQUUsQ0FBQztFQUNWLEtBQUssRUFBRSxJQUFJO0VBQ1gsTUFBTSxFQUFFLElBQUksR0FDYjs7QUFFRCxBQUFBLGdDQUFlLENBQUM7RUFDZCxNQUFNLEVBQUUsSUFBSTtFQUNaLEtBQUssRUFBRSxLQUFLO0VBQ1osS0FBSyxFQUFFLE9BQU87RUFDZCxXQUFXLEVBQUUsTUFBTTtFQUNuQixTQUFTLEVBQUUsSUFBSTtFQUNmLFdBQVcsRUFBRSxHQUFHO0VBQ2hCLFdBQVcsRUFBRSxJQUFJO0VBQ2pCLE9BQU8sRUFBRSxDQUFDLEdBQ1g7O0FBRUQsQUFBQSx5Q0FBd0IsQ0FBQztFQUN2QixLQUFLLEVBQUUsSUFBSTtFQUNYLE9BQU8sRUFBRSxJQUFJO0VBQ2IsZUFBZSxFQUFFLE1BQU0sR0FDeEI7O0FBRUQsQUFBQSwrQkFBYyxDQUFDO0VBQ2IsTUFBTSxFQUFFLElBQUk7RUFDWixLQUFLLEVBQUUsSUFBSTtFQUNYLFVBQVUsRWhDdkJBLE9BQU87RWdDd0JqQixTQUFTLEVBQUUsYUFBYTtFQUN4QixRQUFRLEVBQUUsUUFBUTtFQUNsQixNQUFNLEVBQUUsSUFBSTtFQUNaLE9BQU8sRUFBRSxDQUFDLEdBQ1g7O0FBRUQsQUFBQSxnQ0FBZSxDQUFDO0VBQ2QsT0FBTyxFQUFFLElBQUk7RUFDYixlQUFlLEVBQUUsYUFBYTtFQUM5QixVQUFVLEVBQUUsSUFBSTtFQUNoQixhQUFhLEVBQUUsSUFBSSxHQUNwQjs7QUFFRCxBQUFBLDJCQUFVLENBQUM7RUFDVCxLQUFLLEVoQ3ZESSxPQUFPO0VnQ3dEaEIsV0FBVyxFQUFFLElBQUksR0FDbEI7O0FBRUQsQUFBQSxnQ0FBZSxDQUFDO0VBQ2QsU0FBUyxFQUFFLElBQUksR0FDaEI7O0FBRUQsQUFBQSwyQkFBVSxDQUFDO0VBQ1QsS0FBSyxFaENoRUksT0FBTztFZ0NpRWhCLFlBQVksRUFBRSxJQUFJO0VBQ2xCLEtBQUssRUFBRSxLQUFLLEdBQ2I7O0FBRUQsQUFBQSxnQ0FBZSxDQUFDO0VBQ2QsVUFBVSxFQUFFLEtBQUs7RUFDakIsU0FBUyxFQUFFLElBQUksR0FDaEI7O0FBRUQsQUFBQSxpQ0FBZ0IsQ0FBQztFQUNmLFVBQVUsRUFBRSxLQUFLO0VBQ2pCLFVBQVUsRUFBRSxLQUFLLEdBQ2xCOztBQUVELEFBQUEsZ0NBQWUsQ0FBQztFQUNkLFVBQVUsRUFBRSxJQUFJLEdBQ2pCOztBQUVELEFBQUEsd0JBQU8sQ0FBQztFQUNOLEtBQUssRUFBRSxJQUFJO0VBQ1gsTUFBTSxFQUFFLElBQUk7RUFDWixPQUFPLEVBQUUsSUFBSTtFQUNiLFNBQVMsRUFBRSxNQUFNO0VBQ2pCLElBQUksRUFBRSxRQUFRO0VBQ2QsTUFBTSxFQUFFLENBQUMsR0FDVjs7QUFFRCxBQUFBLGdDQUFlLENBQUM7RUFDZCxPQUFPLEVBQUUsSUFBSTtFQUNiLGVBQWUsRUFBRSxNQUFNLEdBQ3hCOztBQUVELEFBQUEsNEJBQVcsQ0FBQztFQUNWLE1BQU0sRUFBRSxJQUFJO0VBQ1osS0FBSyxFQUFFLEtBQUs7RUFDWixLQUFLLEVoQzlGQyxPQUFPO0VnQytGYixXQUFXLEVBQUUsTUFBTTtFQUNuQixTQUFTLEVBQUUsSUFBSTtFQUNmLFdBQVcsRUFBRSxHQUFHO0VBQ2hCLFdBQVcsRUFBRSxJQUFJO0VBQ2pCLFVBQVUsRUFBRSxNQUFNO0VBQ2xCLFVBQVUsRUFBRSxJQUFJLEdBQ2pCOztBQUVELEFBQUEsMEJBQVMsRUFDVCxBQUFBLDJCQUFVLENBQUM7RUFDVCxXQUFXLEVBQUUsYUFBYTtFQUMxQixTQUFTLEVBQUUsSUFBSTtFQUNmLFdBQVcsRUFBRSxJQUFJO0VBQ2pCLFVBQVUsRUFBRSxNQUFNO0VBQ2xCLFVBQVUsRUFBRSxJQUFJO0VBQ2hCLGFBQWEsRUFBRSxJQUFJO0VBQ25CLEtBQUssRUFBRSxJQUFJLEdBQ1o7O0FBRUQsQUFBQSwwQkFBUyxDQUFDO0VBQ1IsS0FBSyxFaEN6SEksT0FBTyxHZ0MwSGpCOztBQUVELEFBQUEsMkJBQVUsQ0FBQztFQUNULEtBQUssRWhDakhDLE9BQU8sR2dDa0hkOztBQUVELEFBQUEsd0JBQU8sQ0FBQztFQUNOLE1BQU0sRUFBRSxJQUFJO0VBQ1osVUFBVSxFQUFFLE1BQU07RUFDbEIsVUFBVSxFQUFFLE1BQU07RUFDbEIsVUFBVSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENoQ2pIaEIsT0FBTztFZ0NrSFosT0FBTyxFQUFFLElBQUk7RUFDYixTQUFTLEVBQUUsTUFBTSxHQUNsQjs7QUFFRCxBQUFBLHVCQUFNLENBQUM7RUFDTCxPQUFPLEVBQUUsSUFBSTtFQUNiLFNBQVMsRUFBRSxNQUFNLEdBQ2xCOztBQUVELEFBQUEsNkJBQVksQ0FBQztFQUNYLEtBQUssRUFBRSxJQUFJO0VBQ1gsS0FBSyxFaENoSkksT0FBTztFZ0NpSmhCLFdBQVcsRUFBRSxNQUFNO0VBQ25CLFNBQVMsRUFBRSxJQUFJO0VBQ2YsV0FBVyxFQUFFLElBQUk7RUFDakIsVUFBVSxFQUFFLElBQUk7RUFDaEIsV0FBVyxFQUFFLElBQUk7RUFDakIsS0FBSyxFQUFFLElBQUksR0FDWjs7QUFFRCxBQUFBLDZCQUFZLENBQUM7RUFDWCxLQUFLLEVoQ2xKRSxPQUFPO0VnQ21KZCxXQUFXLEVBQUUsTUFBTTtFQUNuQixTQUFTLEVBQUUsSUFBSTtFQUNmLFdBQVcsRUFBRSxJQUFJO0VBQ2pCLEtBQUssRUFBRSxJQUFJO0VBQ1gsYUFBYSxFQUFFLFVBQVU7RUFDekIsYUFBYSxFQUFFLGlCQUFpQjtFQUNoQyxPQUFPLEVBQUUsYUFBYSxHQUN2Qjs7QUFFRCxBQUFBLDBCQUFTLENBQUM7RUFDUixLQUFLLEVBQUUsSUFBSTtFQUNYLE9BQU8sRUFBRSxJQUFJO0VBQ2IsV0FBVyxFQUFFLE1BQU07RUFDbkIsZUFBZSxFQUFFLFlBQVk7RUFDN0IsU0FBUyxFQUFFLElBQUk7RUFDZixRQUFRLEVBQUUsUUFBUTtFQUNsQixJQUFJLEVBQUUsUUFBUTtFQUNkLFVBQVUsRUFBRSxHQUFHLENBQUMsS0FBSyxDaEN6SmhCLE9BQU8sR2dDeUxiO0VBOUJDLEFBQUEseUNBQWdCLEVBQ2hCLEFBQUEsdUNBQWMsQ0FBQztJQUNiLE9BQU8sRUFBRSxJQUFJO0lBQ2IsV0FBVyxFQUFFLE1BQU07SUFDbkIsZUFBZSxFQUFFLE1BQU07SUFDdkIsSUFBSSxFQUFFLFFBQVE7SUFDZCxXQUFXLEVBQUUsTUFBTTtJQUNuQixTQUFTLEVBQUUsSUFBSTtJQUNmLFdBQVcsRUFBRSxHQUFHO0lBQ2hCLE1BQU0sRUFBRSxJQUFJO0lBQ1osV0FBVyxFQUFFLElBQUk7SUFDakIsTUFBTSxFQUFFLE9BQU87SUFDZixhQUFhLEVBQUUsR0FBRztJQUNsQixVQUFVLEVBQUUsSUFBSTtJQUNoQixTQUFTLEVBQUUsS0FBSztJQUNoQixNQUFNLEVBQUUsSUFBSSxHQUNiO0VBRUQsQUFBQSx5Q0FBZ0IsQ0FBQztJQUNmLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLE1BQU0sRUFBRSxHQUFHLENBQUMsS0FBSyxDaENsTVYsT0FBTztJZ0NtTWQsWUFBWSxFQUFFLEdBQUcsR0FDbEI7RUFFRCxBQUFBLHVDQUFjLENBQUM7SUFDYixnQkFBZ0IsRWhDN0xKLE9BQU87SWdDOExuQixZQUFZLEVBQUUsQ0FBQztJQUNmLEtBQUssRWhDMU1ILElBQUk7SWdDMk1OLFdBQVcsRUFBRSxHQUFHLEdBQ2pCOztBQ25PTCxBQUFBLHNCQUFzQixDQUFDO0VBQ3JCLE1BQU0sRUFBRSxJQUFJO0VBQ1osZ0JBQWdCLEVqQ3FCVixJQUFJO0VpQ3BCVixXQUFXLEVBQUUsTUFBTTtFQUNuQixXQUFXLEVBQUUsSUFBSTtFQUNqQixTQUFTLEVBQUUsSUFBSTtFQUNmLEtBQUssRUFBRSxLQUFLLEdBeUNiO0VBdkNDLEFBQUEsa0NBQWEsQ0FBQztJQUNaLFFBQVEsRUFBRSxLQUFLO0lBQ2YsR0FBRyxFQUFFLENBQUM7SUFDTixJQUFJLEVBQUUsQ0FBQztJQUNQLE9BQU8sRUFBRSxJQUFJO0lBQ2IsS0FBSyxFQUFFLElBQUk7SUFDWCxNQUFNLEVBQUUsSUFBSSxHQUNiO0VBRUQsQUFBQSw0QkFBTyxDQUFDO0lBQ04sT0FBTyxFQUFFLElBQUk7SUFDYixRQUFRLEVBQUUsUUFBUTtJQUNsQixNQUFNLEVBQUUsS0FBSztJQUNiLEtBQUssRUFBRSxNQUFNO0lBQ2IsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENqQ3FCWixPQUFPO0lpQ3BCWixhQUFhLEVBQUUsR0FBRztJQUNsQixnQkFBZ0IsRWpDRFosSUFBSTtJaUNFUixVQUFVLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLG1CQUFrQjtJQUMxQyxVQUFVLEVBQUUsTUFBTSxHQUNuQjtFQTNCSCxBQTZCRSxzQkE3Qm9CLENBNkJwQixrQkFBa0IsQ0FBQztJQUNqQixVQUFVLEVBQUUsR0FBRyxHQUNoQjtFQS9CSCxBQWlDRSxzQkFqQ29CLENBaUNwQixnQ0FBZ0MsQ0FBQztJQUMvQixhQUFhLEVBQUUsUUFBUTtJQUN2QixRQUFRLEVBQUUsTUFBTTtJQUNoQixXQUFXLEVBQUUsTUFBTTtJQUNuQixLQUFLLEVBQUUsSUFBSSxHQUNaO0VBdENILEFBd0NFLHNCQXhDb0IsQ0F3Q3BCLDJCQUEyQixDQUFDO0lBQzFCLE1BQU0sRUFBRSxDQUFDLEdBQ1Y7RUExQ0gsQUE0Q0Usc0JBNUNvQixDQTRDcEIsd0JBQXdCLENBQUM7SUFDdkIsUUFBUSxFQUFFLE9BQU8sR0FDbEI7O0FDOUNILEFBQUEsZUFBZSxDQUFDO0VBQ2QsT0FBTyxFQUFFLElBQUk7RUFDYixXQUFXLEVBQUUsTUFBTTtFQUNuQixlQUFlLEVBQUUsTUFBTTtFQUN2QixRQUFRLEVBQUUsUUFBUSxHQThCbkI7RUE1QkMsQUFBQSxzQkFBUSxDQUFDO0lBQ1AsU0FBUyxFQUFFLEtBQUs7SUFDaEIsUUFBUSxFQUFFLE1BQU07SUFDaEIsV0FBVyxFQUFFLE1BQU07SUFDbkIsYUFBYSxFQUFFLFFBQVEsR0FDeEI7RUFFRCxBQUFBLHNCQUFRLENBQUM7SUFDUCxLQUFLLEVBQUUsS0FBSztJQUNaLFNBQVMsRUFBRSxJQUFJO0lBQ2YsVUFBVSxFQUFFLE1BQU07SUFDbEIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxLQUFLLENsQ1FkLE9BQU8sR2tDSFg7SUFIQyxBQUFBLDZCQUFRLENBQUM7TUFDUCxNQUFNLEVBQUUsR0FBRyxDQUFDLEtBQUssQ2xDZWYsT0FBTyxHa0NkVjtFQUdILEFBQUEsNkJBQWUsQ0FBQztJQUNkLFFBQVEsRUFBRSxRQUFRO0lBQ2xCLFdBQVcsRUFBRSxJQUFJO0lBQ2pCLElBQUksRUFBRSxJQUFJLEdBQ1g7RUFFRCxBQUFBLHFCQUFPLENBQUM7SUFDTixNQUFNLEVBQUUsT0FBTztJQUNmLEtBQUssRWxDUkksT0FBTyxHa0NTakI7O0FDakNIOztHQUVHO0FBSUgsZUFBZTtBQUNmLEFBQWEsWUFBRCxDQUFDLFdBQVcsQ0FBQztFQUN2QixRQUFRLEVBQUUsUUFBUTtFQUNsQixLQUFLLEVBQUUsSUFBSSxHQUNaOztBQUVELHFCQUFxQjtBQUNyQixBQUF3QixZQUFaLEFBQUEsV0FBVyxDQUFDLGtCQUFrQjtBQUMxQyxBQUF1QixZQUFYLEFBQUEsVUFBVSxDQUFDLGtCQUFrQixDQUFDO0VBQ3hDLFVBQVUsRUFBRSxNQUFNO0VBQ2xCLFNBQVMsRUFBRSxhQUFhO0VBQ3hCLFVBQVUsRUFBRSx1QkFBdUIsR0FDcEM7O0FBRUQsc0JBQXNCO0FBQ3RCLEFBQXVCLFlBQVgsQUFBQSxVQUFVLENBQUMsa0JBQWtCLENBQUM7RUFDeEMsU0FBUyxFQUFFLGlCQUFpQjtFQUM1QixVQUFVLEVBQUUsdUJBQXVCLEdBQ3BDOztBQUVELEFBQXdCLFlBQVosQUFBQSxXQUFXLENBQUMsa0JBQWtCLENBQUM7RUFDekMsU0FBUyxFQUFFLGtCQUFrQjtFQUM3QixVQUFVLEVBQUUsdUJBQXVCLEdBQ3BDOztBQUVELEFBQUEsUUFBUSxBQUFBLFVBQVUsQ0FBQztFQUNqQixTQUFTLEVBQUUsa0JBQWtCO0VBQzdCLFVBQVUsRUFBRSx1QkFBdUIsR0FDcEM7O0FBRUQsd0JBQXdCO0FBQ3hCLEFBQUEsYUFBYTtBQUNiLEFBQUEsb0JBQW9CLENBQUM7RUFDbkIsT0FBTyxFQUFFLENBQUM7RUFDVixVQUFVLEVBQUUsbUJBQW1CLEdBQ2hDOztBQUVELEFBQUEsb0JBQW9CO0FBQ3BCLEFBQUEsYUFBYSxDQUFDO0VBQ1osT0FBTyxFQUFFLENBQUM7RUFDVixVQUFVLEVBQUUsbUJBQW1CLEdBQ2hDOztBQUVELHdCQUF3QjtBQUN4QixBQUF3QixZQUFaLEFBQUEsV0FBVyxDQUFDLFdBQVcsQUFBQSxJQUFLLENBQUEsQUFBQSxrQkFBa0IsRUFBRTtFQUMxRCxTQUFTLEVBQUUsaUJBQWlCLEdBQzdCOztBQUVELEFBQXVCLFlBQVgsQUFBQSxVQUFVLENBQUMsV0FBVyxBQUFBLElBQUssQ0FBQSxBQUFBLGtCQUFrQixFQUFFO0VBQ3pELFNBQVMsRUFBRSxrQkFBa0IsR0FDOUI7O0FBRUQsQUFBQSxDQUFDLEFBQUEsR0FBRyxBQUFBLG1CQUFtQixBQUFBLE1BQU0sQUFBQSxVQUFVLENBQUM7RUFDdEMsU0FBUyxFQUFFLElBQUksR0FDaEI7O0FBTUQsdUJBQXVCO0FBQ3ZCLEFBQUEsOEJBQThCLENBQUM7RUFDN0IsV0FBVyxFQUFFLFFBQVE7RUFDckIsU0FBUyxFQUFFLElBQUksR0FDaEI7O0FBQ0Qsc0JBQXNCIn0= */ diff --git a/old-ui/app/css/reset.css b/old-ui/app/css/reset.css deleted file mode 100644 index 9ce89e8bc..000000000 --- a/old-ui/app/css/reset.css +++ /dev/null @@ -1,48 +0,0 @@ -/* 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 deleted file mode 100644 index 393a944f9..000000000 --- a/old-ui/app/css/transitions.css +++ /dev/null @@ -1,42 +0,0 @@ -/* 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 deleted file mode 100644 index 4f1d5d186..000000000 --- a/old-ui/app/first-time/init-menu.js +++ /dev/null @@ -1,179 +0,0 @@ -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 deleted file mode 100644 index 1742a32b8..000000000 Binary files a/old-ui/app/img/identicon-tardigrade.png and /dev/null differ diff --git a/old-ui/app/img/identicon-walrus.png b/old-ui/app/img/identicon-walrus.png deleted file mode 100644 index d58fae912..000000000 Binary files a/old-ui/app/img/identicon-walrus.png and /dev/null differ diff --git a/old-ui/app/info.js b/old-ui/app/info.js deleted file mode 100644 index 936d270da..000000000 --- a/old-ui/app/info.js +++ /dev/null @@ -1,154 +0,0 @@ -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', - 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 deleted file mode 100644 index 9a96fe069..000000000 --- a/old-ui/app/infura-conversion.json +++ /dev/null @@ -1,653 +0,0 @@ -{ - "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 deleted file mode 100644 index 736e922b7..000000000 --- a/old-ui/app/keychains/hd/create-vault-complete.js +++ /dev/null @@ -1,91 +0,0 @@ -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 deleted file mode 100644 index eb0298a09..000000000 --- a/old-ui/app/keychains/hd/recover-seed/confirmation.js +++ /dev/null @@ -1,121 +0,0 @@ -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 deleted file mode 100644 index e9486a28d..000000000 --- a/old-ui/app/keychains/hd/restore-vault.js +++ /dev/null @@ -1,162 +0,0 @@ -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', { - 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() - - // true if the string has more than a space between words. - if (seed.split(' ').length > 1) { - this.warning = 'there can only be a space between words' - this.props.dispatch(actions.displayWarning(this.warning)) - return - } - // true if seed contains a character that is not between a-z or a space - if (!seed.match(/^[a-z ]+$/)) { - this.warning = 'seed words only have lowercase characters' - this.props.dispatch(actions.displayWarning(this.warning)) - return - } - 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 deleted file mode 100644 index cc9633166..000000000 --- a/old-ui/app/new-keychain.js +++ /dev/null @@ -1,29 +0,0 @@ -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/new-ui-annoucement.js b/old-ui/app/new-ui-annoucement.js deleted file mode 100644 index 59b126279..000000000 --- a/old-ui/app/new-ui-annoucement.js +++ /dev/null @@ -1,85 +0,0 @@ -const PropTypes = require('prop-types') -const {PureComponent} = require('react') -const h = require('react-hyperscript') -const actions = require('../../ui/app/actions') - -module.exports = class NewUiAnnouncement extends PureComponent { - static propTypes = { - dispatch: PropTypes.func.isRequired, - }; - - close = async () => { - await this.props.dispatch(actions.setFeatureFlag('skipAnnounceBetaUI', true)) - } - - switchToNewUi = async () => { - const flag = 'betaUI' - const enabled = true - await this.props.dispatch(actions.setFeatureFlag( - flag, - enabled, - )) - await this.close() - global.platform.openExtensionInBrowser() - } - - render () { - return ( - h('div.new-ui-announcement', [ - h('section.new-ui-announcement__announcement-header', [ - h('h1', 'Announcement'), - h('a.close', { - onClick: this.close, - }, '×'), - ]), - h('section.new-ui-announcement__body', [ - h('h1', 'A New Version of MetaMask'), - h('p', [ - "We're excited to announce a brand-new version of MetaMask with enhanced features and functionality.", - ]), - h('div.updates-list', [ - h('h2', 'Updates include'), - h('ul', [ - h('li', 'New user interface'), - h('li', 'Full-screen mode'), - h('li', 'Better token support'), - h('li', 'Better gas controls'), - h('li', 'Advanced features for developers'), - h('li', 'New confirmation screens'), - h('li', 'And more!'), - ]), - ]), - h('p', [ - 'You can still use the current version of MetaMask. The new version is still in beta, ' + - 'however we encourage you to try it out as we transition into this exciting new update.', - h('span', { - dangerouslySetInnerHTML: { - __html: ' ', - }, - }), - h('a', { - href: 'https://medium.com/metamask/74dba32cc7f7', - onClick ({target}) { - const url = target.href - global.platform.openWindow({ - url, - }) - }, - }, [ - 'Learn more.', - ]), - ]), - ]), - h('section.new-ui-announcement__footer', [ - h('h1', 'Ready to try the new MetaMask?'), - h('button.positive', { - onClick: this.switchToNewUi, - }, 'Try it now'), - h('button.negative', { - onClick: this.close, - }, 'No thanks, maybe later'), - ]), - ]) - ) - } -} diff --git a/old-ui/app/provider-approval.js b/old-ui/app/provider-approval.js deleted file mode 100644 index da128f147..000000000 --- a/old-ui/app/provider-approval.js +++ /dev/null @@ -1,65 +0,0 @@ -import PropTypes from 'prop-types' -import React, { Component } from 'react' -import { approveProviderRequest, rejectProviderRequest } from '../../ui/app/actions' -import { connect } from 'react-redux' -class ProviderApproval extends Component { - render () { - const { approveProviderRequest, origin, tabID, rejectProviderRequest } = this.props - return ( -
-