Merge pull request #338 from RafaelTaranto/dev

merge DD and new-lamassu-admin into dev
This commit is contained in:
Josh Harvey 2019-11-29 15:42:21 +00:00 committed by GitHub
commit 41d8b7afe1
321 changed files with 32207 additions and 463 deletions

2
.gitignore vendored
View file

@ -36,3 +36,5 @@ lamassu.json
terraform.*
.terraform
db.json

View file

@ -13,6 +13,8 @@ LAMASSU_CA_PATH=$PWD/Lamassu_CA.pem
MIGRATE_STATE_PATH=$CONFIG_DIR/.migrate
POSTGRES_PASS=postgres123
OFAC_DATA_DIR=$CONFIG_DIR/ofac
IDPHOTOCARD_DIR=$CONFIG_DIR/idphotocard
FRONTCAMERA_DIR=$CONFIG_DIR/frontcamera
mkdir -p $CERT_DIR
mkdir -p $CONFIG_DIR >> $LOG_FILE 2>&1
@ -109,7 +111,9 @@ cat <<EOF > $CONFIG_DIR/lamassu.json
"name": "cons_advanced",
"url": "https://www.treasury.gov/ofac/downloads/sanctions/1.0/cons_advanced.xml"
}
]
],
"idPhotoCardDir": "$IDPHOTOCARD_DIR",
"frontCameraDir": "$FRONTCAMERA_DIR"
}
EOF

View file

@ -13,5 +13,5 @@ if (process.argv.length !== 4) {
process.exit(3)
}
const masterSeed = new Buffer(masterSeedHex, 'hex')
console.log(hkdf(masterSeed, 32, {salt: 'lamassu-server-salt', info: label}).toString('hex'))
const masterSeed = Buffer.from(masterSeedHex, 'hex')
console.log(hkdf(masterSeed, 32, { salt: 'lamassu-server-salt', info: label }).toString('hex'))

View file

@ -1,7 +1,5 @@
#!/usr/bin/env bash
SEED="$(cat ~/seeds/seed.txt)"
echo
echo "Here is the 'External ID' of your paired machine(s), for use under the 'ATM / Teller details' of your CoinATMRadar listing:"
echo
@ -9,5 +7,5 @@ su - postgres -c "psql \"lamassu\" -Atc \"select regexp_replace(device_id, '$',
echo
echo "If speaking with CoinATMRadar directly, it may be helpful to let them know your 'Operator ID':"
echo
$(npm root -g)/lamassu-server/bin/hkdf operator-id "$SEED" | cut -c -32
$(npm root -g)/lamassu-server/bin/lamassu-operator
echo

View file

@ -1,9 +1,12 @@
#!/usr/bin/env bash
#!/usr/bin/env node
SEED="$(cat ~/seeds/seed.txt)"
const fs = require('fs')
const hkdf = require('futoin-hkdf')
echo
echo "Your Operator ID for use with CoinATMRadar is:"
echo
/usr/bin/hkdf operator-id "$SEED" | cut -c -32
echo
const options = require('../lib/options')
const mnemonicHelpers = require('../lib/mnemonic-helpers')
const mnemonic = fs.readFileSync(options.mnemonicPath, 'utf8').trim()
const masterSeed = mnemonicHelpers.toEntropyBuffer(mnemonic)
console.log(hkdf(masterSeed, 16, { salt: 'lamassu-server-salt', info: 'operator-id' }).toString('hex'))

5
bin/new-lamassu-admin-server Executable file
View file

@ -0,0 +1,5 @@
#!/usr/bin/env node
const adminServer = require('../lib/new-admin/admin-server')
adminServer.run()

View file

@ -262,7 +262,6 @@ view route invalidGroups =
, ( "itBit", AccountRoute "itbit", True )
, ( "Kraken", AccountRoute "kraken", True )
, ( "Mailgun", AccountRoute "mailgun", True )
, ( "QuadrigaCX", AccountRoute "quadrigacx", True )
, ( "Strike", AccountRoute "strike", True )
, ( "Twilio", AccountRoute "twilio", True )
]

View file

