- fix: Various fixes for release

- fix: Translation fixes
- fix: Various fixes
- feat: PB translations, configuration changes
- fix: Bugfixes

GitOrigin-RevId: 55f8b148c42a296162fc707c36a5146ca0073b4b
This commit is contained in:
the-superpirate 2021-01-29 11:18:22 +03:00
parent f1189351f3
commit d51e5ab65d
196 changed files with 7089 additions and 11831 deletions

View File

@ -4,7 +4,7 @@
Hyperboria repository is a pack of tools for dealing with SciMag and SciTech collections.
It consists of configurable [`search engine`](nexus/summa), [`pipeline`](nexus/pipe) for [`ingesting`](nexus/ingest) data
It consists of configurable [`search engine`](nexus/cognitron), [`pipeline`](nexus/pipe) for [`ingesting`](nexus/ingest) data
from upstream sources. So-called [`actions`](nexus/actions) aimed to converting data from external APIs
into [`internal Protobuf format`](nexus/models) and to landing converted data into databases and/or search engines.

View File

@ -16,10 +16,8 @@ http_archive(
http_archive(
name = "build_bazel_rules_nodejs",
sha256 = "6a67a8a1bf6fddc9113f73471029b819eef4575c3a936a4a01d57e411894d692",
urls = [
"https://github.com/bazelbuild/rules_nodejs/releases/download/2.0.2/rules_nodejs-2.0.2.tar.gz",
],
sha256 = "6142e9586162b179fdd570a55e50d1332e7d9c030efd853453438d607569721d",
urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/3.0.0/rules_nodejs-3.0.0.tar.gz"],
)
http_archive(
@ -33,19 +31,19 @@ http_archive(
http_archive(
name = "com_google_protobuf",
sha256 = "7d663c8dc81d282dc92e884b38e9c179671e31ccacce311154420e65f7d142c6",
strip_prefix = "protobuf-3.13.0.1",
sha256 = "d0f5f605d0d656007ce6c8b5a82df3037e1d8fe8b121ed42e536f569dec16113",
strip_prefix = "protobuf-3.14.0",
urls = [
"https://github.com/protocolbuffers/protobuf/archive/v3.13.0.1.tar.gz",
"https://github.com/protocolbuffers/protobuf/archive/v3.14.0.tar.gz",
],
)
http_archive(
name = "io_bazel_rules_docker",
sha256 = "ba415feb61f7dd08051c7096df9feeb2109bc918878ef924ad9262fe0fcdf6f9",
strip_prefix = "rules_docker-9bfcd7dbf0294ed9d11a99da6363fc28df904502",
sha256 = "df3ef4a4b53b0145c9751c1e2a840f900e322e7798612a46257abe285d046dc5",
strip_prefix = "rules_docker-7da0de3d094aae5601c45ae0855b64fb2771cd72",
urls = [
"https://github.com/bazelbuild/rules_docker/archive/9bfcd7dbf0294ed9d11a99da6363fc28df904502.zip",
"https://github.com/bazelbuild/rules_docker/archive/7da0de3d094aae5601c45ae0855b64fb2771cd72.zip",
],
)
@ -97,19 +95,10 @@ http_archive(
http_archive(
name = "rules_python",
sha256 = "ae3c1380c3c19d47fb474f201862dde7c14601130be2befa73bb02211267e960",
strip_prefix = "rules_python-e3df8bcf0f675d20aaf752c8ba32a0259dd79996",
sha256 = "b228318a786d99b665bc83bd6cdb81512cae5f8eb15e8cd19f9956604b8939f5",
strip_prefix = "rules_python-a4a1ccffc666db5376342789ad021a943fb84256",
urls = [
"https://github.com/bazelbuild/rules_python/archive/e3df8bcf0f675d20aaf752c8ba32a0259dd79996.tar.gz",
],
)
http_archive(
name = "rules_python_external",
sha256 = "30987e33c0b00ef75d11dec756db6a5d57ccd4085525f8888d5237ef798f8d16",
strip_prefix = "rules_python_external-2c78da5b5beb78c4a96b8b4d84e9c34de8178efb",
urls = [
"https://github.com/dillon-giacoppo/rules_python_external/archive/2c78da5b5beb78c4a96b8b4d84e9c34de8178efb.zip",
"https://github.com/bazelbuild/rules_python/archive/a4a1ccffc666db5376342789ad021a943fb84256.tar.gz",
],
)
@ -175,7 +164,18 @@ raze_fetch_remote_crates()
register_toolchains("//:proto-toolchain")
# NodeJS
load("@build_bazel_rules_nodejs//:index.bzl", "yarn_install")
load("@build_bazel_rules_nodejs//:index.bzl", "node_repositories", "yarn_install")
node_repositories(
node_repositories = {
"15.5.1-darwin_amd64": ("node-v15.5.1-darwin-x64.tar.gz", "node-v15.5.1-darwin-x64", "4507dab0481b0b5374b5758b1eba7d105c8cbcb173548119b04d9ef7d9f1d40f"),
"15.5.1-linux_amd64": ("node-v15.5.1-linux-x64.tar.xz", "node-v15.5.1-linux-x64", "dbc41a611d99aedf2cfd3d0acc50759a6b9084c7447862e990f51958d4a7aa41"),
},
node_version = "15.5.1",
package_json = ["//rules/nodejs:package.json"],
preserve_symlinks = True,
yarn_version = "1.22.4",
)
yarn_install(
name = "npm",
@ -193,16 +193,6 @@ rules_pkg_dependencies()
# Docker Setup
load(
"@io_bazel_rules_docker//toolchains/docker:toolchain.bzl",
docker_toolchain_configure = "toolchain_configure",
)
docker_toolchain_configure(
name = "docker_config",
client_config = "/docker",
)
load("@io_bazel_rules_docker//repositories:repositories.bzl", container_repositories = "repositories")
container_repositories()
@ -211,9 +201,9 @@ load("@io_bazel_rules_docker//repositories:deps.bzl", container_deps = "deps")
container_deps()
load("@io_bazel_rules_docker//repositories:pip_repositories.bzl", "pip_deps")
load("@io_bazel_rules_docker//repositories:py_repositories.bzl", "py_deps")
pip_deps()
py_deps()
load("@io_bazel_rules_docker//java:image.bzl", java_image_repos = "repositories")
load("@io_bazel_rules_docker//python3:image.bzl", py3_image_repos = "repositories")
@ -231,17 +221,13 @@ rust_image_repos()
# Python
register_toolchains("//rules/python:py_toolchain")
load("@rules_python_external//:defs.bzl", "pip_install")
load("@rules_python//python:pip.bzl", "pip_install")
pip_install(
name = "pip_modules_external",
name = "pip_modules",
requirements = "//rules/python:requirements.txt",
)
load("@rules_python_external//:repositories.bzl", "rules_python_external_dependencies")
rules_python_external_dependencies()
# K8s
load("@io_bazel_rules_k8s//k8s:k8s.bzl", "k8s_repositories")

View File

@ -39,3 +39,32 @@ container_image(
visibility = ["//visibility:public"],
)
download_pkgs(
name = "download-base-nodejs-image",
image_tar = "//images:base-image.tar",
packages = [
"bash",
"ca-certificates",
"libgoogle-perftools-dev",
"libprotobuf17",
"libssl1.1",
"nodejs",
],
)
install_pkgs(
name = "install-base-nodejs-image",
image_tar = "//images:base-image.tar",
installables_tar = ":download-base-nodejs-image.tar",
installation_cleanup_commands = "rm -rf /var/lib/apt/lists/*",
output_image_name = "installed-base-nodejs-image",
)
container_image(
name = "base-nodejs-image",
base = ":install-base-nodejs-image",
entrypoint = ["/usr/bin/nodejs"],
env = {"LANG": "C.UTF-8"},
visibility = ["//visibility:public"],
)

View File

@ -1,4 +1,4 @@
load("@pip_modules_external//:requirements.bzl", "requirement")
load("@pip_modules//:requirements.bzl", "requirement")
load("@rules_python//python:defs.bzl", "py_library")
py_library(

View File

@ -1,4 +1,4 @@
load("@pip_modules_external//:requirements.bzl", "requirement")
load("@pip_modules//:requirements.bzl", "requirement")
load("@rules_python//python:defs.bzl", "py_library")
py_library(

View File

@ -1,4 +1,4 @@
load("@pip_modules_external//:requirements.bzl", "requirement")
load("@pip_modules//:requirements.bzl", "requirement")
load("@rules_python//python:defs.bzl", "py_library")
py_library(

20
library/js/BUILD.bazel Normal file
View File

@ -0,0 +1,20 @@
load("//rules/nodejs:common.bzl", "js_library")
js_library(
name = "base-client",
srcs = ["base-client.js"],
data = [
"//library/js:utils",
"@npm//axios",
],
visibility = ["//visibility:public"],
)
js_library(
name = "utils",
srcs = ["utils.js"],
data = [
"@npm//lodash",
],
visibility = ["//visibility:public"],
)

52
library/js/base-client.js Normal file
View File

@ -0,0 +1,52 @@
import { removeUndefined, toCamel, toSnake } from '~/library/js/utils'
import Axios from 'axios'
export default class BaseClient {
constructor ({ baseUrl, headers = null, beforeRequest = null, afterRequest = null, errorHandler = null, withCredentials = false } = {}) {
this.nativeClient = Axios.create({
baseURL: baseUrl,
withCredentials: withCredentials,
headers: {
'X-Bypass-Cache': 1,
'Accept-Language': 'en'
},
transformResponse: Axios.defaults.transformResponse.concat([data => {
return toCamel(data)
}])
})
this.nativeClient.defaults.withCredentials = withCredentials
this.nativeClient.interceptors.request.use((config) => {
if (config.data) {
config.data = removeUndefined(config.data)
config.data = toSnake(config.data)
}
if (config.headers) {
if (typeof headers === 'function') {
config.headers = Object.assign(config.headers, headers())
} else {
config.headers = Object.assign(config.headers, headers)
}
}
if (beforeRequest) {
beforeRequest()
}
return config
})
this.nativeClient.interceptors.response.use((response) => {
if (afterRequest) {
afterRequest()
}
return response.data
}, (error) => {
if (afterRequest) {
afterRequest()
}
if (errorHandler) {
return errorHandler(error)
} else {
return Promise.reject(error)
}
})
}
}

View File

@ -0,0 +1,7 @@
load("//rules/nodejs:common.bzl", "js_library")
js_library(
name = "components",
srcs = glob(["**/*.vue"]),
visibility = ["//visibility:public"],
)

View File

@ -0,0 +1,21 @@
<template lang="pug">
b-container
b-modal(ref="newElementModal", :title="'New ' + typeName", @ok="handleAddElementOk", @cancel="handleAddElementCancel", @shown="$refs.newElement.focus()")
p.text-modal
b-form-input.form-control-sm(ref="newElement", v-model="newElement")
b-badge.ml-2(v-for="(element, elementIndex) of value", :key="elementIndex")
span {{ getDisplayName(element) }}
i.ml-1.fa.fa-sm.fa-remove(@click="deleteElement(elementIndex)", v-if="mutable")
b-badge.ml-2(@click="handleAddElementInit", variant="danger", v-if="mutable")
i.fa.fa-md.fa-plus
</template>
<script>
import BaseList from '~/library/js/components/BaseList'
export default {
name: 'BadgeList',
extends: BaseList
}
</script>

View File

@ -0,0 +1,56 @@
<script>
export default {
name: 'BaseList',
props: {
value: {
type: Array,
default: function () { return [] }
},
typeName: {
type: String,
default: 'element'
},
getDisplayName: {
type: Function,
default: function (x) {
return x
}
},
afterProcess: {
type: Function,
default: function (x) {
return x
}
},
mutable: {
type: Boolean,
default: true
}
},
data () {
return {
newElement: null
}
},
methods: {
handleAddElementInit () {
this.$refs.newElementModal.show()
},
handleAddElementOk () {
let processed = this.afterProcess(this.newElement)
this.value.push(processed)
this.$emit('added', processed)
this.newElement = null
},
handleAddElementCancel () {
this.newElement = null
},
deleteElement (elementIndex) {
let deleted = this.value[elementIndex]
this.value.splice(elementIndex, 1)
this.$emit('deleted', deleted)
}
}
}
</script>

View File

@ -0,0 +1,21 @@
<template lang="pug">
b-container
b-modal(ref="newElementModal", :title="'New ' + typeName", @ok="handleAddElementOk", @cancel="handleAddElementCancel", @shown="$refs.newElement.focus()")
p.text-modal
b-form-input.form-control-sm(ref="newElement", v-model="newElement")
div(v-for="(element, elementIndex) of value", :key="elementIndex")
span {{ getDisplayName(element) }}
i.ml-1.fa.fa-sm.fa-remove.float-right(@click="deleteElement(elementIndex)", v-if="mutable")
hr
b-button.btn-sm.float-right(@click="handleAddElementInit", variant="primary", v-if="mutable") Add
</template>
<script>
import BaseList from '~/library/js/components/BaseList'
export default {
name: 'CommonList',
extends: BaseList
}
</script>

View File

@ -0,0 +1,45 @@
<template lang="pug">
b-container(v-if="visible")
.loader
.message {{text}}
</template>
<script>
export default {
name: 'Loader',
props: {
text: {
type: String,
required: true
},
visible: {
type: Boolean,
required: true
}
}
}
</script>
<style lang="scss" scoped>
.loader {
width: 100%;
height: 100%;
position: fixed;
z-index: 100;
background-color: black;
opacity: 0.3;
top: 0;
left: 0;
}
.message {
padding: 50px 20px;
background: white;
width: 30%;
text-align: center;
position: fixed;
left: 35%;
top: 100px;
z-index: 1000;
font-size: 26px;
}
</style>

145
library/js/utils.js Normal file
View File

@ -0,0 +1,145 @@
import lodash from 'lodash'
export const alignToLines = function (array, lineSize) {
const lines = []
const length = array.length
for (let i = 0; i < length; i += lineSize) {
const line = []
for (let l = 0; l < lineSize; l++) {
if (i + l < length) {
line.push(array[i + l])
}
}
lines.push(line)
}
return lines
}
export function removeUndefined (obj) {
Object.keys(obj).forEach(key => {
if (obj[key] && typeof obj[key] === 'object') removeUndefined(obj[key])
else if (obj[key] === undefined) delete obj[key]
})
return obj
}
function castObjectKeys (o, depth, func, exclude) {
if (depth === 0) {
return o
}
if (lodash.isArray(o)) {
return o.map(x => {
if (exclude !== undefined && $.inArray(x, exclude) > -1) {
return x
} else {
return castObjectKeys(x, depth - 1, func, exclude)
}
})
} else if (lodash.isPlainObject(o)) {
const castedObject = {}
for (const key in o) {
if (exclude !== undefined && $.inArray(key, exclude) > -1) {
castedObject[key] = o[key]
} else {
castedObject[func(key)] = castObjectKeys(o[key], depth - 1, func, exclude)
}
}
return castedObject
} else {
return o
}
}
export const toSnake = function (o, depth, exclude) {
return castObjectKeys(o, depth || -1, lodash.snakeCase, exclude)
}
export const toCamel = function (o, depth, exclude) {
return castObjectKeys(o, depth || -1, lodash.camelCase, exclude)
}
export const toKebab = function (o, depth, exclude) {
return castObjectKeys(o, depth || -1, lodash.kebabCase, exclude)
}
export const queryString = function (o) {
o = JSON.parse(JSON.stringify(o))
const r = []
for (const key in o) {
const value = o[key]
if (value !== undefined) {
if (Array.isArray(value)) {
value.map((it, index) => r.push(`${key}-${index}=${it}`))
} else {
r.push(toSnake(key) + '=' + value)
}
}
}
return r.join('&')
}
export var aggregation = (baseClass, ...mixins) => {
class base extends baseClass {
constructor (...args) {
super(...args)
mixins.forEach((Mixin) => {
copyProps(this, (new Mixin(...args)))
})
}
}
const copyProps = (target, source) => {
Object.getOwnPropertyNames(source)
.concat(Object.getOwnPropertySymbols(source))
.forEach((prop) => {
if (!prop.match(/^(?:constructor|prototype|arguments|caller|name|bind|call|apply|toString|length)$/)) {
Object.defineProperty(target, prop, Object.getOwnPropertyDescriptor(source, prop))
}
})
}
mixins.forEach((mixin) => {
copyProps(base.prototype, mixin.prototype)
copyProps(base, mixin)
})
return base
}
export const capitalizeFirstLetter = function (s) {
return s.charAt(0).toUpperCase() + s.slice(1)
}
export const extend = function () {
const extended = {}
let deep = false
let i = 0
const length = arguments.length
if (Object.prototype.toString.call(arguments[0]) === '[object Boolean]') {
deep = arguments[0]
i++
}
const merge = function (obj) {
for (const prop in obj) {
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
// If deep merge and property is an object, merge properties
if (deep && Object.prototype.toString.call(obj[prop]) === '[object Object]') {
extended[prop] = extend(true, extended[prop], obj[prop])
} else {
extended[prop] = obj[prop]
}
}
}
}
for (; i < length; i++) {
const obj = arguments[i]
merge(obj)
}
return extended
}
export const getRandomInt = function (min, max) {
min = Math.ceil(min)
max = Math.floor(max)
return Math.floor(Math.random() * (max - min + 1)) + min
}

View File

@ -1,4 +1,4 @@
load("@pip_modules_external//:requirements.bzl", "requirement")
load("@pip_modules//:requirements.bzl", "requirement")
load("@rules_python//python:defs.bzl", "py_library")
py_library(

View File

@ -4,7 +4,7 @@
- ✅ [`actions`](actions) - shared code for ingesting data from external APIs (LibGen/CrossrefAPI)
- 🛑 `bot` - telegram bot for Summa
- 🛑 `cognitron` - bundled app for IPFS, search server and web frontend
- ✅ [`cognitron`](cognitron) - bundled app for IPFS, search server and web frontend
- 🛑 `hub` - downloading & sending
- ✅ [`ingest`](ingest) - retrieving metadata from external APIs and putting it onto Kafka
- 🛑 `meta_api` - rescoring and merging API for Summa backends
@ -12,7 +12,5 @@
- ✅ [`nlptools`](nlptools) - text routines
- ✅ [`pipe`](pipe) - processing pipeline based on Kafka
- ✅ [`pylon`](pylon) - smart client for downloading files from the Internet/IPFS
- ✅ [`summa`](summa) - scripts for setting Summa
- ✅ [`translations`](translations) - text translations used in `bot` and `hub`
- 🛑 `views` - shared views for [`models`](models)
- 🛑 `web` - web frontend for Summa

View File

@ -1,4 +1,4 @@
load("@pip_modules_external//:requirements.bzl", "requirement")
load("@pip_modules//:requirements.bzl", "requirement")
load("@rules_python//python:defs.bzl", "py_library")
py_library(
@ -18,9 +18,9 @@ py_library(
requirement("aiocrossref"),
requirement("aiolibgen"),
"//library/aiopostgres",
"//nexus/cognitron/schema",
"//nexus/models/proto:models_proto_py",
"//nexus/nlptools",
"//nexus/summa/schema",
requirement("aiosumma"),
],
)

View File

@ -1,7 +1,7 @@
from aiosumma import SummaHttpClient
from nexus.cognitron.schema import coders
from nexus.models.proto.operation_pb2 import \
DocumentOperation as DocumentOperationPb
from nexus.summa.schema import coders
from .base import BaseAction

32
nexus/cognitron/README.md Normal file
View File

@ -0,0 +1,32 @@
# Nexus Cognitron
## Guide
#### 1. Download data dumps
```shell script
export COLLECTION=bafykbzacebzohi352bddfunaub5rgqv5b324nejk5v6fltjh45be5ykw5jsjg
export COLLECTION_PATH=$(realpath $COLLECTION)
ipfs get $COLLECTION
```
#### 2. Launch Nexus Cognitron
```shell script
cd nexus/cognitron
docker-compose up
```
#### 3. (Optional) Deploy data dumps into your database
There is a function `work` in [`traversing script`](installer/scripts/iterate.py)
that you can reimplement to iterate over the whole dataset and insert it into your
own database or do whatever you want in parallel mode.
By default this script is just printing documents.
```shell script
bazel run -c opt installer -- iterate \
--store-filepath scitech.store.tar \
--schema-filepath schema/scitech.yaml
```

View File

@ -5,9 +5,10 @@ http:
keep_alive_secs: 75
max_body_size_mb: 32
workers: 48
log_path: /var/log/summa/{{ ENV_TYPE }}
log_path: /var/log/nexus-cognitron/{{ ENV_TYPE }}
search_engine:
data_path: /summa/20210109
auto_commit: false
data_path: /nexus-cognitron/summa
default_page_size: 5
timeout_secs: 15
writer_memory_mb: 1024

View File

@ -0,0 +1,22 @@
---
services:
nexus-cognitron-web:
depends_on:
- summa
environment:
ENV_TYPE: production
NEXUS_COGNITRON_WEB_IPFS_GATEWAY: https://cloudflare-ipfs.com
NEXUS_COGNITRON_WEB_SEARCH_API: http://localhost:50000
image: thesuperpirate/cognitron-web:latest
ports:
- "3000:80"
summa:
environment:
ENV_TYPE: production
image: izihawa/summa:latest
ports:
- "50000:80"
volumes:
- '${COLLECTION_PATH}:/summa'
version: "3.9"

View File

@ -1,4 +1,4 @@
load("@pip_modules_external//:requirements.bzl", "requirement")
load("@pip_modules//:requirements.bzl", "requirement")
load("@rules_python//python:defs.bzl", "py_binary")
py_binary(
@ -11,7 +11,7 @@ py_binary(
srcs_version = "PY3",
visibility = ["//visibility:public"],
deps = [
requirement("psycopg2-binary"),
requirement("aioipfs"),
requirement("fire"),
requirement("tantipy"),
requirement("izihawa_utils"),

View File

@ -1,13 +1,11 @@
import time
import fire
from nexus.summa.installer.scripts.import_to_summa import import_to_summa
from nexus.summa.installer.scripts.iterate import iterate
from nexus.cognitron.installer.scripts.iterate import iterate
if __name__ == '__main__':
start = time.time()
fire.Fire({
'import-to-summa': import_to_summa,
'iterate': iterate,
})
print(f'Elapsed {time.time() - start:.2f} secs')

View File

@ -0,0 +1,46 @@
import glob
import multiprocessing
import os
from functools import partial
import yaml
from izihawa_utils.itertools import ichunks
from tantipy import (
TantivyCoder,
TantivyReader,
)
from .common import resolve_path
def work(document):
# ToDo: Replace this function to what you want to do with document
print(document)
def _do_work(coder, chunk_size, limit, store_filepath):
with open(store_filepath, 'rb') as file:
data = file.read()
print(f'Processing segment {store_filepath}, size: {len(data) / (1024 * 1024):.2f} Mb ...')
tr = TantivyReader(data, coder=coder)
for chunk_num, documents in enumerate(ichunks(tr.documents(), chunk_size)):
for doc_num, document in enumerate(documents):
if limit and chunk_num * chunk_size + doc_num > limit:
print(f'Segment {store_filepath} early terminated due to limits')
return
work(document)
print(f'Segment {store_filepath} successfully processed')
def iterate(data_filepath, schema_filepath, processes=8, chunk_size=100, limit=1):
data_filepath = resolve_path(data_filepath)
schema_filepath = resolve_path(schema_filepath)
with open(schema_filepath) as schema_file:
coder = TantivyCoder(yaml.safe_load(schema_file.read()))
store_filepaths = glob.glob(os.path.join(data_filepath, '*.store'))
print(f'Total segments: {len(store_filepaths)}')
pool = multiprocessing.Pool(processes)
pool.map(partial(_do_work, coder, chunk_size, limit), store_filepaths)

View File

@ -1,4 +1,4 @@
load("@pip_modules_external//:requirements.bzl", "requirement")
load("@pip_modules//:requirements.bzl", "requirement")
load("@rules_python//python:defs.bzl", "py_library")
exports_files([

View File

@ -1,5 +1,5 @@
import yaml
from tantipy import TantivyCoder
with open('nexus/summa/schema/scimag.yaml') as file:
with open('nexus/cognitron/schema/scimag.yaml') as file:
scimag_coder = TantivyCoder(yaml.safe_load(file.read()))

View File

@ -1,5 +1,5 @@
import yaml
from tantipy import TantivyCoder
with open('nexus/summa/schema/scitech.yaml') as file:
with open('nexus/cognitron/schema/scitech.yaml') as file:
scitech_coder = TantivyCoder(yaml.safe_load(file.read()))

View File

@ -0,0 +1,93 @@
load("@io_bazel_rules_docker//container:container.bzl", "container_push")
load("@io_bazel_rules_docker//nodejs:image.bzl", "nodejs_image")
load("@npm//nuxt:index.bzl", "nuxt")
load("//rules/nodejs:common.bzl", "js_library")
deps = [
"@npm//@nuxtjs/axios",
"@npm//bootstrap",
"@npm//bootstrap-vue",
"@npm//core-js",
"@npm//dateformat",
"@npm//pug",
"@npm//pug-plain-loader",
"@npm//sass",
"@npm//sass-loader",
"@npm//vue",
]
js_library(
name = "nuxt-srcs",
srcs = ["nuxt.config.js"] + glob([
"assets/**",
"components/**/*.vue",
"layouts/*.vue",
"middleware/*.js",
"pages/**/*.vue",
"plugins/*.js",
"static/*",
"store/*.js",
]),
data = [
"//nexus/cognitron/web/client",
],
)
nuxt(
name = "web_dev",
args = [
"-c",
"nexus/cognitron/web/nuxt.config.js",
],
data = [":nuxt-srcs"] + deps,
)
nuxt(
name = ".nuxt",
args = [
"build",
"--standalone",
"-c",
"nexus/cognitron/web/nuxt.config.js",
"--buildDir=$(@D)",
],
data = [":nuxt-srcs"] + deps,
output_dir = True,
)
nodejs_image(
name = "image",
base = "//images/production:base-nodejs-image",
data = glob(["static/*"]) + [
"nuxt.config.js",
":.nuxt",
"@npm//@nuxtjs/axios",
"@npm//bootstrap-vue",
"@npm//nuxt",
],
entry_point = "@npm//:node_modules/nuxt/bin/nuxt.js",
templated_args = [
"start",
"-c",
"nexus/cognitron/web/nuxt.config.js",
],
)
container_push(
name = "push-public-latest",
format = "Docker",
image = ":image",
registry = "registry.hub.docker.com",
repository = "thesuperpirate/cognitron-web",
tag = "latest",
)
container_push(
name = "push-public-testing",
format = "Docker",
image = ":image",
registry = "registry.hub.docker.com",
repository = "thesuperpirate/cognitron-web",
tag = "testing",
)

View File

@ -0,0 +1 @@
# Nexus Web

View File

@ -0,0 +1,41 @@
.btn {
border-radius: 0 !important; // sass-lint:disable-line no-important
padding: 0 2em !important; // sass-lint:disable-line no-important
}
.pagination {
li {
padding-left: 0 !important; // sass-lint:disable-line no-important
&::after {
content: none;
}
}
}
$primary: #1a95e0;
@import 'bootstrap/scss/bootstrap';
body {
font-size: 13px !important; // sass-lint:disable-line no-important
line-height: 1.3em !important; // sass-lint:disable-line no-important
}
html {
overflow-y: scroll;
}
a {
&:hover {
text-decoration: none;
}
}
.radio-group {
label {
span {
line-height: 2em;
}
}
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,11 @@
load("//rules/nodejs:common.bzl", "js_library")
js_library(
name = "client",
srcs = glob(["*.js"]),
data = [
"//library/js:base-client",
"//library/js:utils",
],
visibility = ["//visibility:public"],
)

View File

@ -0,0 +1,11 @@
export default class SummaApi {
constructor (client) {
this.client = client
}
async search (schema, text, page, item_per_page = 5) {
return await this.client.search(schema, text, page, item_per_page).then(response => {
return response
})
}
}

View File

@ -0,0 +1,18 @@
export default class HttpClient {
search (schema, text, page, itemsPerPage) {
const params = new URLSearchParams()
params.append('query', text)
if (page) {
params.append('page', page)
}
if (itemsPerPage) {
params.append('page_size', itemsPerPage)
}
const url = '/v1/' + schema + '/search/?' + params
return this.nativeClient.request({
method: 'get',
url: url,
cache: false
})
}
}

View File

@ -0,0 +1,7 @@
import { aggregation } from '~/library/js/utils'
import BaseClient from '~/library/js/base-client'
import HttpClient from './http-client'
export default class Client extends aggregation(
BaseClient, HttpClient
) {}

View File

@ -0,0 +1,49 @@
<template lang="pug">
div.document
v-scimag(v-if="schema === 'scimag' && document", :document="document")
v-scitech(v-if="schema === 'scitech' && document", :document="document")
</template>
<script>
export default {
name: 'Document',
props: {
document: {
type: Object,
required: true
},
schema: {
required: true
},
}
}
</script>
<style lang="scss">
.document {
.top {
display: flex;
justify-content: space-between;
h6 {
margin-right: 10px;
margin-bottom: 0;
}
img {
max-height: 200px;
max-width: 200px;
object-fit: contain;
width: auto;
}
}
padding: 30px 0;
table {
font-size: 12px;
tr {
word-break: break-all;
}
th {
white-space: nowrap;
}
}
}
</style>

View File

@ -0,0 +1,92 @@
<template lang="pug">
div.d-flex
div
nuxt-link(:to="link") {{ document.title }}
.detail
div
i.mr-1(v-if='document.doi') DOI:
span {{ document.doi }}
div(v-if='authors')
span {{ authors }} {{ issuedAt }}
.gp
span.el.text-uppercase(v-if="document.extension") {{ document.extension }}
span.el.text-uppercase(v-if="document.language") {{ document.language }}
span.el.text-uppercase(v-if="filesize") {{ filesize }}
span.el(v-if="document.pages")
span.mr-2 {{ document.pages }}
span pages
img(:src="coverUrl" alt="" onerror="this.style.display='none'")
</template>
<script>
import { getCoverUrl, getFirstAuthors, getIssuedDate, getMegabytes } from '@/plugins/helpers'
export default {
name: 'SearchItem',
props: {
scoredDocument: {
type: Object,
required: true
}
},
computed: {
authors: function () {
return getFirstAuthors(this.document.authors, false, 3)
},
coverUrl: function () {
return getCoverUrl(this.document.cu, this.document.fictionId, this.document.libgenId, this.document.cuSuf, this.document.md5)
},
document: function () {
return this.scoredDocument.document
},
issuedAt: function () {
const date = getIssuedDate(this.document.issuedAt)
if (date != null) return '(' + date + ')'
return null
},
filesize: function () {
return getMegabytes(this.document.filesize)
},
link: function () {
return `/documents/id:${this.document.id}?schema=${this.scoredDocument.schema}`
}
}
}
</script>
<style scoped lang="scss">
.el {
display: block;
line-height: 1em;
margin-right: 10px;
padding-right: 10px;
border-right: 1px solid;
&:last-child {
border-right: 0;
}
}
img {
margin-left: 15px;
max-width: 48px;
max-height: 48px;
object-fit: contain;
width: auto;
}
.key {
font-weight: bold;
}
.gp {
margin-top: 2px;
display: flex;
}
.detail {
font-size: 12px;
}
i {
text-transform: uppercase;
}
</style>

View File

@ -0,0 +1,29 @@
<template lang="pug">
ul
li(v-for='scoredDocument in scoredDocuments')
search-item(:scored-document='scoredDocument', :key='scoredDocument.document.id')
</template>
<script>
import SearchItem from '@/components/search-item'
export default {
name: 'SearchList',
components: { SearchItem },
props: {
scoredDocuments: {
type: Array,
required: true
}
}
}
</script>
<style scoped lang="scss">
li {
padding-bottom: 15px;
padding-left: 0;
&:after {
content: none;
}
}
</style>

View File

@ -0,0 +1,23 @@
<template lang="pug">
nav.navbar.navbar-light.bg-light
b-container
nuxt-link(to="/" title="Go to search!").logo
| > Nexus Search
</template>
<script>
export default {
name: 'VHeader',
data () {
return {
search: ''
}
}
}
</script>
<style scoped lang="scss">
a {
padding: 5px 0;
}
</style>

View File

@ -0,0 +1,94 @@
<template lang="pug">
div
.top
h6 {{document.title}}
table
tbody
v-tr(label="Author", :value="authors")
v-tr(label="Issued At", :value="issuedAt")
v-tr(label="Issue", :value="document.issue")
v-tr(label="Volume", :value="document.volume")
v-tr(label="Page", :value="page")
v-tr(label="Pages", :value="pages")
v-tr(label="Container Title", :value="document.containerTitle")
v-tr(label="Language", :value="document.language", value-classes="text-uppercase")
v-tr(label="DOI", :value="document.doi")
v-tr(label="Description", :value="document.abstract", @max-length=300)
v-tr(label="Tags", :value="tags")
v-tr(label="ISSNS", :value="issns")
v-tr(label="ISBNS", :value="isbns")
v-tr-link(label="Download link", v-if="ipfsMultihash" :value="filename", :url="ipfsUrl")
</template>
<script>
import { getFirstAuthors, getIssuedDate } from '@/plugins/helpers'
import { getFilename } from '@/plugins/scimag-helpers'
import VTr from './v-tr'
import VTrLink from './v-tr-link'
export default {
name: 'VScimag',
components: { VTrLink, VTr },
props: {
document: {
type: Object,
required: true
}
},
computed: {
authors: function () {
return getFirstAuthors(this.document.authors, false, 3)
},
pages: function () {
if (this.document.firstPage && this.document.lastPage && this.document.firstPage !== this.document.lastPage) {
return `${this.document.firstPage}-${this.document.lastPage}`
}
return null
},
page: function () {
if (this.document.firstPage) {
if (this.document.lastPage) {
if (this.document.firstPage === this.document.lastPage) {
return this.document.firstPage
}
} else {
return this.document.firstPage
}
} else if (this.document.lastPage) {
return this.document.lastPage
}
return null
},
filename: function () {
try {
return getFilename(this.document.authors, this.document.title, this.document.doi, this.document.issuedAt)
} catch (e) {
console.error(e)
return `file_${this.document.id}.pdf`
}
},
issns: function () {
return (this.document.issns || []).join('; ')
},
isbns: function () {
return (this.document.isbns || []).join('; ')
},
issuedAt: function () {
return getIssuedDate(this.document.issuedAt)
},
ipfsUrl: function () {
if (!this.ipfsMultihash) return null
return `${this.$config.ipfsGateway}/ipfs/${this.ipfsMultihash}?filename=${this.filename}`
},
ipfsMultihash: function () {
if (this.document.ipfsMultihashes) {
return this.document.ipfsMultihashes[0]
}
return null
},
tags: function () {
return (this.document.tags || []).join('; ')
}
}
}
</script>

View File

@ -0,0 +1,80 @@
<template lang="pug">
div.document
.top
h6 {{document.title}}
img(:src="coverUrl" alt="" onerror="this.style.display='none'")
table
tbody
v-tr(label="Author", :value="authors")
v-tr(label="Issued At", :value="issuedAt")
v-tr(label="Extension", :value="document.extension", value-classes="text-uppercase")
v-tr(label="Filesize", :value="filesize")
v-tr(label="Pages", :value="document.pages")
v-tr(label="Language", :value="document.language", value-classes="text-uppercase")
v-tr(label="DOI", :value="document.doi")
v-tr(label="Description", :value="document.description", @max-length=300)
v-tr(label="Tags", :value="tags")
v-tr(label="ISBNS", :value="isbns")
v-tr(label="ISSNS", :value="issns")
v-tr(label="MD5", :value="document.md5")
v-tr-link(label="Download link", v-if="ipfsMultihash" :value="filename", :url="ipfsUrl")
</template>
<script>
import { getCoverUrl, getFirstAuthors, getIssuedDate, getMegabytes } from '@/plugins/helpers'
import { getFilename } from '@/plugins/scitech-helpers'
export default {
name: 'VScitech',
props: {
document: {
type: Object,
required: true
}
},
computed: {
authors: function () {
return getFirstAuthors(this.document.authors, false, 3)
},
coverUrl: function () {
return getCoverUrl(this.document.cu, this.document.fictionId,
this.document.libgenId,
this.document.cuSuf,
this.document.md5)
},
filesize: function () {
return getMegabytes(this.document.filesize)
},
filename: function () {
try {
return getFilename(this.document.authors, this.document.title, this.document.doi,
this.document.issuedAt, this.document.md5, this.document.extension)
} catch (e) {
console.error(e)
return `file_${this.document.id}.${this.document.extension}`
}
},
isbns: function () {
return (this.document.isbns || []).join('; ')
},
issns: function () {
return (this.document.issns || []).join('; ')
},
issuedAt: function () {
return getIssuedDate(this.document.issuedAt)
},
ipfsUrl: function () {
if (!this.ipfsMultihash) return null
return `${this.$config.ipfsGateway}/ipfs/${this.ipfsMultihash}?filename=${this.filename}`
},
ipfsMultihash: function () {
if (this.document.ipfsMultihashes) {
return this.document.ipfsMultihashes[0]
}
return null
},
tags: function () {
return (this.document.tags || []).join('; ')
}
}
}
</script>

View File

@ -0,0 +1,42 @@
<template lang="pug">
tr(v-if="value")
th {{ label }}
td
a(:href="url" download) {{ value }}
</template>
<script>
export default {
name: 'VTrLink',
props: {
value: {
default: null,
required: true,
type: String
},
url: {
required: true,
type: String
},
label: {
required: true,
type: String
}
},
data () {
return {
showAll: false
}
}
}
</script>
<style scoped lang="scss">
tr {
word-break: break-all;
}
th {
white-space: nowrap;
}
</style>

View File

@ -0,0 +1,62 @@
<template lang="pug">
tr(v-if="value")
th {{label}}
td(:class="valueClasses")
| {{formattedValue}}
cite
a(href="javascript:void(null);" @click="showMore" v-if="collapseText") show more...
</template>
<script>
export default {
name: 'VTr',
props: {
label: {
type: String,
required: true
},
valueClasses: {
type: String,
required: false
},
value: {
required: true,
default: null
},
maxLength: {
type: Number,
default: 300
}
},
data () {
return {
showAll: false
}
},
computed: {
collapseText () {
return this.value.length > this.maxLength && !this.showAll
},
formattedValue () {
if (this.value) {
if (this.collapseText) {
return this.value.substr(0, this.maxLength)
} else {
return this.value
}
}
return null
}
},
methods: {
showMore () {
this.showAll = true
}
}
}
</script>
<style scoped lang="scss">
</style>

View File

@ -0,0 +1,6 @@
<template lang="pug">
div
v-header
b-container.mt-3
nuxt
</template>

View File

@ -0,0 +1,76 @@
let buildDir = process.argv.find((s) => s.startsWith('--buildDir='))
if (buildDir) {
buildDir = buildDir.substr('--buildDir='.length)
} else {
buildDir = 'nexus/cognitron/web/.nuxt'
}
export default {
server: {
host: '0.0.0.0',
port: 80
},
buildDir: buildDir,
srcDir: 'nexus/cognitron/web',
modulesDir: ['external/' + process.env.BAZEL_NODE_MODULES_ROOT],
head: {
title: 'Nexus Cognitron',
meta: [
{ charset: 'utf-8' },
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
{ hid: 'description', name: 'description', content: 'Biggest Library on both Earth and Mars' }
],
link: [
{ rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' },
{ rel: 'apple-touch-icon', sizes: '180x180', href: '/apple-touch-icon.png' },
{ rel: 'icon', type: 'image/png', sizes: '32x32', href: '/favicon-32x32.png' },
{ rel: 'icon', type: 'image/png', sizes: '16x16', href: '/favicon-16x16.png' },
{ rel: 'manifest', href: '/site.webmanifest' },
{ rel: 'mask-icon', href: '/safari-pinned-tab.svg', color: '#5bbad5' },
{ name: 'msapplication-TileColor', content: '#603cba' },
{ name: 'theme-color', content: '#ffffff' }
]
},
// Global CSS (https://go.nuxtjs.dev/config-css)
css: [
'@/assets/css/app.scss',
'@/assets/css/terminal.css'
],
publicRuntimeConfig: {
ipfsGateway: process.env.NEXUS_COGNITRON_WEB_IPFS_GATEWAY || 'http://localhost:8080',
searchApi: process.env.NEXUS_COGNITRON_WEB_SEARCH_API || 'http://localhost:50000'
},
// Plugins to run before rendering page (https://go.nuxtjs.dev/config-plugins)
plugins: [
'plugins/helpers',
'plugins/search-api',
'plugins/scimag-helpers',
'plugins/scitech-helpers',
'plugins/utils'
],
// Auto import components (https://go.nuxtjs.dev/config-components)
components: true,
// Modules for dev and build (recommended) (https://go.nuxtjs.dev/config-modules)
buildModules: [],
// Modules (https://go.nuxtjs.dev/config-modules)
modules: [
'@nuxtjs/axios',
// https://go.nuxtjs.dev/bootstrap
'bootstrap-vue/nuxt'
],
loading: { color: '#1a95e0', throttle: 0 },
// Build Configuration (https://go.nuxtjs.dev/config-build)
build: {
extend (config) {
config.resolve.alias['~'] = process.cwd()
}
}
}

View File

@ -0,0 +1,41 @@
<template>
<div>
<document
v-if="document"
:document="document"
:schema="schema"
/>
</div>
</template>
<script>
export default {
name: 'Key',
data () {
return {
document: {},
schema: null
}
},
async fetch () {
await this.$search_api.search(this.$route.query.schema, this.$route.params.key).then(response => {
if (response.scoredDocuments.length === 0) {
this.$nuxt.error(404)
}
if (response.scoredDocuments.length > 1) {
this.$nuxt.error(500)
}
this.document = response.scoredDocuments[0].document
this.schema = this.$route.query.schema
}).catch(e => {
console.error(e)
this.$nuxt.error(e.statusCode)
})
},
fetchOnServer: false
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,107 @@
<template lang="pug">
div
form
.input-group
b-form-input(v-model='search' placeholder='Enter book name or DOI')
b-button(type='submit' @click.stop.prevent='submit(search, 1, schema)') Search
b-form-radio-group(
v-model="schema"
:options="schemas"
class="radio-group"
value-field="item"
text-field="name")
p.mt-5(v-if="nothingFound") Nothing found
b-pagination(v-if='scoredDocuments.length > 0' v-model='page' :total-rows='totalRows' :per-page='perPage' limit="2" :disabled="isLoading")
.search_list
search-list(:scored-documents='scoredDocuments')
b-pagination(v-if='scoredDocuments.length > 0' v-model='page' :total-rows='totalRows' :per-page='perPage' limit="2" :disabled="isLoading")
</template>
<script>
import SearchList from '@/components/search-list'
export default {
name: 'Index',
components: { SearchList },
loading: true,
data () {
return {
search: '',
scoredDocuments: [],
defaultSchema: 'scitech',
schema: 'scitech',
schemas: [
{ item: 'scitech', name: 'Scitech' }
// { item: 'scimag', name: 'Scimag' }
],
page: 1,
totalRows: 10,
perPage: 1,
nothingFound: false
}
},
async fetch () {
this.search = this.$route.query.search
if (!this.search) {
await this.$router.push({ path: '/' })
this.scoredDocuments = []
this.nothingFound = false
return
}
this.page = this.$route.query.page
this.schema = this.$route.query.schema || this.defaultSchema
let scoredDocuments = []
if (!process.server) {
this.$nuxt.$loading.start()
}
await this.$search_api.search(this.schema, this.search, this.page, 5).then(response => {
if (!response.hasNext) {
this.totalRows = this.page
} else {
this.totalRows = Number(this.page) + 1
}
scoredDocuments = response.scoredDocuments
}).catch(e => {
console.error(e)
this.$nuxt.error(500)
})
this.scoredDocuments = scoredDocuments
this.nothingFound = (!scoredDocuments.length > 0)
if (!process.server) {
this.$nuxt.$loading.finish()
}
},
fetchOnServer: false,
computed: {
isLoading () {
return this.$fetchState.pending || false
}
},
watch: {
'$route.query': '$fetch',
schema () {
if (this.search) {
this.submit(this.search, this.page, this.schema)
}
},
page () {
this.submit(this.search, this.page, this.schema)
}
},
methods: {
submit (search, page, schema) {
this.$router.push({ path: '/', query: { search: search, page: page, schema: schema } })
}
}
}
</script>
<style scoped>
.search_list {
padding-top: 15px;
padding-bottom: 15px;
}
.radio-group {
margin: 10px 0;
}
</style>

View File

@ -0,0 +1,70 @@
import dateFormat from 'dateformat'
export function getFirstAuthors (authors, etAl = true, firstNAuthors = 1) {
let etAlSuffix = ''
if (etAl) {
etAlSuffix = ' et al'
}
if (authors) {
if (authors.length > firstNAuthors) {
return authors.slice(0, firstNAuthors).join(';') + etAlSuffix
} else if (authors.length === 1) {
if (authors[0].split(';').length - 1 >= 1) {
const commaAuthors = authors[0].split(';').map(function (el) {
return el.trim()
})
if (commaAuthors.length > firstNAuthors) {
return (commaAuthors.slice(0, firstNAuthors)).join('; ') + etAlSuffix
} else {
return commaAuthors.join('; ')
}
}
return authors[0]
} else {
return authors.join('; ')
}
} else {
return ''
}
}
export function getMegabytes (bytes) {
try {
if (bytes) {
return (bytes / (1024 * 1024)).toFixed(2) + ' Mb'
}
} catch {
return null
}
}
export function getIssuedDate (unixtime) {
if (!unixtime) return null
try {
return dateFormat(new Date(unixtime * 1000), 'yyyy')
} catch (e) {
console.error(e)
return null
}
}
export function getCoverUrl (cu, fictionId, libgenId, cuSuf, md5) {
if (cu) return cu
let r = ''
if (libgenId || fictionId) {
if (libgenId) {
const bulkId = (libgenId - (libgenId % 1000))
r = `covers/${bulkId}/${md5}`
} else if (fictionId) {
const bulkId = (fictionId - (fictionId % 1000))
r = `fictioncovers/${bulkId}/${md5}`
} else {
return null
}
}
if (cuSuf) {
r = r + `-${cuSuf}`
return `http://gen.lib.rus.ec/${r}.jpg`
}
return null
}

View File

@ -0,0 +1,59 @@
import { castStringToSingleString, quoteUrl } from './utils'
import { getIssuedDate } from './helpers'
export function getFilename (authors, title, doi, issuedDate) {
const limit = 55
let processedAuthor = ''
if (authors) {
processedAuthor = authors[0]
}
processedAuthor = castStringToSingleString((processedAuthor || '').toLowerCase())
const processedTitle = castStringToSingleString((title || '').toLowerCase())
const parts = []
if (processedAuthor) {
parts.push(processedAuthor)
}
if (processedTitle) {
parts.push(processedTitle)
}
let filename = parts.join('-')
const chars = []
let size = 0
let hitLimit = false
for (const c of filename) {
const currentSize = size + c.length
if (currentSize > limit) {
hitLimit = true
break
}
chars.push(c)
size = currentSize
}
filename = chars.join('')
if (hitLimit) {
const glyph = filename.lastIndexOf('-')
if (glyph !== -1) {
filename = filename.substr(0, glyph)
}
}
if (!filename) {
filename = quoteUrl(doi, '').substr(0, limit)
}
const year = getIssuedDate(issuedDate)
if (year) {
filename = `${filename}-${year}`
}
filename = filename.replace(/-+/g, '-')
return `${filename}.pdf`
}

View File

@ -0,0 +1,68 @@
import { castStringToSingleString, escapeFormat, quoteUrl } from './utils'
import { getFirstAuthors, getIssuedDate } from './helpers'
function getRobustTitle (title, volume) {
if (volume) {
if (title) {
title = `${title} ${volume}`
} else {
title = volume
}
}
return escapeFormat(title)
}
export function getFilename (authors, title, doi, issuedDate, md5, extension) {
const limit = 55
const processedAuthor = castStringToSingleString((getFirstAuthors(authors, false, 1)).toLowerCase())
const processedTitle = castStringToSingleString(getRobustTitle(title)).toLowerCase()
const parts = []
if (processedAuthor) {
parts.push(processedAuthor)
}
if (processedTitle) {
parts.push(processedTitle)
}
let filename = parts.join('-')
const chars = []
let size = 0
let hitLimit = false
for (const c of filename) {
const currentSize = size + c.length
if (currentSize > limit) {
hitLimit = true
break
}
chars.push(c)
size = currentSize
}
filename = chars.join('')
if (hitLimit) {
const glyph = filename.lastIndexOf('-')
if (glyph !== -1) {
filename = filename.substr(0, glyph)
}
}
if (!filename) {
if (doi) {
filename = quoteUrl(doi, '')
} else {
filename = md5
}
}
const year = getIssuedDate(issuedDate)
if (year) {
filename = `${filename}-${year}`
}
filename = filename.replace(/-+/g, '-')
return `${filename}.${extension}`
}

View File

@ -0,0 +1,16 @@
import HttpClient from '~/nexus/cognitron/web/client/index'
import SummaApi from '~/nexus/cognitron/web/client/api'
export default ({ $config }, inject) => {
const summaApi = new SummaApi(
new HttpClient({
baseUrl: $config.searchApi,
headers: () => {
return {
Accept: 'application/json'
}
}
})
)
inject('search_api', summaApi)
}

View File

@ -0,0 +1,32 @@
const ALNUMWHITESPACE_REGEX = /\P{L}/gu
const MULTIWHITESPACE_REGEX = /\s+/g
export function castStringToSingleString (s) {
let processed = s.replace(ALNUMWHITESPACE_REGEX, ' ')
processed = processed.replace(MULTIWHITESPACE_REGEX, '-')
return processed
}
export function escapeFormat (text) {
return text.replace(/_+/g, '_')
.replace(/\*+/g, '*')
.replace(/`+/g, "'")
.replace(/\[+/g, '`[`')
.replace(/]+/g, '`]`')
}
export function quoteUrl (url, safe) {
if (typeof (safe) !== 'string') {
safe = '/'
}
url = encodeURIComponent(url)
const toUnencode = []
for (let i = safe.length - 1; i >= 0; --i) {
const encoded = encodeURIComponent(safe[i])
if (encoded !== safe.charAt(i)) {
toUnencode.push(encoded)
}
}
url = url.replace(new RegExp(toUnencode.join('|'), 'ig'), decodeURIComponent)
return url
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 367 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<browserconfig>
<msapplication>
<tile>
<square150x150logo src="/mstile-150x150.png"/>
<TileColor>#603cba</TileColor>
</tile>
</msapplication>
</browserconfig>

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

View File

@ -0,0 +1,932 @@
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
width="640.000000pt" height="640.000000pt" viewBox="0 0 640.000000 640.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.11, written by Peter Selinger 2001-2013
</metadata>
<g transform="translate(0.000000,640.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M2 6365 c0 -23 4 -35 12 -32 6 2 10 12 8 22 -3 13 1 16 14 11 10 -4
21 0 28 9 8 11 15 12 26 4 11 -8 12 -12 3 -16 -25 -10 -12 -21 22 -20 33 1 52
17 20 17 -8 0 -15 5 -15 10 0 6 6 10 13 8 7 -2 15 2 17 7 3 6 -25 11 -71 13
l-77 3 0 -36z"/>
<path d="M6364 6385 c25 -19 36 -19 36 0 0 10 -10 15 -27 15 -27 -1 -27 -1 -9
-15z"/>
<path d="M200 6381 c0 -5 -8 -8 -17 -7 -13 1 -19 -7 -21 -26 -5 -42 41 -35 50
7 2 11 10 19 16 18 7 -2 12 2 12 7 0 6 -9 10 -20 10 -11 0 -20 -4 -20 -9z"/>
<path d="M6245 6381 c-3 -5 -1 -12 5 -16 5 -3 10 -16 10 -28 1 -20 2 -21 14
-4 7 9 16 17 20 17 3 0 6 -8 7 -17 0 -15 2 -15 9 2 5 11 9 29 9 40 0 19 0 19
-10 2 -10 -17 -13 -17 -34 -3 -13 9 -26 12 -30 7z"/>
<path d="M43 6320 c1 -20 8 -25 20 -14 7 8 -3 34 -13 34 -5 0 -8 -9 -7 -20z"/>
<path d="M0 6290 c0 -14 6 -20 23 -19 16 1 17 3 5 6 -10 2 -15 10 -11 19 3 8
0 14 -6 14 -6 0 -11 -9 -11 -20z"/>
<path d="M6270 6289 c0 -5 5 -7 10 -4 6 3 10 8 10 11 0 2 -4 4 -10 4 -5 0 -10
-5 -10 -11z"/>
<path d="M338 6233 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M10 6213 c0 -13 5 -23 10 -23 13 0 13 11 0 30 -8 12 -10 11 -10 -7z"/>
<path d="M40 6170 c0 -5 5 -10 11 -10 5 0 7 5 4 10 -3 6 -8 10 -11 10 -2 0 -4
-4 -4 -10z"/>
<path d="M0 6149 c0 -5 5 -7 10 -4 5 3 10 8 10 11 0 2 -4 4 -10 4 -5 0 -10 -5
-10 -11z"/>
<path d="M6310 6079 c0 -5 5 -7 10 -4 6 3 10 8 10 11 0 2 -4 4 -10 4 -5 0 -10
-5 -10 -11z"/>
<path d="M6375 6070 c4 -6 11 -8 16 -5 14 9 11 15 -7 15 -8 0 -12 -5 -9 -10z"/>
<path d="M6271 5854 c0 -11 3 -14 6 -6 3 7 2 16 -1 19 -3 4 -6 -2 -5 -13z"/>
<path d="M6040 5789 c0 -5 5 -7 10 -4 6 3 10 8 10 11 0 2 -4 4 -10 4 -5 0 -10
-5 -10 -11z"/>
<path d="M5070 5749 c0 -5 5 -7 10 -4 6 3 10 8 10 11 0 2 -4 4 -10 4 -5 0 -10
-5 -10 -11z"/>
<path d="M5240 5740 c0 -5 5 -10 10 -10 6 0 10 5 10 10 0 6 -4 10 -10 10 -5 0
-10 -4 -10 -10z"/>
<path d="M3170 5705 c0 -11 11 -15 37 -15 35 0 36 1 17 15 -25 19 -54 19 -54
0z"/>
<path d="M3068 5693 c17 -2 47 -2 65 0 17 2 3 4 -33 4 -36 0 -50 -2 -32 -4z"/>
<path d="M3285 5690 c22 -5 65 -9 95 -9 49 -1 264 -33 315 -47 11 -3 28 -8 38
-10 9 -3 17 -1 17 4 0 18 -251 59 -405 66 -73 4 -89 3 -60 -4z"/>
<path d="M2948 5683 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M3884 5589 c32 -11 63 -18 70 -16 13 5 -89 37 -113 36 -9 0 10 -9 43
-20z"/>
<path d="M2390 5570 c-9 -6 -10 -10 -3 -10 6 0 15 5 18 10 8 12 4 12 -15 0z"/>
<path d="M3970 5566 c0 -2 9 -6 20 -9 11 -3 18 -1 14 4 -5 9 -34 13 -34 5z"/>
<path d="M4030 5547 c0 -7 141 -59 146 -54 3 2 -27 16 -66 31 -72 26 -80 29
-80 23z"/>
<path d="M2290 5530 c-8 -5 -10 -10 -5 -10 6 0 17 5 25 10 8 5 11 10 5 10 -5
0 -17 -5 -25 -10z"/>
<path d="M4340 5399 c80 -45 173 -101 208 -125 35 -24 66 -44 70 -44 8 0 -60
59 -69 60 -4 0 -37 21 -75 46 -65 43 -254 144 -271 144 -5 0 57 -37 137 -81z"/>
<path d="M4700 5380 c0 -5 5 -10 10 -10 6 0 10 5 10 10 0 6 -4 10 -10 10 -5 0
-10 -4 -10 -10z"/>
<path d="M1835 5290 c-3 -5 -2 -10 4 -10 6 0 50 -33 98 -73 48 -40 98 -80 110
-88 12 -9 45 -36 73 -62 28 -26 56 -47 63 -47 7 0 6 -4 -3 -10 -13 -8 -13 -10
1 -10 9 0 22 -7 29 -15 7 -8 16 -12 21 -9 5 3 -28 37 -73 77 -133 117 -144
127 -125 121 9 -3 17 -1 17 5 0 6 -5 11 -10 11 -6 0 -20 9 -32 20 -12 11 -27
20 -32 19 -6 0 -5 -3 2 -6 6 -2 12 -9 12 -15 0 -6 -6 -6 -15 2 -8 7 -15 18
-15 26 0 7 -10 16 -22 20 -13 4 -34 17 -47 30 -25 25 -46 30 -56 14z"/>
<path d="M4636 5216 c3 -9 14 -18 23 -21 10 -3 31 -18 47 -33 16 -15 38 -33
49 -41 11 -7 -5 10 -35 38 -64 60 -93 79 -84 57z"/>
<path d="M2065 5140 c3 -5 8 -10 11 -10 2 0 4 5 4 10 0 6 -5 10 -11 10 -5 0
-7 -4 -4 -10z"/>
<path d="M2138 5087 c79 -71 202 -169 196 -155 -3 7 -39 40 -81 73 -41 33 -91
75 -111 92 -20 18 -40 33 -44 33 -4 0 14 -19 40 -43z"/>
<path d="M4780 5109 c0 -2 48 -51 107 -109 60 -58 96 -89 82 -70 -23 31 -189
188 -189 179z"/>
<path d="M2250 4951 c0 -5 5 -13 10 -16 6 -3 10 -2 10 4 0 5 -4 13 -10 16 -5
3 -10 2 -10 -4z"/>
<path d="M2375 4890 c3 -5 8 -10 11 -10 2 0 4 5 4 10 0 6 -5 10 -11 10 -5 0
-7 -4 -4 -10z"/>
<path d="M2400 4873 c0 -5 13 -17 28 -27 l27 -19 -24 26 c-26 28 -31 32 -31
20z"/>
<path d="M2477 4809 c12 -12 24 -21 27 -18 2 2 -8 13 -22 23 l-27 19 22 -24z"/>
<path d="M2495 4730 c10 -11 20 -20 23 -20 3 0 -3 9 -13 20 -10 11 -20 20 -23
20 -3 0 3 -9 13 -20z"/>
<path d="M1206 4694 c-5 -14 -4 -15 9 -4 17 14 19 20 6 20 -5 0 -12 -7 -15
-16z"/>
<path d="M2595 4628 c39 -39 82 -84 97 -99 15 -14 24 -29 21 -33 -3 -3 -1 -6
5 -6 7 0 12 -4 12 -10 0 -5 -19 -11 -42 -12 -40 -1 -40 -1 -8 -5 19 -2 45 -6
56 -8 22 -5 57 -49 57 -72 0 -7 4 -10 8 -7 11 6 56 -94 65 -146 11 -65 13
-171 3 -197 -4 -12 -11 -44 -14 -70 -3 -26 -15 -81 -27 -120 -19 -65 -25 -73
-47 -74 -14 -1 -30 -1 -35 0 -4 1 -14 -3 -21 -9 -12 -10 -71 -4 -90 10 -5 4
-30 10 -55 13 -58 7 -80 16 -80 33 0 18 -37 36 -60 29 -10 -3 -33 1 -50 10
-16 8 -30 11 -30 6 0 -13 47 -41 70 -41 11 0 20 -4 20 -10 0 -24 -85 -1 -106
29 -9 12 -22 16 -43 13 -16 -2 -37 1 -48 8 -15 9 -13 10 16 6 l33 -6 -23 21
-24 21 22 -5 c13 -3 26 -1 29 4 5 9 -15 13 -50 9 -10 -1 -15 3 -12 8 3 5 -6
13 -22 17 -15 3 -41 17 -59 31 -17 13 -38 21 -46 18 -8 -3 -18 -1 -22 5 -3 6
-16 11 -28 11 -22 0 -22 -1 3 -21 l25 -20 -32 15 c-78 39 -49 6 37 -40 38 -21
68 -39 66 -41 -3 -3 -101 41 -126 57 -16 10 -284 99 -371 124 -30 8 -94 26
-144 41 -107 31 -225 45 -208 23 6 -7 12 -16 12 -20 3 -22 114 -133 136 -136
16 -2 14 2 -10 21 -55 45 -71 62 -78 80 -8 22 -6 22 130 -9 63 -14 120 -23
126 -21 7 2 -19 11 -58 20 -96 23 -164 46 -139 46 34 1 343 -86 359 -101 11
-11 -27 -3 -93 19 -24 8 -46 13 -48 11 -2 -3 56 -24 129 -48 72 -24 137 -46
142 -50 6 -4 30 -15 55 -24 43 -16 158 -66 208 -89 12 -6 22 -15 22 -20 0 -10
1 -11 -185 33 -71 17 -193 37 -270 46 -77 8 -154 19 -171 25 -17 5 -37 9 -46
9 -17 0 -32 -26 -22 -41 3 -5 0 -9 -5 -9 -6 0 -11 5 -11 10 0 6 -4 10 -10 10
-20 0 -9 -15 28 -40 46 -31 47 -32 100 -75 24 -19 49 -35 55 -35 19 1 -67 74
-112 95 -53 26 -52 38 2 31 23 -3 85 -10 137 -16 52 -5 113 -12 135 -15 25 -3
17 1 -20 9 -33 8 -107 20 -165 26 -130 14 -146 24 -25 15 203 -15 565 -91 550
-116 -4 -5 -2 -9 4 -9 5 0 22 -5 38 -12 15 -6 34 -12 41 -14 45 -9 4 -12 -140
-11 -197 2 -354 -7 -372 -23 -8 -6 -18 -10 -22 -9 -20 3 -34 -2 -34 -13 0 -6
3 -8 7 -5 3 4 16 1 28 -7 18 -12 31 -12 86 0 l64 13 -70 -4 c-109 -8 -56 12
70 26 122 13 313 6 348 -12 12 -7 33 -13 47 -15 14 -1 39 -9 55 -18 l30 -16
-30 -1 c-73 -2 -172 -10 -190 -15 -11 -3 -71 -16 -133 -29 -61 -13 -120 -29
-130 -35 -14 -8 -12 -9 11 -4 38 9 34 -3 -8 -20 -25 -11 -33 -19 -29 -30 5
-13 -2 -16 -41 -16 -34 0 -44 -3 -39 -12 6 -10 4 -10 -8 0 -11 9 -17 10 -20 2
-4 -12 -365 -23 -372 -11 -4 6 -260 -3 -346 -13 -25 -3 -71 -5 -104 -5 -51 -1
-57 -3 -46 -16 7 -9 21 -13 31 -10 11 4 19 2 19 -4 0 -6 -4 -11 -10 -11 -14 0
-13 -37 1 -46 12 -7 146 -35 164 -33 18 1 -29 18 -53 18 -13 1 -30 7 -38 15
-7 8 -22 12 -33 9 -10 -3 -22 1 -27 8 -5 8 -3 11 8 7 8 -4 46 2 84 13 84 23
243 38 469 44 94 2 197 7 230 10 49 4 55 3 35 -6 -14 -6 -41 -12 -60 -13 -20
-1 -58 -10 -85 -19 -28 -9 -81 -23 -120 -33 -38 -9 -119 -30 -179 -46 -80 -21
-111 -26 -117 -17 -4 6 -12 8 -18 5 -6 -4 -9 -11 -6 -15 2 -5 -16 -16 -40 -26
-25 -9 -45 -22 -45 -29 0 -14 76 -43 87 -33 3 4 -1 7 -11 7 -39 0 1 21 97 50
135 41 131 40 125 45 -2 2 -28 -2 -58 -10 -59 -16 -77 -18 -68 -10 3 3 52 17
109 31 143 34 140 33 133 23 -3 -5 -15 -9 -27 -9 -12 0 -29 -5 -37 -10 -17
-12 4 -8 100 16 52 13 300 54 418 69 31 4 56 13 59 21 3 8 13 14 22 14 9 0 23
5 31 11 11 8 6 9 -22 5 -40 -5 -46 1 -25 23 10 11 9 13 -5 8 -9 -3 -41 -2 -70
3 -31 4 -54 4 -56 -1 -4 -11 -22 -12 -22 -1 0 5 16 16 36 25 19 10 33 21 30
25 -2 4 21 8 52 8 35 0 57 4 60 12 2 7 13 10 28 6 30 -8 96 4 89 16 -3 5 -1
11 5 15 5 3 10 -1 10 -9 0 -10 9 -16 23 -16 15 0 18 3 9 9 -14 9 76 21 156 21
34 0 43 -3 35 -11 -6 -6 -24 -11 -38 -11 -19 0 -23 -3 -14 -9 8 -5 11 -9 7
-10 -8 -1 -19 -4 -35 -8 -5 -2 1 -6 11 -10 15 -6 4 -12 -45 -25 -77 -22 -205
-73 -239 -97 -14 -9 -79 -27 -145 -39 -140 -26 -198 -43 -117 -35 83 9 61 -2
-44 -20 -53 -10 -90 -21 -84 -25 13 -8 -99 -50 -134 -50 -18 0 -19 -2 -6 -11
12 -9 10 -10 -8 -6 -13 3 -21 3 -18 0 3 -3 -25 -21 -62 -40 -72 -37 -104 -61
-97 -73 7 -12 55 -18 61 -9 2 5 26 18 52 29 25 11 49 24 52 28 8 11 80 43 143
63 64 20 100 38 79 39 -20 0 -240 -87 -291 -116 -50 -27 -69 -31 -51 -9 7 8
16 15 21 15 5 0 49 19 97 41 93 44 276 109 301 108 9 0 -2 -9 -24 -19 -54 -25
-34 -24 40 1 33 12 71 23 85 24 13 2 26 9 28 14 7 20 41 12 39 -9 -1 -22 -1
-21 -34 -25 -50 -5 -114 -29 -137 -50 -14 -13 -27 -21 -30 -18 -6 6 -148 -70
-196 -106 -57 -43 -59 -45 -45 -65 7 -9 15 -13 16 -8 6 15 149 104 239 149 91
45 290 123 316 123 28 0 5 -17 -41 -30 -50 -14 -75 -35 -28 -24 l28 7 -22 -22
c-12 -11 -24 -21 -27 -21 -3 0 -31 -16 -62 -34 -32 -19 -61 -33 -66 -30 -5 3
-7 2 -6 -3 2 -4 -1 -9 -6 -10 -5 -1 -12 -6 -15 -11 -11 -18 -108 -72 -129 -72
-11 0 -24 -4 -27 -10 -3 -6 4 -10 17 -10 23 -1 23 -1 -5 -23 l-27 -23 22 -21
c20 -17 32 -20 86 -15 34 2 62 9 62 14 0 6 -7 8 -15 4 -17 -6 -75 3 -75 13 1
3 24 23 53 44 140 101 160 117 166 123 9 10 -71 -36 -90 -53 -8 -7 -19 -13
-23 -13 -10 0 -84 -58 -119 -93 -16 -16 -31 -26 -35 -23 -19 20 216 188 265
190 18 1 35 5 40 9 4 5 0 5 -10 1 -37 -14 -15 15 26 34 68 32 80 36 115 37 38
2 41 -6 10 -28 -19 -13 -20 -16 -6 -16 9 -1 20 4 23 9 3 6 11 10 18 10 14 0
-17 -28 -87 -82 -74 -57 -216 -182 -216 -190 0 -5 7 -8 15 -8 8 0 15 -6 15
-13 0 -15 77 -11 86 5 4 7 -9 8 -37 4 -33 -5 -39 -4 -21 4 12 5 22 14 22 20 0
5 11 20 25 32 24 21 35 46 15 33 -5 -3 -10 -2 -10 3 0 6 7 13 16 16 8 3 12 2
9 -4 -12 -20 12 -9 41 18 54 51 111 91 159 112 41 18 50 19 64 7 9 -8 22 -12
29 -10 28 11 6 -15 -57 -67 -37 -30 -88 -78 -113 -107 -25 -28 -49 -49 -52
-46 -3 4 -5 -6 -4 -21 2 -16 8 -30 14 -33 13 -5 158 37 151 44 -3 2 -26 -1
-51 -8 -62 -15 -76 -3 -48 43 27 43 80 94 89 84 4 -3 -9 -21 -28 -39 -20 -18
-42 -41 -49 -52 -8 -11 22 14 65 55 89 84 155 140 164 140 13 0 43 -43 34 -49
-4 -3 -34 -39 -67 -78 -32 -40 -62 -73 -66 -73 -14 0 -41 -63 -32 -72 16 -16
93 -5 137 19 12 7 25 7 40 -1 23 -12 118 -9 110 3 -2 4 -18 6 -35 3 -35 -5
-39 10 -13 48 l17 25 -24 -20 -23 -20 13 25 c7 14 27 43 44 65 17 22 32 42 33
44 2 2 6 1 10 -2 3 -4 -2 -17 -13 -30 -11 -12 -26 -31 -34 -42 -14 -18 -14
-19 2 -7 9 8 22 11 27 7 7 -4 8 1 4 11 -5 13 -3 15 7 9 8 -5 11 -4 7 2 -4 6 2
13 13 16 11 3 18 1 15 -3 -3 -5 -8 -28 -11 -52 -4 -24 -10 -51 -15 -60 -13
-24 -11 -56 3 -60 7 -3 32 7 55 21 39 23 43 30 43 66 0 84 17 64 23 -27 4 -51
9 -103 13 -116 5 -19 3 -21 -12 -16 -17 6 -17 5 1 -9 15 -11 22 -12 28 -4 5 7
5 1 1 -13 -4 -14 -7 -29 -7 -35 1 -19 41 -200 58 -260 29 -101 34 -137 35
-234 0 -107 -7 -126 -106 -275 -32 -49 -63 -96 -69 -105 -5 -9 -20 -31 -32
-48 -13 -17 -23 -34 -23 -37 0 -8 -63 -101 -72 -104 -4 -2 -8 -9 -8 -16 0 -6
-9 -18 -20 -26 -11 -8 -20 -19 -20 -25 0 -5 -19 -28 -43 -50 -23 -22 -40 -41
-37 -42 3 -1 -5 -15 -18 -32 -13 -18 -27 -29 -32 -26 -6 3 -7 -1 -4 -9 3 -8
-4 -25 -16 -38 -12 -13 -43 -54 -68 -93 -26 -38 -49 -72 -52 -75 -3 -3 -5 -16
-6 -30 0 -14 -4 -50 -7 -80 -3 -30 -3 -85 0 -122 6 -67 6 -68 32 -62 38 8 100
35 144 62 48 29 69 26 72 -13 4 -51 16 -129 20 -134 7 -6 85 34 143 72 28 20
53 33 53 29 1 -4 2 -18 3 -32 5 -63 18 -120 29 -127 19 -12 115 -10 110 3 -2
6 6 18 19 26 13 9 37 27 53 42 17 14 35 26 41 26 6 0 18 15 25 33 7 17 20 37
29 44 8 6 11 15 7 19 -4 5 -12 2 -16 -5 -7 -10 -10 -11 -16 0 -5 8 1 20 16 32
13 11 23 27 22 36 -2 9 3 6 9 -7 9 -19 9 -25 -3 -32 -11 -7 -11 -12 -1 -22 9
-9 12 -9 12 2 0 25 22 -6 42 -57 25 -65 23 -104 -6 -138 l-24 -27 -18 31 c-10
17 -21 31 -25 31 -4 0 -10 11 -13 25 -4 14 -11 25 -16 25 -6 0 -10 -2 -10 -5
0 -11 24 -55 30 -55 4 0 12 -12 18 -26 7 -14 8 -23 3 -19 -5 3 -12 1 -15 -3
-3 -5 -27 -6 -53 -2 -26 5 -53 4 -58 0 -6 -5 -35 -10 -65 -13 -45 -3 41 -7
210 -9 51 -1 61 3 71 29 7 19 13 23 21 15 8 -8 8 -15 0 -25 -10 -11 -6 -14 22
-15 32 -1 33 0 45 53 11 50 29 81 32 56 3 -21 4 -26 17 -56 7 -17 21 -36 30
-42 23 -14 114 -25 128 -16 14 10 27 73 15 73 -5 0 -7 10 -5 23 4 22 2 19 -23
-43 -14 -33 -15 -34 -29 -16 -8 11 -14 16 -14 10 0 -5 -5 -1 -11 8 -7 14 -2
35 25 90 19 40 40 92 47 115 11 37 14 41 24 26 7 -10 11 -23 8 -30 -3 -6 2
-22 11 -35 20 -28 20 -14 1 76 -13 60 -13 76 -1 116 8 25 12 58 11 74 -2 17 4
35 16 47 10 10 14 19 9 19 -6 0 -9 28 -8 70 2 38 6 70 10 70 4 0 30 -48 58
-107 28 -60 57 -119 64 -133 7 -14 21 -54 31 -88 10 -34 23 -62 28 -62 5 0 7
6 5 13 -3 6 -13 39 -23 72 -10 33 -21 62 -25 65 -20 17 -100 223 -100 257 0
18 -4 33 -9 33 -12 0 -20 80 -11 126 l7 39 26 -55 c34 -70 35 -39 2 34 -39 86
-31 136 15 96 13 -11 19 -20 14 -20 -5 0 -2 -6 8 -13 9 -7 24 -27 35 -43 10
-17 34 -55 53 -85 19 -30 42 -67 50 -84 8 -16 18 -32 21 -35 3 -3 23 -36 44
-75 21 -38 43 -79 49 -90 37 -67 96 -143 96 -124 0 7 -7 20 -15 29 -8 9 -38
61 -65 115 -28 54 -60 109 -70 123 -11 13 -20 31 -20 38 0 8 -5 14 -10 14 -6
0 -16 12 -22 28 -7 15 -24 45 -39 67 -14 22 -34 58 -45 80 -10 22 -21 42 -24
45 -22 16 -58 103 -62 148 l-5 52 23 -25 c12 -13 31 -38 41 -55 12 -20 24 -30
38 -28 18 3 21 -4 26 -57 3 -33 7 -48 9 -32 4 43 5 45 11 51 12 13 -3 54 -24
65 -21 10 -21 11 3 5 l25 -7 -20 24 c-11 13 -26 30 -34 36 -9 8 -10 13 -3 13
6 0 -1 12 -15 26 -19 19 -23 28 -14 37 8 8 14 8 24 -2 10 -10 8 -11 -7 -5 -32
12 -10 -12 24 -26 16 -7 27 -17 24 -22 -3 -5 2 -16 12 -23 15 -11 16 -14 4
-15 -11 0 -11 -3 3 -11 11 -6 26 -12 35 -13 10 -2 28 -22 40 -45 l24 -41 -29
12 c-15 6 -32 15 -38 20 -15 13 -27 9 -13 -5 15 -15 75 -41 82 -36 2 2 15 -9
27 -26 13 -16 27 -31 31 -33 5 -2 8 -12 8 -23 0 -10 4 -19 9 -19 8 0 89 -103
152 -195 46 -66 44 -64 85 -110 35 -38 36 -38 18 -8 -10 18 -30 47 -45 64 -15
18 -33 44 -40 58 -8 14 -30 50 -51 79 -22 32 -34 60 -31 69 4 10 2 14 -5 9 -6
-3 -13 -2 -17 4 -3 5 2 10 12 11 14 0 14 2 -4 9 -13 5 -23 16 -23 25 0 8 -4
15 -10 15 -5 0 -7 7 -4 15 4 10 0 15 -11 15 -9 0 -14 4 -10 9 3 6 -3 14 -12
20 -10 6 -13 11 -8 11 6 0 1 8 -11 18 -11 9 -46 54 -78 98 -31 45 -75 100 -96
122 -25 26 -35 42 -27 45 7 3 4 6 -7 6 -12 1 -16 6 -12 16 3 9 0 15 -9 15 -8
0 -15 6 -15 14 0 8 -6 17 -12 19 -10 4 -10 8 1 15 11 8 9 11 -10 14 -18 2 -27
13 -37 43 -17 52 -17 191 0 220 3 6 18 62 32 125 15 63 31 131 36 150 5 19 12
53 16 75 3 22 9 42 13 45 12 10 14 140 1 140 -6 0 -8 -5 -4 -11 8 -14 -27
-189 -39 -189 -5 0 -7 -7 -3 -15 3 -8 -1 -21 -9 -29 -8 -7 -11 -17 -7 -20 3
-4 2 -10 -3 -14 -9 -7 -55 -89 -55 -99 0 -2 4 -2 9 1 14 9 22 -23 11 -44 -7
-13 -6 -20 3 -24 9 -5 9 -7 0 -12 -7 -3 -10 -11 -7 -18 3 -7 -2 -25 -10 -42
l-16 -29 3 32 c1 17 6 29 11 25 5 -3 6 2 3 12 -4 10 -7 22 -7 27 0 20 -30 7
-36 -16 -3 -14 -12 -25 -20 -25 -10 0 -14 -14 -15 -42 -2 -32 -3 -36 -6 -15
-4 27 -5 28 -18 10 -13 -17 -14 -17 -28 2 -15 19 -16 18 -37 -17 -24 -41 -53
-56 -75 -38 -24 20 -26 -7 -4 -46 15 -28 19 -46 14 -72 -4 -20 -2 -38 3 -41
15 -9 3 -61 -13 -55 -7 3 -15 -5 -18 -17 -6 -21 -4 -21 60 -16 36 3 61 2 55
-2 -10 -6 -13 -16 -21 -61 -1 -3 -5 1 -9 8 -6 9 -13 0 -22 -27 -13 -40 -74
-110 -86 -99 -3 4 -15 -3 -27 -15 -20 -20 -21 -20 -27 -1 -4 10 -13 19 -21 19
-7 0 -16 11 -19 24 -7 32 -30 40 -24 9 3 -14 -1 -11 -10 10 -9 18 -20 31 -26
27 -5 -3 -10 3 -10 13 0 11 -6 22 -14 25 -11 4 -14 28 -7 58 0 3 18 4 39 3 20
0 57 2 82 6 40 7 41 8 11 9 -24 1 -32 5 -28 15 3 8 -2 16 -15 19 -13 4 -19 13
-17 29 1 13 -2 32 -7 43 -10 25 -10 82 1 113 7 22 6 23 -29 17 -29 -6 -36 -4
-36 9 0 9 -3 16 -7 16 -5 0 -16 17 -26 38 -23 48 -48 52 -41 8 l4 -31 -9 28
c-6 16 -7 36 -4 44 5 13 2 15 -15 11 -13 -4 -22 -1 -22 5 0 8 -3 7 -9 -1 -6
-10 -10 -9 -14 7 -3 12 -20 28 -39 36 -18 8 -27 14 -19 15 11 0 10 4 -4 20
-12 13 -15 27 -11 47 5 21 4 24 -4 13 -8 -12 -10 -11 -10 6 0 12 -7 27 -15 34
-18 15 -20 70 -2 70 7 0 8 3 2 8 -5 4 -11 14 -12 22 -1 8 -12 48 -24 89 -22
78 -18 94 22 84 11 -3 19 0 19 6 0 8 -12 11 -32 9 -33 -3 -33 -3 -38 49 -6 53
-13 68 -33 68 -7 0 -11 10 -9 22 2 12 -1 24 -7 27 -12 8 16 96 31 96 5 0 6
-10 3 -22 -5 -18 -4 -19 4 -8 15 22 24 5 11 -20 -8 -15 -8 -20 -1 -16 7 5 11
-4 11 -26 0 -35 15 -67 25 -56 4 3 1 16 -5 28 -6 11 -9 31 -7 43 4 18 5 17 6
-5 0 -16 6 -28 11 -28 6 0 10 -6 10 -12 0 -7 12 -24 27 -38 l26 -25 -6 25 c-4
14 -7 33 -7 43 0 10 -8 17 -21 17 -17 0 -20 5 -17 40 2 22 7 39 12 38 14 -4
27 55 16 66 -6 6 -10 17 -9 26 0 12 2 12 6 1 6 -15 44 -55 47 -49 20 36 24 74
11 105 -20 47 -20 70 -1 54 10 -8 16 -9 21 -1 3 6 9 8 13 6 4 -2 7 9 8 25 1
25 -1 27 -14 17 -12 -11 -14 -6 -8 37 7 64 10 78 20 93 4 6 2 12 -3 12 -6 0
-11 13 -11 29 0 24 6 31 32 40 22 8 34 8 36 1 2 -5 11 -10 20 -9 11 0 12 3 5
6 -9 3 -10 10 -3 23 7 12 7 28 0 44 -6 18 -6 26 1 26 6 0 7 5 3 11 -4 8 1 9
16 4 20 -6 21 -4 18 27 l-3 33 47 -3 48 -3 -17 30 c-14 24 -20 27 -32 18 -12
-10 -13 -9 -7 1 6 10 2 13 -15 10 -13 -1 -29 -14 -36 -28 -7 -14 -13 -18 -13
-10 0 13 -1 13 -10 0 -10 -15 -12 -12 -13 28 -1 9 4 16 11 15 7 -2 12 4 12 12
0 10 10 13 35 11 30 -2 35 1 35 19 0 13 -10 27 -25 35 -30 16 -32 33 -4 61 19
19 20 21 3 33 -12 9 -14 15 -6 20 7 4 12 13 12 19 0 7 -4 6 -10 -3 -7 -11 -8
-7 -4 15 3 20 -3 50 -21 90 l-25 60 24 -28 c14 -15 30 -44 35 -65 6 -21 17
-46 25 -57 9 -11 16 -27 16 -36 0 -9 7 -20 16 -23 24 -9 26 -8 14 14 -17 32 7
24 26 -10 23 -37 44 -47 44 -19 0 18 6 16 48 -19 67 -56 127 -78 172 -62 3 1
25 1 50 1 l45 -2 -55 28 c-48 24 -55 32 -55 55 1 19 -2 25 -9 18 -6 -6 -42
-10 -81 -9 l-70 1 58 12 c33 6 56 14 52 18 -14 14 17 38 47 38 27 0 30 3 24
23 -3 12 -6 25 -6 29 0 9 -74 48 -90 48 -5 0 -10 -7 -10 -15 0 -18 3 -17 -37
-6 -22 6 -42 6 -62 -2 l-29 -11 13 -43 c7 -24 19 -50 25 -58 7 -9 8 -15 2 -15
-5 0 -15 6 -21 14 -21 26 -49 142 -32 131 5 -3 30 -2 57 2 39 5 44 8 26 14
-13 5 -25 15 -28 24 -4 8 -13 15 -21 15 -7 0 -25 11 -39 25 -14 14 -35 27 -47
29 -11 1 -23 8 -25 14 -2 6 -15 10 -30 8 -15 -2 -20 -1 -10 1 26 7 30 31 4 26
-13 -3 -28 2 -35 11 -11 14 -11 16 5 17 11 0 14 3 7 6 -7 2 -13 9 -13 14 0 12
67 12 75 -1 3 -5 25 -10 48 -10 31 0 38 3 27 10 -8 5 -27 10 -42 10 -16 0 -28
4 -28 10 0 5 19 8 45 6 24 -3 47 0 50 5 4 5 16 10 28 11 30 2 -111 18 -148 16
-63 -2 -135 9 -135 21 0 3 -14 12 -31 20 -17 7 -68 41 -113 75 -95 72 -124 90
-80 50 54 -49 78 -69 137 -113 31 -23 57 -45 57 -50 0 -16 -55 -20 -77 -5 -22
14 -82 64 -173 146 -82 73 -88 78 -96 78 -5 0 23 -32 61 -72z m311 -195 c15
-20 18 -43 6 -43 -4 0 -23 13 -42 30 l-35 29 29 1 c16 0 35 -8 42 -17z m420
-245 c10 -12 15 -19 9 -16 -5 3 -18 8 -28 11 -10 4 -15 11 -12 17 8 13 9 13
31 -12z m-59 -33 c9 -25 -2 -27 -28 -6 l-24 20 23 1 c12 0 25 -7 29 -15z
m-1348 -175 c85 -31 141 -57 141 -65 0 -5 -50 13 -180 64 -99 39 -67 40 39 1z
m1461 10 c13 -8 13 -10 -2 -10 -9 0 -20 5 -23 10 -8 13 5 13 25 0z m-1180 -85
c7 -8 9 -15 6 -15 -4 0 -14 7 -22 15 -9 8 -11 15 -6 15 5 0 15 -7 22 -15z m20
-45 c0 -5 -2 -10 -4 -10 -3 0 -8 5 -11 10 -3 6 -1 10 4 10 6 0 11 -4 11 -10z
m48 -54 c11 -4 28 -4 38 -1 14 4 13 2 -3 -6 -12 -6 -33 -9 -47 -5 -20 5 -26
12 -25 34 0 25 1 26 9 5 5 -12 17 -24 28 -27z m212 12 c0 -6 -6 -5 -15 2 -8 7
-15 14 -15 16 0 2 7 1 15 -2 8 -4 15 -11 15 -16z m431 2 c22 -12 23 -19 10
-54 -8 -18 -15 -23 -30 -19 -24 6 -29 33 -6 33 17 0 20 16 5 25 -11 7 -14 25
-4 25 3 0 14 -5 25 -10z m-429 -47 c21 -9 35 -19 33 -23 -3 -4 15 -11 40 -14
43 -7 62 -29 33 -39 -7 -2 1 -2 17 1 37 5 23 -13 -17 -23 -22 -6 -28 -4 -28
10 0 11 -6 15 -17 12 -23 -5 -75 21 -68 33 4 6 -5 10 -20 10 -14 0 -28 6 -31
14 -3 8 -16 17 -30 20 -13 4 -24 11 -24 17 0 13 63 3 112 -18z m-255 1 c-3 -3
-12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m368 -14 c3 -5 1 -10 -4 -10
-6 0 -11 5 -11 10 0 6 2 10 4 10 3 0 8 -4 11 -10z m-188 -36 c-3 -3 -12 -4
-19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m49 -15 c3 -6 20 -17 38 -25 17 -7 24
-13 16 -14 -8 0 -33 11 -55 25 -23 14 -33 25 -23 25 9 0 20 -5 24 -11z m172
-46 c-10 -2 -18 -11 -18 -19 0 -8 -7 -14 -15 -14 -15 0 -21 21 -8 33 3 4 18 6
32 6 17 -1 20 -3 9 -6z m53 -43 c-24 -21 -41 -26 -41 -12 0 5 12 13 28 19 39
15 40 15 13 -7z m-251 0 c0 -5 -2 -10 -4 -10 -3 0 -8 5 -11 10 -3 6 -1 10 4
10 6 0 11 -4 11 -10z m310 3 c0 -17 -36 -43 -59 -43 -28 0 -21 12 21 35 27 15
38 18 38 8z m126 -30 c-7 -7 -26 7 -26 19 0 6 6 6 15 -2 9 -7 13 -15 11 -17z
m-748 10 c-10 -2 -28 -2 -40 0 -13 2 -5 4 17 4 22 1 32 -1 23 -4z m643 -20
c-5 -18 -16 -29 -34 -34 -33 -9 -36 2 -4 16 12 6 23 16 23 23 2 20 4 22 13 22
5 0 6 -12 2 -27z m-734 11 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13
-5z m806 -29 c-3 -9 -8 -14 -10 -11 -3 3 -2 9 2 15 9 16 15 13 8 -4z m-243
-15 c0 -5 -4 -10 -10 -10 -5 0 -10 5 -10 10 0 6 5 10 10 10 6 0 10 -4 10 -10z
m-243 -13 c-36 -11 -37 -13 -22 -32 12 -16 14 -17 9 -2 -6 17 7 22 48 19 9 -1
22 5 28 13 7 8 20 15 29 14 11 0 10 -3 -6 -11 -13 -6 -23 -15 -23 -20 0 -4 -7
-8 -17 -8 -9 0 -13 -3 -10 -7 7 -6 -23 -27 -55 -39 -10 -3 -18 -10 -18 -15 0
-13 2 -12 54 17 57 32 75 24 20 -8 l-39 -23 29 -5 c16 -3 31 -12 33 -20 4 -13
3 -13 -7 0 -8 11 -13 12 -16 3 -3 -7 -12 -9 -21 -6 -10 4 -14 2 -9 -5 3 -6 2
-13 -3 -16 -5 -4 -12 -2 -16 4 -4 6 -16 5 -35 -5 -35 -18 -44 -19 -34 -3 5 7
2 9 -7 6 -45 -19 -49 -17 -15 6 28 18 48 23 68 19 35 -7 38 12 3 21 -14 4 -37
0 -53 -7 -38 -20 -99 -30 -107 -18 -3 6 -26 8 -53 5 l-47 -5 40 20 c22 11 75
32 118 47 43 15 76 28 75 30 -4 3 -147 -37 -183 -51 -16 -6 -17 -5 -9 4 14 15
240 90 269 90 11 0 3 -6 -18 -12z m420 -36 c-22 -49 -40 -60 -30 -18 5 22 5
22 -10 2 -13 -15 -16 -16 -17 -5 0 19 46 70 65 70 11 0 9 -11 -8 -49z m-77 23
c0 -2 -7 -4 -15 -4 -8 0 -15 4 -15 10 0 5 7 7 15 4 8 -4 15 -8 15 -10z m-74
-36 c-2 -18 -4 -40 -5 -48 -1 -12 -3 -12 -16 1 -12 12 -13 20 -3 47 16 41 29
41 24 0z m177 -15 c-6 -40 -21 -44 -18 -5 4 52 5 56 14 47 5 -6 7 -25 4 -42z
m-803 17 c0 -6 -27 -10 -62 -10 -45 0 -59 3 -48 10 20 13 110 13 110 0z m550
-35 c-7 -8 -19 -15 -26 -15 -8 0 -14 -4 -14 -10 0 -5 -4 -10 -10 -10 -21 0 -9
29 23 56 27 23 32 24 35 10 2 -9 -2 -23 -8 -31z m277 -2 c-3 -10 -5 -4 -5 12
0 17 2 24 5 18 2 -7 2 -21 0 -30z m-337 23 c0 -2 -8 -10 -17 -17 -16 -13 -17
-12 -4 4 13 16 21 21 21 13z m-400 -30 c0 -2 -7 -7 -16 -10 -8 -3 -12 -2 -9 4
6 10 25 14 25 6z m721 -43 c4 -53 -8 -77 -30 -64 -18 12 -6 81 14 81 8 0 16
-8 16 -17z m-326 -12 c-16 -10 -34 -16 -38 -14 -12 7 25 32 48 33 16 0 14 -4
-10 -19z m125 2 c0 -10 -12 -24 -27 -30 -31 -15 -46 -7 -20 11 9 7 17 18 17
25 0 6 7 11 15 11 8 0 15 -8 15 -17z m70 -9 c0 -8 -6 -14 -12 -14 -7 0 -4 -6
7 -12 41 -23 46 -57 14 -89 -12 -12 -23 -31 -24 -43 -1 -12 -3 -27 -4 -34 0
-7 -6 -10 -11 -7 -7 4 -7 12 0 24 5 10 7 21 4 24 -6 6 -6 77 0 117 3 14 5 33
5 43 1 21 21 13 21 -9z m-161 -8 c-2 -2 -15 -7 -29 -10 l-25 -7 25 15 c21 12
42 14 29 2z m-150 -25 c-41 -27 -146 -50 -133 -30 3 5 12 9 20 9 8 0 14 4 14
9 0 8 95 38 129 40 8 1 -5 -12 -30 -28z m-365 -2 c-3 -5 -10 -7 -15 -3 -5 3
-7 10 -3 15 3 5 10 7 15 3 5 -3 7 -10 3 -15z m456 7 c0 -2 -7 -7 -16 -10 -8
-3 -12 -2 -9 4 6 10 25 14 25 6z m46 -23 c-11 -33 -146 -103 -146 -76 0 16 53
59 90 73 19 7 39 17 44 21 14 12 19 4 12 -18z m80 -28 c-32 -25 -66 -38 -66
-25 0 10 83 60 90 53 3 -3 -8 -15 -24 -28z m-1401 -19 c-23 -16 -65 -30 -65
-22 0 6 59 34 75 35 5 1 1 -5 -10 -13z m1415 -11 c0 -8 -7 -15 -16 -15 -14 0
-14 3 -4 15 7 8 14 15 16 15 2 0 4 -7 4 -15z m-285 -35 c-3 -5 -11 -10 -16
-10 -6 0 -7 5 -4 10 3 6 11 10 16 10 6 0 7 -4 4 -10z m-112 -27 c-7 -2 -29
-16 -49 -29 -20 -14 -39 -23 -41 -20 -3 3 16 19 43 35 26 17 50 28 53 25 3 -4
1 -9 -6 -11z m157 13 c0 -3 -4 -8 -10 -11 -5 -3 -10 -1 -10 4 0 6 5 11 10 11
6 0 10 -2 10 -4z m181 -33 c-12 -20 -14 -14 -5 12 4 9 9 14 11 11 3 -2 0 -13
-6 -23z m-196 -21 c-39 -33 -95 -72 -95 -65 1 10 81 73 95 73 6 0 6 -3 0 -8z
m-705 -12 c-8 -5 -19 -10 -25 -10 -5 0 -3 5 5 10 8 5 20 10 25 10 6 0 3 -5 -5
-10z m965 -19 c-3 -6 -11 -11 -17 -11 -6 0 -6 6 2 15 14 17 26 13 15 -4z m-82
-8 c-7 -3 -13 -9 -13 -15 0 -6 7 -7 16 -4 9 3 12 2 9 -5 -4 -6 -14 -8 -22 -5
-11 4 -13 1 -8 -14 13 -42 -74 -120 -134 -120 -36 0 -38 4 -11 37 11 14 17 30
13 37 -3 6 -3 8 1 5 4 -4 27 15 53 41 35 36 54 47 77 47 17 1 25 -1 19 -4z
m-963 -23 c-14 -10 -27 -16 -30 -13 -6 6 30 33 44 33 6 0 0 -9 -14 -20z m1240
0 c0 -5 -4 -10 -10 -10 -5 0 -10 5 -10 10 0 6 5 10 10 10 6 0 10 -4 10 -10z
m-810 -63 c0 -2 -14 -16 -32 -33 -30 -28 -30 -18 1 18 13 16 31 24 31 15z
m647 -3 c-3 -4 0 -13 8 -21 24 -23 18 -59 -11 -78 -27 -17 -27 -17 -20 6 3 13
8 35 11 49 5 24 5 24 -4 3 -6 -13 -12 -23 -15 -23 -2 0 -2 10 1 23 6 23 22 47
31 47 3 0 3 -3 -1 -6z m120 -286 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4
-12 1 -19z m723 -252 c0 -3 -4 -8 -10 -11 -5 -3 -10 -1 -10 4 0 6 5 11 10 11
6 0 10 -2 10 -4z m-45 -149 c-4 -15 -13 -31 -21 -38 -8 -6 -14 -19 -14 -28 1
-11 8 -7 25 14 14 17 25 25 25 19 0 -13 -39 -49 -61 -57 -24 -8 -43 37 -23 53
8 7 14 18 14 26 0 11 50 44 58 38 2 -1 0 -13 -3 -27z m-493 14 c-10 -6 -7 -10
12 -15 16 -4 26 -13 26 -24 0 -10 4 -22 9 -27 10 -11 3 -65 -8 -65 -14 1 -59
48 -74 78 -14 30 -14 32 1 33 11 0 12 2 4 6 -18 7 -4 23 21 23 16 0 18 -3 9
-9z m428 -30 c0 -6 -4 -13 -10 -16 -5 -3 -10 1 -10 9 0 9 5 16 10 16 6 0 10
-4 10 -9z m-333 -43 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z
m293 -48 c0 -5 -2 -10 -4 -10 -3 0 -8 5 -11 10 -3 6 -1 10 4 10 6 0 11 -4 11
-10z m56 -27 c-10 -10 -19 5 -10 18 6 11 8 11 12 0 2 -7 1 -15 -2 -18z m-386
-35 c0 -6 7 -20 17 -30 9 -10 11 -18 5 -18 -6 0 -13 6 -15 13 -4 9 -7 9 -15
-1 -6 -9 -9 -4 -10 17 0 17 4 31 9 31 5 0 9 -5 9 -12z m-203 -146 c-8 -9 -18
-27 -21 -39 -4 -13 -13 -23 -19 -23 -7 -1 -1 -10 12 -21 l24 -20 -22 -42 c-13
-23 -34 -63 -48 -89 -13 -26 -31 -52 -39 -59 -8 -6 -13 -26 -13 -43 2 -30 2
-30 6 -3 2 15 9 25 14 22 5 -4 9 3 9 15 0 12 4 19 9 16 5 -4 12 7 16 24 4 17
11 28 16 24 5 -3 9 4 9 16 0 11 7 23 15 26 8 4 13 10 10 14 -3 4 2 13 10 20 8
7 15 20 15 29 0 14 2 14 10 1 14 -22 12 -59 -5 -76 -8 -9 -15 -23 -14 -32 0
-12 3 -11 9 6 10 24 20 29 20 9 0 -21 -80 -138 -90 -132 -6 4 -10 -3 -10 -14
0 -29 -18 -35 -23 -9 -2 13 -5 4 -7 -22 l-3 -45 -7 40 -7 40 -2 -53 c0 -33 -5
-51 -11 -47 -5 3 -10 -3 -10 -14 0 -24 -16 -36 -23 -19 -3 7 -6 1 -6 -14 -1
-42 -11 -60 -26 -48 -9 8 -14 1 -19 -30 -3 -22 -10 -40 -15 -40 -4 0 -22 -30
-40 -67 -17 -38 -47 -95 -66 -128 -19 -33 -32 -67 -29 -76 7 -25 -41 -65 -114
-94 -37 -15 -76 -32 -86 -37 -18 -10 -19 -6 -13 81 7 89 30 186 48 197 5 3 9
22 9 42 0 26 3 33 11 25 8 -8 19 -3 40 18 16 15 29 33 29 39 0 11 76 122 109
158 11 12 20 23 20 25 -5 15 66 125 138 211 18 21 30 42 28 47 -3 4 0 11 6 15
8 4 9 3 5 -4 -5 -8 -1 -10 10 -5 11 4 13 8 6 11 -7 2 -12 8 -12 13 0 11 71
113 82 117 5 2 8 10 8 17 0 8 6 20 13 27 8 7 20 25 28 38 l14 25 3 -23 c2 -13
-3 -31 -11 -40z m3 -62 c0 -5 -5 -10 -11 -10 -5 0 -7 5 -4 10 3 6 8 10 11 10
2 0 4 -4 4 -10z m130 -241 c0 -6 -4 -7 -10 -4 -5 3 -10 11 -10 16 0 6 5 7 10
4 6 -3 10 -11 10 -16z m-100 -8 c0 -5 -6 -12 -12 -14 -8 -3 -6 -6 5 -6 19 -1
24 -36 7 -46 -8 -5 -7 -11 0 -20 7 -8 14 -29 17 -47 8 -51 16 -49 11 4 -3 25
-2 52 3 60 5 8 9 -11 9 -49 0 -36 -4 -63 -10 -63 -5 0 -10 -9 -10 -21 0 -11
-6 -33 -14 -47 -16 -32 -29 -64 -46 -112 -12 -35 -17 -47 -65 -155 -14 -33
-31 -72 -38 -87 -6 -16 -15 -28 -18 -28 -4 0 -16 -22 -28 -49 -17 -41 -31 -55
-76 -81 -30 -17 -61 -30 -68 -27 -6 2 -17 -3 -24 -12 -10 -13 -12 12 -13 126
0 154 2 159 59 183 21 8 28 16 22 24 -5 6 -9 16 -9 21 0 15 31 69 48 82 54 41
55 43 38 37 -10 -3 -18 -1 -18 5 0 6 5 11 10 11 6 0 15 11 20 24 5 13 18 27
29 31 12 3 18 12 15 20 -4 9 3 16 20 21 14 3 31 13 38 22 12 14 10 14 -10 3
-27 -15 -40 -8 -24 12 11 13 76 48 117 62 11 4 15 9 8 12 -6 2 -30 -5 -52 -16
-48 -25 -58 -26 -41 -6 7 8 18 15 25 15 7 0 23 9 36 21 l24 21 -28 -17 c-16
-9 -31 -14 -34 -11 -6 5 56 46 71 46 5 0 7 3 4 6 -4 3 -16 0 -28 -6 -30 -16
-32 -9 -10 28 19 30 40 43 40 23z m27 -23 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13
3 -3 4 -12 1 -19z m560 0 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z
m-517 -61 c0 -23 -4 -36 -10 -32 -6 3 -9 26 -8 51 2 54 18 37 18 -19z m537 21
c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m-53 -65 c1 -7 9 -20 17
-30 26 -30 31 -53 11 -53 -16 -1 -16 -1 0 -11 14 -8 15 -15 8 -35 -6 -14 -8
-29 -5 -34 3 -5 1 -11 -4 -14 -11 -7 -19 12 -16 44 1 14 -5 30 -14 37 -13 10
-13 12 -1 13 10 0 11 3 3 11 -6 6 -9 18 -6 27 5 11 3 13 -7 7 -10 -6 -12 -2
-8 18 3 15 1 28 -5 30 -6 2 -6 13 -2 27 l8 25 9 -25 c6 -14 11 -30 12 -37z
m-452 -5 c-7 -7 -12 -8 -12 -2 0 14 12 26 19 19 2 -3 -1 -11 -7 -17z m-496
-30 c-18 -26 -22 -17 -5 14 6 11 13 17 16 15 3 -3 -2 -16 -11 -29z m514 12
c-8 -5 -19 -10 -25 -10 -5 0 -3 5 5 10 8 5 20 10 25 10 6 0 3 -5 -5 -10z m357
-22 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m-387 -8 c0 -5 -7
-10 -16 -10 -8 0 -12 5 -9 10 3 6 10 10 16 10 5 0 9 -4 9 -10z m352 -35 c3
-14 1 -25 -3 -25 -5 0 -9 -7 -9 -17 0 -9 -3 -13 -7 -9 -10 10 -11 56 -1 56 4
0 4 7 1 17 -4 10 -2 14 4 10 6 -4 13 -18 15 -32z m82 -18 c-4 -20 -2 -27 3
-19 7 9 13 -4 21 -39 9 -39 9 -55 1 -66 -7 -7 -9 -16 -6 -20 4 -3 2 -13 -3
-22 -5 -10 -5 -23 -1 -30 6 -9 12 -3 20 20 6 18 13 30 16 27 3 -2 -4 -29 -14
-59 -11 -30 -20 -48 -20 -41 -1 6 -1 14 -1 17 -1 3 -8 24 -17 47 -27 76 -33
120 -21 175 12 56 31 64 22 10z m-425 7 c-12 -15 -11 -16 11 -10 21 6 22 5 8
-4 -10 -6 -18 -22 -18 -35 0 -14 -4 -25 -10 -25 -5 0 -8 14 -6 30 2 17 -1 33
-6 36 -5 3 -1 12 9 19 23 17 30 10 12 -11z m-558 -31 c-12 -20 -14 -14 -5 12
4 9 9 14 11 11 3 -2 0 -13 -6 -23z m519 7 c0 -5 -7 -16 -16 -24 -9 -9 -11 -16
-4 -16 6 0 8 -5 4 -12 -5 -8 -2 -9 10 -5 14 6 15 3 6 -13 -6 -11 -7 -20 -2
-20 5 0 9 -17 10 -38 1 -22 13 -64 27 -96 27 -62 31 -81 14 -70 -8 4 -9 -3 -4
-26 5 -25 4 -31 -5 -25 -8 5 -11 3 -8 -6 3 -8 -1 -36 -8 -64 -8 -27 -14 -62
-14 -76 0 -20 -13 -36 -52 -66 -76 -58 -120 -81 -125 -66 -2 7 -11 9 -19 6 -8
-3 -14 -2 -12 3 1 5 -3 25 -9 44 -6 19 -14 58 -17 87 -6 48 -3 59 45 155 28
57 55 112 60 123 4 11 24 55 43 97 20 43 36 82 36 88 0 5 5 10 10 10 6 0 10 7
10 16 0 8 5 12 10 9 6 -3 10 -10 10 -15z m186 -7 c-10 -10 -19 5 -10 18 6 11
8 11 12 0 2 -7 1 -15 -2 -18z m131 5 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3
4 -12 1 -19z m-61 -20 c4 -6 2 -14 -4 -16 -8 -2 -9 -9 -3 -20 11 -20 9 -72 -1
-72 -5 0 -8 6 -9 13 -6 84 -6 107 1 107 5 0 12 -5 16 -12z m-246 -8 c0 -5 -5
-10 -11 -10 -5 0 -7 5 -4 10 3 6 8 10 11 10 2 0 4 -4 4 -10z m180 -46 c-7 -7
-18 -14 -24 -14 -6 0 -3 7 7 14 9 7 17 18 17 24 0 6 -8 9 -17 6 -15 -5 -15 -3
2 11 19 15 20 15 23 -5 2 -12 -2 -28 -8 -36z m208 13 c-2 -23 -6 -47 -9 -52
-3 -6 -4 -20 -3 -32 0 -13 -3 -23 -7 -23 -12 0 -11 10 2 87 13 72 22 84 17 20z
m-23 23 c3 -5 2 -10 -4 -10 -5 0 -13 5 -16 10 -3 6 -2 10 4 10 5 0 13 -4 16
-10z m-932 -17 c-9 -26 -24 -43 -37 -43 -6 0 -3 7 7 14 9 7 17 21 17 30 0 9 4
16 10 16 5 0 7 -8 3 -17z m657 -50 c0 -7 -4 -13 -10 -13 -5 0 -10 8 -10 18 0
9 -3 28 -5 42 -5 22 -3 21 9 -5 9 -16 15 -36 16 -42z m-35 -13 c-4 -17 -3 -21
3 -11 17 24 22 -5 12 -65 -6 -32 -10 -61 -10 -64 -1 -3 -9 16 -19 41 -15 38
-19 81 -11 129 0 3 5 -2 10 -10 8 -13 10 -13 10 2 0 9 -5 20 -10 23 -6 4 -7
11 -4 17 11 17 26 -33 19 -62z m281 28 c5 -13 7 -25 7 -28 -1 -3 -4 -36 -7
-74 -3 -40 -11 -73 -18 -78 -10 -6 -10 -8 0 -8 17 0 15 -25 -3 -40 -9 -7 -13
-21 -10 -31 5 -13 2 -17 -8 -14 -10 5 -12 25 -9 88 2 45 7 97 12 114 4 18 6
42 3 54 -5 17 -3 20 7 14 10 -6 12 -4 7 8 -3 10 -2 17 3 17 5 0 12 -10 16 -22z
m24 12 c0 -5 -2 -10 -4 -10 -3 0 -8 5 -11 10 -3 6 -1 10 4 10 6 0 11 -4 11
-10z m-135 -108 c4 -4 4 4 0 18 -4 14 -4 22 0 18 9 -9 14 -46 19 -147 2 -42 7
-93 11 -113 4 -24 3 -38 -3 -38 -5 0 -10 6 -9 13 1 36 -4 57 -13 52 -6 -4 -7
1 -3 11 3 10 2 15 -3 12 -5 -4 -10 12 -12 34 -1 22 -9 50 -17 62 -8 11 -15 27
-15 36 0 13 1 13 10 0 6 -9 10 -10 10 -3 0 6 -7 19 -16 27 -14 15 -14 16 1 16
9 0 14 4 10 10 -3 5 -2 22 2 37 l7 28 7 -33 c4 -18 10 -36 14 -40z m205 -1 c0
-10 3 -21 7 -25 4 -4 8 -19 8 -34 0 -15 4 -33 9 -41 5 -8 4 -16 -4 -21 -9 -5
-9 -9 -1 -14 6 -4 11 -12 11 -17 0 -6 -4 -8 -9 -5 -5 4 -7 -3 -4 -15 5 -18 3
-20 -18 -15 -23 7 -23 6 -5 -8 17 -14 17 -19 6 -48 -28 -71 -71 -137 -85 -131
-8 3 -15 -1 -15 -8 0 -7 -3 -10 -6 -6 -13 12 -11 73 3 95 7 12 11 27 8 32 -3
6 -1 10 6 10 6 0 18 8 26 18 14 16 14 16 9 -1 -4 -11 -2 -16 5 -11 7 4 8 20 4
41 -3 19 -2 33 2 30 5 -3 9 11 8 30 0 20 -6 38 -13 41 -6 2 -12 -1 -12 -8 0
-6 5 -8 10 -5 6 3 10 1 10 -4 0 -6 -6 -11 -14 -11 -9 0 -12 -10 -9 -35 2 -25
-2 -41 -17 -57 -15 -16 -20 -18 -20 -7 0 8 6 21 13 28 10 11 9 13 -5 8 -23 -8
-23 7 -1 29 11 11 14 19 7 21 -15 5 -5 53 11 53 7 0 19 33 30 81 17 79 17 80
31 54 8 -15 14 -35 14 -44z m-315 -61 c-10 -11 -21 -18 -23 -15 -3 3 3 12 14
20 27 20 30 18 9 -5z m245 -4 c0 -3 -4 -8 -10 -11 -5 -3 -10 -1 -10 4 0 6 5
11 10 11 6 0 10 -2 10 -4z m-236 -28 c-6 -20 -5 -21 9 -10 14 12 16 11 16 -5
0 -10 3 -35 6 -55 4 -25 3 -38 -4 -38 -6 0 -11 -4 -11 -10 0 -5 7 -10 15 -10
10 0 15 -10 15 -30 0 -30 15 -41 23 -17 3 9 7 9 20 -2 10 -7 17 -10 17 -5 0 4
6 2 12 -4 10 -10 10 -15 -2 -22 -12 -7 -12 -12 -2 -22 16 -16 15 -59 -2 -92
-11 -23 -15 -24 -20 -10 -8 21 2 56 15 49 5 -4 9 5 9 19 0 14 -4 26 -10 26 -5
0 -10 -5 -10 -11 0 -6 -7 -17 -15 -25 -13 -13 -14 -12 -11 13 2 15 1 22 -1 16
-7 -21 -23 -15 -23 8 0 11 -4 17 -10 14 -6 -3 -10 4 -10 16 0 12 -7 27 -16 34
-9 6 -16 24 -16 38 0 15 -5 27 -11 27 -6 0 2 14 19 31 23 24 25 29 9 23 -18
-7 -18 -6 -6 9 9 11 10 17 2 17 -6 0 -11 -4 -11 -10 0 -5 -4 -10 -9 -10 -5 0
-7 10 -4 23 8 37 12 47 18 47 4 0 3 -10 -1 -22z m-24 -18 c0 -5 -5 -10 -11
-10 -5 0 -7 5 -4 10 3 6 8 10 11 10 2 0 4 -4 4 -10z m20 -49 c0 -5 -7 -11 -14
-14 -10 -4 -13 -1 -9 9 6 15 23 19 23 5z m172 -56 c-6 -34 -12 -32 -12 6 0 16
4 28 9 25 4 -3 6 -17 3 -31z m-82 5 c6 -11 8 -20 6 -20 -3 0 -10 9 -16 20 -6
11 -8 20 -6 20 3 0 10 -9 16 -20z m102 -45 c-6 -32 -19 -42 -16 -12 1 12 3 25
3 30 1 4 5 7 10 7 4 0 6 -11 3 -25z m78 -215 c0 -5 -12 -10 -26 -10 -14 0 -23
4 -19 10 3 6 15 10 26 10 10 0 19 -4 19 -10z"/>
<path d="M2275 3400 c-3 -5 -2 -10 4 -10 5 0 13 5 16 10 3 6 2 10 -4 10 -5 0
-13 -4 -16 -10z"/>
<path d="M2658 3315 c2 -14 8 -23 12 -20 10 6 1 45 -10 45 -4 0 -5 -11 -2 -25z"/>
<path d="M2460 3115 c-8 -9 -8 -15 -2 -15 12 0 26 19 19 26 -2 2 -10 -2 -17
-11z"/>
<path d="M2763 1800 c0 -25 2 -35 4 -22 2 12 2 32 0 45 -2 12 -4 2 -4 -23z"/>
<path d="M2732 1735 c0 -16 2 -22 5 -12 2 9 2 23 0 30 -3 6 -5 -1 -5 -18z"/>
<path d="M2707 1719 c4 -13 8 -18 11 -10 2 7 -1 18 -6 23 -8 8 -9 4 -5 -13z"/>
<path d="M2636 1673 c-6 -14 -5 -15 5 -6 7 7 10 15 7 18 -3 3 -9 -2 -12 -12z"/>
<path d="M2611 1634 c0 -11 3 -14 6 -6 3 7 2 16 -1 19 -3 4 -6 -2 -5 -13z"/>
<path d="M2543 1485 c0 -33 2 -45 4 -27 2 18 2 45 0 60 -2 15 -4 0 -4 -33z"/>
<path d="M2511 1515 c1 -19 18 -51 18 -35 0 8 -4 22 -9 30 -5 8 -9 11 -9 5z"/>
<path d="M2515 1427 c-4 -10 -5 -21 -1 -24 10 -10 18 4 13 24 -4 17 -4 17 -12
0z"/>
<path d="M2775 1580 c-16 -11 -25 -20 -19 -20 11 0 64 39 54 40 -3 0 -18 -9
-35 -20z"/>
<path d="M2811 1564 c0 -11 3 -14 6 -6 3 7 2 16 -1 19 -3 4 -6 -2 -5 -13z"/>
<path d="M2610 1370 c-9 -6 -10 -10 -3 -10 6 0 15 5 18 10 8 12 4 12 -15 0z"/>
<path d="M2819 1323 c-13 -16 -12 -17 4 -4 16 13 21 21 13 21 -2 0 -10 -8 -17
-17z"/>
<path d="M2789 1269 l-24 -20 28 17 c15 9 27 18 27 20 0 8 -8 4 -31 -17z"/>
<path d="M2850 1235 c-1 -5 -2 -14 -1 -18 1 -4 -5 -15 -14 -23 -16 -16 -20
-34 -7 -34 11 0 34 58 29 72 -3 7 -6 9 -7 3z"/>
<path d="M2870 1221 c0 -6 4 -13 10 -16 6 -3 7 1 4 9 -7 18 -14 21 -14 7z"/>
<path d="M2750 1140 c-9 -6 -10 -10 -3 -10 6 0 15 5 18 10 8 12 4 12 -15 0z"/>
<path d="M2920 1313 c0 -4 5 -15 10 -23 8 -13 10 -13 10 2 0 9 -4 20 -10 23
-5 3 -10 3 -10 -2z"/>
<path d="M3206 1293 c-6 -14 -5 -15 5 -6 7 7 10 15 7 18 -3 3 -9 -2 -12 -12z"/>
<path d="M3293 1275 c-12 -38 -5 -51 15 -29 8 8 9 14 2 14 -6 0 -8 10 -4 25 9
38 -1 30 -13 -10z"/>
<path d="M3270 1215 c0 -2 10 -10 23 -16 20 -11 21 -11 8 4 -13 16 -31 23 -31
12z"/>
<path d="M5160 4695 c0 -5 5 -17 10 -25 5 -8 10 -10 10 -5 0 6 -5 17 -10 25
-5 8 -10 11 -10 5z"/>
<path d="M2635 4680 c3 -5 8 -10 11 -10 2 0 4 5 4 10 0 6 -5 10 -11 10 -5 0
-7 -4 -4 -10z"/>
<path d="M5732 4580 c0 -14 2 -19 5 -12 2 6 2 18 0 25 -3 6 -5 1 -5 -13z"/>
<path d="M868 4410 c2 -45 5 -80 7 -78 1 1 5 31 8 66 2 35 7 65 10 68 13 13
133 11 155 -3 13 -8 32 -11 44 -7 19 6 20 3 14 -26 -5 -30 -4 -31 11 -19 11
10 14 10 9 2 -4 -8 -2 -13 6 -14 59 -3 116 -13 138 -23 14 -7 39 -16 55 -19
17 -4 -6 11 -50 32 -44 22 -76 40 -72 40 10 1 176 -63 215 -83 45 -23 132 -56
132 -50 0 3 -20 14 -45 25 -24 11 -47 24 -50 29 -3 6 -13 10 -22 10 -9 0 -41
12 -72 26 -31 14 -65 30 -76 34 -11 4 -31 12 -45 18 -14 5 -34 14 -45 18 -14
6 5 10 60 14 l80 6 -70 3 c-38 1 -144 4 -235 7 l-165 6 3 -82z m285 33 c-7 -2
-19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z"/>
<path d="M2076 4471 c-4 -5 -2 -12 3 -15 5 -4 12 -2 15 3 4 5 2 12 -3 15 -5 4
-12 2 -15 -3z"/>
<path d="M3388 4453 c34 -2 90 -2 125 0 34 2 6 3 -63 3 -69 0 -97 -1 -62 -3z"/>
<path d="M4208 4453 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M4615 4450 c-96 -5 -86 -6 80 -7 108 -1 179 2 165 7 -28 9 -83 9
-245 0z"/>
<path d="M4937 4448 c-6 -4 43 -7 110 -5 76 1 113 5 100 10 -27 10 -192 6
-210 -5z"/>
<path d="M5200 4450 c0 -5 16 -10 35 -10 19 0 35 -4 35 -10 0 -5 -6 -10 -14
-10 -7 0 -19 -6 -26 -14 -6 -8 -18 -12 -26 -9 -8 3 -20 0 -27 -5 -7 -6 -55
-27 -107 -46 -52 -19 -90 -35 -84 -35 13 -1 101 27 131 41 13 6 26 8 29 5 4
-4 -6 -11 -21 -17 -38 -15 -24 -25 16 -11 18 6 40 11 51 11 29 0 100 51 93 68
-3 9 0 12 9 9 8 -3 20 1 26 9 7 8 19 14 28 14 8 0 13 2 10 5 -10 11 -158 15
-158 5z m48 -75 c-3 -3 -25 -7 -49 -10 -33 -3 -38 -2 -19 4 28 10 76 14 68 6z"/>
<path d="M5485 4449 c-16 -6 -17 -8 -3 -8 12 -1 18 -13 22 -43 12 -89 13 -91
15 -21 0 39 -2 74 -6 76 -5 3 -17 1 -28 -4z"/>
<path d="M3160 4390 c-8 -5 -12 -11 -9 -14 3 -3 14 1 25 9 21 16 8 20 -16 5z"/>
<path d="M1088 4373 c12 -2 30 -2 40 0 9 3 -1 5 -23 4 -22 0 -30 -2 -17 -4z"/>
<path d="M3315 4370 c3 -5 11 -10 16 -10 6 0 7 5 4 10 -3 6 -11 10 -16 10 -6
0 -7 -4 -4 -10z"/>
<path d="M3202 4339 c-7 -10 -8 -19 -3 -19 13 0 33 28 23 33 -4 3 -13 -3 -20
-14z"/>
<path d="M3275 4350 c-3 -5 -1 -10 4 -10 6 0 11 5 11 10 0 6 -2 10 -4 10 -3 0
-8 -4 -11 -10z"/>
<path d="M1159 4341 c11 -7 10 -10 -5 -14 -18 -4 -18 -5 0 -6 12 -1 16 -6 12
-16 -3 -10 1 -15 14 -15 10 0 36 -16 57 -35 42 -39 133 -95 154 -95 8 0 -18
21 -56 47 -39 25 -92 68 -119 95 -27 26 -54 48 -60 48 -6 0 -5 -4 3 -9z"/>
<path d="M1360 4344 c0 -6 65 -34 77 -34 9 1 -58 39 -69 40 -5 0 -8 -2 -8 -6z"/>
<path d="M3275 4320 c-3 -5 -1 -10 4 -10 6 0 11 5 11 10 0 6 -2 10 -4 10 -3 0
-8 -4 -11 -10z"/>
<path d="M3378 4323 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M871 4304 c0 -11 3 -14 6 -6 3 7 2 16 -1 19 -3 4 -6 -2 -5 -13z"/>
<path d="M4991 4294 c-93 -35 -175 -74 -168 -80 3 -3 13 -1 24 4 28 16 83 39
148 62 33 13 64 26 70 31 14 14 -3 10 -74 -17z"/>
<path d="M1450 4304 c0 -7 126 -64 142 -64 7 1 -20 16 -61 35 -78 37 -81 38
-81 29z"/>
<path d="M3412 4298 c-18 -18 -14 -33 4 -17 14 11 18 10 30 -6 8 -11 13 -24
11 -30 -2 -5 2 -16 10 -23 17 -18 17 -36 -1 -29 -10 4 -13 1 -9 -9 3 -7 11
-14 19 -14 17 0 37 -37 30 -56 -3 -8 -2 -13 3 -10 17 11 29 -82 15 -118 -3 -9
-12 -16 -20 -16 -8 0 -14 -7 -14 -15 0 -8 5 -15 10 -15 6 0 10 -23 10 -50 0
-45 -4 -53 -39 -85 -36 -33 -39 -40 -45 -106 -4 -39 -5 -73 -2 -76 6 -6 42 27
49 47 4 10 6 7 6 -8 1 -19 5 -21 27 -16 25 6 26 5 20 -20 -5 -20 -3 -26 9 -26
9 0 13 -5 10 -10 -4 -6 -1 -18 6 -26 15 -18 25 -129 11 -120 -6 3 -4 -14 3
-38 8 -24 10 -48 7 -52 -4 -4 -2 -4 4 -1 16 9 25 -18 11 -32 -8 -8 -8 -11 1
-11 7 0 12 -7 12 -15 0 -8 -6 -15 -12 -15 -10 0 -9 -3 1 -9 7 -5 14 -20 14
-35 0 -19 5 -26 19 -26 10 0 16 -4 13 -10 -3 -5 -2 -10 3 -10 10 0 32 -66 32
-96 0 -16 -2 -16 -14 -4 -8 8 -17 28 -20 44 -8 44 -16 44 -16 0 0 -44 7 -57
33 -67 10 -4 15 -11 12 -17 -8 -13 -35 -13 -35 0 0 6 -6 10 -14 10 -18 0 -27
-36 -16 -63 9 -21 9 -21 7 3 -1 14 3 25 8 26 6 0 9 -7 7 -18 -2 -13 5 -20 27
-24 17 -4 31 -11 31 -15 0 -5 14 -8 30 -7 22 2 30 7 30 21 0 14 5 17 18 13 11
-4 8 1 -8 15 -14 12 -24 25 -23 30 2 5 -2 20 -7 35 -9 21 -7 29 7 40 17 13 17
14 0 8 -13 -5 -16 -2 -11 10 3 9 11 16 18 16 12 0 36 -45 36 -67 0 -7 4 -13 8
-13 9 0 57 -91 54 -102 -4 -16 19 -7 25 10 4 9 11 20 17 24 7 5 5 8 -5 8 -25
0 -55 40 -79 105 -12 33 -32 74 -46 92 -14 19 -24 45 -24 65 0 19 -5 39 -12
46 -9 9 -9 12 -1 12 7 0 15 -4 18 -10 11 -18 26 -10 20 10 -3 11 -4 20 0 20 6
0 24 -44 30 -72 2 -9 9 -26 15 -38 6 -12 11 -38 10 -58 -3 -55 -1 -64 10 -57
6 3 10 -1 10 -9 0 -9 4 -16 8 -16 17 0 21 13 11 31 -6 12 -6 26 -1 35 7 13 12
11 27 -13 10 -15 24 -34 31 -40 7 -7 27 -39 45 -70 18 -31 34 -52 37 -45 2 7
10 12 17 12 8 0 -7 31 -36 74 -27 42 -46 81 -43 89 3 8 1 18 -5 22 -7 4 -8 -1
-4 -12 6 -16 5 -16 -10 -4 -25 20 -21 0 8 -39 26 -35 28 -40 21 -40 -9 0 -96
119 -96 131 0 6 9 0 21 -15 17 -22 24 -24 41 -15 17 9 23 8 31 -6 7 -13 11
-14 17 -5 8 12 70 -57 125 -138 32 -49 84 -96 94 -86 3 4 1 9 -5 11 -7 2 -9
14 -6 25 4 17 2 20 -12 15 -10 -4 -15 -3 -11 3 8 13 -65 117 -137 196 -29 32
-45 55 -35 51 10 -4 30 -7 44 -7 18 0 24 -4 19 -15 -3 -10 1 -15 11 -15 9 0
28 -10 42 -22 14 -13 20 -16 14 -8 -25 28 -12 33 16 6 16 -16 28 -33 27 -40
-2 -6 -1 -8 1 -3 8 13 25 7 20 -7 -3 -7 0 -13 8 -12 12 1 150 -124 157 -143 2
-5 32 -11 68 -15 50 -4 58 -3 35 4 -16 6 -39 12 -50 14 -11 3 -21 5 -22 7 -2
1 -7 2 -12 3 -13 2 -261 238 -261 249 0 4 4 6 8 3 4 -2 14 0 22 5 12 8 12 9
-3 7 -11 -2 -26 12 -44 41 l-26 45 29 -20 c16 -12 36 -24 44 -27 30 -14 90
-53 117 -77 15 -13 33 -25 38 -25 24 -2 65 -30 61 -41 -3 -8 -1 -16 4 -19 4
-3 10 0 12 6 2 6 15 2 31 -11 15 -12 24 -26 21 -32 -5 -7 -2 -8 5 -4 17 11 92
-43 89 -63 -2 -10 3 -15 14 -13 9 1 25 -9 36 -23 29 -37 36 -30 9 9 -20 31
-120 109 -257 202 -25 17 -63 43 -85 59 l-40 27 40 -5 c22 -4 34 -4 28 -1 -7
3 -13 12 -13 20 0 8 -7 14 -17 14 -9 0 -13 3 -10 6 9 9 69 -16 91 -38 10 -11
25 -17 34 -13 9 3 14 3 10 0 -3 -3 42 -31 100 -61 58 -30 120 -65 137 -78 46
-34 64 -41 32 -12 -15 14 -23 26 -17 26 18 0 71 -43 60 -50 -5 -3 1 -12 13
-19 20 -13 21 -13 8 2 -21 27 1 19 38 -13 18 -15 30 -33 26 -39 -3 -6 -11 -8
-17 -5 -7 4 -8 2 -4 -4 9 -14 16 -15 36 -2 12 7 11 13 -10 35 -39 41 -186 138
-288 189 -51 25 -92 52 -92 59 0 7 -19 20 -42 29 -39 15 -40 17 -15 17 29 1
269 -76 346 -111 25 -11 77 -36 114 -55 38 -19 66 -30 63 -24 -4 5 -40 26 -81
47 -41 21 -73 39 -71 41 6 7 255 -120 278 -141 15 -14 22 -16 31 -6 9 9 8 15
-7 25 -10 8 -15 18 -12 24 5 7 -3 9 -21 5 -21 -4 -61 11 -167 65 -77 39 -146
71 -153 71 -7 0 -13 7 -13 15 0 9 -9 15 -25 15 -14 0 -34 9 -45 20 -21 21 -46
28 -34 8 4 -7 3 -8 -5 -4 -6 4 -9 11 -6 16 3 5 -5 11 -17 13 -15 3 -11 5 13 6
19 0 58 -5 85 -13 27 -8 81 -19 119 -26 78 -12 336 -77 420 -105 14 -4 12 -2
-5 9 -28 17 -23 20 13 7 60 -23 127 -39 127 -30 0 5 -7 9 -15 9 -8 0 -15 4
-15 9 0 6 10 8 22 6 12 -3 25 -1 28 3 3 4 16 13 30 20 l25 11 -25 -5 c-43 -9
-93 -9 -129 0 -27 7 -32 6 -25 -5 6 -11 5 -12 -7 -3 -8 7 -30 15 -49 19 -19 4
-46 12 -60 18 -26 11 -36 14 -58 16 -7 0 -11 5 -8 10 3 4 -7 8 -22 8 -37 0
-172 35 -172 45 0 4 7 8 16 8 8 0 12 5 8 11 -5 8 8 10 42 5 27 -3 108 -8 179
-11 72 -3 166 -7 210 -9 l80 -5 -85 14 -85 14 80 -5 c44 -2 91 -6 105 -8 14
-1 50 -6 80 -11 30 -4 61 -12 68 -17 8 -8 12 -6 12 5 0 20 -64 34 -205 43
-106 6 -160 11 -160 14 0 1 -15 3 -33 5 -25 2 -32 -1 -28 -11 4 -11 -8 -14
-62 -13 -44 0 -60 3 -47 8 11 5 26 6 33 4 6 -3 12 0 12 6 0 6 -18 11 -42 11
-24 1 -130 5 -236 10 -169 8 -196 11 -208 27 -13 16 -14 17 -8 1 4 -12 1 -18
-10 -18 -9 0 -16 8 -16 18 0 11 -17 28 -42 42 -36 20 -39 24 -22 31 19 7 19 8
-1 10 -11 1 -27 2 -35 1 -13 -1 -158 45 -215 68 -11 5 -33 12 -50 16 -28 7
-28 8 -7 12 15 2 22 9 18 18 -4 11 7 14 58 14 34 0 87 -4 117 -10 175 -31 242
-41 247 -36 3 3 2 6 -2 6 -4 0 -60 9 -124 20 -64 11 -132 23 -151 26 -18 3
-31 7 -29 10 8 7 280 -35 336 -52 61 -18 68 -27 15 -19 -27 4 -32 3 -18 -4 30
-13 91 -25 82 -15 -4 4 3 14 15 21 13 7 16 13 8 12 -8 -1 -26 -1 -39 0 -20 1
-21 3 -11 16 11 13 5 15 -41 15 -30 0 -92 7 -139 15 -47 8 -102 15 -122 15
-20 0 -39 4 -43 10 -3 5 -12 7 -20 3 -8 -3 -15 -1 -15 5 0 6 -15 9 -32 8 -37
-3 -96 18 -80 28 18 11 212 36 287 37 49 0 64 3 50 9 -19 8 -19 9 2 9 12 1 24
-5 26 -11 4 -10 6 -10 6 0 1 9 35 12 135 12 140 0 194 -8 146 -21 -23 -6 -22
-7 8 -8 20 -1 31 3 27 9 -3 6 -2 10 4 10 5 0 11 -5 13 -12 2 -6 9 -8 16 -4 6
3 9 13 5 21 -4 13 -45 15 -255 15 -162 0 -256 -4 -270 -11 -11 -6 -18 -7 -14
-1 3 6 -22 8 -67 5 -116 -6 -56 22 133 63 36 8 119 27 185 44 174 44 321 70
390 70 54 0 61 3 72 25 11 24 10 25 -20 25 -29 0 -30 1 -11 15 25 19 11 19
-27 -1 -17 -8 -36 -13 -42 -11 -7 2 -20 0 -30 -5 -20 -10 -140 -38 -317 -73
-69 -13 -141 -29 -160 -34 -58 -16 -110 -22 -110 -11 0 5 20 21 45 36 25 14
44 28 41 31 -2 2 -12 0 -23 -6 -10 -5 -52 -24 -93 -41 l-75 -30 50 5 50 5 -35
-17 c-19 -10 -42 -26 -52 -35 -10 -10 -25 -18 -33 -18 -8 0 -15 -6 -15 -14 0
-9 -7 -12 -18 -9 -13 3 -18 -2 -19 -18 -3 -31 -25 -52 -81 -73 -58 -23 -87
-55 -44 -49 l27 3 -25 -11 c-14 -6 -33 -15 -42 -20 -10 -5 -35 -9 -55 -10 -33
0 -35 -1 -15 -9 33 -14 27 -17 -28 -16 -51 2 -63 -6 -33 -22 12 -7 4 -9 -30
-7 -57 4 -87 13 -87 27 0 5 7 8 15 4 8 -3 15 -1 15 3 0 5 -6 11 -12 14 -19 6
43 35 89 43 25 4 40 11 40 20 0 24 -47 28 -122 9 -40 -10 -78 -15 -86 -12 -9
4 -7 6 6 6 22 1 217 92 211 99 -8 8 -140 -42 -158 -60 -10 -10 -28 -18 -40
-18 -23 1 -23 1 2 16 17 10 18 13 5 9 -41 -14 -105 -18 -105 -6 0 6 -6 11 -13
11 -10 0 -14 17 -15 60 0 33 -3 64 -6 69 -4 5 0 11 6 13 9 3 13 31 12 99 -2
123 -5 139 -27 151 -11 5 -16 16 -13 24 3 9 1 12 -4 9 -6 -3 -10 2 -10 12 -1
15 -52 83 -63 83 -2 0 -8 -5 -15 -12z m1473 -256 c-12 -11 -109 -32 -138 -31
-18 1 -16 3 8 10 17 5 53 13 80 18 28 5 52 9 55 10 2 0 0 -3 -5 -7z m68 1 c-7
-2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0 19 -2 13 -5z m-236 -39 c-3 -3 -12 -4
-19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-122 -29 c-49 -12 -108 -25 -130 -28
-69 -11 -1 13 95 33 119 25 143 22 35 -5z m-1148 -267 c-3 -8 -6 -5 -6 6 -1
11 2 17 5 13 3 -3 4 -12 1 -19z m746 15 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5
14 0 19 -2 13 -5z m-746 -55 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1
-19z m148 12 c3 -5 1 -10 -4 -10 -6 0 -11 5 -11 10 0 6 2 10 4 10 3 0 8 -4 11
-10z m45 -28 c0 -13 -12 -22 -22 -16 -10 6 -1 24 13 24 5 0 9 -4 9 -8z m365
-2 c3 -5 19 -10 34 -10 16 0 44 -6 62 -14 19 -7 45 -17 59 -20 l25 -7 -25 15
c-14 9 -22 15 -19 16 18 1 183 -61 198 -74 10 -9 24 -16 32 -16 12 0 12 -2 0
-9 -11 -7 -9 -10 8 -16 28 -9 22 -29 -10 -32 -53 -3 -292 36 -308 51 -10 9
-20 16 -24 16 -5 0 -75 45 -85 55 -2 2 7 2 20 -1 12 -3 3 4 -21 14 -48 21 -42
38 10 27 22 -5 29 -4 25 4 -4 6 -3 11 3 11 5 0 13 -4 16 -10z m96 -8 c-7 -2
-18 1 -23 6 -8 8 -4 9 13 5 13 -4 18 -8 10 -11z m-501 -17 c13 -14 21 -28 17
-31 -8 -8 -56 28 -57 44 0 19 14 14 40 -13z m115 -15 c5 -8 11 -8 20 0 10 8
21 8 41 -3 l28 -14 -29 0 c-16 0 -32 -8 -38 -18 -8 -15 -11 -13 -25 14 -10 22
-20 30 -31 26 -8 -3 -12 -3 -8 1 4 4 -1 13 -11 21 -12 10 -9 10 15 -1 17 -9
35 -21 38 -26z m-115 -36 c12 -31 12 -34 2 -34 -4 0 -13 14 -19 30 -6 17 -7
30 -2 30 5 0 14 -12 19 -26z m56 2 c20 -21 17 -28 -6 -16 -11 6 -20 15 -20 20
0 14 9 12 26 -4z m290 -21 c-3 -8 2 -16 10 -19 10 -4 13 -1 9 7 -4 6 -1 5 7
-3 7 -8 20 -16 28 -18 26 -6 81 -53 90 -77 5 -12 18 -25 29 -28 32 -8 25 -23
-9 -21 -59 4 -130 26 -123 37 3 7 2 9 -2 4 -13 -11 -64 43 -58 62 4 14 3 14
-6 1 -6 -8 -11 -12 -11 -7 0 18 -2 23 -16 30 -12 7 -12 10 1 23 8 8 20 12 27
8 8 -5 9 -2 5 9 -4 11 -2 14 9 10 8 -3 13 -11 10 -18z m-59 9 c-3 -3 -12 -4
-19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-174 -21 c-7 -2 -19 -2 -25 0 -7 3
-2 5 12 5 14 0 19 -2 13 -5z m-68 -13 c3 -5 1 -10 -4 -10 -6 0 -11 5 -11 10 0
6 2 10 4 10 3 0 8 -4 11 -10z m163 -72 c7 -16 8 -28 2 -28 -12 0 -35 36 -45
69 -7 23 -7 24 12 5 10 -10 24 -31 31 -46z m156 -57 c-5 -5 -75 73 -87 98 -5
9 14 -9 42 -39 27 -30 48 -56 45 -59z m-69 52 c27 -32 33 -44 20 -39 -11 5
-28 9 -37 10 -9 0 -15 3 -13 6 2 3 -3 19 -11 35 -8 17 -12 22 -9 12 3 -10 1
-15 -5 -12 -14 9 -12 35 3 35 6 -1 30 -22 52 -47z m-286 7 c7 -23 7 -29 -1
-24 -7 5 -9 0 -6 -13 3 -12 2 -26 -2 -33 -5 -8 -10 -2 -14 16 -4 16 -3 30 2
32 5 1 7 14 4 27 -6 35 4 31 17 -5z m606 20 c3 -5 27 -10 53 -11 26 0 63 -7
82 -14 35 -14 35 -14 5 -11 -16 1 -37 6 -45 9 -8 4 -46 8 -84 9 -45 2 -71 7
-74 16 -5 15 54 17 63 2z m618 -37 c-7 -2 -19 -2 -25 0 -7 3 -2 5 12 5 14 0
19 -2 13 -5z m-608 -21 c-3 -3 -11 0 -18 7 -9 10 -8 11 6 5 10 -3 15 -9 12
-12z m240 8 c13 -6 5 -7 -25 -3 -25 3 -47 7 -49 9 -9 8 55 2 74 -6z m142 4
c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-802 -44 c10 -11 13
-20 7 -20 -6 0 -16 9 -22 20 -6 11 -9 20 -7 20 2 0 12 -9 22 -20z m110 -1 c11
-17 -1 -21 -15 -4 -8 9 -8 15 -2 15 6 0 14 -5 17 -11z m-192 -19 c3 -11 1 -18
-4 -14 -5 3 -9 12 -9 20 0 20 7 17 13 -6z m502 10 c3 -5 1 -10 -4 -10 -6 0
-11 5 -11 10 0 6 2 10 4 10 3 0 8 -4 11 -10z m458 3 c-7 -2 -19 -2 -25 0 -7 3
-2 5 12 5 14 0 19 -2 13 -5z m-548 -13 c3 -6 -1 -7 -9 -4 -18 7 -21 14 -7 14
6 0 13 -4 16 -10z m705 -16 c30 -8 60 -16 65 -17 6 -1 24 -8 40 -14 17 -7 50
-17 74 -23 23 -6 41 -14 38 -17 -3 -2 -50 9 -104 25 -54 17 -133 38 -175 47
-43 9 -78 19 -78 22 0 7 74 -6 140 -23z m-1200 -47 c0 -16 -18 3 -23 25 -6 22
-5 22 8 4 8 -11 15 -24 15 -29z m374 27 c3 -8 2 -12 -4 -9 -6 3 -10 10 -10 16
0 14 7 11 14 -7z m-334 -30 c0 -8 -4 -12 -10 -9 -5 3 -10 13 -10 21 0 8 5 12
10 9 6 -3 10 -13 10 -21z m170 -16 c0 -12 3 -19 6 -15 10 9 36 -21 29 -33 -4
-7 -16 0 -30 16 -13 15 -22 31 -19 36 3 4 0 8 -6 8 -6 0 -8 5 -5 10 10 16 25
2 25 -22z m155 2 c3 -5 2 -10 -4 -10 -5 0 -13 5 -16 10 -3 6 -2 10 4 10 5 0
13 -4 16 -10z m-323 -35 c7 -32 -8 -54 -14 -23 -3 12 -9 31 -13 41 -5 13 -3
16 8 11 8 -3 17 -16 19 -29z m948 25 c8 -5 11 -10 5 -10 -5 0 -17 5 -25 10 -8
5 -10 10 -5 10 6 0 17 -5 25 -10z m550 -10 c13 -9 13 -10 0 -10 -8 0 -22 5
-30 10 -13 9 -13 10 0 10 8 0 22 -5 30 -10z m-730 -30 c8 -5 11 -10 5 -10 -5
0 -17 5 -25 10 -8 5 -10 10 -5 10 6 0 17 -5 25 -10z m-369 -162 c10 -20 24
-38 31 -41 9 -4 9 -6 1 -6 -6 -1 -26 18 -45 41 -35 46 -57 72 -100 122 -15 17
-28 36 -27 41 0 16 120 -117 140 -157z m476 96 c-5 -5 -77 35 -77 42 0 3 18
-5 41 -16 23 -12 39 -24 36 -26z m-592 -125 c9 -16 12 -29 7 -29 -7 0 -20 20
-40 64 -11 23 20 -9 33 -35z"/>
<path d="M4220 3584 c56 -25 116 -46 105 -36 -13 11 -115 52 -129 52 -6 -1 5
-8 24 -16z"/>
<path d="M5180 4299 c0 -5 5 -7 10 -4 6 3 10 8 10 11 0 2 -4 4 -10 4 -5 0 -10
-5 -10 -11z"/>
<path d="M4916 4291 c-4 -5 3 -7 14 -4 23 6 26 13 6 13 -8 0 -17 -4 -20 -9z"/>
<path d="M1560 4285 c0 -3 27 -17 59 -31 40 -18 58 -30 54 -40 -5 -13 39 -31
66 -25 7 1 10 -2 6 -8 -4 -7 0 -8 11 -4 13 5 15 3 9 -7 -5 -8 -4 -11 3 -6 6 3
17 0 24 -8 8 -7 25 -17 38 -21 14 -4 41 -18 60 -30 19 -12 41 -20 49 -17 8 3
11 0 7 -6 -7 -11 21 -25 35 -16 5 3 8 0 7 -8 -2 -7 2 -12 9 -11 6 1 17 -4 23
-12 13 -16 35 -21 26 -6 -3 5 6 11 21 14 20 4 55 -10 133 -50 113 -60 119 -62
255 -98 121 -31 153 -44 136 -54 -9 -6 -3 -10 17 -14 16 -3 36 -13 44 -21 19
-19 88 -32 88 -17 0 6 -9 11 -19 11 -11 0 -32 11 -48 24 -15 13 -46 29 -68 37
-22 7 -44 16 -50 20 -5 4 -26 10 -45 14 -49 10 -129 34 -167 51 -17 8 -35 14
-39 14 -16 0 -144 64 -144 72 0 4 -8 8 -17 8 -10 0 -27 7 -37 15 -11 8 -27 15
-35 15 -14 0 -14 -1 -1 -10 13 -8 12 -10 -2 -10 -10 0 -18 5 -18 10 0 6 -9 10
-20 10 -11 0 -118 50 -239 110 -214 108 -231 115 -231 105z m165 -85 c3 -5 -4
-6 -15 -3 -11 3 -22 9 -25 13 -3 5 4 6 15 3 11 -3 22 -9 25 -13z"/>
<path d="M4868 4273 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M5168 4273 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M869 4135 c-3 -66 -8 -129 -11 -140 -3 -11 -3 -14 -1 -7 3 6 8 12 13
12 5 0 11 -6 13 -12 8 -18 6 114 -2 197 -7 69 -7 68 -12 -50z"/>
<path d="M3260 4239 c0 -5 9 -9 19 -9 11 0 22 4 25 9 3 5 -6 9 -19 9 -14 0
-25 -4 -25 -9z"/>
<path d="M4725 4204 c-63 -31 -80 -43 -55 -38 19 3 42 12 51 20 8 8 18 14 21
14 3 0 26 11 49 25 70 40 32 28 -66 -21z"/>
<path d="M4785 4200 c-3 -5 -2 -10 4 -10 5 0 13 5 16 10 3 6 2 10 -4 10 -5 0
-13 -4 -16 -10z"/>
<path d="M4745 4180 c-3 -6 1 -7 9 -4 18 7 21 14 7 14 -6 0 -13 -4 -16 -10z"/>
<path d="M4603 4150 c-13 -5 -23 -12 -23 -15 0 -9 16 -5 36 10 22 16 19 18
-13 5z"/>
<path d="M5023 4143 c9 -2 23 -2 30 0 6 3 -1 5 -18 5 -16 0 -22 -2 -12 -5z"/>
<path d="M4980 4124 c-13 -15 -6 -17 24 -5 17 6 17 8 3 14 -8 3 -21 -1 -27 -9z"/>
<path d="M5511 4114 c0 -11 3 -14 6 -6 3 7 2 16 -1 19 -3 4 -6 -2 -5 -13z"/>
<path d="M4543 4113 c9 -2 14 -9 11 -15 -4 -7 -2 -8 5 -4 15 10 4 26 -17 25
-15 -1 -15 -2 1 -6z"/>
<path d="M4930 4100 c-9 -6 -10 -10 -3 -10 6 0 15 5 18 10 8 12 4 12 -15 0z"/>
<path d="M3430 4087 c0 -8 7 -18 16 -21 11 -4 14 -1 12 11 -4 21 -28 30 -28
10z"/>
<path d="M4471 4081 c-31 -24 -11 -37 26 -17 16 8 22 15 15 16 -7 0 -10 5 -7
10 10 16 -8 11 -34 -9z m29 -5 c0 -2 -7 -7 -16 -10 -8 -3 -12 -2 -9 4 6 10 25
14 25 6z"/>
<path d="M3493 4073 c-18 -7 -16 -33 2 -33 8 0 15 9 15 20 0 11 -1 20 -2 19
-2 0 -9 -3 -15 -6z"/>
<path d="M5506 4062 c-7 -11 1 -263 8 -270 3 -3 6 58 6 136 0 135 -2 153 -14
134z"/>
<path d="M1958 4034 c24 -14 46 -24 49 -21 5 6 -69 47 -84 47 -4 0 11 -12 35
-26z"/>
<path d="M4408 4049 c-10 -5 -18 -15 -18 -21 0 -9 3 -9 12 0 7 7 20 12 31 12
10 0 15 5 12 10 -8 12 -15 12 -37 -1z"/>
<path d="M3430 4038 c0 -4 -7 -5 -15 -2 -8 4 -15 1 -15 -6 0 -6 9 -14 20 -17
11 -3 20 -9 20 -15 0 -5 8 -4 19 2 25 13 17 49 -10 47 -10 -1 -19 -5 -19 -9z"/>
<path d="M3077 4033 c-12 -12 -7 -22 8 -17 8 4 15 10 15 15 0 11 -14 12 -23 2z"/>
<path d="M2082 4014 c10 -10 20 -15 24 -12 3 4 -5 12 -18 18 -22 12 -22 12 -6
-6z"/>
<path d="M878 3925 c2 -19 6 -35 8 -35 2 0 4 16 4 35 0 19 -4 35 -8 35 -4 0
-6 -16 -4 -35z"/>
<path d="M4895 3950 c-3 -5 -2 -10 4 -10 5 0 13 5 16 10 3 6 2 10 -4 10 -5 0
-13 -4 -16 -10z"/>
<path d="M4790 3900 c-9 -6 -10 -10 -3 -10 6 0 15 5 18 10 8 12 4 12 -15 0z"/>
<path d="M3960 3874 l-35 -14 35 6 c19 4 44 10 55 15 l20 8 -20 0 c-11 0 -36
-7 -55 -15z"/>
<path d="M1881 3836 c2 -2 27 -6 54 -9 34 -4 42 -3 25 3 -25 8 -87 13 -79 6z"/>
<path d="M796 3798 c-3 -13 -5 -34 -5 -48 1 -15 5 -7 10 19 9 47 6 68 -5 29z"/>
<path d="M3920 3800 c-8 -5 -12 -11 -10 -14 3 -2 14 2 24 10 22 15 10 19 -14
4z"/>
<path d="M3865 3770 c-3 -5 -1 -10 4 -10 6 0 11 5 11 10 0 6 -2 10 -4 10 -3 0
-8 -4 -11 -10z"/>
<path d="M3950 3739 c0 -5 5 -7 10 -4 6 3 10 8 10 11 0 2 -4 4 -10 4 -5 0 -10
-5 -10 -11z"/>
<path d="M3387 3683 c-13 -28 -13 -33 -3 -18 9 11 20 25 26 32 12 15 13 23 2
23 -5 0 -16 -17 -25 -37z"/>
<path d="M772 3669 c-5 -19 -6 -38 -3 -44 3 -5 9 8 12 30 9 50 3 58 -9 14z"/>
<path d="M2980 3690 c0 -6 7 -10 15 -10 8 0 15 2 15 4 0 2 -7 6 -15 10 -8 3
-15 1 -15 -4z"/>
<path d="M4110 3685 c0 -8 5 -15 10 -15 6 0 10 7 10 15 0 8 -4 15 -10 15 -5 0
-10 -7 -10 -15z"/>
<path d="M2880 3634 c0 -8 5 -12 10 -9 6 4 8 11 5 16 -9 14 -15 11 -15 -7z"/>
<path d="M4640 3639 c0 -5 5 -7 10 -4 6 3 10 8 10 11 0 2 -4 4 -10 4 -5 0 -10
-5 -10 -11z"/>
<path d="M2970 3620 c0 -5 9 -14 20 -20 22 -12 27 -1 8 18 -14 14 -28 16 -28
2z"/>
<path d="M500 3601 c0 -25 6 -27 13 -6 4 8 2 17 -3 20 -6 4 -10 -3 -10 -14z"/>
<path d="M1815 3610 c3 -5 11 -10 16 -10 6 0 7 5 4 10 -3 6 -11 10 -16 10 -6
0 -7 -4 -4 -10z"/>
<path d="M3452 3595 c0 -16 2 -22 5 -12 2 9 2 23 0 30 -3 6 -5 -1 -5 -18z"/>
<path d="M761 3594 c0 -11 3 -14 6 -6 3 7 2 16 -1 19 -3 4 -6 -2 -5 -13z"/>
<path d="M2278 3603 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M3030 3576 c0 -9 5 -16 10 -16 6 0 10 4 10 9 0 6 -4 13 -10 16 -5 3
-10 -1 -10 -9z"/>
<path d="M3416 3565 c-22 -34 -20 -43 4 -15 18 21 26 40 16 40 -2 0 -11 -11
-20 -25z"/>
<path d="M4418 3573 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M3534 3529 c3 -17 6 -40 6 -51 0 -10 4 -17 9 -13 6 3 6 18 1 36 -5
16 -6 37 -3 45 3 8 0 14 -7 14 -9 0 -11 -10 -6 -31z"/>
<path d="M746 3488 c-9 -84 -13 -299 -6 -338 3 -19 8 60 11 175 3 116 4 212 3
213 -1 2 -5 -20 -8 -50z"/>
<path d="M5611 3504 c0 -11 3 -14 6 -6 3 7 2 16 -1 19 -3 4 -6 -2 -5 -13z"/>
<path d="M3520 3455 c-1 -12 -4 -15 -7 -7 -4 10 -8 9 -19 -5 -16 -21 -18 -62
-4 -83 8 -13 10 -12 10 3 0 19 19 58 34 68 4 4 3 15 -3 25 -10 18 -10 18 -11
-1z"/>
<path d="M4995 3450 c-3 -5 1 -10 10 -10 9 0 13 5 10 10 -3 6 -8 10 -10 10 -2
0 -7 -4 -10 -10z"/>
<path d="M2940 3429 c0 -5 5 -7 10 -4 6 3 10 8 10 11 0 2 -4 4 -10 4 -5 0 -10
-5 -10 -11z"/>
<path d="M3447 3397 c-3 -9 -1 -19 4 -23 7 -4 8 -21 4 -41 -4 -24 -3 -33 4
-28 12 7 13 60 2 89 -7 17 -8 18 -14 3z"/>
<path d="M1358 3393 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M5323 3393 c9 -2 23 -2 30 0 6 3 -1 5 -18 5 -16 0 -22 -2 -12 -5z"/>
<path d="M1285 3375 c-40 -14 -40 -14 -5 -8 19 3 42 9 50 14 22 12 1 9 -45 -6z"/>
<path d="M5403 3383 c9 -2 15 -9 12 -14 -4 -5 -2 -9 3 -9 6 0 12 7 16 15 4 11
-2 15 -22 14 -17 -1 -20 -3 -9 -6z"/>
<path d="M2957 3353 c-4 -3 -8 -22 -8 -42 l-2 -36 -6 35 c-4 23 -9 31 -14 23
-6 -10 18 -83 28 -83 1 0 3 21 4 47 2 72 11 64 11 -11 0 -42 4 -65 10 -61 6 4
10 -6 10 -24 0 -16 5 -33 10 -36 14 -9 5 62 -11 81 -6 8 -9 27 -6 43 10 46 -6
85 -26 64z"/>
<path d="M3421 3324 c0 -11 3 -14 6 -6 3 7 2 16 -1 19 -3 4 -6 -2 -5 -13z"/>
<path d="M1108 3323 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M3382 3270 c0 -27 3 -50 9 -50 5 0 9 12 9 28 0 15 3 37 6 50 5 15 2
22 -8 22 -11 0 -15 -14 -16 -50z"/>
<path d="M3750 3301 c0 -6 4 -13 10 -16 6 -3 7 1 4 9 -7 18 -14 21 -14 7z"/>
<path d="M3451 3224 c0 -11 3 -14 6 -6 3 7 2 16 -1 19 -3 4 -6 -2 -5 -13z"/>
<path d="M5150 3230 c20 -13 33 -13 25 0 -3 6 -14 10 -23 10 -15 0 -15 -2 -2
-10z"/>
<path d="M1277 3219 c7 -7 15 -10 18 -7 3 3 -2 9 -12 12 -14 6 -15 5 -6 -5z"/>
<path d="M2250 3199 c0 -5 5 -7 10 -4 6 3 10 8 10 11 0 2 -4 4 -10 4 -5 0 -10
-5 -10 -11z"/>
<path d="M5090 3189 c0 -5 5 -7 10 -4 6 3 10 8 10 11 0 2 -4 4 -10 4 -5 0 -10
-5 -10 -11z"/>
<path d="M3020 3179 c0 -5 5 -7 10 -4 6 3 10 8 10 11 0 2 -4 4 -10 4 -5 0 -10
-5 -10 -11z"/>
<path d="M5000 3180 l-45 -7 45 -1 c25 -1 52 3 60 8 18 11 13 11 -60 0z"/>
<path d="M2377 3173 c-3 -5 1 -14 9 -20 14 -14 30 0 19 17 -7 12 -22 13 -28 3z"/>
<path d="M3311 3154 c0 -11 3 -14 6 -6 3 7 2 16 -1 19 -3 4 -6 -2 -5 -13z"/>
<path d="M3027 3136 c3 -14 16 -34 29 -47 l23 -22 -3 29 c-6 45 -17 64 -36 64
-13 0 -16 -6 -13 -24z"/>
<path d="M4841 3156 c2 -2 15 -9 29 -15 24 -11 24 -11 6 3 -16 13 -49 24 -35
12z"/>
<path d="M2687 3143 c-4 -3 -7 -11 -7 -17 0 -6 5 -5 12 2 6 6 9 14 7 17 -3 3
-9 2 -12 -2z"/>
<path d="M747 3025 c3 -49 9 -94 13 -98 8 -9 3 55 -10 138 -6 36 -7 25 -3 -40z"/>
<path d="M4180 3102 c0 -5 7 -15 15 -22 8 -7 15 -9 15 -6 0 4 -7 14 -15 22 -8
9 -15 11 -15 6z"/>
<path d="M4718 3103 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M3269 3080 c-2 -14 -10 -24 -17 -22 -6 1 -12 -2 -12 -8 0 -15 30 -12
36 4 3 8 4 23 2 33 -4 14 -6 12 -9 -7z"/>
<path d="M3577 3093 c-4 -3 -7 -11 -7 -17 0 -6 5 -5 12 2 6 6 9 14 7 17 -3 3
-9 2 -12 -2z"/>
<path d="M3097 3070 c3 -11 7 -20 9 -20 2 0 4 9 4 20 0 11 -4 20 -9 20 -5 0
-7 -9 -4 -20z"/>
<path d="M1568 3073 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M1628 3073 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M4257 3020 c12 -19 27 -36 34 -39 7 -2 2 10 -10 27 -31 44 -50 53
-24 12z"/>
<path d="M4553 3035 c0 -8 5 -11 10 -8 6 3 26 6 46 5 28 0 32 1 16 8 -33 14
-72 12 -72 -5z"/>
<path d="M3130 3016 c0 -8 5 -18 10 -21 6 -3 10 1 10 9 0 8 -4 18 -10 21 -5 3
-10 -1 -10 -9z"/>
<path d="M4160 3010 c0 -9 39 -25 46 -18 2 3 -7 10 -21 16 -14 6 -25 7 -25 2z"/>
<path d="M4003 2993 c-18 -7 -16 -23 2 -23 8 0 15 -4 15 -10 0 -5 7 -10 15
-10 18 0 20 16 3 23 -7 3 -4 6 7 6 17 1 17 3 5 11 -16 10 -28 11 -47 3z"/>
<path d="M2890 2975 c0 -8 4 -15 10 -15 5 0 7 7 4 15 -4 8 -8 15 -10 15 -2 0
-4 -7 -4 -15z"/>
<path d="M4227 2979 c7 -7 15 -10 18 -7 3 3 -2 9 -12 12 -14 6 -15 5 -6 -5z"/>
<path d="M1708 2973 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/>
<path d="M4465 2970 c3 -5 14 -10 23 -10 15 0 15 2 2 10 -20 13 -33 13 -25 0z"/>
<path d="M2865 2960 c3 -5 8 -10 11 -10 2 0 4 5 4 10 0 6 -5 10 -11 10 -5 0
-7 -4 -4 -10z"/>
<path d="M2600 2889 c0 -5 5 -7 10 -4 6 3 10 8 10 11 0 2 -4 4 -10 4 -5 0 -10
-5 -10 -11z"/>
<path d="M5510 2660 c-3 -102 -3 -230 0 -285 l5 -100 5 140 c3 77 3 205 0 285
l-6 145 -4 -185z"/>
<path d="M791 2744 c0 -11 3 -14 6 -6 3 7 2 16 -1 19 -3 4 -6 -2 -5 -13z"/>
<path d="M881 2625 c-8 -48 -9 -156 -4 -230 10 -129 19 -40 12 115 -3 74 -7
126 -8 115z"/>
<path d="M2710 2489 c0 -16 29 -41 40 -34 6 4 5 13 -3 25 -13 21 -37 27 -37 9z"/>
<path d="M1177 2344 c-4 -4 -7 -20 -7 -36 0 -23 4 -29 18 -26 11 3 16 12 14
28 -3 28 -15 44 -25 34z"/>
<path d="M1150 2270 c0 -5 5 -10 11 -10 5 0 7 5 4 10 -3 6 -8 10 -11 10 -2 0
-4 -4 -4 -10z"/>
<path d="M1290 2229 c0 -5 5 -7 10 -4 6 3 10 8 10 11 0 2 -4 4 -10 4 -5 0 -10
-5 -10 -11z"/>
<path d="M2665 2170 c3 -5 8 -10 11 -10 2 0 4 5 4 10 0 6 -5 10 -11 10 -5 0
-7 -4 -4 -10z"/>
<path d="M1050 2057 c0 -11 70 -137 76 -137 10 0 1 19 -36 80 -22 36 -40 61
-40 57z"/>
<path d="M1141 1894 c0 -11 3 -14 6 -6 3 7 2 16 -1 19 -3 4 -6 -2 -5 -13z"/>
<path d="M3768 1883 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
<path d="M1160 1865 c0 -8 4 -15 10 -15 5 0 7 7 4 15 -4 8 -8 15 -10 15 -2 0
-4 -7 -4 -15z"/>
<path d="M3690 1860 c6 -11 13 -20 16 -20 2 0 0 9 -6 20 -6 11 -13 20 -16 20
-2 0 0 -9 6 -20z"/>
<path d="M1190 1822 c6 -13 14 -21 18 -18 3 4 -2 14 -12 24 -18 16 -18 16 -6
-6z"/>
<path d="M3541 1824 c0 -11 3 -14 6 -6 3 7 2 16 -1 19 -3 4 -6 -2 -5 -13z"/>
<path d="M3650 1790 c0 -5 10 -10 23 -10 18 0 19 2 7 10 -19 13 -30 13 -30 0z"/>
<path d="M3659 1758 c-12 -8 -11 -9 2 -5 9 3 22 0 28 -6 6 -6 13 -8 17 -5 12
12 -31 27 -47 16z"/>
<path d="M3710 1707 c8 -7 20 -19 27 -26 9 -11 11 -10 9 3 -2 18 -23 36 -41
36 -5 -1 -3 -6 5 -13z"/>
<path d="M3760 1630 c0 -5 5 -10 11 -10 5 0 7 5 4 10 -3 6 -8 10 -11 10 -2 0
-4 -4 -4 -10z"/>
<path d="M3532 1580 c0 -14 2 -19 5 -12 2 6 2 18 0 25 -3 6 -5 1 -5 -13z"/>
<path d="M3791 1574 c0 -11 3 -14 6 -6 3 7 2 16 -1 19 -3 4 -6 -2 -5 -13z"/>
<path d="M3876 1473 c-12 -12 -6 -31 12 -38 14 -5 15 -4 5 6 -18 18 -16 30 2
23 8 -4 15 -4 15 -1 0 8 -28 16 -34 10z"/>
<path d="M3861 1374 c0 -11 3 -14 6 -6 3 7 2 16 -1 19 -3 4 -6 -2 -5 -13z"/>
<path d="M3935 1360 c3 -5 11 -10 16 -10 6 0 7 5 4 10 -3 6 -11 10 -16 10 -6
0 -7 -4 -4 -10z"/>
<path d="M4110 1300 c0 -5 5 -10 11 -10 5 0 7 5 4 10 -3 6 -8 10 -11 10 -2 0
-4 -4 -4 -10z"/>
<path d="M3700 1236 c0 -2 7 -7 16 -10 8 -3 12 -2 9 4 -6 10 -25 14 -25 6z"/>
<path d="M4130 1211 c0 -6 4 -13 10 -16 6 -3 7 1 4 9 -7 18 -14 21 -14 7z"/>
<path d="M4133 1160 c14 -63 18 -138 9 -144 -22 -13 -211 91 -237 130 -9 14
-19 23 -22 20 -3 -2 -5 -56 -4 -119 2 -119 -3 -151 -23 -140 -6 4 -5 0 2 -9 8
-9 20 -14 28 -11 19 7 21 36 8 172 -5 50 -3 62 8 59 7 -3 13 -12 12 -20 -1 -8
9 -15 24 -16 13 -1 39 -11 57 -22 18 -11 38 -20 45 -20 6 0 24 -8 38 -19 15
-10 39 -21 54 -25 25 -6 27 -4 30 31 4 46 -11 134 -25 148 -6 7 -8 2 -4 -15z"/>
<path d="M1561 1144 c0 -11 3 -14 6 -6 3 7 2 16 -1 19 -3 4 -6 -2 -5 -13z"/>
<path d="M4173 1153 c9 -2 23 -2 30 0 6 3 -1 5 -18 5 -16 0 -22 -2 -12 -5z"/>
<path d="M872 1125 c0 -16 2 -22 5 -12 2 9 2 23 0 30 -3 6 -5 -1 -5 -18z"/>
<path d="M866 1053 c-3 -21 -6 -82 -6 -135 l0 -98 53 2 52 1 -45 6 -45 6 4
128 c3 128 -1 159 -13 90z"/>
<path d="M3624 1067 c-3 -10 -2 -23 4 -29 6 -6 8 -17 5 -25 -3 -7 -2 -13 3
-11 15 5 74 -24 68 -33 -3 -5 3 -9 13 -9 10 0 35 -11 55 -25 20 -14 45 -25 55
-25 10 0 1 9 -22 21 -61 32 -144 99 -160 128 -12 23 -14 24 -21 8z"/>
<path d="M3655 1070 c-3 -5 -1 -10 4 -10 6 0 11 5 11 10 0 6 -2 10 -4 10 -3 0
-8 -4 -11 -10z"/>
<path d="M3400 951 c0 -42 -4 -39 125 -81 21 -7 46 -19 53 -27 19 -19 45 -13
48 12 11 68 15 139 8 132 -4 -4 -9 -20 -11 -35 -4 -41 -25 -102 -35 -102 -4 0
-8 5 -8 10 0 6 -5 10 -11 10 -6 0 -24 9 -39 20 -20 14 -29 17 -32 8 -3 -8 -19
-1 -48 20 -27 20 -37 32 -27 32 10 0 25 -9 34 -20 10 -11 22 -20 27 -20 6 0
-8 18 -29 40 -21 22 -43 40 -47 40 -4 0 -8 -17 -8 -39z"/>
<path d="M3355 939 c-4 -6 -5 -13 -2 -16 7 -7 27 6 27 18 0 12 -17 12 -25 -2z"/>
<path d="M5500 883 l0 -62 -57 -6 c-98 -10 -101 -13 -15 -12 l84 2 4 53 c2 29
0 61 -6 70 -7 13 -9 0 -10 -45z"/>
<path d="M3374 808 c-3 -4 15 -8 40 -8 25 0 47 4 50 8 2 4 -16 8 -40 8 -25 0
-48 -4 -50 -8z"/>
<path d="M3488 813 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 61 KiB

View File

@ -0,0 +1,19 @@
{
"name": "Nexus Cognitron",
"short_name": "Nexus Cognitron",
"icons": [
{
"src": "/android-chrome-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/android-chrome-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"theme_color": "#ffffff",
"background_color": "#ffffff",
"display": "standalone"
}

View File

@ -1,6 +1,6 @@
load("@io_bazel_rules_docker//python3:image.bzl", "py3_image")
load("@pip_modules_external//:requirements.bzl", "requirement")
load("@pip_modules//:requirements.bzl", "requirement")
alias(
name = "binary",

View File

@ -1,4 +1,4 @@
load("@pip_modules_external//:requirements.bzl", "requirement")
load("@pip_modules//:requirements.bzl", "requirement")
load("@rules_python//python:defs.bzl", "py_library")
py_library(

View File

@ -2,7 +2,7 @@ import re
from emoji import get_emoji_regexp
ALNUMWHITESPACE_REGEX = re.compile(r'([^\s\w])+')
NON_ALNUMWHITESPACE_REGEX = re.compile(r'([^\s\w])+')
EMAIL_REGEX = re.compile(r'([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})')
EMOJI_REGEX = get_emoji_regexp()
HASHTAG_REGEX = re.compile(r'([#@]+)([A-Za-z0-9_]+)')

View File

@ -1,4 +1,4 @@
load("@pip_modules_external//:requirements.bzl", "requirement")
load("@pip_modules//:requirements.bzl", "requirement")
load("@rules_python//python:defs.bzl", "py_test")
py_test(

View File

@ -3,11 +3,11 @@ import struct
import unicodedata
from .regex import (
ALNUMWHITESPACE_REGEX,
EMAIL_REGEX,
EMOJI_REGEX,
HASHTAG_REGEX,
MULTIWHITESPACE_REGEX,
NON_ALNUMWHITESPACE_REGEX,
TELEGRAM_LINK_REGEX,
URL_REGEX,
)
@ -23,7 +23,7 @@ def add_surrogate(text):
def cast_string_to_single_string(s):
processed = MULTIWHITESPACE_REGEX.sub(' ', ALNUMWHITESPACE_REGEX.sub(' ', s))
processed = MULTIWHITESPACE_REGEX.sub(' ', NON_ALNUMWHITESPACE_REGEX.sub(' ', s))
processed = processed.strip().replace(' ', '-')
return processed

View File

@ -1,6 +1,6 @@
load("@io_bazel_rules_docker//python3:image.bzl", "py3_image")
load("@pip_modules_external//:requirements.bzl", "requirement")
load("@pip_modules//:requirements.bzl", "requirement")
alias(
name = "binary",
@ -28,8 +28,8 @@ py3_image(
"//library/configurator",
"//library/logging",
"//nexus/actions",
"//nexus/cognitron/schema",
"//nexus/models/proto:models_proto_py",
"//nexus/summa/schema",
requirement("aiosumma"),
requirement("izihawa_utils"),
],

View File

@ -86,8 +86,8 @@ class CrossReferencesProcessor(Processor):
)
continue
source = canonize_doi(message.source)
target = canonize_doi(message.target)
source = canonize_doi(message.source.strip())
target = canonize_doi(message.target.strip())
target_row = await self.pool_holder.execute(
PostgreSQLQuery
.from_('scimag')

View File

@ -1,5 +1,5 @@
load("@rules_python//python:defs.bzl", "py_binary", "py_library")
load("@pip_modules_external//:requirements.bzl", "requirement")
load("@pip_modules//:requirements.bzl", "requirement")
py_library(
name = "pylon",

View File

@ -49,4 +49,4 @@ class LibraryLolSource(LibgenNewSource):
base_url = 'http://library.lol'
resolve_timeout = 10
ssl = False
timeout = 20
timeout = 30

View File

@ -1,115 +0,0 @@
# Summa Setup Scripts
## Guide
#### 1. Find data dumps
Current version: `20210103.1`
| File | IPFS |
| --------------------|:------------------------------------------------:|
| `scitech.index.tar` | `QmVaWFRNTHC3ser4ViHybcD7nuhv2CUAorhXs4JbYYHYm7` |
| `scitech.store.tar` | `QmP3p577gRokXXtusRYXXV7MtF3pVmGSdNEUE5TwFzRtAm` |
| `scimag.index.tar` | `<upcoming>` |
| `scimag.store.tar` | `<upcoming>` |
If files are not available ask guys from beyond the blackwall.
#### 2. Deploy data dumps to Summa
```shell script
bazel run -c opt installer -- import-to-summa \
--store-filepath scimag.store.tar \
--index-filepath scimag.index.tar \
--schema-filepath schema/scimag.yaml \
--database-path /tmp/summa
bazel run -c opt installer -- import-to-summa \
--store-filepath scitech.store.tar \
--index-filepath scitech.index.tar \
--schema-filepath schema/scitech.yaml \
--database-path /tmp/summa
```
#### 3. Launch Summa
```shell script
docker run -e ENV_TYPE=production \
-v /tmp/summa:/summa -v $(realpath configs/config.yaml):/summa/config.yaml \
-p 50000:80 izihawa/summa:latest -c /summa/config.yaml
```
#### 4. Use it
```shell script
curl "localhost:50000/v1/scitech/search/?query=covid&page_size=2" | python3 -m json.tool
```
```json
{
"has_next": true,
"scored_documents": [
{
"schema": "scitech",
"document": {
"authors": [
"National committee for Management of COVID-19 Cases (Dubai Health Authority)"
],
"cu_suf": "g",
"description": "Objectives\r\nThe objectives of this document are:\r\n\u2022 To provide guidance on clinical management of the COVID-19 infection\r\n\u2022 To provide a protocol on the practical steps to deal with COVID-19 cases\r\n\u2022 To detail the measures necessary to protect hospital staff, patients and visitors\r\n\u2022 This guideline is not intended to override the clinical decisions that will be made by clinicians providing individualized patient care.\r\n\u2022 This guideline will be updated as more information becomes available.\r\nIntroduction to Coronaviruses (CoV)\r\n\u2022 Corona virus is a large family of viruses that cause illness in humans and animals\r\n\u2022 In people, CoV can cause illness ranging in severity from the common cold to SARS.\r\n\u2022 SARS COV2 is one of seven types of known human coronaviruses. SARS COV2 like the MERS and SARS coronaviruses, likely evolved from a virus previously found in animals\r\n\u2022 The estimated incubation period is unknown and currently considered to be up to 14 days\r\nCase Definition:\r\nSuspected COVID-19 case is defined as:\r\n1. Please refer to the local health authority websites for updated information on local case definition.\r\nMOHAP, DoH, SEHA and DHA\r\nConfirmed COVID-19 is defined as:\r\nA person with confirmed positive COVID-19 test by a reference laboratory.",
"extension": "pdf",
"filesize": 2240001,
"id": 100126757,
"ipfs_multihashes": [
"bafykbzacebasnsyh4sypqcojwmsd7ujw3ymogwhnx5vhywk7syptxovkyyzvk",
"QmSd3tYXxJnWzm8vxpW1M6uxLhvBSpSLQd7cHjdsaoE38D"
],
"issued_at": 1577836800,
"language": "en",
"libgen_id": 2492432,
"md5": "faf8bcab6ce58a59b3ed09f1e1d9270e",
"tags": [
"COVID-19 Treatment"
],
"title": "National Guidelines for Clinical Management and Treatment of COVID-19 (March 19, 2020) Version 1.1"
},
"score": 36.404663
},
{
"schema": "scitech",
"document": {
"authors": [
"Dr. Tinku Joseph, Dr. Mohammed Ashkan"
],
"cu_suf": "g",
"description": "Corona virus comprises of a large family of viruses that are common in human beings as\r\nwell animals (camels, cattle, cats, and bats). There are seven different strains of corona\r\nvirus. [15]\r\n229E (alpha coronavirus)\r\nNL63 (alpha coronavirus)\r\nOC43 (beta coronavirus)\r\nHKU1 (beta coronavirus)\r\nMERS-CoV (the beta coronavirus that causes Middle East Respiratory Syndrome, or\r\nMERS)\r\nSARS-CoV (the beta coronavirus that causes severe acute respiratory syndrome, or\r\nSARS)\r\nSARS-CoV-2 (the novel coronavirus that causes coronavirus disease 2019, or\r\nCOVID-19)\r\nSometimes corona virus from animals infect people and spread further via human to human\r\ntransmission such as with MERS-CoV, SARS-CoV, and now with this COVID 19 (Corona\r\ndisease 2019). The virus that causes COVID-19 is designated severe acute respiratory\r\nsyndrome corona virus 2 (SARS-CoV-2); previously, referred to as 2019-nCoV.\r\nTowards December 2019, this novel corona virus was identified as a cause of upper and\r\nlower respiratory tract infections in Wuhan, a city in the Hubei Province of China. It rapidly\r\nspread, resulting in an epidemic throughout China and then gradually spreading to other\r\nparts of the world in pandemic proportions. It has affected almost every continent in this\r\nworld, except Antarctica. In February 2020, the World Health Organization designated the\r\ndisease COVID-19, which stands for corona virus disease 2019 [1].",
"extension": "pdf",
"filesize": 1512761,
"id": 100110426,
"issued_at": 1577836800,
"language": "en",
"libgen_id": 2494250,
"md5": "23015d4934b216fe797b18b561267fe4",
"pages": 43,
"tags": [
"COVID-19"
],
"title": "International Pulmonologist\u2019s Consensus on COVID-19"
},
"score": 32.969494
}
]
}
```
#### 5. (Optional) Deploy data dumps into your database
There is a function `work` in [`traversing script`](installer/scripts/iterate.py)
that you can reimplement to iterate over the whole dataset and insert it into your
own database or do whatever you want in parallel mode.
By default this script is just printing documents.
```shell script
bazel run -c opt installer -- iterate \
--store-filepath scitech.store.tar \
--schema-filepath schema/scitech.yaml
```

View File

@ -1,26 +0,0 @@
import os
import shutil
import tarfile
import yaml
from izihawa_utils.file import mkdir_p
from .common import resolve_path
def import_to_summa(store_filepath, index_filepath, schema_filepath, database_path):
store_filepath = resolve_path(store_filepath)
index_filepath = resolve_path(index_filepath)
schema_filepath = resolve_path(schema_filepath)
database_path = resolve_path(database_path)
mkdir_p(os.path.join(database_path, 'schema'))
mkdir_p(os.path.join(database_path, 'index'))
shutil.copy(schema_filepath, os.path.join(database_path, 'schema', os.path.basename(schema_filepath)))
with open(schema_filepath, 'r') as f:
database_path = os.path.join(database_path, 'index', yaml.safe_load(f)['name'])
with tarfile.open(store_filepath) as f:
f.extractall(database_path)
with tarfile.open(index_filepath) as f:
f.extractall(database_path)

View File

@ -1,51 +0,0 @@
import multiprocessing
import tarfile
from functools import partial
import yaml
from izihawa_utils.itertools import ichunks
from tantipy import (
TantivyCoder,
TantivyReader,
)
from .common import resolve_path
def work(document):
# ToDo: Replace this function to what you want to do with document
print(document)
def _do_work(coder, filepath, chunk_size, limit, member):
with tarfile.open(filepath, 'r') as tar_file:
file = tar_file.extractfile(member)
data = file.read()
print(f'Processing segment {member.name}, size: {len(data) / (1024 * 1024):.2f} Mb ...')
tr = TantivyReader(data, coder=coder)
for chunk_num, documents in enumerate(ichunks(tr.documents(), chunk_size)):
for doc_num, document in enumerate(documents):
if limit and chunk_num * chunk_size + doc_num > limit:
print(f'Segment {member.name} early terminated due to limits')
return
work(document)
print(f'Segment {member.name} successfully processed')
def iterate(store_filepath, schema_filepath, processes=8, chunk_size=100, limit=1):
store_filepath = resolve_path(store_filepath)
schema_filepath = resolve_path(schema_filepath)
with open(schema_filepath) as schema_file:
coder = TantivyCoder(yaml.safe_load(schema_file.read()))
with tarfile.open(store_filepath, 'r') as tar_file:
members = []
for member in tar_file.getmembers():
if not member.name.endswith('store'):
continue
members.append(member)
print(f'Total segments: {len(members)}')
pool = multiprocessing.Pool(processes)
pool.map(partial(_do_work, coder, store_filepath, chunk_size, limit), members)

View File

@ -459,6 +459,160 @@ it:
UPLOADED_TO_TELEGRAM: caricato su Telegram...
VIEWS_CANNOT_BE_SHARED: Effettua la tua ricerca, i comandi non possono essere condivisi.
YEAR: Anno
pb:
ABSTRACT: Resumo
ALREADY_DOWNLOADING: |
Eu encontrei esse livro na Internet.
Por favor, seja paciente, eu enviarei assim que estiver pronto.
AUTHORS: Autores
BANNED: |
Você está banido até **{datetime} UTC**.
Motivo: **{reason}**
BANNED_FOR_SECONDS: |
Você está banido por **{seconds} segundo(s)**
Motivo: **{reason}**
BAN_MESSAGE_TOO_MANY_REQUESTS: Muitas solicitações
CLOSE: Fechar
CONTACT: |
**Atualizações e notícias**: {related_channel}
**Detalhes para doação**: /donate
**LiberaPay**: {libera_pay_url}
**Endereço BTC:** {btc_donate_address}
Você pode nos enviar feedback diretamente por /contact <sua mensagem aqui>
COPYRIGHT_DESCRIPTION: |
Se você deseja fazer uma reclamação de violação de direitos autorais:
- Comece sua mensagem com /copyright, então adicionei uma nova linha
- Cole os links de visualização dos itens sobre os quais você está reivindicando. O link de visualização é um item em que você clica no resultado da página de pesquisa, ou seja, `/v_ip6qnAOB_893608_1749642_3`
- Adicione como um único arquivo (*.zip) todos os documentos que confirmam que você é o proprietário legal dos direitos autorais ou um agente autorizado a agir em nome do proprietário.
Sua reivindicação será considerada em 24 horas.
A decisão de atender à reivindicação impossibilitará o download do item, mas ainda será pesquisável.
COPYRIGHT_INFRINGEMENT_ACCEPTED: |
Sua reivindicação por violação de direitos autorais foi aceita.
COULD_NOT_FIND_ANYTHING: Não foi possível encontrar nada :(
DESCRIPTION: Descrição
DISABLE_DISCOVERY: Se você não deseja obter um feed personalizado, pode desativar o Nexus Discovery em /settings
DISCOVERY_OPTION: Nexus Discovery
DISCOVERY_PROMPT: 🦘 **Veja o que encontrei para você:** 🦘
DONATE: |
Obrigado por visitar /donate. Agradeço até mesmo sua intenção de apenas abrir esta mensagem.
Todo bom ensino deve fluir de fontes abundantes de conhecimento. A fonte rasa não pode emitir um fluxo vigoroso.
Doando para nós, você está doando para todas as pessoas que não têm acesso ao conhecimento humano devido a restrições de acesso pago ou a um preço excessivamente alto.
Todas as doações serão gastas em:
- Desenvolvimento do Nexus Index e tornando o máximo de conhecimento pesquisável possível para todos.
- Manutenção de servidores. Criar e disponibilizar o índice e usar o aprendizado de máquina é uma tarefa computacional pesada que requer muitas GPUs, CPUs e discos.
Cada centavo será usado para o projeto.
Você pode entrar em contato conosco em /contact ou se inscrever em {related_channel} se quiser saber exatamente como as doações serão gastas.
**Detalhes de doação**
**LiberaPay**: {libera_pay_url}
**Endereço BTC:** {btc_donate_address}
[]({btc_donate_qr_url})
DOWNLOAD: Baixar
DOWNLOADED: Baixado
DOWNLOADING: baixando...
DOWNLOAD_AND_SEARCH_MORE: Baixar e pesquisar mais
DOWNLOAD_CANCELED: |
Estamos recarregando nossos backends.
Por favor, tente baixar o `{document}` em um minuto.
EDITION: Edição
FILE: Arquivo
HELP: |
Olá! Eu sou o bot **Nexus**!
Eu posso procurar livros ou artigos científicos por títulos, autores ou DOIs.
Além disso, eu posso enviar recomendações baseadas no que você esteve procurando.
**Basta digitar seu pedido em palavras simples.**
Exemplo: `Divina Comédia Dante` ou `https://doi.org/10.1159/000477855`
Restringir a busca pelo ano 2019: `hemoglobina AND year:2019`
Encontre apenas a partir do ano 2019: `hemoglobina AND year:[2019 TO *]
Buscar pelo autor: `authors:Jack authors:London`
Combinação exata: `"Hemoglobina fetal"`
/copyright - fazer uma reivindicação de violação de direitos autorais
/donate - diz como nos apoiar
/help - mostra esta ajuda
/roll - obtenha um livro aleatório
/settings - altera as configurações de idioma, notificação e feed personalizado
O que você vai ler hoje?
HELP_FOR_GROUPS: |
Oi! Sou o bot **Nexus** para grupos!
Eu posso procurar livros ou artigos científicos por títulos, autores ou DOIs.
Basta digitar sua solicitação em palavras simples começando **com /search**.
Exemplo: `/search Divina Comédia Dante` ou `https://doi.org/10.1159/000477855`
Restringir a busca pelo ano 2019: `/search hemoglobina AND year:2019`
Encontre apenas a partir do ano 2019: `/search hemoglobina AND year:[2019 TO *]
Buscar pelo autor: `/search authors:Jack authors:London`
Combinação exata: `/search "Hemoglobina fetal"`
/donate - diz como nos apoiar
/help - mostra esta ajuda
/roll - obtenha um livro aleatório
/settings - altera as configurações de idioma, notificação e feed personalizado
O que você vai ler hoje?
INVALID_QUERY_ERROR: |
```Eita, Não sei o que fazer com esta URL :(
Tente me enviar DOI, MD5 ou apenas o nome do que você procura!```[]({too_difficult_picture_url})
INVALID_SYNTAX_ERROR: |
```Eita, algo errado com sua consulta. Provavelmente é muito inteligente para mim.
Dica: use colchetes, adicione mais AND/OR ou remova todos eles.```[]({too_difficult_picture_url})
JOURNAL: Revista
LEGACY: Atualizamos e os widgets antigos pararam de funcionar :( Por favor, pesquise novamente.
LOOKING_AT: 'Buscando em {source}...'
MAINTENANCE: |
```Eita! Algo está errado e estamos nos esforçando para reviver.
Por favor, tente um pouco mais tarde.```[]({maintenance_picture_url})
MAINTENANCE_WO_PIC: Eita! Por favor, tente um pouco mais tarde.
NAMELESS: Sem nome
NEXUS_DISCOVERY_DESCRIPTION: |
**Nexus Discovery** é um serviço de recomendação. Também o notifica sobre publicações recém-chegadas que você estava procurando. Seu resumo pessoal será enviado todos os domingos.
PROMO: |
**Nexus Search - Atualizações e Notícias**
{related_channel}
READ_ONLY_MODE: ⚠️ Serviço reduzido até meia-noite (UTC). /settings não está funcionando, pesquisa está no modo lento.
REFERENCED_BY: Referenciado por
REPLY_MESSAGE_HAS_BEEN_DELETED: A mensagem de pesquisa foi (re)movida. Pesquise novamente.
SEARCHING: procurando...
SEND_YOUR_LOCATION: Envie sua localização (através do botão esquerdo anexar)
SETTINGS_ROUTER_HELP: >
As configurações podem ser configuradas automática ou manualmente.
O modo automático solicitará um local para definir o fuso horário, o idioma e a classificação geográfica.
SETTINGS_TEMPLATE: |
**Versão do bot:** {bot_version}
**Versão do Nexus:** {nexus_version}
**Idioma:** {language}
**Fuso horário:** {tzinfo}
SETUP_AUTOMATICALLY: Configurar automaticamente
SETUP_MANUALLY: Configurar manualmente
SHORT_PROMO: ⤴️ Fique ligado conosco em {related_channel}
SOURCES_UNAVAILABLE: '`{document}` está indisponível nesse momento. Por favor, tente mais tarde.'
SUBSCRIBE_TO_CHANNEL: Inscreva-se em {related_channel} para continuar usando este bot.
SYSTEM_MESSAGING_OPTION: Notificações de Atualização do Bot
TAGS: Marcadores
TANKS_BRUH: Valeuzaum manooo!
THANK_YOU_FOR_CONTACT: Obrigado! Se você tiver alguma dúvida, é melhor perguntar no grupo de usuários {related_channel}.
TOO_LONG_QUERY_FOR_SHORTLINK: |
Sua consulta é muito longa (o limite é de cerca de 35-40 caracteres).
Tente usar uma consulta codificada por NID. Encontre um item que deseja compartilhar, copie o NID de uma página de visualização e crie um link curto para a consulta `NID: <NID>`.
TOO_MANY_DOWNLOADS: Muitos downloads ativos. Por favor, espere que eles terminem.
TRANSMITTED_FROM: 'transmitido de {source}'
UPGRADE_MAINTENANCE: |
```Uma grande atualização está acontecendo, volte aqui amanhã```[]({upgrade_maintenance_picture_url})
UPLOADED_TO_TELEGRAM: carregado para o Telegram...
VIEWS_CANNOT_BE_SHARED: Faça sua própria pesquisa, os comandos não podem ser compartilhados.
YEAR: Ano
ru:
ABSTRACT: Аннотация
ALREADY_DOWNLOADING: |

View File

@ -1,43 +1,5 @@
load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary")
exports_files([
"nuxt.server.js",
"package.json",
"webpack.dynamic.server.js",
"webpack.server.js",
"yarn.lock",
".babelrc",
])
nodejs_binary(
name = "webpack-binary",
data = [
"@npm//copy-webpack-plugin",
"@npm//html-webpack-plugin",
"@npm//mini-css-extract-plugin",
"@npm//vue-loader",
"@npm//webpack",
"@npm//webpack-cli",
],
entry_point = "@npm//:node_modules/webpack-cli/bin/cli.js",
visibility = ["//visibility:public"],
)
nodejs_binary(
name = "webpack-dev-server-binary",
data = [
"@npm//webpack-cli",
"@npm//webpack-dev-server",
],
entry_point = "@npm//:node_modules/webpack-dev-server/bin/webpack-dev-server.js",
visibility = ["//visibility:public"],
)
nodejs_binary(
name = "nuxt-binary",
data = [
"@npm//nuxt",
],
entry_point = "@npm//:node_modules/nuxt/bin/nuxt.js",
visibility = ["//visibility:public"],
)

View File

@ -1,154 +0,0 @@
"""JS build rules"""
load("@build_bazel_rules_nodejs//:index.bzl", "nodejs_binary")
load("//rules/nodejs:common.bzl", "get_transitive_depsets")
CONTENT_PREFIX = """
set -uo pipefail; f=bazel_tools/tools/bash/runfiles/runfiles.bash
source "${RUNFILES_DIR:-/dev/null}/$f" 2>/dev/null || \
source "$(grep -sm1 "^$f " "${RUNFILES_MANIFEST_FILE:-/dev/null}" | cut -f2- -d' ')" 2>/dev/null || \
source "$0.runfiles/$f" 2>/dev/null || \
source "$(grep -sm1 "^$f " "$0.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
source "$(grep -sm1 "^$f " "$0.exe.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
{ echo>&2 "ERROR: cannot find $f"; exit 1; }; f=; set -e
"""
NUXT_WRAPPER_TEMPLATE = """
{nuxt_cmd} --config-file {nuxt_config_file}
"""
CompiledInfo = provider(fields = ["compiled_files", "source_files"])
def _generate_server_js_impl(ctx):
ctx.actions.expand_template(
template = ctx.file._template,
output = ctx.outputs.server_js,
substitutions = {
"{config_file}": ctx.file.config.basename,
"{nuxt_config_file}": ctx.file.nuxt_config.basename,
},
)
_generate_server_js = rule(
implementation = _generate_server_js_impl,
attrs = {
"config": attr.label(mandatory = True, allow_single_file = True),
"nuxt_config": attr.label(mandatory = True, allow_single_file = True),
"_template": attr.label(
default = Label("//rules/nodejs:nuxt.server.js"),
allow_single_file = True,
),
},
outputs = {
"server_js": "server.js",
},
)
def _nuxt_compile_impl(ctx):
depsets, node_modules_depsets = get_transitive_depsets(ctx.attr.data)
trans_srcs = depset([ctx.file.nuxt_config], transitive = depsets + node_modules_depsets)
source_files = depset([ctx.file.nuxt_config], transitive = depsets)
runfiles = ctx.runfiles(transitive_files = trans_srcs).merge(
ctx.attr.nuxt_binary[DefaultInfo].default_runfiles,
)
nuxt_wrapper_content = NUXT_WRAPPER_TEMPLATE.format(
nuxt_cmd = ctx.attr.nuxt_binary.files_to_run.executable.short_path,
nuxt_config_file = ctx.file.nuxt_config.short_path,
)
ctx.actions.write(ctx.outputs.nuxt_runner, CONTENT_PREFIX + nuxt_wrapper_content, is_executable = True)
ctx.actions.run(
inputs = trans_srcs,
outputs = [ctx.outputs.nuxt_dist],
arguments = [
"build",
"--standalone",
"--build-dir=" + ctx.outputs.nuxt_dist.path,
"--config-file",
ctx.file.nuxt_config.short_path,
],
progress_message = "Compiling %s by nuxtJS..." % ctx.outputs.nuxt_dist.short_path,
executable = ctx.executable.nuxt_binary,
)
return [
DefaultInfo(
executable = ctx.outputs.nuxt_runner,
runfiles = runfiles,
files = trans_srcs,
),
CompiledInfo(
compiled_files = depset([ctx.outputs.nuxt_dist]),
source_files = source_files,
),
]
_nuxt_compile = rule(
implementation = _nuxt_compile_impl,
attrs = {
"nuxt_config": attr.label(mandatory = True, allow_single_file = True),
"config": attr.label(mandatory = True, allow_single_file = True),
"data": attr.label_list(),
"nuxt_binary": attr.label(
default = Label("//rules/nodejs:nuxt-binary"),
executable = True,
cfg = "host",
),
},
outputs = {
"nuxt_dist": "nuxt_dist",
"nuxt_runner": "nuxt_runner",
},
executable = True,
)
def _nuxt_data_impl(ctx):
return [DefaultInfo(
files = depset(
transitive = [
ctx.attr.compiled[CompiledInfo].compiled_files,
ctx.attr.compiled[CompiledInfo].source_files,
],
),
)]
_nuxt_data = rule(
implementation = _nuxt_data_impl,
attrs = {
"compiled": attr.label(),
},
)
def nuxt_compile(name, config = "config.js", nuxt_config = "nuxt.config.js", data = []):
"""
Compile nuxt and produce files in CompiledInfo provider
Args:
name: name of the target, also name.nuxt-binary
config: path to application config
nuxt_config: path to nuxt config
data: list of dependencies
Returns:
Produces outputs
"""
nuxt_binary_name = name + ".nuxt-binary"
nodejs_binary(
name = nuxt_binary_name,
entry_point = "@npm//:node_modules/nuxt/bin/nuxt.js",
data = data,
visibility = ["//visibility:public"],
)
_nuxt_compile(
name = name,
config = config,
nuxt_config = nuxt_config,
data = data,
nuxt_binary = nuxt_binary_name,
)
_nuxt_data(name = name + ".compiled", compiled = name)
_generate_server_js(
name = name + ".server.js",
config = config,
nuxt_config = nuxt_config,
)

View File

@ -1,10 +0,0 @@
const { Nuxt } = require('nuxt')
const app = require('express')()
const config = require('./{config_file}')
const nuxtConfig = Object.assign(require('./{nuxt_config_file}'), { dev: false, _start: true })
const nuxt = new Nuxt(nuxtConfig)
app.use(nuxt.render)
app.listen(config.application.port, config.application.host, () => {
console.log(`Server started and listen on ${config.application.port}`)
})

View File

@ -1,134 +1,75 @@
{
"name": "hyperboria",
"version": "1.0.0",
"author": "Developers Legion",
"private": true,
"scripts": {
"nuxt": "nuxt",
"webpack": "webpack"
"nuxt": "nuxt"
},
"dependencies": {
"@babel/runtime": "^7.7.7",
"@chenfengyuan/vue-countdown": "^1.1.4",
"@mdi/font": "^4.7.95",
"@nuxtjs/component-cache": "^1.1.5",
"@nuxtjs/sitemap": "^2.0.1",
"@nuxtjs/yandex-metrika": "^1.0.3",
"autoprefixer": "^9.7.3",
"axios": "^0.19.0",
"babel-core": "^6.26.3",
"babel-eslint": "^10.0.3",
"babel-helper-vue-jsx-merge-props": "^2.0.3",
"babel-loader": "^8.0.6",
"babel-plugin-syntax-jsx": "^6.18.0",
"babel-plugin-transform-decorators-legacy": "^1.3.5",
"babel-plugin-transform-es2015-modules-commonjs": "^6.26.2",
"babel-plugin-transform-runtime": "^6.23.0",
"babel-plugin-transform-vue-jsx": "^3.7.0",
"babel-preset-env": "^1.7.0",
"babel-preset-react": "^6.24.1",
"babel-preset-stage-2": "^6.24.1",
"bootstrap": "^4.4.1",
"bootstrap-vue": "^2.1.0",
"chalk": "^3.0.0",
"chokidar": "^3.3.1",
"cluster": "^0.7.7",
"compression-webpack-plugin": "^3.0.1",
"cookie-parser": "^1.4.4",
"copy-webpack-plugin": "^5.1.1",
"css-loader": "^3.4.1",
"date-fns": "^2.8.1",
"es5-ext": "^0.10.53",
"eslint": "^5.16.0",
"eslint-config-standard": "^14.1.0",
"eslint-friendly-formatter": "^4.0.1",
"eslint-loader": "^3.0.3",
"eslint-plugin-import": "^2.19.1",
"eslint-plugin-node": "^11.0.0",
"@mdi/font": "^5.8.55",
"@nuxtjs/axios": "^5.12.5",
"@pointotech/pug-plain-loader": "^1.0.1",
"ansi-html": "^0.0.7",
"axios": "^0.21.1",
"babel-eslint": "^10.1.0",
"bootstrap": "^4.5.3",
"bootstrap-scss": "^4.5.3",
"bootstrap-vue": "^2.17.3",
"copy-webpack-plugin": "^6.4.1",
"core-js": "^3.6.5",
"css-loader": "^5.0.1",
"dateformat": "^4.4.1",
"deepmerge": "^4.2.2",
"eslint": "^7.17.0",
"eslint-config-standard": "^16.0.2",
"eslint-plugin-import": "^2.22.1",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^4.2.1",
"eslint-plugin-pug": "^1.1.1",
"eslint-plugin-standard": "^4.0.1",
"eslint-plugin-vue": "^6.1.2",
"eslint-traverser": "^1.5.2",
"eventsource-polyfill": "^0.9.6",
"file-loader": "^5.0.2",
"eslint-plugin-vue": "^7.4.1",
"express": "^4.17.1",
"file-loader": "^6.2.0",
"font-awesome": "^4.7.0",
"friendly-errors-webpack-plugin": "^1.7.0",
"fs-extra": "^8.1.0",
"html-webpack-plugin": "^3.2.0",
"jquery": "^3.4.1",
"html-entities": "^1.4.0",
"html-webpack-plugin": "^4.5.1",
"js-cookie": "^2.2.1",
"js-yaml-loader": "^1.2.2",
"lodash": "^4.17.15",
"merge-files-webpack-plugin": "^1.1.2",
"mini-css-extract-plugin": "^0.9.0",
"moment": "^2.24.0",
"moment-timezone": "^0.5.27",
"node-notifier": "^6.0.0",
"node-sass": "^4.13.0",
"nuxt": "^2.11.0",
"optimize-css-assets-webpack-plugin": "^5.0.3",
"optionator": "^0.8.3",
"ora": "^4.0.3",
"popper.js": "^1.16.0",
"portfinder": "^1.0.25",
"postcss-import": "^12.0.1",
"postcss-load-config": "^2.1.0",
"postcss-loader": "^3.0.0",
"postcss-safe-parser": "^4.0.1",
"postcss-url": "^8.0.0",
"pug": "^2.0.4",
"pug-plain-loader": "^1.0.0",
"rimraf": "^3.0.0",
"sass-loader": "^8.0.0",
"lodash": "^4.17.20",
"loglevel": "^1.7.1",
"mini-css-extract-plugin": "^1.3.4",
"nuxt": "^2.14.12",
"nuxt-start": "^2.14.12",
"optionator": "^0.9.1",
"pug": "^3.0.0",
"pug-plain-loader": "^1.1.0",
"sass": "^1.32.4",
"sass-lint": "^1.13.1",
"semver": "^7.1.1",
"shelljs": "^0.8.3",
"sitemap-generator": "^8.4.2",
"style-loader": "^1.1.2",
"tempusdominus-bootstrap-4": "^5.1.2",
"tempusdominus-core": "^5.0.3",
"terser-webpack-plugin": "^2.3.1",
"uglify-js": "^3.7.4",
"url-loader": "^3.0.0",
"vue": "^2.6.11",
"@vue/cli": "^4.1.2",
"@vue/cli-init": "^4.1.2",
"vue-cookies": "^1.6.1",
"vue-croppa": "^1.3.8",
"vue-head": "^2.2.0",
"vue-i18n": "^8.15.3",
"vue-js-modal": "^1.3.31",
"vue-loader": "^15.8.3",
"sass-loader": "^10.1.1",
"sockjs-client": "^1.5.0",
"tempusdominus-bootstrap-4": "^5.39.0",
"url": "^0.11.0",
"url-loader": "^4.1.1",
"v8-compile-cache": "^2.2.0",
"vue": "^2.6.12",
"vue-cookies": "^1.7.4",
"vue-loader": "^15.9.6",
"vue-moment": "^4.1.0",
"vue-momentjs": "^0.1.2",
"vue-notification": "^1.3.20",
"vue-router": "^3.1.3",
"vue-scrollto": "^2.17.1",
"vue-select": "^3.4.0",
"vue-style-loader": "^4.1.2",
"vue-template-compiler": "^2.6.11",
"vue2-autocomplete-js": "^0.2.2",
"vuejs-dialog": "^1.4.1",
"vuex": "^3.1.2",
"vuex-persistedstate": "^2.7.0",
"vue-clipboard2": "^0.3.1",
"webpack": "^4.41.5",
"webpack-bundle-analyzer": "^3.6.0",
"webpack-cli": "^3.3.10",
"webpack-dev-server": "^3.10.1",
"webpack-dev-middleware": "^3.7.2",
"webpack-hot-middleware": "^2.25.0",
"webpack-merge": "^4.2.2",
"winston": "^3.2.1",
"wordwrap": "^1.0.0",
"yaml-loader": "^0.5.0"
"vue-router": "^3.4.9",
"vue-scrollto": "^2.20.0",
"vue-select": "^3.11.2",
"vue-template-compiler": "^2.6.12",
"vuejs-dialog": "^1.4.2",
"vuex-persistedstate": "^4.0.0-beta.3",
"webpack": "^4.46.0",
"webpack-cli": "^4.3.1",
"webpack-dev-server": "^3.11.1",
"wordwrap": "^1.0.0"
},
"devDependencies": {
"@bazel/hide-bazel-files": "latest"
"@bazel/bazelisk": "latest",
"@bazel/buildifier": "latest",
"@bazel/ibazel": "latest"
},
"engines": {
"node": "^12.13.0"
"node": "^15"
},
"browserslist": [
"> 1%",

View File

@ -1,217 +0,0 @@
"""JS build rules"""
load("//rules/nodejs:common.bzl", "get_transitive_depsets")
CONTENT_PREFIX = """
set -uo pipefail; f=bazel_tools/tools/bash/runfiles/runfiles.bash
source "${RUNFILES_DIR:-/dev/null}/$f" 2>/dev/null || \
source "$(grep -sm1 "^$f " "${RUNFILES_MANIFEST_FILE:-/dev/null}" | cut -f2- -d' ')" 2>/dev/null || \
source "$0.runfiles/$f" 2>/dev/null || \
source "$(grep -sm1 "^$f " "$0.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
source "$(grep -sm1 "^$f " "$0.exe.runfiles_manifest" | cut -f2- -d' ')" 2>/dev/null || \
{ echo>&2 "ERROR: cannot find $f"; exit 1; }; f=; set -e
"""
WEBPACK_DEV_SERVER_WRAPPER_TEMPLATE = """
{webpack_dev_server_cmd} --config {webpack_config_file}
"""
CompiledInfo = provider(fields = ["compiled_files", "source_files"])
def _generate_server_js_impl(ctx):
short_path = ctx.outputs.server_js.short_path
short_path = short_path[:short_path.rfind("/")]
ctx.actions.expand_template(
template = ctx.file.template,
output = ctx.outputs.server_js,
substitutions = {
"{config_path}": ctx.file.config.basename,
"{webpack_config_path}": ctx.file.webpack_config.basename,
"{static_path}": short_path + "/webpack_dist",
},
)
_generate_server_js = rule(
implementation = _generate_server_js_impl,
attrs = {
"config": attr.label(mandatory = True, allow_single_file = True),
"webpack_config": attr.label(allow_single_file = True),
"template": attr.label(
default = Label("//rules/nodejs:webpack.server.js"),
allow_single_file = True,
),
},
outputs = {
"server_js": "server.js",
},
)
def _generate_webpack_dev_server_wrapper(ctx):
webpack_dev_server_wrapper_content = WEBPACK_DEV_SERVER_WRAPPER_TEMPLATE.format(
webpack_dev_server_cmd = ctx.attr._webpack_dev_server_binary.files_to_run.executable.short_path,
webpack_config_file = ctx.file.webpack_config.short_path,
)
ctx.actions.write(
ctx.outputs.webpack_dev_server_runner,
CONTENT_PREFIX + webpack_dev_server_wrapper_content,
is_executable = True,
)
def _webpack_binary_impl(ctx):
depsets, node_modules_depsets = get_transitive_depsets(ctx.attr.data)
trans_srcs = depset(ctx.files.srcs + [ctx.file.config, ctx.file.webpack_config], transitive = depsets + node_modules_depsets)
runfiles = ctx.runfiles(transitive_files = trans_srcs).merge(
ctx.attr._webpack_dev_server_binary[DefaultInfo].default_runfiles,
)
_generate_webpack_dev_server_wrapper(ctx)
return [
DefaultInfo(
executable = ctx.outputs.webpack_dev_server_runner,
runfiles = runfiles,
files = trans_srcs,
),
]
_webpack_binary = rule(
implementation = _webpack_binary_impl,
attrs = {
"config": attr.label(mandatory = True, allow_single_file = True),
"webpack_config": attr.label(mandatory = True, allow_single_file = True),
"srcs": attr.label_list(allow_files = True),
"data": attr.label_list(),
"_webpack_binary": attr.label(
default = Label("//rules/nodejs:webpack-binary"),
executable = True,
cfg = "host",
),
"_webpack_dev_server_binary": attr.label(
default = Label("//rules/nodejs:webpack-dev-server-binary"),
executable = True,
cfg = "host",
),
},
outputs = {
"webpack_dev_server_runner": "webpack_dev_server_runner",
},
executable = True,
)
def _webpack_compile_impl(ctx):
depsets, node_modules_depsets = get_transitive_depsets(ctx.attr.deps)
trans_srcs = depset(ctx.files.srcs + [ctx.file.config, ctx.file.webpack_config], transitive = depsets + node_modules_depsets)
runfiles = ctx.runfiles(transitive_files = trans_srcs).merge(
ctx.attr._webpack_dev_server_binary[DefaultInfo].default_runfiles,
)
_generate_webpack_dev_server_wrapper(ctx)
ctx.actions.run(
inputs = trans_srcs,
outputs = [ctx.outputs.webpack_dist],
arguments = [
"--mode",
"production",
"--config",
ctx.file.webpack_config.short_path,
"--output-path",
ctx.outputs.webpack_dist.path,
],
progress_message = "Compiling %s by Webpack..." % ctx.outputs.webpack_dist.short_path,
executable = ctx.executable._webpack_binary,
)
return [
DefaultInfo(
executable = ctx.outputs.webpack_dev_server_runner,
runfiles = runfiles,
files = trans_srcs,
),
CompiledInfo(
compiled_files = depset([ctx.outputs.webpack_dist]),
source_files = depset([ctx.file.config]),
),
]
_webpack_compile = rule(
implementation = _webpack_compile_impl,
attrs = {
"config": attr.label(mandatory = True, allow_single_file = True),
"webpack_config": attr.label(mandatory = True, allow_single_file = True),
"srcs": attr.label_list(allow_files = True),
"data": attr.label_list(),
"_webpack_binary": attr.label(
default = Label("//rules/nodejs:webpack-binary"),
executable = True,
cfg = "host",
),
"_webpack_dev_server_binary": attr.label(
default = Label("//rules/nodejs:webpack-dev-server-binary"),
executable = True,
cfg = "host",
),
},
outputs = {
"webpack_dist": "webpack_dist",
"webpack_dev_server_runner": "webpack_dev_server_runner",
},
executable = True,
)
def _webpack_data_impl(ctx):
return [DefaultInfo(
files = depset(
transitive = [
ctx.attr.compiled[CompiledInfo].compiled_files,
ctx.attr.compiled[CompiledInfo].source_files,
],
),
)]
_webpack_data = rule(
implementation = _webpack_data_impl,
attrs = {
"compiled": attr.label(),
},
)
def webpack_binary(
name,
config = "config.js",
webpack_config = "webpack.config.js",
srcs = [],
data = []):
_webpack_binary(
name = name,
config = config,
webpack_config = webpack_config,
srcs = srcs,
data = data,
)
_generate_server_js(
name = name + ".server.js",
config = config,
webpack_config = webpack_config,
template = "//rules/nodejs:webpack.dynamic.server.js",
)
def webpack_compile(
name,
config = "config.js",
webpack_config = "webpack.config.js",
srcs = [],
data = []):
_webpack_compile(
name = name,
config = config,
webpack_config = webpack_config,
srcs = srcs,
data = data,
)
_webpack_data(name = name + ".compiled", compiled = name)
_generate_server_js(
name = name + ".server.js",
config = config,
webpack_config = webpack_config,
)

View File

@ -1,22 +0,0 @@
const config = require('./{config_path}')
const webpackConfig = require('./{webpack_config_path}')
const webpack = require('webpack')
const express = require('express')
const app = express()
const path = require('path')
const outputPath = path.join(process.cwd(), '{static_path}')
webpackConfig.output.path = outputPath
webpack(webpackConfig, (err, stats) => { // Stats Object
if (err || stats.hasErrors()) {
console.error(err || stats)
}
app.use(express.static(outputPath))
app.get('/', (req, res) => {
res.sendFile('./index.html', { root: outputPath })
})
app.listen(config.application.port, config.application.host, () => {
console.log(`Dynamic server is listening on port: ${config.application.port}`)
})
})

View File

@ -1,11 +0,0 @@
const config = require('./{config_path}')
const express = require('express')
const app = express()
app.use(express.static('{static_path}'))
app.get('/', (req, res) => {
res.sendFile('./index.html', { root: '{static_path}' })
})
app.listen(config.application.port, config.application.host, () => {
console.log(`Server is listening on port: ${config.application.port}`)
})

File diff suppressed because it is too large Load Diff

View File

@ -1,4 +1,4 @@
load("@pip_modules_external//:requirements.bzl", "requirement")
load("@pip_modules//:requirements.bzl", "requirement")
load("@rules_python//python:defs.bzl", "py_binary")
py_binary(

View File

@ -8,6 +8,7 @@ version = "0.0.0"
path = "src/main.rs"
[dependencies]
actix-cors = "0.5.4"
actix = "0.10.0"
actix-http = { version = "2", default-features = false }
actix-rt = "1"

View File

@ -21,6 +21,15 @@ alias(
],
)
alias(
name = "actix_cors",
actual = "@raze__actix_cors__0_5_4//:actix_cors",
tags = [
"cargo-raze",
"manual",
],
)
alias(
name = "actix_http",
actual = "@raze__actix_http__2_2_0//:actix_http",
@ -383,7 +392,7 @@ alias(
alias(
name = "futures",
actual = "@raze__futures__0_3_9//:futures",
actual = "@raze__futures__0_3_10//:futures",
tags = [
"cargo-raze",
"manual",
@ -430,7 +439,7 @@ alias(
alias(
name = "integer_encoding",
actual = "@raze__integer_encoding__2_1_1//:integer_encoding",
actual = "@raze__integer_encoding__2_1_2//:integer_encoding",
tags = [
"cargo-raze",
"manual",
@ -484,7 +493,7 @@ alias(
alias(
name = "log",
actual = "@raze__log__0_4_11//:log",
actual = "@raze__log__0_4_13//:log",
tags = [
"cargo-raze",
"manual",
@ -756,7 +765,7 @@ alias(
alias(
name = "serde",
actual = "@raze__serde__1_0_118//:serde",
actual = "@raze__serde__1_0_119//:serde",
tags = [
"cargo-raze",
"manual",
@ -765,7 +774,7 @@ alias(
alias(
name = "serde_derive",
actual = "@raze__serde_derive__1_0_118//:serde_derive",
actual = "@raze__serde_derive__1_0_119//:serde_derive",
tags = [
"cargo-raze",
"manual",
@ -801,7 +810,7 @@ alias(
alias(
name = "signal_hook",
actual = "@raze__signal_hook__0_3_2//:signal_hook",
actual = "@raze__signal_hook__0_3_3//:signal_hook",
tags = [
"cargo-raze",
"manual",
@ -819,7 +828,7 @@ alias(
alias(
name = "slog_async",
actual = "@raze__slog_async__2_5_0//:slog_async",
actual = "@raze__slog_async__2_6_0//:slog_async",
tags = [
"cargo-raze",
"manual",
@ -936,7 +945,7 @@ alias(
alias(
name = "tempfile",
actual = "@raze__tempfile__3_1_0//:tempfile",
actual = "@raze__tempfile__3_2_0//:tempfile",
tags = [
"cargo-raze",
"manual",
@ -1044,7 +1053,7 @@ alias(
alias(
name = "uuid",
actual = "@raze__uuid__0_8_1//:uuid",
actual = "@raze__uuid__0_8_2//:uuid",
tags = [
"cargo-raze",
"manual",

View File

@ -47,6 +47,15 @@ def raze_fetch_remote_crates():
build_file = Label("//rules/rust/remote:BUILD.actix-connect-2.0.0.bazel"),
)
maybe(
http_archive,
name = "raze__actix_cors__0_5_4",
url = "https://crates.io/api/v1/crates/actix-cors/0.5.4/download",
type = "tar.gz",
strip_prefix = "actix-cors-0.5.4",
build_file = Label("//rules/rust/remote:BUILD.actix-cors-0.5.4.bazel"),
)
maybe(
http_archive,
name = "raze__actix_http__2_2_0",
@ -67,11 +76,11 @@ def raze_fetch_remote_crates():
maybe(
http_archive,
name = "raze__actix_router__0_2_5",
url = "https://crates.io/api/v1/crates/actix-router/0.2.5/download",
name = "raze__actix_router__0_2_6",
url = "https://crates.io/api/v1/crates/actix-router/0.2.6/download",
type = "tar.gz",
strip_prefix = "actix-router-0.2.5",
build_file = Label("//rules/rust/remote:BUILD.actix-router-0.2.5.bazel"),
strip_prefix = "actix-router-0.2.6",
build_file = Label("//rules/rust/remote:BUILD.actix-router-0.2.6.bazel"),
)
maybe(
@ -254,6 +263,15 @@ def raze_fetch_remote_crates():
build_file = Label("//rules/rust/remote:BUILD.arc-swap-0.4.8.bazel"),
)
maybe(
http_archive,
name = "raze__arc_swap__1_2_0",
url = "https://crates.io/api/v1/crates/arc-swap/1.2.0/download",
type = "tar.gz",
strip_prefix = "arc-swap-1.2.0",
build_file = Label("//rules/rust/remote:BUILD.arc-swap-1.2.0.bazel"),
)
maybe(
http_archive,
name = "raze__arrayref__0_3_6",
@ -499,20 +517,20 @@ def raze_fetch_remote_crates():
maybe(
http_archive,
name = "raze__bytes__1_0_0",
url = "https://crates.io/api/v1/crates/bytes/1.0.0/download",
name = "raze__bytes__1_0_1",
url = "https://crates.io/api/v1/crates/bytes/1.0.1/download",
type = "tar.gz",
strip_prefix = "bytes-1.0.0",
build_file = Label("//rules/rust/remote:BUILD.bytes-1.0.0.bazel"),
strip_prefix = "bytes-1.0.1",
build_file = Label("//rules/rust/remote:BUILD.bytes-1.0.1.bazel"),
)
maybe(
http_archive,
name = "raze__bytestring__0_1_5",
url = "https://crates.io/api/v1/crates/bytestring/0.1.5/download",
name = "raze__bytestring__1_0_0",
url = "https://crates.io/api/v1/crates/bytestring/1.0.0/download",
type = "tar.gz",
strip_prefix = "bytestring-0.1.5",
build_file = Label("//rules/rust/remote:BUILD.bytestring-0.1.5.bazel"),
strip_prefix = "bytestring-1.0.0",
build_file = Label("//rules/rust/remote:BUILD.bytestring-1.0.0.bazel"),
)
maybe(
@ -1093,83 +1111,83 @@ def raze_fetch_remote_crates():
maybe(
http_archive,
name = "raze__futures__0_3_9",
url = "https://crates.io/api/v1/crates/futures/0.3.9/download",
name = "raze__futures__0_3_10",
url = "https://crates.io/api/v1/crates/futures/0.3.10/download",
type = "tar.gz",
strip_prefix = "futures-0.3.9",
build_file = Label("//rules/rust/remote:BUILD.futures-0.3.9.bazel"),
strip_prefix = "futures-0.3.10",
build_file = Label("//rules/rust/remote:BUILD.futures-0.3.10.bazel"),
)
maybe(
http_archive,
name = "raze__futures_channel__0_3_9",
url = "https://crates.io/api/v1/crates/futures-channel/0.3.9/download",
name = "raze__futures_channel__0_3_10",
url = "https://crates.io/api/v1/crates/futures-channel/0.3.10/download",
type = "tar.gz",
strip_prefix = "futures-channel-0.3.9",
build_file = Label("//rules/rust/remote:BUILD.futures-channel-0.3.9.bazel"),
strip_prefix = "futures-channel-0.3.10",
build_file = Label("//rules/rust/remote:BUILD.futures-channel-0.3.10.bazel"),
)
maybe(
http_archive,
name = "raze__futures_core__0_3_9",
url = "https://crates.io/api/v1/crates/futures-core/0.3.9/download",
name = "raze__futures_core__0_3_10",
url = "https://crates.io/api/v1/crates/futures-core/0.3.10/download",
type = "tar.gz",
strip_prefix = "futures-core-0.3.9",
build_file = Label("//rules/rust/remote:BUILD.futures-core-0.3.9.bazel"),
strip_prefix = "futures-core-0.3.10",
build_file = Label("//rules/rust/remote:BUILD.futures-core-0.3.10.bazel"),
)
maybe(
http_archive,
name = "raze__futures_executor__0_3_9",
url = "https://crates.io/api/v1/crates/futures-executor/0.3.9/download",
name = "raze__futures_executor__0_3_10",
url = "https://crates.io/api/v1/crates/futures-executor/0.3.10/download",
type = "tar.gz",
strip_prefix = "futures-executor-0.3.9",
build_file = Label("//rules/rust/remote:BUILD.futures-executor-0.3.9.bazel"),
strip_prefix = "futures-executor-0.3.10",
build_file = Label("//rules/rust/remote:BUILD.futures-executor-0.3.10.bazel"),
)
maybe(
http_archive,
name = "raze__futures_io__0_3_9",
url = "https://crates.io/api/v1/crates/futures-io/0.3.9/download",
name = "raze__futures_io__0_3_10",
url = "https://crates.io/api/v1/crates/futures-io/0.3.10/download",
type = "tar.gz",
strip_prefix = "futures-io-0.3.9",
build_file = Label("//rules/rust/remote:BUILD.futures-io-0.3.9.bazel"),
strip_prefix = "futures-io-0.3.10",
build_file = Label("//rules/rust/remote:BUILD.futures-io-0.3.10.bazel"),
)
maybe(
http_archive,
name = "raze__futures_macro__0_3_9",
url = "https://crates.io/api/v1/crates/futures-macro/0.3.9/download",
name = "raze__futures_macro__0_3_10",
url = "https://crates.io/api/v1/crates/futures-macro/0.3.10/download",
type = "tar.gz",
strip_prefix = "futures-macro-0.3.9",
build_file = Label("//rules/rust/remote:BUILD.futures-macro-0.3.9.bazel"),
strip_prefix = "futures-macro-0.3.10",
build_file = Label("//rules/rust/remote:BUILD.futures-macro-0.3.10.bazel"),
)
maybe(
http_archive,
name = "raze__futures_sink__0_3_9",
url = "https://crates.io/api/v1/crates/futures-sink/0.3.9/download",
name = "raze__futures_sink__0_3_10",
url = "https://crates.io/api/v1/crates/futures-sink/0.3.10/download",
type = "tar.gz",
strip_prefix = "futures-sink-0.3.9",
build_file = Label("//rules/rust/remote:BUILD.futures-sink-0.3.9.bazel"),
strip_prefix = "futures-sink-0.3.10",
build_file = Label("//rules/rust/remote:BUILD.futures-sink-0.3.10.bazel"),
)
maybe(
http_archive,
name = "raze__futures_task__0_3_9",
url = "https://crates.io/api/v1/crates/futures-task/0.3.9/download",
name = "raze__futures_task__0_3_10",
url = "https://crates.io/api/v1/crates/futures-task/0.3.10/download",
type = "tar.gz",
strip_prefix = "futures-task-0.3.9",
build_file = Label("//rules/rust/remote:BUILD.futures-task-0.3.9.bazel"),
strip_prefix = "futures-task-0.3.10",
build_file = Label("//rules/rust/remote:BUILD.futures-task-0.3.10.bazel"),
)
maybe(
http_archive,
name = "raze__futures_util__0_3_9",
url = "https://crates.io/api/v1/crates/futures-util/0.3.9/download",
name = "raze__futures_util__0_3_10",
url = "https://crates.io/api/v1/crates/futures-util/0.3.10/download",
type = "tar.gz",
strip_prefix = "futures-util-0.3.9",
build_file = Label("//rules/rust/remote:BUILD.futures-util-0.3.9.bazel"),
strip_prefix = "futures-util-0.3.10",
build_file = Label("//rules/rust/remote:BUILD.futures-util-0.3.10.bazel"),
)
maybe(
@ -1354,11 +1372,11 @@ def raze_fetch_remote_crates():
maybe(
http_archive,
name = "raze__humantime__2_0_1",
url = "https://crates.io/api/v1/crates/humantime/2.0.1/download",
name = "raze__humantime__2_1_0",
url = "https://crates.io/api/v1/crates/humantime/2.1.0/download",
type = "tar.gz",
strip_prefix = "humantime-2.0.1",
build_file = Label("//rules/rust/remote:BUILD.humantime-2.0.1.bazel"),
strip_prefix = "humantime-2.1.0",
build_file = Label("//rules/rust/remote:BUILD.humantime-2.1.0.bazel"),
)
maybe(
@ -1390,11 +1408,11 @@ def raze_fetch_remote_crates():
maybe(
http_archive,
name = "raze__integer_encoding__2_1_1",
url = "https://crates.io/api/v1/crates/integer-encoding/2.1.1/download",
name = "raze__integer_encoding__2_1_2",
url = "https://crates.io/api/v1/crates/integer-encoding/2.1.2/download",
type = "tar.gz",
strip_prefix = "integer-encoding-2.1.1",
build_file = Label("//rules/rust/remote:BUILD.integer-encoding-2.1.1.bazel"),
strip_prefix = "integer-encoding-2.1.2",
build_file = Label("//rules/rust/remote:BUILD.integer-encoding-2.1.2.bazel"),
)
maybe(
@ -1525,11 +1543,11 @@ def raze_fetch_remote_crates():
maybe(
http_archive,
name = "raze__log__0_4_11",
url = "https://crates.io/api/v1/crates/log/0.4.11/download",
name = "raze__log__0_4_13",
url = "https://crates.io/api/v1/crates/log/0.4.13/download",
type = "tar.gz",
strip_prefix = "log-0.4.11",
build_file = Label("//rules/rust/remote:BUILD.log-0.4.11.bazel"),
strip_prefix = "log-0.4.13",
build_file = Label("//rules/rust/remote:BUILD.log-0.4.13.bazel"),
)
maybe(
@ -1957,11 +1975,11 @@ def raze_fetch_remote_crates():
maybe(
http_archive,
name = "raze__pin_project__1_0_3",
url = "https://crates.io/api/v1/crates/pin-project/1.0.3/download",
name = "raze__pin_project__1_0_4",
url = "https://crates.io/api/v1/crates/pin-project/1.0.4/download",
type = "tar.gz",
strip_prefix = "pin-project-1.0.3",
build_file = Label("//rules/rust/remote:BUILD.pin-project-1.0.3.bazel"),
strip_prefix = "pin-project-1.0.4",
build_file = Label("//rules/rust/remote:BUILD.pin-project-1.0.4.bazel"),
)
maybe(
@ -1975,11 +1993,11 @@ def raze_fetch_remote_crates():
maybe(
http_archive,
name = "raze__pin_project_internal__1_0_3",
url = "https://crates.io/api/v1/crates/pin-project-internal/1.0.3/download",
name = "raze__pin_project_internal__1_0_4",
url = "https://crates.io/api/v1/crates/pin-project-internal/1.0.4/download",
type = "tar.gz",
strip_prefix = "pin-project-internal-1.0.3",
build_file = Label("//rules/rust/remote:BUILD.pin-project-internal-1.0.3.bazel"),
strip_prefix = "pin-project-internal-1.0.4",
build_file = Label("//rules/rust/remote:BUILD.pin-project-internal-1.0.4.bazel"),
)
maybe(
@ -1993,11 +2011,11 @@ def raze_fetch_remote_crates():
maybe(
http_archive,
name = "raze__pin_project_lite__0_2_2",
url = "https://crates.io/api/v1/crates/pin-project-lite/0.2.2/download",
name = "raze__pin_project_lite__0_2_4",
url = "https://crates.io/api/v1/crates/pin-project-lite/0.2.4/download",
type = "tar.gz",
strip_prefix = "pin-project-lite-0.2.2",
build_file = Label("//rules/rust/remote:BUILD.pin-project-lite-0.2.2.bazel"),
strip_prefix = "pin-project-lite-0.2.4",
build_file = Label("//rules/rust/remote:BUILD.pin-project-lite-0.2.4.bazel"),
)
maybe(
@ -2092,11 +2110,11 @@ def raze_fetch_remote_crates():
maybe(
http_archive,
name = "raze__proc_macro_nested__0_1_6",
url = "https://crates.io/api/v1/crates/proc-macro-nested/0.1.6/download",
name = "raze__proc_macro_nested__0_1_7",
url = "https://crates.io/api/v1/crates/proc-macro-nested/0.1.7/download",
type = "tar.gz",
strip_prefix = "proc-macro-nested-0.1.6",
build_file = Label("//rules/rust/remote:BUILD.proc-macro-nested-0.1.6.bazel"),
strip_prefix = "proc-macro-nested-0.1.7",
build_file = Label("//rules/rust/remote:BUILD.proc-macro-nested-0.1.7.bazel"),
)
maybe(
@ -2200,11 +2218,11 @@ def raze_fetch_remote_crates():
maybe(
http_archive,
name = "raze__rand__0_8_1",
url = "https://crates.io/api/v1/crates/rand/0.8.1/download",
name = "raze__rand__0_8_2",
url = "https://crates.io/api/v1/crates/rand/0.8.2/download",
type = "tar.gz",
strip_prefix = "rand-0.8.1",
build_file = Label("//rules/rust/remote:BUILD.rand-0.8.1.bazel"),
strip_prefix = "rand-0.8.2",
build_file = Label("//rules/rust/remote:BUILD.rand-0.8.2.bazel"),
)
maybe(
@ -2324,6 +2342,15 @@ def raze_fetch_remote_crates():
build_file = Label("//rules/rust/remote:BUILD.redox_syscall-0.1.57.bazel"),
)
maybe(
http_archive,
name = "raze__redox_syscall__0_2_4",
url = "https://crates.io/api/v1/crates/redox_syscall/0.2.4/download",
type = "tar.gz",
strip_prefix = "redox_syscall-0.2.4",
build_file = Label("//rules/rust/remote:BUILD.redox_syscall-0.2.4.bazel"),
)
maybe(
http_archive,
name = "raze__redox_users__0_3_5",
@ -2533,11 +2560,11 @@ def raze_fetch_remote_crates():
maybe(
http_archive,
name = "raze__serde__1_0_118",
url = "https://crates.io/api/v1/crates/serde/1.0.118/download",
name = "raze__serde__1_0_119",
url = "https://crates.io/api/v1/crates/serde/1.0.119/download",
type = "tar.gz",
strip_prefix = "serde-1.0.118",
build_file = Label("//rules/rust/remote:BUILD.serde-1.0.118.bazel"),
strip_prefix = "serde-1.0.119",
build_file = Label("//rules/rust/remote:BUILD.serde-1.0.119.bazel"),
)
maybe(
@ -2569,11 +2596,11 @@ def raze_fetch_remote_crates():
maybe(
http_archive,
name = "raze__serde_derive__1_0_118",
url = "https://crates.io/api/v1/crates/serde_derive/1.0.118/download",
name = "raze__serde_derive__1_0_119",
url = "https://crates.io/api/v1/crates/serde_derive/1.0.119/download",
type = "tar.gz",
strip_prefix = "serde_derive-1.0.118",
build_file = Label("//rules/rust/remote:BUILD.serde_derive-1.0.118.bazel"),
strip_prefix = "serde_derive-1.0.119",
build_file = Label("//rules/rust/remote:BUILD.serde_derive-1.0.119.bazel"),
)
maybe(
@ -2659,11 +2686,11 @@ def raze_fetch_remote_crates():
maybe(
http_archive,
name = "raze__signal_hook__0_3_2",
url = "https://crates.io/api/v1/crates/signal-hook/0.3.2/download",
name = "raze__signal_hook__0_3_3",
url = "https://crates.io/api/v1/crates/signal-hook/0.3.3/download",
type = "tar.gz",
strip_prefix = "signal-hook-0.3.2",
build_file = Label("//rules/rust/remote:BUILD.signal-hook-0.3.2.bazel"),
strip_prefix = "signal-hook-0.3.3",
build_file = Label("//rules/rust/remote:BUILD.signal-hook-0.3.3.bazel"),
)
maybe(
@ -2704,11 +2731,11 @@ def raze_fetch_remote_crates():
maybe(
http_archive,
name = "raze__slog_async__2_5_0",
url = "https://crates.io/api/v1/crates/slog-async/2.5.0/download",
name = "raze__slog_async__2_6_0",
url = "https://crates.io/api/v1/crates/slog-async/2.6.0/download",
type = "tar.gz",
strip_prefix = "slog-async-2.5.0",
build_file = Label("//rules/rust/remote:BUILD.slog-async-2.5.0.bazel"),
strip_prefix = "slog-async-2.6.0",
build_file = Label("//rules/rust/remote:BUILD.slog-async-2.6.0.bazel"),
)
maybe(
@ -2722,11 +2749,11 @@ def raze_fetch_remote_crates():
maybe(
http_archive,
name = "raze__slog_scope__4_3_0",
url = "https://crates.io/api/v1/crates/slog-scope/4.3.0/download",
name = "raze__slog_scope__4_4_0",
url = "https://crates.io/api/v1/crates/slog-scope/4.4.0/download",
type = "tar.gz",
strip_prefix = "slog-scope-4.3.0",
build_file = Label("//rules/rust/remote:BUILD.slog-scope-4.3.0.bazel"),
strip_prefix = "slog-scope-4.4.0",
build_file = Label("//rules/rust/remote:BUILD.slog-scope-4.4.0.bazel"),
)
maybe(
@ -2956,11 +2983,11 @@ def raze_fetch_remote_crates():
maybe(
http_archive,
name = "raze__tempfile__3_1_0",
url = "https://crates.io/api/v1/crates/tempfile/3.1.0/download",
name = "raze__tempfile__3_2_0",
url = "https://crates.io/api/v1/crates/tempfile/3.2.0/download",
type = "tar.gz",
strip_prefix = "tempfile-3.1.0",
build_file = Label("//rules/rust/remote:BUILD.tempfile-3.1.0.bazel"),
strip_prefix = "tempfile-3.2.0",
build_file = Label("//rules/rust/remote:BUILD.tempfile-3.2.0.bazel"),
)
maybe(
@ -3190,11 +3217,11 @@ def raze_fetch_remote_crates():
maybe(
http_archive,
name = "raze__tokio_stream__0_1_1",
url = "https://crates.io/api/v1/crates/tokio-stream/0.1.1/download",
name = "raze__tokio_stream__0_1_2",
url = "https://crates.io/api/v1/crates/tokio-stream/0.1.2/download",
type = "tar.gz",
strip_prefix = "tokio-stream-0.1.1",
build_file = Label("//rules/rust/remote:BUILD.tokio-stream-0.1.1.bazel"),
strip_prefix = "tokio-stream-0.1.2",
build_file = Label("//rules/rust/remote:BUILD.tokio-stream-0.1.2.bazel"),
)
maybe(
@ -3217,11 +3244,11 @@ def raze_fetch_remote_crates():
maybe(
http_archive,
name = "raze__tokio_util__0_6_0",
url = "https://crates.io/api/v1/crates/tokio-util/0.6.0/download",
name = "raze__tokio_util__0_6_1",
url = "https://crates.io/api/v1/crates/tokio-util/0.6.1/download",
type = "tar.gz",
strip_prefix = "tokio-util-0.6.0",
build_file = Label("//rules/rust/remote:BUILD.tokio-util-0.6.0.bazel"),
strip_prefix = "tokio-util-0.6.1",
build_file = Label("//rules/rust/remote:BUILD.tokio-util-0.6.1.bazel"),
)
maybe(
@ -3397,11 +3424,11 @@ def raze_fetch_remote_crates():
maybe(
http_archive,
name = "raze__uuid__0_8_1",
url = "https://crates.io/api/v1/crates/uuid/0.8.1/download",
name = "raze__uuid__0_8_2",
url = "https://crates.io/api/v1/crates/uuid/0.8.2/download",
type = "tar.gz",
strip_prefix = "uuid-0.8.1",
build_file = Label("//rules/rust/remote:BUILD.uuid-0.8.1.bazel"),
strip_prefix = "uuid-0.8.2",
build_file = Label("//rules/rust/remote:BUILD.uuid-0.8.2.bazel"),
)
maybe(

View File

@ -67,9 +67,9 @@ rust_library(
"@raze__bitflags__1_2_1//:bitflags",
"@raze__bytes__0_5_6//:bytes",
"@raze__crossbeam_channel__0_4_4//:crossbeam_channel",
"@raze__futures_channel__0_3_9//:futures_channel",
"@raze__futures_util__0_3_9//:futures_util",
"@raze__log__0_4_11//:log",
"@raze__futures_channel__0_3_10//:futures_channel",
"@raze__futures_util__0_3_10//:futures_util",
"@raze__log__0_4_13//:log",
"@raze__once_cell__1_5_2//:once_cell",
"@raze__parking_lot__0_11_1//:parking_lot",
"@raze__pin_project__0_4_27//:pin_project",

View File

@ -51,9 +51,9 @@ rust_library(
deps = [
"@raze__bitflags__1_2_1//:bitflags",
"@raze__bytes__0_5_6//:bytes",
"@raze__futures_core__0_3_9//:futures_core",
"@raze__futures_sink__0_3_9//:futures_sink",
"@raze__log__0_4_11//:log",
"@raze__futures_core__0_3_10//:futures_core",
"@raze__futures_sink__0_3_10//:futures_sink",
"@raze__log__0_4_13//:log",
"@raze__tokio__0_2_24//:tokio",
"@raze__tokio_util__0_2_0//:tokio_util",
],

View File

@ -51,9 +51,9 @@ rust_library(
deps = [
"@raze__bitflags__1_2_1//:bitflags",
"@raze__bytes__0_5_6//:bytes",
"@raze__futures_core__0_3_9//:futures_core",
"@raze__futures_sink__0_3_9//:futures_sink",
"@raze__log__0_4_11//:log",
"@raze__futures_core__0_3_10//:futures_core",
"@raze__futures_sink__0_3_10//:futures_sink",
"@raze__log__0_4_13//:log",
"@raze__pin_project__0_4_27//:pin_project",
"@raze__tokio__0_2_24//:tokio",
"@raze__tokio_util__0_3_1//:tokio_util",

View File

@ -60,9 +60,9 @@ rust_library(
"@raze__actix_service__1_0_6//:actix_service",
"@raze__actix_utils__2_0_0//:actix_utils",
"@raze__either__1_6_1//:either",
"@raze__futures_util__0_3_9//:futures_util",
"@raze__futures_util__0_3_10//:futures_util",
"@raze__http__0_2_3//:http",
"@raze__log__0_4_11//:log",
"@raze__log__0_4_13//:log",
"@raze__trust_dns_proto__0_19_6//:trust_dns_proto",
"@raze__trust_dns_resolver__0_19_6//:trust_dns_resolver",
],

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