MVP build (#1)
ci.vdhsn.com/push Build is failing Details

- [x] Runner
- [x] Catalog
- [x] Web Client
- [x] Deployed to beta
- [x] Deployed to prod

Co-authored-by: Adam Veldhousen <adamveld12@gmail.com>
Reviewed-on: #1
feat/swagger
Adam Veldhousen 11 months ago committed by Adam Veldhousen
parent b8d34edd95
commit bfb79bc2a9
Signed by: adam
GPG Key ID: 6DB29003C6DD1E4B

@ -0,0 +1,41 @@
kind: pipeline
type: kubernetes
name: Build Images
trigger:
event:
- push
steps:
- name: Build & Publish Catalog
image: plugins/kaniko
settings:
dockerfile: "./src/Dockerfile.prod-backend"
context: "./src"
registry: git.vdhsn.com
repo: git.vdhsn.com/barretthousen/service-catalog
username:
from_secret: DOCKER_USERNAME
password:
from_secret: DOCKER_PASSWORD
args:
- "service=catalog"
no-push: true
tags:
- ${DRONE_COMMIT_SHA}
- name: Build & Publish Runner
image: plugins/kaniko
settings:
dockerfile: "./src/Dockerfile.prod-backend"
context: "./src"
registry: git.vdhsn.com
repo: git.vdhsn.com/barretthousen/service-runner
username:
from_secret: DOCKER_USERNAME
password:
from_secret: DOCKER_PASSWORD
args:
- "service=runner"
no-push: true
tags:
- ${DRONE_COMMIT_SHA}

32
.gitignore vendored

@ -0,0 +1,32 @@
.kubeconfig
.env
.env.*
.vscode
./src/.idea
# build output
.bin
# auto generated files
*.pb.go
*.pb.gw.go
*.swagger.json
src/**/internal/data/postgres/*.go
# frontend
node_modules
./src/web-client/build
./src/web-client/.svelte-kit
./src/web-client/package
vite.config.js.timestamp-*
vite.config.ts.timestamp-*
.DS_Store
# keys
.age.txt

@ -0,0 +1,6 @@
creation_rules:
- path_regex: env/master\.json$
pgp: 4FA79E5B6598505C8DFA30A7A466CEE1415C0B9C
- path_regex: env/base/.*\.yaml$
encrypted_regex: ^(data|stringData)$
age: age1d5vst0g82v6xml29ydsrxefmf3vclgm6dj3npw6mefa7yu9xueaqztjqlg

@ -0,0 +1,11 @@
tilt 0.32.3
ctlptl 0.8.18
kind 0.18.0
kustomize 5.0.1
kubectl 1.26.3
buf 1.17.0
k9s 0.26.3
golang 1.19
nodejs lts
sops 3.7.3
jq 1.6

@ -0,0 +1,30 @@
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Delve into Runner",
"type": "go",
"request": "attach",
"mode": "remote",
"port": 2345,
"host": "127.0.0.1",
"trace": "verbose",
// "remotePath": "/go",
"cwd": "${workspaceFolder}",
},
{
"name": "Delve into Catalog",
"type": "go",
"request": "attach",
"mode": "remote",
"port": 2346,
"host": "127.0.0.1",
"trace": "verbose",
"cwd": "${workspaceFolder}",
// "remotePath": "/go"
}
]
}

@ -0,0 +1,126 @@
K8S_VERSION = v1.26.3
KUBECONFIG = $(PWD)/.kubeconfig
CLUSTER = $(shell kind get clusters | grep 'bh-local')
GOBIN = $(shell go env GOPATH)/bin
###################
# Utilities
###################
.PHONY: setup
setup: $(GOBIN)/sqlc $(GOBIN)/buf
@awk '{ print $$1 }' .tool-versions | xargs -I {} asdf plugin add {} || true
@asdf install || true
.PHONY: gen
gen: $(GOBIN)/sqlc buf.lock
@$(GOBIN)/sqlc generate -f ./src/sqlc.yaml
@cd ./src && $(GOBIN)/buf generate
@cd ./src/web-client && npm i
@cd ./src/admin-client && npm i
.PHONY: dev
dev: .kubeconfig
KUBECONFIG=$(KUBECONFIG) tilt up
.PHONY: clobber
clobber:
KUBECONFIG=$(KUBECONFIG) ctlptl delete registry kind-bh-registry || true
KUBECONFIG=$(KUBECONFIG) ctlptl delete cluster kind-bh-local || true
@rm -f $(KUBECONFIG)
.PHONY: secrets
secrets: ./env/.age.txt
.PHONY: acceptance-test
acceptance-test:
@docker run -it --rm \
-v $(PWD)/src/$(SERVICE)/acceptance-tests.yml:/tests/tests.yml \
-e "TEST_HOST=$(ORIGIN)" \
nytimes/httptest
##############################
# Container Image Building
# see ./doc/deployment.md for details
##############################
SERVICE = "catalog"
ENV ?= ""
BUILD_INITIATOR = "Development Machine"
VERSION = $(shell git rev-parse --verify --short HEAD)
GIT_REF = $(shell git rev-parse --verify HEAD)
BUILD_DATE := $(shell date +%Y-%m-%d-%T)
.PHONY: build-client-image
build-client-image:
@docker build --target=production \
--label 'com.barretthousen.service=$(SERVICE)' \
--label 'com.barretthousen.version=$(VERSION)' \
--label 'com.barretthousen.git-ref=$(GIT_REF)' \
--label 'com.barretthousen.build-date=$(BUILD_DATE)' \
--label 'com.barrethousen.builder=$(BUILD_INITIATOR)' \
--build-arg 'service=$(SERVICE)' \
-t barretthousen/client-$(SERVICE):$(VERSION) \
-t git.vdhsn.com/barretthousen/client-$(SERVICE):$(VERSION) \
-f ./src/Dockerfile.frontend ./src/$(SERVICE)
@docker push git.vdhsn.com/barretthousen/client-$(SERVICE):$(VERSION)
@[ ! -z $(ENV) ] && docker tag git.vdhsn.com/barretthousen/client-$(SERVICE):$(VERSION) git.vdhsn.com/barretthousen/client-$(SERVICE):beta || true
@[ ! -z $(ENV) ] && docker push git.vdhsn.com/barretthousen/client-$(SERVICE):$(ENV) || true
.PHONY: build-backend-image
build-backend-image:
@docker build --target=production \
--label 'com.barretthousen.service=$(SERVICE)' \
--label 'com.barretthousen.version="$(VERSION)"' \
--label 'com.barretthousen.git-ref="$(GIT_REF)"' \
--label 'com.barretthousen.build-date=$(BUILD_DATE)' \
--label 'com.barrethousen.builder=$(BUILD_INITIATOR)' \
--build-arg 'service=$(SERVICE)' \
-t barretthousen/service-$(SERVICE):$(VERSION) \
-t git.vdhsn.com/barretthousen/service-$(SERVICE):$(VERSION) \
-f ./src/Dockerfile.prod-backend ./src
@docker push git.vdhsn.com/barretthousen/service-$(SERVICE):$(VERSION)
@[ ! -z $(ENV) ] && docker tag git.vdhsn.com/barretthousen/service-$(SERVICE):$(VERSION) git.vdhsn.com/barretthousen/service-$(SERVICE):beta || true
@[ ! -z $(ENV) ] && docker push git.vdhsn.com/barretthousen/service-$(SERVICE):beta || true
# TODO: investigate tagging without needing to pull? https://dille.name/blog/2018/09/20/how-to-tag-docker-images-without-pulling-them/
.PHONY: promote-client-prod
promote-client-prod:
@docker pull git.vdhsn.com/barretthousen/client-$(SERVICE):beta
@docker tag git.vdhsn.com/barretthousen/client-$(SERVICE):beta git.vdhsn.com/barretthousen/client-$(SERVICE):prod
@docker push git.vdhsn.com/barretthousen/client-$(SERVICE):prod
.PHONY: promote-backend-prod
promote-backend-prod:
@docker pull git.vdhsn.com/barretthousen/service-$(SERVICE):beta
@docker tag git.vdhsn.com/barretthousen/service-$(SERVICE):beta git.vdhsn.com/barretthousen/service-$(SERVICE):prod
@docker push git.vdhsn.com/barretthousen/service-$(SERVICE):prod
####################
# File targets
####################
buf.lock: $(GOBIN)/buf
@$(GOBIN)/buf mod update ./src
$(GOBIN)/buf:
@go install github.com/bufbuild/buf/cmd/buf@v1.17.0
$(GOBIN)/sqlc:
@go install github.com/kyleconroy/sqlc/cmd/sqlc@latest
.kubeconfig:
@KUBECONFIG=$(KUBECONFIG) ctlptl create registry kind-bh-registry --port=5005
@KUBECONFIG=$(KUBECONFIG) ctlptl create cluster kind --name=kind-bh-local --registry=kind-bh-registry --kubernetes-version $(K8S_VERSION)
@kind get kubeconfig --name=bh-local > .kubeconfig
# used to encrypt/decrypt sensitive values with sops
age_identity=$(shell sops -d ./env/master.json)
./env/.age.txt:
@echo "# created: $(shell echo '$(age_identity)' | jq -r '.created')" >> $@
@echo "# public key: $(shell echo '$(age_identity)' | jq -r '.public_key')" >> $@
@echo "$(shell echo '$(age_identity)' | jq -r '.private_key')" >> $@
@echo "$@ created!"

@ -2,59 +2,103 @@
Search and get alerts for items across the most popular auction sites.
Built with microservice architecture and various fancy tools for learning purposes
### Links
- [Keybase Team Chat](keybase://team/barretthousen)
- [Source](https://git.vdhsn.com/Barretthousen/barretthousen)
- [Auction terms glossary](https://auctionsneapolitan.com/Auction-Terms-Glossary.html)
- [User's Site](https://barretthousen.com)
- [Admin Panel](https://admin.barretthousen.com)
- [(Staging) User's Site](https://beta.barretthousen.com)
- [(Staging) Admin Panel](https://beta.admin.barretthousen.com)
## Technology
### Goals
1. Ability to search upcoming and live auctions across major auction sites
2. Get an email digest of upcoming auctions for the week
Future goals
1. Get email alerts when these auctions are about to go live
2. Specify search criteria for email alerts
This project is for fun and learning so there are a lot of tools at play:
Infra
- [Tilt](https://tilt.dev): local development env orchestration
- [Ctlptl](https://github.com/tilt-dev/ctlptl): Automate local kubernetes clusters for local dev
- [Docker]()
- [Postgres]():
- [Traefik]():
- [Kustomize]():
- [Helm]():
## Technology
Backend
- [Go]()
- [goose](): Go SQL db migration tool
- [Sqlc](https://sqlc.dev/): Generate Go code to query SQL databases from migrations in a type safe way
- [Buf](): Nice frontend for protoc and .proto libraries
- [Protobufs]():
For Users
- [Prod](https://barretthousen.com)
- [Staging](https://beta.barretthousen.com)
Frontend
- [Typescript]():
- [SvelteKit](https://kit.svelte.dev/):
- [TailwindCSS]():
For Admins
- [Prod](https://beta.barretthousen.com)
- [Staging](https://admin.beta.barretthousen.com)
- [Architecture Diagram (use diagrams.net)](./doc/Barretthousen_mvp.drawio)
- [Diagram (use diagrams.net)](./doc/bh_design.drawio)
![Arcchitecure Diagram MVP](./doc/Barretthousen_mvp.drawio.svg)
![Diagram](./doc/bh_design_overview.svg)
### Services
- Web-client
> [Auction terms glossary](https://auctionsneapolitan.com/Auction-Terms-Glossary.html)
- [Web-client](./src/web-client/)
Frontend site that users access to browse upcoming auctions and subscribe for updates to their searches
- Catalog
API for searching upcoming auctions.
- [Admin-client](./src/admin-client/)
Enables site administrators to kicks off scrape and email jobs in Runner and Ringman, and view status on current/past jobs.
- Ringman
Manages email subscriptions and sending emails to users about upcoming auctions.
- [Catalog](./src/catalog/)
API for searching upcoming auctions.
- Runner
- [Runner](./src/runner/)
Scrapes sites for upcoming auctions.
Transforms the data into a suitable shape and stores it for use by the frontend.
- Auctioneer
Enables site administrators to kicks off scrape and email jobs in Runner and Ringman, and view status on current/past jobs.
- [Ringman](./src/ringman/)
Manages email subscriptions and sending emails to users about upcoming auctions.
- [Proxy-web](./src/proxy-web/)
Proxies JSON HTTP API requests for the web client to GRPC based services downstream
- [Proxy-admin](./src/proxy-admin/)
Proxies JSON HTTP API requests for the admin client to GRPC based services downstream
## Contributing
You will need the following prereqs installed:
- Docker
- Make
- [asdf](https://asdf-vm.com/guide/getting-started.html)
Everything you need is in the makefile:
```sh
# install asdf tools, sqlc, buf
make setup
# generate protobufs and sql boilerplate
make gen
# spin up a k8s cluster, build and deploy services locally w/ hot reloading
make dev
# build production docker images for the backend microservices, optionally push to the respective env
make build-backend-image SERVICE=[catalog, runner, proxy-web, proxy-admin] [ENV=[beta, prod]]
# build client docker image for web frontends, optionally push to the respective env
make build-client-image SERVICE=[web-client, admin-client] [ENV=[beta, prod]]
# acceptance tests
make acceptance-test SERVICE=[runner,catalog] ORIGIN=[beta.barretthousen.com,beta.admin.barretthousen.com]
```
- BHDB
Monolithic postgres datbabase tying it all together
For how to deploy [read me](./doc/deployment.md).

@ -0,0 +1,165 @@
print("""
-----------------------------------------------------------------
✨ Starting up Barretthousen stack
-----------------------------------------------------------------
""".strip())
load('ext://helm_resource', 'helm_resource', 'helm_repo')
load('ext://deployment', 'deployment_create')
load('ext://restart_process', 'docker_build_with_restart')
helm_repo('bitnami', 'https://charts.bitnami.com/bitnami', labels=["9-repos"])
helm_repo('traefik', 'https://traefik.github.io/charts', labels=["9-repos"])
helm_repo('grafana', 'https://grafana.github.io/helm-charts', labels=["9-repos"])
helm_resource(
'ingress',
'traefik/traefik',
namespace='barretthousen-local',
flags=[
'--set', 'logs.access.enabled=true'
],
port_forwards=[
port_forward(8000, 8000, name="Traefik HTTP :8000"),
port_forward(9000, 9000, name='Traefik Dashboard', link_path='/dashboard/#/')
],
resource_deps=['traefik'],
labels=["1-ingress"]
)
k8s_resource(
workload='ingress',
labels='1-ingress',
links=[
link(url='http://admin.localhost:8000', name='admin.localhost'),
link(url='http://bh.localhost:8000', name='bh.localhost'),
]
)
helm_resource(
'postgres',
'bitnami/postgresql',
namespace='barretthousen-local',
flags=[
'--set', 'fullnameOverride=bh-db',
'--set', 'auth.enablePostgresUser=true',
'--set', 'auth.postgresPassword=bh-admin',
'--set', 'auth.database=bh',
],
port_forwards=[port_forward(5432, 5432, name='BH DB')],
resource_deps=['bitnami'],
labels=["9-data"]
)
def bh_client(service="", port_forwards=[], labels=['2-services'], deps=['ingress']):
basepath = './src/{}-client'.format(service)
docker_build(
ref='barretthousen/client-{}-client'.format(service),
context=basepath,
dockerfile='./src/Dockerfile.frontend'.format(service),
target='development',
build_args={
"service": service
},
entrypoint='vite dev --port=80 --host=0.0.0.0 --strictPort --logLevel info',
live_update=[
sync(basepath + '/src', '/opt/{}-client/src'.format(service)),
sync(basepath + '/static', '/opt/{}-client/static'.format(service)),
run('cd {} && npm install'.format(basepath), trigger=[basepath+'/package.json', basepath+'/package.lock.json'])
]
)
k8s_resource(
workload='{}-client-local'.format(service),
port_forwards=port_forwards,
labels=['2-services'],
resource_deps=deps
)
def bh_backend_service(service="", port_forwards=[], migrateDB=False, devMode=True, labels=['2-services'], deps=['postgres']):
local_resource(
'{}-go-compile'.format(service),
'CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -gcflags "all=-N -l" -o .bin/{}-debug ./src/{}'.format(service, service),
deps=['./src/{}'.format(service), './src/lib'],
resource_deps=deps,
labels=['3-compilation']
)
# complains about grpc port still being in use, so maybe the service isn't exiting cleanly
entry_cmd = [
'/go/bin/dlv',
'--headless',
'--listen=0.0.0.0:2345',
'--api-version=2',
'--log',
'--accept-multiclient',
'--log-output=rpc',
'exec',
'/opt/{}-debug'.format(service),
'--continue'
]
if migrateDB:
entry_cmd += ['--', '-migrate']
docker_build_with_restart(
ref="barretthousen/service-{}".format(service),
dockerfile="./src/Dockerfile.dev-backend",
context=".",
entrypoint=entry_cmd,
build_args={
"service": service
},
trigger = [
'./.bin/{}-debug'.format(service)
],
only = [
'./.bin/{}-debug'.format(service),
'./src/runner',
'./src/catalog',
'./src/proxy-admin',
'./src/proxy-web',
'./src/lib'
],
live_update=[
sync('./.bin', '/opt'),
sync('./src', '/go/src'),
]
)
k8s_resource(
workload='{}-local'.format(service),
port_forwards=port_forwards,
labels=labels,
resource_deps=deps,
)
k8s_yaml(
kustomize("./env/local")
)
k8s_resource(
workload='runner-sync-local',
labels='2-services'
)
bh_backend_service(service="runner", migrateDB=True, port_forwards=[
port_forward(2345, name='Delve port')
])
bh_backend_service(service="catalog", migrateDB=True, port_forwards=[
port_forward(2346, 2345, name='Delve port')
])
bh_backend_service(service="proxy-admin", port_forwards=[
port_forward(8082, 80, name="HTTP API @ localhost:8082")
], deps=['ingress'])
bh_backend_service(service="proxy-web", port_forwards=[
port_forward(8081, 80, name="HTTP API @ localhost:8081")
], deps=['ingress'])
bh_client(service='web')
bh_client(service='admin')

@ -0,0 +1,51 @@
# Auction site sources
| Name | API Available | Implemented |
|------------------|---------------|-------------|
| [Live Auctioneers](https://www.liveauctioneers.com/) | | JSON | :check: |
| [Catawiki](https://www.catawiki.com/en/) | | JSON | |
| [ProxiBid](https://www.proxibid.com/) | | None | |
| [The Saleroom](https://www.the-saleroom.com) | | None | |
| [Bonhams](https://www.bonhams.com) | | JSON | |
- Bonhams
```
curl 'https://www.bonhams.com/_next/data/AaGLQwUcnyWHq-PEz9Th6/default/auctions/upcoming.json' \
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/113.0' \
-H 'Accept: */*' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br' \
-H 'Referer: https://www.bonhams.com/auctions/upcoming/' \
-H 'x-nextjs-data: 1' \
-H 'sentry-trace: 1ad7f55ff4dd4760b0ad3e6cca968714-823c0cb4ef9058f5-0' \
-H 'baggage: sentry-environment=production,sentry-release=0783195e,sentry-transaction=%2Fauctions%2Fupcoming,sentry-public_key=614543fea9dc4eee80879fcc1c88e34a,sentry-trace_id=1ad7f55ff4dd4760b0ad3e6cca968714,sentry-sample_rate=0' \
-H 'DNT: 1' \
-H 'Connection: keep-alive' \
-H 'Cookie: sessionid=m2crnnyyduu2tm6hvx3aa1e6wzy5oez9; ld_id=2420; xm_id=c22a8252-23ba-4b2e-8161-35ae5b8b56ff' \
-H 'Sec-Fetch-Dest: empty' \
-H 'Sec-Fetch-Mode: cors' \
-H 'Sec-Fetch-Site: same-origin' \
-H 'Pragma: no-cache' \
-H 'Cache-Control: no-cache'
```
- Catawiki
```
curl 'https://www.catawiki.com/buyer/api/v1/auctions?locale=en&per_page=25' \
-H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/113.0' \
-H 'Accept: application/json' \
-H 'Accept-Language: en-US,en;q=0.5' \
-H 'Accept-Encoding: gzip, deflate, br' \
-H 'Referer: https://www.catawiki.com/en/' \
-H 'DNT: 1' \
-H 'Connection: keep-alive' \
-H 'Cookie: ab_first_visit=1; absmartly_id=a808d691-6a64-4797-bf77-97516c2917a9; cw_sid=2e67590dbaee388af8b5f1a59b4dd12f5d01759bc6a4603c6a8ae1add4637bdd; cw_ab=eaVcsgJ5TBW7bkaaWxN/6QAB; enable_marketing_cookies=true; enable_analytical_cookies=true; cookie_preferences_used_cta=accept_all; has_pending_cookie_consent_sync=true; rmb_disabled_at=1684553408868; _catawiki_session=KQn7aiPKK6FUaO8zr8yfwrAVUtfKv6wXQ9ntoW00Qux19aliGIcXXNUs6vmomxsOSruGU%2Bn%2BsNp8%2FzessvIc4ZZ7wkWJkhiHKHhV13dBUYm4Tu3SvP2nOPKXFzBJngnwgJRh%2BUIdoTv86KDmB%2B8%3D--aRi3oNveTClu9Grs--CFMYiz%2BOtTknj34sB2fblQ%3D%3D' \
-H 'Pragma: no-cache' \
-H 'Cache-Control: no-cache' \
-H 'TE: trailers'
```

@ -1,637 +0,0 @@
<mxfile host="app.diagrams.net" modified="2023-04-16T17:34:01.973Z" agent="Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/111.0" etag="g01UfqVrYfXmJxj10a0k" version="21.1.7" type="device">
<diagram name="High level" id="BL8KaFisCtBiJRqkGTb9">
<mxGraphModel dx="3802" dy="1124" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="JNN8aSlnDbWN0y9jmZyT-1" value="&lt;div&gt;Web Client&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry y="110" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-39" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="JNN8aSlnDbWN0y9jmZyT-2" target="H4J2X_9uFRljxSkwpIMP-36">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-2" value="&lt;div&gt;Users&lt;/div&gt;" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-310" y="110" width="120" height="80" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-24" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0;entryDx=0;entryDy=52.5;entryPerimeter=0;" edge="1" parent="1" source="JNN8aSlnDbWN0y9jmZyT-3" target="JNN8aSlnDbWN0y9jmZyT-17">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-3" value="&lt;div&gt;Catalog&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="150" y="200" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-10" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1.013;exitY=0.613;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="JNN8aSlnDbWN0y9jmZyT-1" target="JNN8aSlnDbWN0y9jmZyT-3">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-80" y="130" as="sourcePoint" />
<mxPoint y="150" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-25" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0;entryDx=0;entryDy=52.5;entryPerimeter=0;" edge="1" parent="1" source="JNN8aSlnDbWN0y9jmZyT-11" target="JNN8aSlnDbWN0y9jmZyT-17">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-11" value="&lt;div&gt;Ringman&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="150" y="90" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-12" value="" style="endArrow=classic;html=1;rounded=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;exitX=1;exitY=0.6;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="1" source="JNN8aSlnDbWN0y9jmZyT-1" target="JNN8aSlnDbWN0y9jmZyT-11">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<mxPoint x="-70" y="140" as="sourcePoint" />
<mxPoint x="10" y="300" as="targetPoint" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-17" value="&lt;div&gt;BHDB&lt;/div&gt;" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" vertex="1" parent="1">
<mxGeometry x="470" y="110" width="60" height="80" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="JNN8aSlnDbWN0y9jmZyT-19" target="JNN8aSlnDbWN0y9jmZyT-17">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-19" value="&lt;div&gt;Runner&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="460" y="290" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-20" value="&lt;div&gt;Runner&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="470" y="300" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-21" value="&lt;div&gt;Runner&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="480" y="310" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-22" value="&lt;div&gt;Runner&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="490" y="320" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-26" value="&lt;div&gt;Catalog&lt;/div&gt;" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-190" y="440" width="180" height="90" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-27" value="GetUpcoming(searchCriteria)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-26">
<mxGeometry y="30" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-1" value="&lt;div&gt;CreateUpcoming(Sale)&lt;/div&gt;" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-26">
<mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-30" value="&lt;div&gt;Ringman&lt;/div&gt;" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry y="440" width="180" height="180" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-31" value="Subscribe(email)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-30">
<mxGeometry y="30" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-3" value="VerifySubscription(email,token)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-30">
<mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-32" value="&lt;div&gt;Unsubscribe(email)&lt;/div&gt;" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-30">
<mxGeometry y="90" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-33" value="&lt;div&gt;SendEmails()&lt;/div&gt;" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-30">
<mxGeometry y="120" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-34" value="GetJobs(searchCriteria)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-30">
<mxGeometry y="150" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-34" value="Runner" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="193" y="440" width="177" height="90" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-35" value="&lt;div&gt;FindNewUpcoming(criteria)&lt;br&gt;&lt;/div&gt;" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-34">
<mxGeometry y="30" width="177" height="30" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-1" value="GetJobs(searchCriteria)" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-34">
<mxGeometry y="60" width="177" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-64" value="&lt;div&gt;Auction&lt;/div&gt;" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
<mxGeometry x="-190" y="680" width="180" height="300" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-65" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-64">
<mxGeometry y="30" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-66" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-65">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-67" value="ID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-65">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-68" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-64">
<mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-69" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-68">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-70" value="Title" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-68">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-71" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-64">
<mxGeometry y="90" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-72" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-71">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-73" value="Description" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-71">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-74" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-64">
<mxGeometry y="120" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-75" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-74">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-76" value="&lt;div&gt;StartTS&lt;/div&gt;" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-74">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-121" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-64">
<mxGeometry y="150" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-122" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-121">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-123" value="&lt;div&gt;EndTS&lt;/div&gt;" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-121">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-118" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-64">
<mxGeometry y="180" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-119" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-118">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-120" value="&lt;div&gt;SourceSiteName&lt;/div&gt;" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-118">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-81" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-64">
<mxGeometry y="210" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-82" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-81">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-83" value="&lt;div&gt;SourceURL&lt;/div&gt;" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-81">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-84" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-64">
<mxGeometry y="240" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-85" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-84">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-86" value="Photo1" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-84">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-87" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-64">
<mxGeometry y="270" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-88" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-87">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-89" value="Photo2" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-87">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-93" value="&lt;div&gt;User&lt;/div&gt;" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
<mxGeometry y="680" width="180" height="150" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-94" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-93">
<mxGeometry y="30" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-95" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-94">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-96" value="ID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-94">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-146" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-93">
<mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-147" value="UQ" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-146">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-148" value="EmailAddress" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-146">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-97" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-93">
<mxGeometry y="90" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-98" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-97">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-99" value="EmailVerifiedTS" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-97">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-4" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-93">
<mxGeometry y="120" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-5" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-4">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-6" value="CreatedTS" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-4">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-124" value="&lt;div&gt;ScrapeJob&lt;/div&gt;" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
<mxGeometry x="193" y="680" width="180" height="210" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-125" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-124">
<mxGeometry y="30" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-126" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-125">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-127" value="&lt;div&gt;ID&lt;/div&gt;" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-125">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-128" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;strokeColor=default;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-124">
<mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-129" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-128">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-130" value="StartedTS" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-128">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-131" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-124">
<mxGeometry y="90" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-132" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-131">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-133" value="CompletedTS" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-131">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-134" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-124">
<mxGeometry y="120" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-135" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-134">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-136" value="AuctionsFound" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-134">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-137" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-124">
<mxGeometry y="150" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-138" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-137">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-139" value="TargetSiteName" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-137">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-149" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-124">
<mxGeometry y="180" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-150" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-149">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-151" value="Errors" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-149">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-156" value="EmailSubscription" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
<mxGeometry y="840" width="180" height="150" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-157" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-156">
<mxGeometry y="30" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-158" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-157">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-159" value="ID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-157">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-178" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-156">
<mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-179" value="UQ" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-178">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-180" value="UserID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-178">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-175" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-156">
<mxGeometry y="90" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-176" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-175">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-177" value="&lt;div&gt;SearchCriteria&lt;/div&gt;" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=0;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-175">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-166" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-156">
<mxGeometry y="120" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-167" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;strokeColor=inherit;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-166">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-168" value="&lt;div&gt;LastSentTS&lt;/div&gt;" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="JNN8aSlnDbWN0y9jmZyT-166">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="S1HCfoW5zDfGPMNCMrQO-7" target="JNN8aSlnDbWN0y9jmZyT-11">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-38" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="S1HCfoW5zDfGPMNCMrQO-7" target="JNN8aSlnDbWN0y9jmZyT-22">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="290" y="320" />
<mxPoint x="290" y="360" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-2" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0;entryDx=0;entryDy=52.5;entryPerimeter=0;" edge="1" parent="1" source="S1HCfoW5zDfGPMNCMrQO-7" target="JNN8aSlnDbWN0y9jmZyT-17">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="290" y="320" />
<mxPoint x="290" y="163" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-7" value="&lt;div&gt;Auctioneer&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry y="280" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-11" value="Auctioneer" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="388" y="440" width="182" height="120" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-12" value="&lt;div&gt;TriggerSendEmails&lt;/div&gt;" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-11">
<mxGeometry y="30" width="182" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-39" value="TriggerFindNewUpcoming" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-11">
<mxGeometry y="60" width="182" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-34" value="GetCommandHistory" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-11">
<mxGeometry y="90" width="182" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-13" value="CommandHistory" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
<mxGeometry x="388" y="680" width="180" height="240" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-14" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-13">
<mxGeometry y="30" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-15" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-14">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-16" value="&lt;div&gt;ID&lt;/div&gt;" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-14">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-17" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-13">
<mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-18" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-17">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-19" value="Name" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-17">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-35" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-13">
<mxGeometry y="90" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-36" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-35">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-37" value="Initiator" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-35">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-20" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-13">
<mxGeometry y="120" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-21" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-20">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-22" value="ExecutedTS" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-20">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-23" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-13">
<mxGeometry y="150" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-24" value="" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-23">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-25" value="Target" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-23">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-26" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-13">
<mxGeometry y="180" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-27" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-26">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-28" value="Params" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-26">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-29" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=0;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-13">
<mxGeometry y="210" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-30" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;editable=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-29">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-31" value="Errors" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="S1HCfoW5zDfGPMNCMrQO-29">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-41" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="S1HCfoW5zDfGPMNCMrQO-32" target="H4J2X_9uFRljxSkwpIMP-38">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-32" value="Admin" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-310" y="280" width="120" height="80" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-3" value="SendEmailJob" style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;html=1;" vertex="1" parent="1">
<mxGeometry y="1000" width="180" height="180" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-4" value="" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-3">
<mxGeometry y="30" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-5" value="PK" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-4">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-6" value="ID" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=5;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-4">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-19" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-3">
<mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-20" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-19">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-21" value="StartedTS" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=0;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-19">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-22" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-3">
<mxGeometry y="90" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-23" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-22">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-24" value="CompletedTS" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=0;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-22">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-25" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-3">
<mxGeometry y="120" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-26" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-25">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-27" value="EmailsSent" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=0;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-25">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-28" style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;top=0;left=0;right=0;bottom=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-3">
<mxGeometry y="150" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-29" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-28">
<mxGeometry width="30" height="30" as="geometry">
<mxRectangle width="30" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-30" value="Errors" style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;align=left;spacingLeft=6;fontStyle=0;overflow=hidden;whiteSpace=wrap;html=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-28">
<mxGeometry x="30" width="150" height="30" as="geometry">
<mxRectangle width="150" height="30" as="alternateBounds" />
</mxGeometry>
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-40" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="H4J2X_9uFRljxSkwpIMP-36" target="JNN8aSlnDbWN0y9jmZyT-1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-36" value="&lt;div&gt;@&lt;/div&gt;&lt;div&gt;alpha&lt;/div&gt;&lt;div&gt;beta&lt;br&gt;&lt;/div&gt;" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.direct_data;whiteSpace=wrap;align=center;" vertex="1" parent="1">
<mxGeometry x="-170" y="120" width="140" height="60" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-42" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="H4J2X_9uFRljxSkwpIMP-38" target="S1HCfoW5zDfGPMNCMrQO-7">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-38" value="&lt;div&gt;admin&lt;/div&gt;&lt;div&gt;alpha-admin&lt;/div&gt;&lt;div&gt;beta-admin&lt;br&gt;&lt;/div&gt;" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.direct_data;whiteSpace=wrap;align=center;" vertex="1" parent="1">
<mxGeometry x="-160" y="290" width="130" height="60" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-43" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#00188D;shape=mxgraph.mscae.enterprise.lock" vertex="1" parent="1">
<mxGeometry x="-119" y="240" width="39" height="50" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-44" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#00188D;shape=mxgraph.mscae.enterprise.lock_unlocked" vertex="1" parent="1">
<mxGeometry x="-119" y="70" width="37" height="50" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-51" value="Web Client" style="swimlane;fontStyle=0;childLayout=stackLayout;horizontal=1;startSize=30;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;whiteSpace=wrap;html=1;" vertex="1" parent="1">
<mxGeometry x="-380" y="440" width="180" height="90" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-52" value="SearchPage" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-51">
<mxGeometry y="30" width="180" height="30" as="geometry" />
</mxCell>
<mxCell id="H4J2X_9uFRljxSkwpIMP-53" value="SubscriptionsPage" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;spacingLeft=4;spacingRight=4;overflow=hidden;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;rotatable=0;whiteSpace=wrap;html=1;" vertex="1" parent="H4J2X_9uFRljxSkwpIMP-51">
<mxGeometry y="60" width="180" height="30" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 183 KiB

@ -0,0 +1,177 @@
<mxfile host="app.diagrams.net" modified="2023-06-12T21:54:22.543Z" agent="Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/112.0" etag="x7K_nP_hUPP84gUb8Ro3" version="21.1.7" type="device">
<diagram name="High level" id="BL8KaFisCtBiJRqkGTb9">
<mxGraphModel dx="2053" dy="1131" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<mxCell id="JNN8aSlnDbWN0y9jmZyT-1" value="&lt;div&gt;Web Client&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
<mxGeometry x="-320" y="70" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-6" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="JNN8aSlnDbWN0y9jmZyT-2" target="wSJkOsJQY9M_Z095WERL-4">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-2" value="&lt;div&gt;Users&lt;/div&gt;" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="-840" y="110" width="120" height="80" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-17" value="&lt;div&gt;catalog-db&lt;/div&gt;" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" parent="1" vertex="1">
<mxGeometry x="80" y="57.5" width="80" height="105" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-54" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="JNN8aSlnDbWN0y9jmZyT-19" target="wSJkOsJQY9M_Z095WERL-50">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="JNN8aSlnDbWN0y9jmZyT-19" value="&lt;div&gt;Runner&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" parent="1" vertex="1">
<mxGeometry x="-60" y="440" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-10" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="S1HCfoW5zDfGPMNCMrQO-32" target="wSJkOsJQY9M_Z095WERL-8">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="S1HCfoW5zDfGPMNCMrQO-32" value="Admin" style="ellipse;shape=cloud;whiteSpace=wrap;html=1;" parent="1" vertex="1">
<mxGeometry x="-830" y="400" width="120" height="80" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="wSJkOsJQY9M_Z095WERL-4" target="JNN8aSlnDbWN0y9jmZyT-1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-21" value="&lt;div&gt;Path: /&lt;/div&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="wSJkOsJQY9M_Z095WERL-19">
<mxGeometry x="0.4522" y="-2" relative="1" as="geometry">
<mxPoint x="1" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-20" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="wSJkOsJQY9M_Z095WERL-4" target="wSJkOsJQY9M_Z095WERL-18">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-22" value="Path: /api" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="wSJkOsJQY9M_Z095WERL-20">
<mxGeometry x="0.3611" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-4" value="bh.com" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.direct_data;whiteSpace=wrap;align=center;" vertex="1" parent="1">
<mxGeometry x="-640.5" y="120" width="160" height="60" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-5" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#00188D;shape=mxgraph.mscae.enterprise.lock_unlocked" vertex="1" parent="1">
<mxGeometry x="-579" y="70" width="37" height="50" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="wSJkOsJQY9M_Z095WERL-8" target="wSJkOsJQY9M_Z095WERL-13">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-25" value="&lt;div&gt;Path:/&lt;/div&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="wSJkOsJQY9M_Z095WERL-23">
<mxGeometry x="0.43" y="-2" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-24" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="wSJkOsJQY9M_Z095WERL-8" target="wSJkOsJQY9M_Z095WERL-17">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-26" value="Path:/api" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="wSJkOsJQY9M_Z095WERL-24">
<mxGeometry x="0.3263" y="-1" relative="1" as="geometry">
<mxPoint as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-8" value="&lt;div&gt;admin.bh.com&lt;/div&gt;" style="strokeWidth=2;html=1;shape=mxgraph.flowchart.direct_data;whiteSpace=wrap;align=center;" vertex="1" parent="1">
<mxGeometry x="-630.5" y="410" width="160.5" height="60" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-9" value="" style="sketch=0;aspect=fixed;pointerEvents=1;shadow=0;dashed=0;html=1;strokeColor=none;labelPosition=center;verticalLabelPosition=bottom;verticalAlign=top;align=center;fillColor=#00188D;shape=mxgraph.mscae.enterprise.lock" vertex="1" parent="1">
<mxGeometry x="-570" y="360" width="39" height="50" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-13" value="Admin Client" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="-320" y="350" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-30" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="wSJkOsJQY9M_Z095WERL-17" target="JNN8aSlnDbWN0y9jmZyT-19">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-31" value="&lt;div&gt;/v1/sync&lt;/div&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="wSJkOsJQY9M_Z095WERL-30">
<mxGeometry x="0.2947" y="1" relative="1" as="geometry">
<mxPoint y="-9" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-46" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="wSJkOsJQY9M_Z095WERL-17" target="wSJkOsJQY9M_Z095WERL-42">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-190" y="480" />
<mxPoint x="-190" y="290" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-47" value="&lt;div&gt;/v1/notify&lt;/div&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="wSJkOsJQY9M_Z095WERL-46">
<mxGeometry x="-0.359" relative="1" as="geometry">
<mxPoint x="70" y="-111" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-17" value="&lt;div&gt;Proxy Admin&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="-320" y="440" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-28" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="wSJkOsJQY9M_Z095WERL-18" target="wSJkOsJQY9M_Z095WERL-27">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-190" y="200" />
<mxPoint x="-190" y="110" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-29" value="&lt;div&gt;/v1/upcoming&lt;/div&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="wSJkOsJQY9M_Z095WERL-28">
<mxGeometry x="-0.2889" y="-2" relative="1" as="geometry">
<mxPoint x="58" y="-63" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-43" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="1" source="wSJkOsJQY9M_Z095WERL-18" target="wSJkOsJQY9M_Z095WERL-42">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-190" y="200" />
<mxPoint x="-190" y="290" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-45" value="&lt;div&gt;/v1/register&lt;/div&gt;&lt;div&gt;/v1/verify&lt;/div&gt;&lt;div&gt;/v1/unsubscribe&lt;br&gt;&lt;/div&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="wSJkOsJQY9M_Z095WERL-43">
<mxGeometry x="0.3185" relative="1" as="geometry">
<mxPoint x="32" y="-30" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-18" value="Proxy Web" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="-320" y="160" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-55" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;" edge="1" parent="1" source="wSJkOsJQY9M_Z095WERL-27" target="JNN8aSlnDbWN0y9jmZyT-17">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-27" value="&lt;div&gt;Catalog&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="-70" y="70" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-52" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;entryPerimeter=0;" edge="1" parent="1" source="wSJkOsJQY9M_Z095WERL-42" target="wSJkOsJQY9M_Z095WERL-49">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-42" value="&lt;div&gt;Ringman&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="-60" y="250" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-49" value="ringman-db" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" vertex="1" parent="1">
<mxGeometry x="80" y="237.5" width="80" height="105" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-50" value="runner-db" style="shape=cylinder3;whiteSpace=wrap;html=1;boundedLbl=1;backgroundOutline=1;size=15;" vertex="1" parent="1">
<mxGeometry x="80" y="427.5" width="80" height="105" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-57" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="wSJkOsJQY9M_Z095WERL-56" target="wSJkOsJQY9M_Z095WERL-17">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-58" value="curl /api/v1/sync" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="wSJkOsJQY9M_Z095WERL-57">
<mxGeometry x="0.275" y="-2" relative="1" as="geometry">
<mxPoint x="58" y="41" as="offset" />
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-56" value="&lt;div&gt;sync-cronjob&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="-320" y="600" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-61" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;" edge="1" parent="1" source="wSJkOsJQY9M_Z095WERL-59" target="wSJkOsJQY9M_Z095WERL-17">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="-120" y="560" />
<mxPoint x="-280" y="560" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-59" value="&lt;div&gt;notify-cronjob&lt;/div&gt;" style="whiteSpace=wrap;html=1;aspect=fixed;" vertex="1" parent="1">
<mxGeometry x="-160" y="600" width="80" height="80" as="geometry" />
</mxCell>
<mxCell id="wSJkOsJQY9M_Z095WERL-60" value="curl /api/v1/notify" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="1">
<mxGeometry x="-70" y="580" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 36 KiB

@ -0,0 +1,103 @@
# Deployment
Services deployed (using kustomize):
- [catalog](./src/catalog)
- [runner](./src/runner)
- [proxy-admin](./src/proxy-admin)
- [proxy-web](./src/proxy-web)
- [web-client](./src/web-client)
- [admin-client](./src/admin-client)
Platform components deployed (using helm):
- [Traefik]()
- [Postgresql]()
## [Beta](https://beta.barretthousen.com)
The [Beta](https://beta.barretthousen.com) environment lives in my [homelab repo](https://git.vdhsn.com/adam/SunnyHomeLab),
and is auto deployed using Flux w/ kustomize.
See [./env/beta](./env/beta/kustomization.yaml) for how it's set up.
- There are only 3 environments: `local`, `beta`, `prod`
- `local`: optimize for iteration speed, observability, mutability. Ephemeral data. Should be quick to create and destroy.
- `beta`: optimize for likeness with prod, observability, and durable data.
- `prod`: optimize for up time, automated change control, observability, data durability.
- Each environment should pull from the image tag that matches it's name (ie catalog service running in `beta` env will use `git.vdhsn.com/barretthousen/service-catalog:beta` docker image)
- All environments should have resources suffixed with their name (ie `deployment/catalog-beta` in `beta` env)
- All environments must use kustomize, and have the same resources - configuration of those resources can vary as needed
### Initial environment setup
Deploy the following with Helm (assuming we're setting up a new `beta` env with the following commands):
1. Traefik:
```sh
helm repo add traefik https://traefik.github.io/charts;
helm upgrade --install ingress traefik/traefik -n 'barretthousen-beta'\
--set=logs.access.enabled=true
```
2. Postgresql:
```sh
helm repo add bitnami https://charts.bitnami.com/bitnami;
helm install --upgrade bh-db bitnami/postgresql -n 'barretthousen-beta' \
--set='fullnameOverride=bh-db' \
--set='auth.enablePostgresuser=true' \
--set='auth.postgresPassword=bh-admin' \
--set='auth.database=bh'
```
### Deployment steps
1. Build and publish images to `beta`
```sh
export ENV=beta; # if not specified, will only build and push for the git commit
make build-backend-image SERVICE=catalog
make build-backend-image SERVICE=runner
make build-backend-image SERVICE=proxy-admin
make build-backend-image SERVICE=proxy-web
# for prod drop `beta prefix
make build-client-image SERVICE=web-client
make build-client-image SERVICE=admin-client
```
2. Rolling restart deployments in the beta env
```sh
# for prod drop `-beta` suffix
kubectl rollout restart -n barretthousen-beta deployment runner-beta
kubectl rollout status -n barretthousen-beta deployment runner-beta -w
kubectl rollout restart -n barretthousen-beta deployment catalog-beta
kubectl rollout status -n barretthousen-beta deployment catalog-beta -w
kubectl rollout restart -n barretthousen-beta deployment proxy-admin-beta
kubectl rollout status -n barretthousen-beta deployment proxy-admin-beta -w
kubectl rollout restart -n barretthousen-beta deployment proxy-web-beta
kubectl rollout status -n barretthousen-beta deployment proxy-web-beta -w
kubectl rollout restart -n barretthousen-beta deployment web-client-beta
kubectl rollout status -n barretthousen-beta deployment web-client-beta -w
kubectl rollout restart -n barretthousen-beta deployment admin-client-beta
kubectl rollout status -n barretthousen-beta deployment admin-client-beta -w
```
3. Promote images to prod
```sh
make promote-backend-prod SERVICE=catalog
make promote-backend-prod SERVICE=runner
make promote-backend-prod SERVICE=proxy-admin
make promote-backend-prod SERVICE=proxy-web
make promote-client-prod SERVICE=web-client
make promote-client-prod SERVICE=admin-client
```

@ -0,0 +1,912 @@
%!PS-Adobe-3.0 EPSF-3.0
%APL_DSC_Encoding: UTF8
%APLProducer: (Version 10.14.6 (Build 18G95) Quartz PS Context)
%%Title: (Unknown)
%%Creator: (Unknown)
%%CreationDate: (Unknown)
%%For: (Unknown)
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
%%Pages: 1
%%BoundingBox: 0 0 1102 516
%%EndComments
%%BeginProlog
%%BeginFile: cg-pdf.ps
%%Copyright: Copyright 2000-2004 Apple Computer Incorporated.
%%Copyright: All Rights Reserved.
currentpacking true setpacking
/cg_md 141 dict def
cg_md begin
/L3? languagelevel 3 ge def
/bd{bind def}bind def
/ld{load def}bd
/xs{exch store}bd
/xd{exch def}bd
/cmmtx matrix def
mark
/sc/setcolor
/scs/setcolorspace
/dr/defineresource
/fr/findresource
/T/true
/F/false
/d/setdash
/w/setlinewidth
/J/setlinecap
/j/setlinejoin
/M/setmiterlimit
/i/setflat
/rc/rectclip
/rf/rectfill
/rs/rectstroke
/f/fill
/f*/eofill
/sf/selectfont
/s/show
%/as/ashow
/xS/xshow
/yS/yshow
/xyS/xyshow
/S/stroke
/m/moveto
/l/lineto
/c/curveto
/h/closepath
/n/newpath
/q/gsave
/Q/grestore
counttomark 2 idiv
%dup (number of ld's = )print == flush % *** how many
{ld}repeat pop
/SC{ % CSname
/ColorSpace fr scs
}bd
/sopr /setoverprint where{pop/setoverprint}{/pop}ifelse ld
/soprm /setoverprintmode where{pop/setoverprintmode}{/pop}ifelse ld
/cgmtx matrix def
/sdmtx{cgmtx currentmatrix pop}bd
/CM {cgmtx setmatrix}bd % pop the ctm: our gstate ctm on host is now identity
/cm {cmmtx astore CM concat}bd % reset the matrix and then concat
/W{clip newpath}bd
/W*{eoclip newpath}bd
statusdict begin product end dup (HP) anchorsearch{
pop pop pop % pop off the search results
true
}{
pop % previous search result
(hp) anchorsearch{
pop pop true
}{
pop false
}ifelse
}ifelse
{ % HP is the product: we use this method of stroking because of a bug in their clone printers with certain T3 fonts
{
{ % charCode Wx Wy
pop pop % charCode
(0)dup 0 4 -1 roll put
F charpath
}cshow
}
}{
{F charpath}
}ifelse
/cply exch bd
/cps {cply stroke}bd
/pgsave 0 def
/bp{/pgsave save store}bd
/ep{pgsave restore showpage}def % dont' bind
/re{4 2 roll m 1 index 0 rlineto 0 exch rlineto neg 0 rlineto h}bd
/scrdict 10 dict def
/scrmtx matrix def
/patarray 0 def
/createpat{patarray 3 1 roll put}bd
/makepat{
scrmtx astore pop
gsave
initgraphics
CM
patarray exch get
scrmtx
makepattern
grestore
setpattern
}bd
/cg_BeginEPSF{
userdict save/cg_b4_Inc_state exch put
userdict/cg_endepsf/cg_EndEPSF load put
count userdict/cg_op_count 3 -1 roll put
countdictstack dup array dictstack userdict/cg_dict_array 3 -1 roll put
3 sub{end}repeat
/showpage {} def
0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin
10 setmiterlimit [] 0 setdash newpath
false setstrokeadjust false setoverprint % don't use F
}bd
/cg_EndEPSF{
countdictstack 3 sub { end } repeat
cg_dict_array 3 1 index length 3 sub getinterval
{begin}forall
count userdict/cg_op_count get sub{pop}repeat
userdict/cg_b4_Inc_state get restore
F setpacking
}bd
/cg_biproc{currentfile/RunLengthDecode filter}bd
/cg_aiproc{currentfile/ASCII85Decode filter/RunLengthDecode filter}bd
/ImageDataSource 0 def
L3?{
/cg_mibiproc{pop pop/ImageDataSource{cg_biproc}def}bd
/cg_miaiproc{pop pop/ImageDataSource{cg_aiproc}def}bd
}{
/ImageBandMask 0 def
/ImageBandData 0 def
/cg_mibiproc{
string/ImageBandMask xs
string/ImageBandData xs
/ImageDataSource{[currentfile/RunLengthDecode filter dup ImageBandMask/readstring cvx
/pop cvx dup ImageBandData/readstring cvx/pop cvx]cvx bind}bd
}bd
/cg_miaiproc{
string/ImageBandMask xs
string/ImageBandData xs
/ImageDataSource{[currentfile/ASCII85Decode filter/RunLengthDecode filter
dup ImageBandMask/readstring cvx
/pop cvx dup ImageBandData/readstring cvx/pop cvx]cvx bind}bd
}bd
}ifelse
/imsave 0 def
/BI{save/imsave xd mark}bd
/EI{imsave restore}bd
/ID{
counttomark 2 idiv
dup 2 add % leave room for imagetype and imagematrix
dict begin
{def} repeat
pop % remove mark
/ImageType 1 def
/ImageMatrix[Width 0 0 Height neg 0 Height]def
currentdict dup/ImageMask known{ImageMask}{F}ifelse exch
% currentdict on stack
L3?{
dup/MaskedImage known
{
pop
<<
/ImageType 3
/InterleaveType 2
/DataDict currentdict
/MaskDict
<< /ImageType 1
/Width Width
/Height Height
/ImageMatrix ImageMatrix
/BitsPerComponent 1
/Decode [0 1]
currentdict/Interpolate known
{/Interpolate Interpolate}if
>>
>>
}if
}if
exch
{imagemask}{image}ifelse
end % pop imagedict from dict stack
}bd
/cguidfix{statusdict begin mark version end
{cvr}stopped{cleartomark 0}{exch pop}ifelse
2012 lt{dup findfont dup length dict begin
{1 index/FID ne 2 index/UniqueID ne and
{def} {pop pop} ifelse}forall
currentdict end definefont pop
}{pop}ifelse
}bd
/t_array 0 def
/t_i 0 def
/t_c 1 string def
/x_proc{ % x y
exch t_array t_i get add exch moveto
/t_i t_i 1 add store
}bd
/y_proc{ % x y
t_array t_i get add moveto
/t_i t_i 1 add store
}bd
/xy_proc{
% x y
t_array t_i 2 copy 1 add get 3 1 roll get
4 -1 roll add 3 1 roll add moveto
/t_i t_i 2 add store
}bd
/sop 0 def % don't bind sop
/cp_proc/x_proc ld % default moveto proc is for xwidths only
/base_charpath % string array
{
/t_array xs
/t_i 0 def
{ % char
t_c 0 3 -1 roll put
currentpoint
t_c cply sop
cp_proc
}forall
/t_array 0 def
}bd
/sop/stroke ld % default sop is stroke. Done here so we don't bind in /base_charpath
% default sop is stroke
/nop{}def
/xsp/base_charpath ld
/ysp{/cp_proc/y_proc ld base_charpath/cp_proc/x_proc ld}bd
/xysp{/cp_proc/xy_proc ld base_charpath/cp_proc/x_proc ld}bd
/xmp{/sop/nop ld /cp_proc/x_proc ld base_charpath/sop/stroke ld}bd
/ymp{/sop/nop ld /cp_proc/y_proc ld base_charpath/sop/stroke ld}bd
/xymp{/sop/nop ld /cp_proc/xy_proc ld base_charpath/sop/stroke ld}bd
/refnt{ % newname encoding fontname
findfont dup length dict copy dup
/Encoding 4 -1 roll put
definefont pop
}bd
/renmfont{ % newname fontname
findfont dup length dict copy definefont pop
}bd
L3? dup dup{save exch}if
% languagelevel2 ONLY code goes here
/Range 0 def
/DataSource 0 def
/val 0 def
/nRange 0 def
/mulRange 0 def
/d0 0 def
/r0 0 def
/di 0 def
/ri 0 def
/a0 0 def
/a1 0 def
/r1 0 def
/r2 0 def
/dx 0 def
/Nsteps 0 def
/sh3tp 0 def
/ymax 0 def
/ymin 0 def
/xmax 0 def
/xmin 0 def
/setupFunEval % funDict -- % this calculates and sets up a function dict for evaulation.
{
begin
/nRange Range length 2 idiv store
/mulRange % precompute the range data needed to map a sample value from the table to a range value
% this data looks like [ range0mul range0min range1mul range1min ... rangeN-1mul rangeN-1min ]
[
0 1 nRange 1 sub
{ % index
2 mul/nDim2 xd % 2*dimension# we are dealing with
Range nDim2 get % ymin
Range nDim2 1 add get % ymin ymax
1 index sub % ymin (ymax-ymin)
% xmin = 0, xmax = 255 (2^bitspersample - 1)
255 div % ymin (ymax-ymin)/(xmax - xmin)
exch % (ymax-ymin)/(xmax - xmin) ymin
}for
]store
end
}bd
/FunEval % val1 fundict -> comp1 comp2 ... compN
{
begin
% the value passed in is the base index into the table
nRange mul /val xd % compute the actual index to the table
% since there are nRange entries per base index
0 1 nRange 1 sub
{
dup 2 mul/nDim2 xd % dim
val % base value to use to do our lookup
add DataSource exch get % lookedupval
mulRange nDim2 get mul % lookedupval*(ymax-ymin)/(xmax-xmin)
mulRange nDim2 1 add get % lookedupval*(ymax-ymin)/(xmax-xmin) ymin
add % interpolated result
}for % comp1 comp2 ... compN
end
}bd
/max % a b -> max(a, b)
{
2 copy lt
{exch pop}{pop}ifelse
}bd
/sh2
{ % emulation of shading type 2. Assumes shading dictionary is top dictionary on the dict stack
/Coords load aload pop % x0 y0 x1 y1
3 index 3 index translate % origin is now at beginning point of shading
% x0 y0 x1 y1
3 -1 roll sub % x0 x1 y1-y0
3 1 roll exch % y1-y0 x1 x0
sub % y1-y0 x1-x0
2 copy
dup mul exch dup mul add sqrt % length of segment between two points
dup
scale
atan % atan (dy/dx)
%dup (rotation angle = )print ==
rotate % now line between 0,0 and 1,0 is the line perpendicular to which the axial lines are drawn
/Function load setupFunEval % may need to setup function dictionary by calling setupFunEval
% this is now specific to axial shadings. Compute the maximum bounds to fill
clippath {pathbbox}stopped {0 0 0 0}if newpath % x0 y0 x1 y1
/ymax xs
/xmax xs
/ymin xs
/xmin xs
currentdict/Extend known
{
/Extend load 0 get
{
0/Function load FunEval sc % evaluate the function to get a color and set it
xmin ymin xmin abs ymax ymin sub rectfill
}if
}if
% paint the rects. The sampling frequency is that of our table
/Nsteps/Function load/Size get 0 get 1 sub store
/dx 1 Nsteps div store
gsave
/di ymax ymin sub store
/Function load
% loop Nsteps + 1 times, incrementing the index by 1 each time
0 1 Nsteps
{
1 index FunEval sc
0 ymin dx di rectfill
dx 0 translate
}for
pop % pop our function
grestore % origin is back to start point
currentdict/Extend known
{
/Extend load 1 get
{
Nsteps/Function load FunEval sc % last element
1 ymin xmax 1 sub abs ymax ymin sub rectfill
}if
}if
}bd
/shp % this paints our shape for shading type 3
{ % x1 r1 x0 r0 -
4 copy
% fill interior arc
dup 0 gt{
0 exch a1 a0 arc
}{
pop 0 moveto
}ifelse
dup 0 gt{
0 exch a0 a1 arcn
}{
pop 0 lineto
}ifelse
fill
% fill exterior arc
dup 0 gt{
0 exch a0 a1 arc
}{
pop 0 moveto
}ifelse
dup 0 gt{
0 exch a1 a0 arcn
}{
pop 0 lineto
}ifelse
fill
}bd
/calcmaxs
{ % calculate maximum distance vector from origin to corner points
% of bbox
xmin dup mul ymin dup mul add sqrt % (xmin2 + ymin2)
xmax dup mul ymin dup mul add sqrt % (xmax2 + ymin2)
xmin dup mul ymax dup mul add sqrt % (xmin2 + ymax2)
xmax dup mul ymax dup mul add sqrt % (xmax2 + ymax2)
max max max % maximum value
}bd
/sh3
{ % emulation of shading type 3. Assumes shading dictionary is top dictionary on the dict stack
/Coords load aload pop % x0 y0 r1 x1 y1 r2
5 index 5 index translate % origin is now at first circle origin
3 -1 roll 6 -1 roll sub % y0 r1 y1 r2 dx
3 -1 roll 5 -1 roll sub % r1 r2 dx dy
2 copy dup mul exch dup mul add sqrt
/dx xs % r1 r2 dx dy
2 copy 0 ne exch 0 ne or
{
% r1 r2 dx dy
exch atan rotate % we are now rotated so dy is zero and positive values of dx move us as expected
}{
pop pop
}ifelse
% r1 r2
/r2 xs
/r1 xs
/Function load
dup/Size get 0 get 1 sub % this is the size of our table minus 1
/Nsteps xs % at some point we should optimize this better so NSteps is based on needed steps for the device
setupFunEval % may need to setup function dictionary by calling setupFunEval
% determine the case:
% case 0: circle1 inside circle2
% case 1: circle 2 inside circle 1
% case 2: r1 = r2
% case 3: r1 != r2
dx r2 add r1 lt{
% circle 2 inside of circle 1
0
}{
dx r1 add r2 le
{ % circle 1 inside of circle 2
1
}{ % circles don't contain each other
r1 r2 eq
{ % equal
2
}{ % r1 != r2
3
}ifelse
}ifelse
}ifelse
/sh3tp xs % sh3tp has the number of our different cases
clippath {pathbbox}stopped {0 0 0 0}if
newpath % x0 y0 x1 y1
/ymax xs
/xmax xs
/ymin xs
/xmin xs
% Arc angle atan( sqrt((dx*dx + dy*dy) - dr*dr), dr)
dx dup mul r2 r1 sub dup mul sub dup 0 gt
{
sqrt r2 r1 sub atan
/a0 exch 180 exch sub store
/a1 a0 neg store
}{
pop
/a0 0 store
/a1 360 store
}ifelse
currentdict/Extend known
{
/Extend load 0 get r1 0 gt and % no need to extend if the radius of the first end is 0
{
0/Function load FunEval sc % evaluate the function to get a color and set it
% case 0: circle1 inside circle2
% case 1: circle 2 inside circle 1
% case 2: circles don't contain each other and r1 == r2
% case 3: circles don't contain each other and r1 != r2
{
{ % case 0
dx 0 r1 360 0 arcn
xmin ymin moveto
xmax ymin lineto
xmax ymax lineto
xmin ymax lineto
xmin ymin lineto
eofill % for the bigger radius we fill everything except our circle
}
{ % case 1
r1 0 gt{0 0 r1 0 360 arc fill}if
}
{ % case 2
% r1 == r2, extend 0
% r3 = r, x3 = -(abs(minx) + r), x1 = 0
% x(i+1) r(i+1) x(i) r(i) shp
0 r1 xmin abs r1 add neg r1 shp
}
{ % case 3
% no containment, r1 != r2
r2 r1 gt{ % the endpoint we are drawing is that with a circle of zero radius
% x(i+1) r(i+1) x(i) r(i) shp
0 r1
r1 neg r2 r1 sub div dx mul % this is point of beginning circle
0 % point of ending circle
shp % takes x(i+1) r(i+1) x(i) r(i)
}{ % the first circle is the bigger of the two
% we find a circle on our line which is outside the bbox in the
% negative direction
% x(i+1) r(i+1) x(i) r(i) shp
0 r1 calcmaxs % 0 r1 maxs
dup
% calculating xs: (-(maxs+r2)*x2)/(x2-(r1-r2))
r2 add dx mul dx r1 r2 sub sub div
neg % maxs xs'
exch 1 index % xs' maxs xs'
abs exch sub
shp
}ifelse
}
}sh3tp get exec % execute the extend at beginning proc for our shading type
}if
}if
% now do the shading
/d0 0 store
/r0 r1 store
/di dx Nsteps div store
/ri r2 r1 sub Nsteps div store
/Function load
0 1 Nsteps
{ % function t(i)
1 index FunEval sc
d0 di add r0 ri add d0 r0 shp
{
% fill interior arc
d0 0 r0 a1 a0 arc
d0 di add 0 r0 ri add a0 a1 arcn
fill
% fill exterior arc
d0 0 r0 a0 a1 arc
d0 di add 0 r0 ri add a1 a0 arcn
fill
}pop
% advance to next
/d0 d0 di add store
/r0 r0 ri add store
}for
pop % pop our function dict
% handle Extend
currentdict/Extend known
{
/Extend load 1 get r2 0 gt and % no need to extend if the radius of the last end is 0
{
Nsteps/Function load FunEval sc % last element
% case 0: circle1 inside circle2
% case 1: circle 2 inside circle 1
% case 2: circles don't contain each other and r1 == r2
% case 3: circles don't contain each other and r1 != r2
{
{
dx 0 r2 0 360 arc fill
}
{
dx 0 r2 360 0 arcn
xmin ymin moveto
xmax ymin lineto
xmax ymax lineto
xmin ymax lineto
xmin ymin lineto
eofill % for the bigger radius we fill everything except our circle
}
{ % r1 == r2, extend 1
% r3 = r, x3 = (abs(xmax) + r), x1 = dx
% x(i+1) r(i+1) x(i) r(i) shp
xmax abs r1 add r1 dx r1 shp
}
{ % no containment, r1 != r2
r2 r1 gt{
% we find a circle on our line which is outside the bbox in the
% positive direction
% x(i+1) r(i+1) x(i) r(i) shp
calcmaxs dup % maxs maxs
% calculating xs: ((maxs+r1)*x2)/(x2-(r2-r1))
r1 add dx mul dx r2 r1 sub sub div % maxs xs
exch 1 index % xs maxs xs
exch sub
dx r2
shp
}{ % the endpoint we are drawing is that with a circle of zero radius
% x(i+1) r(i+1) x(i) r(i) shp
r1 neg r2 r1 sub div dx mul % this is point of ending circle
0 % radius of ending circle
dx % point of starting circle
r2 % radius of starting circle
shp
}ifelse
}
}
sh3tp get exec % execute the extend at end proc for our shading type
}if
}if
}bd
/sh % emulation of shfill operator for type 2 and type 3 shadings based on type 0 functions
{ % shadingDict --
begin
/ShadingType load dup dup 2 eq exch 3 eq or
{ % shadingtype
gsave
newpath
/ColorSpace load scs
currentdict/BBox known
{
/BBox load aload pop % llx lly urx ury
2 index sub % llx lly urx ury-lly
3 index % llx lly urx ury-lly llx
3 -1 roll exch sub
exch rectclip
}if
2 eq
{sh2}{sh3}ifelse
grestore
}{
% shadingtype
pop
(DEBUG: shading type unimplemented\n)print flush
}ifelse
end
}bd
% end of language level 2 ONLY code
{restore}if not dup{save exch}if
% languagelevel3 ONLY code goes here
L3?{ % we do these loads conditionally or else they will fail on a level 2 printer
/sh/shfill ld
/csq/clipsave ld
/csQ/cliprestore ld
}if
{restore}if
%currentdict dup maxlength exch length sub (number of extra slots in md = )print == flush % *** how many entries are free
end
setpacking
% count 0 ne { pstack(***extras on stack during prolog execution***\n)print flush}if % *** BARK if anything is left on stack
%%EndFile
%%EndProlog
%%BeginSetup
%%EndSetup
%%Page: 1 1
%%PageBoundingBox: 0 0 1102 516
%%BeginPageSetup
cg_md begin
bp
sdmtx
[ /CIEBasedABC 4 dict dup begin
/WhitePoint [ 0.9505 1.0000 1.0891 ] def
/DecodeABC [
{ 1.0 0.0 3 -1 roll 1 index 1 index le { exch pop} { pop } ifelse
1 index 1 index ge { exch pop } { pop } ifelse <
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000001010101010101010101010101
0101010101010101010101010101010101010101010101020202020202020202
0202020202020202020202020202020202030303030303030303030303030303
0303030303030304040404040404040404040404040404040404050505050505
0505050505050505050506060606060606060606060606060607070707070707
0707070707070708080808080808080808080808090909090909090909090909
0a0a0a0a0a0a0a0a0a0a0a0b0b0b0b0b0b0b0b0b0b0b0c0c0c0c0c0c0c0c0c0c
0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0e0e0e0f0f0f0f0f0f0f0f0f10101010
1010101010111111111111111112121212121212121313131313131313141414
1414141414151515151515151616161616161616171717171717171818181818
18181919191919191a1a1a1a1a1a1a1b1b1b1b1b1b1c1c1c1c1c1c1c1d1d1d1d
1d1d1e1e1e1e1e1e1f1f1f1f1f1f202020202020212121212121222222222223
2323232323242424242425252525252526262626262727272727282828282829
292929292a2a2a2a2a2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2e2e2e2e2e2f2f2f
2f2f303030303131313131323232323333333333343434343535353535363636
36373737373838383839393939393a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e
3e3e3f3f3f3f4040404041414141424242424343434444444445454545464646
4647474748484848494949494a4a4a4b4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4f
4f50505051515151525252535353535454545555555656565657575758585859
59595a5a5a5a5b5b5b5c5c5c5d5d5d5e5e5e5f5f5f6060606061616162626263
63636464646565656666666767676868686969696a6a6a6b6b6b6c6c6d6d6d6e
6e6e6f6f6f707070717171727273737374747475757576767677777878787979
797a7a7b7b7b7c7c7c7d7d7e7e7e7f7f7f808081818182828283838484848585
86868687878888888989898a8a8b8b8b8c8c8d8d8d8e8e8f8f90909091919292
9293939494949595969697979798989999999a9a9b9b9c9c9c9d9d9e9e9f9f9f
a0a0a1a1a2a2a3a3a3a4a4a5a5a6a6a6a7a7a8a8a9a9aaaaabababacacadadae
aeafafb0b0b0b1b1b2b2b3b3b4b4b5b5b6b6b6b7b7b8b8b9b9bababbbbbcbcbd
bdbebebebfbfc0c0c1c1c2c2c3c3c4c4c5c5c6c6c7c7c8c8c9c9cacacbcbcccc
cdcdcececfcfd0d0d1d1d2d2d3d3d4d4d5d5d6d6d7d7d8d8d9d9dadadbdcdcdd
dddededfdfe0e0e1e1e2e2e3e3e4e4e5e6e6e7e7e8e8e9e9eaeaebebecededee
eeefeff0f0f1f1f2f3f3f4f4f5f5f6f6f7f8f8f9f9fafafbfcfcfdfdfefeffff
> dup length 1 sub 3 -1 roll mul dup dup floor cvi exch ceiling
cvi 3 index exch get 4 -1 roll 3 -1 roll get
dup 3 1 roll sub 3 -1 roll dup floor cvi sub mul add 255 div } bind
{ 1.0 0.0 3 -1 roll 1 index 1 index le { exch pop} { pop } ifelse
1 index 1 index ge { exch pop } { pop } ifelse <
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000001010101010101010101010101
0101010101010101010101010101010101010101010101020202020202020202
0202020202020202020202020202020202030303030303030303030303030303
0303030303030304040404040404040404040404040404040404050505050505
0505050505050505050506060606060606060606060606060607070707070707
0707070707070708080808080808080808080808090909090909090909090909
0a0a0a0a0a0a0a0a0a0a0a0b0b0b0b0b0b0b0b0b0b0b0c0c0c0c0c0c0c0c0c0c
0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0e0e0e0f0f0f0f0f0f0f0f0f10101010
1010101010111111111111111112121212121212121313131313131313141414
1414141414151515151515151616161616161616171717171717171818181818
18181919191919191a1a1a1a1a1a1a1b1b1b1b1b1b1c1c1c1c1c1c1c1d1d1d1d
1d1d1e1e1e1e1e1e1f1f1f1f1f1f202020202020212121212121222222222223
2323232323242424242425252525252526262626262727272727282828282829
292929292a2a2a2a2a2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2e2e2e2e2e2f2f2f
2f2f303030303131313131323232323333333333343434343535353535363636
36373737373838383839393939393a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e
3e3e3f3f3f3f4040404041414141424242424343434444444445454545464646
4647474748484848494949494a4a4a4b4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4f
4f50505051515151525252535353535454545555555656565657575758585859
59595a5a5a5a5b5b5b5c5c5c5d5d5d5e5e5e5f5f5f6060606061616162626263
63636464646565656666666767676868686969696a6a6a6b6b6b6c6c6d6d6d6e
6e6e6f6f6f707070717171727273737374747475757576767677777878787979
797a7a7b7b7b7c7c7c7d7d7e7e7e7f7f7f808081818182828283838484848585
86868687878888888989898a8a8b8b8b8c8c8d8d8d8e8e8f8f90909091919292
9293939494949595969697979798989999999a9a9b9b9c9c9c9d9d9e9e9f9f9f
a0a0a1a1a2a2a3a3a3a4a4a5a5a6a6a6a7a7a8a8a9a9aaaaabababacacadadae
aeafafb0b0b0b1b1b2b2b3b3b4b4b5b5b6b6b6b7b7b8b8b9b9bababbbbbcbcbd
bdbebebebfbfc0c0c1c1c2c2c3c3c4c4c5c5c6c6c7c7c8c8c9c9cacacbcbcccc
cdcdcececfcfd0d0d1d1d2d2d3d3d4d4d5d5d6d6d7d7d8d8d9d9dadadbdcdcdd
dddededfdfe0e0e1e1e2e2e3e3e4e4e5e6e6e7e7e8e8e9e9eaeaebebecededee
eeefeff0f0f1f1f2f3f3f4f4f5f5f6f6f7f8f8f9f9fafafbfcfcfdfdfefeffff
> dup length 1 sub 3 -1 roll mul dup dup floor cvi exch ceiling
cvi 3 index exch get 4 -1 roll 3 -1 roll get
dup 3 1 roll sub 3 -1 roll dup floor cvi sub mul add 255 div } bind
{ 1.0 0.0 3 -1 roll 1 index 1 index le { exch pop} { pop } ifelse
1 index 1 index ge { exch pop } { pop } ifelse <
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000001010101010101010101010101
0101010101010101010101010101010101010101010101020202020202020202
0202020202020202020202020202020202030303030303030303030303030303
0303030303030304040404040404040404040404040404040404050505050505
0505050505050505050506060606060606060606060606060607070707070707
0707070707070708080808080808080808080808090909090909090909090909
0a0a0a0a0a0a0a0a0a0a0a0b0b0b0b0b0b0b0b0b0b0b0c0c0c0c0c0c0c0c0c0c
0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0e0e0e0f0f0f0f0f0f0f0f0f10101010
1010101010111111111111111112121212121212121313131313131313141414
1414141414151515151515151616161616161616171717171717171818181818
18181919191919191a1a1a1a1a1a1a1b1b1b1b1b1b1c1c1c1c1c1c1c1d1d1d1d
1d1d1e1e1e1e1e1e1f1f1f1f1f1f202020202020212121212121222222222223
2323232323242424242425252525252526262626262727272727282828282829
292929292a2a2a2a2a2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2e2e2e2e2e2f2f2f
2f2f303030303131313131323232323333333333343434343535353535363636
36373737373838383839393939393a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e
3e3e3f3f3f3f4040404041414141424242424343434444444445454545464646
4647474748484848494949494a4a4a4b4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4f
4f50505051515151525252535353535454545555555656565657575758585859
59595a5a5a5a5b5b5b5c5c5c5d5d5d5e5e5e5f5f5f6060606061616162626263
63636464646565656666666767676868686969696a6a6a6b6b6b6c6c6d6d6d6e
6e6e6f6f6f707070717171727273737374747475757576767677777878787979
797a7a7b7b7b7c7c7c7d7d7e7e7e7f7f7f808081818182828283838484848585
86868687878888888989898a8a8b8b8b8c8c8d8d8d8e8e8f8f90909091919292
9293939494949595969697979798989999999a9a9b9b9c9c9c9d9d9e9e9f9f9f
a0a0a1a1a2a2a3a3a3a4a4a5a5a6a6a6a7a7a8a8a9a9aaaaabababacacadadae
aeafafb0b0b0b1b1b2b2b3b3b4b4b5b5b6b6b6b7b7b8b8b9b9bababbbbbcbcbd
bdbebebebfbfc0c0c1c1c2c2c3c3c4c4c5c5c6c6c7c7c8c8c9c9cacacbcbcccc
cdcdcececfcfd0d0d1d1d2d2d3d3d4d4d5d5d6d6d7d7d8d8d9d9dadadbdcdcdd
dddededfdfe0e0e1e1e2e2e3e3e4e4e5e6e6e7e7e8e8e9e9eaeaebebecededee
eeefeff0f0f1f1f2f3f3f4f4f5f5f6f6f7f8f8f9f9fafafbfcfcfdfdfefeffff
> dup length 1 sub 3 -1 roll mul dup dup floor cvi exch ceiling
cvi 3 index exch get 4 -1 roll 3 -1 roll get
dup 3 1 roll sub 3 -1 roll dup floor cvi sub mul add 255 div } bind
] def
/MatrixABC [ 0.4124 0.2126 0.0193 0.3576 0.7151 0.1192 0.1805 0.0722 0.9508 ] def
/RangeLMN [ 0.0 0.9505 0.0 1.0000 0.0 1.0891 ] def
end ] /Cs1 exch/ColorSpace dr pop
%%EndPageSetup
0.60000002 i
/Cs1 SC
0.13333334 0.13333334 0.13333334 sc
q
0 516 m
518 516 l
518 0 l
0 0 l
0 516 l
h
W*
0 0 1102 516 rc
-10 526 m
528 526 l
528 -10 l
-10 -10 l
h
f
Q
0.76078433 0.65098041 0.38039216 sc
q
518 516 m
1102 516 l
1102 0 l
518 0 l
518 516 l
h
W*
0 0 1102 516 rc
508 526 m
1112 526 l
1112 -10 l
508 -10 l
h
f
Q
0.13333334 0.13333334 0.13333334 sc
q
921.56757 468 m
982 468 l
982 48 l
921.56757 48 l
921.56757 261.5 l
698.43243 261.5 l
698.43243 48 l
638 48 l
638 468 l
698.43243 468 l
698.43243 276.08334 l
921.56757 276.08334 l
921.56757 468 l
h
W
0 0 1102 516 rc
628 478 m
992 478 l
992 38 l
628 38 l
h
f
Q
0.76078433 0.65098041 0.38039216 sc
q
180.15546 262.08334 m
180.15546 65.5 l
233.30252 65.5 l
266.00839 65.5 290.53781 70.166664 306.89075 86.5 c
323.24368 103.41666 331.42017 128.5 331.42017 162.33333 c
331.42017 196.75 322.07562 221.83333 303.97058 238.16667 c
285.28152 254.5 253.15967 262.66666 206.43698 262.66666 c
198.84454 262.66666 187.16386 262.08334 180.15546 262.08334 c
h
180.15546 452.25 m
180.15546 276.66666 l
195.92436 276.66666 l
240.31093 276.66666 270.09665 283.66666 286.44958 297.66666 c
302.80252 311.66666 310.39496 333.83334 310.39496 365.33334 c
310.39496 386.91666 307.47479 403.83334 301.05042 415.5 c
294.62604 427.75 284.69748 436.5 272.43277 442.91666 c
259.58405 449.91666 238.55882 452.83334 207.60504 452.83334 c
199.42857 452.83334 187.16386 452.83334 180.15546 452.25 c
h
120 48 m
120 468 l
204.68488 468 l
318.57144 468 375.80673 435.33334 375.80673 369.41666 c
375.80673 342.58334 365.87814 320.41666 346.021 304.08334 c
326.74789 287.75 296.96219 276.66666 257.83194 270.83334 c
305.13864 267.33334 340.18066 255.66667 363.54202 235.83333 c
386.31934 215.41667 398 190.33333 398 160.58333 c
398 134.33333 389.82352 111.58334 374.63864 92.333336 c
358.86975 73.666664 339.0126 62 314.48318 56.166668 c
289.9538 50.333332 257.83194 48 216.94958 48 c
120 48 l
h
W
0 0 1102 516 rc
110 478 m
408 478 l
408 38 l
110 38 l
h
f
ep
end
%%Trailer
%%EOF

@ -0,0 +1,912 @@
%!PS-Adobe-3.0 EPSF-3.0
%APL_DSC_Encoding: UTF8
%APLProducer: (Version 10.14.6 (Build 18G95) Quartz PS Context)
%%Title: (Unknown)
%%Creator: (Unknown)
%%CreationDate: (Unknown)
%%For: (Unknown)
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
%%Pages: 1
%%BoundingBox: 0 0 1102 516
%%EndComments
%%BeginProlog
%%BeginFile: cg-pdf.ps
%%Copyright: Copyright 2000-2004 Apple Computer Incorporated.
%%Copyright: All Rights Reserved.
currentpacking true setpacking
/cg_md 141 dict def
cg_md begin
/L3? languagelevel 3 ge def
/bd{bind def}bind def
/ld{load def}bd
/xs{exch store}bd
/xd{exch def}bd
/cmmtx matrix def
mark
/sc/setcolor
/scs/setcolorspace
/dr/defineresource
/fr/findresource
/T/true
/F/false
/d/setdash
/w/setlinewidth
/J/setlinecap
/j/setlinejoin
/M/setmiterlimit
/i/setflat
/rc/rectclip
/rf/rectfill
/rs/rectstroke
/f/fill
/f*/eofill
/sf/selectfont
/s/show
%/as/ashow
/xS/xshow
/yS/yshow
/xyS/xyshow
/S/stroke
/m/moveto
/l/lineto
/c/curveto
/h/closepath
/n/newpath
/q/gsave
/Q/grestore
counttomark 2 idiv
%dup (number of ld's = )print == flush % *** how many
{ld}repeat pop
/SC{ % CSname
/ColorSpace fr scs
}bd
/sopr /setoverprint where{pop/setoverprint}{/pop}ifelse ld
/soprm /setoverprintmode where{pop/setoverprintmode}{/pop}ifelse ld
/cgmtx matrix def
/sdmtx{cgmtx currentmatrix pop}bd
/CM {cgmtx setmatrix}bd % pop the ctm: our gstate ctm on host is now identity
/cm {cmmtx astore CM concat}bd % reset the matrix and then concat
/W{clip newpath}bd
/W*{eoclip newpath}bd
statusdict begin product end dup (HP) anchorsearch{
pop pop pop % pop off the search results
true
}{
pop % previous search result
(hp) anchorsearch{
pop pop true
}{
pop false
}ifelse
}ifelse
{ % HP is the product: we use this method of stroking because of a bug in their clone printers with certain T3 fonts
{
{ % charCode Wx Wy
pop pop % charCode
(0)dup 0 4 -1 roll put
F charpath
}cshow
}
}{
{F charpath}
}ifelse
/cply exch bd
/cps {cply stroke}bd
/pgsave 0 def
/bp{/pgsave save store}bd
/ep{pgsave restore showpage}def % dont' bind
/re{4 2 roll m 1 index 0 rlineto 0 exch rlineto neg 0 rlineto h}bd
/scrdict 10 dict def
/scrmtx matrix def
/patarray 0 def
/createpat{patarray 3 1 roll put}bd
/makepat{
scrmtx astore pop
gsave
initgraphics
CM
patarray exch get
scrmtx
makepattern
grestore
setpattern
}bd
/cg_BeginEPSF{
userdict save/cg_b4_Inc_state exch put
userdict/cg_endepsf/cg_EndEPSF load put
count userdict/cg_op_count 3 -1 roll put
countdictstack dup array dictstack userdict/cg_dict_array 3 -1 roll put
3 sub{end}repeat
/showpage {} def
0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin
10 setmiterlimit [] 0 setdash newpath
false setstrokeadjust false setoverprint % don't use F
}bd
/cg_EndEPSF{
countdictstack 3 sub { end } repeat
cg_dict_array 3 1 index length 3 sub getinterval
{begin}forall
count userdict/cg_op_count get sub{pop}repeat
userdict/cg_b4_Inc_state get restore
F setpacking
}bd
/cg_biproc{currentfile/RunLengthDecode filter}bd
/cg_aiproc{currentfile/ASCII85Decode filter/RunLengthDecode filter}bd
/ImageDataSource 0 def
L3?{
/cg_mibiproc{pop pop/ImageDataSource{cg_biproc}def}bd
/cg_miaiproc{pop pop/ImageDataSource{cg_aiproc}def}bd
}{
/ImageBandMask 0 def
/ImageBandData 0 def
/cg_mibiproc{
string/ImageBandMask xs
string/ImageBandData xs
/ImageDataSource{[currentfile/RunLengthDecode filter dup ImageBandMask/readstring cvx
/pop cvx dup ImageBandData/readstring cvx/pop cvx]cvx bind}bd
}bd
/cg_miaiproc{
string/ImageBandMask xs
string/ImageBandData xs
/ImageDataSource{[currentfile/ASCII85Decode filter/RunLengthDecode filter
dup ImageBandMask/readstring cvx
/pop cvx dup ImageBandData/readstring cvx/pop cvx]cvx bind}bd
}bd
}ifelse
/imsave 0 def
/BI{save/imsave xd mark}bd
/EI{imsave restore}bd
/ID{
counttomark 2 idiv
dup 2 add % leave room for imagetype and imagematrix
dict begin
{def} repeat
pop % remove mark
/ImageType 1 def
/ImageMatrix[Width 0 0 Height neg 0 Height]def
currentdict dup/ImageMask known{ImageMask}{F}ifelse exch
% currentdict on stack
L3?{
dup/MaskedImage known
{
pop
<<
/ImageType 3
/InterleaveType 2
/DataDict currentdict
/MaskDict
<< /ImageType 1
/Width Width
/Height Height
/ImageMatrix ImageMatrix
/BitsPerComponent 1
/Decode [0 1]
currentdict/Interpolate known
{/Interpolate Interpolate}if
>>
>>
}if
}if
exch
{imagemask}{image}ifelse
end % pop imagedict from dict stack
}bd
/cguidfix{statusdict begin mark version end
{cvr}stopped{cleartomark 0}{exch pop}ifelse
2012 lt{dup findfont dup length dict begin
{1 index/FID ne 2 index/UniqueID ne and
{def} {pop pop} ifelse}forall
currentdict end definefont pop
}{pop}ifelse
}bd
/t_array 0 def
/t_i 0 def
/t_c 1 string def
/x_proc{ % x y
exch t_array t_i get add exch moveto
/t_i t_i 1 add store
}bd
/y_proc{ % x y
t_array t_i get add moveto
/t_i t_i 1 add store
}bd
/xy_proc{
% x y
t_array t_i 2 copy 1 add get 3 1 roll get
4 -1 roll add 3 1 roll add moveto
/t_i t_i 2 add store
}bd
/sop 0 def % don't bind sop
/cp_proc/x_proc ld % default moveto proc is for xwidths only
/base_charpath % string array
{
/t_array xs
/t_i 0 def
{ % char
t_c 0 3 -1 roll put
currentpoint
t_c cply sop
cp_proc
}forall
/t_array 0 def
}bd
/sop/stroke ld % default sop is stroke. Done here so we don't bind in /base_charpath
% default sop is stroke
/nop{}def
/xsp/base_charpath ld
/ysp{/cp_proc/y_proc ld base_charpath/cp_proc/x_proc ld}bd
/xysp{/cp_proc/xy_proc ld base_charpath/cp_proc/x_proc ld}bd
/xmp{/sop/nop ld /cp_proc/x_proc ld base_charpath/sop/stroke ld}bd
/ymp{/sop/nop ld /cp_proc/y_proc ld base_charpath/sop/stroke ld}bd
/xymp{/sop/nop ld /cp_proc/xy_proc ld base_charpath/sop/stroke ld}bd
/refnt{ % newname encoding fontname
findfont dup length dict copy dup
/Encoding 4 -1 roll put
definefont pop
}bd
/renmfont{ % newname fontname
findfont dup length dict copy definefont pop
}bd
L3? dup dup{save exch}if
% languagelevel2 ONLY code goes here
/Range 0 def
/DataSource 0 def
/val 0 def
/nRange 0 def
/mulRange 0 def
/d0 0 def
/r0 0 def
/di 0 def
/ri 0 def
/a0 0 def
/a1 0 def
/r1 0 def
/r2 0 def
/dx 0 def
/Nsteps 0 def
/sh3tp 0 def
/ymax 0 def
/ymin 0 def
/xmax 0 def
/xmin 0 def
/setupFunEval % funDict -- % this calculates and sets up a function dict for evaulation.
{
begin
/nRange Range length 2 idiv store
/mulRange % precompute the range data needed to map a sample value from the table to a range value
% this data looks like [ range0mul range0min range1mul range1min ... rangeN-1mul rangeN-1min ]
[
0 1 nRange 1 sub
{ % index
2 mul/nDim2 xd % 2*dimension# we are dealing with
Range nDim2 get % ymin
Range nDim2 1 add get % ymin ymax
1 index sub % ymin (ymax-ymin)
% xmin = 0, xmax = 255 (2^bitspersample - 1)
255 div % ymin (ymax-ymin)/(xmax - xmin)
exch % (ymax-ymin)/(xmax - xmin) ymin
}for
]store
end
}bd
/FunEval % val1 fundict -> comp1 comp2 ... compN
{
begin
% the value passed in is the base index into the table
nRange mul /val xd % compute the actual index to the table
% since there are nRange entries per base index
0 1 nRange 1 sub
{
dup 2 mul/nDim2 xd % dim
val % base value to use to do our lookup
add DataSource exch get % lookedupval
mulRange nDim2 get mul % lookedupval*(ymax-ymin)/(xmax-xmin)
mulRange nDim2 1 add get % lookedupval*(ymax-ymin)/(xmax-xmin) ymin
add % interpolated result
}for % comp1 comp2 ... compN
end
}bd
/max % a b -> max(a, b)
{
2 copy lt
{exch pop}{pop}ifelse
}bd
/sh2
{ % emulation of shading type 2. Assumes shading dictionary is top dictionary on the dict stack
/Coords load aload pop % x0 y0 x1 y1
3 index 3 index translate % origin is now at beginning point of shading
% x0 y0 x1 y1
3 -1 roll sub % x0 x1 y1-y0
3 1 roll exch % y1-y0 x1 x0
sub % y1-y0 x1-x0
2 copy
dup mul exch dup mul add sqrt % length of segment between two points
dup
scale
atan % atan (dy/dx)
%dup (rotation angle = )print ==
rotate % now line between 0,0 and 1,0 is the line perpendicular to which the axial lines are drawn
/Function load setupFunEval % may need to setup function dictionary by calling setupFunEval
% this is now specific to axial shadings. Compute the maximum bounds to fill
clippath {pathbbox}stopped {0 0 0 0}if newpath % x0 y0 x1 y1
/ymax xs
/xmax xs
/ymin xs
/xmin xs
currentdict/Extend known
{
/Extend load 0 get
{
0/Function load FunEval sc % evaluate the function to get a color and set it
xmin ymin xmin abs ymax ymin sub rectfill
}if
}if
% paint the rects. The sampling frequency is that of our table
/Nsteps/Function load/Size get 0 get 1 sub store
/dx 1 Nsteps div store
gsave
/di ymax ymin sub store
/Function load
% loop Nsteps + 1 times, incrementing the index by 1 each time
0 1 Nsteps
{
1 index FunEval sc
0 ymin dx di rectfill
dx 0 translate
}for
pop % pop our function
grestore % origin is back to start point
currentdict/Extend known
{
/Extend load 1 get
{
Nsteps/Function load FunEval sc % last element
1 ymin xmax 1 sub abs ymax ymin sub rectfill
}if
}if
}bd
/shp % this paints our shape for shading type 3
{ % x1 r1 x0 r0 -
4 copy
% fill interior arc
dup 0 gt{
0 exch a1 a0 arc
}{
pop 0 moveto
}ifelse
dup 0 gt{
0 exch a0 a1 arcn
}{
pop 0 lineto
}ifelse
fill
% fill exterior arc
dup 0 gt{
0 exch a0 a1 arc
}{
pop 0 moveto
}ifelse
dup 0 gt{
0 exch a1 a0 arcn
}{
pop 0 lineto
}ifelse
fill
}bd
/calcmaxs
{ % calculate maximum distance vector from origin to corner points
% of bbox
xmin dup mul ymin dup mul add sqrt % (xmin2 + ymin2)
xmax dup mul ymin dup mul add sqrt % (xmax2 + ymin2)
xmin dup mul ymax dup mul add sqrt % (xmin2 + ymax2)
xmax dup mul ymax dup mul add sqrt % (xmax2 + ymax2)
max max max % maximum value
}bd
/sh3
{ % emulation of shading type 3. Assumes shading dictionary is top dictionary on the dict stack
/Coords load aload pop % x0 y0 r1 x1 y1 r2
5 index 5 index translate % origin is now at first circle origin
3 -1 roll 6 -1 roll sub % y0 r1 y1 r2 dx
3 -1 roll 5 -1 roll sub % r1 r2 dx dy
2 copy dup mul exch dup mul add sqrt
/dx xs % r1 r2 dx dy
2 copy 0 ne exch 0 ne or
{
% r1 r2 dx dy
exch atan rotate % we are now rotated so dy is zero and positive values of dx move us as expected
}{
pop pop
}ifelse
% r1 r2
/r2 xs
/r1 xs
/Function load
dup/Size get 0 get 1 sub % this is the size of our table minus 1
/Nsteps xs % at some point we should optimize this better so NSteps is based on needed steps for the device
setupFunEval % may need to setup function dictionary by calling setupFunEval
% determine the case:
% case 0: circle1 inside circle2
% case 1: circle 2 inside circle 1
% case 2: r1 = r2
% case 3: r1 != r2
dx r2 add r1 lt{
% circle 2 inside of circle 1
0
}{
dx r1 add r2 le
{ % circle 1 inside of circle 2
1
}{ % circles don't contain each other
r1 r2 eq
{ % equal
2
}{ % r1 != r2
3
}ifelse
}ifelse
}ifelse
/sh3tp xs % sh3tp has the number of our different cases
clippath {pathbbox}stopped {0 0 0 0}if
newpath % x0 y0 x1 y1
/ymax xs
/xmax xs
/ymin xs
/xmin xs
% Arc angle atan( sqrt((dx*dx + dy*dy) - dr*dr), dr)
dx dup mul r2 r1 sub dup mul sub dup 0 gt
{
sqrt r2 r1 sub atan
/a0 exch 180 exch sub store
/a1 a0 neg store
}{
pop
/a0 0 store
/a1 360 store
}ifelse
currentdict/Extend known
{
/Extend load 0 get r1 0 gt and % no need to extend if the radius of the first end is 0
{
0/Function load FunEval sc % evaluate the function to get a color and set it
% case 0: circle1 inside circle2
% case 1: circle 2 inside circle 1
% case 2: circles don't contain each other and r1 == r2
% case 3: circles don't contain each other and r1 != r2
{
{ % case 0
dx 0 r1 360 0 arcn
xmin ymin moveto
xmax ymin lineto
xmax ymax lineto
xmin ymax lineto
xmin ymin lineto
eofill % for the bigger radius we fill everything except our circle
}
{ % case 1
r1 0 gt{0 0 r1 0 360 arc fill}if
}
{ % case 2
% r1 == r2, extend 0
% r3 = r, x3 = -(abs(minx) + r), x1 = 0
% x(i+1) r(i+1) x(i) r(i) shp
0 r1 xmin abs r1 add neg r1 shp
}
{ % case 3
% no containment, r1 != r2
r2 r1 gt{ % the endpoint we are drawing is that with a circle of zero radius
% x(i+1) r(i+1) x(i) r(i) shp
0 r1
r1 neg r2 r1 sub div dx mul % this is point of beginning circle
0 % point of ending circle
shp % takes x(i+1) r(i+1) x(i) r(i)
}{ % the first circle is the bigger of the two
% we find a circle on our line which is outside the bbox in the
% negative direction
% x(i+1) r(i+1) x(i) r(i) shp
0 r1 calcmaxs % 0 r1 maxs
dup
% calculating xs: (-(maxs+r2)*x2)/(x2-(r1-r2))
r2 add dx mul dx r1 r2 sub sub div
neg % maxs xs'
exch 1 index % xs' maxs xs'
abs exch sub
shp
}ifelse
}
}sh3tp get exec % execute the extend at beginning proc for our shading type
}if
}if
% now do the shading
/d0 0 store
/r0 r1 store
/di dx Nsteps div store
/ri r2 r1 sub Nsteps div store
/Function load
0 1 Nsteps
{ % function t(i)
1 index FunEval sc
d0 di add r0 ri add d0 r0 shp
{
% fill interior arc
d0 0 r0 a1 a0 arc
d0 di add 0 r0 ri add a0 a1 arcn
fill
% fill exterior arc
d0 0 r0 a0 a1 arc
d0 di add 0 r0 ri add a1 a0 arcn
fill
}pop
% advance to next
/d0 d0 di add store
/r0 r0 ri add store
}for
pop % pop our function dict
% handle Extend
currentdict/Extend known
{
/Extend load 1 get r2 0 gt and % no need to extend if the radius of the last end is 0
{
Nsteps/Function load FunEval sc % last element
% case 0: circle1 inside circle2
% case 1: circle 2 inside circle 1
% case 2: circles don't contain each other and r1 == r2
% case 3: circles don't contain each other and r1 != r2
{
{
dx 0 r2 0 360 arc fill
}
{
dx 0 r2 360 0 arcn
xmin ymin moveto
xmax ymin lineto
xmax ymax lineto
xmin ymax lineto
xmin ymin lineto
eofill % for the bigger radius we fill everything except our circle
}
{ % r1 == r2, extend 1
% r3 = r, x3 = (abs(xmax) + r), x1 = dx
% x(i+1) r(i+1) x(i) r(i) shp
xmax abs r1 add r1 dx r1 shp
}
{ % no containment, r1 != r2
r2 r1 gt{
% we find a circle on our line which is outside the bbox in the
% positive direction
% x(i+1) r(i+1) x(i) r(i) shp
calcmaxs dup % maxs maxs
% calculating xs: ((maxs+r1)*x2)/(x2-(r2-r1))
r1 add dx mul dx r2 r1 sub sub div % maxs xs
exch 1 index % xs maxs xs
exch sub
dx r2
shp
}{ % the endpoint we are drawing is that with a circle of zero radius
% x(i+1) r(i+1) x(i) r(i) shp
r1 neg r2 r1 sub div dx mul % this is point of ending circle
0 % radius of ending circle
dx % point of starting circle
r2 % radius of starting circle
shp
}ifelse
}
}
sh3tp get exec % execute the extend at end proc for our shading type
}if
}if
}bd
/sh % emulation of shfill operator for type 2 and type 3 shadings based on type 0 functions
{ % shadingDict --
begin
/ShadingType load dup dup 2 eq exch 3 eq or
{ % shadingtype
gsave
newpath
/ColorSpace load scs
currentdict/BBox known
{
/BBox load aload pop % llx lly urx ury
2 index sub % llx lly urx ury-lly
3 index % llx lly urx ury-lly llx
3 -1 roll exch sub
exch rectclip
}if
2 eq
{sh2}{sh3}ifelse
grestore
}{
% shadingtype
pop
(DEBUG: shading type unimplemented\n)print flush
}ifelse
end
}bd
% end of language level 2 ONLY code
{restore}if not dup{save exch}if
% languagelevel3 ONLY code goes here
L3?{ % we do these loads conditionally or else they will fail on a level 2 printer
/sh/shfill ld
/csq/clipsave ld
/csQ/cliprestore ld
}if
{restore}if
%currentdict dup maxlength exch length sub (number of extra slots in md = )print == flush % *** how many entries are free
end
setpacking
% count 0 ne { pstack(***extras on stack during prolog execution***\n)print flush}if % *** BARK if anything is left on stack
%%EndFile
%%EndProlog
%%BeginSetup
%%EndSetup
%%Page: 1 1
%%PageBoundingBox: 0 0 1102 516
%%BeginPageSetup
cg_md begin
bp
sdmtx
[ /CIEBasedABC 4 dict dup begin
/WhitePoint [ 0.9505 1.0000 1.0891 ] def
/DecodeABC [
{ 1.0 0.0 3 -1 roll 1 index 1 index le { exch pop} { pop } ifelse
1 index 1 index ge { exch pop } { pop } ifelse <
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000001010101010101010101010101
0101010101010101010101010101010101010101010101020202020202020202
0202020202020202020202020202020202030303030303030303030303030303
0303030303030304040404040404040404040404040404040404050505050505
0505050505050505050506060606060606060606060606060607070707070707
0707070707070708080808080808080808080808090909090909090909090909
0a0a0a0a0a0a0a0a0a0a0a0b0b0b0b0b0b0b0b0b0b0b0c0c0c0c0c0c0c0c0c0c
0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0e0e0e0f0f0f0f0f0f0f0f0f10101010
1010101010111111111111111112121212121212121313131313131313141414
1414141414151515151515151616161616161616171717171717171818181818
18181919191919191a1a1a1a1a1a1a1b1b1b1b1b1b1c1c1c1c1c1c1c1d1d1d1d
1d1d1e1e1e1e1e1e1f1f1f1f1f1f202020202020212121212121222222222223
2323232323242424242425252525252526262626262727272727282828282829
292929292a2a2a2a2a2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2e2e2e2e2e2f2f2f
2f2f303030303131313131323232323333333333343434343535353535363636
36373737373838383839393939393a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e
3e3e3f3f3f3f4040404041414141424242424343434444444445454545464646
4647474748484848494949494a4a4a4b4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4f
4f50505051515151525252535353535454545555555656565657575758585859
59595a5a5a5a5b5b5b5c5c5c5d5d5d5e5e5e5f5f5f6060606061616162626263
63636464646565656666666767676868686969696a6a6a6b6b6b6c6c6d6d6d6e
6e6e6f6f6f707070717171727273737374747475757576767677777878787979
797a7a7b7b7b7c7c7c7d7d7e7e7e7f7f7f808081818182828283838484848585
86868687878888888989898a8a8b8b8b8c8c8d8d8d8e8e8f8f90909091919292
9293939494949595969697979798989999999a9a9b9b9c9c9c9d9d9e9e9f9f9f
a0a0a1a1a2a2a3a3a3a4a4a5a5a6a6a6a7a7a8a8a9a9aaaaabababacacadadae
aeafafb0b0b0b1b1b2b2b3b3b4b4b5b5b6b6b6b7b7b8b8b9b9bababbbbbcbcbd
bdbebebebfbfc0c0c1c1c2c2c3c3c4c4c5c5c6c6c7c7c8c8c9c9cacacbcbcccc
cdcdcececfcfd0d0d1d1d2d2d3d3d4d4d5d5d6d6d7d7d8d8d9d9dadadbdcdcdd
dddededfdfe0e0e1e1e2e2e3e3e4e4e5e6e6e7e7e8e8e9e9eaeaebebecededee
eeefeff0f0f1f1f2f3f3f4f4f5f5f6f6f7f8f8f9f9fafafbfcfcfdfdfefeffff
> dup length 1 sub 3 -1 roll mul dup dup floor cvi exch ceiling
cvi 3 index exch get 4 -1 roll 3 -1 roll get
dup 3 1 roll sub 3 -1 roll dup floor cvi sub mul add 255 div } bind
{ 1.0 0.0 3 -1 roll 1 index 1 index le { exch pop} { pop } ifelse
1 index 1 index ge { exch pop } { pop } ifelse <
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000001010101010101010101010101
0101010101010101010101010101010101010101010101020202020202020202
0202020202020202020202020202020202030303030303030303030303030303
0303030303030304040404040404040404040404040404040404050505050505
0505050505050505050506060606060606060606060606060607070707070707
0707070707070708080808080808080808080808090909090909090909090909
0a0a0a0a0a0a0a0a0a0a0a0b0b0b0b0b0b0b0b0b0b0b0c0c0c0c0c0c0c0c0c0c
0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0e0e0e0f0f0f0f0f0f0f0f0f10101010
1010101010111111111111111112121212121212121313131313131313141414
1414141414151515151515151616161616161616171717171717171818181818
18181919191919191a1a1a1a1a1a1a1b1b1b1b1b1b1c1c1c1c1c1c1c1d1d1d1d
1d1d1e1e1e1e1e1e1f1f1f1f1f1f202020202020212121212121222222222223
2323232323242424242425252525252526262626262727272727282828282829
292929292a2a2a2a2a2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2e2e2e2e2e2f2f2f
2f2f303030303131313131323232323333333333343434343535353535363636
36373737373838383839393939393a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e
3e3e3f3f3f3f4040404041414141424242424343434444444445454545464646
4647474748484848494949494a4a4a4b4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4f
4f50505051515151525252535353535454545555555656565657575758585859
59595a5a5a5a5b5b5b5c5c5c5d5d5d5e5e5e5f5f5f6060606061616162626263
63636464646565656666666767676868686969696a6a6a6b6b6b6c6c6d6d6d6e
6e6e6f6f6f707070717171727273737374747475757576767677777878787979
797a7a7b7b7b7c7c7c7d7d7e7e7e7f7f7f808081818182828283838484848585
86868687878888888989898a8a8b8b8b8c8c8d8d8d8e8e8f8f90909091919292
9293939494949595969697979798989999999a9a9b9b9c9c9c9d9d9e9e9f9f9f
a0a0a1a1a2a2a3a3a3a4a4a5a5a6a6a6a7a7a8a8a9a9aaaaabababacacadadae
aeafafb0b0b0b1b1b2b2b3b3b4b4b5b5b6b6b6b7b7b8b8b9b9bababbbbbcbcbd
bdbebebebfbfc0c0c1c1c2c2c3c3c4c4c5c5c6c6c7c7c8c8c9c9cacacbcbcccc
cdcdcececfcfd0d0d1d1d2d2d3d3d4d4d5d5d6d6d7d7d8d8d9d9dadadbdcdcdd
dddededfdfe0e0e1e1e2e2e3e3e4e4e5e6e6e7e7e8e8e9e9eaeaebebecededee
eeefeff0f0f1f1f2f3f3f4f4f5f5f6f6f7f8f8f9f9fafafbfcfcfdfdfefeffff
> dup length 1 sub 3 -1 roll mul dup dup floor cvi exch ceiling
cvi 3 index exch get 4 -1 roll 3 -1 roll get
dup 3 1 roll sub 3 -1 roll dup floor cvi sub mul add 255 div } bind
{ 1.0 0.0 3 -1 roll 1 index 1 index le { exch pop} { pop } ifelse
1 index 1 index ge { exch pop } { pop } ifelse <
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000001010101010101010101010101
0101010101010101010101010101010101010101010101020202020202020202
0202020202020202020202020202020202030303030303030303030303030303
0303030303030304040404040404040404040404040404040404050505050505
0505050505050505050506060606060606060606060606060607070707070707
0707070707070708080808080808080808080808090909090909090909090909
0a0a0a0a0a0a0a0a0a0a0a0b0b0b0b0b0b0b0b0b0b0b0c0c0c0c0c0c0c0c0c0c
0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0e0e0e0f0f0f0f0f0f0f0f0f10101010
1010101010111111111111111112121212121212121313131313131313141414
1414141414151515151515151616161616161616171717171717171818181818
18181919191919191a1a1a1a1a1a1a1b1b1b1b1b1b1c1c1c1c1c1c1c1d1d1d1d
1d1d1e1e1e1e1e1e1f1f1f1f1f1f202020202020212121212121222222222223
2323232323242424242425252525252526262626262727272727282828282829
292929292a2a2a2a2a2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2e2e2e2e2e2f2f2f
2f2f303030303131313131323232323333333333343434343535353535363636
36373737373838383839393939393a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e
3e3e3f3f3f3f4040404041414141424242424343434444444445454545464646
4647474748484848494949494a4a4a4b4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4f
4f50505051515151525252535353535454545555555656565657575758585859
59595a5a5a5a5b5b5b5c5c5c5d5d5d5e5e5e5f5f5f6060606061616162626263
63636464646565656666666767676868686969696a6a6a6b6b6b6c6c6d6d6d6e
6e6e6f6f6f707070717171727273737374747475757576767677777878787979
797a7a7b7b7b7c7c7c7d7d7e7e7e7f7f7f808081818182828283838484848585
86868687878888888989898a8a8b8b8b8c8c8d8d8d8e8e8f8f90909091919292
9293939494949595969697979798989999999a9a9b9b9c9c9c9d9d9e9e9f9f9f
a0a0a1a1a2a2a3a3a3a4a4a5a5a6a6a6a7a7a8a8a9a9aaaaabababacacadadae
aeafafb0b0b0b1b1b2b2b3b3b4b4b5b5b6b6b6b7b7b8b8b9b9bababbbbbcbcbd
bdbebebebfbfc0c0c1c1c2c2c3c3c4c4c5c5c6c6c7c7c8c8c9c9cacacbcbcccc
cdcdcececfcfd0d0d1d1d2d2d3d3d4d4d5d5d6d6d7d7d8d8d9d9dadadbdcdcdd
dddededfdfe0e0e1e1e2e2e3e3e4e4e5e6e6e7e7e8e8e9e9eaeaebebecededee
eeefeff0f0f1f1f2f3f3f4f4f5f5f6f6f7f8f8f9f9fafafbfcfcfdfdfefeffff
> dup length 1 sub 3 -1 roll mul dup dup floor cvi exch ceiling
cvi 3 index exch get 4 -1 roll 3 -1 roll get
dup 3 1 roll sub 3 -1 roll dup floor cvi sub mul add 255 div } bind
] def
/MatrixABC [ 0.4124 0.2126 0.0193 0.3576 0.7151 0.1192 0.1805 0.0722 0.9508 ] def
/RangeLMN [ 0.0 0.9505 0.0 1.0000 0.0 1.0891 ] def
end ] /Cs1 exch/ColorSpace dr pop
%%EndPageSetup
0.60000002 i
/Cs1 SC
0.13333334 0.13333334 0.13333334 sc
q
0 516 m
518 516 l
518 0 l
0 0 l
0 516 l
h
W*
0 0 1102 516 rc
-10 526 m
528 526 l
528 -10 l
-10 -10 l
h
f
Q
1 1 1 sc
q
518 516 m
1102 516 l
1102 0 l
518 0 l
518 516 l
h
W*
0 0 1102 516 rc
508 526 m
1112 526 l
1112 -10 l
508 -10 l
h
f
Q
0.13333334 0.13333334 0.13333334 sc
q
921.56757 468 m
982 468 l
982 48 l
921.56757 48 l
921.56757 261.5 l
698.43243 261.5 l
698.43243 48 l
638 48 l
638 468 l
698.43243 468 l
698.43243 276.08334 l
921.56757 276.08334 l
921.56757 468 l
h
W
0 0 1102 516 rc
628 478 m
992 478 l
992 38 l
628 38 l
h
f
Q
1 1 1 sc
q
180.15546 262.08334 m
180.15546 65.5 l
233.30252 65.5 l
266.00839 65.5 290.53781 70.166664 306.89075 86.5 c
323.24368 103.41666 331.42017 128.5 331.42017 162.33333 c
331.42017 196.75 322.07562 221.83333 303.97058 238.16667 c
285.28152 254.5 253.15967 262.66666 206.43698 262.66666 c
198.84454 262.66666 187.16386 262.08334 180.15546 262.08334 c
h
180.15546 452.25 m
180.15546 276.66666 l
195.92436 276.66666 l
240.31093 276.66666 270.09665 283.66666 286.44958 297.66666 c
302.80252 311.66666 310.39496 333.83334 310.39496 365.33334 c
310.39496 386.91666 307.47479 403.83334 301.05042 415.5 c
294.62604 427.75 284.69748 436.5 272.43277 442.91666 c
259.58405 449.91666 238.55882 452.83334 207.60504 452.83334 c
199.42857 452.83334 187.16386 452.83334 180.15546 452.25 c
h
120 48 m
120 468 l
204.68488 468 l
318.57144 468 375.80673 435.33334 375.80673 369.41666 c
375.80673 342.58334 365.87814 320.41666 346.021 304.08334 c
326.74789 287.75 296.96219 276.66666 257.83194 270.83334 c
305.13864 267.33334 340.18066 255.66667 363.54202 235.83333 c
386.31934 215.41667 398 190.33333 398 160.58333 c
398 134.33333 389.82352 111.58334 374.63864 92.333336 c
358.86975 73.666664 339.0126 62 314.48318 56.166668 c
289.9538 50.333332 257.83194 48 216.94958 48 c
120 48 l
h
W
0 0 1102 516 rc
110 478 m
408 478 l
408 38 l
110 38 l
h
f
ep
end
%%Trailer
%%EOF

@ -0,0 +1,912 @@
%!PS-Adobe-3.0 EPSF-3.0
%APL_DSC_Encoding: UTF8
%APLProducer: (Version 10.14.6 (Build 18G95) Quartz PS Context)
%%Title: (Unknown)
%%Creator: (Unknown)
%%CreationDate: (Unknown)
%%For: (Unknown)
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
%%Pages: 1
%%BoundingBox: 0 0 1102 1102
%%EndComments
%%BeginProlog
%%BeginFile: cg-pdf.ps
%%Copyright: Copyright 2000-2004 Apple Computer Incorporated.
%%Copyright: All Rights Reserved.
currentpacking true setpacking
/cg_md 141 dict def
cg_md begin
/L3? languagelevel 3 ge def
/bd{bind def}bind def
/ld{load def}bd
/xs{exch store}bd
/xd{exch def}bd
/cmmtx matrix def
mark
/sc/setcolor
/scs/setcolorspace
/dr/defineresource
/fr/findresource
/T/true
/F/false
/d/setdash
/w/setlinewidth
/J/setlinecap
/j/setlinejoin
/M/setmiterlimit
/i/setflat
/rc/rectclip
/rf/rectfill
/rs/rectstroke
/f/fill
/f*/eofill
/sf/selectfont
/s/show
%/as/ashow
/xS/xshow
/yS/yshow
/xyS/xyshow
/S/stroke
/m/moveto
/l/lineto
/c/curveto
/h/closepath
/n/newpath
/q/gsave
/Q/grestore
counttomark 2 idiv
%dup (number of ld's = )print == flush % *** how many
{ld}repeat pop
/SC{ % CSname
/ColorSpace fr scs
}bd
/sopr /setoverprint where{pop/setoverprint}{/pop}ifelse ld
/soprm /setoverprintmode where{pop/setoverprintmode}{/pop}ifelse ld
/cgmtx matrix def
/sdmtx{cgmtx currentmatrix pop}bd
/CM {cgmtx setmatrix}bd % pop the ctm: our gstate ctm on host is now identity
/cm {cmmtx astore CM concat}bd % reset the matrix and then concat
/W{clip newpath}bd
/W*{eoclip newpath}bd
statusdict begin product end dup (HP) anchorsearch{
pop pop pop % pop off the search results
true
}{
pop % previous search result
(hp) anchorsearch{
pop pop true
}{
pop false
}ifelse
}ifelse
{ % HP is the product: we use this method of stroking because of a bug in their clone printers with certain T3 fonts
{
{ % charCode Wx Wy
pop pop % charCode
(0)dup 0 4 -1 roll put
F charpath
}cshow
}
}{
{F charpath}
}ifelse
/cply exch bd
/cps {cply stroke}bd
/pgsave 0 def
/bp{/pgsave save store}bd
/ep{pgsave restore showpage}def % dont' bind
/re{4 2 roll m 1 index 0 rlineto 0 exch rlineto neg 0 rlineto h}bd
/scrdict 10 dict def
/scrmtx matrix def
/patarray 0 def
/createpat{patarray 3 1 roll put}bd
/makepat{
scrmtx astore pop
gsave
initgraphics
CM
patarray exch get
scrmtx
makepattern
grestore
setpattern
}bd
/cg_BeginEPSF{
userdict save/cg_b4_Inc_state exch put
userdict/cg_endepsf/cg_EndEPSF load put
count userdict/cg_op_count 3 -1 roll put
countdictstack dup array dictstack userdict/cg_dict_array 3 -1 roll put
3 sub{end}repeat
/showpage {} def
0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin
10 setmiterlimit [] 0 setdash newpath
false setstrokeadjust false setoverprint % don't use F
}bd
/cg_EndEPSF{
countdictstack 3 sub { end } repeat
cg_dict_array 3 1 index length 3 sub getinterval
{begin}forall
count userdict/cg_op_count get sub{pop}repeat
userdict/cg_b4_Inc_state get restore
F setpacking
}bd
/cg_biproc{currentfile/RunLengthDecode filter}bd
/cg_aiproc{currentfile/ASCII85Decode filter/RunLengthDecode filter}bd
/ImageDataSource 0 def
L3?{
/cg_mibiproc{pop pop/ImageDataSource{cg_biproc}def}bd
/cg_miaiproc{pop pop/ImageDataSource{cg_aiproc}def}bd
}{
/ImageBandMask 0 def
/ImageBandData 0 def
/cg_mibiproc{
string/ImageBandMask xs
string/ImageBandData xs
/ImageDataSource{[currentfile/RunLengthDecode filter dup ImageBandMask/readstring cvx
/pop cvx dup ImageBandData/readstring cvx/pop cvx]cvx bind}bd
}bd
/cg_miaiproc{
string/ImageBandMask xs
string/ImageBandData xs
/ImageDataSource{[currentfile/ASCII85Decode filter/RunLengthDecode filter
dup ImageBandMask/readstring cvx
/pop cvx dup ImageBandData/readstring cvx/pop cvx]cvx bind}bd
}bd
}ifelse
/imsave 0 def
/BI{save/imsave xd mark}bd
/EI{imsave restore}bd
/ID{
counttomark 2 idiv
dup 2 add % leave room for imagetype and imagematrix
dict begin
{def} repeat
pop % remove mark
/ImageType 1 def
/ImageMatrix[Width 0 0 Height neg 0 Height]def
currentdict dup/ImageMask known{ImageMask}{F}ifelse exch
% currentdict on stack
L3?{
dup/MaskedImage known
{
pop
<<
/ImageType 3
/InterleaveType 2
/DataDict currentdict
/MaskDict
<< /ImageType 1
/Width Width
/Height Height
/ImageMatrix ImageMatrix
/BitsPerComponent 1
/Decode [0 1]
currentdict/Interpolate known
{/Interpolate Interpolate}if
>>
>>
}if
}if
exch
{imagemask}{image}ifelse
end % pop imagedict from dict stack
}bd
/cguidfix{statusdict begin mark version end
{cvr}stopped{cleartomark 0}{exch pop}ifelse
2012 lt{dup findfont dup length dict begin
{1 index/FID ne 2 index/UniqueID ne and
{def} {pop pop} ifelse}forall
currentdict end definefont pop
}{pop}ifelse
}bd
/t_array 0 def
/t_i 0 def
/t_c 1 string def
/x_proc{ % x y
exch t_array t_i get add exch moveto
/t_i t_i 1 add store
}bd
/y_proc{ % x y
t_array t_i get add moveto
/t_i t_i 1 add store
}bd
/xy_proc{
% x y
t_array t_i 2 copy 1 add get 3 1 roll get
4 -1 roll add 3 1 roll add moveto
/t_i t_i 2 add store
}bd
/sop 0 def % don't bind sop
/cp_proc/x_proc ld % default moveto proc is for xwidths only
/base_charpath % string array
{
/t_array xs
/t_i 0 def
{ % char
t_c 0 3 -1 roll put
currentpoint
t_c cply sop
cp_proc
}forall
/t_array 0 def
}bd
/sop/stroke ld % default sop is stroke. Done here so we don't bind in /base_charpath
% default sop is stroke
/nop{}def
/xsp/base_charpath ld
/ysp{/cp_proc/y_proc ld base_charpath/cp_proc/x_proc ld}bd
/xysp{/cp_proc/xy_proc ld base_charpath/cp_proc/x_proc ld}bd
/xmp{/sop/nop ld /cp_proc/x_proc ld base_charpath/sop/stroke ld}bd
/ymp{/sop/nop ld /cp_proc/y_proc ld base_charpath/sop/stroke ld}bd
/xymp{/sop/nop ld /cp_proc/xy_proc ld base_charpath/sop/stroke ld}bd
/refnt{ % newname encoding fontname
findfont dup length dict copy dup
/Encoding 4 -1 roll put
definefont pop
}bd
/renmfont{ % newname fontname
findfont dup length dict copy definefont pop
}bd
L3? dup dup{save exch}if
% languagelevel2 ONLY code goes here
/Range 0 def
/DataSource 0 def
/val 0 def
/nRange 0 def
/mulRange 0 def
/d0 0 def
/r0 0 def
/di 0 def
/ri 0 def
/a0 0 def
/a1 0 def
/r1 0 def
/r2 0 def
/dx 0 def
/Nsteps 0 def
/sh3tp 0 def
/ymax 0 def
/ymin 0 def
/xmax 0 def
/xmin 0 def
/setupFunEval % funDict -- % this calculates and sets up a function dict for evaulation.
{
begin
/nRange Range length 2 idiv store
/mulRange % precompute the range data needed to map a sample value from the table to a range value
% this data looks like [ range0mul range0min range1mul range1min ... rangeN-1mul rangeN-1min ]
[
0 1 nRange 1 sub
{ % index
2 mul/nDim2 xd % 2*dimension# we are dealing with
Range nDim2 get % ymin
Range nDim2 1 add get % ymin ymax
1 index sub % ymin (ymax-ymin)
% xmin = 0, xmax = 255 (2^bitspersample - 1)
255 div % ymin (ymax-ymin)/(xmax - xmin)
exch % (ymax-ymin)/(xmax - xmin) ymin
}for
]store
end
}bd
/FunEval % val1 fundict -> comp1 comp2 ... compN
{
begin
% the value passed in is the base index into the table
nRange mul /val xd % compute the actual index to the table
% since there are nRange entries per base index
0 1 nRange 1 sub
{
dup 2 mul/nDim2 xd % dim
val % base value to use to do our lookup
add DataSource exch get % lookedupval
mulRange nDim2 get mul % lookedupval*(ymax-ymin)/(xmax-xmin)
mulRange nDim2 1 add get % lookedupval*(ymax-ymin)/(xmax-xmin) ymin
add % interpolated result
}for % comp1 comp2 ... compN
end
}bd
/max % a b -> max(a, b)
{
2 copy lt
{exch pop}{pop}ifelse
}bd
/sh2
{ % emulation of shading type 2. Assumes shading dictionary is top dictionary on the dict stack
/Coords load aload pop % x0 y0 x1 y1
3 index 3 index translate % origin is now at beginning point of shading
% x0 y0 x1 y1
3 -1 roll sub % x0 x1 y1-y0
3 1 roll exch % y1-y0 x1 x0
sub % y1-y0 x1-x0
2 copy
dup mul exch dup mul add sqrt % length of segment between two points
dup
scale
atan % atan (dy/dx)
%dup (rotation angle = )print ==
rotate % now line between 0,0 and 1,0 is the line perpendicular to which the axial lines are drawn
/Function load setupFunEval % may need to setup function dictionary by calling setupFunEval
% this is now specific to axial shadings. Compute the maximum bounds to fill
clippath {pathbbox}stopped {0 0 0 0}if newpath % x0 y0 x1 y1
/ymax xs
/xmax xs
/ymin xs
/xmin xs
currentdict/Extend known
{
/Extend load 0 get
{
0/Function load FunEval sc % evaluate the function to get a color and set it
xmin ymin xmin abs ymax ymin sub rectfill
}if
}if
% paint the rects. The sampling frequency is that of our table
/Nsteps/Function load/Size get 0 get 1 sub store
/dx 1 Nsteps div store
gsave
/di ymax ymin sub store
/Function load
% loop Nsteps + 1 times, incrementing the index by 1 each time
0 1 Nsteps
{
1 index FunEval sc
0 ymin dx di rectfill
dx 0 translate
}for
pop % pop our function
grestore % origin is back to start point
currentdict/Extend known
{
/Extend load 1 get
{
Nsteps/Function load FunEval sc % last element
1 ymin xmax 1 sub abs ymax ymin sub rectfill
}if
}if
}bd
/shp % this paints our shape for shading type 3
{ % x1 r1 x0 r0 -
4 copy
% fill interior arc
dup 0 gt{
0 exch a1 a0 arc
}{
pop 0 moveto
}ifelse
dup 0 gt{
0 exch a0 a1 arcn
}{
pop 0 lineto
}ifelse
fill
% fill exterior arc
dup 0 gt{
0 exch a0 a1 arc
}{
pop 0 moveto
}ifelse
dup 0 gt{
0 exch a1 a0 arcn
}{
pop 0 lineto
}ifelse
fill
}bd
/calcmaxs
{ % calculate maximum distance vector from origin to corner points
% of bbox
xmin dup mul ymin dup mul add sqrt % (xmin2 + ymin2)
xmax dup mul ymin dup mul add sqrt % (xmax2 + ymin2)
xmin dup mul ymax dup mul add sqrt % (xmin2 + ymax2)
xmax dup mul ymax dup mul add sqrt % (xmax2 + ymax2)
max max max % maximum value
}bd
/sh3
{ % emulation of shading type 3. Assumes shading dictionary is top dictionary on the dict stack
/Coords load aload pop % x0 y0 r1 x1 y1 r2
5 index 5 index translate % origin is now at first circle origin
3 -1 roll 6 -1 roll sub % y0 r1 y1 r2 dx
3 -1 roll 5 -1 roll sub % r1 r2 dx dy
2 copy dup mul exch dup mul add sqrt
/dx xs % r1 r2 dx dy
2 copy 0 ne exch 0 ne or
{
% r1 r2 dx dy
exch atan rotate % we are now rotated so dy is zero and positive values of dx move us as expected
}{
pop pop
}ifelse
% r1 r2
/r2 xs
/r1 xs
/Function load
dup/Size get 0 get 1 sub % this is the size of our table minus 1
/Nsteps xs % at some point we should optimize this better so NSteps is based on needed steps for the device
setupFunEval % may need to setup function dictionary by calling setupFunEval
% determine the case:
% case 0: circle1 inside circle2
% case 1: circle 2 inside circle 1
% case 2: r1 = r2
% case 3: r1 != r2
dx r2 add r1 lt{
% circle 2 inside of circle 1
0
}{
dx r1 add r2 le
{ % circle 1 inside of circle 2
1
}{ % circles don't contain each other
r1 r2 eq
{ % equal
2
}{ % r1 != r2
3
}ifelse
}ifelse
}ifelse
/sh3tp xs % sh3tp has the number of our different cases
clippath {pathbbox}stopped {0 0 0 0}if
newpath % x0 y0 x1 y1
/ymax xs
/xmax xs
/ymin xs
/xmin xs
% Arc angle atan( sqrt((dx*dx + dy*dy) - dr*dr), dr)
dx dup mul r2 r1 sub dup mul sub dup 0 gt
{
sqrt r2 r1 sub atan
/a0 exch 180 exch sub store
/a1 a0 neg store
}{
pop
/a0 0 store
/a1 360 store
}ifelse
currentdict/Extend known
{
/Extend load 0 get r1 0 gt and % no need to extend if the radius of the first end is 0
{
0/Function load FunEval sc % evaluate the function to get a color and set it
% case 0: circle1 inside circle2
% case 1: circle 2 inside circle 1
% case 2: circles don't contain each other and r1 == r2
% case 3: circles don't contain each other and r1 != r2
{
{ % case 0
dx 0 r1 360 0 arcn
xmin ymin moveto
xmax ymin lineto
xmax ymax lineto
xmin ymax lineto
xmin ymin lineto
eofill % for the bigger radius we fill everything except our circle
}
{ % case 1
r1 0 gt{0 0 r1 0 360 arc fill}if
}
{ % case 2
% r1 == r2, extend 0
% r3 = r, x3 = -(abs(minx) + r), x1 = 0
% x(i+1) r(i+1) x(i) r(i) shp
0 r1 xmin abs r1 add neg r1 shp
}
{ % case 3
% no containment, r1 != r2
r2 r1 gt{ % the endpoint we are drawing is that with a circle of zero radius
% x(i+1) r(i+1) x(i) r(i) shp
0 r1
r1 neg r2 r1 sub div dx mul % this is point of beginning circle
0 % point of ending circle
shp % takes x(i+1) r(i+1) x(i) r(i)
}{ % the first circle is the bigger of the two
% we find a circle on our line which is outside the bbox in the
% negative direction
% x(i+1) r(i+1) x(i) r(i) shp
0 r1 calcmaxs % 0 r1 maxs
dup
% calculating xs: (-(maxs+r2)*x2)/(x2-(r1-r2))
r2 add dx mul dx r1 r2 sub sub div
neg % maxs xs'
exch 1 index % xs' maxs xs'
abs exch sub
shp
}ifelse
}
}sh3tp get exec % execute the extend at beginning proc for our shading type
}if
}if
% now do the shading
/d0 0 store
/r0 r1 store
/di dx Nsteps div store
/ri r2 r1 sub Nsteps div store
/Function load
0 1 Nsteps
{ % function t(i)
1 index FunEval sc
d0 di add r0 ri add d0 r0 shp
{
% fill interior arc
d0 0 r0 a1 a0 arc
d0 di add 0 r0 ri add a0 a1 arcn
fill
% fill exterior arc
d0 0 r0 a0 a1 arc
d0 di add 0 r0 ri add a1 a0 arcn
fill
}pop
% advance to next
/d0 d0 di add store
/r0 r0 ri add store
}for
pop % pop our function dict
% handle Extend
currentdict/Extend known
{
/Extend load 1 get r2 0 gt and % no need to extend if the radius of the last end is 0
{
Nsteps/Function load FunEval sc % last element
% case 0: circle1 inside circle2
% case 1: circle 2 inside circle 1
% case 2: circles don't contain each other and r1 == r2
% case 3: circles don't contain each other and r1 != r2
{
{
dx 0 r2 0 360 arc fill
}
{
dx 0 r2 360 0 arcn
xmin ymin moveto
xmax ymin lineto
xmax ymax lineto
xmin ymax lineto
xmin ymin lineto
eofill % for the bigger radius we fill everything except our circle
}
{ % r1 == r2, extend 1
% r3 = r, x3 = (abs(xmax) + r), x1 = dx
% x(i+1) r(i+1) x(i) r(i) shp
xmax abs r1 add r1 dx r1 shp
}
{ % no containment, r1 != r2
r2 r1 gt{
% we find a circle on our line which is outside the bbox in the
% positive direction
% x(i+1) r(i+1) x(i) r(i) shp
calcmaxs dup % maxs maxs
% calculating xs: ((maxs+r1)*x2)/(x2-(r2-r1))
r1 add dx mul dx r2 r1 sub sub div % maxs xs
exch 1 index % xs maxs xs
exch sub
dx r2
shp
}{ % the endpoint we are drawing is that with a circle of zero radius
% x(i+1) r(i+1) x(i) r(i) shp
r1 neg r2 r1 sub div dx mul % this is point of ending circle
0 % radius of ending circle
dx % point of starting circle
r2 % radius of starting circle
shp
}ifelse
}
}
sh3tp get exec % execute the extend at end proc for our shading type
}if
}if
}bd
/sh % emulation of shfill operator for type 2 and type 3 shadings based on type 0 functions
{ % shadingDict --
begin
/ShadingType load dup dup 2 eq exch 3 eq or
{ % shadingtype
gsave
newpath
/ColorSpace load scs
currentdict/BBox known
{
/BBox load aload pop % llx lly urx ury
2 index sub % llx lly urx ury-lly
3 index % llx lly urx ury-lly llx
3 -1 roll exch sub
exch rectclip
}if
2 eq
{sh2}{sh3}ifelse
grestore
}{
% shadingtype
pop
(DEBUG: shading type unimplemented\n)print flush
}ifelse
end
}bd
% end of language level 2 ONLY code
{restore}if not dup{save exch}if
% languagelevel3 ONLY code goes here
L3?{ % we do these loads conditionally or else they will fail on a level 2 printer
/sh/shfill ld
/csq/clipsave ld
/csQ/cliprestore ld
}if
{restore}if
%currentdict dup maxlength exch length sub (number of extra slots in md = )print == flush % *** how many entries are free
end
setpacking
% count 0 ne { pstack(***extras on stack during prolog execution***\n)print flush}if % *** BARK if anything is left on stack
%%EndFile
%%EndProlog
%%BeginSetup
%%EndSetup
%%Page: 1 1
%%PageBoundingBox: 0 0 1102 1102
%%BeginPageSetup
cg_md begin
bp
sdmtx
[ /CIEBasedABC 4 dict dup begin
/WhitePoint [ 0.9505 1.0000 1.0891 ] def
/DecodeABC [
{ 1.0 0.0 3 -1 roll 1 index 1 index le { exch pop} { pop } ifelse
1 index 1 index ge { exch pop } { pop } ifelse <
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000001010101010101010101010101
0101010101010101010101010101010101010101010101020202020202020202
0202020202020202020202020202020202030303030303030303030303030303
0303030303030304040404040404040404040404040404040404050505050505
0505050505050505050506060606060606060606060606060607070707070707
0707070707070708080808080808080808080808090909090909090909090909
0a0a0a0a0a0a0a0a0a0a0a0b0b0b0b0b0b0b0b0b0b0b0c0c0c0c0c0c0c0c0c0c
0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0e0e0e0f0f0f0f0f0f0f0f0f10101010
1010101010111111111111111112121212121212121313131313131313141414
1414141414151515151515151616161616161616171717171717171818181818
18181919191919191a1a1a1a1a1a1a1b1b1b1b1b1b1c1c1c1c1c1c1c1d1d1d1d
1d1d1e1e1e1e1e1e1f1f1f1f1f1f202020202020212121212121222222222223
2323232323242424242425252525252526262626262727272727282828282829
292929292a2a2a2a2a2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2e2e2e2e2e2f2f2f
2f2f303030303131313131323232323333333333343434343535353535363636
36373737373838383839393939393a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e
3e3e3f3f3f3f4040404041414141424242424343434444444445454545464646
4647474748484848494949494a4a4a4b4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4f
4f50505051515151525252535353535454545555555656565657575758585859
59595a5a5a5a5b5b5b5c5c5c5d5d5d5e5e5e5f5f5f6060606061616162626263
63636464646565656666666767676868686969696a6a6a6b6b6b6c6c6d6d6d6e
6e6e6f6f6f707070717171727273737374747475757576767677777878787979
797a7a7b7b7b7c7c7c7d7d7e7e7e7f7f7f808081818182828283838484848585
86868687878888888989898a8a8b8b8b8c8c8d8d8d8e8e8f8f90909091919292
9293939494949595969697979798989999999a9a9b9b9c9c9c9d9d9e9e9f9f9f
a0a0a1a1a2a2a3a3a3a4a4a5a5a6a6a6a7a7a8a8a9a9aaaaabababacacadadae
aeafafb0b0b0b1b1b2b2b3b3b4b4b5b5b6b6b6b7b7b8b8b9b9bababbbbbcbcbd
bdbebebebfbfc0c0c1c1c2c2c3c3c4c4c5c5c6c6c7c7c8c8c9c9cacacbcbcccc
cdcdcececfcfd0d0d1d1d2d2d3d3d4d4d5d5d6d6d7d7d8d8d9d9dadadbdcdcdd
dddededfdfe0e0e1e1e2e2e3e3e4e4e5e6e6e7e7e8e8e9e9eaeaebebecededee
eeefeff0f0f1f1f2f3f3f4f4f5f5f6f6f7f8f8f9f9fafafbfcfcfdfdfefeffff
> dup length 1 sub 3 -1 roll mul dup dup floor cvi exch ceiling
cvi 3 index exch get 4 -1 roll 3 -1 roll get
dup 3 1 roll sub 3 -1 roll dup floor cvi sub mul add 255 div } bind
{ 1.0 0.0 3 -1 roll 1 index 1 index le { exch pop} { pop } ifelse
1 index 1 index ge { exch pop } { pop } ifelse <
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000001010101010101010101010101
0101010101010101010101010101010101010101010101020202020202020202
0202020202020202020202020202020202030303030303030303030303030303
0303030303030304040404040404040404040404040404040404050505050505
0505050505050505050506060606060606060606060606060607070707070707
0707070707070708080808080808080808080808090909090909090909090909
0a0a0a0a0a0a0a0a0a0a0a0b0b0b0b0b0b0b0b0b0b0b0c0c0c0c0c0c0c0c0c0c
0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0e0e0e0f0f0f0f0f0f0f0f0f10101010
1010101010111111111111111112121212121212121313131313131313141414
1414141414151515151515151616161616161616171717171717171818181818
18181919191919191a1a1a1a1a1a1a1b1b1b1b1b1b1c1c1c1c1c1c1c1d1d1d1d
1d1d1e1e1e1e1e1e1f1f1f1f1f1f202020202020212121212121222222222223
2323232323242424242425252525252526262626262727272727282828282829
292929292a2a2a2a2a2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2e2e2e2e2e2f2f2f
2f2f303030303131313131323232323333333333343434343535353535363636
36373737373838383839393939393a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e
3e3e3f3f3f3f4040404041414141424242424343434444444445454545464646
4647474748484848494949494a4a4a4b4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4f
4f50505051515151525252535353535454545555555656565657575758585859
59595a5a5a5a5b5b5b5c5c5c5d5d5d5e5e5e5f5f5f6060606061616162626263
63636464646565656666666767676868686969696a6a6a6b6b6b6c6c6d6d6d6e
6e6e6f6f6f707070717171727273737374747475757576767677777878787979
797a7a7b7b7b7c7c7c7d7d7e7e7e7f7f7f808081818182828283838484848585
86868687878888888989898a8a8b8b8b8c8c8d8d8d8e8e8f8f90909091919292
9293939494949595969697979798989999999a9a9b9b9c9c9c9d9d9e9e9f9f9f
a0a0a1a1a2a2a3a3a3a4a4a5a5a6a6a6a7a7a8a8a9a9aaaaabababacacadadae
aeafafb0b0b0b1b1b2b2b3b3b4b4b5b5b6b6b6b7b7b8b8b9b9bababbbbbcbcbd
bdbebebebfbfc0c0c1c1c2c2c3c3c4c4c5c5c6c6c7c7c8c8c9c9cacacbcbcccc
cdcdcececfcfd0d0d1d1d2d2d3d3d4d4d5d5d6d6d7d7d8d8d9d9dadadbdcdcdd
dddededfdfe0e0e1e1e2e2e3e3e4e4e5e6e6e7e7e8e8e9e9eaeaebebecededee
eeefeff0f0f1f1f2f3f3f4f4f5f5f6f6f7f8f8f9f9fafafbfcfcfdfdfefeffff
> dup length 1 sub 3 -1 roll mul dup dup floor cvi exch ceiling
cvi 3 index exch get 4 -1 roll 3 -1 roll get
dup 3 1 roll sub 3 -1 roll dup floor cvi sub mul add 255 div } bind
{ 1.0 0.0 3 -1 roll 1 index 1 index le { exch pop} { pop } ifelse
1 index 1 index ge { exch pop } { pop } ifelse <
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000001010101010101010101010101
0101010101010101010101010101010101010101010101020202020202020202
0202020202020202020202020202020202030303030303030303030303030303
0303030303030304040404040404040404040404040404040404050505050505
0505050505050505050506060606060606060606060606060607070707070707
0707070707070708080808080808080808080808090909090909090909090909
0a0a0a0a0a0a0a0a0a0a0a0b0b0b0b0b0b0b0b0b0b0b0c0c0c0c0c0c0c0c0c0c
0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0e0e0e0f0f0f0f0f0f0f0f0f10101010
1010101010111111111111111112121212121212121313131313131313141414
1414141414151515151515151616161616161616171717171717171818181818
18181919191919191a1a1a1a1a1a1a1b1b1b1b1b1b1c1c1c1c1c1c1c1d1d1d1d
1d1d1e1e1e1e1e1e1f1f1f1f1f1f202020202020212121212121222222222223
2323232323242424242425252525252526262626262727272727282828282829
292929292a2a2a2a2a2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2e2e2e2e2e2f2f2f
2f2f303030303131313131323232323333333333343434343535353535363636
36373737373838383839393939393a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e
3e3e3f3f3f3f4040404041414141424242424343434444444445454545464646
4647474748484848494949494a4a4a4b4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4f
4f50505051515151525252535353535454545555555656565657575758585859
59595a5a5a5a5b5b5b5c5c5c5d5d5d5e5e5e5f5f5f6060606061616162626263
63636464646565656666666767676868686969696a6a6a6b6b6b6c6c6d6d6d6e
6e6e6f6f6f707070717171727273737374747475757576767677777878787979
797a7a7b7b7b7c7c7c7d7d7e7e7e7f7f7f808081818182828283838484848585
86868687878888888989898a8a8b8b8b8c8c8d8d8d8e8e8f8f90909091919292
9293939494949595969697979798989999999a9a9b9b9c9c9c9d9d9e9e9f9f9f
a0a0a1a1a2a2a3a3a3a4a4a5a5a6a6a6a7a7a8a8a9a9aaaaabababacacadadae
aeafafb0b0b0b1b1b2b2b3b3b4b4b5b5b6b6b6b7b7b8b8b9b9bababbbbbcbcbd
bdbebebebfbfc0c0c1c1c2c2c3c3c4c4c5c5c6c6c7c7c8c8c9c9cacacbcbcccc
cdcdcececfcfd0d0d1d1d2d2d3d3d4d4d5d5d6d6d7d7d8d8d9d9dadadbdcdcdd
dddededfdfe0e0e1e1e2e2e3e3e4e4e5e6e6e7e7e8e8e9e9eaeaebebecededee
eeefeff0f0f1f1f2f3f3f4f4f5f5f6f6f7f8f8f9f9fafafbfcfcfdfdfefeffff
> dup length 1 sub 3 -1 roll mul dup dup floor cvi exch ceiling
cvi 3 index exch get 4 -1 roll 3 -1 roll get
dup 3 1 roll sub 3 -1 roll dup floor cvi sub mul add 255 div } bind
] def
/MatrixABC [ 0.4124 0.2126 0.0193 0.3576 0.7151 0.1192 0.1805 0.0722 0.9508 ] def
/RangeLMN [ 0.0 0.9505 0.0 1.0000 0.0 1.0891 ] def
end ] /Cs1 exch/ColorSpace dr pop
%%EndPageSetup
0.60000002 i
/Cs1 SC
0.13333334 0.13333334 0.13333334 sc
q
0 1102 m
518 1102 l
518 0 l
0 0 l
0 1102 l
h
W*
0 0 1102 1102 rc
-10 1112 m
528 1112 l
528 -10 l
-10 -10 l
h
f
Q
0.76078433 0.65098041 0.38039216 sc
q
518 1102 m
1102 1102 l
1102 0 l
518 0 l
518 1102 l
h
W*
0 0 1102 1102 rc
508 1112 m
1112 1112 l
1112 -10 l
508 -10 l
h
f
Q
0.13333334 0.13333334 0.13333334 sc
q
921.56757 760 m
982 760 l
982 340 l
921.56757 340 l
921.56757 553.5 l
698.43243 553.5 l
698.43243 340 l
638 340 l
638 760 l
698.43243 760 l
698.43243 568.08331 l
921.56757 568.08331 l
921.56757 760 l
h
W
0 0 1102 1102 rc
628 770 m
992 770 l
992 330 l
628 330 l
h
f
Q
0.76078433 0.65098041 0.38039216 sc
q
180.15546 554.08331 m
180.15546 357.5 l
233.30252 357.5 l
266.00839 357.5 290.53781 362.16666 306.89075 378.5 c
323.24368 395.41666 331.42017 420.5 331.42017 454.33334 c
331.42017 488.75 322.07562 513.83331 303.97058 530.16669 c
285.28152 546.5 253.15967 554.66669 206.43698 554.66669 c
198.84454 554.66669 187.16386 554.08331 180.15546 554.08331 c
h
180.15546 744.25 m
180.15546 568.66669 l
195.92436 568.66669 l
240.31093 568.66669 270.09665 575.66669 286.44958 589.66669 c
302.80252 603.66669 310.39496 625.83331 310.39496 657.33331 c
310.39496 678.91669 307.47479 695.83331 301.05042 707.5 c
294.62604 719.75 284.69748 728.5 272.43277 734.91669 c
259.58405 741.91669 238.55882 744.83331 207.60504 744.83331 c
199.42857 744.83331 187.16386 744.83331 180.15546 744.25 c
h
120 340 m
120 760 l
204.68488 760 l
318.57144 760 375.80673 727.33331 375.80673 661.41669 c
375.80673 634.58331 365.87814 612.41669 346.021 596.08331 c
326.74789 579.75 296.96219 568.66669 257.83194 562.83331 c
305.13864 559.33331 340.18066 547.66669 363.54202 527.83331 c
386.31934 507.41666 398 482.33334 398 452.58334 c
398 426.33334 389.82352 403.58334 374.63864 384.33334 c
358.86975 365.66666 339.0126 354 314.48318 348.16666 c
289.9538 342.33334 257.83194 340 216.94958 340 c
120 340 l
h
W
0 0 1102 1102 rc
110 770 m
408 770 l
408 330 l
110 330 l
h
f
ep
end
%%Trailer
%%EOF

@ -0,0 +1,912 @@
%!PS-Adobe-3.0 EPSF-3.0
%APL_DSC_Encoding: UTF8
%APLProducer: (Version 10.14.6 (Build 18G95) Quartz PS Context)
%%Title: (Unknown)
%%Creator: (Unknown)
%%CreationDate: (Unknown)
%%For: (Unknown)
%%DocumentData: Clean7Bit
%%LanguageLevel: 2
%%Pages: 1
%%BoundingBox: 0 0 1102 1102
%%EndComments
%%BeginProlog
%%BeginFile: cg-pdf.ps
%%Copyright: Copyright 2000-2004 Apple Computer Incorporated.
%%Copyright: All Rights Reserved.
currentpacking true setpacking
/cg_md 141 dict def
cg_md begin
/L3? languagelevel 3 ge def
/bd{bind def}bind def
/ld{load def}bd
/xs{exch store}bd
/xd{exch def}bd
/cmmtx matrix def
mark
/sc/setcolor
/scs/setcolorspace
/dr/defineresource
/fr/findresource
/T/true
/F/false
/d/setdash
/w/setlinewidth
/J/setlinecap
/j/setlinejoin
/M/setmiterlimit
/i/setflat
/rc/rectclip
/rf/rectfill
/rs/rectstroke
/f/fill
/f*/eofill
/sf/selectfont
/s/show
%/as/ashow
/xS/xshow
/yS/yshow
/xyS/xyshow
/S/stroke
/m/moveto
/l/lineto
/c/curveto
/h/closepath
/n/newpath
/q/gsave
/Q/grestore
counttomark 2 idiv
%dup (number of ld's = )print == flush % *** how many
{ld}repeat pop
/SC{ % CSname
/ColorSpace fr scs
}bd
/sopr /setoverprint where{pop/setoverprint}{/pop}ifelse ld
/soprm /setoverprintmode where{pop/setoverprintmode}{/pop}ifelse ld
/cgmtx matrix def
/sdmtx{cgmtx currentmatrix pop}bd
/CM {cgmtx setmatrix}bd % pop the ctm: our gstate ctm on host is now identity
/cm {cmmtx astore CM concat}bd % reset the matrix and then concat
/W{clip newpath}bd
/W*{eoclip newpath}bd
statusdict begin product end dup (HP) anchorsearch{
pop pop pop % pop off the search results
true
}{
pop % previous search result
(hp) anchorsearch{
pop pop true
}{
pop false
}ifelse
}ifelse
{ % HP is the product: we use this method of stroking because of a bug in their clone printers with certain T3 fonts
{
{ % charCode Wx Wy
pop pop % charCode
(0)dup 0 4 -1 roll put
F charpath
}cshow
}
}{
{F charpath}
}ifelse
/cply exch bd
/cps {cply stroke}bd
/pgsave 0 def
/bp{/pgsave save store}bd
/ep{pgsave restore showpage}def % dont' bind
/re{4 2 roll m 1 index 0 rlineto 0 exch rlineto neg 0 rlineto h}bd
/scrdict 10 dict def
/scrmtx matrix def
/patarray 0 def
/createpat{patarray 3 1 roll put}bd
/makepat{
scrmtx astore pop
gsave
initgraphics
CM
patarray exch get
scrmtx
makepattern
grestore
setpattern
}bd
/cg_BeginEPSF{
userdict save/cg_b4_Inc_state exch put
userdict/cg_endepsf/cg_EndEPSF load put
count userdict/cg_op_count 3 -1 roll put
countdictstack dup array dictstack userdict/cg_dict_array 3 -1 roll put
3 sub{end}repeat
/showpage {} def
0 setgray 0 setlinecap 1 setlinewidth 0 setlinejoin
10 setmiterlimit [] 0 setdash newpath
false setstrokeadjust false setoverprint % don't use F
}bd
/cg_EndEPSF{
countdictstack 3 sub { end } repeat
cg_dict_array 3 1 index length 3 sub getinterval
{begin}forall
count userdict/cg_op_count get sub{pop}repeat
userdict/cg_b4_Inc_state get restore
F setpacking
}bd
/cg_biproc{currentfile/RunLengthDecode filter}bd
/cg_aiproc{currentfile/ASCII85Decode filter/RunLengthDecode filter}bd
/ImageDataSource 0 def
L3?{
/cg_mibiproc{pop pop/ImageDataSource{cg_biproc}def}bd
/cg_miaiproc{pop pop/ImageDataSource{cg_aiproc}def}bd
}{
/ImageBandMask 0 def
/ImageBandData 0 def
/cg_mibiproc{
string/ImageBandMask xs
string/ImageBandData xs
/ImageDataSource{[currentfile/RunLengthDecode filter dup ImageBandMask/readstring cvx
/pop cvx dup ImageBandData/readstring cvx/pop cvx]cvx bind}bd
}bd
/cg_miaiproc{
string/ImageBandMask xs
string/ImageBandData xs
/ImageDataSource{[currentfile/ASCII85Decode filter/RunLengthDecode filter
dup ImageBandMask/readstring cvx
/pop cvx dup ImageBandData/readstring cvx/pop cvx]cvx bind}bd
}bd
}ifelse
/imsave 0 def
/BI{save/imsave xd mark}bd
/EI{imsave restore}bd
/ID{
counttomark 2 idiv
dup 2 add % leave room for imagetype and imagematrix
dict begin
{def} repeat
pop % remove mark
/ImageType 1 def
/ImageMatrix[Width 0 0 Height neg 0 Height]def
currentdict dup/ImageMask known{ImageMask}{F}ifelse exch
% currentdict on stack
L3?{
dup/MaskedImage known
{
pop
<<
/ImageType 3
/InterleaveType 2
/DataDict currentdict
/MaskDict
<< /ImageType 1
/Width Width
/Height Height
/ImageMatrix ImageMatrix
/BitsPerComponent 1
/Decode [0 1]
currentdict/Interpolate known
{/Interpolate Interpolate}if
>>
>>
}if
}if
exch
{imagemask}{image}ifelse
end % pop imagedict from dict stack
}bd
/cguidfix{statusdict begin mark version end
{cvr}stopped{cleartomark 0}{exch pop}ifelse
2012 lt{dup findfont dup length dict begin
{1 index/FID ne 2 index/UniqueID ne and
{def} {pop pop} ifelse}forall
currentdict end definefont pop
}{pop}ifelse
}bd
/t_array 0 def
/t_i 0 def
/t_c 1 string def
/x_proc{ % x y
exch t_array t_i get add exch moveto
/t_i t_i 1 add store
}bd
/y_proc{ % x y
t_array t_i get add moveto
/t_i t_i 1 add store
}bd
/xy_proc{
% x y
t_array t_i 2 copy 1 add get 3 1 roll get
4 -1 roll add 3 1 roll add moveto
/t_i t_i 2 add store
}bd
/sop 0 def % don't bind sop
/cp_proc/x_proc ld % default moveto proc is for xwidths only
/base_charpath % string array
{
/t_array xs
/t_i 0 def
{ % char
t_c 0 3 -1 roll put
currentpoint
t_c cply sop
cp_proc
}forall
/t_array 0 def
}bd
/sop/stroke ld % default sop is stroke. Done here so we don't bind in /base_charpath
% default sop is stroke
/nop{}def
/xsp/base_charpath ld
/ysp{/cp_proc/y_proc ld base_charpath/cp_proc/x_proc ld}bd
/xysp{/cp_proc/xy_proc ld base_charpath/cp_proc/x_proc ld}bd
/xmp{/sop/nop ld /cp_proc/x_proc ld base_charpath/sop/stroke ld}bd
/ymp{/sop/nop ld /cp_proc/y_proc ld base_charpath/sop/stroke ld}bd
/xymp{/sop/nop ld /cp_proc/xy_proc ld base_charpath/sop/stroke ld}bd
/refnt{ % newname encoding fontname
findfont dup length dict copy dup
/Encoding 4 -1 roll put
definefont pop
}bd
/renmfont{ % newname fontname
findfont dup length dict copy definefont pop
}bd
L3? dup dup{save exch}if
% languagelevel2 ONLY code goes here
/Range 0 def
/DataSource 0 def
/val 0 def
/nRange 0 def
/mulRange 0 def
/d0 0 def
/r0 0 def
/di 0 def
/ri 0 def
/a0 0 def
/a1 0 def
/r1 0 def
/r2 0 def
/dx 0 def
/Nsteps 0 def
/sh3tp 0 def
/ymax 0 def
/ymin 0 def
/xmax 0 def
/xmin 0 def
/setupFunEval % funDict -- % this calculates and sets up a function dict for evaulation.
{
begin
/nRange Range length 2 idiv store
/mulRange % precompute the range data needed to map a sample value from the table to a range value
% this data looks like [ range0mul range0min range1mul range1min ... rangeN-1mul rangeN-1min ]
[
0 1 nRange 1 sub
{ % index
2 mul/nDim2 xd % 2*dimension# we are dealing with
Range nDim2 get % ymin
Range nDim2 1 add get % ymin ymax
1 index sub % ymin (ymax-ymin)
% xmin = 0, xmax = 255 (2^bitspersample - 1)
255 div % ymin (ymax-ymin)/(xmax - xmin)
exch % (ymax-ymin)/(xmax - xmin) ymin
}for
]store
end
}bd
/FunEval % val1 fundict -> comp1 comp2 ... compN
{
begin
% the value passed in is the base index into the table
nRange mul /val xd % compute the actual index to the table
% since there are nRange entries per base index
0 1 nRange 1 sub
{
dup 2 mul/nDim2 xd % dim
val % base value to use to do our lookup
add DataSource exch get % lookedupval
mulRange nDim2 get mul % lookedupval*(ymax-ymin)/(xmax-xmin)
mulRange nDim2 1 add get % lookedupval*(ymax-ymin)/(xmax-xmin) ymin
add % interpolated result
}for % comp1 comp2 ... compN
end
}bd
/max % a b -> max(a, b)
{
2 copy lt
{exch pop}{pop}ifelse
}bd
/sh2
{ % emulation of shading type 2. Assumes shading dictionary is top dictionary on the dict stack
/Coords load aload pop % x0 y0 x1 y1
3 index 3 index translate % origin is now at beginning point of shading
% x0 y0 x1 y1
3 -1 roll sub % x0 x1 y1-y0
3 1 roll exch % y1-y0 x1 x0
sub % y1-y0 x1-x0
2 copy
dup mul exch dup mul add sqrt % length of segment between two points
dup
scale
atan % atan (dy/dx)
%dup (rotation angle = )print ==
rotate % now line between 0,0 and 1,0 is the line perpendicular to which the axial lines are drawn
/Function load setupFunEval % may need to setup function dictionary by calling setupFunEval
% this is now specific to axial shadings. Compute the maximum bounds to fill
clippath {pathbbox}stopped {0 0 0 0}if newpath % x0 y0 x1 y1
/ymax xs
/xmax xs
/ymin xs
/xmin xs
currentdict/Extend known
{
/Extend load 0 get
{
0/Function load FunEval sc % evaluate the function to get a color and set it
xmin ymin xmin abs ymax ymin sub rectfill
}if
}if
% paint the rects. The sampling frequency is that of our table
/Nsteps/Function load/Size get 0 get 1 sub store
/dx 1 Nsteps div store
gsave
/di ymax ymin sub store
/Function load
% loop Nsteps + 1 times, incrementing the index by 1 each time
0 1 Nsteps
{
1 index FunEval sc
0 ymin dx di rectfill
dx 0 translate
}for
pop % pop our function
grestore % origin is back to start point
currentdict/Extend known
{
/Extend load 1 get
{
Nsteps/Function load FunEval sc % last element
1 ymin xmax 1 sub abs ymax ymin sub rectfill
}if
}if
}bd
/shp % this paints our shape for shading type 3
{ % x1 r1 x0 r0 -
4 copy
% fill interior arc
dup 0 gt{
0 exch a1 a0 arc
}{
pop 0 moveto
}ifelse
dup 0 gt{
0 exch a0 a1 arcn
}{
pop 0 lineto
}ifelse
fill
% fill exterior arc
dup 0 gt{
0 exch a0 a1 arc
}{
pop 0 moveto
}ifelse
dup 0 gt{
0 exch a1 a0 arcn
}{
pop 0 lineto
}ifelse
fill
}bd
/calcmaxs
{ % calculate maximum distance vector from origin to corner points
% of bbox
xmin dup mul ymin dup mul add sqrt % (xmin2 + ymin2)
xmax dup mul ymin dup mul add sqrt % (xmax2 + ymin2)
xmin dup mul ymax dup mul add sqrt % (xmin2 + ymax2)
xmax dup mul ymax dup mul add sqrt % (xmax2 + ymax2)
max max max % maximum value
}bd
/sh3
{ % emulation of shading type 3. Assumes shading dictionary is top dictionary on the dict stack
/Coords load aload pop % x0 y0 r1 x1 y1 r2
5 index 5 index translate % origin is now at first circle origin
3 -1 roll 6 -1 roll sub % y0 r1 y1 r2 dx
3 -1 roll 5 -1 roll sub % r1 r2 dx dy
2 copy dup mul exch dup mul add sqrt
/dx xs % r1 r2 dx dy
2 copy 0 ne exch 0 ne or
{
% r1 r2 dx dy
exch atan rotate % we are now rotated so dy is zero and positive values of dx move us as expected
}{
pop pop
}ifelse
% r1 r2
/r2 xs
/r1 xs
/Function load
dup/Size get 0 get 1 sub % this is the size of our table minus 1
/Nsteps xs % at some point we should optimize this better so NSteps is based on needed steps for the device
setupFunEval % may need to setup function dictionary by calling setupFunEval
% determine the case:
% case 0: circle1 inside circle2
% case 1: circle 2 inside circle 1
% case 2: r1 = r2
% case 3: r1 != r2
dx r2 add r1 lt{
% circle 2 inside of circle 1
0
}{
dx r1 add r2 le
{ % circle 1 inside of circle 2
1
}{ % circles don't contain each other
r1 r2 eq
{ % equal
2
}{ % r1 != r2
3
}ifelse
}ifelse
}ifelse
/sh3tp xs % sh3tp has the number of our different cases
clippath {pathbbox}stopped {0 0 0 0}if
newpath % x0 y0 x1 y1
/ymax xs
/xmax xs
/ymin xs
/xmin xs
% Arc angle atan( sqrt((dx*dx + dy*dy) - dr*dr), dr)
dx dup mul r2 r1 sub dup mul sub dup 0 gt
{
sqrt r2 r1 sub atan
/a0 exch 180 exch sub store
/a1 a0 neg store
}{
pop
/a0 0 store
/a1 360 store
}ifelse
currentdict/Extend known
{
/Extend load 0 get r1 0 gt and % no need to extend if the radius of the first end is 0
{
0/Function load FunEval sc % evaluate the function to get a color and set it
% case 0: circle1 inside circle2
% case 1: circle 2 inside circle 1
% case 2: circles don't contain each other and r1 == r2
% case 3: circles don't contain each other and r1 != r2
{
{ % case 0
dx 0 r1 360 0 arcn
xmin ymin moveto
xmax ymin lineto
xmax ymax lineto
xmin ymax lineto
xmin ymin lineto
eofill % for the bigger radius we fill everything except our circle
}
{ % case 1
r1 0 gt{0 0 r1 0 360 arc fill}if
}
{ % case 2
% r1 == r2, extend 0
% r3 = r, x3 = -(abs(minx) + r), x1 = 0
% x(i+1) r(i+1) x(i) r(i) shp
0 r1 xmin abs r1 add neg r1 shp
}
{ % case 3
% no containment, r1 != r2
r2 r1 gt{ % the endpoint we are drawing is that with a circle of zero radius
% x(i+1) r(i+1) x(i) r(i) shp
0 r1
r1 neg r2 r1 sub div dx mul % this is point of beginning circle
0 % point of ending circle
shp % takes x(i+1) r(i+1) x(i) r(i)
}{ % the first circle is the bigger of the two
% we find a circle on our line which is outside the bbox in the
% negative direction
% x(i+1) r(i+1) x(i) r(i) shp
0 r1 calcmaxs % 0 r1 maxs
dup
% calculating xs: (-(maxs+r2)*x2)/(x2-(r1-r2))
r2 add dx mul dx r1 r2 sub sub div
neg % maxs xs'
exch 1 index % xs' maxs xs'
abs exch sub
shp
}ifelse
}
}sh3tp get exec % execute the extend at beginning proc for our shading type
}if
}if
% now do the shading
/d0 0 store
/r0 r1 store
/di dx Nsteps div store
/ri r2 r1 sub Nsteps div store
/Function load
0 1 Nsteps
{ % function t(i)
1 index FunEval sc
d0 di add r0 ri add d0 r0 shp
{
% fill interior arc
d0 0 r0 a1 a0 arc
d0 di add 0 r0 ri add a0 a1 arcn
fill
% fill exterior arc
d0 0 r0 a0 a1 arc
d0 di add 0 r0 ri add a1 a0 arcn
fill
}pop
% advance to next
/d0 d0 di add store
/r0 r0 ri add store
}for
pop % pop our function dict
% handle Extend
currentdict/Extend known
{
/Extend load 1 get r2 0 gt and % no need to extend if the radius of the last end is 0
{
Nsteps/Function load FunEval sc % last element
% case 0: circle1 inside circle2
% case 1: circle 2 inside circle 1
% case 2: circles don't contain each other and r1 == r2
% case 3: circles don't contain each other and r1 != r2
{
{
dx 0 r2 0 360 arc fill
}
{
dx 0 r2 360 0 arcn
xmin ymin moveto
xmax ymin lineto
xmax ymax lineto
xmin ymax lineto
xmin ymin lineto
eofill % for the bigger radius we fill everything except our circle
}
{ % r1 == r2, extend 1
% r3 = r, x3 = (abs(xmax) + r), x1 = dx
% x(i+1) r(i+1) x(i) r(i) shp
xmax abs r1 add r1 dx r1 shp
}
{ % no containment, r1 != r2
r2 r1 gt{
% we find a circle on our line which is outside the bbox in the
% positive direction
% x(i+1) r(i+1) x(i) r(i) shp
calcmaxs dup % maxs maxs
% calculating xs: ((maxs+r1)*x2)/(x2-(r2-r1))
r1 add dx mul dx r2 r1 sub sub div % maxs xs
exch 1 index % xs maxs xs
exch sub
dx r2
shp
}{ % the endpoint we are drawing is that with a circle of zero radius
% x(i+1) r(i+1) x(i) r(i) shp
r1 neg r2 r1 sub div dx mul % this is point of ending circle
0 % radius of ending circle
dx % point of starting circle
r2 % radius of starting circle
shp
}ifelse
}
}
sh3tp get exec % execute the extend at end proc for our shading type
}if
}if
}bd
/sh % emulation of shfill operator for type 2 and type 3 shadings based on type 0 functions
{ % shadingDict --
begin
/ShadingType load dup dup 2 eq exch 3 eq or
{ % shadingtype
gsave
newpath
/ColorSpace load scs
currentdict/BBox known
{
/BBox load aload pop % llx lly urx ury
2 index sub % llx lly urx ury-lly
3 index % llx lly urx ury-lly llx
3 -1 roll exch sub
exch rectclip
}if
2 eq
{sh2}{sh3}ifelse
grestore
}{
% shadingtype
pop
(DEBUG: shading type unimplemented\n)print flush
}ifelse
end
}bd
% end of language level 2 ONLY code
{restore}if not dup{save exch}if
% languagelevel3 ONLY code goes here
L3?{ % we do these loads conditionally or else they will fail on a level 2 printer
/sh/shfill ld
/csq/clipsave ld
/csQ/cliprestore ld
}if
{restore}if
%currentdict dup maxlength exch length sub (number of extra slots in md = )print == flush % *** how many entries are free
end
setpacking
% count 0 ne { pstack(***extras on stack during prolog execution***\n)print flush}if % *** BARK if anything is left on stack
%%EndFile
%%EndProlog
%%BeginSetup
%%EndSetup
%%Page: 1 1
%%PageBoundingBox: 0 0 1102 1102
%%BeginPageSetup
cg_md begin
bp
sdmtx
[ /CIEBasedABC 4 dict dup begin
/WhitePoint [ 0.9505 1.0000 1.0891 ] def
/DecodeABC [
{ 1.0 0.0 3 -1 roll 1 index 1 index le { exch pop} { pop } ifelse
1 index 1 index ge { exch pop } { pop } ifelse <
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000001010101010101010101010101
0101010101010101010101010101010101010101010101020202020202020202
0202020202020202020202020202020202030303030303030303030303030303
0303030303030304040404040404040404040404040404040404050505050505
0505050505050505050506060606060606060606060606060607070707070707
0707070707070708080808080808080808080808090909090909090909090909
0a0a0a0a0a0a0a0a0a0a0a0b0b0b0b0b0b0b0b0b0b0b0c0c0c0c0c0c0c0c0c0c
0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0e0e0e0f0f0f0f0f0f0f0f0f10101010
1010101010111111111111111112121212121212121313131313131313141414
1414141414151515151515151616161616161616171717171717171818181818
18181919191919191a1a1a1a1a1a1a1b1b1b1b1b1b1c1c1c1c1c1c1c1d1d1d1d
1d1d1e1e1e1e1e1e1f1f1f1f1f1f202020202020212121212121222222222223
2323232323242424242425252525252526262626262727272727282828282829
292929292a2a2a2a2a2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2e2e2e2e2e2f2f2f
2f2f303030303131313131323232323333333333343434343535353535363636
36373737373838383839393939393a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e
3e3e3f3f3f3f4040404041414141424242424343434444444445454545464646
4647474748484848494949494a4a4a4b4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4f
4f50505051515151525252535353535454545555555656565657575758585859
59595a5a5a5a5b5b5b5c5c5c5d5d5d5e5e5e5f5f5f6060606061616162626263
63636464646565656666666767676868686969696a6a6a6b6b6b6c6c6d6d6d6e
6e6e6f6f6f707070717171727273737374747475757576767677777878787979
797a7a7b7b7b7c7c7c7d7d7e7e7e7f7f7f808081818182828283838484848585
86868687878888888989898a8a8b8b8b8c8c8d8d8d8e8e8f8f90909091919292
9293939494949595969697979798989999999a9a9b9b9c9c9c9d9d9e9e9f9f9f
a0a0a1a1a2a2a3a3a3a4a4a5a5a6a6a6a7a7a8a8a9a9aaaaabababacacadadae
aeafafb0b0b0b1b1b2b2b3b3b4b4b5b5b6b6b6b7b7b8b8b9b9bababbbbbcbcbd
bdbebebebfbfc0c0c1c1c2c2c3c3c4c4c5c5c6c6c7c7c8c8c9c9cacacbcbcccc
cdcdcececfcfd0d0d1d1d2d2d3d3d4d4d5d5d6d6d7d7d8d8d9d9dadadbdcdcdd
dddededfdfe0e0e1e1e2e2e3e3e4e4e5e6e6e7e7e8e8e9e9eaeaebebecededee
eeefeff0f0f1f1f2f3f3f4f4f5f5f6f6f7f8f8f9f9fafafbfcfcfdfdfefeffff
> dup length 1 sub 3 -1 roll mul dup dup floor cvi exch ceiling
cvi 3 index exch get 4 -1 roll 3 -1 roll get
dup 3 1 roll sub 3 -1 roll dup floor cvi sub mul add 255 div } bind
{ 1.0 0.0 3 -1 roll 1 index 1 index le { exch pop} { pop } ifelse
1 index 1 index ge { exch pop } { pop } ifelse <
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000001010101010101010101010101
0101010101010101010101010101010101010101010101020202020202020202
0202020202020202020202020202020202030303030303030303030303030303
0303030303030304040404040404040404040404040404040404050505050505
0505050505050505050506060606060606060606060606060607070707070707
0707070707070708080808080808080808080808090909090909090909090909
0a0a0a0a0a0a0a0a0a0a0a0b0b0b0b0b0b0b0b0b0b0b0c0c0c0c0c0c0c0c0c0c
0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0e0e0e0f0f0f0f0f0f0f0f0f10101010
1010101010111111111111111112121212121212121313131313131313141414
1414141414151515151515151616161616161616171717171717171818181818
18181919191919191a1a1a1a1a1a1a1b1b1b1b1b1b1c1c1c1c1c1c1c1d1d1d1d
1d1d1e1e1e1e1e1e1f1f1f1f1f1f202020202020212121212121222222222223
2323232323242424242425252525252526262626262727272727282828282829
292929292a2a2a2a2a2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2e2e2e2e2e2f2f2f
2f2f303030303131313131323232323333333333343434343535353535363636
36373737373838383839393939393a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e
3e3e3f3f3f3f4040404041414141424242424343434444444445454545464646
4647474748484848494949494a4a4a4b4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4f
4f50505051515151525252535353535454545555555656565657575758585859
59595a5a5a5a5b5b5b5c5c5c5d5d5d5e5e5e5f5f5f6060606061616162626263
63636464646565656666666767676868686969696a6a6a6b6b6b6c6c6d6d6d6e
6e6e6f6f6f707070717171727273737374747475757576767677777878787979
797a7a7b7b7b7c7c7c7d7d7e7e7e7f7f7f808081818182828283838484848585
86868687878888888989898a8a8b8b8b8c8c8d8d8d8e8e8f8f90909091919292
9293939494949595969697979798989999999a9a9b9b9c9c9c9d9d9e9e9f9f9f
a0a0a1a1a2a2a3a3a3a4a4a5a5a6a6a6a7a7a8a8a9a9aaaaabababacacadadae
aeafafb0b0b0b1b1b2b2b3b3b4b4b5b5b6b6b6b7b7b8b8b9b9bababbbbbcbcbd
bdbebebebfbfc0c0c1c1c2c2c3c3c4c4c5c5c6c6c7c7c8c8c9c9cacacbcbcccc
cdcdcececfcfd0d0d1d1d2d2d3d3d4d4d5d5d6d6d7d7d8d8d9d9dadadbdcdcdd
dddededfdfe0e0e1e1e2e2e3e3e4e4e5e6e6e7e7e8e8e9e9eaeaebebecededee
eeefeff0f0f1f1f2f3f3f4f4f5f5f6f6f7f8f8f9f9fafafbfcfcfdfdfefeffff
> dup length 1 sub 3 -1 roll mul dup dup floor cvi exch ceiling
cvi 3 index exch get 4 -1 roll 3 -1 roll get
dup 3 1 roll sub 3 -1 roll dup floor cvi sub mul add 255 div } bind
{ 1.0 0.0 3 -1 roll 1 index 1 index le { exch pop} { pop } ifelse
1 index 1 index ge { exch pop } { pop } ifelse <
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000001010101010101010101010101
0101010101010101010101010101010101010101010101020202020202020202
0202020202020202020202020202020202030303030303030303030303030303
0303030303030304040404040404040404040404040404040404050505050505
0505050505050505050506060606060606060606060606060607070707070707
0707070707070708080808080808080808080808090909090909090909090909
0a0a0a0a0a0a0a0a0a0a0a0b0b0b0b0b0b0b0b0b0b0b0c0c0c0c0c0c0c0c0c0c
0d0d0d0d0d0d0d0d0d0d0e0e0e0e0e0e0e0e0e0f0f0f0f0f0f0f0f0f10101010
1010101010111111111111111112121212121212121313131313131313141414
1414141414151515151515151616161616161616171717171717171818181818
18181919191919191a1a1a1a1a1a1a1b1b1b1b1b1b1c1c1c1c1c1c1c1d1d1d1d
1d1d1e1e1e1e1e1e1f1f1f1f1f1f202020202020212121212121222222222223
2323232323242424242425252525252526262626262727272727282828282829
292929292a2a2a2a2a2b2b2b2b2b2c2c2c2c2c2d2d2d2d2d2e2e2e2e2e2f2f2f
2f2f303030303131313131323232323333333333343434343535353535363636
36373737373838383839393939393a3a3a3a3b3b3b3b3c3c3c3c3d3d3d3d3e3e
3e3e3f3f3f3f4040404041414141424242424343434444444445454545464646
4647474748484848494949494a4a4a4b4b4b4b4c4c4c4d4d4d4d4e4e4e4f4f4f
4f50505051515151525252535353535454545555555656565657575758585859
59595a5a5a5a5b5b5b5c5c5c5d5d5d5e5e5e5f5f5f6060606061616162626263
63636464646565656666666767676868686969696a6a6a6b6b6b6c6c6d6d6d6e
6e6e6f6f6f707070717171727273737374747475757576767677777878787979
797a7a7b7b7b7c7c7c7d7d7e7e7e7f7f7f808081818182828283838484848585
86868687878888888989898a8a8b8b8b8c8c8d8d8d8e8e8f8f90909091919292
9293939494949595969697979798989999999a9a9b9b9c9c9c9d9d9e9e9f9f9f
a0a0a1a1a2a2a3a3a3a4a4a5a5a6a6a6a7a7a8a8a9a9aaaaabababacacadadae
aeafafb0b0b0b1b1b2b2b3b3b4b4b5b5b6b6b6b7b7b8b8b9b9bababbbbbcbcbd
bdbebebebfbfc0c0c1c1c2c2c3c3c4c4c5c5c6c6c7c7c8c8c9c9cacacbcbcccc
cdcdcececfcfd0d0d1d1d2d2d3d3d4d4d5d5d6d6d7d7d8d8d9d9dadadbdcdcdd
dddededfdfe0e0e1e1e2e2e3e3e4e4e5e6e6e7e7e8e8e9e9eaeaebebecededee
eeefeff0f0f1f1f2f3f3f4f4f5f5f6f6f7f8f8f9f9fafafbfcfcfdfdfefeffff
> dup length 1 sub 3 -1 roll mul dup dup floor cvi exch ceiling
cvi 3 index exch get 4 -1 roll 3 -1 roll get
dup 3 1 roll sub 3 -1 roll dup floor cvi sub mul add 255 div } bind
] def
/MatrixABC [ 0.4124 0.2126 0.0193 0.3576 0.7151 0.1192 0.1805 0.0722 0.9508 ] def
/RangeLMN [ 0.0 0.9505 0.0 1.0000 0.0 1.0891 ] def
end ] /Cs1 exch/ColorSpace dr pop
%%EndPageSetup
0.60000002 i
/Cs1 SC
0.13333334 0.13333334 0.13333334 sc
q
0 1102 m
518 1102 l
518 0 l
0 0 l
0 1102 l
h
W*
0 0 1102 1102 rc
-10 1112 m
528 1112 l
528 -10 l
-10 -10 l
h
f
Q
1 1 1 sc
q
518 1102 m
1102 1102 l
1102 0 l
518 0 l
518 1102 l
h
W*
0 0 1102 1102 rc
508 1112 m
1112 1112 l
1112 -10 l
508 -10 l
h
f
Q
0.13333334 0.13333334 0.13333334 sc
q
921.56757 760 m
982 760 l
982 340 l
921.56757 340 l
921.56757 553.5 l
698.43243 553.5 l
698.43243 340 l
638 340 l
638 760 l
698.43243 760 l
698.43243 568.08331 l
921.56757 568.08331 l
921.56757 760 l
h
W
0 0 1102 1102 rc
628 770 m
992 770 l
992 330 l
628 330 l
h
f
Q
1 1 1 sc
q
180.15546 554.08331 m
180.15546 357.5 l
233.30252 357.5 l
266.00839 357.5 290.53781 362.16666 306.89075 378.5 c
323.24368 395.41666 331.42017 420.5 331.42017 454.33334 c
331.42017 488.75 322.07562 513.83331 303.97058 530.16669 c
285.28152 546.5 253.15967 554.66669 206.43698 554.66669 c
198.84454 554.66669 187.16386 554.08331 180.15546 554.08331 c
h
180.15546 744.25 m
180.15546 568.66669 l
195.92436 568.66669 l
240.31093 568.66669 270.09665 575.66669 286.44958 589.66669 c
302.80252 603.66669 310.39496 625.83331 310.39496 657.33331 c
310.39496 678.91669 307.47479 695.83331 301.05042 707.5 c
294.62604 719.75 284.69748 728.5 272.43277 734.91669 c
259.58405 741.91669 238.55882 744.83331 207.60504 744.83331 c
199.42857 744.83331 187.16386 744.83331 180.15546 744.25 c
h
120 340 m
120 760 l
204.68488 760 l
318.57144 760 375.80673 727.33331 375.80673 661.41669 c
375.80673 634.58331 365.87814 612.41669 346.021 596.08331 c
326.74789 579.75 296.96219 568.66669 257.83194 562.83331 c
305.13864 559.33331 340.18066 547.66669 363.54202 527.83331 c
386.31934 507.41666 398 482.33334 398 452.58334 c
398 426.33334 389.82352 403.58334 374.63864 384.33334 c
358.86975 365.66666 339.0126 354 314.48318 348.16666 c
289.9538 342.33334 257.83194 340 216.94958 340 c
120 340 l
h
W
0 0 1102 1102 rc
110 770 m
408 770 l
408 330 l
110 330 l
h
f
ep
end
%%Trailer
%%EOF

Binary file not shown.

After

Width:  |  Height:  |  Size: 904 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 666 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 665 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 647 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 578 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 674 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 91 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 250 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 113 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 13 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 13 KiB

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="551px" height="258px" viewBox="0 0 551 258" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 57.1 (83088) - https://sketch.com -->
<title>Initials (Gold and Black)</title>
<desc>Created with Sketch.</desc>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Concept-#6-(Final-Kearning)" transform="translate(-120.000000, -995.000000)">
<g id="Initials-(Gold-and-Black)" transform="translate(120.000000, 995.000000)">
<rect id="Rectangle" fill="#222222" x="0" y="0" width="259" height="258"></rect>
<rect id="Rectangle" fill="#C2A661" x="259" y="0" width="292" height="258"></rect>
<polygon id="Housen" fill="#222222" fill-rule="nonzero" points="460.783784 24 491 24 491 234 460.783784 234 460.783784 127.25 349.216216 127.25 349.216216 234 319 234 319 24 349.216216 24 349.216216 119.958333 460.783784 119.958333"></polygon>
<path d="M90.0777311,126.958333 L90.0777311,225.25 L116.651261,225.25 C133.004202,225.25 145.268908,222.916667 153.445378,214.75 C161.621849,206.291667 165.710084,193.75 165.710084,176.833333 C165.710084,159.625 161.037815,147.083333 151.985294,138.916667 C142.640756,130.75 126.579832,126.666667 103.218487,126.666667 C99.4222689,126.666667 93.5819328,126.958333 90.0777311,126.958333 Z M90.0777311,31.875 L90.0777311,119.666667 L97.9621849,119.666667 C120.155462,119.666667 135.048319,116.166667 143.22479,109.166667 C151.401261,102.166667 155.197479,91.0833333 155.197479,75.3333333 C155.197479,64.5416667 153.737395,56.0833333 150.52521,50.25 C147.313025,44.125 142.348739,39.75 136.216387,36.5416667 C129.792017,33.0416667 119.279412,31.5833333 103.802521,31.5833333 C99.7142857,31.5833333 93.5819328,31.5833333 90.0777311,31.875 Z M60,234 L60,24 L102.342437,24 C159.285714,24 187.903361,40.3333333 187.903361,73.2916667 C187.903361,86.7083333 182.939076,97.7916667 173.010504,105.958333 C163.37395,114.125 148.481092,119.666667 128.915966,122.583333 C152.569328,124.333333 170.090336,130.166667 181.771008,140.083333 C193.159664,150.291667 199,162.833333 199,177.708333 C199,190.833333 194.911765,202.208333 187.319328,211.833333 C179.434874,221.166667 169.506303,227 157.241597,229.916667 C144.976891,232.833333 128.915966,234 108.47479,234 L60,234 Z" id="Barrett" fill="#C2A661" fill-rule="nonzero"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="551px" height="258px" viewBox="0 0 551 258" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 57.1 (83088) - https://sketch.com -->
<title>Initials (White and Black)</title>
<desc>Created with Sketch.</desc>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Concept-#6-(Final-Kearning)" transform="translate(-120.000000, -120.000000)">
<g id="Initials-(White-and-Black)" transform="translate(120.000000, 120.000000)">
<rect id="Rectangle" fill="#222222" x="0" y="0" width="259" height="258"></rect>
<rect id="Rectangle" fill="#FFFFFF" x="259" y="0" width="292" height="258"></rect>
<polygon id="Housen" fill="#222222" fill-rule="nonzero" points="460.783784 24 491 24 491 234 460.783784 234 460.783784 127.25 349.216216 127.25 349.216216 234 319 234 319 24 349.216216 24 349.216216 119.958333 460.783784 119.958333"></polygon>
<path d="M90.0777311,126.958333 L90.0777311,225.25 L116.651261,225.25 C133.004202,225.25 145.268908,222.916667 153.445378,214.75 C161.621849,206.291667 165.710084,193.75 165.710084,176.833333 C165.710084,159.625 161.037815,147.083333 151.985294,138.916667 C142.640756,130.75 126.579832,126.666667 103.218487,126.666667 C99.4222689,126.666667 93.5819328,126.958333 90.0777311,126.958333 Z M90.0777311,31.875 L90.0777311,119.666667 L97.9621849,119.666667 C120.155462,119.666667 135.048319,116.166667 143.22479,109.166667 C151.401261,102.166667 155.197479,91.0833333 155.197479,75.3333333 C155.197479,64.5416667 153.737395,56.0833333 150.52521,50.25 C147.313025,44.125 142.348739,39.75 136.216387,36.5416667 C129.792017,33.0416667 119.279412,31.5833333 103.802521,31.5833333 C99.7142857,31.5833333 93.5819328,31.5833333 90.0777311,31.875 Z M60,234 L60,24 L102.342437,24 C159.285714,24 187.903361,40.3333333 187.903361,73.2916667 C187.903361,86.7083333 182.939076,97.7916667 173.010504,105.958333 C163.37395,114.125 148.481092,119.666667 128.915966,122.583333 C152.569328,124.333333 170.090336,130.166667 181.771008,140.083333 C193.159664,150.291667 199,162.833333 199,177.708333 C199,190.833333 194.911765,202.208333 187.319328,211.833333 C179.434874,221.166667 169.506303,227 157.241597,229.916667 C144.976891,232.833333 128.915966,234 108.47479,234 L60,234 Z" id="Barrett" fill="#FFFFFF" fill-rule="nonzero"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="551px" height="551px" viewBox="0 0 551 551" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 57.1 (83088) - https://sketch.com -->
<title>Square (Gold and Black)</title>
<desc>Created with Sketch.</desc>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Concept-#6-(Final-Kearning)" transform="translate(-2154.000000, -1019.000000)">
<g id="Square-(Gold-and-Black)" transform="translate(2154.000000, 1019.000000)">
<rect id="Rectangle" fill="#222222" x="0" y="0" width="259" height="551"></rect>
<rect id="Rectangle" fill="#C2A661" x="259" y="0" width="292" height="551"></rect>
<polygon id="Housen" fill="#222222" fill-rule="nonzero" points="460.783784 171 491 171 491 381 460.783784 381 460.783784 274.25 349.216216 274.25 349.216216 381 319 381 319 171 349.216216 171 349.216216 266.958333 460.783784 266.958333"></polygon>
<path d="M90.0777311,273.958333 L90.0777311,372.25 L116.651261,372.25 C133.004202,372.25 145.268908,369.916667 153.445378,361.75 C161.621849,353.291667 165.710084,340.75 165.710084,323.833333 C165.710084,306.625 161.037815,294.083333 151.985294,285.916667 C142.640756,277.75 126.579832,273.666667 103.218487,273.666667 C99.4222689,273.666667 93.5819328,273.958333 90.0777311,273.958333 Z M90.0777311,178.875 L90.0777311,266.666667 L97.9621849,266.666667 C120.155462,266.666667 135.048319,263.166667 143.22479,256.166667 C151.401261,249.166667 155.197479,238.083333 155.197479,222.333333 C155.197479,211.541667 153.737395,203.083333 150.52521,197.25 C147.313025,191.125 142.348739,186.75 136.216387,183.541667 C129.792017,180.041667 119.279412,178.583333 103.802521,178.583333 C99.7142857,178.583333 93.5819328,178.583333 90.0777311,178.875 Z M60,381 L60,171 L102.342437,171 C159.285714,171 187.903361,187.333333 187.903361,220.291667 C187.903361,233.708333 182.939076,244.791667 173.010504,252.958333 C163.37395,261.125 148.481092,266.666667 128.915966,269.583333 C152.569328,271.333333 170.090336,277.166667 181.771008,287.083333 C193.159664,297.291667 199,309.833333 199,324.708333 C199,337.833333 194.911765,349.208333 187.319328,358.833333 C179.434874,368.166667 169.506303,374 157.241597,376.916667 C144.976891,379.833333 128.915966,381 108.47479,381 L60,381 Z" id="Barrett" fill="#C2A661" fill-rule="nonzero"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="551px" height="551px" viewBox="0 0 551 551" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 57.1 (83088) - https://sketch.com -->
<title>Square (White and Black)</title>
<desc>Created with Sketch.</desc>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Concept-#6-(Final-Kearning)" transform="translate(-2154.000000, -144.000000)">
<g id="Square-(White-and-Black)" transform="translate(2154.000000, 144.000000)">
<rect id="Rectangle" fill="#222222" x="0" y="0" width="259" height="551"></rect>
<rect id="Rectangle" fill="#FFFFFF" x="259" y="0" width="292" height="551"></rect>
<polygon id="Housen" fill="#222222" fill-rule="nonzero" points="460.783784 171 491 171 491 381 460.783784 381 460.783784 274.25 349.216216 274.25 349.216216 381 319 381 319 171 349.216216 171 349.216216 266.958333 460.783784 266.958333"></polygon>
<path d="M90.0777311,273.958333 L90.0777311,372.25 L116.651261,372.25 C133.004202,372.25 145.268908,369.916667 153.445378,361.75 C161.621849,353.291667 165.710084,340.75 165.710084,323.833333 C165.710084,306.625 161.037815,294.083333 151.985294,285.916667 C142.640756,277.75 126.579832,273.666667 103.218487,273.666667 C99.4222689,273.666667 93.5819328,273.958333 90.0777311,273.958333 Z M90.0777311,178.875 L90.0777311,266.666667 L97.9621849,266.666667 C120.155462,266.666667 135.048319,263.166667 143.22479,256.166667 C151.401261,249.166667 155.197479,238.083333 155.197479,222.333333 C155.197479,211.541667 153.737395,203.083333 150.52521,197.25 C147.313025,191.125 142.348739,186.75 136.216387,183.541667 C129.792017,180.041667 119.279412,178.583333 103.802521,178.583333 C99.7142857,178.583333 93.5819328,178.583333 90.0777311,178.875 Z M60,381 L60,171 L102.342437,171 C159.285714,171 187.903361,187.333333 187.903361,220.291667 C187.903361,233.708333 182.939076,244.791667 173.010504,252.958333 C163.37395,261.125 148.481092,266.666667 128.915966,269.583333 C152.569328,271.333333 170.090336,277.166667 181.771008,287.083333 C193.159664,297.291667 199,309.833333 199,324.708333 C199,337.833333 194.911765,349.208333 187.319328,358.833333 C179.434874,368.166667 169.506303,374 157.241597,376.916667 C144.976891,379.833333 128.915966,381 108.47479,381 L60,381 Z" id="Barrett" fill="#FFFFFF" fill-rule="nonzero"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

@ -0,0 +1,43 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: admin-client
spec:
selector:
matchLabels:
app: admin-client
template:
metadata:
labels:
app: admin-client
spec:
serviceAccountName: barretthousen-service
containers:
- name: admin-client
image: barretthousen/client-admin-client:latest
imagePullPolicy: Always
stdin: true
tty: true
env:
- name: BH_CLIENT_INTERNAL_API_HOST
value: "http://proxy-admin"
- name: ORIGIN
value: https://admin.barretthousen.com
ports:
- containerPort: 80
name: http
resources:
limits:
memory: "512Mi"
cpu: "500m"
---
apiVersion: v1
kind: Service
metadata:
name: admin-client
spec:
selector:
app: admin-client
ports:
- port: 80
targetPort: 80

@ -0,0 +1,25 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: admin
labels:
name: admin
spec:
rules:
- host: admin.barretthousen.com
http:
paths:
- pathType: Prefix
path: "/api"
backend:
service:
name: proxy-admin
port:
number: 80
- pathType: ImplementationSpecific
path: "/"
backend:
service:
name: admin-client
port:
number: 80

@ -0,0 +1,71 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: catalog
spec:
replicas: 1
selector:
matchLabels:
service: catalog
template:
metadata:
labels:
service: catalog
spec:
serviceAccountName: barretthousen-service
containers:
- name: catalog
image: barretthousen/service-catalog:latest
imagePullPolicy: Always
ports:
- containerPort: 5001
name: grpc
command:
- /opt/catalog
args:
- -migrate
resources:
limits:
cpu: "250m"
memory: "128Mi"
volumeMounts:
- mountPath: /config/
name: catalog-config
volumes:
- name: catalog-config
secret:
secretName: catalog-config
---
apiVersion: v1
kind: Service
metadata:
name: catalog
spec:
selector:
service: catalog
ports:
- port: 5001
targetPort: 5001
---
apiVersion: v1
kind: Secret
metadata:
name: catalog-config
stringData:
config.yaml: |
log_level: 2
port: 5001
db_service:
scheme: postgres
port: 5432
host: bh-db
name: bh
user: catalog-service
password: catalog-service
db_migrate:
scheme: postgres
port: 5432
host: bh-db
name: bh
user: postgres
password: bh-admin

@ -0,0 +1,25 @@
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web
labels:
name: web
spec:
rules:
- host: barretthousen.com
http:
paths:
- pathType: Prefix
path: "/api"
backend:
service:
name: proxy-web
port:
number: 80
- pathType: ImplementationSpecific
path: "/"
backend:
service:
name: web-client
port:
number: 80

@ -0,0 +1,27 @@
apiVersion: v1
kind: Secret
metadata:
name: bh-registry
type: kubernetes.io/dockerconfigjson
stringData:
.dockerconfigjson: ENC[AES256_GCM,data:bfqlh7Vy3HDYFtgv56xO+8lXOLO9bQWRC16N8hAzv6xJaIN6CmXDwFzoLoGWPrP9s/o446tuOEJEylf5z/ITnLtdGJgMsN13Xk7OiF9B2unV8yOOrzt6U6R2s5cFpbSL3tAHQmDKHxRrzbvyV2J3magen7oHQWbkwkOQq7FqV/k7wFly+bei1u+YLJ9hq798Xa5HG9j4LsVWi5izKt1BBss2xFlo3yzEFqNmQ+AzcUN1uK1xwStplK4IKC36rewONDS+yyqj830LLShb,iv:qDwYxBqK+ZamBcWEuF+UEfW8gLFROagaBqVAc1tCjUI=,tag:OYhChcvisxP0r3kQ4hq4SA==,type:str]
sops:
kms: []
gcp_kms: []
azure_kv: []
hc_vault: []
age:
- recipient: age1d5vst0g82v6xml29ydsrxefmf3vclgm6dj3npw6mefa7yu9xueaqztjqlg
enc: |
-----BEGIN AGE ENCRYPTED FILE-----
YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBaRG1ERkdkTXMvUllCSHdS
TXVBVWNMd0hYeXMvTXh6OFVTYXV0MkVoOEJ3Ck9XakJTbHMyTWpvazFzYUtNcmtx
NTVoVnUwWkpKYjg4MWs1dmxpT3JGRFUKLS0tIHdHRk8yL1lCRk9DM0haYjN4Z1Ry
d25rRklvOUdLQlU0S2l0WXBpUXhyR2MKQgJXQgxp0T2rr0V2NjwSjWFlzNyig5vW
S8PW6OpCOyfMqzz5NWTdUVymY7UEdAguwZH+MY2DdvEn3NM/TcnRwA==
-----END AGE ENCRYPTED FILE-----
lastmodified: "2023-05-27T02:48:45Z"
mac: ENC[AES256_GCM,data:SCjcJPn7hg9sUFYlOUKAVJBXKNIrcz/x3aqyX43xf7UO7Zo/pGDp1JDaKA7lCaKTgPEAe1zRRv6LjejNGX3DlpmxMS6o2xaI3nb0e0CnLj9t9t57L5svrciwh9wOennWj26DirgzAB+uqCJ/NGOJh4S8yTPOF5MgBNkqNw6FN94=,iv:YTtckdYzKnBBqbQYvjw9FpvGHsUxX6MnAeNopYhFe7I=,tag:BPUitJtY65JbnanHJgJatg==,type:str]
pgp: []
encrypted_regex: ^(data|stringData)$
version: 3.7.3

@ -0,0 +1,12 @@
resources:
- ./image-pull-secret.yaml
- ./namespace.yaml
- ./catalog-deployment.yaml
- ./runner-deployment.yaml
- ./proxy-admin-deployment.yaml
- ./proxy-web-deployment.yaml
- ./sync-cronjob.yaml
- ./web-client-deployment.yaml
- ./admin-client-deployment.yaml
- ./client-ingress.yaml
- ./admin-ingress.yaml

@ -0,0 +1,17 @@
apiVersion: v1
kind: Namespace
metadata:
name: barretthousen
annotations:
description: |
environment for barretthousen
labels:
name: barretthousen
app: barretthousen
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: barretthousen-service
imagePullSecrets:
- name: bh-registry

@ -0,0 +1,56 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: proxy-admin
spec:
selector:
matchLabels:
service: proxy-admin
template:
metadata:
labels:
service: proxy-admin
spec:
serviceAccountName: barretthousen-service
containers:
- name: proxy-admin
image: barretthousen/service-proxy-admin:latest
imagePullPolicy: Always
ports:
- containerPort: 80
name: http
command:
- /opt/proxy-admin
resources:
limits:
memory: "128Mi"
cpu: "250m"
volumeMounts:
- name: proxy-admin-config
mountPath: /config/
volumes:
- name: proxy-admin-config
secret:
secretName: proxy-admin-config
---
apiVersion: v1
kind: Service
metadata:
name: proxy-admin
spec:
selector:
service: proxy-admin
ports:
- port: 80
targetPort: 80
---
apiVersion: v1
kind: Secret
metadata:
name: proxy-admin-config
stringData:
config.yaml: |
log_level: 2
port: 80
endpoints:
runner: runner:5001

@ -0,0 +1,56 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: proxy-web
spec:
selector:
matchLabels:
service: proxy-web
template:
metadata:
labels:
service: proxy-web
spec:
serviceAccountName: barretthousen-service
containers:
- name: proxy-web
image: barretthousen/service-proxy-web:latest
imagePullPolicy: Always
ports:
- containerPort: 80
name: http
command:
- /opt/proxy-web
resources:
limits:
memory: "128Mi"
cpu: "250m"
volumeMounts:
- name: proxy-web-config
mountPath: /config/
volumes:
- name: proxy-web-config
secret:
secretName: proxy-web-config
---
apiVersion: v1
kind: Service
metadata:
name: proxy-web
spec:
selector:
service: proxy-web
ports:
- port: 80
targetPort: 80
---
apiVersion: v1
kind: Secret
metadata:
name: proxy-web-config
stringData:
config.yaml: |
log_level: 2
port: 80
endpoints:
catalog: catalog:5001

@ -0,0 +1,73 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: runner
spec:
replicas: 1
selector:
matchLabels:
service: runner
template:
metadata:
labels:
service: runner
spec:
serviceAccountName: barretthousen-service
containers:
- name: runner
image: barretthousen/service-runner:latest
imagePullPolicy: Always
ports:
- containerPort: 5001
name: grpc
command:
- /opt/runner
args:
- -migrate
resources:
limits:
cpu: "250m"
memory: "128Mi"
volumeMounts:
- mountPath: /config/
name: runner-config
volumes:
- name: runner-config
secret:
secretName: runner-config
---
apiVersion: v1
kind: Service
metadata:
name: runner
spec:
selector:
service: runner
ports:
- port: 5001
targetPort: 5001
---
apiVersion: v1
kind: Secret
metadata:
name: runner-config
stringData:
config.yaml: |
log_level: 2
port: 5001
catalog_endpoint: catalog:5001
db_service:
scheme: postgres
port: 5432
host: bh-db
name: bh
user: runner-service
password: runner-service
db_migrate:
scheme: postgres
port: 5432
host: bh-db
name: bh
user: postgres
password: bh-admin

@ -0,0 +1,24 @@
apiVersion: batch/v1
kind: CronJob
metadata:
name: runner-sync
spec:
schedule: "0 * * * *"
jobTemplate:
spec:
template:
metadata:
labels:
name: runner-sync
spec:
restartPolicy: OnFailure
containers:
- name: runner-curl
image: curlimages/curl:latest
command:
[
"curl",
"http://${PROXY_ADMIN_SERVICE_HOST}/api/v1/sync",
'-d=''{"target":"liveauctioneers"}''',
"-vvvv",
]

@ -0,0 +1,43 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-client
spec:
selector:
matchLabels:
app: web-client
template:
metadata:
labels:
app: web-client
spec:
serviceAccountName: barretthousen-service
containers:
- name: web-client
image: barretthousen/client-web-client:latest
imagePullPolicy: Always
stdin: true
tty: true
env:
- name: BH_CLIENT_INTERNAL_API_HOST
value: "http://proxy-web"
- name: ORIGIN
value: https://barretthousen.com
ports:
- containerPort: 80
name: http
resources:
limits:
memory: "512Mi"
cpu: "500m"
---
apiVersion: v1
kind: Service
metadata:
name: web-client
spec:
selector:
app: web-client
ports:
- port: 80
targetPort: 80

@ -0,0 +1,22 @@
apiVersion: v1
kind: Secret
metadata:
name: catalog-config
stringData:
config.yaml: |
log_level: 2
port: 5001
db_service:
scheme: postgres
port: 5432
host: bh-db
name: bh
user: catalog-service
password: catalog-service
db_migrate:
scheme: postgres
port: 5432
host: bh-db
name: bh
user: postgres
password: bh-admin-beta

@ -0,0 +1,86 @@
resources:
- ../base
commonLabels:
environment: beta
nameSuffix: -beta
namespace: barretthousen-beta
patchesStrategicMerge:
- sync-cronjob.yaml
- catalog-secret.yaml
- proxy-admin-secret.yaml
- proxy-web-secret.yaml
- runner-secret.yaml
patches:
- target:
kind: Ingress
name: admin
patch: |-
- op: replace
path: /spec/rules/0/host
value: beta.admin.barretthousen.com
- target:
kind: Ingress
name: web
patch: |-
- op: replace
path: /spec/rules/0/host
value: beta.barretthousen.com
- target:
kind: Deployment
name: catalog
patch: |-
- op: replace
path: /spec/template/spec/containers/0/image
value: git.vdhsn.com/barretthousen/service-catalog:beta
- target:
kind: Deployment
name: runner
patch: |-
- op: replace
path: /spec/template/spec/containers/0/image
value: git.vdhsn.com/barretthousen/service-runner:beta
- target:
kind: Deployment
name: proxy-admin
patch: |-
- op: replace
path: /spec/template/spec/containers/0/image
value: git.vdhsn.com/barretthousen/service-proxy-admin:beta
- target:
kind: Deployment
name: proxy-web
patch: |-
- op: replace
path: /spec/template/spec/containers/0/image
value: git.vdhsn.com/barretthousen/service-proxy-web:beta
- target:
kind: Deployment
name: admin-client
patch: |-
- op: replace
path: /spec/template/spec/containers/0/image
value: git.vdhsn.com/barretthousen/client-admin-client:beta
- op: replace
path: /spec/template/spec/containers/0/env/1/value
value: https://beta.admin.barretthousen.com
- op: replace
path: /spec/template/spec/containers/0/env/0/value
value: http://proxy-admin-beta
- target:
kind: Deployment
name: web-client
patch: |-
- op: replace
path: /spec/template/spec/containers/0/image
value: git.vdhsn.com/barretthousen/client-web-client:beta
- op: replace
path: /spec/template/spec/containers/0/env/1/value
value: https://beta.barretthousen.com
- op: replace
path: /spec/template/spec/containers/0/env/0/value
value: http://proxy-web-beta

@ -0,0 +1,11 @@
apiVersion: v1
kind: Secret
metadata:
name: proxy-admin-config
stringData:
config.yaml: |
log_level: 2
port: 80
access_control_allow_origin: "beta.admin.barretthousen.com"
endpoints:
runner: runner-beta:5001

@ -0,0 +1,11 @@
apiVersion: v1
kind: Secret
metadata:
name: proxy-web-config
stringData:
config.yaml: |
log_level: 2
port: 80
access_control_allow_origin: "beta.barretthousen.com"
endpoints:
catalog: catalog-beta:5001

@ -0,0 +1,23 @@
apiVersion: v1
kind: Secret
metadata:
name: runner-config
stringData:
config.yaml: |
log_level: 2
port: 5001
catalog_endpoint: catalog-beta:5001
db_service:
scheme: postgres
port: 5432
host: bh-db
name: bh
user: runner-service
password: runner-service
db_migrate:
scheme: postgres
port: 5432
host: bh-db
name: bh
user: postgres
password: bh-admin-beta

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

Loading…
Cancel
Save