@ -178,8 +178,8 @@ function fetchData () {
{code: 'bitpay', display: 'Bitpay', class: 'ticker', cryptos: ['BTC', 'BCH']},
{code: 'kraken', display: 'Kraken', class: 'ticker', cryptos: ['BTC', 'ETH', 'LTC', 'DASH', 'ZEC', 'BCH']},
{code: 'bitstamp', display: 'Bitstamp', class: 'ticker', cryptos: ['BTC', 'ETH', 'LTC', 'BCH']},
{code: 'coinbase', display: 'Coinbase', class: 'ticker', cryptos: ['BTC', 'ETH', 'LTC', 'BCH']},
{code: 'itbit', display: 'itBit', class: 'ticker', cryptos: ['BTC']},
{code: 'coinbase', display: 'Coinbase', class: 'ticker', cryptos: ['BTC', 'ETH', 'LTC', 'BCH', 'ZEC', 'DASH']},
{code: 'itbit', display: 'itBit', class: 'ticker', cryptos: ['BTC', 'ETH']},
{code: 'mock-ticker', display: 'Mock (Caution!)', class: 'ticker', cryptos: ALL_CRYPTOS},
{code: 'bitcoind', display: 'bitcoind', class: 'wallet', cryptos: ['BTC']},
{code: 'no-layer2', display: 'No Layer 2', class: 'layer2', cryptos: ALL_CRYPTOS},
@ -191,7 +191,7 @@ function fetchData () {
{code: 'bitcoincashd', display: 'bitcoincashd', class: 'wallet', cryptos: ['BCH']},
{code: 'bitgo', display: 'BitGo', class: 'wallet', cryptos: ['BTC', 'ZEC', 'LTC', 'BCH', 'DASH']},
{code: 'bitstamp', display: 'Bitstamp', class: 'exchange', cryptos: ['BTC', 'ETH', 'LTC', 'BCH']},
{code: 'itbit', display: 'itBit', class: 'exchange', cryptos: ['BTC']},
{code: 'itbit', display: 'itBit', class: 'exchange', cryptos: ['BTC', 'ETH']},
{code: 'kraken', display: 'Kraken', class: 'exchange', cryptos: ['BTC', 'ETH', 'LTC', 'DASH', 'ZEC', 'BCH']},
{code: 'mock-wallet', display: 'Mock (Caution!)', class: 'wallet', cryptos: ALL_CRYPTOS},
{code: 'no-exchange', display: 'No exchange', class: 'exchange', cryptos: ALL_CRYPTOS},

View file

@ -2,7 +2,7 @@ const db = require('./db')
function blocked (address, cryptoCode) {
const sql = `select * from blacklist where address = $1 and crypto_code = $2`
return db.oneOrNone(sql, [
return db.any(sql, [
address,
cryptoCode
])

View file

@ -21,7 +21,7 @@ function buildConfig () {
rpcpassword=${common.randomPass()}
dbcache=500
server=1
connections=40
maxconnections=40
keypool=10000
prune=4000
daemon=0

View file

@ -21,19 +21,19 @@ module.exports = {
const BINARIES = {
BTC: {
url: 'https://bitcoin.org/bin/bitcoin-core-0.18.0/bitcoin-0.18.0-x86_64-linux-gnu.tar.gz',
dir: 'bitcoin-0.18.0/bin'
url: 'https://bitcoin.org/bin/bitcoin-core-0.18.1/bitcoin-0.18.1-x86_64-linux-gnu.tar.gz',
dir: 'bitcoin-0.18.1/bin'
},
ETH: {
url: 'https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.9.1-b7b2f60f.tar.gz',
dir: 'geth-linux-amd64-1.9.1-b7b2f60f'
url: 'https://gethstore.blob.core.windows.net/builds/geth-linux-amd64-1.9.7-a718daa6.tar.gz',
dir: 'geth-linux-amd64-1.9.7-a718daa6'
},
ZEC: {
url: 'https://z.cash/downloads/zcash-2.0.6-linux64.tar.gz',
dir: 'zcash-2.0.6/bin'
url: 'https://z.cash/downloads/zcash-2.1.0-1-linux64-debian-jessie.tar.gz',
dir: 'zcash-2.1.0-1/bin'
},
DASH: {
url: 'https://github.com/dashpay/dash/releases/download/v0.14.0.2/dashcore-0.14.0.2-x86_64-linux-gnu.tar',
url: 'https://github.com/dashpay/dash/releases/download/v0.14.0.3/dashcore-0.14.0.3-x86_64-linux-gnu.tar.gz',
dir: 'dashcore-0.14.0/bin'
},
LTC: {
@ -41,8 +41,8 @@ const BINARIES = {
dir: 'litecoin-0.17.1/bin'
},
BCH: {
url: 'https://download.bitcoinabc.org/0.19.10/linux/bitcoin-abc-0.19.10-x86_64-linux-gnu.tar.gz',
dir: 'bitcoin-abc-0.19.10/bin',
url: 'https://download.bitcoinabc.org/0.20.5/linux/bitcoin-abc-0.20.5-x86_64-linux-gnu.tar.gz',
dir: 'bitcoin-abc-0.20.5/bin',
files: [['bitcoind', 'bitcoincashd'], ['bitcoin-cli', 'bitcoincash-cli']]
}
}

View file

@ -24,13 +24,13 @@ function post (machineTx, pi) {
let blacklisted = false
let addressReuse = false
return checkForBlacklisted(updatedTx)
.then(blacklistItem => {
if (blacklistItem && blacklistItem.created_by_operator) {
blacklisted = true
}
return Promise.all([settingsLoader.loadLatest(), checkForBlacklisted(updatedTx)])
.then(([{ config }, blacklistItems]) => {
const rejectAddressReuseActive = configManager.unscoped(config).rejectAddressReuseActive
if (blacklistItem && !blacklistItem.created_by_operator) {
if (_.some(it => it.created_by_operator === true)(blacklistItems)) {
blacklisted = true
} else if (_.some(it => it.created_by_operator === false)(blacklistItems) && rejectAddressReuseActive) {
addressReuse = true
}

View file

@ -5,6 +5,8 @@ const configManager = require('./config-manager')
const logger = require('./logger')
const schema = require('../lamassu-schema.json')
const REMOVED_FIELDS = ['crossRefVerificationActive', 'crossRefVerificationThreshold']
function allScopes (cryptoScopes, machineScopes) {
const scopes = []
cryptoScopes.forEach(c => {
@ -128,6 +130,8 @@ function ensureConstraints (config) {
.then(() => {
config.every(fieldInstance => {
const fieldCode = fieldInstance.fieldLocator.code
if (_.includes(fieldCode, REMOVED_FIELDS)) return
const field = pickField(fieldCode)
if (!field) {
logger.warn('No such field: %s, %j', fieldCode, fieldInstance.fieldLocator.fieldScope)

View file

@ -1,6 +1,9 @@
const Pgp = require('pg-promise')
const uuid = require('uuid')
const _ = require('lodash/fp')
const psqlUrl = require('../lib/options').postgresql
const logger = require('./logger')
const eventBus = require('./event-bus')
const pgp = Pgp({
pgNative: true,
@ -15,4 +18,15 @@ const pgp = Pgp({
})
const db = pgp(psqlUrl)
eventBus.subscribe('log', args => {
const { level, message, meta } = args
const sql = `insert into server_logs
(id, device_id, message, log_level, meta) values ($1, $2, $3, $4, $5) returning *`
db.one(sql, [uuid.v4(), '', message, level, meta])
.then(_.mapKeys(_.camelCase))
})
module.exports = db

29
lib/event-bus.js Normal file
View file

@ -0,0 +1,29 @@
// Adapted from https://medium.com/@soffritti.pierfrancesco/create-a-simple-event-bus-in-javascript-8aa0370b3969
const uuid = require('uuid')
const _ = require('lodash/fp')
const subscriptions = {}
function subscribe (eventType, callback) {
const id = uuid.v1()
if (!subscriptions[eventType]) subscriptions[eventType] = {}
subscriptions[eventType][id] = callback
return {
unsubscribe: () => {
delete subscriptions[eventType][id]
if (_.keys(subscriptions[eventType]).length === 0) delete subscriptions[eventType]
}
}
}
function publish (eventType, arg) {
if (!subscriptions[eventType]) return
_.keys(subscriptions[eventType]).forEach(key => subscriptions[eventType][key](arg))
}
module.exports = { subscribe, publish }

View file

@ -1,11 +1,15 @@
const winston = require('winston')
const Postgres = require('./pg-transport')
const options = require('./options')
const _ = require('lodash/fp')
const logger = new winston.Logger({
level: options.logLevel,
transports: [
new (winston.transports.Console)({ timestamp: true, colorize: true })
new (winston.transports.Console)({ timestamp: true, colorize: true }),
new Postgres({
connectionString: options.postgresql,
tableName: 'server_logs'
})
],
rewriters: [
(...[,, meta]) => meta instanceof Error ? { message: meta.message, stack: meta.stack } : meta

View file

@ -0,0 +1,97 @@
const bodyParser = require('body-parser')
const cors = require('cors')
const express = require('express')
const http = require('http')
const got = require('got')
const supportLogs = require('../support_logs')
const machineLoader = require('../machine-loader')
const logs = require('../logs')
const serverLogs = require('./server-logs')
const supervisor = require('./supervisor')
const funding = require('./funding')
const config = require('./config')
const devMode = require('minimist')(process.argv.slice(2)).dev
const app = express()
app.use(bodyParser.json())
if (devMode) {
app.use(cors())
}
app.get('/api/config', async (req, res, next) => {
const state = config.getConfig(req.params.config)
const data = await config.fetchData()
res.json({ state, data })
next()
})
app.post('/api/config', (req, res, next) => {
config.saveConfig(req.body)
.then(it => res.json(it))
.then(() => dbNotify())
.catch(next)
})
app.get('/api/funding', (req, res) => {
return funding.getFunding()
.then(r => res.json(r))
})
app.get('/api/machines', (req, res) => {
machineLoader.getMachineNames()
.then(r => res.send({ machines: r }))
})
app.get('/api/logs/:deviceId', (req, res, next) => {
return logs.getMachineLogs(req.params.deviceId)
.then(r => res.send(r))
.catch(next)
})
app.post('/api/support_logs', (req, res, next) => {
return supportLogs.insert(req.query.deviceId)
.then(r => res.send(r))
.catch(next)
})
app.get('/api/version', (req, res, next) => {
res.send(require('../../package.json').version)
})
app.get('/api/uptimes', (req, res, next) => {
return supervisor.getAllProcessInfo()
.then(r => res.send(r))
.catch(next)
})
app.post('/api/server_support_logs', (req, res, next) => {
return serverLogs.insert()
.then(r => res.send(r))
.catch(next)
})
app.get('/api/server_logs', (req, res, next) => {
return serverLogs.getServerLogs()
.then(r => res.send(r))
.catch(next)
})
function dbNotify () {
return got.post('http://localhost:3030/dbChange')
.catch(e => console.error('Error: lamassu-server not responding'))
}
function run () {
const serverPort = 8070
const serverLog = `lamassu-admin-server listening on port ${serverPort}`
const webServer = http.createServer(app)
webServer.listen(serverPort, () => console.log(serverLog))
}
module.exports = { run }

109
lib/new-admin/config.js Normal file
View file

@ -0,0 +1,109 @@
const _ = require('lodash/fp')
const devMode = require('minimist')(process.argv.slice(2)).dev
const settingsLoader = require('../new-settings-loader')
const machineLoader = require('../machine-loader')
const currencies = require('../../currencies.json')
const languageRec = require('../../languages.json')
const countries = require('../../countries.json')
function saveConfig (config) {
return settingsLoader.saveConfig(config)
}
function getConfig () {
return settingsLoader.getConfig()
}
function massageCurrencies (currencies) {
const convert = r => ({
code: r['Alphabetic Code'],
display: r['Currency']
})
const top5Codes = ['USD', 'EUR', 'GBP', 'CAD', 'AUD']
const mapped = _.map(convert, currencies)
const codeToRec = code => _.find(_.matchesProperty('code', code), mapped)
const top5 = _.map(codeToRec, top5Codes)
const raw = _.uniqBy(_.get('code'), _.concat(top5, mapped))
return raw.filter(r => r.code[0] !== 'X' && r.display.indexOf('(') === -1)
}
const mapLanguage = lang => {
const arr = lang.split('-')
const code = arr[0]
const country = arr[1]
const langNameArr = languageRec.lang[code]
if (!langNameArr) return null
const langName = langNameArr[0]
if (!country) return {code: lang, display: langName}
return {code: lang, display: `${langName} [${country}]`}
}
const supportedLanguages = languageRec.supported
const languages = supportedLanguages.map(mapLanguage).filter(r => r)
const ALL_CRYPTOS = ['BTC', 'ETH', 'LTC', 'DASH', 'ZEC', 'BCH']
const filterAccounts = (data, isDevMode) => {
const notAllowed = ['mock-ticker', 'mock-wallet', 'mock-exchange', 'mock-sms', 'mock-id-verify', 'mock-zero-conf']
const filterOut = o => _.includes(o.code, notAllowed)
return isDevMode ? data : {...data, accounts: _.filter(a => !filterOut(a), data.accounts)}
}
function fetchData () {
return machineLoader.getMachineNames()
.then(machineList => ({
currencies: massageCurrencies(currencies),
cryptoCurrencies: [
{code: 'BTC', display: 'Bitcoin'},
{code: 'ETH', display: 'Ethereum'},
{code: 'LTC', display: 'Litecoin'},
{code: 'DASH', display: 'Dash'},
{code: 'ZEC', display: 'Zcash'},
{code: 'BCH', display: 'Bitcoin Cash'}
],
languages: languages,
countries,
accounts: [
{code: 'bitpay', display: 'Bitpay', class: 'ticker', cryptos: ['BTC', 'BCH']},
{code: 'kraken', display: 'Kraken', class: 'ticker', cryptos: ['BTC', 'ETH', 'LTC', 'DASH', 'ZEC', 'BCH']},
{code: 'bitstamp', display: 'Bitstamp', class: 'ticker', cryptos: ['BTC', 'ETH', 'LTC', 'BCH']},
{code: 'coinbase', display: 'Coinbase', class: 'ticker', cryptos: ['BTC', 'ETH', 'LTC', 'BCH']},
{code: 'itbit', display: 'itBit', class: 'ticker', cryptos: ['BTC']},
{code: 'mock-ticker', display: 'Mock (Caution!)', class: 'ticker', cryptos: ALL_CRYPTOS},
{code: 'bitcoind', display: 'bitcoind', class: 'wallet', cryptos: ['BTC']},
{code: 'no-layer2', display: 'No Layer 2', class: 'layer2', cryptos: ALL_CRYPTOS},
{code: 'infura', display: 'Infura', class: 'wallet', cryptos: ['ETH']},
{code: 'geth', display: 'geth', class: 'wallet', cryptos: ['ETH']},
{code: 'zcashd', display: 'zcashd', class: 'wallet', cryptos: ['ZEC']},
{code: 'litecoind', display: 'litecoind', class: 'wallet', cryptos: ['LTC']},
{code: 'dashd', display: 'dashd', class: 'wallet', cryptos: ['DASH']},
{code: 'bitcoincashd', display: 'bitcoincashd', class: 'wallet', cryptos: ['BCH']},
{code: 'bitgo', display: 'BitGo', class: 'wallet', cryptos: ['BTC', 'ZEC', 'LTC', 'BCH', 'DASH']},
{code: 'bitstamp', display: 'Bitstamp', class: 'exchange', cryptos: ['BTC', 'ETH', 'LTC', 'BCH']},
{code: 'itbit', display: 'itBit', class: 'exchange', cryptos: ['BTC']},
{code: 'kraken', display: 'Kraken', class: 'exchange', cryptos: ['BTC', 'ETH', 'LTC', 'DASH', 'ZEC', 'BCH']},
{code: 'mock-wallet', display: 'Mock (Caution!)', class: 'wallet', cryptos: ALL_CRYPTOS},
{code: 'no-exchange', display: 'No exchange', class: 'exchange', cryptos: ALL_CRYPTOS},
{code: 'mock-exchange', display: 'Mock exchange', class: 'exchange', cryptos: ALL_CRYPTOS},
{code: 'mock-sms', display: 'Mock SMS', class: 'sms'},
{code: 'mock-id-verify', display: 'Mock ID verifier', class: 'idVerifier'},
{code: 'twilio', display: 'Twilio', class: 'sms'},
{code: 'mailgun', display: 'Mailgun', class: 'email'},
{code: 'all-zero-conf', display: 'Always 0-conf', class: 'zeroConf', cryptos: ['BTC', 'ZEC', 'LTC', 'DASH', 'BCH']},
{code: 'no-zero-conf', display: 'Always 1-conf', class: 'zeroConf', cryptos: ALL_CRYPTOS},
{code: 'blockcypher', display: 'Blockcypher', class: 'zeroConf', cryptos: ['BTC']},
{code: 'mock-zero-conf', display: 'Mock 0-conf', class: 'zeroConf', cryptos: ['BTC', 'ZEC', 'LTC', 'DASH', 'BCH', 'ETH']}
],
machines: machineList.map(machine => ({machine: machine.deviceId, display: machine.name}))
}))
.then((data) => {
return filterAccounts(data, devMode)
})
}
module.exports = {
saveConfig,
getConfig,
fetchData
}

102
lib/new-admin/funding.js Normal file
View file

@ -0,0 +1,102 @@
const _ = require('lodash/fp')
const BN = require('../bn')
const settingsLoader = require('../settings-loader')
const configManager = require('../config-manager')
const wallet = require('../wallet')
const ticker = require('../ticker')
const coinUtils = require('../coin-utils')
const machineLoader = require('../machine-loader')
function allScopes (cryptoScopes, machineScopes) {
const scopes = []
cryptoScopes.forEach(c => {
machineScopes.forEach(m => scopes.push([c, m]))
})
return scopes
}
function allMachineScopes (machineList, machineScope) {
const machineScopes = []
if (machineScope === 'global' || machineScope === 'both') machineScopes.push('global')
if (machineScope === 'specific' || machineScope === 'both') machineList.forEach(r => machineScopes.push(r))
return machineScopes
}
function getCryptos (config, machineList) {
const scopes = allScopes(['global'], allMachineScopes(machineList, 'both'))
const scoped = scope => configManager.scopedValue(scope[0], scope[1], 'cryptoCurrencies', config)
return _.uniq(_.flatten(_.map(scoped, scopes)))
}
function fetchMachines () {
return machineLoader.getMachines()
.then(machineList => machineList.map(r => r.deviceId))
}
function computeCrypto (cryptoCode, _balance) {
const cryptoRec = coinUtils.getCryptoCurrency(cryptoCode)
const unitScale = cryptoRec.unitScale
return BN(_balance).shift(-unitScale).round(5)
}
function computeFiat (rate, cryptoCode, _balance) {
const cryptoRec = coinUtils.getCryptoCurrency(cryptoCode)
const unitScale = cryptoRec.unitScale
return BN(_balance).shift(-unitScale).mul(rate).round(5)
}
function getSingleCoinFunding (settings, fiatCode, cryptoCode) {
const promises = [
wallet.newFunding(settings, cryptoCode),
ticker.getRates(settings, fiatCode, cryptoCode)
]
return Promise.all(promises)
.then(([fundingRec, ratesRec]) => {
const rates = ratesRec.rates
const rate = (rates.ask.add(rates.bid)).div(2)
const fundingConfirmedBalance = fundingRec.fundingConfirmedBalance
const fiatConfirmedBalance = computeFiat(rate, cryptoCode, fundingConfirmedBalance)
const pending = fundingRec.fundingPendingBalance.sub(fundingConfirmedBalance)
const fiatPending = computeFiat(rate, cryptoCode, pending)
const fundingAddress = fundingRec.fundingAddress
const fundingAddressUrl = coinUtils.buildUrl(cryptoCode, fundingAddress)
return {
cryptoCode,
fundingAddress,
fundingAddressUrl,
confirmedBalance: computeCrypto(cryptoCode, fundingConfirmedBalance).toFormat(5),
pending: computeCrypto(cryptoCode, pending).toFormat(5),
fiatConfirmedBalance: fiatConfirmedBalance,
fiatPending: fiatPending,
fiatCode
}
})
}
function getFunding () {
return Promise.all([settingsLoader.loadLatest(), fetchMachines()])
.then(([settings, machineList]) => {
const config = configManager.unscoped(settings.config)
const cryptoCodes = getCryptos(settings.config, machineList)
const fiatCode = config.fiatCurrency
const pareCoins = c => _.includes(c.cryptoCode, cryptoCodes)
const cryptoCurrencies = coinUtils.cryptoCurrencies()
const cryptoDisplays = _.filter(pareCoins, cryptoCurrencies)
const promises = cryptoDisplays.map(it => getSingleCoinFunding(settings, fiatCode, it.cryptoCode))
return Promise.all(promises)
.then((response) => {
return _.toArray(_.merge(response, cryptoDisplays))
})
})
}
module.exports = { getFunding }

View file

@ -0,0 +1,26 @@
const _ = require('lodash/fp')
const uuid = require('uuid')
const db = require('../db')
const NUM_RESULTS = 500
function getServerLogs (until = new Date().toISOString()) {
const sql = `select id, log_level, timestamp, message from server_logs
order by timestamp desc
limit $1`
return Promise.all([db.any(sql, [ NUM_RESULTS ])])
.then(([logs]) => ({
logs: _.map(_.mapKeys(_.camelCase), logs)
}))
}
function insert () {
const sql = `insert into server_support_logs
(id) values ($1) returning *`
return db.one(sql, [uuid.v4()])
.then(_.mapKeys(_.camelCase))
}
module.exports = { getServerLogs, insert }

View file

@ -0,0 +1,58 @@
const xmlrpc = require('xmlrpc')
const logger = require('../logger')
const { promisify } = require('util')
function getAllProcessInfo () {
const convertStates = (state) => {
// From http://supervisord.org/subprocess.html#process-states
switch (state) {
case 'STOPPED':
return 'STOPPED'
case 'STARTING':
return 'RUNNING'
case 'RUNNING':
return 'RUNNING'
case 'BACKOFF':
return 'FATAL'
case 'STOPPING':
return 'STOPPED'
case 'EXITED':
return 'STOPPED'
case 'UNKNOWN':
return 'FATAL'
default:
logger.error(`Supervisord returned an unsupported state: ${state}`)
return 'FATAL'
}
}
const client = xmlrpc.createClient({
host: 'localhost',
port: '9001',
path: '/RPC2'
})
client.methodCall[promisify.custom] = (method, params) => {
return new Promise((resolve, reject) => client.methodCall(method, params, (err, value) => {
if (err) reject(err)
else resolve(value)
}))
}
return promisify(client.methodCall)('supervisor.getAllProcessInfo', [])
.then((value) => {
return value.map(process => (
{
name: process.name,
state: convertStates(process.statename),
uptime: (process.statename === 'RUNNING') ? new Date(process.now) - new Date(process.start) : 0
}
))
})
.catch((error) => {
if (error.code === 'ECONNREFUSED') logger.error('Failed to connect to supervisord HTTP server.')
else logger.error(error)
})
}
module.exports = { getAllProcessInfo }

View file

@ -0,0 +1,25 @@
const _ = require('lodash/fp')
const low = require('lowdb')
const FileAsync = require('lowdb/adapters/FileAsync')
const adapter = new FileAsync('db.json')
let db = null
low(adapter).then(it => {
db = it
})
function saveConfig (config) {
const currentState = db.getState()
const newState = _.merge(currentState, config)
db.setState(newState)
return db.write()
.then(() => newState)
}
function getConfig (config) {
return db.getState()
}
module.exports = { getConfig, saveConfig }

39
lib/pg-transport.js Normal file
View file

@ -0,0 +1,39 @@
const Transport = require('winston-transport')
const eventBus = require('./event-bus')
//
// Inherit from `winston-transport` so you can take advantage
// of the base functionality and `.exceptions.handle()`.
//
module.exports = class CustomTransport extends Transport {
constructor (opts) {
super(opts)
//
// Consume any custom options here. e.g.:
// - Connection information for databases
// - Authentication information for APIs (e.g. loggly, papertrail,
// logentries, etc.).
//
this.tableName = opts.tableName || 'winston_logs'
if (!opts.connectionString) {
throw new Error('You have to define connectionString')
}
this.connectionString = opts.connectionString
}
log (level, message, meta, callback) {
if (!callback) callback = () => {}
setImmediate(() => {
this.emit('logged', level, message, meta)
})
// Perform the writing to the remote service
eventBus.publish('log', { level, message, meta })
callback()
}
}

View file

@ -347,7 +347,7 @@ function plugins (settings, deviceId) {
if (!transactionNotificationsEnabled()) return Promise.resolve()
const isCashOut = tx.direction === 'cashOut'
const zeroConf = isZeroConf(tx)
const zeroConf = isCashOut && isZeroConf(tx)
// 0-conf cash-out should only send notification on redemption
if (zeroConf && isCashOut && !rec.isRedemption && !rec.error) return Promise.resolve()

View file

@ -1,91 +0,0 @@
const axios = require('axios')
const crypto = require('crypto')
const _ = require('lodash/fp')
const API_ENDPOINT = 'https://api.quadrigacx.com/v2'
let counter = -1
let lastTimestamp = Date.now()
function pad (num) {
const asString = num.toString(10)
if (num < 10) return '00' + asString
if (num < 100) return '0' + asString
return asString
}
function generateNonce () {
const timestamp = Date.now()
if (timestamp !== lastTimestamp) counter = -1
lastTimestamp = timestamp
counter = (counter + 1) % 1000
return timestamp.toString(10) + pad(counter)
}
function authRequest (config, path, data) {
if (!config.key || !config.secret || !config.clientId) {
const err = new Error('Must provide key, secret and client ID')
return Promise.reject(err)
}
data = data || {}
const nonce = generateNonce()
const msg = [nonce, config.clientId, config.key].join('')
const signature = crypto
.createHmac('sha256', Buffer.from(config.secret))
.update(msg)
.digest('hex')
.toLowerCase()
const signedData = _.merge(data, {
key: config.key,
signature,
nonce
})
return request(path, 'POST', signedData)
}
function buildMarket (fiatCode, cryptoCode) {
if (!_.includes(cryptoCode, ['BTC', 'ETH', 'LTC', 'BCH'])) {
throw new Error(`Unsupported crypto: ${cryptoCode}`)
}
if (!_.includes(fiatCode, ['USD', 'CAD'])) {
throw new Error(`Unsupported fiat: ${fiatCode}`)
}
let market = `${cryptoCode.toLowerCase()}_${fiatCode.toLowerCase()}`
if (fiatCode === 'USD' && cryptoCode !== 'BTC') {
throw new Error(`Unsupported market: ${market}`)
}
return market
}
function request (path, method, data) {
const options = {
method,
data,
url: API_ENDPOINT + path,
headers: {
'User-Agent': 'Mozilla/4.0 (compatible; Lamassu client)',
'Content-Type': 'application/json; charset=utf-8'
}
}
return axios(options)
.then(r => {
if (r.data.error) throw new Error(r.data.error.message)
return r.data
})
}
module.exports = {
buildMarket,
authRequest,
request
}

View file

@ -1,28 +0,0 @@
const common = require('../../common/quadrigacx')
const coinUtils = require('../../../coin-utils')
function buy (account, cryptoAtoms, fiatCode, cryptoCode) {
return trade('buy', account, cryptoAtoms, fiatCode, cryptoCode)
}
function sell (account, cryptoAtoms, fiatCode, cryptoCode) {
return trade('sell', account, cryptoAtoms, fiatCode, cryptoCode)
}
function trade (type, account, cryptoAtoms, fiatCode, cryptoCode) {
return Promise.resolve()
.then(() => {
const market = common.buildMarket(fiatCode, cryptoCode)
const options = {
book: market,
amount: coinUtils.toUnit(cryptoAtoms, cryptoCode).toFixed(8)
}
return common.authRequest(account, '/' + type, options)
})
}
module.exports = {
buy,
sell
}

View file

@ -2,9 +2,9 @@ const axios = require('axios')
const BN = require('../../../bn')
function ticker (account, fiatCode, cryptoCode) {
return axios.get('https://bitpay.com/api/rates/' + cryptoCode + '/' + fiatCode)
return axios.get('https://bitpay.com/rates/' + cryptoCode + '/' + fiatCode)
.then(r => {
const data = r.data
const data = r.data.data
const price = BN(data.rate.toString())
return {
rates: {

View file

@ -18,9 +18,9 @@ exports.ticker = function ticker (account, fiatCode, cryptoCode) {
return getCurrencyRates(fiatCode, cryptoCode)
}
return axios.get('https://bitpay.com/api/rates')
return axios.get('https://bitpay.com/rates')
.then(response => {
const fxRates = response.data
const fxRates = response.data.data
const usdRate = findCurrency(fxRates, 'USD')
const fxRate = findCurrency(fxRates, fiatCode).div(usdRate)

View file

@ -28,7 +28,7 @@ function getSellPrice (obj) {
function ticker (account, fiatCode, cryptoCode) {
return Promise.resolve()
.then(() => {
if (!_.includes(cryptoCode, ['BTC', 'ETH', 'LTC', 'BCH'])) {
if (!_.includes(cryptoCode, ['BTC', 'ETH', 'LTC', 'BCH', 'ZEC', 'DASH'])) {
throw new Error('Unsupported crypto: ' + cryptoCode)
}
})

View file

@ -1,49 +0,0 @@
const axios = require('axios')
const _ = require('lodash/fp')
const BN = require('../../../bn')
const common = require('../../common/quadrigacx')
exports.NAME = 'QuadrigaCX'
exports.SUPPORTED_MODULES = ['ticker']
function findCurrency (fxRates, fiatCode) {
const rates = _.find(_.matchesProperty('code', fiatCode), fxRates)
if (!rates || !rates.rate) throw new Error(`Unsupported currency: ${fiatCode}`)
return BN(rates.rate.toString())
}
exports.ticker = function ticker (account, fiatCode, cryptoCode) {
if (fiatCode === 'USD' && cryptoCode === 'BTC' || fiatCode === 'CAD') {
return getCurrencyRates(fiatCode, cryptoCode)
}
return axios.get('https://bitpay.com/api/rates')
.then(response => {
const fxRates = response.data
const cadRate = findCurrency(fxRates, 'CAD')
const fxRate = findCurrency(fxRates, fiatCode).div(cadRate)
return getCurrencyRates('CAD', cryptoCode)
.then(res => ({
rates: {
ask: res.rates.ask.times(fxRate),
bid: res.rates.bid.times(fxRate)
}
}))
})
}
function getCurrencyRates (fiatCode, cryptoCode) {
return Promise.resolve()
.then(() => {
const market = common.buildMarket(fiatCode, cryptoCode)
return common.request(`/ticker?book=${market}`, 'GET')
})
.then(r => ({
rates: {
ask: BN(r.ask),
bid: BN(r.bid)
}
}))
}

View file

@ -54,7 +54,7 @@ function sendCoins (account, toAddress, cryptoAtoms, cryptoCode) {
.then(tx => {
if (!tx) return { txid }
const fee = BN(tx.gas).multipliedBy(BN(tx.gasPrice)).round()
const fee = BN(tx.gas).mul(BN(tx.gasPrice)).round()
return { txid, fee }
})

View file

@ -62,7 +62,7 @@ function updateCoinAtmRadar () {
const config = settings().config
return pi().getRawRates()
.then(rates => coinAtmRadar.update({ rates, config }))
.then(rates => coinAtmRadar.update({ rates, config }, settings()))
}
function start (__settings) {

View file

@ -26,10 +26,16 @@ const argv = require('minimist')(process.argv.slice(2))
const CLOCK_SKEW = 60 * 1000
const REQUEST_TTL = 3 * 60 * 1000
const THROTTLE_LOGS_QUERY = 30 * 1000
const THROTTLE_CLOCK_SKEW = 60 * 1000
const SETTINGS_CACHE_REFRESH = 60 * 60 * 1000
const pids = {}
const reboots = {}
const restartServicesMap = {}
const canGetLastSeenMap = {}
const canLogClockSkewMap = {}
const settingsCache = {}
const devMode = argv.dev || options.http
@ -167,13 +173,6 @@ function stateChange (req, res, next) {
.catch(next)
}
function deviceEvent (req, res, next) {
const pi = plugins(req.settings, req.deviceId)
pi.logEvent(req.body)
.then(() => respond(req, res))
.catch(next)
}
function verifyUser (req, res, next) {
const pi = plugins(req.settings, req.deviceId)
pi.verifyUser(req.body)
@ -245,9 +244,19 @@ function updateCustomer (req, res, next) {
}
function getLastSeen (req, res, next) {
return logs.getLastSeen(req.deviceId)
.then(r => res.json(r))
.catch(next)
const deviceId = req.deviceId
const timestamp = Date.now()
const shouldTrigger = !canGetLastSeenMap[deviceId] ||
timestamp - canGetLastSeenMap[deviceId] >= THROTTLE_LOGS_QUERY
if (shouldTrigger) {
canGetLastSeenMap[deviceId] = timestamp
return logs.getLastSeen(deviceId)
.then(r => res.json(r))
.catch(next)
}
return res.status(408).json({})
}
function updateLogs (req, res, next) {
@ -310,9 +319,15 @@ function httpError (msg, code) {
function filterOldRequests (req, res, next) {
const deviceTime = req.deviceTime
const delta = Date.now() - Date.parse(deviceTime)
const deviceId = req.deviceId
const timestamp = Date.now()
const delta = timestamp - Date.parse(deviceTime)
if (delta > CLOCK_SKEW) {
const shouldTrigger = !canLogClockSkewMap[deviceId] ||
timestamp - canLogClockSkewMap[deviceId] >= THROTTLE_CLOCK_SKEW
if (delta > CLOCK_SKEW && shouldTrigger) {
canLogClockSkewMap[deviceId] = timestamp
logger.error('Clock skew with lamassu-machine[%s] too high [%ss], adjust lamassu-machine clock',
req.deviceName, (delta / 1000).toFixed(2))
}
@ -337,8 +352,7 @@ function authorize (req, res, next) {
.catch(next)
}
const skip = (req, res) => _.includes(req.path, ['/poll', '/state', '/logs']) &&
res.statusCode === 200
const skip = (req, res) => _.includes(req.path, ['/poll', '/state', '/logs']) && _.includes(res.statusCode, [200, 408])
const configRequiredRoutes = [
'/poll',
@ -367,7 +381,6 @@ app.use(filterOldRequests)
app.get('/poll', poll)
app.post('/state', stateChange)
app.post('/event', deviceEvent)
app.post('/verify_user', verifyUser)
app.post('/verify_transaction', verifyTx)
@ -416,6 +429,7 @@ localApp.post('/restartServices', (req, res) => {
})
localApp.post('/dbChange', (req, res, next) => {
settingsCache.cache = null
return settingsLoader.loadLatest()
.then(poller.reload)
.then(() => logger.info('Config reloaded'))
@ -452,9 +466,23 @@ function populateSettings (req, res, next) {
oldVersionId = versionId
}
if (!versionId) {
// Clear cache every hour
if (Date.now() - settingsCache.timestamp > SETTINGS_CACHE_REFRESH) {
settingsCache.cache = null
}
if (!versionId && settingsCache.cache) {
req.settings = settingsCache.cache
return next()
}
if (!versionId && !settingsCache.cache) {
return settingsLoader.loadLatest()
.then(settings => { req.settings = settings })
.then(settings => {
settingsCache.cache = settings
settingsCache.timestamp = Date.now()
req.settings = settings
})
.then(() => next())
.catch(next)
}

View file

@ -0,0 +1,24 @@
var db = require('./db')
exports.up = function (next) {
const sql =
[
'create table server_logs ( ' +
'id uuid PRIMARY KEY, ' +
'device_id text, ' +
'log_level text, ' +
'timestamp timestamptz DEFAULT now(), ' +
'message text, ' +
'meta json)',
`create table server_support_logs (
id uuid PRIMARY KEY,
timestamp timestamptz not null default now() )`
]
db.multi(sql, next)
}
exports.down = function (next) {
next()
}

2
new-lamassu-admin/.env Normal file
View file

@ -0,0 +1,2 @@
BROWSER=none
SKIP_PREFLIGHT_CHECK=true

View file

@ -0,0 +1,3 @@
{
"extends": ["standard", "standard-react"]
}

23
new-lamassu-admin/.gitignore vendored Normal file
View file

@ -0,0 +1,23 @@
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# production
/build
# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local
npm-debug.log*
yarn-debug.log*
yarn-error.log*
public/fonts

View file

@ -0,0 +1,4 @@
import '@storybook/addon-actions/register';
import '@storybook/addon-links/register';
import '@storybook/addon-knobs/register';
import '@storybook/addon-backgrounds/register';

View file

@ -0,0 +1,7 @@
import { configure } from '@storybook/react';
function loadStories() {
require('../src/stories');
}
configure(loadStories, module);

View file

@ -0,0 +1,68 @@
This project was bootstrapped with [Create React App](https://github.com/facebook/create-react-app).
## Available Scripts
In the project directory, you can run:
### `npm start`
Runs the app in the development mode.<br>
Open [http://localhost:3000](http://localhost:3000) to view it in the browser.
The page will reload if you make edits.<br>
You will also see any lint errors in the console.
### `npm test`
Launches the test runner in the interactive watch mode.<br>
See the section about [running tests](https://facebook.github.io/create-react-app/docs/running-tests) for more information.
### `npm run build`
Builds the app for production to the `build` folder.<br>
It correctly bundles React in production mode and optimizes the build for the best performance.
The build is minified and the filenames include the hashes.<br>
Your app is ready to be deployed!
See the section about [deployment](https://facebook.github.io/create-react-app/docs/deployment) for more information.
### `npm run eject`
**Note: this is a one-way operation. Once you `eject`, you cant go back!**
If you arent satisfied with the build tool and configuration choices, you can `eject` at any time. This command will remove the single build dependency from your project.
Instead, it will copy all the configuration files and the transitive dependencies (Webpack, Babel, ESLint, etc) right into your project so you have full control over them. All of the commands except `eject` will still work, but they will point to the copied scripts so you can tweak them. At this point youre on your own.
You dont have to ever use `eject`. The curated feature set is suitable for small and middle deployments, and you shouldnt feel obligated to use this feature. However we understand that this tool wouldnt be useful if you couldnt customize it when you are ready for it.
## Learn More
You can learn more in the [Create React App documentation](https://facebook.github.io/create-react-app/docs/getting-started).
To learn React, check out the [React documentation](https://reactjs.org/).
### Code Splitting
This section has moved here: https://facebook.github.io/create-react-app/docs/code-splitting
### Analyzing the Bundle Size
This section has moved here: https://facebook.github.io/create-react-app/docs/analyzing-the-bundle-size
### Making a Progressive Web App
This section has moved here: https://facebook.github.io/create-react-app/docs/making-a-progressive-web-app
### Advanced Configuration
This section has moved here: https://facebook.github.io/create-react-app/docs/advanced-configuration
### Deployment
This section has moved here: https://facebook.github.io/create-react-app/docs/deployment
### `npm run build` fails to minify
This section has moved here: https://facebook.github.io/create-react-app/docs/troubleshooting#npm-run-build-fails-to-minify

23232
new-lamassu-admin/package-lock.json generated Normal file

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,56 @@
{
"name": "new-lamassu-admin",
"version": "0.1.0",
"license": "unlicense",
"dependencies": {
"@material-ui/core": "4.5.0",
"@material-ui/icons": "4.4.3",
"@use-hooks/axios": "1.3.0",
"axios": "0.19.0",
"bignumber.js": "9.0.0",
"classnames": "2.2.6",
"downshift": "3.3.4",
"file-saver": "2.0.2",
"formik": "2.0.3",
"jss-plugin-extend": "^10.0.0",
"lodash": "4.17.15",
"moment": "2.24.0",
"qrcode.react": "0.9.3",
"react": "^16.10.2",
"react-dom": "^16.10.2",
"react-router-dom": "5.1.2",
"yup": "0.27.0"
},
"devDependencies": {
"@babel/core": "^7.6.4",
"@storybook/addon-actions": "^5.2.3",
"@storybook/addon-backgrounds": "^5.2.4",
"@storybook/addon-knobs": "^5.2.3",
"@storybook/addon-links": "^5.2.3",
"@storybook/addons": "^5.2.3",
"@storybook/react": "^5.2.3",
"babel-loader": "8.0.6",
"react-scripts": "3.2.0",
"standard": "14.3.1"
},
"scripts": {
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"eject": "react-scripts eject",
"storybook": "start-storybook -p 9009 -s public",
"build-storybook": "build-storybook -s public"
},
"browserslist": {
"production": [
">0.2%",
"not dead",
"not op_mini all"
],
"development": [
"last 1 chrome version",
"last 1 firefox version",
"last 1 safari version"
]
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="18px" viewBox="0 0 24 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/ID/cam/comet</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/ID/cam/comet" transform="translate(1.000000, 1.000000)" stroke="#5F668A" stroke-width="1.6">
<path d="M11,13 C8.7912,13 7,11.2088 7,9 C7,6.7912 8.7912,5 11,5 C13.2088,5 15,6.7912 15,9 C15,11.2088 13.2088,13 11,13 Z M15.7142857,2.4 L13.3571429,0 L8.64285714,0 L6.28571429,2.4 L0,2.4 L0,16 L22,16 L22,2.4 L15.7142857,2.4 Z" id="Stroke-1"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 862 B

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="18px" viewBox="0 0 24 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/ID/cam/tomato</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/ID/cam/tomato" transform="translate(1.000000, 1.000000)" stroke="#FF584A" stroke-width="1.6">
<path d="M11,13 C8.7912,13 7,11.2088 7,9 C7,6.7912 8.7912,5 11,5 C13.2088,5 15,6.7912 15,9 C15,11.2088 13.2088,13 11,13 Z M15.7142857,2.4 L13.3571429,0 L8.64285714,0 L6.28571429,2.4 L0,2.4 L0,16 L22,16 L22,2.4 L15.7142857,2.4 Z" id="Stroke-1"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 864 B

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="18px" viewBox="0 0 24 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/ID/cam/zodiac</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/ID/cam/zodiac" transform="translate(1.000000, 1.000000)" stroke="#1B2559" stroke-width="1.6">
<path d="M11,13 C8.7912,13 7,11.2088 7,9 C7,6.7912 8.7912,5 11,5 C13.2088,5 15,6.7912 15,9 C15,11.2088 13.2088,13 11,13 Z M15.7142857,2.4 L13.3571429,0 L8.64285714,0 L6.28571429,2.4 L0,2.4 L0,16 L22,16 L22,2.4 L15.7142857,2.4 Z" id="Stroke-1"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 864 B

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="18px" viewBox="0 0 24 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/ID/card/comet</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/ID/card/comet" transform="translate(1.000000, 1.000000)" stroke="#5F668A" stroke-width="1.6">
<polygon id="Stroke-1" points="0 16 22 16 22 0 0 0"></polygon>
<path d="M11.7857143,4 L18.8571429,4" id="Stroke-3"></path>
<path d="M11.7857143,7.2 L18.8571429,7.2" id="Stroke-4"></path>
<polygon id="Stroke-5" points="3.14285714 11.2 8.64285714 11.2 8.64285714 4 3.14285714 4"></polygon>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 937 B

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="18px" viewBox="0 0 24 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/ID/card/tomato</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/ID/card/tomato" transform="translate(1.000000, 1.000000)" stroke="#FF584A" stroke-width="1.6">
<polygon id="Stroke-1" points="0 16 22 16 22 0 0 0"></polygon>
<path d="M11.7857143,4 L18.8571429,4" id="Stroke-3"></path>
<path d="M11.7857143,7.2 L18.8571429,7.2" id="Stroke-4"></path>
<polygon id="Stroke-5" points="3.14285714 11.2 8.64285714 11.2 8.64285714 4 3.14285714 4"></polygon>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 939 B

View file

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="24px" height="18px" viewBox="0 0 24 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/ID/card/zodiac</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/ID/card/zodiac" transform="translate(1.000000, 1.000000)" stroke="#1B2559">
<g id="Group-2">
<g id="id-copy" stroke-width="1.6">
<polygon id="Stroke-1" points="0 16 22 16 22 0 0 0"></polygon>
<path d="M11.7857143,4 L18.8571429,4" id="Stroke-3"></path>
<path d="M11.7857143,7.2 L18.8571429,7.2" id="Stroke-4"></path>
<polygon id="Stroke-5" points="3.14285714 11.2 8.64285714 11.2 8.64285714 4 3.14285714 4"></polygon>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="18px" height="18px" viewBox="0 0 18 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/ID/phone/comet</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/ID/phone/comet" transform="translate(-2.000000, 1.000000)" stroke="#5F668A" stroke-width="1.6">
<path d="M6.47150618,12.52898 C9.939556,15.9970298 13.7804112,16.1146315 15.4756355,15.9586292 C16.0220434,15.9090285 16.5308507,15.6578249 16.9188563,15.2698193 L19.0004862,13.1881894 L17.0220577,11.210561 L15.0436293,10.5505516 L13.7244104,11.8697705 C13.7244104,11.8697705 12.4059914,13.1881894 9.10914407,9.89054208 C5.81229671,6.59449473 7.13071565,5.27527578 7.13071565,5.27527578 L8.4499346,3.95605683 L7.78992512,1.97842842 L5.81229671,0 L3.73066681,2.0816299 C3.34186123,2.46963548 3.09145763,2.97844279 3.04105691,3.52485063 C2.88585468,5.22007499 3.00345637,9.06013015 6.47150618,12.52898 Z" id="Stroke-1-Copy"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="18px" height="18px" viewBox="0 0 18 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/ID/phone/white</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/ID/phone/white" transform="translate(-2.000000, 1.000000)" stroke="#FF584A" stroke-width="1.6">
<path d="M6.47150618,12.52898 C9.939556,15.9970298 13.7804112,16.1146315 15.4756355,15.9586292 C16.0220434,15.9090285 16.5308507,15.6578249 16.9188563,15.2698193 L19.0004862,13.1881894 L17.0220577,11.210561 L15.0436293,10.5505516 L13.7244104,11.8697705 C13.7244104,11.8697705 12.4059914,13.1881894 9.10914407,9.89054208 C5.81229671,6.59449473 7.13071565,5.27527578 7.13071565,5.27527578 L8.4499346,3.95605683 L7.78992512,1.97842842 L5.81229671,0 L3.73066681,2.0816299 C3.34186123,2.46963548 3.09145763,2.97844279 3.04105691,3.52485063 C2.88585468,5.22007499 3.00345637,9.06013015 6.47150618,12.52898 Z" id="Stroke-1-Copy"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="18px" height="18px" viewBox="0 0 18 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/ID/phone/zodiac</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/ID/phone/zodiac" transform="translate(-2.000000, 1.000000)" stroke="#1B2559" stroke-width="1.6">
<path d="M6.47150618,12.52898 C9.939556,15.9970298 13.7804112,16.1146315 15.4756355,15.9586292 C16.0220434,15.9090285 16.5308507,15.6578249 16.9188563,15.2698193 L19.0004862,13.1881894 L17.0220577,11.210561 L15.0436293,10.5505516 L13.7244104,11.8697705 C13.7244104,11.8697705 12.4059914,13.1881894 9.10914407,9.89054208 C5.81229671,6.59449473 7.13071565,5.27527578 7.13071565,5.27527578 L8.4499346,3.95605683 L7.78992512,1.97842842 L5.81229671,0 L3.73066681,2.0816299 C3.34186123,2.46963548 3.09145763,2.97844279 3.04105691,3.52485063 C2.88585468,5.22007499 3.00345637,9.06013015 6.47150618,12.52898 Z" id="Stroke-1-Copy"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="13px" height="8px" viewBox="0 0 13 8" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/action/arrow/regular</title>
<desc>Created with Sketch.</desc>
<defs>
<path d="M5.3501239,7.53208616 L0.473798314,2.73082122 C-0.158421727,2.1051411 -0.158421727,1.0952488 0.476737158,0.466675069 C1.11220338,-0.155816755 2.1378971,-0.155816755 2.77494316,0.468226909 L6.49990857,4.13723769 L10.2264532,0.466675069 C10.8619195,-0.155816755 11.8876132,-0.155816755 12.5260183,0.469568675 C13.1582383,1.0952488 13.1582383,2.1051411 12.5245507,2.73226987 L7.64673876,7.53497972 C7.33802629,7.83583835 6.92590837,8 6.49990828,8 C6.0739082,8 5.66179027,7.83583835 5.3501239,7.53208616 Z" id="path-1"></path>
</defs>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/action/arrow/regular">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<use id="Mask" fill="#1B2559" fill-rule="nonzero" xlink:href="#path-1"></use>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View file

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="18px" height="18px" viewBox="0 0 18 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/action/close</title>
<desc>Created with Sketch.</desc>
<defs>
<path d="M11.10567,8.99966734 L17.5616855,15.4562245 C18.1453995,16.0371533 18.1457502,16.9810221 17.5632744,17.5635465 C17.2826878,17.8441564 16.9043531,17.9996031 16.509308,17.9996031 C16.1150437,17.9996031 15.7367759,17.8439272 15.4563692,17.5634971 L8.99995005,11.1055617 L2.54567824,17.5603569 C2.26578723,17.8430155 1.88614994,17.9996031 1.48961505,17.9996031 C1.09473832,17.9996031 0.717380733,17.844225 0.436725633,17.5635465 C-0.145575211,16.9811971 -0.145575211,16.0373273 0.436725633,15.4578096 L6.89433001,8.99966707 L0.438314479,2.54310994 C-0.145399464,1.96218116 -0.145750215,1.01831232 0.436725633,0.435787934 C1.01746304,-0.144997872 1.95893893,-0.144997872 2.54250446,0.435787934 L8.99995074,6.89377234 L15.4580075,0.434202817 C16.0398949,-0.144908147 16.9801496,-0.144559181 17.5632744,0.435787934 C18.1455752,1.0181373 18.1455752,1.96200713 17.5632744,2.54152483 L11.10567,8.99966734 Z" id="path-1"></path>
<rect id="path-3" x="0" y="0" width="18" height="18"></rect>
</defs>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/action/close">
<g id="color/primary/zodiac" transform="translate(-0.000000, 0.000000)">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<use id="Mask" fill="#1B2559" xlink:href="#path-1"></use>
<g mask="url(#mask-2)">
<mask id="mask-4" fill="white">
<use xlink:href="#path-3"></use>
</mask>
<use id="Background" fill="#1B2559" fill-rule="evenodd" xlink:href="#path-3"></use>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="18px" height="18px" viewBox="0 0 18 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/action/copy</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linejoin="round">
<g id="icon/action/copy" transform="translate(1.000000, 1.000000)" stroke="#1B2559">
<g id="Group-5-Copy-2">
<polyline id="Stroke-1" stroke-width="2" points="6 1.2 6 -0.00024 16 -0.00024 16 13.06376 12 13.06376"></polyline>
<polygon id="Stroke-3" stroke-width="2" stroke-linecap="round" points="0 15.9368 10 15.9368 10 2.9368 0 2.9368"></polygon>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 878 B

View file

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="22px" viewBox="0 0 22 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/action/delete/disabled</title>
<desc>Created with Sketch.</desc>
<defs>
<rect id="path-1" x="0" y="0" width="22" height="22"></rect>
</defs>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/action/delete/disabled">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<g id="Background"></g>
<path d="M9,9 L9,18" id="Stroke-1" stroke="#9B9B9B" stroke-width="2" stroke-linecap="round" mask="url(#mask-2)"></path>
<path d="M13,9 L13,18" id="Stroke-2" stroke="#9B9B9B" stroke-width="2" stroke-linecap="round" mask="url(#mask-2)"></path>
<g id="Group-9" stroke-width="1" fill-rule="evenodd" mask="url(#mask-2)" stroke="#9B9B9B" stroke-linecap="round">
<g transform="translate(1.000000, 1.000000)" stroke-width="2">
<polyline id="Stroke-3" stroke-linejoin="round" points="2 5 4 20 16 20 18 5"></polyline>
<path d="M0,4 L20,4" id="Stroke-5"></path>
<path d="M13,3 C13,1.343 11.657,0 10,0 C8.343,0 7,1.343 7,3" id="Stroke-7"></path>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="22px" viewBox="0 0 22 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/action/delete/enabled</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
<g id="icon/action/delete/enabled" stroke="#1B2559" stroke-width="2">
<path d="M9,9 L9,18" id="Stroke-1"></path>
<path d="M13,9 L13,18" id="Stroke-2"></path>
<polyline id="Stroke-3" stroke-linejoin="round" points="3 6 5 21 17 21 19 6"></polyline>
<path d="M1,5 L21,5" id="Stroke-5"></path>
<path d="M14,4 C14,2.343 12.657,1 11,1 C9.343,1 8,2.343 8,4" id="Stroke-7"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 912 B

View file

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="22px" viewBox="0 0 22 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/action/delete/white</title>
<desc>Created with Sketch.</desc>
<defs>
<rect id="path-1" x="0" y="0" width="22" height="22"></rect>
</defs>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/action/delete/white">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<g id="Background"></g>
<path d="M9,9 L9,18" id="Stroke-1" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round" mask="url(#mask-2)"></path>
<path d="M13,9 L13,18" id="Stroke-2" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round" mask="url(#mask-2)"></path>
<g id="Group-9" stroke-width="1" fill-rule="evenodd" mask="url(#mask-2)" stroke="#FFFFFF" stroke-linecap="round">
<g transform="translate(1.000000, 1.000000)" stroke-width="2">
<polyline id="Stroke-3" stroke-linejoin="round" points="2 5 4 20 16 20 18 5"></polyline>
<path d="M0,4 L20,4" id="Stroke-5"></path>
<path d="M13,3 C13,1.343 11.657,0 10,0 C8.343,0 7,1.343 7,3" id="Stroke-7"></path>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="22px" viewBox="0 0 22 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/action/edit/disabled</title>
<desc>Created with Sketch.</desc>
<defs>
<rect id="path-1" x="0" y="0" width="22" height="22"></rect>
</defs>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/action/edit/disabled">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<g id="Background"></g>
<path d="M1,18 L1,18 C1,19.657 2.343,21 4,21 L18,21 C19.657,21 21,19.657 21,18" id="Stroke-1" stroke="#9B9B9B" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" mask="url(#mask-2)"></path>
<polygon id="Stroke-3" stroke="#9B9B9B" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" mask="url(#mask-2)" points="6 12 17 1 21 5 10 16 6 16"></polygon>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="22px" viewBox="0 0 22 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/action/edit/enabled</title>
<desc>Created with Sketch.</desc>
<defs>
<rect id="path-1" x="0" y="0" width="22" height="22"></rect>
</defs>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/action/edit/enabled">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<g id="Background"></g>
<path d="M1,18 L1,18 C1,19.657 2.343,21 4,21 L18,21 C19.657,21 21,19.657 21,18" id="Stroke-1" stroke="#1B2559" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" mask="url(#mask-2)"></path>
<polygon id="Stroke-3" stroke="#1B2559" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" mask="url(#mask-2)" points="6 12 17 1 21 5 10 16 6 16"></polygon>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="22px" viewBox="0 0 22 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/action/edit/white</title>
<desc>Created with Sketch.</desc>
<defs>
<rect id="path-1" x="0" y="0" width="22" height="22"></rect>
</defs>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/action/edit/white">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<g id="Background"></g>
<path d="M1,18 L1,18 C1,19.657 2.343,21 4,21 L18,21 C19.657,21 21,19.657 21,18" id="Stroke-1" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" mask="url(#mask-2)"></path>
<polygon id="Stroke-3" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" mask="url(#mask-2)" points="6 12 17 1 21 5 10 16 6 16"></polygon>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="18px" height="6px" viewBox="0 0 18 6" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/action/expand/closed</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/action/expand/closed" transform="translate(1.000000, 1.000000)" stroke="#1B2559" stroke-width="1.5">
<circle id="Oval-4" cx="14" cy="2" r="2"></circle>
<circle id="Oval-4-Copy" cx="8" cy="2" r="2"></circle>
<circle id="Oval-4-Copy-2" cx="2" cy="2" r="2"></circle>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 765 B

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="18px" height="6px" viewBox="0 0 18 6" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/action/expand/open</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/action/expand/open" transform="translate(1.000000, 1.000000)" fill="#1B2559" stroke="#1B2559" stroke-width="1.5">
<circle id="Oval-4" cx="14" cy="2" r="2"></circle>
<circle id="Oval-4-Copy" cx="8" cy="2" r="2"></circle>
<circle id="Oval-4-Copy-2" cx="2" cy="2" r="2"></circle>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 776 B

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="22px" viewBox="0 0 22 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/action/external link/white</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/action/external-link/white" transform="translate(1.000000, 1.000000)" stroke="#FFFFFF">
<g id="Group-7">
<polyline id="Stroke-1" stroke-width="2" points="20 11.1113 20 20.0003 0 20.0003 0 0.0003 8.889 0.0003"></polyline>
<polyline id="Stroke-3" stroke-width="2" points="14.4443 0 20.0003 0 20.0003 5.556"></polyline>
<path d="M10,10 L20,0" id="Stroke-5" stroke-width="2"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 976 B

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="22px" viewBox="0 0 22 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/action/external link/zodiac</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/action/external-link/zodiac" transform="translate(1.000000, 0.000000)" stroke="#1B2559">
<g id="Group-7" transform="translate(0.000000, 1.000000)">
<polyline id="Stroke-1" stroke-width="2" points="20 11.1113 20 20.0003 0 20.0003 0 0.0003 8.889 0.0003"></polyline>
<polyline id="Stroke-3" stroke-width="2" points="14.4443 0 20.0003 0 20.0003 5.556"></polyline>
<path d="M10,10 L20,0" id="Stroke-5" stroke-width="2"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1,020 B

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="22px" viewBox="0 0 22 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/action/help-w</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/action/help-w" fill="#FFFFFF">
<path d="M20.0004,11 C20.0004,6.03028475 15.9701153,2 11.0004,2 C6.03004556,2 2.0004,6.02992391 2.0004,11 C2.0004,15.9700761 6.03004556,20 11.0004,20 C15.9701153,20 20.0004,15.9697153 20.0004,11 Z M22.0004,11 C22.0004,17.0742847 17.0746847,22 11.0004,22 C4.92544514,22 0.000400000001,17.0746147 0.000400000001,11 C0.000400000001,4.92538534 4.92544514,0 11.0004,0 C17.0746847,0 22.0004,4.92571525 22.0004,11 Z" id="Stroke-1" fill-rule="nonzero"></path>
<path d="M9.9164,8.9063 C9.9164,9.45858475 9.46868475,9.9063 8.9164,9.9063 C8.36411525,9.9063 7.9164,9.45858475 7.9164,8.9063 C7.9164,6.89094438 9.72972438,5.35290249 11.7463843,5.7072003 C13.0663562,5.93764844 14.1348314,7.00654285 14.3652323,8.32479116 C14.6130182,9.7312185 13.941375,11.0876584 12.732214,11.7545735 C12.370484,11.9534687 12.1664,12.2664153 12.1664,12.5913 L12.1664,12.6563 C12.1664,13.2085847 11.7186847,13.6563 11.1664,13.6563 C10.6141153,13.6563 10.1664,13.2085847 10.1664,12.6563 L10.1664,12.5913 C10.1664,11.5009567 10.7946963,10.5375141 11.7674377,10.0026589 C12.2360927,9.74417086 12.493064,9.22519581 12.3953326,8.67046887 C12.3098185,8.1811985 11.8915858,7.76280177 11.4013649,7.67721566 C10.6126181,7.53864454 9.9164,8.1291691 9.9164,8.9063 Z" id="Stroke-3" fill-rule="nonzero"></path>
<path d="M10.1039,15.2188 C10.1039,14.6318 10.5799,14.1568 11.1659,14.1568 C11.7529,14.1568 12.2289,14.6318 12.2289,15.2188 C12.2289,15.8058 11.7529,16.2808 11.1659,16.2808 C10.5799,16.2808 10.1039,15.8058 10.1039,15.2188" id="Fill-5" fill-rule="evenodd"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2 KiB

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="22px" viewBox="0 0 22 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/action/help</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/action/help" fill="#1B2559">
<path d="M20.0004,11 C20.0004,6.03028475 15.9701153,2 11.0004,2 C6.03004556,2 2.0004,6.02992391 2.0004,11 C2.0004,15.9700761 6.03004556,20 11.0004,20 C15.9701153,20 20.0004,15.9697153 20.0004,11 Z M22.0004,11 C22.0004,17.0742847 17.0746847,22 11.0004,22 C4.92544514,22 0.000400000001,17.0746147 0.000400000001,11 C0.000400000001,4.92538534 4.92544514,0 11.0004,0 C17.0746847,0 22.0004,4.92571525 22.0004,11 Z" id="Stroke-1" fill-rule="nonzero"></path>
<path d="M9.9164,8.9063 C9.9164,9.45858475 9.46868475,9.9063 8.9164,9.9063 C8.36411525,9.9063 7.9164,9.45858475 7.9164,8.9063 C7.9164,6.89094438 9.72972438,5.35290249 11.7463843,5.7072003 C13.0663562,5.93764844 14.1348314,7.00654285 14.3652323,8.32479116 C14.6130182,9.7312185 13.941375,11.0876584 12.732214,11.7545735 C12.370484,11.9534687 12.1664,12.2664153 12.1664,12.5913 L12.1664,12.6563 C12.1664,13.2085847 11.7186847,13.6563 11.1664,13.6563 C10.6141153,13.6563 10.1664,13.2085847 10.1664,12.6563 L10.1664,12.5913 C10.1664,11.5009567 10.7946963,10.5375141 11.7674377,10.0026589 C12.2360927,9.74417086 12.493064,9.22519581 12.3953326,8.67046887 C12.3098185,8.1811985 11.8915858,7.76280177 11.4013649,7.67721566 C10.6126181,7.53864454 9.9164,8.1291691 9.9164,8.9063 Z" id="Stroke-3" fill-rule="nonzero"></path>
<path d="M10.1039,15.2188 C10.1039,14.6318 10.5799,14.1568 11.1659,14.1568 C11.7529,14.1568 12.2289,14.6318 12.2289,15.2188 C12.2289,15.8058 11.7529,16.2808 11.1659,16.2808 C10.5799,16.2808 10.1039,15.8058 10.1039,15.2188" id="Fill-5" fill-rule="evenodd"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2 KiB

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="22px" viewBox="0 0 22 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/action/machine/reboot</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/action/machine/reboot" transform="translate(1.000000, 0.000000)" stroke="#1B2559">
<g id="icon/">
<path d="M6.0355,19.6461 C4.9225,19.1811 3.8775,18.5171 2.9635,17.6531 C-0.9605,13.9431 -0.9915,7.9571 2.8945,4.2821 C3.8005,3.4261 4.8375,2.7711 5.9465,2.3171" id="Stroke-1" stroke-width="2"></path>
<polyline id="Stroke-3" stroke-width="2" points="6.4076 3.9644 6.3966 1.9544 4.3916 0.9994"></polyline>
<path d="M13.9642,2.3541 C15.0782,2.8191 16.1222,3.4831 17.0362,4.3471 C20.9602,8.0571 20.9912,14.0431 17.1052,17.7181 C16.2002,18.5741 15.1622,19.2281 14.0532,19.6831" id="Stroke-5" stroke-width="2"></path>
<polyline id="Stroke-7" stroke-width="2" points="13.5922 18.0357 13.6032 20.0457 15.6082 20.9997"></polyline>
<path d="M10.0004,13.898 L10.0004,8.138" id="Stroke-9" stroke-width="2"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="21px" height="22px" viewBox="0 0 21 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/action/machine/shut-down</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/action/machine/shut-down" transform="translate(1.000000, 1.000000)" stroke="#1B2559">
<g id="Group-5" transform="translate(-0.000000, 0.000000)">
<path d="M14.134,3.34427273 C16.5749091,4.97427273 18.1821818,7.75427273 18.1821818,10.9088182 C18.1821818,15.9297273 14.1121818,19.9997273 9.09127273,19.9997273 C4.07036364,19.9997273 0.000363636364,15.9297273 0.000363636364,10.9088182 C0.000363636364,7.77154545 1.59036364,5.00427273 4.00763636,3.37063636" id="Stroke-1" stroke-width="2"></path>
<path d="M9.09090909,0 L9.09090909,7.27272727" id="Stroke-3" stroke-width="2"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="22px" height="22px" viewBox="0 0 22 22" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/action/machine/unpair</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/action/machine/unpair" transform="translate(1.000000, 1.000000)" stroke="#1B2559">
<g id="Group-12">
<g id="Group-5" stroke-width="2">
<polyline id="Stroke-1" points="6.25 10 3.75 10 0 6.25 6.25 0 11.25 5"></polyline>
<polyline id="Stroke-3" points="13.75 10 16.25 10 20 13.75 13.75 20 8.75 15"></polyline>
</g>
<path d="M13.75,5 L13.75,2.5" id="Stroke-6"></path>
<path d="M16.25,5 L17.5,3.75" id="Stroke-7"></path>
<path d="M16.25,7.5 L18.75,7.5" id="Stroke-8"></path>
<path d="M3.75,12.5 L1.25,12.5" id="Stroke-9"></path>
<path d="M3.75,15 L2.5,16.25" id="Stroke-10"></path>
<path d="M6.25,15 L6.25,17.5" id="Stroke-11"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/button/add note</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/button/add-note" transform="translate(1.000000, 1.000000)">
<g id="Group-2" transform="translate(3.000000, 0.000000)" stroke="#1B2559" stroke-linecap="round" stroke-linejoin="round">
<polygon id="Stroke-1" points="0.45 11.5384615 8.55 11.5384615 8.55 0.461538462 0.45 0.461538462"></polygon>
<path d="M4.5,2.53846154 L7.2,2.53846154" id="Stroke-4"></path>
<path d="M2.475,4.61538462 L7.2,4.61538462" id="Stroke-6"></path>
<path d="M2.475,6.69230769 L7.2,6.69230769" id="Stroke-8"></path>
<path d="M2.475,8.76923077 L7.2,8.76923077" id="Stroke-10"></path>
</g>
<g id="Group-9" transform="translate(0.000000, 4.000000)">
<circle id="Oval" stroke="#1B2559" fill="#EBEFFF" cx="4" cy="4" r="4"></circle>
<g id="Group-6" transform="translate(1.200000, 1.600000)" fill="#1B2559" fill-rule="nonzero">
<polygon id="Path" points="3.2 2 5.2 2 5.2 2.8 3.2 2.8 3.2 4.8 2.4 4.8 2.4 2.8 0.4 2.8 0.4 2 2.4 2 2.4 0 3.2 0"></polygon>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/button/add/white</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/button/add/white" transform="translate(1.000000, 1.000000)" stroke="#FFFFFF">
<path d="M11.5384615,6 C11.5384615,9.05815385 9.05815385,11.5384615 6,11.5384615 C2.94184615,11.5384615 0.461538462,9.05815385 0.461538462,6 C0.461538462,2.94184615 2.94184615,0.461538462 6,0.461538462 C9.05815385,0.461538462 11.5384615,2.94184615 11.5384615,6 Z" id="Stroke-1"></path>
<path d="M6,3.69230769 L6,8.30769231" id="Stroke-3"></path>
<path d="M3.69230769,6 L8.30769231,6" id="Stroke-5"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/button/add/zodiac</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/button/add/zodiac" transform="translate(1.000000, 1.000000)" stroke="#1B2559">
<path d="M11.5384615,6 C11.5384615,9.05815385 9.05815385,11.5384615 6,11.5384615 C2.94184615,11.5384615 0.461538462,9.05815385 0.461538462,6 C0.461538462,2.94184615 2.94184615,0.461538462 6,0.461538462 C9.05815385,0.461538462 11.5384615,2.94184615 11.5384615,6 Z" id="Stroke-1"></path>
<path d="M6,3.69230769 L6,8.30769231" id="Stroke-3"></path>
<path d="M3.69230769,6 L8.30769231,6" id="Stroke-5"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1 KiB

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/button/authorize/white</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/button/authorize/white" transform="translate(1.000000, 1.000000)" stroke="#FFFFFF">
<circle id="Oval" cx="6" cy="6" r="6"></circle>
<polyline id="Stroke-13" stroke-linecap="round" stroke-linejoin="round" points="4 6.66666667 5 8 8 4"></polyline>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 739 B

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/button/authorize/zodiac</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/button/authorize/zodiac" transform="translate(1.000000, 1.000000)" stroke="#1B2559">
<g id="Group-9" fill-rule="evenodd">
<circle id="Oval" cx="6" cy="6" r="6"></circle>
</g>
<polyline id="Stroke-13" stroke-linecap="round" stroke-linejoin="round" points="4 6.66666667 5 8 8 4"></polyline>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 811 B

View file

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/button/blacklist</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/button/blacklist" transform="translate(1.000000, 1.000000)">
<g id="Group-2" transform="translate(3.000000, 0.000000)" stroke-linecap="round" stroke-linejoin="round">
<polygon id="Stroke-1" stroke="#1B2559" fill="#1B2559" points="0.45 11.5384615 8.55 11.5384615 8.55 0.461538462 0.45 0.461538462"></polygon>
<path d="M1.97637558,2.53846154 L7.2,2.53846154" id="Stroke-4" stroke="#FFFFFF"></path>
<path d="M2.475,4.61538462 L7.2,4.61538462" id="Stroke-6" stroke="#FFFFFF"></path>
<path d="M2.475,6.69230769 L7.2,6.69230769" id="Stroke-8" stroke="#FFFFFF"></path>
<path d="M2.475,8.76923077 L7.2,8.76923077" id="Stroke-10" stroke="#FFFFFF"></path>
</g>
<g id="Group-9" transform="translate(0.000000, 4.000000)">
<circle id="Oval" stroke="#1B2559" fill="#EBEFFF" cx="4" cy="4" r="4"></circle>
<g id="Group-6" transform="translate(1.200000, 1.600000)" fill="#1B2559" fill-rule="nonzero">
<polygon id="Path" points="3.2 2 5.2 2 5.2 2.8 3.2 2.8 3.2 4.8 2.4 4.8 2.4 2.8 0.4 2.8 0.4 2 2.4 2 2.4 0 3.2 0"></polygon>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/button/block/white</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/button/block/white" transform="translate(1.000000, 1.000000)" stroke="#FFFFFF">
<g id="Group-5">
<path d="M12,6 C12,9.3138 9.3132,12 6,12 C2.6868,12 0,9.3138 0,6 C0,2.6862 2.6868,0 6,0 C9.3132,0 12,2.6862 12,6 Z" id="Stroke-1"></path>
<path d="M10.2,1.8 L1.8,10.2" id="Stroke-3"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 860 B

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/button/block/zodiac</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/button/block/zodiac" transform="translate(1.000000, 1.000000)" stroke="#1B2559">
<g id="Group-5">
<path d="M12,6 C12,9.3138 9.3132,12 6,12 C2.6868,12 0,9.3138 0,6 C0,2.6862 2.6868,0 6,0 C9.3132,0 12,2.6862 12,6 Z" id="Stroke-1"></path>
<path d="M10.2,1.8 L1.8,10.2" id="Stroke-3"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 862 B

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="12px" height="10px" viewBox="0 0 12 10" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/button/cancel/white</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/button/cancel/white" transform="translate(0.000000, -1.000000)" stroke="#FFFFFF">
<g id="Group-5" transform="translate(1.000000, 1.000000)">
<path d="M10,0 L0,10" id="Stroke-1"></path>
<path d="M0,0 L10,10" id="Stroke-3"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 803 B

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="12px" height="10px" viewBox="0 0 12 10" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/button/cancel/zodiac</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/button/cancel/zodiac" transform="translate(0.000000, -1.000000)" stroke="#1B2559">
<g id="Group-5" transform="translate(1.000000, 1.000000)">
<path d="M10,0 L0,10" id="Stroke-1"></path>
<path d="M0,0 L10,10" id="Stroke-3"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 805 B

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/button/clock/white</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/button/clock/white" transform="translate(1.000000, 1.000000)" stroke="#FFFFFF">
<polyline id="Stroke-1" stroke-linecap="round" stroke-linejoin="round" points="8 7 6 7 6 4"></polyline>
<circle id="Oval" cx="6" cy="6" r="6"></circle>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 721 B

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/button/clock/zodiac</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/button/clock/zodiac" transform="translate(1.000000, 1.000000)" stroke="#1B2559">
<polyline id="Stroke-1" stroke-linecap="round" stroke-linejoin="round" points="8 7 6 7 6 4"></polyline>
<circle id="Oval" cx="6" cy="6" r="6"></circle>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 723 B

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="13px" viewBox="0 0 14 13" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/button/download/white</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/button/download/white" transform="translate(1.000000, 0.000000)" stroke="#FFFFFF">
<g id="icon/sf-small/wizzard">
<polyline id="Path-3" points="3.6 5.4 6 7.8 8.4 5.4"></polyline>
<path d="M6,0.5 L6,7.4" id="Path-4"></path>
<path d="M0,10 L0,10 C0,10.9942 0.8058,11.8 1.8,11.8 L10.2,11.8 C11.1942,11.8 12,10.9942 12,10" id="Stroke-1"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 933 B

View file

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="13px" viewBox="0 0 14 13" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/button/download/zodiac</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/button/download/zodiac" transform="translate(1.000000, 0.000000)" stroke="#1B2559">
<g id="icon/sf-small/wizzard">
<polyline id="Path-3" points="3.6 5.4 6 7.8 8.4 5.4"></polyline>
<path d="M6,0.5 L6,7.4" id="Path-4"></path>
<path d="M0,10 L0,10 C0,10.9942 0.8058,11.8 1.8,11.8 L10.2,11.8 C11.1942,11.8 12,10.9942 12,10" id="Stroke-1"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 935 B

View file

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="12px" viewBox="0 0 14 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/button/edit/zodiac</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/button/edit/zodiac" transform="translate(1.000000, -1.000000)" stroke="#1B2559">
<path d="M0,10 L0,10 C0,10.9942 0.8058,11.8 1.8,11.8 L10.2,11.8 C11.1942,11.8 12,10.9942 12,10" id="Stroke-1"></path>
<polygon id="Stroke-3" points="3 6.86666667 8.86666667 1 11 3.13333333 5.13333333 9 3 9"></polygon>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 835 B

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/button/reboot/zodiac copy</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/button/reboot/zodiac-copy" transform="translate(1.000000, 1.000000)" stroke="#FFFFFF">
<g id="Group-3">
<g id="Group-2">
<path d="M3.57419317,11.1560104 C2.91506589,10.8661403 2.29620875,10.4522182 1.75493083,9.91362078 C-0.568892549,7.60089351 -0.587250991,3.86936104 1.71406849,1.57845195 C2.03057585,1.26367293 2.37407977,0.992496226 2.73740775,0.764921841" id="Stroke-1"></path>
<polyline id="Stroke-3" points="3.37563213 1.84831169 3.36911784 0.595324675 2.18174122 4.15223411e-14"></polyline>
</g>
<path d="M5.92223784,7.57277922 L5.92223784,3.98212987" id="Stroke-9"></path>
<g id="Group-2" transform="translate(9.818105, 6.000000) scale(-1, -1) translate(-9.818105, -6.000000) translate(7.636287, 0.000000)">
<path d="M3.57419317,11.1560104 C2.91506589,10.8661403 2.29620875,10.4522182 1.75493083,9.91362078 C-0.568892549,7.60089351 -0.587250991,3.86936104 1.71406849,1.57845195 C2.03057585,1.26367293 2.37407977,0.992496226 2.73740775,0.764921841" id="Stroke-1"></path>
<polyline id="Stroke-3" points="3.37563213 1.84831169 3.36911784 0.595324675 2.18174122 4.15223411e-14"></polyline>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/button/reboot/zodiac</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/button/reboot/zodiac" transform="translate(1.000000, 1.000000)" stroke="#1B2559">
<g id="Group-3">
<g id="Group-2">
<path d="M3.57419317,11.1560104 C2.91506589,10.8661403 2.29620875,10.4522182 1.75493083,9.91362078 C-0.568892549,7.60089351 -0.587250991,3.86936104 1.71406849,1.57845195 C2.03057585,1.26367293 2.37407977,0.992496226 2.73740775,0.764921841" id="Stroke-1"></path>
<polyline id="Stroke-3" points="3.37563213 1.84831169 3.36911784 0.595324675 2.18174122 4.15223411e-14"></polyline>
</g>
<path d="M5.92223784,7.57277922 L5.92223784,3.98212987" id="Stroke-9"></path>
<g id="Group-2" transform="translate(9.818105, 6.000000) scale(-1, -1) translate(-9.818105, -6.000000) translate(7.636287, 0.000000)">
<path d="M3.57419317,11.1560104 C2.91506589,10.8661403 2.29620875,10.4522182 1.75493083,9.91362078 C-0.568892549,7.60089351 -0.587250991,3.86936104 1.71406849,1.57845195 C2.03057585,1.26367293 2.37407977,0.992496226 2.73740775,0.764921841" id="Stroke-1"></path>
<polyline id="Stroke-3" points="3.37563213 1.84831169 3.36911784 0.595324675 2.18174122 4.15223411e-14"></polyline>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.8 KiB

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/button/retry/white</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/button/retry/white" transform="translate(1.000000, 1.000000)" stroke="#FFFFFF">
<g id="Group-7">
<path d="M7.1942452e-14,9.603 L0.002,3.598 C0.003,1.611 1.614,-5.86197757e-14 3.602,-5.86197757e-14 L8.4,-5.86197757e-14 C10.39,-5.86197757e-14 12.001,1.613 12,3.601 L11.998,7.205 C11.998,9.192 10.386,10.803 8.398,10.803 L3,10.803" id="Stroke-1"></path>
<polyline id="Stroke-3" points="4.2002 9.601 3.0002 10.8 4.2002 12"></polyline>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1,004 B

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="14px" viewBox="0 0 14 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/button/retry/zodiac</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/button/retry/zodiac" transform="translate(1.000000, 1.000000)" stroke="#1B2559">
<g id="Group-7">
<path d="M7.1942452e-14,9.603 L0.002,3.598 C0.003,1.611 1.614,-5.86197757e-14 3.602,-5.86197757e-14 L8.4,-5.86197757e-14 C10.39,-5.86197757e-14 12.001,1.613 12,3.601 L11.998,7.205 C11.998,9.192 10.386,10.803 8.398,10.803 L3,10.803" id="Stroke-1"></path>
<polyline id="Stroke-3" points="4.2002 9.601 3.0002 10.8 4.2002 12"></polyline>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1,006 B

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="12px" height="12px" viewBox="0 0 12 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/button/shut down copy</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/button/shut-down-copy" stroke="#FFFFFF">
<g id="Group-5" transform="translate(1.000000, 0.000000)">
<path d="M7.7735,2 C9.116,2.89710351 10,4.4271328 10,6.16330077 C10,8.92665975 7.7615,11.1666667 5,11.1666667 C2.2385,11.1666667 0,8.92665975 0,6.16330077 C0,4.43663919 0.8745,2.91361461 2.204,2.01450976" id="Stroke-1"></path>
<path d="M5,0.75 L5,3.25" id="Stroke-3"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 951 B

View file

@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="12px" height="12px" viewBox="0 0 12 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/button/shut down</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/button/shut-down" stroke="#1B2559">
<g id="Group-5" transform="translate(1.000000, 0.000000)">
<path d="M7.7735,2 C9.116,2.89710351 10,4.4271328 10,6.16330077 C10,8.92665975 7.7615,11.1666667 5,11.1666667 C2.2385,11.1666667 0,8.92665975 0,6.16330077 C0,4.43663919 0.8745,2.91361461 2.204,2.01450976" id="Stroke-1"></path>
<path d="M5,0.75 L5,3.25" id="Stroke-3"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 941 B

View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="12px" viewBox="0 0 14 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/button/unpair/white</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/button/unpair/white" transform="translate(1.000000, 0.000000)" stroke="#FFFFFF">
<g id="Group-12">
<g id="Group-5">
<polyline id="Stroke-1" points="3.75 6 2.25 6 0 3.75 3.75 0 6.75 3"></polyline>
<polyline id="Stroke-3" points="8.25 6 9.75 6 12 8.25 8.25 12 5.25 9"></polyline>
</g>
<path d="M8.25,3 L8.25,1.5" id="Stroke-6"></path>
<path d="M9.75,3 L10.5,2.25" id="Stroke-7"></path>
<path d="M9.75,4.5 L11.25,4.5" id="Stroke-8"></path>
<path d="M2.25,7.5 L0.75,7.5" id="Stroke-9"></path>
<path d="M2.25,9 L1.5,9.75" id="Stroke-10"></path>
<path d="M3.75,9 L3.75,10.5" id="Stroke-11"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="12px" viewBox="0 0 14 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/button/unpair/zodiac</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/button/unpair/zodiac" transform="translate(1.000000, 0.000000)" stroke="#1B2559">
<g id="Group-12">
<g id="Group-5">
<polyline id="Stroke-1" points="3.75 6 2.25 6 0 3.75 3.75 0 6.75 3"></polyline>
<polyline id="Stroke-3" points="8.25 6 9.75 6 12 8.25 8.25 12 5.25 9"></polyline>
</g>
<path d="M8.25,3 L8.25,1.5" id="Stroke-6"></path>
<path d="M9.75,3 L10.5,2.25" id="Stroke-7"></path>
<path d="M9.75,4.5 L11.25,4.5" id="Stroke-8"></path>
<path d="M2.25,7.5 L0.75,7.5" id="Stroke-9"></path>
<path d="M2.25,9 L1.5,9.75" id="Stroke-10"></path>
<path d="M3.75,9 L3.75,10.5" id="Stroke-11"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View file

@ -0,0 +1,17 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="14px" height="12px" viewBox="0 0 14 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/button/upload/zodiac</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
<g id="icon/button/upload/zodiac" transform="translate(1.000000, -1.000000)" stroke="#1B2559">
<g id="icon/sf-small/wizzard" transform="translate(0.000000, 1.000000)">
<g id="Group" transform="translate(6.100000, 4.000000) scale(1, -1) translate(-6.100000, -4.000000) translate(3.600000, 0.000000)">
<polyline id="Path-3" points="-3.64153152e-13 5.4 2.4 7.8 4.8 5.4"></polyline>
<path d="M2.4,0.5 L2.4,7.4" id="Path-4"></path>
</g>
<path d="M0,9 L0,9 C0,9.9942 0.8058,10.8 1.8,10.8 L10.2,10.8 C11.1942,10.8 12,9.9942 12,9" id="Stroke-1"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View file

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="34px" height="28px" viewBox="0 0 34 28" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/container/ID</title>
<desc>Created with Sketch.</desc>
<defs>
<rect id="path-1" x="0" y="0" width="34" height="28" rx="8"></rect>
<rect id="path-3" x="0" y="0" width="34" height="28"></rect>
</defs>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/container/ID">
<g id="color/secondary/zircon" stroke-width="1" fill-rule="evenodd">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<use id="Mask" fill="#EBEFFF" xlink:href="#path-1"></use>
<g mask="url(#mask-2)">
<mask id="mask-4" fill="white">
<use xlink:href="#path-3"></use>
</mask>
<use id="Background" fill="#EBEFFF" fill-rule="evenodd" xlink:href="#path-3"></use>
</g>
</g>
<g id="icon/ID/phone/zodiac" transform="translate(6.000000, 6.000000)" stroke="#1B2559" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.6">
<path d="M6.47150618,12.52898 C9.939556,15.9970298 13.7804112,16.1146315 15.4756355,15.9586292 C16.0220434,15.9090285 16.5308507,15.6578249 16.9188563,15.2698193 L19.0004862,13.1881894 L17.0220577,11.210561 L15.0436293,10.5505516 L13.7244104,11.8697705 C13.7244104,11.8697705 12.4059914,13.1881894 9.10914407,9.89054208 C5.81229671,6.59449473 7.13071565,5.27527578 7.13071565,5.27527578 L8.4499346,3.95605683 L7.78992512,1.97842842 L5.81229671,0 L3.73066681,2.0816299 C3.34186123,2.46963548 3.09145763,2.97844279 3.04105691,3.52485063 C2.88585468,5.22007499 3.00345637,9.06013015 6.47150618,12.52898 Z" id="Stroke-1-Copy"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2 KiB

View file

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/container/SF/hover</title>
<desc>Created with Sketch.</desc>
<defs>
<circle id="path-1" cx="16" cy="16" r="16"></circle>
</defs>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/container/SF/hover">
<g id="Group-3">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<use id="Mask" fill="#5F668A" fill-rule="nonzero" xlink:href="#path-1"></use>
<g id="icon/sf-small/download/white" mask="url(#mask-2)" stroke="#FFFFFF" stroke-linecap="round" stroke-linejoin="round" stroke-width="2">
<g transform="translate(8.000000, 8.000000)">
<polyline id="Path-3" points="4.8 7.2 8 10.4 11.2 7.2"></polyline>
<path d="M8,1.6 L8,8.8" id="Path-4"></path>
<path d="M0,12 L0,12 C0,13.3256 1.0744,14.4 2.4,14.4 L13.6,14.4 C14.9256,14.4 16,13.3256 16,12" id="Stroke-1"></path>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

View file

@ -0,0 +1,28 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="32px" height="32px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/container/SF/regular</title>
<desc>Created with Sketch.</desc>
<defs>
<circle id="path-1" cx="16" cy="16" r="16"></circle>
</defs>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/container/SF/regular">
<g id="Group-3">
<mask id="mask-2" fill="white">
<use xlink:href="#path-1"></use>
</mask>
<use id="Mask" fill="#EBEFFF" fill-rule="nonzero" xlink:href="#path-1"></use>
<g id="icon/sf-small/download/regular" mask="url(#mask-2)" stroke-linecap="round" stroke-linejoin="round">
<g transform="translate(8.000000, 8.000000)">
<g id="Group" stroke="none" stroke-width="1" fill-rule="evenodd" transform="translate(4.800000, 1.600000)">
<polyline id="Path-3" stroke="#1B2559" stroke-width="2" points="0 5.6 3.2 8.8 6.4 5.6"></polyline>
<path d="M3.2,0 L3.2,7.2" id="Path-4" stroke="#1B2559" stroke-width="2"></path>
</g>
<path d="M0,12 L0,12 C0,13.3256 1.0744,14.4 2.4,14.4 L13.6,14.4 C14.9256,14.4 16,13.3256 16,12" id="Stroke-1" stroke="#1B2559" stroke-width="2"></path>
</g>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="10px" height="12px" viewBox="0 0 10 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/direction/cash-in</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/direction/cash-in" transform="translate(-1.000000, 0.000000)" fill="#16D6D3">
<path d="M3.99134364,0.321790399 L10.1430099,4.40569595 C11.0271728,4.99266501 11.2660914,6.1822461 10.6766494,7.06269968 C10.5357408,7.27317585 10.3543728,7.45378298 10.1430099,7.59410043 L3.99134364,11.678006 C3.10718075,12.264975 1.91258801,12.0270588 1.32314609,11.1466052 C1.11243854,10.8318699 1,10.4620686 1,10.0838037 L1,1.91599264 C1,0.857819122 1.86143307,0 2.92406462,0 C3.30392305,0 3.67528233,0.11196683 3.99134364,0.321790399 Z" id="Path-3"></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1,017 B

View file

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="10px" height="12px" viewBox="0 0 10 12" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 56.3 (81716) - https://sketch.com -->
<title>icon/direction/cash-out</title>
<desc>Created with Sketch.</desc>
<g id="Styleguide" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="icon/direction/cash-out" transform="translate(-1.000000, 0.000000)" fill="#5A67FF">
<path d="M3.99134364,0.321790399 L10.1430099,4.40569595 C11.0271728,4.99266501 11.2660914,6.1822461 10.6766494,7.06269968 C10.5357408,7.27317585 10.3543728,7.45378298 10.1430099,7.59410043 L3.99134364,11.678006 C3.10718075,12.264975 1.91258801,12.0270588 1.32314609,11.1466052 C1.11243854,10.8318699 1,10.4620686 1,10.0838037 L1,1.91599264 C1,0.857819122 1.86143307,0 2.92406462,0 C3.30392305,0 3.67528233,0.11196683 3.99134364,0.321790399 Z" id="Path-3" transform="translate(6.000000, 6.000000) scale(-1, 1) translate(-6.000000, -6.000000) "></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.6 KiB

Some files were not shown because too many files have changed in this diff Show more