From 31b60c41ca7ff7fafad412f94cf2cc771b79e27b Mon Sep 17 00:00:00 2001 From: Evan Johnson Date: Mon, 12 Feb 2024 09:43:43 -0500 Subject: [PATCH] add support for devbox --- Makefile | 73 +++++++------ devbox.json | 23 ++++ devbox.lock | 305 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 369 insertions(+), 32 deletions(-) create mode 100644 devbox.json create mode 100644 devbox.lock diff --git a/Makefile b/Makefile index ceb9b0140..28c792acd 100644 --- a/Makefile +++ b/Makefile @@ -170,8 +170,20 @@ tilt-cluster: ctlptl tilt kind clusterctl ##@ Build Dependencies ## Location to install dependencies to -LOCALBIN ?= $(shell pwd)/bin -export PATH := $(LOCALBIN):$(PATH) + +# Use CACHE_BIN for tools that cannot use devbox and LOCALBIN for tools that can use either method +CACHE_BIN ?= $(CURDIR)/bin +LOCALBIN ?= $(CACHE_BIN) + +DEVBOX_BIN ?= $(DEVBOX_PACKAGES_DIR)/bin + +# if the $DEVBOX_PACKAGES_DIR env variable exists that means we are within a devbox shell and can safely +# use devbox's bin for our tools +ifdef DEVBOX_PACKAGES_DIR + LOCALBIN = $(DEVBOX_BIN) +endif + +export PATH := $(CACHE_BIN):$(PATH) $(LOCALBIN): mkdir -p $(LOCALBIN) @@ -183,8 +195,9 @@ CLUSTERCTL ?= $(LOCALBIN)/clusterctl CONTROLLER_GEN ?= $(LOCALBIN)/controller-gen TILT ?= $(LOCALBIN)/tilt KIND ?= $(LOCALBIN)/kind -KUTTL ?= $(LOCALBIN)/kuttl -ENVTEST ?= $(LOCALBIN)/setup-envtest +KUTTL ?= $(LOCALBIN)/kubectl-kuttl +# Evntest does not have devbox support so always use CACHE_BIN +ENVTEST ?= $(CACHE_BIN)/setup-envtest ENVSUBST ?= $(LOCALBIN)/envsubst HUSKY ?= $(LOCALBIN)/husky NILAWAY ?= $(LOCALBIN)/nilaway @@ -203,66 +216,62 @@ HUSKY_VERSION ?= v0.2.16 NILAWAY_VERSION ?= latest GOVULNC_VERSION ?= v1.0.1 +.PHONY: tools +tools: $(KUSTOMIZE) $(CTLPTL) $(CLUSTERCTL) $(CONTROLLER_GEN) $(TILT) $(KIND) $(KUTTL) $(ENVTEST) $(ENVSUBST)) $(HUSKY) $(NILAWAY) $(GOVULNC) + .PHONY: kustomize -kustomize: $(KUSTOMIZE) ## Download kustomize locally if necessary. If wrong version is installed, it will be removed before downloading. +kustomize: $(KUSTOMIZE) ## Download kustomize locally if necessary. $(KUSTOMIZE): $(LOCALBIN) - @if test -x $(LOCALBIN)/kustomize && ! $(LOCALBIN)/kustomize version | grep -q $(KUSTOMIZE_VERSION); then \ - echo "$(LOCALBIN)/kustomize version is not expected $(KUSTOMIZE_VERSION). Removing it before installing."; \ - rm -rf $(LOCALBIN)/kustomize; \ - fi - test -s $(LOCALBIN)/kustomize || GOBIN=$(LOCALBIN) GO111MODULE=on go install sigs.k8s.io/kustomize/kustomize/v5@$(KUSTOMIZE_VERSION) + GOBIN=$(LOCALBIN) GO111MODULE=on go install sigs.k8s.io/kustomize/kustomize/v5@$(KUSTOMIZE_VERSION) .PHONY: ctlptl -ctlptl: $(CTLPTL) ## Download ctlptl locally if necessary. If wrong version is installed, it will be overwritten. +ctlptl: $(CTLPTL) ## Download ctlptl locally if necessary. $(CTLPTL): $(LOCALBIN) - test -s $(LOCALBIN)/ctlptl && $(LOCALBIN)/ctlptl version | grep -q $(CTLPTL_VERSION) || \ - (GOBIN=$(LOCALBIN) go install github.com/tilt-dev/ctlptl/cmd/ctlptl@$(CTLPTL_VERSION)) + GOBIN=$(LOCALBIN) go install github.com/tilt-dev/ctlptl/cmd/ctlptl@$(CTLPTL_VERSION) .PHONY: clusterctl -clusterctl: $(CLUSTERCTL) ## Download clusterctl locally if necessary. If wrong version is installed, it will be overwritten. +clusterctl: $(CLUSTERCTL) ## Download clusterctl locally if necessary. $(CLUSTERCTL): $(LOCALBIN) - test -s $(LOCALBIN)/clusterctl && $(LOCALBIN)/clusterctl version | grep -q $(CLUSTERCTL_VERSION) || \ - (cd $(LOCALBIN); curl -fsSL https://github.com/kubernetes-sigs/cluster-api/releases/download/$(CLUSTERCTL_VERSION)/clusterctl-$(OS)-$(ARCH_SHORT) -o clusterctl) - @chmod +x $(CLUSTERCTL) + curl -fsSL https://github.com/kubernetes-sigs/cluster-api/releases/download/$(CLUSTERCTL_VERSION)/clusterctl-$(OS)-$(ARCH_SHORT) -o $(CLUSTERCTL) + chmod +x $(CLUSTERCTL) .PHONY: controller-gen -controller-gen: $(CONTROLLER_GEN) ## Download controller-gen locally if necessary. If wrong version is installed, it will be overwritten. +controller-gen: $(CONTROLLER_GEN) ## Download controller-gen locally if necessary. $(CONTROLLER_GEN): $(LOCALBIN) - test -s $(LOCALBIN)/controller-gen && $(LOCALBIN)/controller-gen --version | grep -q $(CONTROLLER_TOOLS_VERSION) || \ GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-tools/cmd/controller-gen@$(CONTROLLER_TOOLS_VERSION) + .PHONY: tilt -tilt: $(TILT) ## Download tilt locally if necessary. If wrong version is installed, it will be overwritten. +tilt: $(TILT) ## Download tilt locally if necessary. $(TILT): $(LOCALBIN) TILT_OS=$(OS); \ if [ $$TILT_OS = "darwin" ]; then \ TILT_OS=mac; \ fi; \ - test -s $(LOCALBIN)/tilt && $(LOCALBIN)/tilt version | grep -q $(TILT_VERSION) || \ - (cd $(LOCALBIN); curl -fsSL https://github.com/tilt-dev/tilt/releases/download/v$(TILT_VERSION)/tilt.$(TILT_VERSION).$$TILT_OS.$(ARCH).tar.gz | tar -xzv tilt) + curl -fsSL https://github.com/tilt-dev/tilt/releases/download/v$(TILT_VERSION)/tilt.$(TILT_VERSION).$$TILT_OS.$(ARCH).tar.gz | tar -xzvm -C $(LOCALBIN) tilt .PHONY: kind -kind: $(KIND) ## Download kind locally if necessary. If wrong version is installed, it will be overwritten. +kind: $(KIND) ## Download kind locally if necessary. $(KIND): $(LOCALBIN) - test -s $(KIND) && $(KIND) version | grep -q $(KIND_VERSION) || \ - (cd $(LOCALBIN); curl -Lso ./kind https://github.com/kubernetes-sigs/kind/releases/download/v$(KIND_VERSION)/kind-$(OS)-$(ARCH_SHORT) && chmod +x kind) + curl -Lso $(KIND) https://github.com/kubernetes-sigs/kind/releases/download/v$(KIND_VERSION)/kind-$(OS)-$(ARCH_SHORT) + chmod +x $(KIND) .PHONY: kuttl -kuttl: $(KUTTL) ## Download kuttl locally if necessary. If wrong version is installed, it will be overwritten. +kuttl: $(KUTTL) ## Download kuttl locally if necessary. $(KUTTL): $(LOCALBIN) - test -s $(KUTTL) && $(KUTTL) version | grep -q $(KUTTL_VERSION) || \ - (cd $(LOCALBIN); curl -Lso ./kuttl https://github.com/kudobuilder/kuttl/releases/download/v$(KUTTL_VERSION)/kubectl-kuttl_$(KUTTL_VERSION)_$(OS)_$(ARCH) && chmod +x kuttl) + curl -Lso $(KUTTL) https://github.com/kudobuilder/kuttl/releases/download/v$(KUTTL_VERSION)/kubectl-kuttl_$(KUTTL_VERSION)_$(OS)_$(ARCH) + chmod +x $(KUTTL) .PHONY: envtest envtest: $(ENVTEST) ## Download envtest-setup locally if necessary. $(ENVTEST): $(LOCALBIN) - test -s $(LOCALBIN)/setup-envtest || GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest + GOBIN=$(CACHE_BIN) go install sigs.k8s.io/controller-runtime/tools/setup-envtest@latest .PHONY: envsubst -envsubst: $(ENVSUBST) ## Download envsubst locally if necessary. If wrong version is installed, it will be overwritten. +envsubst: $(ENVSUBST) ## Download envsubst locally if necessary. $(ENVSUBST): $(LOCALBIN) - test -s $(ENVSUBST) || \ - (cd $(LOCALBIN); curl -Lso ./envsubst https://github.com/a8m/envsubst/releases/download/$(ENVSUBST_VERSION)/envsubst-$(shell uname -s)-$(ARCH) && chmod +x envsubst) + curl -Lso $(ENVSUBST) https://github.com/a8m/envsubst/releases/download/$(ENVSUBST_VERSION)/envsubst-$(shell uname -s)-$(ARCH) + chmod +x $(ENVSUBST) .PHONY: husky husky: $(HUSKY) ## Download husky locally if necessary. diff --git a/devbox.json b/devbox.json new file mode 100644 index 000000000..1f0b45207 --- /dev/null +++ b/devbox.json @@ -0,0 +1,23 @@ +{ + "packages": [ + "clusterctl@latest", + "ctlptl@latest", + "docker@latest", + "go-tools@latest", + "go@1.21.5", + "golangci-lint@latest", + "govulncheck@latest", + "husky@latest", + "kind@latest", + "kubernetes-controller-tools@latest", + "kustomize@latest", + "kuttl@latest", + "nilaway@latest", + "tilt@latest", + "envsubst@latest" + ], + "shell": { + "init_hook": [], + "scripts": {} + } +} diff --git a/devbox.lock b/devbox.lock new file mode 100644 index 000000000..3fe8e21a1 --- /dev/null +++ b/devbox.lock @@ -0,0 +1,305 @@ +{ + "lockfile_version": "1", + "packages": { + "clusterctl@latest": { + "last_modified": "2024-01-18T00:05:01Z", + "resolved": "github:NixOS/nixpkgs/921fb3319c2a296fc65048272d22f3db889d7292#clusterctl", + "source": "devbox-search", + "version": "1.6.1", + "systems": { + "aarch64-darwin": { + "store_path": "/nix/store/fb0kbrvaip39h589kwjkj5sw742rxmz6-clusterctl-1.6.1" + }, + "aarch64-linux": { + "store_path": "/nix/store/6a1yn29mzsk7xd0yyzh4fms3x5walsdc-clusterctl-1.6.1" + }, + "x86_64-darwin": { + "store_path": "/nix/store/x7qv0417bd062sb2cx9892lgc058h0gi-clusterctl-1.6.1" + }, + "x86_64-linux": { + "store_path": "/nix/store/s32zh7lrbc0n2zcdgnqvrv27xzxs0sck-clusterctl-1.6.1" + } + } + }, + "ctlptl@latest": { + "last_modified": "2024-01-14T03:55:27Z", + "resolved": "github:NixOS/nixpkgs/dd5621df6dcb90122b50da5ec31c411a0de3e538#ctlptl", + "source": "devbox-search", + "version": "0.8.25", + "systems": { + "aarch64-darwin": { + "store_path": "/nix/store/1r25ywdx4jffs3harx3zaldawmip4lqa-ctlptl-0.8.25" + }, + "aarch64-linux": { + "store_path": "/nix/store/lwv2cslpq3hxw7lhz1y85mms9wl3f1kh-ctlptl-0.8.25" + }, + "x86_64-darwin": { + "store_path": "/nix/store/ww1b2kxrrqayvs0ry50a09a33iggxg3b-ctlptl-0.8.25" + }, + "x86_64-linux": { + "store_path": "/nix/store/rddb9inkhc0zw8g686mv0b8ya3xdgyzn-ctlptl-0.8.25" + } + } + }, + "docker@latest": { + "last_modified": "2024-01-29T00:15:04Z", + "resolved": "github:NixOS/nixpkgs/90f456026d284c22b3e3497be980b2e47d0b28ac#docker", + "source": "devbox-search", + "version": "24.0.5", + "systems": { + "aarch64-darwin": { + "store_path": "/nix/store/b1wvdq94zxwkpjsxdzhm9hf9igb83siz-docker-24.0.5" + }, + "aarch64-linux": { + "store_path": "/nix/store/h10712wm42kns4wjy78qg0ycmw3v8hai-docker-24.0.5" + }, + "x86_64-darwin": { + "store_path": "/nix/store/16wz1cd6kz75rs0fnhihaqn1c7a5l8fy-docker-24.0.5" + }, + "x86_64-linux": { + "store_path": "/nix/store/kahw87dwsj3m4czp636a58791qrpnj25-docker-24.0.5" + } + } + }, + "envsubst@latest": { + "last_modified": "2024-01-27T14:55:31Z", + "resolved": "github:NixOS/nixpkgs/160b762eda6d139ac10ae081f8f78d640dd523eb#envsubst", + "source": "devbox-search", + "version": "1.4.2", + "systems": { + "aarch64-darwin": { + "store_path": "/nix/store/0n0xrd9796b8lz0574v4cnl20d1hvhvb-envsubst-1.4.2" + }, + "aarch64-linux": { + "store_path": "/nix/store/myjffrm8sfdncjg92n1kcx8p1h7ni2d1-envsubst-1.4.2" + }, + "x86_64-darwin": { + "store_path": "/nix/store/gn9537z5k45frrclsvix22l5kf9y8xc2-envsubst-1.4.2" + }, + "x86_64-linux": { + "store_path": "/nix/store/1gkyrqqjcsiirx2c7x79bibn9xjb2nla-envsubst-1.4.2" + } + } + }, + "go-tools@latest": { + "last_modified": "2024-01-14T03:55:27Z", + "resolved": "github:NixOS/nixpkgs/dd5621df6dcb90122b50da5ec31c411a0de3e538#go-tools", + "source": "devbox-search", + "version": "2023.1.6", + "systems": { + "aarch64-darwin": { + "store_path": "/nix/store/znwyinwhkfcbxs1krxrkifv8cfpsk2cv-go-tools-2023.1.6" + }, + "aarch64-linux": { + "store_path": "/nix/store/wcyzvjnki8mxjha2h1k9zfg9grd7pbn6-go-tools-2023.1.6" + }, + "x86_64-darwin": { + "store_path": "/nix/store/9nzqn3p88bc93d15h3361prs1yqk32gf-go-tools-2023.1.6" + }, + "x86_64-linux": { + "store_path": "/nix/store/k757m23123dbnjggb0lfmpjha4nl0mgy-go-tools-2023.1.6" + } + } + }, + "go@1.21.5": { + "last_modified": "2024-01-14T03:55:27Z", + "resolved": "github:NixOS/nixpkgs/dd5621df6dcb90122b50da5ec31c411a0de3e538#go", + "source": "devbox-search", + "version": "1.21.5", + "systems": { + "aarch64-darwin": { + "store_path": "/nix/store/z6p2j8shdwi74kbm86jwdh03vxq91l0q-go-1.21.5" + }, + "aarch64-linux": { + "store_path": "/nix/store/1p00q366rk2j7w9lnflrl7xaks7wfq5d-go-1.21.5" + }, + "x86_64-darwin": { + "store_path": "/nix/store/brv7d6mlrclkzywf1vaf35wqhq4c0c82-go-1.21.5" + }, + "x86_64-linux": { + "store_path": "/nix/store/rccpgf2bnh58hhh4908p78i1rln9gzvp-go-1.21.5" + } + } + }, + "golangci-lint@latest": { + "last_modified": "2024-01-14T03:55:27Z", + "resolved": "github:NixOS/nixpkgs/dd5621df6dcb90122b50da5ec31c411a0de3e538#golangci-lint", + "source": "devbox-search", + "version": "1.55.2", + "systems": { + "aarch64-darwin": { + "store_path": "/nix/store/jn473vqnn5b22nfyi9i5q9baabins79d-golangci-lint-1.55.2" + }, + "aarch64-linux": { + "store_path": "/nix/store/0bviwvbqc81gnhhg937q1dx8vnv0c3ml-golangci-lint-1.55.2" + }, + "x86_64-darwin": { + "store_path": "/nix/store/b5w76bajwnajcdxw60363g5m8vxgd17a-golangci-lint-1.55.2" + }, + "x86_64-linux": { + "store_path": "/nix/store/4kq1iinaabjh96myl4q73d0yjw3p911l-golangci-lint-1.55.2" + } + } + }, + "govulncheck@latest": { + "last_modified": "2024-01-27T14:55:31Z", + "resolved": "github:NixOS/nixpkgs/160b762eda6d139ac10ae081f8f78d640dd523eb#govulncheck", + "source": "devbox-search", + "version": "1.0.3", + "systems": { + "aarch64-darwin": { + "store_path": "/nix/store/bg7ppwz9lzxmb2la2xnck5by0gnbbqlm-govulncheck-1.0.3" + }, + "aarch64-linux": { + "store_path": "/nix/store/bmmfkm88fqkswqb9bdhkaf0lny8p3csq-govulncheck-1.0.3" + }, + "x86_64-darwin": { + "store_path": "/nix/store/7grbqm6ni2bhwnbv8vcm1bmy5l771w0y-govulncheck-1.0.3" + }, + "x86_64-linux": { + "store_path": "/nix/store/z971gdv82lgfa5zys2q0sgbi0v2xrjw6-govulncheck-1.0.3" + } + } + }, + "husky@latest": { + "last_modified": "2024-01-24T16:15:02Z", + "resolved": "github:NixOS/nixpkgs/5cd2baa57a9ff2d84f2615700434fa04f3067fdb#husky", + "source": "devbox-search", + "version": "8.0.3", + "systems": { + "aarch64-darwin": { + "store_path": "/nix/store/6pfvr5kv4cgc0f718h2l1k5in7anrd4z-husky-8.0.3" + }, + "aarch64-linux": { + "store_path": "/nix/store/x9jyvcnd0m5ankwnm37zma1wlq2mr6cp-husky-8.0.3" + }, + "x86_64-darwin": { + "store_path": "/nix/store/8zr6520c867af6qydicbc6wzxg304f66-husky-8.0.3" + }, + "x86_64-linux": { + "store_path": "/nix/store/15wc8qkfny0gzkjij3mgvapss5x2yxp7-husky-8.0.3" + } + } + }, + "kind@latest": { + "last_modified": "2024-01-14T03:55:27Z", + "resolved": "github:NixOS/nixpkgs/dd5621df6dcb90122b50da5ec31c411a0de3e538#kind", + "source": "devbox-search", + "version": "0.20.0", + "systems": { + "aarch64-darwin": { + "store_path": "/nix/store/9j3w2jyp43q8iqywclvshh0biw4zfpgg-kind-0.20.0" + }, + "aarch64-linux": { + "store_path": "/nix/store/dj3rcbfcy2ydd9qn6mf0c62qbji36479-kind-0.20.0" + }, + "x86_64-darwin": { + "store_path": "/nix/store/hgb814j66wfw2wwiv8d7n1xbyykxkd1s-kind-0.20.0" + }, + "x86_64-linux": { + "store_path": "/nix/store/l2714wfcba5fykdk97jggcgk7j12ci8g-kind-0.20.0" + } + } + }, + "kubernetes-controller-tools@latest": { + "last_modified": "2024-01-27T14:55:31Z", + "resolved": "github:NixOS/nixpkgs/160b762eda6d139ac10ae081f8f78d640dd523eb#kubernetes-controller-tools", + "source": "devbox-search", + "version": "0.13.0", + "systems": { + "aarch64-darwin": { + "store_path": "/nix/store/hbz0drjik0m36rp1apxk9939fyxh8d5h-controller-tools-0.13.0" + }, + "aarch64-linux": { + "store_path": "/nix/store/x9bjgv574g1jra5vr7gg18rsimnnj8k8-controller-tools-0.13.0" + }, + "x86_64-darwin": { + "store_path": "/nix/store/l3d5bdfx6xrrswdl9mvs067x8j4drzag-controller-tools-0.13.0" + }, + "x86_64-linux": { + "store_path": "/nix/store/aw12bhi3qdx6mj088i5gzyr268v5di5w-controller-tools-0.13.0" + } + } + }, + "kustomize@latest": { + "last_modified": "2024-01-14T03:55:27Z", + "resolved": "github:NixOS/nixpkgs/dd5621df6dcb90122b50da5ec31c411a0de3e538#kustomize", + "source": "devbox-search", + "version": "5.3.0", + "systems": { + "aarch64-darwin": { + "store_path": "/nix/store/vlfk6x1pzj87mmj785dk5mfybm8wzq2w-kustomize-5.3.0" + }, + "aarch64-linux": { + "store_path": "/nix/store/5lr548gl80yig96f05mw9qm6803hligg-kustomize-5.3.0" + }, + "x86_64-darwin": { + "store_path": "/nix/store/m56z92xjaxxxzz31ncgrzi91yl7hh8kf-kustomize-5.3.0" + }, + "x86_64-linux": { + "store_path": "/nix/store/ci180n2s37ldipx4ci7i4cbjv5mc2lpr-kustomize-5.3.0" + } + } + }, + "kuttl@latest": { + "last_modified": "2024-01-14T03:55:27Z", + "resolved": "github:NixOS/nixpkgs/dd5621df6dcb90122b50da5ec31c411a0de3e538#kuttl", + "source": "devbox-search", + "version": "0.15.0", + "systems": { + "aarch64-darwin": { + "store_path": "/nix/store/s4lxz5igkws0ksy2j9gags3qj9px1f36-kuttl-0.15.0" + }, + "aarch64-linux": { + "store_path": "/nix/store/gs0sdwryb8vaw6b5fkykspbd4743wzn7-kuttl-0.15.0" + }, + "x86_64-darwin": { + "store_path": "/nix/store/id6055x74ql6fvvsli74rcnqlld8l0sx-kuttl-0.15.0" + }, + "x86_64-linux": { + "store_path": "/nix/store/53qvvms2qmjpvhzr9bx1519xj24dcgcf-kuttl-0.15.0" + } + } + }, + "nilaway@latest": { + "last_modified": "2024-01-14T03:55:27Z", + "resolved": "github:NixOS/nixpkgs/dd5621df6dcb90122b50da5ec31c411a0de3e538#nilaway", + "source": "devbox-search", + "version": "2023-11-17", + "systems": { + "aarch64-darwin": { + "store_path": "/nix/store/hafzd3cza76sb9kbjcar4qj1ypskr3bl-nilaway-unstable-2023-11-17" + }, + "aarch64-linux": { + "store_path": "/nix/store/4mgk8ifzd1xzcmywnfg5rsm1ywmy65wg-nilaway-unstable-2023-11-17" + }, + "x86_64-darwin": { + "store_path": "/nix/store/qgllj640ysy0w58163bbi33226mf6z8q-nilaway-unstable-2023-11-17" + }, + "x86_64-linux": { + "store_path": "/nix/store/2vyjk226arv73kl8329sn3848kn9n22m-nilaway-unstable-2023-11-17" + } + } + }, + "tilt@latest": { + "last_modified": "2024-01-24T16:15:02Z", + "resolved": "github:NixOS/nixpkgs/5cd2baa57a9ff2d84f2615700434fa04f3067fdb#tilt", + "source": "devbox-search", + "version": "0.33.6", + "systems": { + "aarch64-darwin": { + "store_path": "/nix/store/xc8wxiqff7wl38iqmpia31yj732d2av7-tilt-0.33.6" + }, + "aarch64-linux": { + "store_path": "/nix/store/vjq35zfmj47y1jgh0bwpl7j22n092f1g-tilt-0.33.6" + }, + "x86_64-darwin": { + "store_path": "/nix/store/b8rp91m58m2jblnjz8gi9bgyqdjdk9lw-tilt-0.33.6" + }, + "x86_64-linux": { + "store_path": "/nix/store/kkjisx85yh2ylkz70n8n9sgqi3240fz9-tilt-0.33.6" + } + } + } + } +}